├── .gitignore ├── app.js ├── controllers ├── FollowController.js ├── UserController - 副本.js ├── UserController.js └── cateController.js ├── package.json ├── public ├── stylesheets │ └── style.css └── uploads │ ├── QQ (1).png │ ├── QQ (2).png │ ├── QQ.png │ └── apple.png ├── routes ├── follow.js ├── index.js └── users.js ├── sql ├── db │ └── exapp.sql ├── follow.sql ├── image.sql ├── post.sql ├── user.sql └── userinfo.sql ├── util ├── aliconfig.js └── dbconfig.js └── views ├── error.jade ├── index.jade └── layout.jade /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | node_modules 3 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | var createError = require('http-errors'); 2 | var express = require('express'); 3 | var bodyParser = require('body-parser'); 4 | var path = require('path'); 5 | var cookieParser = require('cookie-parser'); 6 | var logger = require('morgan'); 7 | 8 | var indexRouter = require('./routes/index'); 9 | var usersRouter = require('./routes/users'); 10 | var follow = require('./routes/follow'); 11 | var app = express(); 12 | 13 | //改写 14 | var http = require('http'); 15 | var server = http.createServer(app); 16 | 17 | app.use(express.urlencoded({ extended: false })); 18 | app.use(cookieParser()); 19 | //静态资源 20 | app.use(express.static(path.join(__dirname, 'public'))); 21 | //post请求 22 | app.use(bodyParser.urlencoded({extended:true})); 23 | app.use('/', indexRouter); 24 | app.use('/users', usersRouter); 25 | app.use('/follow', follow); 26 | server.listen(3000); -------------------------------------------------------------------------------- /controllers/FollowController.js: -------------------------------------------------------------------------------- 1 | var dbConfig = require('../util/dbconfig'); 2 | 3 | //检查用户是否关注 4 | let checkFollow = async (user_id,follow_id)=>{ 5 | let sql = `select * from follow where user_id=? and follow_id=?`; 6 | let sqlArr = [user_id,follow_id]; 7 | let result = await dbConfig.SySqlConnect(sql,sqlArr); 8 | if(result.length && result.length > 0){ 9 | return true; 10 | }else{ 11 | return false; 12 | } 13 | } 14 | //关注 15 | let follow =async (req,res)=>{ 16 | let {user_id,follow_id} = req.query; 17 | //检查是否之前关注过 18 | console.log(checkFollow(user_id,follow_id)); 19 | if(! await checkFollow(user_id,follow_id)){ 20 | if(user_id == follow_id){ 21 | res.send({ 22 | code:400, 23 | msg:'亲,不能关注自己' 24 | }) 25 | }else{ 26 | let sql = `insert into follow (follow_id,user_id,create_time) values (?,?,?)`; 27 | let sqlArr = [follow_id,user_id,(new Date()).valueOf()]; 28 | let result = await dbConfig.SySqlConnect(sql,sqlArr); 29 | if(result.affectedRows == 1){ 30 | res.send({ 31 | code:200, 32 | msg:'亲,关注成功!' 33 | }) 34 | }else{ 35 | res.send({ 36 | code:400, 37 | msg:'亲,关注失败!' 38 | }) 39 | } 40 | } 41 | }else{ 42 | res.send({ 43 | code:400, 44 | msg:'亲,不能重复关注' 45 | }) 46 | } 47 | 48 | 49 | } 50 | module.exports = { 51 | follow 52 | } -------------------------------------------------------------------------------- /controllers/UserController - 副本.js: -------------------------------------------------------------------------------- 1 | var dbConfig = require('../util/dbconfig'); 2 | let fs = require('fs'); 3 | //阿里大鱼 4 | const Core = require('@alicloud/pop-core'); 5 | const config =require('../util/aliconfig'); 6 | //配置 7 | let client = new Core(config.alicloud); 8 | let requestOption = { 9 | method:'POST' 10 | } 11 | 12 | 13 | function rand(min,max){ 14 | return Math.floor(Math.random()*(max-min)) + min; 15 | } 16 | //手机号码验证 17 | var validatePhoneCode = []; 18 | let sendCodeP = (phone)=>{ 19 | for(var item of validatePhoneCode){ 20 | if(phone == item.phone){ 21 | return true; 22 | } 23 | } 24 | return false; 25 | } 26 | //验证 27 | let findCodeAndPhone = (phone,code)=>{ 28 | for(var item of validatePhoneCode){ 29 | if(phone == item.phone && code == item.code){ 30 | return 'login'; 31 | } 32 | } 33 | return false; 34 | } 35 | //检测验证码登录是否第一次登录 36 | let phoneLoginBind = async (phone)=>{ 37 | let sql = 'select * from user where username=? or phone=?'; 38 | let sqlArr = [phone,phone]; 39 | let res = await dbConfig.SySqlConnect(sql,sqlArr); 40 | if(res.length){ 41 | res[0].userinfo = await getUserInfo(res[0].id); 42 | return res; 43 | }else{ 44 | //用户第一次注册,绑定表 45 | let res = await regUser(phone); 46 | //获取用户的信息详情 47 | res[0].userinfo = await getUserInfo(res[0].id); 48 | return res; 49 | //用户注册 50 | 51 | //获取用户详情 52 | } 53 | } 54 | 55 | //用户注册 56 | let regUser = async (phone)=>{ 57 | //检测用户是否第一次注册 58 | let userpic = 'http://himg.bdimg.com/sys/portrait/item/95fde99d96e584bf32303036c700.jpg'; 59 | let sql = `insert into user(username,userpic,phone,create_time) value(?,?,?,?)`; 60 | let sqlArr = [phone,userpic,phone,(new Date().valueOf())]; 61 | let res = await dbConfig.SySqlConnect(sql,sqlArr); 62 | if(res.affectedRows == 1){//执行成功 63 | //执行成功,获取用户信息 64 | //获取用户信息方法 65 | let user = getUser(phone); 66 | //绑定用户副表 67 | let userinfo = await createUserInfo(user[0].id); 68 | if(userinfo.affectedRows == 1 ){ 69 | return user; 70 | }else{ 71 | return false; 72 | } 73 | }else{ 74 | 75 | } 76 | 77 | 78 | } 79 | //获取用户信息 80 | let getUser = (username)=>{ 81 | let sql = `select * from user where id=? or phone=? or username=?`; 82 | let sqlArr = [username,username,username]; 83 | return dbConfig.SySqlConnect(sql,sqlArr); 84 | } 85 | 86 | //创建副表 87 | let createUserInfo = (user_id)=>{ 88 | let sql = `insert into userinfo(user_id,age,sex,job) values(?,?,?,?)`; 89 | let sqlArr = [user_id,18,2,'未设置']; 90 | return dbConfig.SySqlConnect(sql,sqlArr); 91 | } 92 | //获取注册用户的详情 93 | let getUserInfo = (user_id)=>{ 94 | let sql = `select age,sex,job,path,birthday from userinfo where user_id=?`; 95 | let sqlArr = [user_id]; 96 | return dbConfig.SySqlConnect(sql,sqlArr); 97 | } 98 | //查看用户是否有详情信息 99 | let finUserInfo = async (user_id)=>{ 100 | let sql = `select * from userinfo where user_id=?`; 101 | let sqlArr = [user_id]; 102 | let res = await dbConfig.SySqlConnect(sql,sqlArr); 103 | if(res.length){ 104 | return true; 105 | } 106 | return false; 107 | } 108 | //修改用户详细信息 109 | let setUserInfo = async (user_id,age,sex,job,path,birthday)=>{ 110 | if(finUserInfo(user_id)){ 111 | let sql = `update userinfo set age=?,sex=?,job=?,path=?,birthday=? where user_id=? `; 112 | let sqlArr = [age,sex,job,path,birthday,user_id] 113 | let res = await dbConfig.SySqlConnect(sql,sqlArr); 114 | if(res.affectedRows == 1){ 115 | let user = await getUser(user_id); 116 | let userinfo = await getUserInfo(user_id); 117 | user[0].userinfo = userinfo[0]; 118 | return user; 119 | } 120 | }else{ 121 | let sql = `insert into userinfo (user_id,age,sex,job,path,birthday) values(?,?,?,?,?,?)`; 122 | let sqlArr = [user_id,age,sex,job,path,birthday]; 123 | let res = await dbConfig.SySqlConnect(sql,sqlArr); 124 | if(res.affectedRows == 1){ 125 | let user = await getUser(user_id); 126 | let userinfo = await getUserInfo(user_id); 127 | user[0].userinfo = userinfo[0]; 128 | return user; 129 | } 130 | } 131 | } 132 | //修改用户名称 133 | let setUserName = async (user_id,username)=>{ 134 | let sql = `update user set username=? where id=?`; 135 | let sqlArr = [username,user_id]; 136 | let res = await dbConfig.SySqlConnect(sql,sqlArr); 137 | if(res.affectedRows==1){ 138 | return true; 139 | }else{ 140 | return false; 141 | } 142 | } 143 | 144 | var sendCoreCode = (req,res)=>{ 145 | let phone = req.query.phone; 146 | let code = rand(1000,9999); 147 | console.log(phone) 148 | var params = { 149 | "RegionId": "cn-hangzhou", 150 | "PhoneNumbers": phone, 151 | "SignName": "apiLearn", 152 | "TemplateCode": "SMS_190267455", 153 | "TemplateParam": JSON.stringify({"code":code}) 154 | } 155 | client.request('SendSms',params,requestOption).then((result)=>{ 156 | console.log(result); 157 | if(result.Code == 'OK'){ 158 | res.send({ 159 | code:200, 160 | msg:'发送成功' 161 | }); 162 | validatePhoneCode.push({ 163 | 'phone':phone, 164 | 'code':code 165 | }) 166 | console.log(code); 167 | }else{ 168 | res.send({ 169 | code:400, 170 | msg:'发送失败' 171 | }) 172 | } 173 | }) 174 | } 175 | 176 | //模拟验证码发送接口 177 | var sendCode=(req,res)=>{ 178 | let phone = req.query.phone; 179 | if(sendCodeP(phone)){ 180 | res.send({ 181 | 'code':400, 182 | 'msg':'已发送过验证码,稍后再发' 183 | }) 184 | } 185 | console.log(req.query) 186 | let code = rand(1000,9999); 187 | validatePhoneCode.push({ 188 | 'phone':phone, 189 | 'code':code 190 | }) 191 | res.send({ 192 | 'code':200, 193 | 'msg':'发送成功' 194 | }); 195 | console.log(code); 196 | } 197 | //验证码登陆 198 | var codePhoneLogin = async(req,res)=>{ 199 | let {phone,code} = req.query; 200 | //验证手机号是否发送过验证码 201 | if(sendCodeP(phone)){ 202 | let status = findCodeAndPhone(phone,code); 203 | if(status == 'login'){ 204 | //已经登录成功 205 | //登录成功之后的操作 206 | let user = await phoneLoginBind(phone); 207 | res.send({ 208 | code:200, 209 | msg:'登录已成功', 210 | data:user[0] 211 | }) 212 | }else if(status == 'error'){ 213 | res.send({ 214 | 'code':200, 215 | 'msg':'登录失败' 216 | }) 217 | } 218 | }else{ 219 | res.send({ 220 | 'code':400, 221 | 'msg':'未发送验证码' 222 | }) 223 | } 224 | } 225 | //用户名、手机号登录,手机号+密码,邮箱+密码,用户名+密码 226 | let login = (req,res)=>{ 227 | let username = req.query.username, 228 | password = req.query.password; 229 | let phone = /^1\d{10}$/; 230 | let email = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/; 231 | if(phone.test(username)){ 232 | let sql = 'select * from user where phone=? and password=? or username=? and password=?'; 233 | let sqlArr = [username,password,username,password]; 234 | let callBack = async (err,data)=>{ 235 | if(err){ 236 | console.log(err); 237 | res.send({ 238 | code:400, 239 | msg:'出错了' 240 | }); 241 | }else if(data == ''){ 242 | res.send({ 243 | code:400, 244 | msg:'用户名或者密码出错!' 245 | }); 246 | }else{ 247 | let user_id = data[0].id; 248 | let result = await getUserInfo(user_id); 249 | data[0].userinfo = result[0]; 250 | res.send({ 251 | code:200, 252 | msg:'登录成功', 253 | data:data[0] 254 | }); 255 | } 256 | } 257 | dbConfig.sqlConnect(sql,sqlArr,callBack); 258 | }else if(email.test(username)){ 259 | let sql = `select * from user where email=? and password=?`; 260 | let sqlArr = [username,password]; 261 | let callBack = async (err,data)=>{ 262 | if(err){ 263 | console.log(err); 264 | res.send({ 265 | code:400, 266 | msg:'出错了' 267 | }); 268 | }else if(data == ''){ 269 | res.send({ 270 | code:400, 271 | msg:'用户名或者密码出错!' 272 | }); 273 | }else{ 274 | let user_id = data[0].id; 275 | let result = await getUserInfo(user_id); 276 | data[0].userinfo = result[0]; 277 | res.send({ 278 | code:200, 279 | msg:'登录成功', 280 | data:data[0] 281 | }); 282 | } 283 | } 284 | dbConfig.sqlConnect(sql,sqlArr,callBack); 285 | }else{ 286 | let sql=`select * from user where username=? and password=?`; 287 | let sqlArr=[username,password]; 288 | let callBack = async (err,data)=>{ 289 | if(err){ 290 | console.log(err); 291 | res.send({ 292 | code:400, 293 | msg:'出错了' 294 | }); 295 | }else if(data == ''){ 296 | res.send({ 297 | code:400, 298 | msg:'用户名或者密码出错!' 299 | }); 300 | }else{ 301 | let user_id = data[0].id; 302 | let result = await getUserInfo(user_id); 303 | data[0].userinfo = result[0]; 304 | res.send({ 305 | code:200, 306 | msg:'登录成功', 307 | data:data[0] 308 | }); 309 | } 310 | } 311 | dbConfig.sqlConnect(sql,sqlArr,callBack); 312 | } 313 | 314 | } 315 | //修改资料 316 | let editUserInfo = async (req,res)=>{ 317 | let{user_id,username,age,sex,job,path,birthday} = req.query; 318 | let result = await setUserName(user_id,username); 319 | if(result){ 320 | let data = await setUserInfo(user_id,age,sex,job,path,birthday); 321 | if(data.length){ 322 | res.send({ 323 | code:200, 324 | data:data[0] 325 | }) 326 | }else{ 327 | res.send({ 328 | code:400, 329 | msg:'修改失败' 330 | }) 331 | } 332 | }else{ 333 | res.send({ 334 | code:400, 335 | msg:'修改失败' 336 | }) 337 | } 338 | } 339 | //检查用户密码 340 | let checkUserPwd = async (user_id)=>{ 341 | let sql = `select password from user where id=?`; 342 | let sqlArr = [user_id]; 343 | let res = await dbConfig.SySqlConnect(sql,sqlArr); 344 | console.log(res[0].password) 345 | if(res.length){ 346 | return res[0].password; 347 | }else{ 348 | return 0; 349 | } 350 | } 351 | //修改用户密码 352 | let setPassword = async (req,res)=>{ 353 | let {user_id,oldpassword,newpassword}=req.query; 354 | let userPwd = await checkUserPwd(user_id); 355 | if(userPwd){ 356 | console.log(userPwd,oldpassword) 357 | if(userPwd == oldpassword){ 358 | let sql = `update user set password=? where id=?`; 359 | let sqlArr = [newpassword,user_id]; 360 | let result = await dbConfig.SySqlConnect(sql,sqlArr); 361 | if(result.affectedRows){ 362 | res.send({ 363 | code:200, 364 | msg:'修改密码成功!' 365 | }) 366 | }else{ 367 | res.send({ 368 | code:400, 369 | msg:'修改密码失败!' 370 | }) 371 | } 372 | }else{ 373 | res.send({ 374 | code:400, 375 | msg:'原密码输入错误!' 376 | }) 377 | } 378 | }else{ 379 | let sql = `update user set password=? where id=?`; 380 | let sqlArr = [newpassword,user_id]; 381 | let result = await dbConfig.SySqlConnect(sql,sqlArr); 382 | if(result.affectedRows){ 383 | res.send({ 384 | code:200, 385 | msg:'修改密码成功!' 386 | }) 387 | }else{ 388 | res.send({ 389 | code:400, 390 | msg:'修改密码失败!' 391 | }) 392 | } 393 | } 394 | } 395 | //绑定用户邮箱接口 396 | let bindEmail = async (req,res)=>{ 397 | let {user_id,email} = req.query; 398 | let sql = `update user set email=? where id=?`; 399 | let sqlArr = [email,user_id]; 400 | let result = await dbConfig.SySqlConnect(sql,sqlArr); 401 | console.log(result); 402 | if(result.affectedRows == 1){ 403 | res.send({ 404 | code:200, 405 | msg:'邮箱绑定成功' 406 | }) 407 | }else{ 408 | res.send({ 409 | code:400, 410 | msg:'邮箱绑定失败' 411 | }) 412 | } 413 | } 414 | //退出 415 | let logout = (req,res)=>{ 416 | 417 | res.send({ 418 | code:200, 419 | msg:'退出登录' 420 | }) 421 | } 422 | //图片上传 423 | let editUserImg = (req,res)=>{ 424 | if(req.file.length === 0){ 425 | res.render('error',{message:'上传文件不能为空!'}); 426 | }else{ 427 | let file = req.file; 428 | console.log(file); 429 | fs.renameSync('./public/uploads/'+file.filename,'./public/uploads/'+file.originalname); 430 | res.set({ 431 | 'content-type':'application/JSON; charset=utf-8' 432 | }) 433 | let {user_id}=req.query; 434 | let imgUrl = 'http://localhost:3000/public/uploads/'+file.originalname; 435 | let sql =`update user set userpic=? where id=?`; 436 | let sqlArr = [imgUrl,user_id]; 437 | dbConfig.sqlConnect(sql,sqlArr,(err,data)=>{ 438 | if(err){ 439 | console.log(err); 440 | throw '出错了'; 441 | }else{ 442 | if(data.affectedRows == 1){ 443 | res.send({ 444 | code:200, 445 | msg:'修改成功', 446 | url:imgUrl 447 | }) 448 | }else{ 449 | res.send({ 450 | code:400, 451 | msg:'修改失败' 452 | }) 453 | } 454 | } 455 | }) 456 | } 457 | 458 | } 459 | //批量多图上传 460 | let uploadMoreImg=(req,res)=>{ 461 | console.log('------------------------') 462 | if(req.files.length === 0){ 463 | res.render('error',{message:'上传文件不能为空!'}); 464 | }else{ 465 | let sql = `insert into image (url,create_time,user_id) values `; 466 | let sqlArr = []; 467 | for(var i in req.files){ 468 | res.set({ 469 | 'content-type':'application/json; charset=utf8' 470 | }); 471 | let file = req.files[i]; 472 | fs.renameSync('./public/uploads/'+file.filename,'./public/uploads/'+file.originalname); 473 | let {user_id} = req.query; 474 | let url = 'http://localhost:3000/uploads/'+file.originalname; 475 | if(req.files.length-1 == i){ 476 | sql += '(?)' 477 | }else{ 478 | sql += '(?),' 479 | } 480 | console.log(sql); 481 | sqlArr.push([url,(new Date().valueOf()),user_id]) 482 | } 483 | //批量存储到数据库 484 | dbConfig.sqlConnect(sql,sqlArr,(err,data)=>{ 485 | if(err){ 486 | console.log(err); 487 | }else{ 488 | console.log(data.affectedRows); 489 | if(data.affectedRows >0){ 490 | res.send({ 491 | code:200, 492 | affectedRows:data.affectedRows, 493 | msg:'上传成功' 494 | }); 495 | }else{ 496 | res.send({ 497 | code:400, 498 | msg:'上传失败' 499 | }); 500 | } 501 | } 502 | }) 503 | } 504 | } 505 | 506 | //发布视频 507 | let publlish=async (req,res)=>{ 508 | let {user_id,title,url,path,isopen,posting} = req.query; 509 | let sql = 'insert into post (user_id,title,url,path,isopen,posting,create_time) values (?,?,?,?,?,?,?)'; 510 | let sqlArr = [user_id,title,url,path,isopen,posting,(new Date()).valueOf()]; 511 | let post_id = await dbConfig.SySqlConnect(sql,sqlArr).then(res=>{ 512 | console.log(res); 513 | return res.insertId; 514 | }).catch(err=>{ 515 | return false; 516 | }) 517 | if(post_id){ 518 | res.send({ 519 | code:200, 520 | msg:'发布成功' 521 | }) 522 | }else{ 523 | res.send({ 524 | code:400, 525 | msg:'发布失败' 526 | }) 527 | } 528 | } 529 | 530 | 531 | module.exports = { 532 | sendCode, 533 | codePhoneLogin, 534 | sendCoreCode, 535 | login, 536 | editUserInfo, 537 | setPassword, 538 | bindEmail, 539 | logout, 540 | editUserImg, 541 | uploadMoreImg, 542 | publlish 543 | } -------------------------------------------------------------------------------- /controllers/UserController.js: -------------------------------------------------------------------------------- 1 | var dbConfig = require('../util/dbconfig'); 2 | let fs = require('fs'); 3 | //阿里大鱼 4 | const Core = require('@alicloud/pop-core'); 5 | const config =require('../util/aliconfig'); 6 | //配置 7 | let client = new Core(config.alicloud); 8 | let requestOption = { 9 | method:'POST' 10 | } 11 | 12 | 13 | function rand(min,max){ 14 | return Math.floor(Math.random()*(max-min)) + min; 15 | } 16 | //手机号码验证 17 | var validatePhoneCode = []; 18 | let sendCodeP = (phone)=>{ 19 | for(var item of validatePhoneCode){ 20 | if(phone == item.phone){ 21 | return true; 22 | } 23 | } 24 | return false; 25 | } 26 | //验证 27 | let findCodeAndPhone = (phone,code)=>{ 28 | for(var item of validatePhoneCode){ 29 | if(phone == item.phone && code == item.code){ 30 | return 'login'; 31 | } 32 | } 33 | return false; 34 | } 35 | //检测验证码登录是否第一次登录 36 | let phoneLoginBind = async (phone)=>{ 37 | let sql = 'select * from user where username=? or phone=?'; 38 | let sqlArr = [phone,phone]; 39 | let res = await dbConfig.SySqlConnect(sql,sqlArr); 40 | if(res.length){ 41 | res[0].userinfo = await getUserInfo(res[0].id); 42 | return res; 43 | }else{ 44 | //用户第一次注册,绑定表 45 | let res = await regUser(phone); 46 | //获取用户的信息详情 47 | res[0].userinfo = await getUserInfo(res[0].id); 48 | return res; 49 | //用户注册 50 | 51 | //获取用户详情 52 | } 53 | } 54 | 55 | //用户注册 56 | let regUser = async (phone)=>{ 57 | //检测用户是否第一次注册 58 | let userpic = 'http://himg.bdimg.com/sys/portrait/item/95fde99d96e584bf32303036c700.jpg'; 59 | let sql = `insert into user(username,userpic,phone,create_time) value(?,?,?,?)`; 60 | let sqlArr = [phone,userpic,phone,(new Date().valueOf())]; 61 | let res = await dbConfig.SySqlConnect(sql,sqlArr); 62 | if(res.affectedRows == 1){//执行成功 63 | //执行成功,获取用户信息 64 | //获取用户信息方法 65 | let user = getUser(phone); 66 | //绑定用户副表 67 | let userinfo = await createUserInfo(user[0].id); 68 | if(userinfo.affectedRows == 1 ){ 69 | return user; 70 | }else{ 71 | return false; 72 | } 73 | }else{ 74 | 75 | } 76 | 77 | 78 | } 79 | //获取用户信息 80 | let getUser = (username)=>{ 81 | let sql = `select * from user where id=? or phone=? or username=?`; 82 | let sqlArr = [username,username,username]; 83 | return dbConfig.SySqlConnect(sql,sqlArr); 84 | } 85 | 86 | //创建副表 87 | let createUserInfo = (user_id)=>{ 88 | let sql = `insert into userinfo(user_id,age,sex,job) values(?,?,?,?)`; 89 | let sqlArr = [user_id,18,2,'未设置']; 90 | return dbConfig.SySqlConnect(sql,sqlArr); 91 | } 92 | //获取注册用户的详情 93 | let getUserInfo = (user_id)=>{ 94 | let sql = `select age,sex,job,path,birthday from userinfo where user_id=?`; 95 | let sqlArr = [user_id]; 96 | return dbConfig.SySqlConnect(sql,sqlArr); 97 | } 98 | //查看用户是否有详情信息 99 | let finUserInfo = async (user_id)=>{ 100 | let sql = `select * from userinfo where user_id=?`; 101 | let sqlArr = [user_id]; 102 | let res = await dbConfig.SySqlConnect(sql,sqlArr); 103 | if(res.length){ 104 | return true; 105 | } 106 | return false; 107 | } 108 | //修改用户详细信息 109 | let setUserInfo = async (user_id,age,sex,job,path,birthday)=>{ 110 | if(finUserInfo(user_id)){ 111 | let sql = `update userinfo set age=?,sex=?,job=?,path=?,birthday=? where user_id=? `; 112 | let sqlArr = [age,sex,job,path,birthday,user_id] 113 | let res = await dbConfig.SySqlConnect(sql,sqlArr); 114 | if(res.affectedRows == 1){ 115 | let user = await getUser(user_id); 116 | let userinfo = await getUserInfo(user_id); 117 | user[0].userinfo = userinfo[0]; 118 | return user; 119 | } 120 | }else{ 121 | let sql = `insert into userinfo (user_id,age,sex,job,path,birthday) values(?,?,?,?,?,?)`; 122 | let sqlArr = [user_id,age,sex,job,path,birthday]; 123 | let res = await dbConfig.SySqlConnect(sql,sqlArr); 124 | if(res.affectedRows == 1){ 125 | let user = await getUser(user_id); 126 | let userinfo = await getUserInfo(user_id); 127 | user[0].userinfo = userinfo[0]; 128 | return user; 129 | } 130 | } 131 | } 132 | //修改用户名称 133 | let setUserName = async (user_id,username)=>{ 134 | let sql = `update user set username=? where id=?`; 135 | let sqlArr = [username,user_id]; 136 | let res = await dbConfig.SySqlConnect(sql,sqlArr); 137 | if(res.affectedRows==1){ 138 | return true; 139 | }else{ 140 | return false; 141 | } 142 | } 143 | 144 | var sendCoreCode = (req,res)=>{ 145 | let phone = req.query.phone; 146 | let code = rand(1000,9999); 147 | console.log(phone) 148 | var params = { 149 | "RegionId": "cn-hangzhou", 150 | "PhoneNumbers": phone, 151 | "SignName": "apiLearn", 152 | "TemplateCode": "SMS_190267455", 153 | "TemplateParam": JSON.stringify({"code":code}) 154 | } 155 | client.request('SendSms',params,requestOption).then((result)=>{ 156 | console.log(result); 157 | if(result.Code == 'OK'){ 158 | res.send({ 159 | code:200, 160 | msg:'发送成功' 161 | }); 162 | validatePhoneCode.push({ 163 | 'phone':phone, 164 | 'code':code 165 | }) 166 | console.log(code); 167 | }else{ 168 | res.send({ 169 | code:400, 170 | msg:'发送失败' 171 | }) 172 | } 173 | }) 174 | } 175 | 176 | //模拟验证码发送接口 177 | var sendCode=(req,res)=>{ 178 | let phone = req.query.phone; 179 | if(sendCodeP(phone)){ 180 | res.send({ 181 | 'code':400, 182 | 'msg':'已发送过验证码,稍后再发' 183 | }) 184 | } 185 | console.log(req.query) 186 | let code = rand(1000,9999); 187 | validatePhoneCode.push({ 188 | 'phone':phone, 189 | 'code':code 190 | }) 191 | res.send({ 192 | 'code':200, 193 | 'msg':'发送成功' 194 | }); 195 | console.log(code); 196 | } 197 | //验证码登陆 198 | var codePhoneLogin = async(req,res)=>{ 199 | let {phone,code} = req.query; 200 | //验证手机号是否发送过验证码 201 | if(sendCodeP(phone)){ 202 | let status = findCodeAndPhone(phone,code); 203 | if(status == 'login'){ 204 | //已经登录成功 205 | //登录成功之后的操作 206 | let user = await phoneLoginBind(phone); 207 | res.send({ 208 | code:200, 209 | msg:'登录已成功', 210 | data:user[0] 211 | }) 212 | }else if(status == 'error'){ 213 | res.send({ 214 | 'code':200, 215 | 'msg':'登录失败' 216 | }) 217 | } 218 | }else{ 219 | res.send({ 220 | 'code':400, 221 | 'msg':'未发送验证码' 222 | }) 223 | } 224 | } 225 | //用户名、手机号登录,手机号+密码,邮箱+密码,用户名+密码 226 | let login = (req,res)=>{ 227 | let username = req.query.username, 228 | password = req.query.password; 229 | let phone = /^1\d{10}$/; 230 | let email = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/; 231 | if(phone.test(username)){ 232 | let sql = 'select * from user where phone=? and password=? or username=? and password=?'; 233 | let sqlArr = [username,password,username,password]; 234 | let callBack = async (err,data)=>{ 235 | if(err){ 236 | console.log(err); 237 | res.send({ 238 | code:400, 239 | msg:'出错了' 240 | }); 241 | }else if(data == ''){ 242 | res.send({ 243 | code:400, 244 | msg:'用户名或者密码出错!' 245 | }); 246 | }else{ 247 | let user_id = data[0].id; 248 | let result = await getUserInfo(user_id); 249 | data[0].userinfo = result[0]; 250 | res.send({ 251 | code:200, 252 | msg:'登录成功', 253 | data:data[0] 254 | }); 255 | } 256 | } 257 | dbConfig.sqlConnect(sql,sqlArr,callBack); 258 | }else if(email.test(username)){ 259 | let sql = `select * from user where email=? and password=?`; 260 | let sqlArr = [username,password]; 261 | let callBack = async (err,data)=>{ 262 | if(err){ 263 | console.log(err); 264 | res.send({ 265 | code:400, 266 | msg:'出错了' 267 | }); 268 | }else if(data == ''){ 269 | res.send({ 270 | code:400, 271 | msg:'用户名或者密码出错!' 272 | }); 273 | }else{ 274 | let user_id = data[0].id; 275 | let result = await getUserInfo(user_id); 276 | data[0].userinfo = result[0]; 277 | res.send({ 278 | code:200, 279 | msg:'登录成功', 280 | data:data[0] 281 | }); 282 | } 283 | } 284 | dbConfig.sqlConnect(sql,sqlArr,callBack); 285 | }else{ 286 | let sql=`select * from user where username=? and password=?`; 287 | let sqlArr=[username,password]; 288 | let callBack = async (err,data)=>{ 289 | if(err){ 290 | console.log(err); 291 | res.send({ 292 | code:400, 293 | msg:'出错了' 294 | }); 295 | }else if(data == ''){ 296 | res.send({ 297 | code:400, 298 | msg:'用户名或者密码出错!' 299 | }); 300 | }else{ 301 | let user_id = data[0].id; 302 | let result = await getUserInfo(user_id); 303 | data[0].userinfo = result[0]; 304 | res.send({ 305 | code:200, 306 | msg:'登录成功', 307 | data:data[0] 308 | }); 309 | } 310 | } 311 | dbConfig.sqlConnect(sql,sqlArr,callBack); 312 | } 313 | 314 | } 315 | //修改资料 316 | let editUserInfo = async (req,res)=>{ 317 | let{user_id,username,age,sex,job,path,birthday} = req.query; 318 | let result = await setUserName(user_id,username); 319 | if(result){ 320 | let data = await setUserInfo(user_id,age,sex,job,path,birthday); 321 | if(data.length){ 322 | res.send({ 323 | code:200, 324 | data:data[0] 325 | }) 326 | }else{ 327 | res.send({ 328 | code:400, 329 | msg:'修改失败' 330 | }) 331 | } 332 | }else{ 333 | res.send({ 334 | code:400, 335 | msg:'修改失败' 336 | }) 337 | } 338 | } 339 | //检查用户密码 340 | let checkUserPwd = async (user_id)=>{ 341 | let sql = `select password from user where id=?`; 342 | let sqlArr = [user_id]; 343 | let res = await dbConfig.SySqlConnect(sql,sqlArr); 344 | console.log(res[0].password) 345 | if(res.length){ 346 | return res[0].password; 347 | }else{ 348 | return 0; 349 | } 350 | } 351 | //修改用户密码 352 | let setPassword = async (req,res)=>{ 353 | let {user_id,oldpassword,newpassword}=req.query; 354 | let userPwd = await checkUserPwd(user_id); 355 | if(userPwd){ 356 | console.log(userPwd,oldpassword) 357 | if(userPwd == oldpassword){ 358 | let sql = `update user set password=? where id=?`; 359 | let sqlArr = [newpassword,user_id]; 360 | let result = await dbConfig.SySqlConnect(sql,sqlArr); 361 | if(result.affectedRows){ 362 | res.send({ 363 | code:200, 364 | msg:'修改密码成功!' 365 | }) 366 | }else{ 367 | res.send({ 368 | code:400, 369 | msg:'修改密码失败!' 370 | }) 371 | } 372 | }else{ 373 | res.send({ 374 | code:400, 375 | msg:'原密码输入错误!' 376 | }) 377 | } 378 | }else{ 379 | let sql = `update user set password=? where id=?`; 380 | let sqlArr = [newpassword,user_id]; 381 | let result = await dbConfig.SySqlConnect(sql,sqlArr); 382 | if(result.affectedRows){ 383 | res.send({ 384 | code:200, 385 | msg:'修改密码成功!' 386 | }) 387 | }else{ 388 | res.send({ 389 | code:400, 390 | msg:'修改密码失败!' 391 | }) 392 | } 393 | } 394 | } 395 | //绑定用户邮箱接口 396 | let bindEmail = async (req,res)=>{ 397 | let {user_id,email} = req.query; 398 | let sql = `update user set email=? where id=?`; 399 | let sqlArr = [email,user_id]; 400 | let result = await dbConfig.SySqlConnect(sql,sqlArr); 401 | console.log(result); 402 | if(result.affectedRows == 1){ 403 | res.send({ 404 | code:200, 405 | msg:'邮箱绑定成功' 406 | }) 407 | }else{ 408 | res.send({ 409 | code:400, 410 | msg:'邮箱绑定失败' 411 | }) 412 | } 413 | } 414 | //退出 415 | let logout = (req,res)=>{ 416 | 417 | res.send({ 418 | code:200, 419 | msg:'退出登录' 420 | }) 421 | } 422 | //图片上传 423 | let editUserImg = (req,res)=>{ 424 | if(req.file.length === 0){ 425 | res.render('error',{message:'上传文件不能为空!'}); 426 | }else{ 427 | let file = req.file; 428 | console.log(file); 429 | fs.renameSync('./public/uploads/'+file.filename,'./public/uploads/'+file.originalname); 430 | res.set({ 431 | 'content-type':'application/JSON; charset=utf-8' 432 | }) 433 | let {user_id}=req.query; 434 | let imgUrl = 'http://localhost:3000/public/uploads/'+file.originalname; 435 | let sql =`update user set userpic=? where id=?`; 436 | let sqlArr = [imgUrl,user_id]; 437 | dbConfig.sqlConnect(sql,sqlArr,(err,data)=>{ 438 | if(err){ 439 | console.log(err); 440 | throw '出错了'; 441 | }else{ 442 | if(data.affectedRows == 1){ 443 | res.send({ 444 | code:200, 445 | msg:'修改成功', 446 | url:imgUrl 447 | }) 448 | }else{ 449 | res.send({ 450 | code:400, 451 | msg:'修改失败' 452 | }) 453 | } 454 | } 455 | }) 456 | } 457 | 458 | } 459 | //批量多图上传 460 | let uploadMoreImg=(req,res)=>{ 461 | console.log('------------------------') 462 | if(req.files.length === 0){ 463 | res.render('error',{message:'上传文件不能为空!'}); 464 | }else{ 465 | let sql = `insert into image (url,create_time,user_id) values `; 466 | let sqlArr = []; 467 | for(var i in req.files){ 468 | res.set({ 469 | 'content-type':'application/json; charset=utf8' 470 | }); 471 | let file = req.files[i]; 472 | fs.renameSync('./public/uploads/'+file.filename,'./public/uploads/'+file.originalname); 473 | let {user_id} = req.query; 474 | let url = 'http://localhost:3000/uploads/'+file.originalname; 475 | if(req.files.length-1 == i){ 476 | sql += '(?)' 477 | }else{ 478 | sql += '(?),' 479 | } 480 | console.log(sql); 481 | sqlArr.push([url,(new Date().valueOf()),user_id]) 482 | } 483 | //批量存储到数据库 484 | dbConfig.sqlConnect(sql,sqlArr,(err,data)=>{ 485 | if(err){ 486 | console.log(err); 487 | }else{ 488 | console.log(data.affectedRows); 489 | if(data.affectedRows >0){ 490 | res.send({ 491 | code:200, 492 | affectedRows:data.affectedRows, 493 | msg:'上传成功' 494 | }); 495 | }else{ 496 | res.send({ 497 | code:400, 498 | msg:'上传失败' 499 | }); 500 | } 501 | } 502 | }) 503 | } 504 | } 505 | 506 | //发布视频 507 | let publlish=async (req,res)=>{ 508 | let {user_id,title,url,path,isopen,posting} = req.query; 509 | let sql = 'insert into post (user_id,title,url,path,isopen,posting,create_time) values (?,?,?,?,?,?,?)'; 510 | let sqlArr = [user_id,title,url,path,isopen,posting,(new Date()).valueOf()]; 511 | let post_id = await dbConfig.SySqlConnect(sql,sqlArr).then(res=>{ 512 | console.log(res); 513 | return res.insertId; 514 | }).catch(err=>{ 515 | return false; 516 | }) 517 | if(post_id){ 518 | res.send({ 519 | code:200, 520 | msg:'发布成功' 521 | }) 522 | }else{ 523 | res.send({ 524 | code:400, 525 | msg:'发布失败' 526 | }) 527 | } 528 | } 529 | 530 | 531 | module.exports = { 532 | sendCode, 533 | codePhoneLogin, 534 | sendCoreCode, 535 | login, 536 | editUserInfo, 537 | setPassword, 538 | bindEmail, 539 | logout, 540 | editUserImg, 541 | uploadMoreImg, 542 | publlish 543 | } -------------------------------------------------------------------------------- /controllers/cateController.js: -------------------------------------------------------------------------------- 1 | var dbConfig = require('../util/dbconfig'); 2 | //获取分类 3 | var getCate=(req,res)=>{ 4 | var sql = 'select * from cate'; 5 | var sqlArr = []; 6 | var callBack = (err,data)=>{ 7 | if(err){ 8 | console.log('---连接出错了----') 9 | }else{ 10 | res.send({ 11 | 'list':data 12 | }) 13 | } 14 | } 15 | dbConfig.sqlConnect(sql,sqlArr,callBack); 16 | } 17 | module.exports = { 18 | getCate 19 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "apilearn", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "./app.js" 7 | }, 8 | "dependencies": { 9 | "@alicloud/pop-core": "^1.7.9", 10 | "body-parser": "^1.19.0", 11 | "cookie-parser": "~1.4.4", 12 | "debug": "~2.6.9", 13 | "express": "~4.16.1", 14 | "http-errors": "~1.6.3", 15 | "jade": "~1.11.0", 16 | "morgan": "~1.9.1", 17 | "multer": "^1.4.2", 18 | "mysql": "^2.18.1" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /public/uploads/QQ (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhidong10/apiLearn/bbd36210e7feed6f72b5a3d9e149950b5f604688/public/uploads/QQ (1).png -------------------------------------------------------------------------------- /public/uploads/QQ (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhidong10/apiLearn/bbd36210e7feed6f72b5a3d9e149950b5f604688/public/uploads/QQ (2).png -------------------------------------------------------------------------------- /public/uploads/QQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhidong10/apiLearn/bbd36210e7feed6f72b5a3d9e149950b5f604688/public/uploads/QQ.png -------------------------------------------------------------------------------- /public/uploads/apple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhidong10/apiLearn/bbd36210e7feed6f72b5a3d9e149950b5f604688/public/uploads/apple.png -------------------------------------------------------------------------------- /routes/follow.js: -------------------------------------------------------------------------------- 1 | let Follow = require('../controllers/FollowController'); 2 | var express = require('express'); 3 | var router = express.Router(); 4 | router.post('/follow',Follow.follow); 5 | 6 | module.exports = router; -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var cate = require('../controllers/cateController'); 4 | /* GET home page. */ 5 | router.get('/',cate.getCate); 6 | 7 | module.exports = router; 8 | -------------------------------------------------------------------------------- /routes/users.js: -------------------------------------------------------------------------------- 1 | let fs = require('fs'); 2 | var dbConfig = require('../util/dbconfig'); 3 | let multer = require("multer"); 4 | var express = require('express'); 5 | var router = express.Router(); 6 | var User = require('../controllers/UserController') 7 | let upload = multer({dest:'./public/uploads/'}).single("file"); 8 | let moreUpload = multer({dest:'./public/uploads/'}).array("file",5); 9 | router.post('/sendCode', User.sendCode); 10 | router.post('/sendCoreCode', User.sendCoreCode); 11 | router.post('/codePhoneLogin',User.codePhoneLogin); 12 | router.post('/login',User.login); 13 | router.post('/editUserInfo',User.editUserInfo); 14 | router.post('/setPassword',User.setPassword); 15 | router.post('/bindEmail',User.bindEmail); 16 | router.post('/logout',User.logout); 17 | router.post('/editUserImg',upload,User.editUserImg); 18 | router.post('/uploadMoreImg',moreUpload,User.uploadMoreImg); 19 | router.post('/publlish',User.publlish) 20 | module.exports = router; 21 | -------------------------------------------------------------------------------- /sql/db/exapp.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : exapp 5 | Source Server Version : 50709 6 | Source Host : localhost:3306 7 | Source Database : exapp 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50709 11 | File Encoding : 65001 12 | 13 | Date: 2020-05-23 23:12:38 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for `cate` 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `cate`; 22 | CREATE TABLE `cate` ( 23 | `id` int(11) NOT NULL, 24 | `category` varchar(255) NOT NULL, 25 | `status` tinyint(4) DEFAULT NULL, 26 | `create_time` datetime DEFAULT NULL, 27 | PRIMARY KEY (`id`) 28 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 29 | 30 | -- ---------------------------- 31 | -- Records of cate 32 | -- ---------------------------- 33 | INSERT INTO `cate` VALUES ('1', 'phone', '0', '2020-05-15 23:30:13'); 34 | INSERT INTO `cate` VALUES ('2', 'tv', '1', '2020-05-16 23:34:06'); 35 | 36 | -- ---------------------------- 37 | -- Table structure for `follow` 38 | -- ---------------------------- 39 | DROP TABLE IF EXISTS `follow`; 40 | CREATE TABLE `follow` ( 41 | `id` int(11) NOT NULL AUTO_INCREMENT, 42 | `follow_id` int(11) NOT NULL, 43 | `user_id` int(11) NOT NULL, 44 | `create_time` bigint(20) DEFAULT NULL, 45 | PRIMARY KEY (`id`) 46 | ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 47 | 48 | -- ---------------------------- 49 | -- Records of follow 50 | -- ---------------------------- 51 | INSERT INTO `follow` VALUES ('1', '1', '2', '1590246372091'); 52 | 53 | -- ---------------------------- 54 | -- Table structure for `image` 55 | -- ---------------------------- 56 | DROP TABLE IF EXISTS `image`; 57 | CREATE TABLE `image` ( 58 | `id` int(11) NOT NULL AUTO_INCREMENT, 59 | `url` varchar(255) NOT NULL, 60 | `user_id` int(11) DEFAULT NULL, 61 | `create_time` bigint(20) DEFAULT NULL, 62 | PRIMARY KEY (`id`) 63 | ) ENGINE=MyISAM AUTO_INCREMENT=26 DEFAULT CHARSET=utf8; 64 | 65 | -- ---------------------------- 66 | -- Records of image 67 | -- ---------------------------- 68 | INSERT INTO `image` VALUES ('1', 'http://localhost:3000/uploads/QQ.png', '1', '1590165228811'); 69 | INSERT INTO `image` VALUES ('2', 'http://localhost:3000/uploads/apple.png', '1', '1590165228625'); 70 | INSERT INTO `image` VALUES ('3', 'http://localhost:3000/uploads/apple.png', '1', '1590165335479'); 71 | INSERT INTO `image` VALUES ('4', 'http://localhost:3000/uploads/QQ.png', '1', '1590165335650'); 72 | INSERT INTO `image` VALUES ('5', 'http://localhost:3000/uploads/apple.png', '1', '1590165506825'); 73 | INSERT INTO `image` VALUES ('6', 'http://localhost:3000/uploads/QQ.png', '1', '1590165506975'); 74 | INSERT INTO `image` VALUES ('7', 'http://localhost:3000/uploads/apple.png', '1', '1590165665954'); 75 | INSERT INTO `image` VALUES ('8', 'http://localhost:3000/uploads/QQ (2).png', '1', '1590165666111'); 76 | INSERT INTO `image` VALUES ('9', 'http://localhost:3000/uploads/QQ (1).png', '1', '1590165666128'); 77 | INSERT INTO `image` VALUES ('10', 'http://localhost:3000/uploads/QQ.png', '1', '1590165666122'); 78 | INSERT INTO `image` VALUES ('11', 'http://localhost:3000/uploads/apple.png', '1', '1590165803764'); 79 | INSERT INTO `image` VALUES ('12', 'http://localhost:3000/uploads/QQ (2).png', '1', '1590165803931'); 80 | INSERT INTO `image` VALUES ('13', 'http://localhost:3000/uploads/QQ.png', '1', '1590165803936'); 81 | INSERT INTO `image` VALUES ('14', 'http://localhost:3000/uploads/QQ (1).png', '1', '1590165803942'); 82 | INSERT INTO `image` VALUES ('15', '111', '1', '111'); 83 | INSERT INTO `image` VALUES ('16', '111', '1', '111'); 84 | INSERT INTO `image` VALUES ('17', '111', '1', '111'); 85 | INSERT INTO `image` VALUES ('18', 'http://localhost:3000/uploads/apple.png', '1', '1590167099935'); 86 | INSERT INTO `image` VALUES ('19', 'http://localhost:3000/uploads/QQ (2).png', '1', '1590167099940'); 87 | INSERT INTO `image` VALUES ('20', 'http://localhost:3000/uploads/QQ.png', '1', '1590167099944'); 88 | INSERT INTO `image` VALUES ('21', 'http://localhost:3000/uploads/QQ (1).png', '1', '1590167099961'); 89 | INSERT INTO `image` VALUES ('22', 'http://localhost:3000/uploads/apple.png', '1', '1590167159292'); 90 | INSERT INTO `image` VALUES ('23', 'http://localhost:3000/uploads/QQ (2).png', '1', '1590167159298'); 91 | INSERT INTO `image` VALUES ('24', 'http://localhost:3000/uploads/QQ.png', '1', '1590167159302'); 92 | INSERT INTO `image` VALUES ('25', 'http://localhost:3000/uploads/QQ (1).png', '1', '1590167159305'); 93 | 94 | -- ---------------------------- 95 | -- Table structure for `post` 96 | -- ---------------------------- 97 | DROP TABLE IF EXISTS `post`; 98 | CREATE TABLE `post` ( 99 | `id` int(11) NOT NULL AUTO_INCREMENT, 100 | `user_id` int(11) NOT NULL, 101 | `title` varchar(255) NOT NULL, 102 | `url` varchar(255) NOT NULL, 103 | `path` varchar(255) DEFAULT NULL, 104 | `isopen` tinyint(4) DEFAULT '0', 105 | `create_time` bigint(20) DEFAULT NULL, 106 | `posting` varchar(255) DEFAULT NULL, 107 | PRIMARY KEY (`id`) 108 | ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 109 | 110 | -- ---------------------------- 111 | -- Records of post 112 | -- ---------------------------- 113 | INSERT INTO `post` VALUES ('1', '1', '测试标题', 'http://localhost:3000/uploads/apple.png', '测试路径', '0', '1590243835593', 'http://localhost:3000/uploads/apple.png'); 114 | 115 | -- ---------------------------- 116 | -- Table structure for `user` 117 | -- ---------------------------- 118 | DROP TABLE IF EXISTS `user`; 119 | CREATE TABLE `user` ( 120 | `id` int(11) NOT NULL AUTO_INCREMENT, 121 | `username` varchar(255) DEFAULT NULL, 122 | `userpic` varchar(255) DEFAULT NULL, 123 | `password` varchar(255) DEFAULT NULL, 124 | `phone` varchar(11) DEFAULT NULL, 125 | `email` varchar(255) DEFAULT NULL, 126 | `status` tinyint(4) DEFAULT NULL, 127 | `create_time` datetime DEFAULT NULL, 128 | PRIMARY KEY (`id`) 129 | ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 130 | 131 | -- ---------------------------- 132 | -- Records of user 133 | -- ---------------------------- 134 | INSERT INTO `user` VALUES ('1', '啦啦啦', 'http://localhost:3000/public/uploads/apple.png', '123456', '15033333333', 'zhidong@q.com', null, '2020-05-17 00:23:48'); 135 | INSERT INTO `user` VALUES ('2', 'zhidong2', '111', '123', '18533333333', 'zhidong@163.com', null, '2020-05-23 22:52:51'); 136 | 137 | -- ---------------------------- 138 | -- Table structure for `userinfo` 139 | -- ---------------------------- 140 | DROP TABLE IF EXISTS `userinfo`; 141 | CREATE TABLE `userinfo` ( 142 | `id` int(11) NOT NULL AUTO_INCREMENT, 143 | `user_id` int(11) NOT NULL, 144 | `age` tinyint(3) DEFAULT NULL, 145 | `job` varchar(128) DEFAULT NULL, 146 | `path` varchar(512) DEFAULT NULL, 147 | `birthday` datetime DEFAULT NULL, 148 | `sex` tinyint(1) DEFAULT NULL, 149 | PRIMARY KEY (`id`,`user_id`) 150 | ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 151 | 152 | -- ---------------------------- 153 | -- Records of userinfo 154 | -- ---------------------------- 155 | INSERT INTO `userinfo` VALUES ('1', '1', '33', '程序员', '北京', '1985-12-02 00:00:00', '1'); 156 | -------------------------------------------------------------------------------- /sql/follow.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : exapp 5 | Source Server Version : 50709 6 | Source Host : localhost:3306 7 | Source Database : exapp 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50709 11 | File Encoding : 65001 12 | 13 | Date: 2020-05-23 23:11:10 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for `follow` 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `follow`; 22 | CREATE TABLE `follow` ( 23 | `id` int(11) NOT NULL AUTO_INCREMENT, 24 | `follow_id` int(11) NOT NULL, 25 | `user_id` int(11) NOT NULL, 26 | `create_time` bigint(20) DEFAULT NULL, 27 | PRIMARY KEY (`id`) 28 | ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 29 | 30 | -- ---------------------------- 31 | -- Records of follow 32 | -- ---------------------------- 33 | INSERT INTO `follow` VALUES ('1', '1', '2', '1590246372091'); 34 | -------------------------------------------------------------------------------- /sql/image.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : exapp 5 | Source Server Version : 50709 6 | Source Host : localhost:3306 7 | Source Database : exapp 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50709 11 | File Encoding : 65001 12 | 13 | Date: 2020-05-23 01:06:55 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for `image` 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `image`; 22 | CREATE TABLE `image` ( 23 | `id` int(11) NOT NULL AUTO_INCREMENT, 24 | `url` varchar(255) NOT NULL, 25 | `user_id` int(11) DEFAULT NULL, 26 | `create_time` bigint(20) DEFAULT NULL, 27 | PRIMARY KEY (`id`) 28 | ) ENGINE=MyISAM AUTO_INCREMENT=26 DEFAULT CHARSET=utf8; 29 | 30 | -- ---------------------------- 31 | -- Records of image 32 | -- ---------------------------- 33 | INSERT INTO `image` VALUES ('1', 'http://localhost:3000/uploads/QQ.png', '1', '1590165228811'); 34 | INSERT INTO `image` VALUES ('2', 'http://localhost:3000/uploads/apple.png', '1', '1590165228625'); 35 | INSERT INTO `image` VALUES ('3', 'http://localhost:3000/uploads/apple.png', '1', '1590165335479'); 36 | INSERT INTO `image` VALUES ('4', 'http://localhost:3000/uploads/QQ.png', '1', '1590165335650'); 37 | INSERT INTO `image` VALUES ('5', 'http://localhost:3000/uploads/apple.png', '1', '1590165506825'); 38 | INSERT INTO `image` VALUES ('6', 'http://localhost:3000/uploads/QQ.png', '1', '1590165506975'); 39 | INSERT INTO `image` VALUES ('7', 'http://localhost:3000/uploads/apple.png', '1', '1590165665954'); 40 | INSERT INTO `image` VALUES ('8', 'http://localhost:3000/uploads/QQ (2).png', '1', '1590165666111'); 41 | INSERT INTO `image` VALUES ('9', 'http://localhost:3000/uploads/QQ (1).png', '1', '1590165666128'); 42 | INSERT INTO `image` VALUES ('10', 'http://localhost:3000/uploads/QQ.png', '1', '1590165666122'); 43 | INSERT INTO `image` VALUES ('11', 'http://localhost:3000/uploads/apple.png', '1', '1590165803764'); 44 | INSERT INTO `image` VALUES ('12', 'http://localhost:3000/uploads/QQ (2).png', '1', '1590165803931'); 45 | INSERT INTO `image` VALUES ('13', 'http://localhost:3000/uploads/QQ.png', '1', '1590165803936'); 46 | INSERT INTO `image` VALUES ('14', 'http://localhost:3000/uploads/QQ (1).png', '1', '1590165803942'); 47 | INSERT INTO `image` VALUES ('15', '111', '1', '111'); 48 | INSERT INTO `image` VALUES ('16', '111', '1', '111'); 49 | INSERT INTO `image` VALUES ('17', '111', '1', '111'); 50 | INSERT INTO `image` VALUES ('18', 'http://localhost:3000/uploads/apple.png', '1', '1590167099935'); 51 | INSERT INTO `image` VALUES ('19', 'http://localhost:3000/uploads/QQ (2).png', '1', '1590167099940'); 52 | INSERT INTO `image` VALUES ('20', 'http://localhost:3000/uploads/QQ.png', '1', '1590167099944'); 53 | INSERT INTO `image` VALUES ('21', 'http://localhost:3000/uploads/QQ (1).png', '1', '1590167099961'); 54 | INSERT INTO `image` VALUES ('22', 'http://localhost:3000/uploads/apple.png', '1', '1590167159292'); 55 | INSERT INTO `image` VALUES ('23', 'http://localhost:3000/uploads/QQ (2).png', '1', '1590167159298'); 56 | INSERT INTO `image` VALUES ('24', 'http://localhost:3000/uploads/QQ.png', '1', '1590167159302'); 57 | INSERT INTO `image` VALUES ('25', 'http://localhost:3000/uploads/QQ (1).png', '1', '1590167159305'); 58 | -------------------------------------------------------------------------------- /sql/post.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : exapp 5 | Source Server Version : 50709 6 | Source Host : localhost:3306 7 | Source Database : exapp 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50709 11 | File Encoding : 65001 12 | 13 | Date: 2020-05-23 23:11:22 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for `post` 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `post`; 22 | CREATE TABLE `post` ( 23 | `id` int(11) NOT NULL AUTO_INCREMENT, 24 | `user_id` int(11) NOT NULL, 25 | `title` varchar(255) NOT NULL, 26 | `url` varchar(255) NOT NULL, 27 | `path` varchar(255) DEFAULT NULL, 28 | `isopen` tinyint(4) DEFAULT '0', 29 | `create_time` bigint(20) DEFAULT NULL, 30 | `posting` varchar(255) DEFAULT NULL, 31 | PRIMARY KEY (`id`) 32 | ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 33 | 34 | -- ---------------------------- 35 | -- Records of post 36 | -- ---------------------------- 37 | INSERT INTO `post` VALUES ('1', '1', '测试标题', 'http://localhost:3000/uploads/apple.png', '测试路径', '0', '1590243835593', 'http://localhost:3000/uploads/apple.png'); 38 | -------------------------------------------------------------------------------- /sql/user.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : localhost 5 | Source Server Version : 50719 6 | Source Host : localhost:3306 7 | Source Database : exapp 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50719 11 | File Encoding : 65001 12 | 13 | Date: 2020-05-16 17:06:45 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for `user` 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `user`; 22 | CREATE TABLE `user` ( 23 | `id` int(11) NOT NULL, 24 | `username` varchar(255) DEFAULT NULL, 25 | `userpic` varchar(255) DEFAULT NULL, 26 | `password` varchar(255) DEFAULT NULL, 27 | `phone` varchar(11) DEFAULT NULL, 28 | `email` varchar(255) DEFAULT NULL, 29 | `status` tinyint(4) DEFAULT NULL, 30 | `create_time` datetime DEFAULT NULL, 31 | PRIMARY KEY (`id`) 32 | ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 33 | 34 | -- ---------------------------- 35 | -- Records of user 36 | -- ---------------------------- 37 | -------------------------------------------------------------------------------- /sql/userinfo.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : exapp 5 | Source Server Version : 50709 6 | Source Host : localhost:3306 7 | Source Database : exapp 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50709 11 | File Encoding : 65001 12 | 13 | Date: 2020-05-23 23:12:12 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for `userinfo` 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `userinfo`; 22 | CREATE TABLE `userinfo` ( 23 | `id` int(11) NOT NULL AUTO_INCREMENT, 24 | `user_id` int(11) NOT NULL, 25 | `age` tinyint(3) DEFAULT NULL, 26 | `job` varchar(128) DEFAULT NULL, 27 | `path` varchar(512) DEFAULT NULL, 28 | `birthday` datetime DEFAULT NULL, 29 | `sex` tinyint(1) DEFAULT NULL, 30 | PRIMARY KEY (`id`,`user_id`) 31 | ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 32 | 33 | -- ---------------------------- 34 | -- Records of userinfo 35 | -- ---------------------------- 36 | INSERT INTO `userinfo` VALUES ('1', '1', '33', '程序员', '北京', '1985-12-02 00:00:00', '1'); 37 | -------------------------------------------------------------------------------- /util/aliconfig.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | alicloud:{ 3 | 'accessKeyId':'', 4 | 'accessKeySecret':'', 5 | 'endpoint': 'https://dysmsapi.aliyuncs.com', 6 | 'apiVersion': '2017-05-25' 7 | } 8 | } 9 | 10 | -------------------------------------------------------------------------------- /util/dbconfig.js: -------------------------------------------------------------------------------- 1 | const mysql = require("mysql"); 2 | 3 | module.exports = { 4 | //数据库配置 5 | config:{ 6 | host:'localhost', 7 | port:'3306', 8 | user:'exapp', 9 | password:'123456', 10 | database:'exapp' 11 | }, 12 | //连接数据库,使用连接池方式 13 | //连接池对象 14 | sqlConnect:function(sql,sqlArr,callBack){ 15 | var pool = mysql.createPool(this.config); 16 | pool.getConnection(function(err,conn){ 17 | console.log('123'); 18 | if(err){ 19 | console.log('连接失败'); 20 | return; 21 | } 22 | conn.query(sql,sqlArr,callBack); 23 | conn.release(); 24 | }) 25 | }, 26 | //promise 回调 27 | SySqlConnect:function(sySql,sqlArr){ 28 | return new Promise((resolve,reject)=>{ 29 | var pool = mysql.createPool(this.config); 30 | pool.getConnection(function(err,conn){ 31 | console.log('123'); 32 | if(err){ 33 | reject(err); 34 | }else{ 35 | conn.query(sySql,sqlArr,(err,data)=>{ 36 | if(err){ 37 | reject(err) 38 | }else{ 39 | resolve(data); 40 | } 41 | conn.release(); 42 | }); 43 | } 44 | 45 | }) 46 | }).catch((err)=>{ 47 | console.log(err); 48 | }) 49 | } 50 | } -------------------------------------------------------------------------------- /views/error.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= message 5 | h2= error.status 6 | pre #{error.stack} 7 | -------------------------------------------------------------------------------- /views/index.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= title 5 | p Welcome to #{title} 6 | -------------------------------------------------------------------------------- /views/layout.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title= title 5 | link(rel='stylesheet', href='/stylesheets/style.css') 6 | body 7 | block content 8 | --------------------------------------------------------------------------------