8. 基于Vue+Element+nodeJs+Express+
2020-05-03 本文已影响0人
竹立荷塘
接口主要涉及到登录、增删改查等功能,主要分为两部分,用户相关接口和周报相关接口。
一、后台用户接口编写
接下来先看一下用户接口,在项目根目录下创建一个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