.cursorrules 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474
  1. # 游铛铛项目开发规范 (.cursorrules)
  2. ## 项目概述
  3. - **项目名称**: 游铛铛全栈开发项目
  4. - **技术栈**: Vue.js 3 + FastAPI + MySQL + Redis
  5. - **项目目标**: BUFF选品和Steam扫货工具
  6. - **核心理念**: "以用户为中心,智慧取舍为先"
  7. ## 开发原则
  8. ### 1. 用户中心原则
  9. - 所有功能开发必须以用户需求为优先
  10. - 界面设计要简洁直观,降低学习成本
  11. - 性能优化要确保用户体验流畅
  12. ### 2. 质量优先原则
  13. - 代码必须经过严格的代码审查
  14. - 功能开发完成后必须进行充分测试
  15. - 安全漏洞检查必须通过所有扫描
  16. ### 3. 协作共赢原则
  17. - 团队成员要积极沟通,及时反馈问题
  18. - 跨部门协作要相互尊重,相互支持
  19. - 知识分享要及时,经验传承要完整
  20. ### 4. 持续改进原则
  21. - 定期回顾项目进展,总结经验教训
  22. - 技术选型要考虑长期维护成本
  23. - 流程优化要持续进行,提升效率
  24. ### 5. 配置管理原则
  25. - **客户端配置数据库化**: 所有客户端配置项必须存储在数据库中,不允许硬编码
  26. - **心跳实时同步**: 客户端通过心跳机制实时获取最新配置,无需重启应用
  27. - **动态配置生效**: 配置变更通过数据库修改,秒级生效,提升系统灵活性
  28. - **配置版本管理**: 重要配置变更要有历史记录和回滚机制
  29. ## 代码规范
  30. ### 前端开发规范 (Vue.js)
  31. #### 文件命名
  32. - 组件文件: PascalCase (e.g., `UserProfile.vue`)
  33. - 工具函数: camelCase (e.g., `formatPrice.js`)
  34. - 样式文件: kebab-case (e.g., `user-profile.scss`)
  35. - 测试文件: 与源文件同名 + `.spec.js`
  36. #### 组件结构
  37. ```vue
  38. <template>
  39. <!-- 模板内容 -->
  40. </template>
  41. <script setup>
  42. // 组合式 API
  43. // 导入语句
  44. // 响应式数据
  45. // 计算属性
  46. // 方法
  47. // 生命周期钩子
  48. </script>
  49. <style scoped>
  50. /* 样式内容 */
  51. </style>
  52. ```
  53. #### 代码风格
  54. - 使用 ESLint + Prettier 进行代码检查
  55. - 使用 TypeScript 进行类型检查
  56. - 组件名必须有意义,避免缩写
  57. - 变量名使用 camelCase,常量使用 UPPER_SNAKE_CASE
  58. #### 状态管理
  59. - 小型组件使用 props + emit
  60. - 复杂状态使用 Pinia 进行管理
  61. - 异步操作使用 async/await 语法
  62. #### 配置管理
  63. - **禁止硬编码配置**: 所有客户端配置必须从数据库获取,不允许在代码中写死
  64. - **心跳同步机制**: 通过心跳API实时同步最新配置,支持热更新
  65. - **配置初始化**: 应用启动时通过专用API获取初始配置
  66. - **配置缓存**: 本地缓存配置数据,提升用户体验,但以服务器配置为准
  67. ### 后端开发规范 (FastAPI)
  68. #### 项目结构
  69. ```
  70. backend/
  71. ├── app/
  72. │ ├── api/ # API路由
  73. │ ├── core/ # 核心配置
  74. │ ├── models/ # 数据模型
  75. │ ├── schemas/ # 数据验证
  76. │ ├── services/ # 业务逻辑
  77. │ ├── utils/ # 工具函数
  78. │ └── middleware/ # 中间件
  79. ├── tests/ # 测试文件
  80. ├── requirements.txt # 依赖管理
  81. └── main.py # 应用入口
  82. ```
  83. #### API设计规范
  84. - RESTful API 设计原则
  85. - 统一响应格式
  86. - 错误处理规范化
  87. - API 版本控制
  88. - **路由前缀规范**:
  89. - **管理端接口**: 所有管理端接口必须以 `/admin/` 开头
  90. - **客户端接口**: 所有客户端接口必须以 `/api/` 开头
  91. - **接口隔离**: 管理端和客户端接口严格分离,不得相互复用
  92. - **配置同步机制**: 心跳API必须包含客户端配置同步功能
  93. - **实时配置更新**: 支持通过API实时推送配置变更
  94. #### 统一用户友好错误提示规范
  95. 为保证对用户的友好性与统一体验,所有接口必须遵循以下错误提示规范:
  96. - **目标**:对外返回简洁、明确、可执行的用户提示信息;在后台记录完整异常堆栈以便排查,不将内部实现细节暴露给用户。
  97. - **HTTP 状态码使用**:
  98. - 200/201:正常响应
  99. - 400:请求参数/请求格式错误(提示:`请求参数错误,请检查后重试`或更具体的信息)
  100. - 401:认证失败(提示:`用户名或密码错误` 或 `会话验证失败`)
  101. - 403:权限/业务拒绝(提示:`卡密已过期`、`账号已被禁用`、`机器码不匹配` 等明确业务信息)
  102. - 404:资源不存在(提示:`资源未找到`)
  103. - 5xx:服务端异常(对用户提示友好通用信息,例:`系统异常,请稍后重试;若持续发生请联系客服`)
  104. - **返回结构**:使用统一响应函数(如 `create_client_response`)返回结构化 JSON:
  105. - 必须包含:`code`(业务码),`msg`(面向用户的提示),`data`(可选)
  106. - 业务码建议与 HTTP 状态码语义一致或在文档中明确映射关系。
  107. - **业务错误示例与建议提示**(必须可被前端直接展示):
  108. - 用户名或密码错误:`用户名或密码错误,请检查后重试。`
  109. - 卡密已过期:`您的卡密已到期,请前往续费或联系客户支持。`
  110. - 机器码不匹配:`该账号已绑定其他设备。如需切换设备请先解绑或联系客服。`
  111. - 账号被禁用:`账号已被禁用,请联系管理员或客服。`
  112. - 会话已过期:`会话已过期,请重新登录。`
  113. - 系统/服务器异常(500):`系统异常,操作未完成,请稍后重试;若持续发生请联系客服。`
  114. - **实现与日志规范**:
  115. - 在捕获未知异常时务必调用 `db.rollback()`(如涉及数据库事务),并使用 `logger.exception(...)` 记录完整堆栈(便于排查)。
  116. - 对外返回信息不得包含异常堆栈、数据库错误或内部路径等敏感信息。
  117. - 对于可预期的业务错误(如卡密过期、机器码不匹配等)应在业务逻辑中明确判断并返回对应的业务提示,而非抛出未捕获异常。
  118. - **前端映射建议**:
  119. - 前端应根据 `code` 或 HTTP 状态码映射到具体的用户提示并提供可执行操作(例如“去登录”、“续费”、“联系客服”)。
  120. - 对 5xx 错误展示统一友好页或弹窗,并附带可复制的错误时间/账号信息以便用户反馈给客服。
  121. - **代码审查与验收规则**:
  122. - 所有 Pull Request 必须检查新/改接口是否遵循此错误提示规范。
  123. - 自动化测试需覆盖常见错误场景(认证失败、过期、权限拒绝、参数错误、服务异常)。
  124. - 若接口返回 5xx,在合并前需确认日志中能定位到完整异常堆栈。
  125. 该规范自提交之日起生效,后续所有接口开发、修改和审查必须参考执行,确保用户始终获得清晰、可执行的错误提示。
  126. #### 数据库规范
  127. - 使用 SQLAlchemy ORM
  128. - 表名使用复数形式
  129. - 字段命名使用 snake_case
  130. - 必须添加合适的索引
  131. - **配置表设计**: 使用纵表设计存储系统配置,支持动态配置管理
  132. - **配置类型支持**: 支持int/string/bool/json等多种配置值类型
  133. #### 安全规范
  134. - 密码使用 bcrypt 加密
  135. - JWT Token 认证
  136. - 输入验证和清理
  137. - SQL注入防护
  138. ## 项目管理规范
  139. ### 开发流程
  140. 1. **需求分析** - 深入理解用户需求
  141. 2. **设计评审** - 确认技术方案和UI设计,包括配置项设计
  142. 3. **开发实现** - 分阶段完成功能开发,所有配置项存储在数据库中
  143. 4. **配置管理** - 建立配置项管理机制,确保可动态调整
  144. 5. **测试验证** - 全面测试确保质量,包括配置变更的测试
  145. 6. **部署上线** - 安全稳定地发布产品,支持运行时配置更新
  146. ## 📚 项目文档管理系统
  147. ### 核心理念
  148. **"文档是项目发展的基石,有序的文档管理是高效协作的保障"**
  149. ### 基本原则
  150. - **文档即代码**: 文档版本与代码版本同步管理
  151. - **分类清晰**: 按职能、类型、阶段进行多维度分类
  152. - **查找便捷**: 让团队成员能在30秒内找到所需文档
  153. - **版本可追溯**: 支持历史版本查询和问题定位
  154. - **协作规范**: 明确文档的创建、维护、审核流程
  155. ---
  156. ### 📁 文档组织架构
  157. #### 顶级目录结构
  158. ```bash
  159. 项目文档归档/ # 项目根文档目录
  160. ├── 📋 README.md # 项目文档导航页
  161. ├── 🔍 文档索引/ # 文档检索和索引
  162. │ ├── 文档目录.md # 完整文档目录树
  163. │ ├── 搜索指南.md # 文档查找指南
  164. │ └── 更新日志.md # 文档更新历史
  165. ├── 👥 数字员工文档/ # 按职能分类的核心文档
  166. │ ├── 📊 项目经理数字员工/ # 项目管理文档
  167. │ ├── 🎯 需求数字员工/ # 需求分析文档
  168. │ ├── 🎨 设计数字员工/ # UI/UX设计文档
  169. │ ├── 🔧 技术数字员工/ # 技术实现文档
  170. │ └── 🧪 部署测试数字员工/ # 测试和部署文档
  171. ├── 📝 会议记录/ # 项目会议纪要
  172. ├── 🔬 技术方案文档/ # 技术方案评估和决策
  173. ├── 📊 项目报告/ # 项目进度和成果报告
  174. ├── ⚙️ 项目管理文档/ # 项目管理规范和流程
  175. └── 🗂️ 归档文档/ # 历史版本归档
  176. ├── v1.0/ # 按版本号归档
  177. ├── v2.0/
  178. └── legacy/ # 废弃文档
  179. ```
  180. #### 职能目录详细结构
  181. ##### 🔧 技术数字员工目录
  182. ```bash
  183. 技术数字员工/
  184. ├── 📊 数据库设计/ # 数据库相关
  185. │ ├── buff.sql # 最新数据库结构
  186. │ ├── migrations/ # 数据库迁移脚本
  187. │ └── design/ # 设计说明文档
  188. ├── 🔌 API文档/ # 接口相关
  189. │ ├── backend-api-v1.0.md # 后端API文档
  190. │ ├── client-api.md # 客户端API
  191. │ └── websocket/ # WebSocket接口
  192. ├── 🏗️ 架构设计/ # 系统架构
  193. │ ├── system-architecture.md # 系统架构图
  194. │ ├── deployment-architecture.md # 部署架构
  195. │ └── security-architecture.md # 安全架构
  196. ├── 📦 部署指南/ # 部署相关
  197. │ ├── update-deployment-guide.md # 更新部署
  198. │ ├── version-management-guide.md # 版本管理
  199. │ └── ci-cd-pipeline.md # CI/CD流程
  200. └── 💡 技术方案/ # 技术决策
  201. ├── technology-stack.md # 技术栈选择
  202. ├── framework-analysis.md # 框架分析
  203. └── performance-optimization.md # 性能优化
  204. ```
  205. ##### 🎯 需求数字员工目录
  206. ```bash
  207. 需求数字员工/
  208. ├── 📋 需求规格说明书/ # BRD/PRD
  209. ├── 🔍 需求分析报告/ # 需求分析
  210. ├── ✅ 验收标准/ # 验收条件
  211. └── 📈 需求变更记录/ # 变更历史
  212. ```
  213. ##### 🎨 设计数字员工目录
  214. ```bash
  215. 设计数字员工/
  216. ├── 🎭 UI设计/ # 界面设计
  217. ├── 🔄 交互设计/ # 用户流程
  218. ├── 📱 原型图/ # 原型设计
  219. └── 🎨 设计规范/ # 设计规范
  220. ```
  221. ---
  222. ### 🏷️ 文档命名和版本规范
  223. #### 文档命名规范
  224. ```bash
  225. # 格式: [日期]-[模块名]-[功能名]-[文档类型]-v[版本].md
  226. # 示例:
  227. 20240101-user-authentication-api-v1.0.md # API文档
  228. 20240101-client-update-deployment-guide-v2.0.md # 部署指南
  229. 20240101-database-migration-script-v1.1.sql # 数据库脚本
  230. 20240101-system-architecture-design-v3.0.md # 架构设计
  231. ```
  232. #### 版本号规则
  233. - **主版本**: 重大功能变更或架构调整 (x.0.0)
  234. - **次版本**: 新功能添加 (x.y.0)
  235. - **补丁版本**: bug修复和优化 (x.y.z)
  236. - **预发布**: alpha/beta/rc后缀
  237. #### 文档状态标识
  238. ```markdown
  239. <!-- 文档头部必须包含状态信息 -->
  240. ---
  241. 标题: 用户认证API文档
  242. 版本: v1.0.1
  243. 状态: ✅ 正式发布 (草稿/审核中/正式发布/已归档)
  244. 最后更新: 2024-01-01
  245. 更新人: 技术数字员工
  246. 审核人: 项目经理数字员工
  247. ---
  248. <!-- 变更历史 -->
  249. ## 📝 变更历史
  250. - **v1.0.1** (2024-01-01): 修复登录接口文档错误
  251. - **v1.0.0** (2023-12-15): 初始版本发布
  252. ```
  253. ---
  254. ### 🔍 文档检索和导航系统
  255. #### 快速查找指南
  256. ```bash
  257. # 1. 通过README导航
  258. 项目文档归档/README.md # 文档导航主页
  259. # 2. 通过索引查找
  260. 项目文档归档/文档索引/文档目录.md # 完整目录树
  261. 项目文档归档/文档索引/搜索指南.md # 搜索指南
  262. # 3. 按职能查找
  263. 技术实现 → 数字员工文档/技术数字员工/
  264. 需求分析 → 数字员工文档/需求数字员工/
  265. 设计文档 → 数字员工文档/设计数字员工/
  266. # 4. 按类型查找
  267. API文档 → 技术数字员工/API文档/
  268. 数据库 → 技术数字员工/数据库设计/
  269. 部署指南 → 技术数字员工/部署指南/
  270. ```
  271. #### 文档导航主页 (README.md)
  272. ```markdown
  273. # 📚 游铛铛项目文档中心
  274. ## 🚀 快速开始
  275. - [新人入职指南](./项目管理文档/新人入职指南.md)
  276. - [开发环境搭建](./技术数字员工/部署指南/开发环境搭建.md)
  277. - [项目架构概览](./技术数字员工/架构设计/system-architecture.md)
  278. ## 📖 核心文档
  279. ### 开发相关
  280. - [API文档](./技术数字员工/API文档/backend-api-v1.0.md)
  281. - [数据库设计](./技术数字员工/数据库设计/buff.sql)
  282. - [部署指南](./技术数字员工/部署指南/)
  283. ### 管理相关
  284. - [项目计划](./项目经理数字员工/项目计划.md)
  285. - [需求规格](./需求数字员工/需求规格说明书.md)
  286. - [设计规范](./设计数字员工/设计规范/)
  287. ## 🔍 文档搜索
  288. - [文档目录](./文档索引/文档目录.md)
  289. - [搜索指南](./文档索引/搜索指南.md)
  290. - [更新日志](./文档索引/更新日志.md)
  291. ## 📞 联系方式
  292. - 项目经理: @项目经理数字员工
  293. - 技术负责人: @技术数字员工
  294. - 需求负责人: @需求数字员工
  295. ```
  296. ---
  297. ### 🔄 文档生命周期管理
  298. #### 文档创建流程
  299. ```mermaid
  300. graph TD
  301. A[需求提出] --> B[文档规划]
  302. B --> C[文档编写]
  303. C --> D[内部审核]
  304. D --> E[技术审核]
  305. E --> F[正式发布]
  306. F --> G[文档归档]
  307. ```
  308. #### 文档维护流程
  309. ```mermaid
  310. graph TD
  311. A[发现问题/需求变更] --> B[评估影响范围]
  312. B --> C[制定更新计划]
  313. C --> D[文档更新]
  314. D --> E[版本标记]
  315. E --> F[审核发布]
  316. F --> G[通知相关人员]
  317. G --> H[更新索引]
  318. ```
  319. #### 文档版本管理
  320. ```bash
  321. # 文档版本与代码版本同步
  322. ├── v1.0/ # 对应代码v1.0版本
  323. │ ├── api-docs-v1.0.md # API文档v1.0
  324. │ ├── database-v1.0.sql # 数据库v1.0
  325. │ └── architecture-v1.0.md # 架构文档v1.0
  326. ├── v1.1/ # 对应代码v1.1版本
  327. └── v2.0/ # 对应代码v2.0版本
  328. ```
  329. ---
  330. ### 📊 文档质量控制
  331. #### 文档质量标准
  332. - **完整性**: 包含所有必要信息,无缺失
  333. - **准确性**: 技术细节准确,数据可靠
  334. - **及时性**: 文档与代码同步更新
  335. - **可读性**: 结构清晰,语言简洁
  336. - **可维护性**: 易于更新和修改
  337. #### 文档审查清单
  338. ```markdown
  339. ## 📋 技术文档审查清单
  340. - [ ] 文档结构完整(标题、目录、参考资料)
  341. - [ ] 技术内容准确(代码示例可运行,数据正确)
  342. - [ ] 格式规范统一(命名、排版、链接)
  343. - [ ] 版本信息完整(版本号、更新时间、责任人)
  344. - [ ] 关联文档链接正确
  345. - [ ] 敏感信息已脱敏
  346. - [ ] 文档可独立理解(不依赖外部知识)
  347. ```
  348. #### 文档更新频率要求
  349. - **架构文档**: 重大变更时更新
  350. - **API文档**: 每次接口变更时更新
  351. - **部署文档**: 部署流程变更时更新
  352. - **用户手册**: 新功能发布时更新
  353. - **故障排查**: 发现新问题时更新
  354. ---
  355. ### 🤝 文档协作规范
  356. #### 文档编写规范
  357. ```markdown
  358. # 1. 文档头部信息(必需)
  359. ---
  360. 标题: [文档标题]
  361. 版本: v1.0.0
  362. 状态: ✅ 正式发布
  363. 最后更新: 2024-01-01
  364. 编写人: [责任人]
  365. 审核人: [审核人]
  366. 标签: [技术栈,功能模块]
  367. ---
  368. # 2. 文档结构(推荐)
  369. ## 概述
  370. ## 背景
  371. ## 详细设计
  372. ## 实现方案
  373. ## 测试验证
  374. ## 参考资料
  375. # 3. 代码示例规范
  376. ```bash
  377. # 好的示例
  378. npm run build
  379. # 带说明的示例
  380. # 构建生产版本
  381. npm run build -- --mode production
  382. ```
  383. # 4. 链接规范
  384. - 内部链接: [API文档](../API文档/backend-api.md)
  385. - 外部链接: [Vue.js官网](https://vuejs.org/)
  386. - 锚点链接: [数据库设计](#数据库设计)
  387. ```
  388. #### 文档协作流程
  389. 1. **创建**: 在对应目录创建新文档,按命名规范命名
  390. 2. **编写**: 使用标准Markdown格式,包含必要元信息
  391. 3. **自查**: 使用审查清单进行自查
  392. 4. **提交**: 提交到Git,按规范填写commit信息
  393. 5. **审核**: 相关人员审核,技术文档由技术负责人审核
  394. 6. **发布**: 审核通过后正式发布,更新文档索引
  395. 7. **通知**: 在团队群通知文档更新
  396. #### Git提交规范
  397. ```bash
  398. # 文档提交格式
  399. docs: add user authentication api docs v1.0
  400. docs: update deployment guide for v2.1 release
  401. docs: fix api documentation errors
  402. docs: archive outdated design documents
  403. ```
  404. ---
  405. ### 📈 文档管理监控
  406. #### 文档健康度指标
  407. - **文档覆盖率**: 功能点文档覆盖百分比
  408. - **文档时效性**: 文档更新频率和时效性
  409. - **文档质量**: 通过审查清单的得分
  410. - **文档使用率**: 文档访问和引用频率
  411. #### 定期审查机制
  412. - **周审查**: 检查新增文档质量
  413. - **月审查**: 评估文档组织结构
  414. - **季审查**: 优化文档管理系统
  415. - **年审查**: 全面梳理和归档
  416. #### 文档维护工具
  417. ```bash
  418. # 文档质量检查脚本
  419. ./scripts/check-docs-quality.sh
  420. # 文档链接检查脚本
  421. ./scripts/check-docs-links.sh
  422. # 文档更新提醒脚本
  423. ./scripts/remind-doc-updates.sh
  424. ```
  425. ---
  426. ### 🎯 文档查找效率目标
  427. #### 响应时间目标
  428. - **紧急问题**: 30秒内找到相关文档
  429. - **一般问题**: 2分钟内定位解决方案
  430. - **学习需求**: 10分钟内掌握相关知识
  431. #### 文档组织原则
  432. 1. **预判需求**: 根据常见问题组织文档结构
  433. 2. **关联引导**: 相关文档间建立清晰的关联
  434. 3. **搜索友好**: 使用标准命名和标签系统
  435. 4. **版本清晰**: 明确标识文档版本和状态
  436. ---
  437. ### 🚨 文档安全管理
  438. #### 访问权限控制
  439. - **公开文档**: 项目基本信息,对外公开
  440. - **内部文档**: 技术实现细节,仅团队内部
  441. - **敏感文档**: 商业机密、用户数据,限制访问
  442. #### 文档加密保护
  443. ```bash
  444. # 敏感文档加密存储
  445. ansible-vault encrypt sensitive-docs/
  446. # 访问时需要密码解密
  447. ansible-vault decrypt sensitive-docs/
  448. ```
  449. #### 文档水印和追踪
  450. - 内部文档添加水印标识
  451. - 记录文档访问日志
  452. - 防止敏感信息泄露
  453. ---
  454. **文档管理系统是项目成功的关键保障。通过完善的组织架构、严格的质量控制和高效的检索系统,我们确保团队能够快速找到所需信息,提高协作效率,为项目的长期发展奠定坚实基础。** 📚✨
  455. ### 版本控制
  456. - 使用 Git 进行版本控制
  457. - 分支策略: main(主分支), develop(开发分支), feature/*(功能分支)
  458. - 提交信息要清晰明了
  459. - 代码审查后才能合并到主分支
  460. ## 质量保障
  461. ### 测试要求
  462. - 单元测试覆盖率 > 80%
  463. - API 接口要有集成测试
  464. - 用户界面要有端到端测试
  465. - 性能测试要达到预期指标
  466. ### 代码审查
  467. - 所有代码都要经过同行审查
  468. - 审查重点: 功能正确性、代码质量、安全性
  469. - 审查意见要及时处理和反馈
  470. - 重大问题必须修复后才能通过
  471. ### 安全检查
  472. - 使用安全扫描工具检查代码
  473. - 定期更新依赖包版本
  474. - 数据库查询要防止SQL注入
  475. - 用户输入要进行严格验证
  476. ## 性能优化
  477. ### 前端性能
  478. - 组件懒加载
  479. - 图片优化和压缩
  480. - 打包体积控制
  481. - 缓存策略优化
  482. ### 后端性能
  483. - 数据库查询优化
  484. - 缓存使用 (Redis)
  485. - 异步处理
  486. - 负载均衡
  487. ### 系统性能
  488. - 响应时间 < 300ms
  489. - 并发处理 > 800 req/s
  490. - 系统可用性 > 99.5%
  491. - 资源使用率合理
  492. ## 部署规范
  493. ### 环境管理
  494. - 开发环境: 用于日常开发
  495. - 测试环境: 用于功能测试
  496. - 生产环境: 用于正式上线
  497. ### 容器化部署
  498. - 使用 Docker 进行容器化
  499. - Kubernetes 进行编排管理
  500. - CI/CD 流水线自动化部署
  501. ### 监控告警
  502. - 应用性能监控
  503. - 错误日志收集
  504. - 资源使用监控
  505. - 及时告警处理
  506. ## 团队协作
  507. ### 沟通规范
  508. - 每日站会: 15分钟进度同步
  509. - 问题及时上报,不拖延
  510. - 技术方案讨论要充分
  511. - 跨部门协作要相互尊重
  512. ### 知识分享
  513. - 新技术学习成果分享
  514. - 项目经验教训总结
  515. - 最佳实践文档化
  516. - 培训资料定期更新
  517. ### 责任分工
  518. - 各司其职,各负其责
  519. - 主动承担超出职责范围的工作
  520. - 团队利益高于个人利益
  521. - 相互支持,共同进步
  522. ## 工具使用规范
  523. ### 开发工具
  524. - IDE: 统一使用 VS Code
  525. - 版本控制: Git + GitHub
  526. - 项目管理: 内部协作平台
  527. - 文档管理: Markdown + 项目文档归档
  528. ### 代码质量工具
  529. - ESLint: JavaScript/TypeScript 代码检查
  530. - Black: Python 代码格式化
  531. - Pre-commit: 提交前检查
  532. - SonarQube: 代码质量分析
  533. ## 异常处理
  534. ### 问题等级
  535. - P0 (紧急): 影响系统正常运行
  536. - P1 (重要): 影响用户使用体验
  537. - P2 (一般): 不影响核心功能
  538. - P3 (低优): 优化和改进建议
  539. ### 处理流程
  540. 1. 问题发现和记录
  541. 2. 问题分析和定位
  542. 3. 解决方案制定
  543. 4. 解决方案实施
  544. 5. 验证和回归测试
  545. ## 持续改进
  546. ### 回顾机制
  547. - 每周项目进度回顾
  548. - 每月技术方案评估
  549. - 每季度项目目标复盘
  550. - 每年技术栈升级规划
  551. ### 度量指标
  552. - 代码质量指标
  553. - 项目进度指标
  554. - 用户满意度指标
  555. - 团队效率指标
  556. ### 优化方向
  557. - 开发流程优化
  558. - 技术选型优化
  559. - 团队协作优化
  560. - 用户体验优化
  561. ---
  562. ---
  563. ## 🔐 安全通信规范 (Security Communication Standard)
  564. ### 概述
  565. 为保证客户端与服务端通信的安全性,所有敏感数据的传输必须使用AES+RSA混合加密方案。本规范以公告获取接口为例,定义了完整的加密通信流程,作为项目标准通信模式。
  566. ### 🎯 核心安全特性
  567. - **AES加密传输**:数据使用AES-256-CBC加密
  568. - **RSA密钥交换**:AES密钥通过RSA公钥加密传输
  569. - **时间戳验证**:防止重放攻击(±5分钟容忍范围)
  570. - **HMAC签名**:保证数据完整性
  571. - **Nonce验证**:确保请求唯一性
  572. ---
  573. ### 📋 前端安全通信写法 (Frontend Security Communication)
  574. #### 1. 公钥状态检查
  575. ```typescript
  576. // 检查本地是否有RSA公钥
  577. const hasStoredKey = PublicKeyManager.hasStoredKey()
  578. if (!hasStoredKey) {
  579. // 显示"系统初始化中"提示
  580. showLoginStatus('系统初始化中,请稍等几分钟...', 'info', 0)
  581. return
  582. }
  583. ```
  584. #### 2. 调用安全的Tauri命令
  585. ```typescript
  586. // 🔐 安全优势:所有敏感操作都在Rust原生代码中完成
  587. // 前端只负责UI和简单的数据传递,加密解密在安全的原生环境中进行
  588. const requestData = {
  589. page: 1,
  590. page_size: 10,
  591. keyword: null
  592. }
  593. const result = await invoke<any>('secure_get_announcements', requestData)
  594. // 直接获取解密后的数据
  595. console.log('公告数据:', result.data)
  596. ```
  597. #### 3. 安全架构优势
  598. ```typescript
  599. // ❌ 旧架构:前端直接处理加密(不安全)
  600. const encryptedData = await CryptoUtils.aesEncrypt(data, key, iv) // 前端代码可被逆向
  601. // ✅ 新架构:Rust后端处理所有加密
  602. const result = await invoke('secure_api_call', params) // 原生代码不可逆向
  603. ```
  604. ---
  605. ### 🔧 后端安全API写法 (Backend Security API)
  606. #### 1. Rust安全API实现
  607. ```rust
  608. #[derive(serde::Serialize, serde::Deserialize)]
  609. pub struct AnnouncementRequest {
  610. pub page: i32,
  611. pub page_size: i32,
  612. pub keyword: Option<String>,
  613. }
  614. #[derive(serde::Serialize, serde::Deserialize)]
  615. pub struct AnnouncementResponse {
  616. pub data: Vec<serde_json::Value>,
  617. pub total: i32,
  618. pub page: i32,
  619. pub page_size: i32,
  620. }
  621. #[tauri::command]
  622. pub async fn secure_get_announcements(request: AnnouncementRequest) -> Result<AnnouncementResponse, String> {
  623. use base64::{Engine as _, engine::general_purpose};
  624. use serde_json;
  625. use reqwest::Client;
  626. use std::time::{SystemTime, UNIX_EPOCH};
  627. // 🔐 所有敏感操作都在Rust原生代码中完成:
  628. // 1. 获取RSA公钥(从安全存储)
  629. let public_key_pem = get_stored_public_key()?; // 从安全存储获取
  630. // 2. 生成随机AES密钥
  631. let aes_key = (0..32).map(|_| rand::random::<u8>()).collect::<Vec<u8>>();
  632. // 3. AES加密请求参数
  633. let request_data = serde_json::json!({
  634. "page": request.page,
  635. "page_size": request.page_size,
  636. "keyword": request.keyword
  637. });
  638. let request_json = request_data.to_string();
  639. let encrypted_params = aes_encrypt(&request_json.as_bytes(), &aes_key)?;
  640. let encrypted_params_base64 = general_purpose::STANDARD.encode(&encrypted_params);
  641. // 4. RSA加密AES密钥
  642. let encrypted_aes_key = rsa_encrypt_aes_key(&aes_key, &public_key_pem)?;
  643. let encrypted_aes_key_base64 = general_purpose::STANDARD.encode(&encrypted_aes_key);
  644. // 5. 生成时间戳和nonce
  645. let timestamp = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs() as i64;
  646. let nonce: String = (0..32).map(|_| format!("{:02x}", rand::random::<u8>())).collect();
  647. // 6. 生成签名
  648. let signature_data = format!("{}:{}:{}:{}:{}", timestamp, nonce, encrypted_params_base64, encrypted_aes_key_base64, 1);
  649. let signature = generate_hmac_signature(&signature_data)?;
  650. // 7. 发送HTTP请求到后端API
  651. let client = Client::new();
  652. let api_url = get_api_base_url() + "/api/announcement";
  653. let request_body = serde_json::json!({
  654. "encrypted_params": encrypted_params_base64,
  655. "aes_key": encrypted_aes_key_base64,
  656. "key_version": 1,
  657. "timestamp": timestamp,
  658. "nonce": nonce,
  659. "signature": signature
  660. });
  661. let response = client.post(&api_url).json(&request_body).send().await?;
  662. let response_json: serde_json::Value = response.json().await?;
  663. // 8. 解密响应数据
  664. if let Some(encrypted_data) = response_json.get("encrypted_data").and_then(|d| d.as_str()) {
  665. let encrypted_bytes = general_purpose::STANDARD.decode(encrypted_data)?;
  666. let decrypted_data = aes_decrypt(&encrypted_bytes, &aes_key)?;
  667. let response_data: serde_json::Value = serde_json::from_slice(&decrypted_data)?;
  668. // 提取公告数据
  669. let data = response_data.get("data").unwrap_or(&serde_json::json!([]));
  670. let total = response_data.get("total").unwrap_or(&serde_json::json!(0));
  671. let page = response_data.get("page").unwrap_or(&serde_json::json!(1));
  672. let page_size = response_data.get("page_size").unwrap_or(&serde_json::json!(10));
  673. Ok(AnnouncementResponse {
  674. data: serde_json::from_value(data.clone())?,
  675. total: total.as_i64().unwrap_or(0) as i32,
  676. page: page.as_i64().unwrap_or(1) as i32,
  677. page_size: page_size.as_i64().unwrap_or(10) as i32,
  678. })
  679. } else {
  680. Err("No encrypted_data in response".to_string())
  681. }
  682. }
  683. ```
  684. #### 2. 安全架构优势对比
  685. | 方面 | Rust后端处理 | 前端直接处理 |
  686. |------|-------------|-------------|
  687. | **代码安全性** | ✅ 原生编译,无法逆向 | ❌ JavaScript可被分析 |
  688. | **密钥管理** | ✅ 内存中生成和使用 | ❌ 可能在调试器中暴露 |
  689. | **算法隐藏** | ✅ 二进制级别隐藏 | ❌ 源码级别暴露 |
  690. | **反调试** | ✅ 原生代码保护 | ❌ 可被浏览器调试 |
  691. | **性能** | ✅ 原生加密性能 | ⚠️ JavaScript性能 |
  692. | **维护性** | ✅ 集中管理 | ❌ 分散在各组件 |
  693. ```rust
  694. // ✅ 安全:加密逻辑在原生Rust代码中
  695. // - AES加密/解密不在前端暴露
  696. // - RSA密钥处理在原生环境
  697. // - 签名生成不在前端代码中
  698. // - 攻击者无法通过前端逆向分析
  699. // ❌ 不安全:前端直接处理加密(之前的做法)
  700. // const encrypted = await CryptoUtils.aesEncrypt(data, key, iv)
  701. // 所有加密算法都暴露在前端JavaScript中
  702. ```
  703. ### 用户认证接口安全调用
  704. #### 1. 安全登录
  705. ```typescript
  706. // 检查公钥状态
  707. const hasStoredKey = PublicKeyManager.hasStoredKey()
  708. if (!hasStoredKey) {
  709. showLoginStatus('系统初始化中,请稍等几分钟...', 'info', 0)
  710. return
  711. }
  712. // 调用安全登录
  713. const requestData = {
  714. username: loginForm.username,
  715. password: loginForm.password,
  716. machine_code: machineCode.value
  717. }
  718. const userInfo = await invoke<any>('secure_user_login', requestData)
  719. // 返回解密后的用户信息
  720. ```
  721. #### 2. 安全注册
  722. ```typescript
  723. const requestData = {
  724. username: registerForm.username,
  725. password: registerForm.password,
  726. email: registerForm.email,
  727. card_code: registerForm.cardCode
  728. }
  729. const registerResult = await invoke<any>('secure_user_register', requestData)
  730. // 返回注册结果
  731. ```
  732. #### 3. 安全解绑
  733. ```typescript
  734. const requestData = {
  735. username: unbindForm.username,
  736. password: unbindForm.password
  737. }
  738. const unbindResult = await invoke<any>('secure_user_unbind', requestData)
  739. // 返回解绑结果
  740. ```
  741. #### 4. 安全充值
  742. ```typescript
  743. const requestData = {
  744. username: rechargeForm.username,
  745. password: rechargeForm.password,
  746. card_code: rechargeForm.cardCode
  747. }
  748. const rechargeResult = await invoke<any>('secure_user_recharge', requestData)
  749. // 返回充值结果
  750. ```
  751. ### 📋 完整安全通信模式开发规范
  752. #### 🔐 安全通信模式概述
  753. 游铛铛项目采用 **AES+RSA混合加密** 的企业级安全通信方案,确保所有敏感数据传输的安全性:
  754. 1. **前端Vue组件**:负责UI交互和参数收集,只传递必要数据
  755. 2. **Rust后端命令**:负责所有加密解密操作,算法不暴露给前端
  756. 3. **RSA公钥存储**:RSA公钥采用分段混淆存储在Rust后端内存中,不暴露给前端
  757. 4. **传输安全**:AES-256加密数据,RSA-2048加密AES密钥
  758. 5. **完整性验证**:HMAC-SHA256签名 + 时间戳 + Nonce验证
  759. ---
  760. #### 🛠️ Rust安全命令实现模板
  761. ##### 数据结构定义
  762. ```rust
  763. // 请求数据结构
  764. #[derive(serde::Serialize, serde::Deserialize)]
  765. pub struct SecureRequest {
  766. pub field1: String,
  767. pub field2: i32,
  768. // ... 业务字段
  769. }
  770. // 响应数据结构
  771. #[derive(serde::Serialize, serde::Deserialize)]
  772. pub struct SecureResponse {
  773. pub code: i32,
  774. pub message: String,
  775. pub data: Option<BusinessData>,
  776. }
  777. ```
  778. ##### 安全命令模板
  779. ```rust
  780. #[tauri::command]
  781. pub async fn secure_business_api(request: SecureRequest) -> Result<SecureResponse, String> {
  782. use base64::{Engine as _, engine::general_purpose};
  783. use serde_json;
  784. use reqwest::Client;
  785. use std::time::{SystemTime, UNIX_EPOCH};
  786. // 🔐 安全通信流程:
  787. // 1. 获取RSA公钥(从安全存储)
  788. let public_key_pem = get_stored_public_key()?; // 从安全存储获取
  789. // 2. 生成随机AES密钥 (32字节)
  790. let aes_key = (0..32).map(|_| rand::random::<u8>()).collect::<Vec<u8>>();
  791. // 3. AES加密请求参数
  792. let request_data = serde_json::json!({
  793. "field1": request.field1,
  794. "field2": request.field2
  795. // 业务参数
  796. });
  797. let request_json = request_data.to_string();
  798. let encrypted_params = aes_encrypt(&request_json.as_bytes(), &aes_key)?;
  799. let encrypted_params_base64 = general_purpose::STANDARD.encode(&encrypted_params);
  800. // 4. RSA加密AES密钥
  801. let public_key_parsed = RsaPublicKey::from_public_key_pem(public_key_pem)
  802. .map_err(|e| format!("Failed to parse public key: {}", e))?;
  803. let mut rng = OsRng;
  804. let encrypted_aes_key = public_key_parsed.encrypt(&mut rng, Pkcs1v15Encrypt, &aes_key)
  805. .map_err(|e| format!("Failed to encrypt AES key: {}", e))?;
  806. let encrypted_aes_key_base64 = general_purpose::STANDARD.encode(&encrypted_aes_key);
  807. // 5. 生成时间戳和nonce
  808. let timestamp = SystemTime::now()
  809. .duration_since(UNIX_EPOCH)
  810. .map_err(|e| format!("Time error: {}", e))?
  811. .as_secs() as i64;
  812. let nonce: String = (0..32).map(|_| format!("{:02x}", rand::random::<u8>())).collect();
  813. // 6. 生成HMAC签名
  814. let signature_data = format!("{}:{}:{}:{}:{}", timestamp, nonce, encrypted_params_base64, encrypted_aes_key_base64, key_version);
  815. type HmacSha256 = Hmac<Sha256>;
  816. let mut mac = HmacSha256::new_from_slice(b"buff-client-secret-2024")
  817. .map_err(|e| format!("HMAC init failed: {}", e))?;
  818. mac.update(signature_data.as_bytes());
  819. let signature_bytes = mac.finalize().into_bytes();
  820. let signature = general_purpose::STANDARD.encode(&signature_bytes);
  821. // 7. 发送HTTP请求
  822. let client = Client::new();
  823. let api_url = format!("{}/api/business_endpoint", base_url);
  824. let request_body = serde_json::json!({
  825. "encrypted_params": encrypted_params_base64,
  826. "aes_key": encrypted_aes_key_base64,
  827. "key_version": key_version,
  828. "timestamp": timestamp,
  829. "nonce": nonce,
  830. "signature": signature
  831. });
  832. let response = client.post(api_url).json(&request_body).send().await?;
  833. let response_json: serde_json::Value = response.json().await?;
  834. // 8. 验证响应并解密
  835. if let Some(code) = response_json.get("code") {
  836. if code != 200 {
  837. let msg = response_json.get("msg").and_then(|m| m.as_str()).unwrap_or("API error");
  838. return Err(format!("API error: {}", msg));
  839. }
  840. }
  841. if let Some(encrypted_data) = response_json.get("encrypted_data").and_then(|d| d.as_str()) {
  842. let encrypted_bytes = general_purpose::STANDARD.decode(encrypted_data)?;
  843. let decrypted_data = aes_decrypt(&encrypted_bytes, &aes_key)?;
  844. let business_data: BusinessData = serde_json::from_slice(&decrypted_data)?;
  845. Ok(SecureResponse {
  846. code: 200,
  847. message: "Success".to_string(),
  848. data: Some(business_data),
  849. })
  850. } else {
  851. Err("No encrypted_data in response".to_string())
  852. }
  853. }
  854. ```
  855. ---
  856. #### 🎨 Vue组件调用模板
  857. ##### 导入依赖
  858. ```typescript
  859. import { invoke } from '@tauri-apps/api/tauri'
  860. import { PublicKeyManager } from '../utils/PublicKeyManager'
  861. // 业务数据类型
  862. interface BusinessRequest {
  863. field1: string
  864. field2: number
  865. }
  866. interface BusinessResponse {
  867. code: number
  868. message: string
  869. data?: BusinessData
  870. }
  871. ```
  872. ##### 安全API调用模板
  873. ```typescript
  874. const secureBusinessApi = async (requestData: BusinessRequest): Promise<BusinessResponse> => {
  875. // 🔍 1. 检查本地RSA公钥状态
  876. const hasStoredKey = PublicKeyManager.hasStoredKey()
  877. if (!hasStoredKey) {
  878. console.log('本地RSA公钥不存在,无法进行安全调用')
  879. throw new Error('系统初始化中,请稍等几分钟')
  880. }
  881. // 🔐 2. 调用Rust安全命令
  882. // 所有加密解密都在Rust原生代码中完成,前端不可见
  883. try {
  884. const response: BusinessResponse = await invoke('secure_business_api', requestData)
  885. // ✅ 3. 返回解密后的业务数据
  886. return response
  887. } catch (error: any) {
  888. console.error('安全API调用失败:', error)
  889. // 🚨 错误处理:根据错误类型提供用户友好的提示
  890. if (!PublicKeyManager.hasStoredKey()) {
  891. throw new Error('系统初始化中,请稍等几分钟')
  892. }
  893. // 业务错误映射
  894. const errorMessage = (() => {
  895. const errText = error?.toString() || ''
  896. if (errText.includes('网络错误')) return '网络连接失败,请检查网络后重试'
  897. if (errText.includes('超时')) return '请求超时,请稍后重试'
  898. if (errText.includes('权限')) return '权限不足,无法执行此操作'
  899. return errText || '操作失败,请稍后重试'
  900. })()
  901. throw new Error(errorMessage)
  902. }
  903. }
  904. ```
  905. ---
  906. #### 🔧 AES加密解密辅助函数
  907. ```rust
  908. // AES加密:数据 + 密钥 → Base64(IV+加密数据)
  909. fn aes_encrypt(data: &[u8], key: &[u8]) -> Result<Vec<u8>, String> {
  910. // 生成16字节随机IV
  911. let iv: Vec<u8> = (0..16).map(|_| rand::random::<u8>()).collect();
  912. let mut cipher = Ctr64BE::<Aes256>::new_from_slices(key, &iv)
  913. .map_err(|e| format!("AES cipher init failed: {}", e))?;
  914. let mut encrypted_data = data.to_vec();
  915. cipher.apply_keystream(&mut encrypted_data);
  916. // 返回:IV(16) + 加密数据
  917. let mut result = iv;
  918. result.extend_from_slice(&encrypted_data);
  919. Ok(result)
  920. }
  921. // AES解密:Base64(IV+加密数据) + 密钥 → 原始数据
  922. fn aes_decrypt(encrypted_data: &[u8], key: &[u8]) -> Result<Vec<u8>, String> {
  923. if encrypted_data.len() < 16 {
  924. return Err("Invalid encrypted data length".to_string());
  925. }
  926. // 提取IV和加密数据
  927. let iv = &encrypted_data[0..16];
  928. let encrypted_payload = &encrypted_data[16..];
  929. let mut cipher = Ctr64BE::<Aes256>::new_from_slices(key, iv)
  930. .map_err(|e| format!("AES cipher init failed: {}", e))?;
  931. let mut decrypted_data = encrypted_payload.to_vec();
  932. cipher.apply_keystream(&mut decrypted_data);
  933. Ok(decrypted_data)
  934. }
  935. ```
  936. ---
  937. #### ⚡ 快速实现新安全接口的步骤
  938. ##### Step 1: 定义数据结构
  939. ```rust
  940. #[derive(serde::Serialize, serde::Deserialize)]
  941. pub struct MyApiRequest {
  942. pub param1: String,
  943. pub param2: i32,
  944. }
  945. #[derive(serde::Serialize, serde::Deserialize)]
  946. pub struct MyApiResponse {
  947. pub result: String,
  948. pub data: Option<MyData>,
  949. }
  950. ```
  951. ##### Step 2: 实现安全命令
  952. ```rust
  953. #[tauri::command]
  954. pub async fn secure_my_api(request: MyApiRequest) -> Result<MyApiResponse, String> {
  955. // 复制上面的安全通信模板
  956. // 修改业务参数和API端点
  957. // ...
  958. }
  959. ```
  960. ##### Step 3: 注册命令
  961. ```rust
  962. fn main() {
  963. tauri::Builder::default()
  964. .invoke_handler(tauri::generate_handler![
  965. // ... 其他命令
  966. secure_my_api,
  967. ])
  968. .run(tauri::generate_context!())
  969. .expect("error while running tauri application");
  970. }
  971. ```
  972. ##### Step 4: Vue组件调用
  973. ```typescript
  974. const callMyApi = async (params: MyApiRequest) => {
  975. // 复制上面的安全调用模板
  976. // 修改参数和命令名
  977. const result = await invoke('secure_my_api', params)
  978. return result
  979. }
  980. ```
  981. ---
  982. #### 🎯 安全优势总结
  983. | 方面 | 传统方式 | 安全通信模式 | 提升 |
  984. |------|----------|-------------|------|
  985. | **算法隐藏** | ❌ 前端可见 | ✅ Rust原生隐藏 | 🚀 极大提升 |
  986. | **RSA公钥安全** | ❌ 前端存储 | ✅ Rust后端内存 | 🚀 极大提升 |
  987. | **逆向难度** | ⭐⭐ | ⭐⭐⭐⭐⭐ | 🚀 极大提升 |
  988. | **传输安全** | ❌ HTTP明文 | ✅ AES-256加密 | 🚀 极大提升 |
  989. | **完整性验证** | ❌ 无 | ✅ HMAC+时间戳+Nonce | 🚀 极大提升 |
  990. | **中间人攻击** | ❌ 极易 | ✅ 几乎不可能 | 🚀 极大提升 |
  991. | **代码可维护性** | ❌ 分散 | ✅ 集中管理 | ✅ 提升 |
  992. ---
  993. #### 📝 开发注意事项
  994. 1. **所有敏感接口必须使用此模式**
  995. 2. **RSA公钥存储在Rust后端内存中,前端不可访问**
  996. 3. **AES密钥每次请求都必须重新生成**
  997. 4. **时间戳容忍范围:±5分钟**
  998. 5. **错误信息不能暴露内部实现细节**
  999. 6. **前端只负责UI,后端处理所有安全逻辑**
  1000. 7. **公钥获取后自动存储到Rust后端,无需前端处理**
  1001. ---
  1002. ## 🛡️ Rust后端RSA公钥分段混淆存储
  1003. ### 存储架构设计
  1004. 为了进一步提升RSA公钥的安全性,Rust后端实现了分段混淆存储机制:
  1005. ```rust
  1006. // 8个分段存储位置(随机顺序)
  1007. static mut RSA_KEY_SEGMENTS: [Option<String>; 8] = [
  1008. None, None, None, None, None, None, None, None
  1009. ];
  1010. // 分段存储的随机索引映射
  1011. static RSA_KEY_SEGMENT_ORDER: [usize; 8] = [3, 7, 1, 5, 0, 6, 2, 4];
  1012. ```
  1013. ### 多层安全防护
  1014. #### **1. 数据编码层**
  1015. ```rust
  1016. fn encode_rsa_key_data(data: String) -> String {
  1017. // Base64编码(可逆操作)
  1018. general_purpose::STANDARD.encode(data)
  1019. }
  1020. ```
  1021. #### **2. 分段存储层**
  1022. ```rust
  1023. fn store_rsa_key_segments(public_key: String) {
  1024. let encoded_key = encode_rsa_key_data(public_key);
  1025. // 将编码后的数据分拆到8个随机位置存储
  1026. let segment_size = (encoded_key.len() + 7) / 8;
  1027. let mut start = 0;
  1028. for &segment_index in RSA_KEY_SEGMENT_ORDER.iter() {
  1029. let end = std::cmp::min(start + segment_size, encoded_key.len());
  1030. let segment = encoded_key[start..end].to_string();
  1031. // 为每个段添加固定噪声标记
  1032. let noisy_segment = add_noise_to_segment(segment);
  1033. unsafe {
  1034. RSA_KEY_SEGMENTS[segment_index] = Some(noisy_segment);
  1035. }
  1036. start = end;
  1037. }
  1038. }
  1039. ```
  1040. #### **3. 重组验证层**
  1041. ```rust
  1042. fn retrieve_rsa_key_segments() -> Result<String, String> {
  1043. // 按正确顺序收集所有段
  1044. let mut clean_segments = Vec::new();
  1045. for &segment_index in RSA_KEY_SEGMENT_ORDER.iter() {
  1046. if let Some(segment) = unsafe { &RSA_KEY_SEGMENTS[segment_index] } {
  1047. // 移除噪声标记
  1048. let clean_segment = remove_noise_from_segment(segment.clone());
  1049. clean_segments.push(clean_segment);
  1050. } else {
  1051. return Err("RSA公钥段缺失".to_string());
  1052. }
  1053. }
  1054. // 重新组合并解码
  1055. let combined_data = clean_segments.concat();
  1056. decode_rsa_key_data(combined_data)
  1057. }
  1058. ```
  1059. ### 安全优势对比
  1060. | 安全维度 | 简单存储 | 分段混淆存储 | 提升程度 |
  1061. |----------|----------|-------------|----------|
  1062. | **内存连续性** | ❌ 连续内存块 | ✅ 8个分散位置 | 🚀 极大提升 |
  1063. | **数据可读性** | ❌ 明文可见 | ✅ 多重编码混淆 | 🚀 极大提升 |
  1064. | **逆向分析难度** | ⭐⭐ | ⭐⭐⭐⭐⭐ | 🚀 极大提升 |
  1065. | **内存转储攻击** | ❌ 容易获取 | ✅ 需要重组算法 | 🚀 极大提升 |
  1066. | **动态混淆** | ❌ 固定存储 | ✅ 每次重新编码 | 🚀 极大提升 |
  1067. ### 存储效果示例
  1068. 假设原始RSA公钥:
  1069. ```
  1070. -----BEGIN PUBLIC KEY-----
  1071. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
  1072. -----END PUBLIC KEY-----
  1073. ```
  1074. 分段混淆存储后的内存分布:
  1075. ```
  1076. 内存位置 0: "8:9KLMNc3VzXyZABC..."
  1077. 内存位置 1: None (跳过)
  1078. 内存位置 2: "ab4FgHiJkL8MnOpQr..."
  1079. 内存位置 3: "hIjKlMnOpQrStUvW..."
  1080. 内存位置 4: None (跳过)
  1081. 内存位置 5: "3StUvWxYzAbCdEfG..."
  1082. 内存位置 6: "ab4FgHiJkL8MnOpQr..."
  1083. 内存位置 7: "!@#NoiseChars#$%..."
  1084. ```
  1085. ### 安全机制特点
  1086. 1. **8段分散存储** - RSA公钥被分成8个不连续的内存段
  1087. 2. **随机存储顺序** - 使用预定义的随机索引映射存储
  1088. 3. **可逆编码** - Base64编码确保数据完整性
  1089. 4. **固定噪声标记** - 每个段添加可移除的噪声标记
  1090. 5. **确定性重组** - 使用固定算法重组恢复数据
  1091. 6. **完整性验证** - 存储和重组都有错误检测和验证
  1092. ### 🎯 设计原则
  1093. **可逆性优先于复杂性**:虽然简化了混淆算法,但确保了数据能够100%正确重组,这是安全通信系统的生命线。复杂的不可逆混淆可能增加安全性,但如果导致数据无法正确重组,将会破坏整个安全通信功能。
  1094. 这种分段混淆存储机制让RSA公钥在Rust后端内存中**极难被逆向工程获取**,即使攻击者能够进行内存转储或调试,也无法轻易恢复出完整的RSA公钥!🔐✨
  1095. ---
  1096. *本规范确保项目所有敏感数据传输的安全性,开发时请严格遵循此模式。* 🔐✨
  1097. #### 4. 工具函数
  1098. ```python
  1099. import hmac
  1100. import hashlib
  1101. import base64
  1102. import json
  1103. import secrets
  1104. from cryptography.hazmat.primitives import hashes
  1105. from cryptography.hazmat.primitives.asymmetric import padding
  1106. def _generate_signature(data: str, secret_key: str) -> str:
  1107. """生成HMAC签名"""
  1108. signature = hmac.new(
  1109. secret_key.encode(),
  1110. data.encode(),
  1111. hashlib.sha256
  1112. ).digest()
  1113. return base64.b64encode(signature).decode()
  1114. def _verify_signature(data: str, signature: str, secret_key: str) -> bool:
  1115. """验证HMAC签名"""
  1116. try:
  1117. expected_signature = _generate_signature(data, secret_key)
  1118. return signature == expected_signature
  1119. except Exception as e:
  1120. logger.exception("签名验证异常")
  1121. return False
  1122. ```
  1123. ---
  1124. ### 📝 开发规范要求
  1125. #### 前端开发要求
  1126. 1. **必须使用AES+RSA混合加密**:所有敏感数据传输必须使用此方案
  1127. 2. **随机AES密钥**:每次请求都生成新的随机AES密钥
  1128. 3. **RSA公钥管理**:通过`/api/keys/public`接口获取并缓存RSA公钥
  1129. 4. **完整安全验证**:时间戳、nonce、签名缺一不可
  1130. 5. **错误处理**:公钥不存在时显示友好提示
  1131. #### 后端开发要求
  1132. 1. **安全装饰器**:所有敏感接口必须使用`@secure_endpoint`装饰器
  1133. 2. **密钥版本验证**:必须验证RSA公钥版本的有效性
  1134. 3. **时间戳容忍**:默认±5分钟,可根据业务调整
  1135. 4. **错误响应**:安全错误不泄露系统信息
  1136. 5. **日志记录**:记录所有安全相关事件
  1137. #### 密钥管理要求
  1138. 1. **RSA密钥轮换**:支持多版本RSA密钥管理
  1139. 2. **AES密钥单次**:AES密钥只在单次请求中使用
  1140. 3. **公钥缓存**:RSA公钥可在客户端缓存,但有过期检查
  1141. 4. **私钥安全**:RSA私钥只在服务端,永不传输
  1142. #### 安全监控要求
  1143. 1. **异常监控**:监控签名验证失败、时间戳异常等安全事件
  1144. 2. **频率限制**:对敏感接口实施频率限制
  1145. 3. **审计日志**:记录所有安全相关操作
  1146. 4. **告警机制**:异常情况及时告警
  1147. ---
  1148. ### 🚨 安全注意事项
  1149. 1. **不要硬编码密钥**:生产环境使用环境变量或配置管理
  1150. 2. **时间戳同步**:确保客户端和服务端时间同步
  1151. 3. **密钥轮换**:定期更换RSA密钥对
  1152. 4. **传输安全**:虽然数据已加密,仍建议使用HTTPS
  1153. 5. **内存清理**:请求完成后清理内存中的敏感数据
  1154. 6. **错误信息**:不要在错误响应中暴露内部实现细节
  1155. ---
  1156. ## 📱 client-tauri 登录后接口合规规范(Post-Login API Compliance)
  1157. **适用范围**:用户登录成功后,client-tauri 调用的**所有业务接口、心跳服务接口、密钥交换接口**(含密钥同步 keys/sync、HMAC 密钥 secure_keys_hmac 等),必须遵循以下五条规则。新增或修改此类接口时,后端与客户端均需对照本规范实现与审查。
  1158. ### 规则一:出入参密文 + 时间戳校验 + 签名验证
  1159. - **请求**:接口入参必须为密文传输(AES 加密 body,RSA 加密 AES 密钥),且请求体必须包含 `timestamp`、`nonce`、`signature`;服务端需校验时间戳(如 ±5 分钟)、nonce 防重放、请求签名(如 `timestamp:nonce:encrypted_params:aes_key:key_version` 的 HMAC-SHA256)。
  1160. - **响应**:出参必须为密文(`encrypted_data`),并附带 `response_timestamp`、`response_nonce`、`response_signature`;客户端需验签后再解密。
  1161. - **实现**:后端使用 `@secure_endpoint` 安全端点;客户端通过 Rust 层 `secure_*` / `secure_post_decrypt` 等构造加密请求并验签解密响应。禁止登录后仍使用明文 GET/POST JSON 调用业务、心跳或密钥接口。
  1162. ### 规则二:校验是否登录,未登录则退出登录
  1163. - 服务端必须校验请求中的会话(如 `session_id`)是否存在、有效、未过期;未登录或会话无效时返回 **401**,并给出用户友好提示(如「会话已过期,请重新登录」)。
  1164. - 客户端在收到 **401** 时,必须统一触发退出登录流程(如 `handleAuthError`:停心跳、清会话、跳转登录页),不得仅做提示而不退登。
  1165. ### 规则三:校验机器码与用户绑定一致,不一致则退出登录
  1166. - 服务端必须校验请求中的机器码(或 `raw_machine_info`)与当前会话绑定的机器码一致;不一致时返回 **403**,并给出用户友好提示(如「该账号已绑定其他设备」)。
  1167. - 客户端在收到 **403**(机器码不匹配或权限/业务拒绝)时,必须统一触发退出登录流程,与规则二一致。
  1168. ### 规则四:校验用户是否过期,过期则退出登录
  1169. - 服务端必须在安全端点内按业务规则校验用户是否过期(如卡密/订阅 `expire_time` 与当前时间比较);已过期时返回 **403**,并给出用户友好提示(如「您的卡密已到期」)。
  1170. - 客户端在收到上述 **403** 时,必须统一触发退出登录流程,与规则二、三一致。
  1171. ### 规则五:接口日志记录(入参密文/明文、出参密文/明文)
  1172. - **服务端**:在安全端点处理流程中,必须记录每次调用的**入参密文**(如 `encrypted_params`)、**入参明文**(解密后)、**出参明文**(业务返回)、**出参密文**(如 `encrypted_data`);可写入 API 日志(如 `api_logger.log_api_call`),并对敏感字段脱敏。
  1173. - **客户端(Rust)**:在安全调用路径(如 `secure_post_decrypt`、`secure_heartbeat_call_inner`、各 `secure_buff_*`、`secure_keys_hmac` 等)中,应记录**入参密文、入参明文、出参明文、出参密文**(可选用 debug/trace 级别,生产环境注意脱敏与日志级别控制),便于排查问题并与后端日志对应。
  1174. ### 实施与审查要点
  1175. - **后端**:所有登录后业务/心跳/密钥接口使用 `@secure_endpoint(require_login=True, require_machine_code=True)`,并在端点内实现过期校验;在 SecureEndpoint 或 api_logger 中落实规则五的日志记录。
  1176. - **客户端**:所有登录后请求经 Rust 加密层发出;对 401/403 统一走 `handleAuthError` 触发退登;新增安全命令时同步增加规则五所需日志(密文/明文入参与出参)。
  1177. - **公告等可选登录接口**:若业务要求「仅登录后可访问」且与上述五条一致,需将接口改为需登录的安全端点并校验机器码与过期;否则在文档中明确标注「不校验登录/机器码/过期」。
  1178. *本规范与项目内 `client-tauri/docs/post_login_api_compliance_audit.md` 审计结论一致,后续代码开发与 Code Review 请参照本规则执行。*
  1179. ---
  1180. *本规范由项目经理数字员工制定*
  1181. *最后更新时间: 2026-01-07*
  1182. *文档管理系统版本: v1.1.0*
  1183. *配置管理系统版本: v1.0.0*
  1184. *安全通信规范版本: v1.1.0*
  1185. *适用范围: 游铛铛项目全团队*