欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

node+koa2+mysql+bootstrap如何搭建一個前端論壇

這篇文章主要介紹node+koa2+MySQL+bootstrap如何搭建一個前端論壇,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

10年積累的成都網(wǎng)站制作、成都網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有城中免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

前言

在學(xué)習(xí)了koa2和express并寫了一些demo后,打算自己寫一個項目練練手,由于是在校生,沒什么好的項目做,即以開發(fā)一個前端論壇為目標(biāo),功能需求參照一下一些社區(qū)擬定,主要有:

登錄注冊

個人信息維護(hù)、頭像等基本信息

發(fā)表文章,富文本編輯器采用wangEditor插件,編輯、刪除文章,文章分類等

文章評論、文章收藏、點贊等

支持文章分頁、評論分頁加載

關(guān)注取關(guān)用戶

資源(文件)上傳分享、下載、查看

學(xué)習(xí)資源推薦.....

作者個人日記

but。。。。由于種種原因,目前僅實現(xiàn)了部分功能,資源分享還沒寫

項目運行效果:http://120.77.211.212/home

項目技術(shù)棧應(yīng)用:node-koa2-ejs-bootstrap3—jquery, github地址:https://github.com/Jay214/myblog-koa2,如果覺得對你有幫助或者還看得下去,歡迎star~~鼓勵鼓勵我這前端渣渣輝。

開發(fā)環(huán)境

node: v8.3.0

koa: ^2.4.1

mysql: 5.7.1

npm: 5.3.0及以上

如何運行項目

將項目clone至本地 git clone git@github.com:Jay214/myblog-koa2.git

安裝模塊中間件 npm install

安裝mysql

mysql版本推薦使用5.7以下的,5.7的有個bug,圖形化界面推薦使用navicat for MySQL

運行可以安裝supervisor(npm install supervisor 項目運行工具,開啟后即處于監(jiān)聽模式,修改文件后保存即可,無需再啟動項目) node index 或npm supervisor index

localhost:8080/home 端口號可自行修改

若發(fā)現(xiàn)項目有存在什么bug或有比較好的建議歡迎多多提議,qq:2752402930。

準(zhǔn)備工作

由于koa2是基于es6的promise和es7的await/async語法,所以如果對es6/es7不懂的話請先過一遍文檔,后臺搭建數(shù)據(jù)庫是關(guān)鍵,所以請先安裝好mysql,mysql建議安裝5.7版本以下的,因為5.7.0版本有個bug,需要更改配置文件,具體若你們安裝的時候便知道了。

安裝node環(huán)境,使用node -v查看node版本,node需要較新版本能夠支持es6的promise和es7的await/async語法,現(xiàn)在node版本都會自帶npm的,所以不需要再去安裝npm。

項目結(jié)構(gòu)

node+koa2+mysql+bootstrap如何搭建一個前端論壇

1.config存放默認(rèn)文件(數(shù)據(jù)庫連接配置)

2.lib存放數(shù)據(jù)庫文件

3.middlewares存放判斷登陸注冊與否中間件

4.public存放靜態(tài)文件,js,引用bootstrap框架等文件

5.routers存放路由文件

6.views存放模板文件

7.index是程序主文件,定義接口,數(shù)據(jù)庫接口,引用模塊等

8.package.json項目的配置文件,包括項目名,作者,依賴,模塊等

項目用vscode開發(fā)的,用起來很舒服,還沒嘗試過的小伙伴趕緊去試一下吧。

項目初始化:cd myblog1 -> npm init 此時已經(jīng)創(chuàng)建好了package.json文件了。

由于koa2是輕量級的框架,小巧精悍,所以我們?yōu)榱舜龠M(jìn)我們的開發(fā)效率和方便性,我們需要安裝一些koa2的模塊中間件:

npm install i koa koa-bodyparser koa-mysql-session koa-router koa-session-minimal koa-static koa-views md5 moment mysql ejs koa-static-cache --save-dev

各模塊用處

koa node框架

koa-bodyparser 表單解析中間件

