List.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. const API = require("../../../lib/API.js")
  2. const db = require("../../../plugin/DataBase/db.js")
  3. const { BaseStdResponse } = require("../../../BaseStdResponse.js")
  4. const AccessControl = require("../../../lib/AccessControl.js")
  5. function parseBookList(value) {
  6. if (value === null || value === undefined || value === '') return []
  7. if (Array.isArray(value)) return value
  8. try {
  9. const parsed = JSON.parse(value)
  10. return Array.isArray(parsed) ? parsed : []
  11. } catch {
  12. return []
  13. }
  14. }
  15. function extractClassName(bookList) {
  16. if (!Array.isArray(bookList) || bookList.length === 0) return ''
  17. const book = bookList.find(b => b && b.className)
  18. return book?.className ?? ''
  19. }
  20. class AdminQxsAccountList extends API {
  21. constructor() {
  22. super()
  23. this.setPath('/Admin/QXS/Account/List')
  24. this.setMethod('GET')
  25. }
  26. async onRequest(req, res) {
  27. let {
  28. uuid,
  29. session,
  30. username,
  31. realname,
  32. email,
  33. mobile,
  34. termName,
  35. className,
  36. queryTime,
  37. pagesize,
  38. current
  39. } = req.query
  40. if ([uuid, session, pagesize, current].some(v => v === '' || v === null || v === undefined))
  41. return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
  42. if (isNaN(pagesize) || Number(pagesize) <= 0 || isNaN(current) || Number(current) <= 0)
  43. return res.json({ ...BaseStdResponse.ERR, msg: '参数错误' })
  44. if (!await AccessControl.checkSession(uuid, session))
  45. return res.status(401).json({ ...BaseStdResponse.ACCESS_DENIED })
  46. const permission = await AccessControl.getPermission(uuid)
  47. if (!permission.includes('admin') && !permission.includes('server') && !permission.includes('service'))
  48. return res.json({ ...BaseStdResponse.PERMISSION_DENIED })
  49. const offset = (Number(current) - 1) * Number(pagesize)
  50. const where = ['1 = 1']
  51. const params = []
  52. const countParams = []
  53. if (username) {
  54. where.push('qa.username COLLATE utf8mb4_general_ci LIKE (CONVERT(? USING utf8mb4) COLLATE utf8mb4_general_ci)')
  55. params.push(`%${username}%`)
  56. countParams.push(`%${username}%`)
  57. }
  58. if (realname) {
  59. where.push('qa.realname COLLATE utf8mb4_general_ci LIKE (CONVERT(? USING utf8mb4) COLLATE utf8mb4_general_ci)')
  60. params.push(`%${realname}%`)
  61. countParams.push(`%${realname}%`)
  62. }
  63. if (email) {
  64. where.push('qa.email COLLATE utf8mb4_general_ci LIKE (CONVERT(? USING utf8mb4) COLLATE utf8mb4_general_ci)')
  65. params.push(`%${email}%`)
  66. countParams.push(`%${email}%`)
  67. }
  68. if (mobile) {
  69. where.push('qa.mobile COLLATE utf8mb4_general_ci LIKE (CONVERT(? USING utf8mb4) COLLATE utf8mb4_general_ci)')
  70. params.push(`%${mobile}%`)
  71. countParams.push(`%${mobile}%`)
  72. }
  73. if (termName) {
  74. where.push('qa.termName COLLATE utf8mb4_general_ci LIKE (CONVERT(? USING utf8mb4) COLLATE utf8mb4_general_ci)')
  75. params.push(`%${termName}%`)
  76. countParams.push(`%${termName}%`)
  77. }
  78. if (className) {
  79. where.push('qa.book_list COLLATE utf8mb4_general_ci LIKE (CONVERT(? USING utf8mb4) COLLATE utf8mb4_general_ci)')
  80. params.push(`%"className"%${className}%`)
  81. countParams.push(`%"className"%${className}%`)
  82. }
  83. if (Array.isArray(queryTime) && queryTime.length === 2) {
  84. where.push('qa.create_time >= ? AND qa.create_time < ?')
  85. params.push(queryTime[0], queryTime[1])
  86. countParams.push(queryTime[0], queryTime[1])
  87. }
  88. const whereSql = where.join(' AND ')
  89. const listSql = `
  90. SELECT
  91. qa.id,
  92. qa.username,
  93. qa.create_time,
  94. qa.realname,
  95. qa.email,
  96. qa.mobile,
  97. qa.termName,
  98. qa.book_list
  99. FROM qsx_account qa
  100. WHERE ${whereSql}
  101. ORDER BY qa.id DESC
  102. LIMIT ? OFFSET ?
  103. `
  104. const countSql = `SELECT COUNT(*) AS total FROM qsx_account qa WHERE ${whereSql}`
  105. params.push(String(pagesize), String(offset))
  106. const rows = await db.query(listSql, params)
  107. const countRows = await db.query(countSql, countParams)
  108. if (!rows || !countRows) return res.json({ ...BaseStdResponse.DATABASE_ERR })
  109. const data = rows.map(item => {
  110. const bookList = parseBookList(item.book_list)
  111. return {
  112. id: item.id,
  113. username: item.username,
  114. create_time: item.create_time,
  115. realname: item.realname,
  116. email: item.email,
  117. mobile: item.mobile,
  118. termName: item.termName,
  119. className: extractClassName(bookList),
  120. book_count: bookList.length
  121. }
  122. })
  123. return res.json({
  124. ...BaseStdResponse.OK,
  125. data,
  126. pagination: {
  127. current: Number(current),
  128. pagesize: Number(pagesize),
  129. total: countRows[0]?.total || 0
  130. }
  131. })
  132. }
  133. }
  134. module.exports.AdminQxsAccountList = AdminQxsAccountList