index.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. const jwt = require('jsonwebtoken')
  2. const pool = require('../pool.js')
  3. const { errLog } = require('../utils/err')
  4. //日志记录
  5. module.exports = {
  6. poolsEvent() {
  7. const pools = require('./pools')
  8. return pools
  9. },
  10. setToken({ uid, captcha, name = 'user' }) {
  11. let token = jwt.sign({ uid, captcha }, name, {
  12. expiresIn: '86400s' // 授权时间
  13. })
  14. return token
  15. },
  16. verToken({ token, name = 'user' }) {
  17. try {
  18. return jwt.verify(token, name)
  19. } catch (err) {
  20. return false
  21. }
  22. },
  23. /**
  24. * 判断名称是否重复
  25. * @param sql sql语句
  26. * @param name sql查询参数name
  27. * @param msg 提示语
  28. * @param req 请求主体
  29. * @param res 响应主体
  30. * */
  31. async existName({ sql, name, msg = '名称已存在!', req, res }) {
  32. if (!name) return true
  33. let { result } = await this.poolsEvent()({ sql, res, req, val: [name] })
  34. if (result.length > 0) {
  35. res.send(this.returnData({ code: -1, msg, req }))
  36. return Promise.reject(false)
  37. }
  38. return true
  39. },
  40. /**
  41. * 判断修改的名称是否和修改前的一样
  42. * @param sql sql语句
  43. * @param sqlName 修改前的属性名
  44. * @param name 修改后的值
  45. * @param id sql条件参数
  46. * @param req 请求主体
  47. * @param res 响应主体
  48. * */
  49. async judgeUserName({ sql, sqlName = 'name', name, id, req, res }) {
  50. let { result } = await this.poolsEvent()({ sql, val: [id], res, req })
  51. if (result[0][sqlName] == name) return -1
  52. return 1
  53. },
  54. /**
  55. * 响应总函数
  56. * @param code 状态码
  57. * @param msg 提示文字
  58. * @param total 查询总数量
  59. * @param data 数据
  60. * @param err 错误信息
  61. * @param req 错误信息
  62. * @param funName 错误信息记录名称
  63. * */
  64. returnData({ code = 1, msg, total = undefined, data = {}, err, req = {}, funName } = {}) {
  65. if (code == 1 && !msg) msg = '请求成功!'
  66. if (code == -1 && err.code == 'ER_DUP_ENTRY' && !msg) msg = '新增数据重复,请检查输入的数据'
  67. if (code == -1 && !msg) msg = '服务器异常!'
  68. if (code == 203 && !msg) msg = '登陆失效,请重新登陆!'
  69. let res = { code, msg, data }
  70. if (total !== undefined) res.total = total
  71. if (err) res.err = err
  72. //记录错误日志
  73. if (code != 1) errLog({ err, code, msg, req, funName })
  74. return res
  75. },
  76. /**
  77. * 获取用户信息
  78. * @param req 请求主体
  79. * @param res 响应主体
  80. * @param addMore 是否拒绝管理员添加多账户信息
  81. * */
  82. async getUserInfo({ req, res, addMore = false } = {}) {
  83. let token = req.headers.token
  84. if (!token) {
  85. res.send(this.returnData({ code: 203, req }))
  86. return Promise.reject(false)
  87. }
  88. let user = this.verToken({ token })
  89. if (!user) {
  90. res.send(this.returnData({ code: 203, req }))
  91. return Promise.reject(false)
  92. }
  93. let sql = 'SELECT id,name,status,roles_id AS rolesId,admin,more_id AS moreId,url FROM user WHERE id=?'
  94. let { result } = await this.poolsEvent()({ sql, val: [user.uid], res, req })
  95. if (result.length === 0) {
  96. res.send(this.returnData({ code: -1, msg: '用户不存在!', req }))
  97. return Promise.reject(false)
  98. }
  99. if (addMore && result[0].admin === 1) {
  100. res.send(this.returnData({ code: -1, msg: '终极管理员无权 增加多账号数据~', req }))
  101. return Promise.reject(false)
  102. }
  103. return result[0]
  104. },
  105. /**
  106. * 获取用户权限
  107. * @param req 请求主体
  108. * @param res 响应主体
  109. * */
  110. async getUserRole(req, res) {
  111. let user = await this.getUserInfo({ req, res })
  112. let userSql = 'SELECT roles,role_key FROM roles WHERE FIND_IN_SET(id,?)'
  113. let { result } = await this.poolsEvent()({ sql: userSql, val: [user.rolesId], res, req })
  114. if (result.length == 0) {
  115. res.send(this.returnData({ code: -1, msg: '获取权限失败!', req }))
  116. return Promise.reject(false)
  117. }
  118. let roles = result.map((t) => t.roles)
  119. //权限字符
  120. let roleKey = result.map((t) => t.role_key)
  121. //角色权限
  122. let roleAdmin = roleKey.some((t) => t === 'admin')
  123. return { userRole: roles.join(','), roleKey, user, roleAdmin }
  124. },
  125. /**
  126. * 菜单字符权限拦截
  127. * @param req 主体
  128. * @param res 主体
  129. * @param role 接口权限字符数组
  130. * @param admin 是否管理员也要遵守(默认否)
  131. * @param run 是否不拦截,返回结果
  132. * */
  133. async checkPermi({ req, res, role = [], admin = false, run = false }) {
  134. let userRole = await this.getUserRole(req, res)
  135. if ((userRole.roleAdmin || userRole.user.admin === 1) && !admin) return true
  136. let sql = 'SELECT role_key AS roleKey FROM router_menu WHERE FIND_IN_SET(id,?)'
  137. let { result } = await this.poolsEvent()({ sql, val: [userRole.userRole], res, req })
  138. try {
  139. let roleKeyArr = result.map((t) => t.roleKey).filter((t) => t)
  140. const hasPermission = role.some((permission) => {
  141. return roleKeyArr.includes(permission)
  142. })
  143. if (hasPermission || run) return hasPermission
  144. res.send(this.returnData({ code: -1, msg: '暂无此功能请求权限!', req }))
  145. return Promise.reject(false)
  146. } catch (e) {
  147. res.send(this.returnData({ code: -1, msg: '菜单权限判断错误!!', req }))
  148. return Promise.reject(false)
  149. }
  150. },
  151. /**
  152. * 角色权限拦截
  153. * @param req 主体
  154. * @param res 主体
  155. * @param role 角色权限数组
  156. * @param admin 是否管理员也要遵守(默认否)
  157. * @param run 是否不拦截,返回结果
  158. * */
  159. async checkRole({ req, res, role = [], admin = false, run = false }) {
  160. try {
  161. let userRole = await this.getUserRole(req, res)
  162. if ((userRole.roleAdmin || userRole.user.admin === 1) && !admin) return true
  163. let roleKeyArr = userRole.roleKey
  164. const hasPermission = role.some((permission) => {
  165. return roleKeyArr.includes(permission)
  166. })
  167. if (hasPermission || run) return hasPermission
  168. res.send(this.returnData({ code: -1, msg: '暂无对应角色请求权限!', req }))
  169. return Promise.reject(false)
  170. } catch (e) {
  171. res.send(this.returnData({ code: -1, msg: '角色权限判断错误!', err: e, req }))
  172. return Promise.reject(false)
  173. }
  174. },
  175. /**
  176. * 是否操作的是用户总管理员
  177. * @param req 请求主体
  178. * @param res 响应主体
  179. * @param id 查询条件id
  180. * */
  181. async upAdmin({ req, res, id }) {
  182. let sql = 'SELECT admin FROM user WHERE id=?'
  183. let { result } = await this.poolsEvent()({ sql, val: [id], res, req })
  184. if (result.length === 0) {
  185. res.send(this.returnData({ code: -1, msg: '管理信息判断错误!', req }))
  186. return Promise.reject(false)
  187. }
  188. if (result[0].admin === 1) {
  189. res.send(this.returnData({ code: -1, msg: '无法对《总管理》执行此操作!', req }))
  190. return Promise.reject(false)
  191. }
  192. return result
  193. },
  194. /**
  195. * 是否操作的是角色总管理员
  196. * @param req 请求主体
  197. * @param res 响应主体
  198. * @param id 查询条件id
  199. * */
  200. async upAdminRole({ req, res, id }) {
  201. let sql = 'SELECT role_key FROM roles WHERE id=?'
  202. let { result } = await this.poolsEvent()({ sql, val: [id], res, req })
  203. if (result.length === 0) {
  204. res.send(this.returnData({ code: -1, msg: '管理信息判断错误!!', req }))
  205. return Promise.reject(false)
  206. }
  207. if (result[0].role_key === 'admin') {
  208. res.send(this.returnData({ code: -1, msg: '无法对《角色总管理》执行此操作!', req }))
  209. return Promise.reject(false)
  210. }
  211. return result
  212. },
  213. /**
  214. * 通过id获取用户信息
  215. * @param req 请求主体
  216. * @param res 响应主体
  217. * @param id 查询条件id
  218. * */
  219. async getUserId({ req, res, id }) {
  220. let sql = 'SELECT admin FROM user WHERE id=?'
  221. let { result } = await this.poolsEvent()({ sql, val: [id], res, req })
  222. if (result.length === 0) {
  223. res.send(this.returnData({ code: -1, msg: '用户信息错误!!', req }))
  224. return Promise.reject(false)
  225. }
  226. return result[0]
  227. },
  228. /**
  229. * 分页页码处理
  230. * @param sql sql语句
  231. * @param page 页码
  232. * @param size 最大数量
  233. * */
  234. pageSize(sql, page, size) {
  235. if (!page) {
  236. page = 1
  237. }
  238. if (!size) {
  239. size = 10
  240. }
  241. page = (page - 1) * size
  242. size = parseInt(size)
  243. return (sql += ` LIMIT ${page},${size}`)
  244. },
  245. /**
  246. * 查询总数
  247. * @param sql sql语句
  248. * @param name 表名
  249. * @param res 响应主体
  250. * @param req 请求主体
  251. * */
  252. async getSum({ sql = '', name, res, req }) {
  253. const regex = /WHERE(.+)/
  254. const result = sql.match(regex)
  255. let where = '1=1'
  256. if (result && result[1]) where = result[1].trim()
  257. let sqlRes = `SELECT count(1) FROM ${name} WHERE ${where}`
  258. let { result: resultRes } = await this.poolsEvent()({ sql: sqlRes, res, req })
  259. return { total: resultRes[0]['count(1)'] }
  260. },
  261. /**
  262. * 查询总数
  263. * @param sql sql语句
  264. * @param val ?另加值
  265. * @param name 表名
  266. * @param res 响应主体
  267. * @param req 请求主体
  268. * */
  269. async getSumWhere({ sql = '', val = [], name, res, req }) {
  270. const regex = /WHERE(.+)/
  271. const result = sql.match(regex)
  272. let where = '1=1'
  273. if (result && result[1]) where = result[1].trim()
  274. let sqlRes = `SELECT count(1) FROM ${name} WHERE ${where}`
  275. let { result: resultRes } = await this.poolsEvent()({ sql: sqlRes, val, res, req })
  276. return { total: resultRes[0]['count(1)'] }
  277. },
  278. /**
  279. * 将多账户id加入sql判断
  280. * @param sql sql语句
  281. * @param user 用户信息
  282. * @param name 字段名
  283. * */
  284. setMoreId(sql, user, name = 'more_id') {
  285. if (user.admin !== 1) return (sql += ` AND ${name} = ${user.moreId}`)
  286. return sql
  287. },
  288. /**
  289. * 模糊查询
  290. * @param sql sql语句
  291. * @param name 字段名
  292. * @param val 值
  293. * */
  294. setLike(sql, name = '', val = '') {
  295. if (this.exist(val)) sql += ` AND ${name} LIKE "%${val}%"`
  296. return sql
  297. },
  298. setOr(sql, name = '', val = '') {
  299. if (this.exist(val)) sql += ` or id in (SELECT parent_id FROM entity_t where name LIKE '%${val}%')`
  300. return sql
  301. },
  302. /**
  303. * 判断是否为空
  304. * @param str any
  305. * */
  306. exist(str) {
  307. return str !== undefined && str !== '' && str !== null
  308. }
  309. }