koa-mysql-session、koa-session-minimal 處理數(shù)據(jù)庫的中間件

koa-router 路由中間件

koa-static 靜態(tài)資源加載中間件

ejs 模板引擎

md5 密碼加密

moment 時間中間件

mysql 數(shù)據(jù)庫

koa-views 模板呈現(xiàn)中間件

koa-static-cache 文件緩存

項目基本框架搭建

配置數(shù)據(jù)庫連接

在config文件夾新建default.js :

const config = { 
 //啟動端口 
port: 8080,
 //數(shù)據(jù)庫配置 
 database: { 
 DATABASE: 'nodesql', 
 USERNAME: 'root', 
 PASSWORD: '123456', 
 PORT: '3306', 
HOST: 'localhost' 
 }
}
module.exports = config;

然后在lib文件夾新建mysql.js:

var mysql = require('mysql');
var config = require('../config/default.js')
//建立數(shù)據(jù)庫連接池
var pool = mysql.createPool({
 host: config.database.HOST,
 user: config.database.USERNAME,
 password: config.database.PASSWORD,
 database: config.database.DATABASE
});
let query = function(sql, values) { 
return new Promise((resolve, reject)=>{
 pool.getConnection(function (err,connection) {
  if(err){ reject(err);
  }else{  
connection.query(sql,values,(err,rows)=>{ 
   if(err){ 
   reject(err);
   }else{
   resolve(rows); 
   }   
 connection.release(); //為每一個請求都建立一個connection使用完后調(diào)用connection.release(); 直接釋放資源。 
      //query用來操作數(shù)據(jù)庫表
  })
  } 
  }) 
 })}

這里建立了一個數(shù)據(jù)庫連接池和封裝了一個操作數(shù)據(jù)庫表的函數(shù),如果對于數(shù)據(jù)庫連接有不懂的話請自行百度。

建立入口文件

在主目錄新建index.js,即項目入口文件:

const koa = require("koa"); //node框架
const path = require("path"); 
const bodyParser = require("koa-bodyparser"); //表單解析中間件
const ejs = require("ejs"); //模板引擎
const session = require("koa-session-minimal"); //處理數(shù)據(jù)庫的中間件
const MysqlStore = require("koa-mysql-session"); //處理數(shù)據(jù)庫的中間件
const router = require("koa-router"); //路由中間件
const config = require('./config/default.js'); //引入默認(rèn)文件
const views = require("koa-views"); //模板呈現(xiàn)中間件
const koaStatic = require("koa-static"); //靜態(tài)資源加載中間件
const staticCache = require('koa-static-cache')
const app = new koa();

//session存儲配置,將session存儲至數(shù)據(jù)庫
const sessionMysqlConfig = {
 user: config.database.USERNAME,
 password: config.database.PASSWORD,
 database: config.database.DATABASE,
 host: config.database.HOST,
}

//配置session中間件
app.use(session({
 key: 'USER_SID',
 store: new MysqlStore(sessionMysqlConfig)
}))

//配置靜態(tài)資源加載中間件
app.use(koaStatic(
 path.join(__dirname , './public')
))

//配置服務(wù)端模板渲染引擎中間件
app.use(views(path.join(__dirname, './views'),{
 extension: 'ejs'
}))

//使用表單解析中間件
app.use(bodyParser({
 "formLimit":"5mb",
 "jsonLimit":"5mb",
 "textLimit":"5mb"
}));

//使用新建的路由文件
//登錄
app.use(require('./routers/signin.js').routes())
//注冊
app.use(require('./routers/signup.js').routes())
//退出登錄
app.use(require('./routers/signout.js').routes())
//首頁
app.use(require('./routers/home.js').routes())
//個人主頁
app.use(require('./routers/personal').routes())
//文章頁
app.use(require('./routers/articles').routes())
//資源分享
app.use(require('./routers/share').routes())
//個人日記
app.use(require('./routers/selfNote').routes())
//監(jiān)聽在8080端口
app.listen(8080) 

console.log(`listening on port ${config.port}`)

