接口主要涉及到登錄、增刪改查等功能,主要分爲兩部分,用戶相關接口和週報相關接口。
一、後臺用戶接口編寫
接下來先看一下用戶接口,在項目根目錄下創建一個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
本人前端程序員,長期混跡於各種前端開發中,現在專門爲前端熱愛者建了個微信羣,和大家一起分享自己在工作、學習中遇到的技術知識或問題,還有各種資料和課程,各位感興趣的可以加入哦~