Koa2實現基本的登陸註冊

最近手頭上的任務完成的及時,閒暇之餘想搞一搞後端。想來想去大學的時候還會個C#寫寫畢設,倒騰倒騰數據庫,畢業從事前端後,技能都忘得一乾二淨。從事前端有段時間了,想試試過去大學學的技能能不能經過Node來再撿起來,因而決定寫個小小的登陸註冊功能Demo。前端

雖然如今也有egg.js think.js 等,可是koa更接近Express,也更容易理解底層思想,因此決定選擇Koa來寫這個功能.node

什麼是koa框架?

koa是一個基於node實現的一個新的web框架,它是由express框架的原班人馬打造的。它的特色是優雅、簡潔、表達力強、自由度高。它更express相比,它是一個更輕量的node框架,由於它全部功能都經過插件實現。mysql

關於項目

此項目只是一個入門級的Demo,重在體現一個正常後臺代碼結構和基本功能。因此選擇經過Koa2來實現MVC架構,主要包含Controller控制層和Service業務層。簡單的說Controller 層主要對用戶的請求參數進行處理(校驗、轉換),而後調用對應的 service 方法處理業務,獲得業務結果後封裝並返回。Service層就是在複雜業務場景下用於作業務邏輯封裝的一個抽象層。git

這個項目雖然功能比較單一,可是仍是決定按MVC的規範來比較好。github

文件結構

├── Koa2
│   ├── config
│   │   ├── DBconfig.js// 數據庫配置文件
|   ├── controller
|   |   ├──userController.js
|   ├── lib
|   |   ├──mysql.js //鏈接Mysql
|   ├── router
|   |   ├──router.js // 總路由
|   |   ├──userRoute.js
|   ├── service
|   |   ├──user.js 
|   ├── app.js //入口文件
└── ── package.json
複製代碼

文件結構儘可能模仿了MVC架構開發。核心代碼就是Koa2目錄下的五個文件web

  • app.js 是整個koa2 的入口文件,註冊了router和各類中間件。
  • config是數據庫的配置文件,裏面DBconfig.js來統一管理數據庫的配置。
  • controller 文件夾MVC架構下的controller層router 文件夾來處理不一樣的路徑請求,導入到對應的controller
  • service 文件夾是MVC的業務層,處理來自controller的數據,查詢後數據庫處理後返回處理後的數據
  • package.json 配置文件

安裝如下依賴包:sql

  1. koa node框架
  2. koa-body 表單解析中間件
  3. koa-router 路由框架
  4. mysql 數據庫
//經過npm安裝以上依賴,例如
    npm install koa -S
複製代碼

項目配置

數據庫配置

項目用的是Mysql數據庫,運行以前請下載Mysql數據庫。Mysql下載地址數據庫

爲了建表偷懶因此使用了Navicat可視化數據庫管理工具,建表以下express

也能夠用下面sql代碼建表。npm

CREATE TABLE `elm_user` (
`elm_userID`  int(10) NOT NULL ,
`elm_userPhone`  varchar(11) NOT NULL ,
`elm_userPassword`  varchar(30) NOT NULL ,
PRIMARY KEY (`elm_userID`)
)
;
複製代碼

文件配置

  • mysql
//Koa2/config/DBcongfig.js
/*數據庫默認配置*/
const database ={
    database: 'elmfoodshop', //數據庫名稱
    user: 'root', //mysql用戶名
    password: '123456', //mysql密碼
    PORT: '3306', //mysql端口號
    host: "127.0.0.1" //服務器ip
}
module.exports = database
複製代碼
//Koa2/lib/mysql.js
const mysql = require("mysql")
const DBConfig = require("../config/DBConfig")

/*創建鏈接池*/
let pool = mysql.createPool(DBConfig)
/*鏈接數據庫*/
let allSqlAction = (sql, value) => {
    return new Promise((resolve, reject) => {
        pool.getConnection(function (err, connection) {
            if (err) {
                console.log(err)
                reject(err)
            }
            else {
                console.log("數據庫鏈接成功")
                connection.query(sql, value, (err, row) => {
                    if (err) reject(err)
                    else{
                        resolve(row)
                    } 
                    connection.release()
                })
            }
        })
    })
}

module.exports = {
    allSqlAction
}
複製代碼
  • Router配置

Router 主要用來描述請求 URL 和具體承擔執行動做的 Controller 的對應關係。

經過userRoute.js把路由更加細化,把用戶相關的對應的請求分流到不一樣的controller內

//Koa2/router/userRoute.js
const Router =require("koa-router")
const service = require ("../lib/mysql")
const controller = require("../controller/userController")

const router = new Router()

router.post("login","/login",controller.checkLogin)
router.post("login","/register",controller.registerUser)
module.exports = router
複製代碼

在router中注入userRouter

//Koa2/router/router.js
const Router =require("koa-router")
const user = require("./userRoute")

let router = new Router()

router.use(user.routes())

module.exports = router

複製代碼

controller層和service層

  • controller層

controller層處理來自用戶的輸入數據,返回給業務層service處理後返回。

//Koa2/controller/userController.js
const user = require("../service/user")
async function checkLogin(ctx,next){
    let {phone,password} = ctx.request.body
    let data = await user.checkUser(phone,password)
    return ctx.response.body = data
}
async function registerUser(ctx,next){
    let {phone,password} = ctx.request.body
    let data = await user.findUser(phone,password)
    return ctx.response.body = data
}
module.exports={
    checkLogin,
    registerUser
}
複製代碼
  • service層

service層查詢數據庫,根據查詢結果判斷,返回數據到controller

//Koa2/service/user.js
const allSqlAction = require("../lib/mysql")
async function checkUser(phone, password) {
    let sql = `select * from elm_user where elm_userPhone = ${phone} and elm_userPassword=${password}`
    return allSqlAction.allSqlAction(sql).then(res => {
        if (res.length == 1 && res[0].elm_userPhone === phone && elm_userPassword === password) {
            return { msg: "登錄成功", code: 200 }
        } else {
            return { msg: "登陸失敗", code: 201 }
        }
    })
}
async function findUser(phone, password) {
    let sql = `select * from elm_user where elm_userPhone = ${phone}`
    return allSqlAction.allSqlAction(sql).then(res => {
        if (res.length == 0) {
            return registerUser(phone, password)
        } else {
            return { msg: "用戶已存在", code: 202 }
        }
    })
}
async function registerUser(phone, password) {
    let sql = `insert into elm_user (elm_userPhone,elm_userPassword) values ('${phone}','${password}')`
    return allSqlAction.allSqlAction(sql).then(res => {
        if (res.affectedRows == 1) {
            return { msg: "註冊成功", code: 200 }
        } else {
            return { msg: "註冊失敗", code: 200 }
        }
    })
}
module.exports = {
    checkUser,
    findUser,
    registerUser
}
複製代碼

app.js

//Koa2/app.js
const Koa = require("koa")
const router = require("./router/router")
const bodyParser = require("koa-body")

var app = new Koa()

app.use(bodyParser())
app.use(router.routes())

app.use(async (ctx) => { 
    console.log("404 Not Found")
})

console.log("項目啓動http://127.0.0.1:3000")
app.listen(3000)

複製代碼

結語

第一次寫文章,也是爲了記錄下本身的成長,若是有問題能夠留言指出。

以上即是一個簡單使用Koa2+Mysql實現的一個登陸註冊。點此查看源碼

相關文章
相關標籤/搜索