上面代碼都有注釋,我就不一一說明了,由于資源分享和個人日記還沒寫,所以暫時統(tǒng)一share...替代。

接下來向mysql.js添加數(shù)據(jù)庫操作語句,建表、增刪改查。

var users = `create table if not exists users(
 id INT(200) NOT NULL AUTO_INCREMENT,
 name VARCHAR(100) NOT NULL,
 pass VARCHAR(40) NOT NULL,
 avator VARCHAR(100) DEFAULT 'default.jpg', 
 job VARCHAR(40),
 company VARCHAR(40),
 introdu VARCHAR(255),
 userhome VARCHAR(100),
 github VARCHAR(100),
 PRIMARY KEY (id)
);`

var posts = `create table if not exists posts(
 id INT(200) NOT NULL AUTO_INCREMENT,
 name VARCHAR(100) NOT NULL,
 title VARCHAR(100) NOT NULL,
 content TEXT NOT NULL,
 uid INT(200) NOT NULL,
 moment VARCHAR(40) NOT NULL,
 comments VARCHAR(255) NOT NULL DEFAULT '0',
 pv VARCHAR(40) NOT NULL DEFAULT '0',
 likes INT(200) NOT NULL DEFAULT '0',
 type VARCHAR(20) NOT NULL,
 avator VARCHAR(100),
 collection INT(200) NOT NULL DEFAULT '0', 
 PRIMARY KEY (id) ,
 FOREIGN KEY (uid) REFERENCES users(id)
 ON DELETE CASCADE

);`

var comment= `create table if not exists comment(
 id INT(200) NOT NULL AUTO_INCREMENT,
 name VARCHAR(100) NOT NULL,
 content TEXT NOT NULL,
 moment VARCHAR(40) NOT NULL,
 postid INT(200) NOT NULL,
 avator VARCHAR(100),
 PRIMARY KEY ( id ),
 FOREIGN KEY (postid) REFERENCES posts(id)
 ON DELETE CASCADE
);`

var likes = `create table if not exists likes(
 id INT(200) NOT NULL AUTO_INCREMENT,
 name VARCHAR(100) NOT NULL,
 postid INT(200) NOT NULL,
 PRIMARY KEY (id),
 FOREIGN KEY (postid) REFERENCES posts(id)
 ON DELETE CASCADE
);`
 var collection = `create table if not exists collection(
 id INT(200) NOT NULL AUTO_INCREMENT,
 uid VARCHAR(100) NOT NULL,
 postid INT(200) NOT NULL,
 PRIMARY KEY (id),
 FOREIGN KEY (postid) REFERENCES posts(id) 
 ON DELETE CASCADE
 );`
 var follow = `create table if not exists follow(
  id INT(200) NOT NULL AUTO_INCREMENT,
  uid INT(200) NOT NULL, 
  fwid INT(200) NOT NULL DEFAULT '0',
  PRIMARY KEY (id),
  FOREIGN KEY (uid) REFERENCES users(id)
  ON DELETE CASCADE
 )
 `

let createTable = function(sql){
 return query(sql, []);
}

//建表
createTable(users);
createTable(posts);
createTable(comment);
createTable(likes);
createTable(collection);
createTable(follow);
//createTable(follower);
//注冊用戶
let insertData = function(value){
 let _sql = "insert into users(name,pass) values(?,?);"
 return query(_sql,value);
}
//更新頭像
let updateUserImg = function(value){
 let _sql = "update users set avator=? where id=?"
 return query(_sql,value);
}
//更新用戶信息
let updateUser = function(value){
 let _sql = "update users set name=?,job=?,company=?,introdu=?,userhome=?,github=? where id=?"
 return query(_sql,value);
}
//發(fā)表文章
let insertPost = function(value){
 let _sql = "insert into posts(name,title,content,uid,moment,type,avator) values(?,?,?,?,?,?,?);"
 return query(_sql,value);
}

//更新文章評論數(shù)
let updatePostComment = function(value){
 let _sql = "update posts set comments=? where id=?"
 return query(_sql,value);
}
.......

