Browse Source

✨ feat: 添加管理员查看乐跑记录的功能

Pchen. 9 months ago
parent
commit
c052c73a16

+ 129 - 0
apis/Lepao/Record/Admin/GetLepaoRecords.js

@@ -0,0 +1,129 @@
+const API = require("../../../../lib/API.js");
+const db = require("../../../../plugin/DataBase/db.js");
+const { BaseStdResponse } = require("../../../../BaseStdResponse.js");
+const AccessControl = require("../../../../lib/AccessControl.js");
+
+class AdminGetLepaoRecords extends API {
+    constructor() {
+        super();
+
+        this.setPath('/Admin/Lepao/Records')
+        this.setMethod('GET')
+    }
+
+    async onRequest(req, res) {
+        let { uuid, session, name, lepao_account, email, pagesize, current } = req.query
+
+        if ([uuid, session, pagesize, current].some(value => value === '' || value === null || value === undefined))
+            return res.json({
+                ...BaseStdResponse.MISSING_PARAMETER,
+                endpoint: 1513126
+            })
+
+        // 校验分页参数
+        if (isNaN(pagesize) || pagesize <= 0) {
+            return res.json({
+                ...BaseStdResponse.ERR,
+                msg: '参数错误'
+            })
+        }
+
+        if (isNaN(current) || current <= 0) {
+            return res.json({
+                ...BaseStdResponse.ERR,
+                msg: '参数错误'
+            })
+        }
+
+        if (!await AccessControl.checkSession(uuid, session))
+            return res.status(401).json({
+                ...BaseStdResponse.ACCESS_DENIED
+            })
+
+        // 检查权限
+        let permission = await AccessControl.getPermission(uuid)
+        if (!permission.includes("admin") && !permission.includes("server"))
+            return res.json({
+                ...BaseStdResponse.PERMISSION_DENIED
+            })
+
+        // 计算分页的 offset
+        const offset = (current - 1) * pagesize
+
+        let sql = `
+                SELECT 
+                    r.id,
+                    r.time,
+                    r.result,
+                    r.lepao_account,
+                    a.name
+                FROM 
+                    lepao_record r
+                JOIN 
+                    lepao_account a
+                ON 
+                    r.lepao_account = a.student_num
+                WHERE 
+                    1 = 1
+            `
+
+        let countSql = `
+            SELECT COUNT(*) AS total
+            FROM lepao_record r
+            JOIN lepao_account a ON r.lepao_account = a.student_num
+            WHERE 1 = 1
+        `
+
+        let params = []
+        let countParams = []
+
+        if (lepao_account) {
+            sql += ` AND r.lepao_account = ?`
+            countSql += ` AND r.lepao_account = ?`
+            params.push(lepao_account)
+            countParams.push(lepao_account)
+        }
+
+        if (email) {
+            sql += ` AND a.email = ?`
+            countSql += ` AND a.email = ?`
+            params.push(email)
+            countParams.push(email)
+        }
+
+        if (name) {
+            sql += ` AND a.name = ?`
+            countSql += ` AND a.name = ?`
+            params.push(name)
+            countParams.push(name)
+        }
+
+        sql += `
+            ORDER BY id DESC
+            LIMIT ? OFFSET ?;
+        `
+        params.push(String(pagesize), String(offset))
+
+        let rows = await db.query(sql, params)
+        let countResult = await db.query(countSql, countParams)
+
+        if (!rows || !countResult)
+            return res.json({
+                ...BaseStdResponse.DATABASE_ERR
+            })
+
+        let total = countResult[0].total
+
+        res.json({
+            ...BaseStdResponse.OK,
+            data: rows,
+            pagination: {
+                current,
+                pagesize,
+                total
+            }
+        })
+    }
+}
+
+module.exports.AdminGetLepaoRecords = AdminGetLepaoRecords

+ 84 - 0
apis/Lepao/Record/Admin/GetRecordDetail.js

@@ -0,0 +1,84 @@
+const API = require("../../../../lib/API")
+const db = require("../../../../plugin/DataBase/db")
+const AccessControl = require("../../../../lib/AccessControl")
+const { BaseStdResponse } = require("../../../../BaseStdResponse")
+
+class AdminGetRecordDetail extends API {
+    constructor() {
+        super();
+
+        this.setPath('/Admin/Lepao/GetRecordDetail')
+        this.setMethod('GET')
+    }
+
+    async onRequest(req, res) {
+        let {
+            uuid,
+            session,
+            id
+        } = req.query
+
+        if ([uuid, session, id].some(value => value === '' || value === null || value === undefined))
+            return res.json({
+                ...BaseStdResponse.MISSING_PARAMETER
+            })
+
+        // 检查 session
+        if (!await AccessControl.checkSession(uuid, session))
+            return res.status(401).json({
+                ...BaseStdResponse.ACCESS_DENIED
+            })
+
+        // 检查权限
+        let permission = await AccessControl.getPermission(uuid)
+        if (!permission.includes("admin") && !permission.includes("server"))
+            return res.json({
+                ...BaseStdResponse.PERMISSION_DENIED
+            })
+
+
+        let sql = `
+                SELECT 
+                    r.time,
+                    r.result,
+                    r.lepao_account,
+                    a.name,
+                    p.data
+                FROM 
+                    lepao_record r
+                JOIN 
+                    lepao_account a
+                ON 
+                    r.lepao_account = a.student_num
+                JOIN
+                    path_data p
+                ON 
+                    r.path_id = p.id
+                WHERE 
+                    r.id = ?
+            `
+        let rows = await db.query(sql, [id])
+
+        if (!rows)
+            return res.json({
+                ...BaseStdResponse.MISSING_FILE,
+                msg: '获取记录数据失败!'
+            })
+
+        if(rows.length === 0) 
+           return res.json({
+                ...BaseStdResponse.MISSING_FILE,
+                msg: '记录不存在或已被删除!'
+            }) 
+
+        let data = rows[0]
+        data.data = data.data.map(point => [point.o, point.a])
+
+        res.json({
+            ...BaseStdResponse.OK,
+            data
+        })
+    }
+}
+
+module.exports.AdminGetRecordDetail = AdminGetRecordDetail