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

 

本人前端程序员,长期混迹于各种前端开发中,现在专门为前端热爱者建了个微信群,和大家一起分享自己在工作、学习中遇到的技术知识或问题,还有各种资料和课程,各位感兴趣的可以加入哦~  
 

微信前端交流群

 

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