8. 基於Vue+Element+nodeJs+Express+MySql後臺管理系統-後臺用戶接口編寫

接口主要涉及到登錄、增刪改查等功能,主要分爲兩部分,用戶相關接口和週報相關接口。

一、後臺用戶接口編寫

接下來先看一下用戶接口,在項目根目錄下創建一個controls文件夾,然後下面創建一個user.js文件,用來管理用戶相關接口。

1. 引入所需文件

首先將需要用到的插件以及外鏈方法引入到user.js文件中

const $sql = require('../sql/sqlMap')
const moment = require('moment')
const $http = require('../sql/http')
const $time = require('../utils/time')
const jwt = require('jwt-simple')
const express = require('express')
const app = express()
app.set('jwtTokenSecret', 'YOUR_SECRET_STRING')

然後在定義一個名爲user的Object類型的常量,並將各個接口函數作爲Object的一個屬性放到user常量裏 

const user = {}

2. 登錄

登錄功能我主要採用的是JWT實現token認證,接下來我們先來了解一下JWT交互流程:

1)用戶登錄
2)服務的認證,通過後生成token
3)將生成的token返回給瀏覽器
4)用戶每次請求攜帶token
5)服務端利用解讀jwt簽名,校驗簽名是否有效
6)處理請求,返回響應結果

核心代碼:

/* 用戶登錄 start */
login (req, res) {
  let params = req.body
  let name = params.name
  let password = params.password
  
  let sql = $sql.user.login
  let arrayParams = [name, password]

  $http.connPool(sql, arrayParams, (err, result) => {
    if(err) {
      return $http.writeJson(res, {code:-2, message:'失敗',errMsg: err})
    }
    else if (!result.length) {
      return $http.writeJson(res, {code: 2, message:'用戶或密碼不正確'})
    }
    else {
      let resultData = {}
      resultData.code = 1
      let data = result[0]
      data.create_time = $time.formatTime(data.create_time)
      if(data.type > 1) data.role = '普通用戶'
      data.role = '管理員'
      delete data.password
      /**設置移動端登錄連續30分鐘過後過期**/
      let expires = moment().add(30, 'minutes').valueOf()
      let token = jwt.encode({
        iss: data.id,
        exp: expires,
      }, app.get('jwtTokenSecret'))
      data.token = token
      resultData.data = data
      resultData.msg = '登錄成功'
      return $http.writeJson(res, resultData)
    }
  })
}
/* 用戶登錄 end */

3. 登出

根據登錄的方案,我採用的登出是生成的新的token,並設置一個很短的失效時間,這樣當再次訪問時,從jwt中解析出的token就會失效,從而達到登出效果。

/* 用戶登出 start */
logout (req, res) {
  let params = req.body
  $http.userVerify(req, res, () => {
    let expires = moment().add(100, 'milliseconds').valueOf()
    let token = jwt.encode({
      iss: params.userId,
      exp: expires,
    }, app.get('jwtTokenSecret'))
    resultData = {
      code: 1,
      message: '退出登錄成功'
    }
    return $http.writeJson(res, resultData)
  })

}
/* 用戶登出 end */

4. 添加用戶

/*添加用戶 start*/
add (req, res) {
  let params = req.body
  $http.userVerify(req, res, () => {
    let curTime = $time.formatTime()
    let name = params.name
    let password = params.password
    let email = params.email
    let create_time = curTime
    let update_time = curTime
    if(!name || !password) $http.writeJson(res, {code: 2, message:'參數有誤'})
    else {
      let sql = $sql.user.add
      let arrayParams = [name, password, email, create_time, update_time]
      $http.connPool(sql, arrayParams, (err, result) => {
        if(err) return $http.writeJson(res, {code:-2, message:'失敗',errMsg: err})
        if(result.affectedRows != 1) return $http.writeJson(res, {code: 2, message:'添加失敗'})
        return $http.writeJson(res, {code: 1, message: '添加用戶成功'})
      })
    }
  })
}
/*添加用戶 end*/

5. 更新用戶信息

/*更新用戶信息 start*/
updateInfo (req, res) {
  let params = req.body
  $http.userVerify(req, res, () => {
    let curTime = $time.formatTime()
    let id = params.id
    let name = params.name
    let password = params.password
    let email = params.email
    let update_time = curTime
    if(!id || !name || !password) {$http.writeJson(res, {code: 2, message:'參數有誤'})}
    else {
      let sql = $sql.user.updateInfo
      let arrayParams = [name, password, email, update_time, id]
      $http.connPool(sql, arrayParams, (err, result) => {
        if(err) return $http.writeJson(res, {code:-2, message:'失敗',errMsg: err})
        if(result.affectedRows != 1) return $http.writeJson(res, {code: 2, message:'更新失敗'})
        return $http.writeJson(res, {code: 1, data: result, message: '更新用戶成功'})
      })
    }
  })
}
/*更新用戶信息 end*/