總共六張表:用戶表、文章表、文章評論表、文章收藏表、文章點贊表、用戶關(guān)注表。

這里引用了外鍵,但是現(xiàn)在的開發(fā)不推薦使用外鍵了,所以你們可以自行修改,這里在項目第一次啟動時會出現(xiàn)數(shù)據(jù)庫創(chuàng)建失?。ㄓ捎谕怄I原因),只要重新啟動就ok了,如果對mysql還不了解的,這里附送大家一個傳送門:mysql入門視頻教程 密碼:c2q7 。

前端頁面開發(fā)

項目基本結(jié)構(gòu)搭建好后,就可以進(jìn)行前端頁面的編寫了。用node開發(fā)web時我們一般會配合模板引擎,這個項目我采用的是ejs,除了ejs之外較為常用的還有jade,但是jade相對ejs來說的話代碼結(jié)構(gòu)不夠清晰。關(guān)于ejs語法,這里做個簡單的介紹:

header.ejs

<!DOCTYPE html>
<html lang="en">
 <head>
 <meta charset="utf-8">
 <title>Myblog</title>
 <link rel="stylesheet" href="/css/bootstrap.min.css" rel="external nofollow" >
 <link rel="stylesheet" href="/css/index.css" rel="external nofollow" >
 <script src="/js/jquery-3.2.1.min.js" type="text/javascript"></script>
 <script src="/js/bootstrap.min.js" type="text/javascript"></script>

nav.ejs

 </head>
 <body>
 <header class="nav-head">
 <div class="nav container">
  <ul>
  <li><a href="/home" rel="external nofollow" >首頁</a></li>
  <li> <a href="/share" rel="external nofollow" rel="external nofollow" rel="external nofollow" >資源分享</a></li>
  <li> <a href="/share" rel="external nofollow" rel="external nofollow" rel="external nofollow" >推薦</a></li>
  <li> <a href="/share" rel="external nofollow" rel="external nofollow" rel="external nofollow" >個人日記</a></li>
  <li><a href="/about" rel="external nofollow" >關(guān)于作者</a></li>
  <li><input type="text" placeholder="搜索" class="input-sm search"></li>
  
  <% if(session.user){ %>
   <li>
   <img src="/images/<%= session.avator %>"  class="img-circle img-title">
   
   <ul class="menu">
    <li class="personal menulist"><a href="/personal/<%= session.user %>" rel="external nofollow" >主頁</a></li>
   <!-- <li class="collection menulist"><a href="#" rel="external nofollow" >收藏集</a></li>
   -->
    <li class="menulist"><a href="/articles" rel="external nofollow" >寫文章</a></li>
    <li class="out"><a href="/signout" rel="external nofollow" >登出</a></li>
   </ul>
   </li>
   <script>
    var imgTitle = document.getElementsByClassName('img-title')[0],
  
    menu = document.getElementsByClassName('menu')[0];
    imgTitle.onclick = function (event) {
    showTap();
    event.stopPropagation();
    }
    
    document.body.addEventListener('click',function (event) { 
    menu.style.display = 'none';
    // event.stopPropagation();
    },true)
 
    function showTap(){
    if(menu.style.display == 'block'){
     menu.style.display = 'none';
    }else {
     menu.style.display = 'block';
    }
    }
    //退出登錄
    var signOut = document.getElementsByClassName('out')[0];
   /* signOut.onclick = function(){
    ajax('get','/signout',null);
    xhr.onreadystatechange = function () {
    if(xhr.readyState==4&&xhr.status>=200&&xhr.status<300){
    let text = xhr.responseText; //服務(wù)器返回的對象
    if(text){
    window.location.reload = 'localhost:8080/home';
    }
    
    }
   }

    }*/
   </script>
   <% }else{ %>
   <li class="login">
    <a class="loginup" href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><span class="glyphicon glyphicon-user"></span> 注冊 | 登錄</a>
    
    </li>
    <% } %>
  
  </ul>

 </div>
 </header>
 <script>
 
 
 var searchInput = document.getElementsByClassName('search')[0];
 searchInput.onfocus = function () {
  this.style.width = "300px";
 }
 searchInput.onblur = function () {
  this.style.width = "180px";
 }
 
 </script>

