From db31e7209d34a5fadd86c923da0e984a5d461bef Mon Sep 17 00:00:00 2001 From: kicer Date: Wed, 22 Jul 2026 17:13:35 +0800 Subject: [PATCH] backup codes --- docs/v2.md | 49 ++++++++++++++++++++++++++++++++++++++++++++++ server/handlers.js | 8 ++++---- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/docs/v2.md b/docs/v2.md index 8f7ceca..a3ac2be 100644 --- a/docs/v2.md +++ b/docs/v2.md @@ -146,3 +146,52 @@ | **P2** | 前端状态管理与文件拆分 | 改善开发体验和运行稳定性 | | **P3** | 安全增强(JWT、密码哈希、上传限制) | 系统公开使用后必须处理 | | **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` 对象) diff --git a/server/handlers.js b/server/handlers.js index 98a0488..f9219e6 100644 --- a/server/handlers.js +++ b/server/handlers.js @@ -1,8 +1,8 @@ // AI 结果处理 + 共享状态 const { v4: uuidv4 } = require('uuid'); -const db = require('../db'); -const { timestamp, normalizeTime } = require('../utils'); -const { broadcastToRoom } = require('../ws'); +const db = require('./db'); +const { timestamp, normalizeTime } = require('./utils'); +const { broadcastToRoom } = require('./ws'); // 对话历史(内存) const conversationHistory = new Map(); @@ -216,7 +216,7 @@ function handleAIResult(aiResult, roomId, username, originalText, attachments) { } async function callDeepSeekForSummary(prompt) { - const { callDeepSeek } = require('../ai/client'); + const { callDeepSeek } = require('./ai/client'); const messages = [ { role: 'system', content: '你是一个财务助手,请根据采购记录生成简洁回复。' }, { role: 'user', content: prompt }