优化新增耳机流程,优化界面

This commit is contained in:
eafonyang
2026-07-20 15:45:52 +08:00
parent d292c23dc0
commit d2a8ef2f2d
14 changed files with 844 additions and 356 deletions
+10 -1
View File
@@ -3,7 +3,7 @@ schema_version: 1
locale: zh-CN
branch: main
nodes_managed: true
exported_at: "2026-07-17T02:01:49Z"
exported_at: "2026-07-17T09:47:48Z"
modules:
"":
dir_name: Audio Dashboard 全栈项目根(前后端 + 部署编排)
@@ -13,3 +13,12 @@ modules:
children: []
depends_on: []
related_to: []
writings:
dir_name: Luxsin CMS 软著操作手册生成
title: Luxsin CMS 软著操作手册生成
scope:
- writings/
source_files: []
children: []
depends_on: []
related_to: []
@@ -8,32 +8,38 @@ source_files:
- backend/src/config/logger.js
- backend/src/app.js
- backend/src/routes/auth.js
- backend/src/config/database.js
- backend/src/config/redis.js
- backend/package.json
---
## 1. 使用的系统与框架
- 后端采用 **Winston v3** 作为统一日志框架,通过 `backend/src/config/logger.js` 集中创建并导出实例。
- 前端未引入独立日志库,调试依赖浏览器控制台,无结构化前端日志方案
## 1. 使用的框架与工具
- 日志框架:`winston ^3.14`
- 依赖声明位于 `backend/package.json`,通过 `require('winston')` 引入
- 前端未集成专用日志库,调试主要依赖浏览器控制台。
## 2. 核心文件与位置
- 日志配置与实例:`backend/src/config/logger.js`
- 应用入口挂载`backend/src/app.js``require('./config/logger')` 后在启动/错误路径调用
-路由模块按需 `require('../config/logger')` 使用(如 `routes/auth.js``routes/blacklist.js`
- 数据库 SQL 日志由 Sequelize 单独控制:`backend/src/config/database.js``logging: isDevelopment ? console.log : false`
- 日志持久化目录:`backend/logs/app.log`(由 Dockerfile 中的 `/app/logs` 映射到宿主机)
- 日志配置与实例导出`backend/src/config/logger.js`
- 应用入口统一引入`backend/src/app.js``const logger = require('./config/logger');`
- 各模块按需引入使用,典型示例:`backend/src/routes/auth.js``backend/src/config/redis.js`
- 默认日志文件路径:`backend/logs/app.log`(由 `logger.js` 自动创建目录并写入)。
## 3. 架构与约定
- **单例模式**:全局唯一 logger 实例,所有模块共享同一配置,避免重复初始化
- **输出目标**:同时写入 Console 与本地文件 `logs/app.log`,编码 UTF-8;未启用按天/大小轮转。
- **日志级别**:默认 `info`,业务代码中使用 `logger.info / warn / error` 三种级别,未见 `debug` 使用
- **格式规范**:时间戳 `YYYY-MM-DD HH:mm:ss` + 级别 + 消息体;额外字段以 JSON 字符串拼接在末尾(`...meta` 展开为 `JSON.stringify(meta)`),非结构化 JSON 行
- **环境变量**:日志级别未暴露为环境变量,硬编码为 `'info'`
- **Sequelize SQL 日志**:开发环境通过 `console.log` 输出,生产关闭,不进入 Winston
- **集中式初始化**:所有日志输出均通过 `src/config/logger.js` 暴露的单一 `logger` 实例,避免重复配置
- **输出目标transports)**:同时输出到控制台和文件两个 sink:
- Console transport:便于本地开发实时观察
- File transport:固定文件名 `logs/app.log`,编码 UTF-8
- **格式策略**`timestamp + level + message + JSON meta` 拼接的单行文本格式,时间格式为 `YYYY-MM-DD HH:mm:ss`;当存在额外元数据时以空格分隔追加 JSON 字符串
- **级别策略**:全局 `level: 'info'`,代码中仅使用 `info / warn / error` 三个级别,未见 `debug` 级别调用
- **结构化字段**:未采用 winston 的 structured log 对象传参方式,而是将业务上下文拼入 message 字符串(如 `Login failed for username=${trimmedUsername}`),meta 字段基本未使用。
- **数据库层日志**:Sequelize 在开发环境启用原生 `console.log` 打印 SQL,生产环境关闭(`logging: isDevelopment ? (msg) => console.log(msg) : false`),不走 Winston。
## 4. 开发者应遵循的规则
- 统一`../config/logger` 导入并使用,禁止直接 `console.log` 输出业务日志
- 关键事件使用对应级别:成功/常规信息用 `info`,可恢复异常或降级用 `warn`,不可恢复错误用 `error`
- 如需附加上下文,通过第三个参数对象传入(会被序列化为 JSON 拼接到消息后),例如 `logger.info('msg', { userId })`
- 不要在日志中记录敏感信息(密码、token、完整请求体等)。
- 当前未实现日志轮转,生产部署时应配合外部 logrotate 或容器日志收集策略。
- **统一引用**:始终`../config/logger` 或相对路径引用同一 logger 实例,不要自行 `createLogger`
- **级别选择**
- `info`:记录关键业务流程事件(登录成功、密码修改、服务启动等)
- `warn`:记录可恢复异常或预期外的分支(用户名不存在、资源未找到等)。
- `error`:记录异常堆栈信息或不可恢复错误。
- 不使用 `debug` 级别。
- **消息内容**:将关键上下文(用户名、ID、MAC 等)直接拼入 message 字符串;如需附带复杂对象,可通过第三个参数传入 meta,但当前代码风格倾向于纯文本。
- **敏感信息**:禁止在日志中输出密码、token、完整请求体等敏感数据(现有代码已避免输出 password_hash/token 值)。
- **文件轮转**:当前未配置 winston-daily-rotate-file 等轮转插件,长期运行需注意 `app.log` 体积增长,后续可在 transports 中补充轮转策略。