login.ejs

<div class="sign">
 <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" title="關(guān)閉" class="login-close close">×</a>
 <div class="sign-title">
 <h2>用戶注冊</h2>
 <h4>來吧騷年們!</h4>
 </div>
 <form class="form signup" role="form">

  <div class="form-group">
  <input type="text" name="username" placeholder="賬號不少于兩個字符" class="form-control">
  </div>
 <div class="form-group">
  <input type="password" name="pass" class="pass form-control" placeholder="密碼">
 </div>
 <div class="form-group">
  <input type="password" name="repeatpass" id="repeat" placeholder="重復(fù)密碼" class="form-control">
 </div>
  <div class="form-group">
  <input type="button" value="注冊" class="btn btn-primary login-up">
  </div>

 </form>
 <form class="form signin" role="form">
 <div class="form-group">
  <input type="text" name="username" placeholder="請輸入用戶名" class="form-control">
 </div>
 <div class="form-group">
  <input type="password" name="pass" class="pass form-control" placeholder="請輸入密碼">
 </div>
 <div class="form-group">
  <input type="button" value="登錄" class="btn btn-primary login-in">
 </div>
 </form>
 <div class="form-tips">
 <span>已有賬號?</span>
 <a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="register">登錄</a>
 </div>
</div>
<div class="login-form-mask"></div>
<script>
 // $(document).ready(function () {
 var $close = $('.login-close');
 var $sign = $('.sign');
 $close.click(function () {
  $sign.css("display","none");
 })

 var $register = $('.register'), //login/loginup切換
  $span = $('.form-tips span'),
  $signup = $('.signup'),
  $signTitle = $('.sign-title h2'),
  $signin = $('.signin');

 $register.click(function () {
  if($span.html() == "已有賬號?"){

  $signin.css('display','block');
  $signup.css('display','none');
  $(this).html('注冊');
  $span.html("沒有賬號?");
  $signTitle.html("歡迎登錄");

  }else{

  $signin.css('display','none');
  $signup.css('display','block');
  $(this).html('登錄');
  $span.html("已有賬號?");
  $signTitle.html("歡迎注冊");
  }
 })

 var $loginup = $('.loginup'); //點擊登錄/注冊,阻止事件冒泡
 $loginup.click(function () {
  $mask.fadeIn(100);
  $sign.slideDown(200);
  return false;
 })

 var $close = $('.login-close'),
  $mask = $('.login-form-mask'),
  $sign = $('.sign');

 $sign.click(function () {
  return false;
 })

 $close.click(function (e) {
  // e.stopPropagation();
  fadeOut();

 })

 $(document).click(function (e) { //點擊任意位置取消登錄框
  //e.stopPropagation();
  fadeOut();
 })
 function fadeOut(){
  $mask.fadeOut(100);
  $sign.slideUp(200);
 }
 

 var loginUp = document.getElementsByClassName('login-up')[0],
 loginIn = document.getElementsByClassName('login-in')[0],
 signUp = document.getElementsByClassName('signup')[0],
 signIn = document.getElementsByClassName('signin')[0];

 
 
 loginUp.onclick = function () { //注冊
 var data1 = 'username=' + signUp["username"].value + '&' + 'pass='+ signUp["pass"].value + '&' + 'repeatpass=' + signUp["repeatpass"].value;
 var reg = /^[\u4E00-\u9FA5]{2,5}$/;
 /* if(!reg.test(signUp["username"].value)){
  signUp["username"].classList.add("tips");
  signUp['username'].value()
 } */
 ajax('post','/signup',data1,"application/x-www-form-urlencoded");
 xhr.onreadystatechange = function () {
  if(xhr.readyState==4&&xhr.status>=200&&xhr.status<300){
  let text = JSON.parse(xhr.responseText).code; 
  console.log(text) //服務(wù)器返回的對象
  if(text == 3){
   fadeOut();
   alert("注冊成功")
   setTimeout(()=>{
   window.location.reload();
  },1000)
  // document.getElementsByClassName('login')[0].outerHTML = "<li class='users'><a href='/'>"+signUp["username"].value+ "(=^ ^=)" +"</a></li>"
  }else{
  fadeOut();
  alert("用戶已存在")
  }
  
  }
 }

 }

 loginIn.onclick = function () { //登錄
 var data2 = 'username=' + signIn["username"].value + '&' + 'pass=' + signIn["pass"].value;
 ajax('post','/signin',data2,"application/x-www-form-urlencoded");
 xhr.onreadystatechange = function () {
  if(xhr.readyState==4&&xhr.status>=200&&xhr.status<300){
  let text = JSON.parse(xhr.responseText).code; //服務(wù)器返回的對象
  console.log(text);
  
   // document.getElementsByClassName('login')[0].outerHTML = "<li class='users'><a href='/'>"+signUp["username"].value+ "(=^ ^=)" +"</a></li>"
  if(text===1){
  fadeOut();
  // let imgTitle = document.getElementsByClassName('img-title')[0];
  // imgTitle.setAttribute('src','/images/' + JSON.parse(xhr.responseText).avator)
  setTimeout(()=>{
   window.location.reload();
  },1000)
  }else if(text === 2){
   alert('密碼錯誤')
  }else{
   alert('賬號不存在')
  }
  
  }
 }
 
 }