6. 更新用戶狀態

/*更新用戶狀態 start*/
updateState (req, res) {
  let params = req.body
  $http.userVerify(req, res, () => {
    let curTime = $time.formatTime()
    let id = params.id
    let state = !params.state ? '0' : params.state
    let update_time = curTime
    if(!id) {
      $http.writeJson(res, {code: 2, message:'參數有誤'})
    } else {
      let sql = $sql.user.updateState
      let arrayParams = [state, update_time, id]
      $http.connPool(sql, arrayParams, (err, result) => {
        if(err) return $http.writeJson(res, {code:-2, message:'失敗',errMsg: err})
        if(result.affectedRows != 1) return $http.writeJson(res, {code: 2, message:'更新用戶狀態失敗'})
        return $http.writeJson(res, {code: 1, message: '更新用戶狀態成功'})
      })
    }
  })
}
/*更新用戶狀態 end*/

7. 獲取用戶信息

因涉及到時間格式問題,我這裏先創建了一個用於時間格式化的方法

// 格式化時間
function formatData(rows) {
  return rows.map(row => {
    if(row.create_time) {
      row.create_time = $time.formatTime(row.create_time)
    }
    if(row.update_time) {
      row.update_time = $time.formatTime(row.update_time)
    }
    let type = row.type
    if(type){
      switch(type) {
        case 1:
          row.role = '管理員'
          break
        case 2:
          row.role = '普通用戶'
          break
      }
    }
    return Object.assign({}, row)
  })
}

再進行獲取用戶信息接口編寫 

/*獲取用戶信息 start*/
detail (req, res) {
  let params = req.body
  $http.userVerify(req, res, () => {
    let userId = params.userId
    let id = params.id
    if(!id) {
      $http.writeJson(res, {code: 2, message:'參數有誤'})
    } else {
      let sql = $sql.user.getDetail
      let arrayParams = [id]
      $http.connPool(sql, arrayParams, (err, result) => {
        if(err) {return $http.writeJson(res, {code:-2, message:'失敗',errMsg: err})}
        if(result.length != 1) {
          return $http.writeJson(res, {code: 2, message:'獲取用戶信息不存在'})
        } else {
          let resultData = formatData(result)[0]
          return $http.writeJson(res, {code: 1, data: resultData, message: '獲取用戶信息成功'})
        }
      })
    }
  })
}
/*獲取用戶信息 end*/

8. 獲取用戶列表

/*獲取用戶列表 start*/
list (req, res) {
  let params = req.body
  $http.userVerify(req, res, () => {
    let sqlSelectTotal = $sql.user.selectTotal
    let sqlSelectList= $sql.user.selectList
    let userId = params.userId
    let userType = params.userType
    let searchId = params.searchId
    let searchName = params.searchName
    let searchEmail = params.searchEmail
    let pageNum = params.pageNum
    let pageSize = !params.pageSize ? 10 : params.pageSize

    if(!pageNum) {
      $http.writeJson(res, {code: 2, message:'參數有誤'})
    } else {
      // 分頁查詢入參 start
      let limitFirst = (pageNum-1)*pageSize;
      let limitLast = pageSize;
      // 分頁查詢入參 end
      if(userType!=1){
        sqlSelectTotal += " and id = "+userId
        sqlSelectList += " and id = "+userId
      }else{
        if(searchId) {
          sqlSelectTotal += " and id = "+searchId
          sqlSelectList += " and id = "+searchId
        }
      }

      if(searchName){
        sqlSelectTotal += " and name like '%"+searchName+"%'"
        sqlSelectList += " and name like '%"+searchName+"%'"
      }

      if(searchEmail){
        sqlSelectTotal += " and email like '%"+searchEmail+"%'"
        sqlSelectList += " and email like '%"+searchEmail+"%'"
      }
      let sql= sqlSelectTotal + '; ' + sqlSelectList
      sql += " order by id desc limit ?,?"; // id倒序排
      let arrayParams = [limitFirst, limitLast]
      
      $http.connPool(sql, arrayParams, (err, result) => {
        if(err) {
          return $http.writeJson(res, {code:-2, message:'失敗'})
        }else{
          let resultData = {}
          resultData.totalCount = result[0][0]['totalCount']
          resultData.list = formatData(result[1])
          return $http.writeJson(res, {code: 1, data: resultData, message: '獲取用戶列表成功'})
        } 
      })
    }

  })
}
/*獲取用戶列表 end*/

9. 導出整個user模塊

module.exports = user

這樣整體下來,我們的後臺用戶接口就做好了。

 

二、項目體驗鏈接

週報管理系統體驗鏈接:https://www.17sucai.com/pins/35488.html

 

本人前端程序員,長期混跡於各種前端開發中,現在專門爲前端熱愛者建了個微信羣,和大家一起分享自己在工作、學習中遇到的技術知識或問題,還有各種資料和課程,各位感興趣的可以加入哦~  
 

微信前端交流羣

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章