8. 基于Vue+Element+nodeJs+Express+MySql后台管理系统-后台用户接口编写

本文详细介绍了基于Node.js的周报管理系统后端接口设计,涵盖了用户登录、增删改查等核心功能,深入解析了JWT认证机制,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接口主要涉及到登录、增删改查等功能,主要分为两部分,用户相关接口和周报相关接口。

一、后台用户接口编写

接下来先看一下用户接口,在项目根目录下创建一个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

这样整体下来,我们的后台用户接口就做好了。

二、项目链接

周报管理系统git仓库链接: nodeJs工作周报后台管理系统OA模板

程序员接单_竹立荷塘的博客-优快云博客

 

这个系统其实是出于学习nodejs的目的而改写的系统。 原来的系统前端使用了extjs4.2.1,后端使用了PHP5.4和ZEND框架开发,后台数据库是用mongodb2.2.2。 我抽离出了原来系统中的账户管理,角色管理,菜单管理,权限管理这4个部分, 我想这4个部分,基本上所有的系统都会用到。具有一定的普遍性。所以将这4个部分用nodejs重新改写了。 该系统目前使用模块有express,ejs,connect-mongo,mongodb,express-partials,connect-flash,fibers,wind等 其实wind模块这次系统中没有使用。可以将它排除出去。我是出于学习wind的目的,才加入这个模块的。 本来准备使用wind模块,是为了实现同步的目的,由于后来改用了fibers模块之后,就没有使用它。这里说明一下 不是fibers要比wind好,而是我暂时不能理解wind,或则是说对wind的研究不够吧。 众所周知nodejs是推崇异步模式。但是这个系统是从php过来的,而php的代码是同步模式的写法,所以为了在改写的过程中 希望 1是代码改动最少 2是同步写法更加适合思维习惯。而且代码可读性高的目的,用到了fibers。 这个系统的源代码中有些js文件里保留了一些原来的PHP代码,这是出于代码对比的目的。 是让大家了解原来的php代码是怎么实现的,用nodejs之后是如何改写的。通过对比,大家会发现 其实通过使用fibers之后,几乎两者是一模一样的。 还有源代码中还保留了一些被注释掉的函数,有些是用到了wind,有些是用到了fibers,有些是直接异步的写法。 这些内容都是在开发过程中我不断尝试后的产物。我花了1周的时间才实现了一个递归的调用,而且还是同步的方式。 到目前为止,我还不能理解在异步模式下实现递归调用函数。比如说源代码中有个函数getMenuTree,菜单下面可能有子菜单, 子菜单的下面可能还有菜单。所以是一个递归的过程。我现在是同步的写法实现了这个函数,如果有人能够提供异步写法实现的递归函数并 emai给我,我不胜荣幸。 在使用本系统之前,必须要安装nodejs 0.10.10,mongodb2.2.2,python2.7.5至于安装的方法请googel解决。 将源代码下载之后,解压到某个目录下,比如说d:\nodejs\umav4simple目录。 进入到那个目录, a)运行以下命令 npm install express npm install ejs npm install connect-mongo npm install mongodb npm install express-partials npm install connect-flash npm install fibers npm install wind 尽管在源代码中已包含了这些模块,但是最好还是要重新运行一遍。 因为有些模块可能需要重新的编译。 比如说fibers模块,我在window下运行npm install fibers的时候编译了一个win32-ia32-v8-3.14 而在linux下重新编译了linux-ia32-v8-3.14。所以说根据操作系统的不同,可能会有一些不同。 以免造成想不到的错误。 b)打开settings.js,并且将你的mongodb的设置改写并保存。 c)运行node app.js或则node cluster.js 如果没有提示错误的话,那么就说明环境配置成功了。 d)通过以下的URL可以在mongodb中追加一些数据,不过只能运行一次。否则会重复追加数据。 浏览器上输入 http://localhost:3000/admin/index/install 做完之后, 浏览器上输入http://localhost:3000/ 就通过用户名admin 密码adminadmin进行登录,并使用这个系统了。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值