</script>

footer.ejs

 </body>
 </html>

header為頁面頭部結(jié)構(gòu),nav為頁面導(dǎo)航條,login為登錄、注冊內(nèi)容、footer為頁面頂部結(jié)構(gòu)。可以看到我在ejs文件里有很多的if else 判斷語句,這是根據(jù)session來判斷用戶是否登錄渲染不同的內(nèi)容?,F(xiàn)在我們需要我們的頁面編寫樣式:分別是home.css和index.css

為了增強對原生js的理解,在項目里我用了大量的原生ajax(顯然jquery封裝的ajax比較好哈哈),因此這里先編寫一個原生ajax請求:

ajax.js

var xhr = null;
 function ajax(method,url,data,types) { //封裝一個ajax方法
 // var text;
 if(window.XMLHttpRequest){
  xhr = new XMLHttpRequest();
 }else if(window.ActiveXObject){
  xhr = new ActiveXObject("Microsoft.XMLHTTP");
 }else {
  alert('你的瀏覽器不支持ajax');
  return false;
 }
 
 xhr.onerror = function (err) {
  alert("some err have hapened:",err);
 }
 xhr.open(method,url,true);
 if(method=="post"){
  xhr.setRequestHeader("Content-type",types);
  // xhr.setRequestHeader("Conent-Type",'application/json'"application/x-www-form-urlencoded")
 }
 try{
  setTimeout(()=>{
  xhr.send(data);
 },0);
 }catch(err) {
  alert("some error have hapened in font:",err);
 }
 return xhr;
 }

實現(xiàn)登錄注冊

前端基本頁面開發(fā)好后,我們就可以寫后臺登錄接口了:

注冊:signup.js

var router = require('koa-router')();
var userModel = require('../lib/mysql.js');
var md5 = require('md5')

 // 注冊頁面
 
 // post 注冊
