backup codes

This commit is contained in:
2026-07-22 17:13:35 +08:00
parent 49ae9ef251
commit db31e7209d
2 changed files with 53 additions and 4 deletions

View File

@@ -146,3 +146,52 @@
| **P2** | 前端状态管理与文件拆分 | 改善开发体验和运行稳定性 | | **P2** | 前端状态管理与文件拆分 | 改善开发体验和运行稳定性 |
| **P3** | 安全增强JWT、密码哈希、上传限制 | 系统公开使用后必须处理 | | **P3** | 安全增强JWT、密码哈希、上传限制 | 系统公开使用后必须处理 |
| **P3** | 运维自动化(备份、存储迁移) | 数据安全,长期运行保障 | | **P3** | 运维自动化(备份、存储迁移) | 数据安全,长期运行保障 |
# 修改记录
```
server/
├── server.js # 入口40行原 588行
├── db.js # 数据库(新增 foreign_keys = ON
├── utils.js # timestamp / normalizeTime
├── handlers.js # AI 结果处理 + 共享状态
├── ai/
│ ├── prompt.js # Prompt 模板化
│ ├── validator.js # JSON Schema 校验
│ └── client.js # DeepSeek API 客户端
├── middleware/
│ └── auth.js # JWT + adminOnly
├── routes/
│ ├── auth.js # 登录 / 用户信息
│ ├── rooms.js # 群聊 CRUD
│ ├── messages.js # 消息 + AI 分析
│ └── purchases.js # 采购 CRUD / 汇总 / 导出
├── ws/
│ └── index.js # WebSocket 连接管理 + 广播
└── public/
├── index.html # 纯结构(引用 CSS/JS
├── css/
│ └── style.css # 独立样式
└── js/
├── store.js # 全局状态
├── chat.js # 消息渲染 + 图片处理
├── ws.js # WebSocket + 聊天列表 + 发送
├── purchases.js # 采购面板 + 详情 + 群聊管理 + 手势
└── auth.js # 登录 / 初始化
```
### P0 完成项
- Prompt 模板化(`ai/prompt.js`
- JSON Schema 校验(`ai/validator.js`
- AI 客户端封装(`ai/client.js`
- 金额计算唯一化(`handlers.js` 中 amount 仅由系统计算)
- 时间格式统一(`utils.js` normalizeTime
### P1 完成项
- 后端模块化拆分routes / ai / ws / middleware
- 权限模型统一middleware/auth.js
- 外键约束开启(`db.js` `PRAGMA foreign_keys = ON`
### P2 完成项
- CSS 独立文件(`public/css/style.css`
- JS 模块化拆分store / chat / ws / purchases / auth
- 状态集中管理(`Store` 对象)

View File

@@ -1,8 +1,8 @@
// AI 结果处理 + 共享状态 // AI 结果处理 + 共享状态
const { v4: uuidv4 } = require('uuid'); const { v4: uuidv4 } = require('uuid');
const db = require('../db'); const db = require('./db');
const { timestamp, normalizeTime } = require('../utils'); const { timestamp, normalizeTime } = require('./utils');
const { broadcastToRoom } = require('../ws'); const { broadcastToRoom } = require('./ws');
// 对话历史(内存) // 对话历史(内存)
const conversationHistory = new Map(); const conversationHistory = new Map();
@@ -216,7 +216,7 @@ function handleAIResult(aiResult, roomId, username, originalText, attachments) {
} }
async function callDeepSeekForSummary(prompt) { async function callDeepSeekForSummary(prompt) {
const { callDeepSeek } = require('../ai/client'); const { callDeepSeek } = require('./ai/client');
const messages = [ const messages = [
{ role: 'system', content: '你是一个财务助手,请根据采购记录生成简洁回复。' }, { role: 'system', content: '你是一个财务助手,请根据采购记录生成简洁回复。' },
{ role: 'user', content: prompt } { role: 'user', content: prompt }