// 管理端 API(管理后台:仪表盘 / 订单管理 / 客户管理) import { Router } from 'express' import { getStats, listOrders, getOrder, updateOrderStatus, listCustomers, getCustomer, getServices, // 🔧 新增 createService, // 🔧 新增 updateService, // 🔧 新增 deleteService, // 🔧 新增 reorderServices, // 🔧 新增 listConfessions, getConfession, updateConfessionStatus, deleteConfession, loginAdmin, isAdminToken, destroySession } from '../store.js' const router = Router() const ok = (res, data) => res.json({ code: 0, msg: 'ok', data }) const fail = (res, msg, code = 1, http = 400) => res.status(http).json({ code, msg, data: null }) // 管理员鉴权:校验 Bearer token 是否为有效的管理员会话 function isAdmin(req) { const token = (req.headers.authorization || '').replace('Bearer ', '') return isAdminToken(token) } // 管理员登录(用户名 + 密码) router.post('/auth/login', (req, res) => { const result = loginAdmin(req.body || {}) if (result.error) return fail(res, result.msg, 1, 401) ok(res, result) }) // 退出登录(销毁会话) router.post('/auth/logout', (req, res) => { const token = (req.headers.authorization || '').replace('Bearer ', '') destroySession(token) ok(res, { success: true }) }) // 仪表盘统计 router.get('/stats', (req, res) => ok(res, getStats())) // 订单列表(状态过滤 + 关键词 + 分页) router.get('/orders', (req, res) => { const { status, keyword, page, pageSize } = req.query ok(res, listOrders({ status, keyword, page, pageSize: pageSize || 10 })) }) // 订单详情 router.get('/orders/:id', (req, res) => { const order = getOrder(req.params.id) if (!order) return fail(res, '订单不存在', 1, 404) ok(res, order) }) // 更新订单状态(接单/完成/取消等) router.patch('/orders/:id/status', (req, res) => { if (!isAdmin(req)) return fail(res, '未授权', 401, 401) const { status } = req.body || {} const result = updateOrderStatus(req.params.id, status) if (result.error === 'INVALID_STATUS') return fail(res, '非法状态值') if (result.error === 'NOT_FOUND') return fail(res, '订单不存在', 1, 404) ok(res, result.order) }) // 客户列表(关键词 + 状态 + 分页) router.get('/customers', (req, res) => { const { keyword, status, page, pageSize } = req.query ok(res, listCustomers({ keyword, status, page, pageSize: pageSize || 10 })) }) // 客户详情(含该客户的订单) router.get('/customers/:id', (req, res) => { const customer = getCustomer(req.params.id) if (!customer) return fail(res, '客户不存在', 1, 404) const orders = listOrders({ customerId: customer.id, pageSize: 100 }) ok(res, { customer, orders: orders.list }) }) // ==================== 服务管理 APIs ==================== // 服务列表 router.get('/services', (req, res) => ok(res, getServices())) // 服务排序(必须放在 /services/:id 之前,否则 reorder 会被 :id 动态路由捕获) router.put('/services/reorder', async (req, res) => { if (!isAdmin(req)) return fail(res, '未授权', 401, 401) const ids = req.body.ids || [] if (!Array.isArray(ids)) return fail(res, '参数错误') const success = reorderServices(ids) ok(res, { success }) }) // 创建服务 router.post('/services', async (req, res) => { if (!isAdmin(req)) return fail(res, '未授权', 401, 401) const result = createService(req.body || {}) if (result.error) { return fail(res, result.msg, result.code, 400) } ok(res, result) }) // 更新服务 router.put('/services/:id', async (req, res) => { if (!isAdmin(req)) return fail(res, '未授权', 401, 401) const result = updateService(req.params.id, req.body || {}) if (result.error) { return fail(res, result.msg, 400) } ok(res, result) }) // 删除服务 router.delete('/services/:id', async (req, res) => { if (!isAdmin(req)) return fail(res, '未授权', 401, 401) const result = deleteService(req.params.id) if (result.error) { return fail(res, result.msg, 400) } ok(res, result) }) // ==================== 表白墙审核 ==================== // 表白列表(可按状态过滤:pending/approved/rejected/all) router.get('/confessions', (req, res) => { const { status, page, pageSize } = req.query ok(res, listConfessions({ status, page, pageSize: pageSize || 10 })) }) // 表白详情(含评论) router.get('/confessions/:id', (req, res) => { const c = getConfession(req.params.id) if (!c) return fail(res, '表白不存在', 1, 404) ok(res, c) }) // 审核:通过/驳回/重置为待审(approved/rejected/pending) router.patch('/confessions/:id/status', (req, res) => { if (!isAdmin(req)) return fail(res, '未授权', 401, 401) const { status } = req.body || {} const result = updateConfessionStatus(req.params.id, status) if (result.error === 'INVALID_STATUS') return fail(res, '非法状态值') if (result.error === 'NOT_FOUND') return fail(res, '表白不存在', 1, 404) ok(res, result.confession) }) // 删除表白 router.delete('/confessions/:id', (req, res) => { if (!isAdmin(req)) return fail(res, '未授权', 401, 401) const result = deleteConfession(req.params.id) if (result.error) return fail(res, '表白不存在', 1, 404) ok(res, result) }) export default router