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

@@ -1,6 +1,7 @@
import 'dotenv/config'
import express from 'express'
import cors from 'cors'
import rateLimit from 'express-rate-limit'
import { authMiddleware } from './middleware/auth'
import { initDatabase } from './db/init'
import pool from './db/connection'
@@ -32,13 +33,32 @@ app.use(cors({
credentials: true,
}))
app.use(express.json({ limit: '10kb' }))
// 限流:登录接口 — 每分钟最多 10 次
const authLimiter = rateLimit({
windowMs: 60 * 1000,
max: 10,
message: { code: 42900, message: '请求过于频繁,请稍后再试' },
standardHeaders: true,
legacyHeaders: false,
})
// 限流:通用 API — 每分钟最多 200 次
const apiLimiter = rateLimit({
windowMs: 60 * 1000,
max: 200,
message: { code: 42900, message: '请求过于频繁,请稍后再试' },
standardHeaders: true,
legacyHeaders: false,
})
app.use(authMiddleware)
app.use('/api/auth', authRoutes)
app.use('/api/transactions', transactionRoutes)
app.use('/api/stats', statsRoutes)
app.use('/api/budget', budgetRoutes)
app.use('/api/categories', categoryRoutes)
app.use('/api/auth', authLimiter, authRoutes)
app.use('/api/transactions', apiLimiter, transactionRoutes)
app.use('/api/stats', apiLimiter, statsRoutes)
app.use('/api/budget', apiLimiter, budgetRoutes)
app.use('/api/categories', apiLimiter, categoryRoutes)
app.get('/api/health', async (_req, res) => {
try {