.cursorrules 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434
  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. *本规范由项目经理数字员工制定*
  1157. *最后更新时间: 2026-01-07*
  1158. *文档管理系统版本: v1.1.0*
  1159. *配置管理系统版本: v1.0.0*
  1160. *安全通信规范版本: v1.1.0*
  1161. *适用范围: 游铛铛项目全团队*