router.post('/signup', async(ctx, next) => {
 console.log(ctx.request.body)
 var user = {
 name: ctx.request.body.username,
 pass: ctx.request.body.pass,
 repeatpass: ctx.request.body.repeatpass
 }
 let flag = 0;
 await userModel.findDataByName(user.name)
 .then(result => {
  console.log(result)
  if (result.length) {
  
   //處理err
   console.log('用戶已存在')
   ctx.body = {
   code: 1
   };  
  
  } else if (user.pass !== user.repeatpass || user.pass == '') {
  ctx.body = { //應(yīng)把這個邏輯放到前端
   code: 2
  };

  } else {
  flag = 1;  
  
  }
 })
 if(flag==1){
 let res = await userModel.insertData([user.name, md5(user.pass + 'asd&$BH&*') ])
 console.log(res.insertId)
 await userModel.findDataByName(user.name)
 .then((result)=>{
  
  // var res = JSON.parse(JSON.stringify(result))
  console.log(result[0]['avator'])
  ctx.session.id = res.insertId;
  ctx.session.user=user.name;
  ctx.session.avator = 'default.jpg';
  ctx.body = {
  code: 3
  };
  console.log('注冊成功')
  })
 }

})

module.exports = router

密碼采用md5加密,注冊后為用戶創(chuàng)建session并將其添加到數(shù)據(jù)庫,寫完別忘了在最后加上module.exports = router將接口暴露出來。

登錄:signin.js

var router = require('koa-router')();
var userModel = require('../lib/mysql.js')
var md5 = require('md5')

router.post('/signin', async(ctx, next) => {
 console.log(ctx.request.body)
 var name = ctx.request.body.username;
 var pass = ctx.request.body.pass;

 await userModel.findDataByName(name)
 .then(result => {

  var res = JSON.parse(JSON.stringify(result))

  if (name === res[0]['name']&&(md5(pass + 'asd&$BH&*') === res[0]['pass'])) {
   console.log('登錄成功')
   ctx.body = {
   code: 1,
   }
 
   ctx.session.user = res[0]['name']
   ctx.session.id = res[0]['id']
   ctx.session.avator = res[0]['avator'] 

  }else if(md5(pass + 'asd&$BH&*') != res[0]['pass']){
  ctx.body = {
   code: 2 //密碼錯誤
  }
  }
 }).catch(err => {
  ctx.body = {
  code: 3 //賬號不存在+
  }
  console.log('用戶名或密碼錯誤!')

 })

})

module.exports = router

退出登錄:signout.js

//使用新建的路由文件
//登錄
app.use(require('./routers/signin.js').routes())
//注冊
app.use(require('./routers/signup.js').routes())
//退出登錄
app.use(require('./routers/signout.js').routes())

以上是“node+koa2+mysql+bootstrap如何搭建一個前端論壇”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站標(biāo)題:node+koa2+mysql+bootstrap如何搭建一個前端論壇
分享鏈接:http://aaarwkj.com/article4/jegcoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、微信小程序App開發(fā)、動態(tài)網(wǎng)站、網(wǎng)站策劃、微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
国产一区二区黄色网页| 日韩一二三四区免费观看| 福利成人午夜国产一区| 国产亚洲欧美久久精品| 精品中文字幕欧美区一区 | 人妻天堂久久一区二区三区| 亚洲一区在线观看激情| 美女爽到高潮久久久| 国产大学生露脸在线视频| 国产在线麻豆在拍91精品| 偷拍福利视频一区二区三区 | 97免费观看在线观看| 国产精品国产三级专区| 后入式动漫在线观看| 亚洲欧美日韩国产桃色| 免费亚洲网站在线观看视频| 国产免费成人午夜免费视频| 粉嫩一区二区三区av| 亚洲国产成人精品久久精品| 日韩人妻中文字幕专区| 国产美女冒白浆视频免费| 久久精品国产亚洲av亚| 午夜影院在线免费观看三区| 黄色免费大片在线播放| 亚洲一区二区三区视频在线观看| 欧美日韩一级性生活片| 99在线精品热视频| 国产精品三级玖玖玖电影| 亚洲中文字幕精品视频乱码| 丁香婷婷深情五月亚洲天堂| 日韩一区二区三区中文字幕| 国产区av中文字幕在线观看| 一区二区日韩视频九一蜜桃| 欧美午夜精品福利在线观看| 理论三级麻豆国产在线| 国产精品推荐在线观看| 91九色精品视频在线观看| 韩国专区福利一区二区| 欧美日韩性性在线观看| 亚洲欧美半夜激情一区二区| 日韩不卡的一区免费视频|