// mock-server 入口:装配全部业务路由,启动一个独立 Express 进程模拟真实后端。 // 启动方式:npm run mock(默认端口 8888,可通过环境变量 MOCK_PORT 覆盖)。 import express from 'express' import cors from 'cors' import cookieParser from 'cookie-parser' import authRouter from './routes/auth.js' import organizationRouter from './routes/organization.js' import userRouter from './routes/user.js' import roleRouter from './routes/role.js' import permissionRouter from './routes/permission.js' import baseConfigRouter from './routes/baseConfig.js' import customerRouter from './routes/customer.js' import walletRouter from './routes/wallet.js' import personalOpenMobileRouter from './routes/personalOpenMobile.js' import faceRecognizeRouter from './routes/faceRecognize.js' import uploadFileRouter from './routes/uploadFile.js' import creditRouter from './routes/credit.js' import merchantRouter from './routes/merchant.js' import invoiceRouter from './routes/invoice.js' import paymentRouter from './routes/payment.js' import orderRouter from './routes/order.js' const app = express() // 允许携带 Cookie 跨域(前端 axios withCredentials: true 依赖此配置) app.use(cors({ origin: true, credentials: true })) app.use(cookieParser()) app.use(express.json({ limit: '10mb' })) // 个人开户移动端H5确认页(fryl_h5)专用的匿名接口(不经过任何 requireAuth 中间件),必须挂载在 // 所有以 app.use('/api', xxxRouter) 形式挂载、且内部用 router.use(requireAuth)(不带路径)拦截 // 鉴权的 router(customerRouter/walletRouter/userRouter/roleRouter/baseConfigRouter/...)**之前**: // 这种写法拦截的是"该 router 匹配到的任意路径"而不仅是它们自己定义的路由,只要挂载顺序在它们 // 之后,任何 /api/* 匿名请求都会先被拦截返回401(已实测复现,详见设计文档"mock-server 配套修复 // 与改造"章节)。挂载在带具体子路径前缀(如 /api/auth、/api/organization)的 router 之后是安全 // 的,因为 Express 只会在路径前缀匹配时才进入该 router。uploadFileRouter(2026-08-06 新增) // 同时被管理后台(已登录)与 fryl_h5(匿名)复用,原因与 faceRecognizeRouter 一致,同样必须放 // 在这个位置,不能挂到 customer.js。 app.use('/api', personalOpenMobileRouter) app.use('/api', faceRecognizeRouter) app.use('/api', uploadFileRouter) app.use('/api/auth', authRouter) app.use('/api/organization', organizationRouter) app.use('/api', userRouter) app.use('/api', roleRouter) app.use('/api/permission', permissionRouter) app.use('/api', baseConfigRouter) app.use('/api', customerRouter) app.use('/api', walletRouter) app.use('/api/credit-apply', creditRouter) app.use('/api/merchant', merchantRouter) app.use('/api', invoiceRouter) app.use('/api', paymentRouter) app.use('/api', orderRouter) app.use((req, res) => { res.status(404).json({ code: 404, message: `接口不存在: ${req.method} ${req.originalUrl}`, data: null }) }) // eslint-disable-next-line no-unused-vars app.use((err, req, res, next) => { console.error('[mock-server] 未捕获异常:', err) res.status(500).json({ code: 500, message: err?.message || '服务器内部错误', data: null }) }) const PORT = process.env.MOCK_PORT || 8888 app.listen(PORT, () => { console.log(`[mock-server] 已启动,监听端口 ${PORT}`) console.log('[mock-server] 测试账号: admin / Admin@123') })