// 客户端 API(对应 H5 前台) import { Router } from 'express' import { getServices, getNotices, listOrders, getOrder, createOrder, loginCustomer, registerCustomer, listConfessions, getConfession, createConfession, likeConfession, addConfessionComment } 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 }) // 服务分类 router.get('/services', (req, res) => { const services = getServices() .filter(s => s.status === 'active') // 只返回 active 状态的服务 .sort((a, b) => a.sort - b.sort) ok(res, services) }) // 首页公告 router.get('/notices', (req, res) => ok(res, getNotices())) // 注册(手机号 + 密码 + 昵称) router.post('/auth/register', (req, res) => { const result = registerCustomer(req.body || {}) if (result.error) return fail(res, result.msg) ok(res, result) }) // 登录(手机号 + 密码) router.post('/auth/login', (req, res) => { const result = loginCustomer(req.body || {}) if (result.error) return fail(res, result.msg, 1, 401) ok(res, result) }) // 我的订单(需传 customerId,可按状态过滤) router.get('/orders', (req, res) => { const { customerId, status, page, pageSize } = req.query ok(res, listOrders({ customerId, status, page, pageSize: pageSize || 20 })) }) // 订单详情 router.get('/orders/:id', (req, res) => { const order = getOrder(req.params.id) if (!order) return fail(res, '订单不存在', 1, 404) ok(res, order) }) // 下单 router.post('/orders', (req, res) => { const body = req.body || {} if (!body.from || !body.to) return fail(res, '请完善取货和送达地址') const order = createOrder(body) ok(res, order) }) // ==================== 表白墙 ==================== // 表白列表(仅已通过审核) router.get('/confessions', (req, res) => { const { page, pageSize } = req.query ok(res, listConfessions({ status: 'approved', page, pageSize: pageSize || 20 })) }) // 表白详情(含评论) router.get('/confessions/:id', (req, res) => { const c = getConfession(req.params.id) if (!c || c.status !== 'approved') return fail(res, '表白不存在或未通过审核', 1, 404) ok(res, c) }) // 发布表白(进入待审核) router.post('/confessions', (req, res) => { const result = createConfession(req.body || {}) if (result.error) return fail(res, result.msg || '发布失败') ok(res, result) }) // 点赞 router.post('/confessions/:id/like', (req, res) => { const result = likeConfession(req.params.id) if (result.error) return fail(res, '表白不存在', 1, 404) ok(res, result) }) // 评论 router.post('/confessions/:id/comments', (req, res) => { const result = addConfessionComment(req.params.id, req.body || {}) if (result.error === 'NOT_FOUND') return fail(res, '表白不存在', 1, 404) if (result.error) return fail(res, result.msg || '评论失败') ok(res, result) }) // 随机头像(服务端转发,避免浏览器跨域) router.get('/avatar/random', async (req, res) => { try { const r = await fetch('https://v2.xxapi.cn/api/head?return=json', { headers: { 'User-Agent': 'Mozilla/5.0' }, signal: AbortSignal.timeout(6000) }) const j = await r.json() if (j && j.code === 200 && j.data) return ok(res, { url: j.data }) return fail(res, '获取头像失败') } catch (e) { return fail(res, '头像服务暂不可用') } }) export default router