123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- const jwt = require('jsonwebtoken')
- const pool = require('../pool.js')
- const { errLog } = require('../utils/err')
- //日志记录
- module.exports = {
- poolsEvent() {
- const pools = require('./pools')
- return pools
- },
- setToken({ uid, captcha, name = 'user' }) {
- let token = jwt.sign({ uid, captcha }, name, {
- expiresIn: '86400s' // 授权时间
- })
- return token
- },
- verToken({ token, name = 'user' }) {
- try {
- return jwt.verify(token, name)
- } catch (err) {
- return false
- }
- },
- /**
- * 判断名称是否重复
- * @param sql sql语句
- * @param name sql查询参数name
- * @param msg 提示语
- * @param req 请求主体
- * @param res 响应主体
- * */
- async existName({ sql, name, msg = '名称已存在!', req, res }) {
- if (!name) return true
- let { result } = await this.poolsEvent()({ sql, res, req, val: [name] })
- if (result.length > 0) {
- res.send(this.returnData({ code: -1, msg, req }))
- return Promise.reject(false)
- }
- return true
- },
- /**
- * 判断修改的名称是否和修改前的一样
- * @param sql sql语句
- * @param sqlName 修改前的属性名
- * @param name 修改后的值
- * @param id sql条件参数
- * @param req 请求主体
- * @param res 响应主体
- * */
- async judgeUserName({ sql, sqlName = 'name', name, id, req, res }) {
- let { result } = await this.poolsEvent()({ sql, val: [id], res, req })
- if (result[0][sqlName] == name) return -1
- return 1
- },
- /**
- * 响应总函数
- * @param code 状态码
- * @param msg 提示文字
- * @param total 查询总数量
- * @param data 数据
- * @param err 错误信息
- * @param req 错误信息
- * @param funName 错误信息记录名称
- * */
- returnData({ code = 1, msg, total = undefined, data = {}, err, req = {}, funName } = {}) {
- if (code == 1 && !msg) msg = '请求成功!'
- if (code == -1 && err.code == 'ER_DUP_ENTRY' && !msg) msg = '新增数据重复,请检查输入的数据'
- if (code == -1 && !msg) msg = '服务器异常!'
- if (code == 203 && !msg) msg = '登陆失效,请重新登陆!'
- let res = { code, msg, data }
- if (total !== undefined) res.total = total
- if (err) res.err = err
- //记录错误日志
- if (code != 1) errLog({ err, code, msg, req, funName })
- return res
- },
- /**
- * 获取用户信息
- * @param req 请求主体
- * @param res 响应主体
- * @param addMore 是否拒绝管理员添加多账户信息
- * */
- async getUserInfo({ req, res, addMore = false } = {}) {
- let token = req.headers.token
- if (!token) {
- res.send(this.returnData({ code: 203, req }))
- return Promise.reject(false)
- }
- let user = this.verToken({ token })
- if (!user) {
- res.send(this.returnData({ code: 203, req }))
- return Promise.reject(false)
- }
- let sql = 'SELECT id,name,status,roles_id AS rolesId,admin,more_id AS moreId,url FROM user WHERE id=?'
- let { result } = await this.poolsEvent()({ sql, val: [user.uid], res, req })
- if (result.length === 0) {
- res.send(this.returnData({ code: -1, msg: '用户不存在!', req }))
- return Promise.reject(false)
- }
- if (addMore && result[0].admin === 1) {
- res.send(this.returnData({ code: -1, msg: '终极管理员无权 增加多账号数据~', req }))
- return Promise.reject(false)
- }
- return result[0]
- },
- /**
- * 获取用户权限
- * @param req 请求主体
- * @param res 响应主体
- * */
- async getUserRole(req, res) {
- let user = await this.getUserInfo({ req, res })
- let userSql = 'SELECT roles,role_key FROM roles WHERE FIND_IN_SET(id,?)'
- let { result } = await this.poolsEvent()({ sql: userSql, val: [user.rolesId], res, req })
- if (result.length == 0) {
- res.send(this.returnData({ code: -1, msg: '获取权限失败!', req }))
- return Promise.reject(false)
- }
- let roles = result.map((t) => t.roles)
- //权限字符
- let roleKey = result.map((t) => t.role_key)
- //角色权限
- let roleAdmin = roleKey.some((t) => t === 'admin')
- return { userRole: roles.join(','), roleKey, user, roleAdmin }
- },
- /**
- * 菜单字符权限拦截
- * @param req 主体
- * @param res 主体
- * @param role 接口权限字符数组
- * @param admin 是否管理员也要遵守(默认否)
- * @param run 是否不拦截,返回结果
- * */
- async checkPermi({ req, res, role = [], admin = false, run = false }) {
- let userRole = await this.getUserRole(req, res)
- if ((userRole.roleAdmin || userRole.user.admin === 1) && !admin) return true
- let sql = 'SELECT role_key AS roleKey FROM router_menu WHERE FIND_IN_SET(id,?)'
- let { result } = await this.poolsEvent()({ sql, val: [userRole.userRole], res, req })
- try {
- let roleKeyArr = result.map((t) => t.roleKey).filter((t) => t)
- const hasPermission = role.some((permission) => {
- return roleKeyArr.includes(permission)
- })
- if (hasPermission || run) return hasPermission
- res.send(this.returnData({ code: -1, msg: '暂无此功能请求权限!', req }))
- return Promise.reject(false)
- } catch (e) {
- res.send(this.returnData({ code: -1, msg: '菜单权限判断错误!!', req }))
- return Promise.reject(false)
- }
- },
- /**
- * 角色权限拦截
- * @param req 主体
- * @param res 主体
- * @param role 角色权限数组
- * @param admin 是否管理员也要遵守(默认否)
- * @param run 是否不拦截,返回结果
- * */
- async checkRole({ req, res, role = [], admin = false, run = false }) {
- try {
- let userRole = await this.getUserRole(req, res)
- if ((userRole.roleAdmin || userRole.user.admin === 1) && !admin) return true
- let roleKeyArr = userRole.roleKey
- const hasPermission = role.some((permission) => {
- return roleKeyArr.includes(permission)
- })
- if (hasPermission || run) return hasPermission
- res.send(this.returnData({ code: -1, msg: '暂无对应角色请求权限!', req }))
- return Promise.reject(false)
- } catch (e) {
- res.send(this.returnData({ code: -1, msg: '角色权限判断错误!', err: e, req }))
- return Promise.reject(false)
- }
- },
- /**
- * 是否操作的是用户总管理员
- * @param req 请求主体
- * @param res 响应主体
- * @param id 查询条件id
- * */
- async upAdmin({ req, res, id }) {
- let sql = 'SELECT admin FROM user WHERE id=?'
- let { result } = await this.poolsEvent()({ sql, val: [id], res, req })
- if (result.length === 0) {
- res.send(this.returnData({ code: -1, msg: '管理信息判断错误!', req }))
- return Promise.reject(false)
- }
- if (result[0].admin === 1) {
- res.send(this.returnData({ code: -1, msg: '无法对《总管理》执行此操作!', req }))
- return Promise.reject(false)
- }
- return result
- },
- /**
- * 是否操作的是角色总管理员
- * @param req 请求主体
- * @param res 响应主体
- * @param id 查询条件id
- * */
- async upAdminRole({ req, res, id }) {
- let sql = 'SELECT role_key FROM roles WHERE id=?'
- let { result } = await this.poolsEvent()({ sql, val: [id], res, req })
- if (result.length === 0) {
- res.send(this.returnData({ code: -1, msg: '管理信息判断错误!!', req }))
- return Promise.reject(false)
- }
- if (result[0].role_key === 'admin') {
- res.send(this.returnData({ code: -1, msg: '无法对《角色总管理》执行此操作!', req }))
- return Promise.reject(false)
- }
- return result
- },
- /**
- * 通过id获取用户信息
- * @param req 请求主体
- * @param res 响应主体
- * @param id 查询条件id
- * */
- async getUserId({ req, res, id }) {
- let sql = 'SELECT admin FROM user WHERE id=?'
- let { result } = await this.poolsEvent()({ sql, val: [id], res, req })
- if (result.length === 0) {
- res.send(this.returnData({ code: -1, msg: '用户信息错误!!', req }))
- return Promise.reject(false)
- }
- return result[0]
- },
- /**
- * 分页页码处理
- * @param sql sql语句
- * @param page 页码
- * @param size 最大数量
- * */
- pageSize(sql, page, size) {
- if (!page) {
- page = 1
- }
- if (!size) {
- size = 10
- }
- page = (page - 1) * size
- size = parseInt(size)
- return (sql += ` LIMIT ${page},${size}`)
- },
- /**
- * 查询总数
- * @param sql sql语句
- * @param name 表名
- * @param res 响应主体
- * @param req 请求主体
- * */
- async getSum({ sql = '', name, res, req }) {
- const regex = /WHERE(.+)/
- const result = sql.match(regex)
- let where = '1=1'
- if (result && result[1]) where = result[1].trim()
- let sqlRes = `SELECT count(1) FROM ${name} WHERE ${where}`
- let { result: resultRes } = await this.poolsEvent()({ sql: sqlRes, res, req })
- return { total: resultRes[0]['count(1)'] }
- },
- /**
- * 查询总数
- * @param sql sql语句
- * @param val ?另加值
- * @param name 表名
- * @param res 响应主体
- * @param req 请求主体
- * */
- async getSumWhere({ sql = '', val = [], name, res, req }) {
- const regex = /WHERE(.+)/
- const result = sql.match(regex)
- let where = '1=1'
- if (result && result[1]) where = result[1].trim()
- let sqlRes = `SELECT count(1) FROM ${name} WHERE ${where}`
- let { result: resultRes } = await this.poolsEvent()({ sql: sqlRes, val, res, req })
- return { total: resultRes[0]['count(1)'] }
- },
- /**
- * 将多账户id加入sql判断
- * @param sql sql语句
- * @param user 用户信息
- * @param name 字段名
- * */
- setMoreId(sql, user, name = 'more_id') {
- if (user.admin !== 1) return (sql += ` AND ${name} = ${user.moreId}`)
- return sql
- },
- /**
- * 模糊查询
- * @param sql sql语句
- * @param name 字段名
- * @param val 值
- * */
- setLike(sql, name = '', val = '') {
- if (this.exist(val)) sql += ` AND ${name} LIKE "%${val}%"`
- return sql
- },
- setOr(sql, name = '', val = '') {
- if (this.exist(val)) sql += ` or id in (SELECT parent_id FROM entity_t where name LIKE '%${val}%')`
- return sql
- },
- /**
- * 判断是否为空
- * @param str any
- * */
- exist(str) {
- return str !== undefined && str !== '' && str !== null
- }
- }
|