feat: v1.5 安全加固与体验优化

- 后端添加 express-rate-limit 限流(登录 10次/分钟,API 200次/分钟)
- H5 演示登录:自动获取 demo token,401 时自动重试
- 分类删除前查询关联记录数,提示用户影响范围
- 分类添加支持 8 色选择器,替代随机颜色
- 首页 overview card 改为日均+收入+笔数,避免重复显示支出
- 请求模块 401 处理优化:H5 自动刷新 token 并重试原请求
This commit is contained in:
2026-06-01 17:01:19 +08:00
parent 4737f160b7
commit 36baa9a2b5
10 changed files with 219 additions and 39 deletions

View File

@@ -14,6 +14,23 @@ export function signToken(userId: number): string {
return Buffer.from(`${payload}:${signature}`).toString('base64')
}
// H5 演示登录 — 创建/复用演示用户
router.post('/demo-login', async (_req: Request, res: Response) => {
try {
const demoOpenid = 'h5_demo_user'
const [result] = await pool.query(
'INSERT INTO users (openid, session_key) VALUES (?, ?) ON DUPLICATE KEY UPDATE session_key = ?, id = LAST_INSERT_ID(id)',
[demoOpenid, 'demo', 'demo']
)
const userId = (result as any).insertId
const token = signToken(userId)
res.json({ code: 0, data: { token, userId } })
} catch (err: any) {
console.error('[Auth] Demo login failed:', err.message)
res.status(500).json({ code: 50000, message: '服务器错误' })
}
})
router.post('/login', async (req: Request, res: Response) => {
try {
const { code } = req.body