Compare commits

...

6 Commits

@ -1,158 +1,158 @@
个人周计划-第10周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-11-24
结束时间: 2025-11-30
🎯 本周核心目标
作为项目文档编写人员,本周将围绕"α版本迭代开发周(二)"和"跨组代码规范互评"两大核心任务展开工作。重点完成转账交易模块的技术文档、代码互评报告的规范化撰写,并确保所有技术决策、问题修复和评审发现都得到系统化记录。
📋 任务分解与分配
序号 任务内容 负责人 协作人 情况说明
1 转账模块技术方案文档 我 何文迪、张豪 记录转账业务的技术实现细节,包括事务控制方案、并发处理策略、精度问题解决方案等。
2 代码互评流程与模板制定 我 PM、全体成员 制定代码互评的标准流程、评审表和报告模板,确保评审工作规范化。
3 跨组代码评审记录与整理 我 全体成员 记录团队成员对“飞越队”代码的评审意见,分类整理规范问题、安全风险和可借鉴点。
4 互评报告专业撰写 我 PM 基于评审记录,撰写专业的《代码规范互评报告》,包含问题清单、改进建议和学习收获。
5 转账模块接口文档更新 我 何文迪、张豪 更新Swagger API文档新增转账、交易记录查询等接口说明确保文档与实现一致。
6 技术问题解决记录 我 全体成员 记录本周发现的重大技术问题(如精度丢失、事务回滚等)及其解决方案,形成技术备忘。
7 测试用例与结果文档 我 何文迪、王家伟 整理转账业务的测试用例(正常流程、异常流程、并发测试),记录测试结果和发现的问题。
8 全链路流程文档 我 全体成员 编写从登录→绑卡→转账→查询的完整业务流程文档,用于后续的集成测试和演示。
📁 预期交付成果
技术文档类(周二至周三)
✅ 《转账交易模块技术实现方案》
✅ 《事务控制与并发处理方案》
✅ 《金额精度问题解决方案》
评审文档类(周四至周五)
✅ 《跨组代码互评评审表模板》
✅ 《代码互评问题汇总清单》
✅ 《代码规范互评报告(飞越队)》
接口与测试文档(贯穿全周)
✅ Swagger API文档更新v1.2
✅ 《转账业务测试用例集》
✅ 《集成测试问题记录》
总结与流程文档(周五)
✅ 《全链路业务流程文档》
✅ 《第10周技术问题解决方案库》
✅ 《第10周开发与评审工作总结》
🎯 文档工作重点
技术深度挖掘
事务机制详解:记录@Transactional的具体配置和使用场景
并发解决方案:记录乐观锁、原子更新的具体实现代码
精度处理方案记录BigDecimal的使用规范和注意事项
评审规范化
评审标准统一:制定后端、前端评审的不同检查项
问题分类明确:按严重程度(严重、一般、建议)分类问题
建议具体可行:每个问题都提供具体的改进建议
知识沉淀
解决方案归档:将解决的技术问题归档为可复用的解决方案
最佳实践总结:从评审中总结出值得团队学习的最佳实践
经验教训记录:记录开发过程中的经验教训,避免重复犯错
📊 风险管理
潜在风险 应对策略 责任人
技术细节理解偏差 与技术负责人反复确认,代码示例验证 我
评审意见分散杂乱 使用标准化评审表,强制分类填写 我+PM
报告提交时间紧张 提前准备报告模板,边评审边整理 我
文档技术深度不足 查阅相关资料,补充技术背景说明 我
🗂️ 文档目录结构(本周新增)
text
docs/development/week_10/
├── 01-转账模块技术文档/
│ ├── 转账业务技术方案.md
│ ├── 事务控制实现细节.md
│ └── 并发与精度解决方案.md
├── 02-代码互评文档/
│ ├── 代码互评流程规范.md
│ ├── 评审问题汇总表.xlsx
│ ├── 代码规范互评报告.md
│ └── 飞越队代码亮点分析.md
├── 03-接口文档更新/
│ ├── Swagger_v1.2_diff.md
│ └── 新增接口详细说明/
├── 04-测试与问题文档/
│ ├── 转账测试用例集.md
│ ├── 技术问题解决方案库.md
│ └── 集成测试问题记录.md
└── 05-业务流程文档/
├── 全链路业务流程.md
└── 用户操作手册(转账篇).md
⏰ 时间安排计划
周一
上午:与后端沟通转账模块技术方案,开始技术文档编写
下午:制定代码互评流程和评审表模板
晚上准备Swagger文档更新计划
周二
上午:完成转账技术方案文档初稿
下午:记录精度问题和事务解决方案
晚上:开始整理测试用例
周三
上午:组织代码互评准备会议,分发评审材料
下午:参与代码评审,记录评审意见
晚上:初步整理评审问题清单
周四
上午:完成代码互评报告初稿
下午更新Swagger文档验证接口准确性
晚上:编写全链路业务流程文档
周五
上午:完善所有文档,组织内部评审
下午:根据反馈修改文档,完成最终版本
晚上:归档所有文档,编写本周工作总结
📝 工作质量标准
技术文档标准
准确性:所有技术细节必须与代码实现一致
完整性:涵盖设计方案、实现代码、配置参数
可读性:技术文档能让其他开发人员理解实现
评审文档标准
客观性:基于事实,避免主观评价
建设性:每个问题都提供改进建议
专业性:使用专业术语,格式规范
流程文档标准
清晰性:步骤明确,无歧义
实用性:可用于实际测试和演示
完整性:覆盖正常流程和异常情况
工作宣言:
个人周计划-第10周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-11-24
结束时间: 2025-11-30
🎯 本周核心目标
作为项目文档编写人员,本周将围绕"α版本迭代开发周(二)"和"跨组代码规范互评"两大核心任务展开工作。重点完成转账交易模块的技术文档、代码互评报告的规范化撰写,并确保所有技术决策、问题修复和评审发现都得到系统化记录。
📋 任务分解与分配
序号 任务内容 负责人 协作人 情况说明
1 转账模块技术方案文档 我 何文迪、张豪 记录转账业务的技术实现细节,包括事务控制方案、并发处理策略、精度问题解决方案等。
2 代码互评流程与模板制定 我 PM、全体成员 制定代码互评的标准流程、评审表和报告模板,确保评审工作规范化。
3 跨组代码评审记录与整理 我 全体成员 记录团队成员对“飞越队”代码的评审意见,分类整理规范问题、安全风险和可借鉴点。
4 互评报告专业撰写 我 PM 基于评审记录,撰写专业的《代码规范互评报告》,包含问题清单、改进建议和学习收获。
5 转账模块接口文档更新 我 何文迪、张豪 更新Swagger API文档新增转账、交易记录查询等接口说明确保文档与实现一致。
6 技术问题解决记录 我 全体成员 记录本周发现的重大技术问题(如精度丢失、事务回滚等)及其解决方案,形成技术备忘。
7 测试用例与结果文档 我 何文迪、王家伟 整理转账业务的测试用例(正常流程、异常流程、并发测试),记录测试结果和发现的问题。
8 全链路流程文档 我 全体成员 编写从登录→绑卡→转账→查询的完整业务流程文档,用于后续的集成测试和演示。
📁 预期交付成果
技术文档类(周二至周三)
✅ 《转账交易模块技术实现方案》
✅ 《事务控制与并发处理方案》
✅ 《金额精度问题解决方案》
评审文档类(周四至周五)
✅ 《跨组代码互评评审表模板》
✅ 《代码互评问题汇总清单》
✅ 《代码规范互评报告(飞越队)》
接口与测试文档(贯穿全周)
✅ Swagger API文档更新v1.2
✅ 《转账业务测试用例集》
✅ 《集成测试问题记录》
总结与流程文档(周五)
✅ 《全链路业务流程文档》
✅ 《第10周技术问题解决方案库》
✅ 《第10周开发与评审工作总结》
🎯 文档工作重点
技术深度挖掘
事务机制详解:记录@Transactional的具体配置和使用场景
并发解决方案:记录乐观锁、原子更新的具体实现代码
精度处理方案记录BigDecimal的使用规范和注意事项
评审规范化
评审标准统一:制定后端、前端评审的不同检查项
问题分类明确:按严重程度(严重、一般、建议)分类问题
建议具体可行:每个问题都提供具体的改进建议
知识沉淀
解决方案归档:将解决的技术问题归档为可复用的解决方案
最佳实践总结:从评审中总结出值得团队学习的最佳实践
经验教训记录:记录开发过程中的经验教训,避免重复犯错
📊 风险管理
潜在风险 应对策略 责任人
技术细节理解偏差 与技术负责人反复确认,代码示例验证 我
评审意见分散杂乱 使用标准化评审表,强制分类填写 我+PM
报告提交时间紧张 提前准备报告模板,边评审边整理 我
文档技术深度不足 查阅相关资料,补充技术背景说明 我
🗂️ 文档目录结构(本周新增)
text
docs/development/week_10/
├── 01-转账模块技术文档/
│ ├── 转账业务技术方案.md
│ ├── 事务控制实现细节.md
│ └── 并发与精度解决方案.md
├── 02-代码互评文档/
│ ├── 代码互评流程规范.md
│ ├── 评审问题汇总表.xlsx
│ ├── 代码规范互评报告.md
│ └── 飞越队代码亮点分析.md
├── 03-接口文档更新/
│ ├── Swagger_v1.2_diff.md
│ └── 新增接口详细说明/
├── 04-测试与问题文档/
│ ├── 转账测试用例集.md
│ ├── 技术问题解决方案库.md
│ └── 集成测试问题记录.md
└── 05-业务流程文档/
├── 全链路业务流程.md
└── 用户操作手册(转账篇).md
⏰ 时间安排计划
周一
上午:与后端沟通转账模块技术方案,开始技术文档编写
下午:制定代码互评流程和评审表模板
晚上准备Swagger文档更新计划
周二
上午:完成转账技术方案文档初稿
下午:记录精度问题和事务解决方案
晚上:开始整理测试用例
周三
上午:组织代码互评准备会议,分发评审材料
下午:参与代码评审,记录评审意见
晚上:初步整理评审问题清单
周四
上午:完成代码互评报告初稿
下午更新Swagger文档验证接口准确性
晚上:编写全链路业务流程文档
周五
上午:完善所有文档,组织内部评审
下午:根据反馈修改文档,完成最终版本
晚上:归档所有文档,编写本周工作总结
📝 工作质量标准
技术文档标准
准确性:所有技术细节必须与代码实现一致
完整性:涵盖设计方案、实现代码、配置参数
可读性:技术文档能让其他开发人员理解实现
评审文档标准
客观性:基于事实,避免主观评价
建设性:每个问题都提供改进建议
专业性:使用专业术语,格式规范
流程文档标准
清晰性:步骤明确,无歧义
实用性:可用于实际测试和演示
完整性:覆盖正常流程和异常情况
工作宣言:
本周我将以"技术深度挖掘、评审专业规范、知识系统沉淀"为目标,确保转账交易这一核心复杂模块的技术实现被完整记录,代码互评工作产生高质量的产出,所有技术决策和解决方案都能成为团队的宝贵资产。

@ -1,165 +1,165 @@
个人周总结-第10周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-11-24
结束时间: 2025-11-30
📊 本周任务完成情况
序号 总结内容 是否完成 情况说明
1 转账模块技术方案文档 完成 撰写了详细的《转账交易模块技术实现方案》,涵盖事务控制、并发处理、精度解决方案。
2 代码互评流程与模板制定 完成 制定了标准化的评审流程和评审表,被团队采纳并在互评中使用。
3 跨组代码评审记录与整理 完成 系统化记录了团队成员对飞越队的45条评审意见分类整理为规范问题、安全风险、代码亮点三类。
4 互评报告专业撰写 完成 撰写了专业的《代码规范互评报告》,包含问题分析、改进建议和学习收获,已提交课程平台。
5 转账模块接口文档更新 完成 更新Swagger至v1.2新增转账、交易记录查询等6个接口文档与代码100%一致。
6 技术问题解决记录 完成 记录了精度丢失、事务回滚、并发控制等5个重大技术问题的解决方案形成技术备忘。
7 测试用例与结果文档 完成 整理了转账业务的28个测试用例记录了测试结果和发现的2个隐藏问题。
8 全链路流程文档 完成 编写了完整的业务流程文档包含9个步骤的正常流程和4个异常分支处理。
📁 文档产出清单
技术深度文档
✅ 《转账交易模块技术实现方案》12页
✅ 《事务控制实现细节与最佳实践》
✅ 《金额精度问题从Double到BigDecimal的迁移方案》
✅ 《并发场景下的数据一致性保障方案》
代码评审文档
✅ 《跨组代码互评流程规范V1.0》
✅ 《代码互评评审表模板》
✅ 《飞越队代码评审问题汇总表》45条意见
✅ 《代码规范互评报告(正式提交版)》
✅ 《飞越队代码亮点与借鉴点分析》
接口与测试文档
✅ Swagger API文档v1.2新增6接口
✅ 《转账业务测试用例集》28个用例
✅ 《集成测试问题记录与解决方案》
✅ 《并发测试方案与结果报告》
流程与用户文档
✅ 《全链路业务流程:登录→绑卡→转账→查询》
✅ 《用户操作手册(转账功能篇)》
✅ 《常见问题解答(转账相关)》
🏆 工作亮点与成效
技术文档深度突出
事务机制详解:深入分析了@Transactional的传播行为和隔离级别应用场景
并发方案对比:对比了乐观锁、悲观锁、原子更新三种方案的适用场景
精度问题根治记录了从发现问题到实施BigDecimal方案的全过程
评审工作规范专业
流程标准化:制定的评审流程被团队认可并采用
问题分类科学:按严重性、类型、模块三维度分类问题
报告质量高:互评报告获得课程助教的好评
量化成果显著
指标 目标值 实际值 达成率
技术文档完整率 ≥90% 100% 111%
评审意见采纳率 ≥80% 93% 116%
问题解决方案归档率 100% 100% 100%
团队文档满意度 ≥4分 4.7分 118%
接口文档准确率 ≥95% 100% 105%
🔍 关键问题与创新解决方案
遇到的主要挑战
技术理解深度不足:初期对事务传播行为理解不够深入
评审意见杂乱:团队成员提交的评审意见格式不一
时间分配冲突:文档工作与支持评审工作的时间冲突
创新的解决方案
技术访谈+资料查阅:与技术负责人深入交流+查阅官方文档
评审意见标准化模板:强制使用标准化表格提交意见
时间块划分法:将工作时间划分为技术文档块和评审支持块
📈 工作方法创新
创新的工作方法
技术决策记录法:记录每个技术决策的背景、选项、选择理由
问题根源分析法:对每个技术问题追踪到根本原因
知识关联链接法:在文档中建立相关知识的超链接
实践成果显著
知识体系化:技术文档形成了完整的知识体系
问题可追溯:所有技术问题都有完整的追踪记录
学习效率提升:新成员可通过文档快速理解复杂技术
📌 本周小结
作为文档编写人员,本周在"转账模块开发"和"跨组代码互评"双重点任务中取得了显著成果。不仅深入记录了复杂业务模块的技术实现,还规范化了代码评审流程,产出了高质量的互评报告,为团队的技术积累和质量提升做出了重要贡献。
核心价值体现:
技术深度挖掘者:深入挖掘并记录了复杂技术实现细节
质量流程建设者:建立了规范的代码评审流程和标准
知识体系构建者:构建了转账业务完整的技术知识体系
团队学习促进者:通过评审总结促进了团队的代码质量意识
关键成就总结:
完成了项目最复杂模块的完整技术文档
建立了标准化的代码评审流程和模板
产出了高质量的跨组代码互评报告
记录了所有重大技术问题的解决方案
获得团队成员4.7/5的高度评价
🧠 经验总结与反思
成功经验提炼
深度访谈的重要性:与技术负责人的深入交流是理解复杂技术的关键
模板化工作的效率:标准化模板大幅提升了评审工作的效率
知识关联的价值:建立知识关联使文档价值倍增
改进方向识别
可视化增强:复杂技术可增加架构图、序列图等可视化内容
自动化检查:可探索文档与代码一致性的自动化检查工具
团队协作深化:可建立更深入的文档协作机制
🆘 希望获得的帮助
架构图工具:希望学习专业的技术架构图绘制工具
文档自动化:希望了解文档自动化生成和维护的工具
技术写作培训:希望获得专业技术写作的培训资源
📅 下一阶段工作展望
随着α版本核心功能基本完成,文档工作重点将转向:
系统部署文档:编写系统部署、配置、运维文档
用户手册完善:完善用户操作手册和帮助文档
项目总结文档:开始准备项目总结和技术报告
知识库优化:优化团队知识库结构和内容
工作状态:✅ 本周任务圆满完成
文档归档位置:团队仓库 /docs/development/week_10/
质量评分团队评价4.7/5
个人周总结-第10周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-11-24
结束时间: 2025-11-30
📊 本周任务完成情况
序号 总结内容 是否完成 情况说明
1 转账模块技术方案文档 完成 撰写了详细的《转账交易模块技术实现方案》,涵盖事务控制、并发处理、精度解决方案。
2 代码互评流程与模板制定 完成 制定了标准化的评审流程和评审表,被团队采纳并在互评中使用。
3 跨组代码评审记录与整理 完成 系统化记录了团队成员对飞越队的45条评审意见分类整理为规范问题、安全风险、代码亮点三类。
4 互评报告专业撰写 完成 撰写了专业的《代码规范互评报告》,包含问题分析、改进建议和学习收获,已提交课程平台。
5 转账模块接口文档更新 完成 更新Swagger至v1.2新增转账、交易记录查询等6个接口文档与代码100%一致。
6 技术问题解决记录 完成 记录了精度丢失、事务回滚、并发控制等5个重大技术问题的解决方案形成技术备忘。
7 测试用例与结果文档 完成 整理了转账业务的28个测试用例记录了测试结果和发现的2个隐藏问题。
8 全链路流程文档 完成 编写了完整的业务流程文档包含9个步骤的正常流程和4个异常分支处理。
📁 文档产出清单
技术深度文档
✅ 《转账交易模块技术实现方案》12页
✅ 《事务控制实现细节与最佳实践》
✅ 《金额精度问题从Double到BigDecimal的迁移方案》
✅ 《并发场景下的数据一致性保障方案》
代码评审文档
✅ 《跨组代码互评流程规范V1.0》
✅ 《代码互评评审表模板》
✅ 《飞越队代码评审问题汇总表》45条意见
✅ 《代码规范互评报告(正式提交版)》
✅ 《飞越队代码亮点与借鉴点分析》
接口与测试文档
✅ Swagger API文档v1.2新增6接口
✅ 《转账业务测试用例集》28个用例
✅ 《集成测试问题记录与解决方案》
✅ 《并发测试方案与结果报告》
流程与用户文档
✅ 《全链路业务流程:登录→绑卡→转账→查询》
✅ 《用户操作手册(转账功能篇)》
✅ 《常见问题解答(转账相关)》
🏆 工作亮点与成效
技术文档深度突出
事务机制详解:深入分析了@Transactional的传播行为和隔离级别应用场景
并发方案对比:对比了乐观锁、悲观锁、原子更新三种方案的适用场景
精度问题根治记录了从发现问题到实施BigDecimal方案的全过程
评审工作规范专业
流程标准化:制定的评审流程被团队认可并采用
问题分类科学:按严重性、类型、模块三维度分类问题
报告质量高:互评报告获得课程助教的好评
量化成果显著
指标 目标值 实际值 达成率
技术文档完整率 ≥90% 100% 111%
评审意见采纳率 ≥80% 93% 116%
问题解决方案归档率 100% 100% 100%
团队文档满意度 ≥4分 4.7分 118%
接口文档准确率 ≥95% 100% 105%
🔍 关键问题与创新解决方案
遇到的主要挑战
技术理解深度不足:初期对事务传播行为理解不够深入
评审意见杂乱:团队成员提交的评审意见格式不一
时间分配冲突:文档工作与支持评审工作的时间冲突
创新的解决方案
技术访谈+资料查阅:与技术负责人深入交流+查阅官方文档
评审意见标准化模板:强制使用标准化表格提交意见
时间块划分法:将工作时间划分为技术文档块和评审支持块
📈 工作方法创新
创新的工作方法
技术决策记录法:记录每个技术决策的背景、选项、选择理由
问题根源分析法:对每个技术问题追踪到根本原因
知识关联链接法:在文档中建立相关知识的超链接
实践成果显著
知识体系化:技术文档形成了完整的知识体系
问题可追溯:所有技术问题都有完整的追踪记录
学习效率提升:新成员可通过文档快速理解复杂技术
📌 本周小结
作为文档编写人员,本周在"转账模块开发"和"跨组代码互评"双重点任务中取得了显著成果。不仅深入记录了复杂业务模块的技术实现,还规范化了代码评审流程,产出了高质量的互评报告,为团队的技术积累和质量提升做出了重要贡献。
核心价值体现:
技术深度挖掘者:深入挖掘并记录了复杂技术实现细节
质量流程建设者:建立了规范的代码评审流程和标准
知识体系构建者:构建了转账业务完整的技术知识体系
团队学习促进者:通过评审总结促进了团队的代码质量意识
关键成就总结:
完成了项目最复杂模块的完整技术文档
建立了标准化的代码评审流程和模板
产出了高质量的跨组代码互评报告
记录了所有重大技术问题的解决方案
获得团队成员4.7/5的高度评价
🧠 经验总结与反思
成功经验提炼
深度访谈的重要性:与技术负责人的深入交流是理解复杂技术的关键
模板化工作的效率:标准化模板大幅提升了评审工作的效率
知识关联的价值:建立知识关联使文档价值倍增
改进方向识别
可视化增强:复杂技术可增加架构图、序列图等可视化内容
自动化检查:可探索文档与代码一致性的自动化检查工具
团队协作深化:可建立更深入的文档协作机制
🆘 希望获得的帮助
架构图工具:希望学习专业的技术架构图绘制工具
文档自动化:希望了解文档自动化生成和维护的工具
技术写作培训:希望获得专业技术写作的培训资源
📅 下一阶段工作展望
随着α版本核心功能基本完成,文档工作重点将转向:
系统部署文档:编写系统部署、配置、运维文档
用户手册完善:完善用户操作手册和帮助文档
项目总结文档:开始准备项目总结和技术报告
知识库优化:优化团队知识库结构和内容
工作状态:✅ 本周任务圆满完成
文档归档位置:团队仓库 /docs/development/week_10/
质量评分团队评价4.7/5
下周计划:开始系统部署文档编写,完善用户操作手册

@ -1,27 +1,27 @@
# 个人周计划-第10周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-24
**结束时间:** 2025-11-30
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 开发转账表单页面(输入验证、密码确认) | 刘兴朋 | 实现转账页面的UI布局完成表单验证逻辑和密码确认交互 |
| 2 | 开发交易明细列表页面(对接分页) | 刘兴朋 | 实现交易记录列表展示,对接后端分页查询接口 |
| 3 | 优化全局加载状态与错误提示 | 刘兴朋 | 统一处理页面加载状态和错误信息提示,提升用户体验 |
| 4 | 参与前端代码规范互评(对象:飞越队) | 刘兴朋 | 评审飞越队前端代码,关注组件规范、目录结构、硬编码等问题 |
| 5 | 参与前后端联调与集成测试 | 全体成员 | 联调转账流程,测试异常场景(如余额不足、失败回滚) |
| 6 | 修复迭代一及迭代二发现的前端Bug | 刘兴朋 | 根据测试反馈修复已发现的前端问题 |
## 小结
1. **前端开发主导:** 本周重点负责转账与交易记录模块的前端开发,包括表单、列表及全局交互优化;
2. **技术实现重点:** 需掌握分页查询对接、全局状态管理、表单安全验证等前端关键技术;
3. **代码评审任务:** 参与跨组代码互评,学习他人代码风格,提升自身代码规范意识;
4. **联调协作:** 与后端保持紧密沟通,确保转账流程联调顺利,数据一致;
5. **学习需求:** 希望了解"前端安全最佳实践"或"Vue/React状态管理进阶"相关技术分享。
# 个人周计划-第10周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-24
**结束时间:** 2025-11-30
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 开发转账表单页面(输入验证、密码确认) | 刘兴朋 | 实现转账页面的UI布局完成表单验证逻辑和密码确认交互 |
| 2 | 开发交易明细列表页面(对接分页) | 刘兴朋 | 实现交易记录列表展示,对接后端分页查询接口 |
| 3 | 优化全局加载状态与错误提示 | 刘兴朋 | 统一处理页面加载状态和错误信息提示,提升用户体验 |
| 4 | 参与前端代码规范互评(对象:飞越队) | 刘兴朋 | 评审飞越队前端代码,关注组件规范、目录结构、硬编码等问题 |
| 5 | 参与前后端联调与集成测试 | 全体成员 | 联调转账流程,测试异常场景(如余额不足、失败回滚) |
| 6 | 修复迭代一及迭代二发现的前端Bug | 刘兴朋 | 根据测试反馈修复已发现的前端问题 |
## 小结
1. **前端开发主导:** 本周重点负责转账与交易记录模块的前端开发,包括表单、列表及全局交互优化;
2. **技术实现重点:** 需掌握分页查询对接、全局状态管理、表单安全验证等前端关键技术;
3. **代码评审任务:** 参与跨组代码互评,学习他人代码风格,提升自身代码规范意识;
4. **联调协作:** 与后端保持紧密沟通,确保转账流程联调顺利,数据一致;
5. **学习需求:** 希望了解"前端安全最佳实践"或"Vue/React状态管理进阶"相关技术分享。

@ -1,65 +1,65 @@
# 个人周总结-第9周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-17
**结束时间:** 2025-11-23
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 开发注册页面UI及表单验证逻辑 | 完成 | 基于原型设计完成注册页面开发,实现完整的表单验证和用户交互功能 |
| 2 | 开发登录页面UI及Token存储 | 完成 | 完成登录页面布局和样式实现Token存储逻辑和登录状态管理 |
| 3 | 实现路由守卫,进行登录状态拦截 | 完成 | 配置前端路由守卫,成功实现未登录用户访问限制 |
| 4 | 协助银行卡管理页面开发 | 完成 | 配合完成银行卡列表展示和添加银行卡页面的UI实现 |
| 5 | 参与前后端联调与集成测试 | 完成 | 参与用户注册、登录流程联调,修复多个接口对接问题 |
| 6 | 编写前端组件技术文档 | 完成 | 整理完成用户认证相关组件的使用说明和API文档 |
## 对团队工作的建议
1. **接口文档规范化:** 建议建立统一的接口文档标准,减少前后端联调时的理解偏差;
2. **组件复用机制:** 建议建立前端组件库,提高开发效率和代码一致性;
3. **联调流程优化:** 建议制定更详细的联调测试用例,覆盖更多边界情况。
# 个人周总结-第10周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-24
**结束时间:** 2025-11-30
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 开发转账表单页面(输入验证、密码确认) | 完成 | 完成转账页面的UI布局与样式实现完整的表单验证逻辑和密码确认交互功能 |
| 2 | 开发交易明细列表页面(对接分页) | 完成 | 实现交易记录列表展示,成功对接后端分页查询接口,支持数据动态加载 |
| 3 | 优化全局加载状态与错误提示 | 完成 | 统一封装加载状态组件和错误提示弹窗,提升页面交互一致性与用户体验 |
| 4 | 参与前端代码规范互评(对象:飞越队) | 完成 | 完成对飞越队前端代码的评审,重点关注组件结构、代码规范、可维护性等问题,并提交评审意见 |
| 5 | 参与前后端联调与集成测试 | 完成 | 参与转账流程的完整联调,测试并验证了余额不足、交易失败回滚等异常场景的处理逻辑 |
| 6 | 修复迭代一及迭代二发现的前端Bug | 完成 | 根据测试反馈修复了多个前端问题,包括样式错位、接口响应异常处理等 |
## 对团队工作的建议
1. **联调用例细化:** 建议在联调前共同编写更详细的测试用例,尤其是异常流程和边界情况,提升联调效率;
2. **代码评审常态化:** 建议定期组织跨组代码互评,促进团队代码规范与技术交流;
3. **组件文档完善:** 建议为常用组件编写示例和使用说明,便于新成员快速上手和团队协作。
## 小结
1. **转账与交易模块上线:** 本周顺利完成转账表单和交易明细列表的前端开发与联调,功能运行稳定;
2. **全局交互体验优化:** 通过统一封装加载与错误提示组件,提升了系统的整体交互一致性和用户友好性;
3. **代码规范意识增强:** 通过参与跨组代码评审,学习了不同的代码风格与实现思路,增强了自身代码规范与设计意识;
4. **联调协作效率提升:** 与后端团队保持高效沟通,快速定位并解决了多个接口与业务逻辑问题;
5. **学习与实践结合:** 在实际开发中进一步理解了分页对接、状态管理等前端关键技术,希望后续能开展“前端安全最佳实践”或“状态管理进阶”相关技术分享。
## 小结
1. **用户认证模块完成:** 本周成功完成用户注册、登录等认证模块的前端开发,功能稳定;
2. **技术难点攻克:** 掌握了Token存储、路由守卫等前端安全技术实现完整的用户状态管理
3. **联调协作顺畅:** 与后端团队保持密切沟通,及时解决接口对接过程中的技术问题;
4. **代码质量提升:** 注重组件封装和代码规范,提高了前端代码的可维护性;
# 个人周总结-第9周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-17
**结束时间:** 2025-11-23
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 开发注册页面UI及表单验证逻辑 | 完成 | 基于原型设计完成注册页面开发,实现完整的表单验证和用户交互功能 |
| 2 | 开发登录页面UI及Token存储 | 完成 | 完成登录页面布局和样式实现Token存储逻辑和登录状态管理 |
| 3 | 实现路由守卫,进行登录状态拦截 | 完成 | 配置前端路由守卫,成功实现未登录用户访问限制 |
| 4 | 协助银行卡管理页面开发 | 完成 | 配合完成银行卡列表展示和添加银行卡页面的UI实现 |
| 5 | 参与前后端联调与集成测试 | 完成 | 参与用户注册、登录流程联调,修复多个接口对接问题 |
| 6 | 编写前端组件技术文档 | 完成 | 整理完成用户认证相关组件的使用说明和API文档 |
## 对团队工作的建议
1. **接口文档规范化:** 建议建立统一的接口文档标准,减少前后端联调时的理解偏差;
2. **组件复用机制:** 建议建立前端组件库,提高开发效率和代码一致性;
3. **联调流程优化:** 建议制定更详细的联调测试用例,覆盖更多边界情况。
# 个人周总结-第10周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-24
**结束时间:** 2025-11-30
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 开发转账表单页面(输入验证、密码确认) | 完成 | 完成转账页面的UI布局与样式实现完整的表单验证逻辑和密码确认交互功能 |
| 2 | 开发交易明细列表页面(对接分页) | 完成 | 实现交易记录列表展示,成功对接后端分页查询接口,支持数据动态加载 |
| 3 | 优化全局加载状态与错误提示 | 完成 | 统一封装加载状态组件和错误提示弹窗,提升页面交互一致性与用户体验 |
| 4 | 参与前端代码规范互评(对象:飞越队) | 完成 | 完成对飞越队前端代码的评审,重点关注组件结构、代码规范、可维护性等问题,并提交评审意见 |
| 5 | 参与前后端联调与集成测试 | 完成 | 参与转账流程的完整联调,测试并验证了余额不足、交易失败回滚等异常场景的处理逻辑 |
| 6 | 修复迭代一及迭代二发现的前端Bug | 完成 | 根据测试反馈修复了多个前端问题,包括样式错位、接口响应异常处理等 |
## 对团队工作的建议
1. **联调用例细化:** 建议在联调前共同编写更详细的测试用例,尤其是异常流程和边界情况,提升联调效率;
2. **代码评审常态化:** 建议定期组织跨组代码互评,促进团队代码规范与技术交流;
3. **组件文档完善:** 建议为常用组件编写示例和使用说明,便于新成员快速上手和团队协作。
## 小结
1. **转账与交易模块上线:** 本周顺利完成转账表单和交易明细列表的前端开发与联调,功能运行稳定;
2. **全局交互体验优化:** 通过统一封装加载与错误提示组件,提升了系统的整体交互一致性和用户友好性;
3. **代码规范意识增强:** 通过参与跨组代码评审,学习了不同的代码风格与实现思路,增强了自身代码规范与设计意识;
4. **联调协作效率提升:** 与后端团队保持高效沟通,快速定位并解决了多个接口与业务逻辑问题;
5. **学习与实践结合:** 在实际开发中进一步理解了分页对接、状态管理等前端关键技术,希望后续能开展“前端安全最佳实践”或“状态管理进阶”相关技术分享。
## 小结
1. **用户认证模块完成:** 本周成功完成用户注册、登录等认证模块的前端开发,功能稳定;
2. **技术难点攻克:** 掌握了Token存储、路由守卫等前端安全技术实现完整的用户状态管理
3. **联调协作顺畅:** 与后端团队保持密切沟通,及时解决接口对接过程中的技术问题;
4. **代码质量提升:** 注重组件封装和代码规范,提高了前端代码的可维护性;
5. **学习收获:** 通过实践加深了对前端安全机制的理解,希望继续学习"前端性能优化"相关技术。

@ -1,170 +1,170 @@
个人周计划-第11周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-12-01
结束时间: 2025-12-07
🎯 本周核心目标
作为项目文档编写人员本周将全面负责“α版本项目验收周”的文档统筹与质量保障工作。核心任务是确保所有交付文档UML模型、用户手册、部署指南、答辩材料的专业性、准确性和完整性支持团队顺利完成项目验收和答辩演示。
📋 任务分解与分配
序号 任务内容 负责人 协作人 情况说明
1 UML模型文档质量审查与整合 我 王腾云、何文迪 审查用例图、类图、时序图的准确性和规范性整合为完整的《系统UML设计文档》。
2 系统用户手册编写 我 全体成员 编写面向最终用户的《α版本用户操作手册》,涵盖注册、登录、绑卡、转账、查询等全部功能。
3 系统部署与运维指南编写 我 张豪、何文迪 编写《系统部署指南》和《运维手册》,记录环境要求、部署步骤、常见问题排查方法。
4 答辩演示材料文档支持 我 PM、王家伟 协助整理答辩PPT的技术内容、架构图和功能亮点描述确保表述准确专业。
5 演示视频脚本与字幕制作 我 PM、王家伟 编写演示视频的解说脚本,制作中文字幕,确保演示内容清晰易懂。
6 项目验收文档包整合 我 全体成员 整合所有验收文档,建立清晰的目录结构,生成完整的《α版本验收文档包》。
7 代码与文档一致性最终核查 我 何文迪、张豪 对UML图与代码实现进行最终核对修正发现的偏差确保设计与实现一致。
8 团队经验教训文档化 我 全体成员 收集整理项目开发过程中的经验教训,形成《项目经验总结报告》。
📁 预期交付成果
UML与设计文档周二前
✅ 《系统UML设计文档整合版
用例图Use Case Diagram
类图Class Diagram核心业务层
转账业务时序图Sequence Diagram
✅ 《UML图与代码一致性核查报告》
用户与运维文档(周三前)
✅ 《α版本用户操作手册》
✅ 《系统部署与配置指南》
✅ 《运维手册与常见问题解答》
答辩支持材料(周四前)
✅ 答辩PPT技术内容审核报告
✅ 演示视频脚本与字幕文件
✅ 答辩Q&A预准备文档
最终验收包(周五)
✅ 《α版本验收文档完整包》
✅ 《项目经验总结报告》
✅ 《文档质量自查报告》
🎯 文档工作重点
准确性保障
UML图代码核对与代码负责人逐行核对时序图调用链
操作步骤验证:用户手册每个步骤都经过实际操作验证
技术表述审核:确保所有技术描述准确无歧义
用户体验优化
手册易读性:使用清晰的步骤编号和截图说明
问题预防:在手册中提前预警常见操作误区
多版本适配:考虑不同操作系统和浏览器的差异
完整性检查
文档清单核对:使用检查清单确保无遗漏文档
版本一致性:确保所有文档引用相同的系统版本
格式统一性:统一所有文档的字体、格式、样式
📊 风险管理
潜在风险 应对策略 责任人
UML图与代码偏差 组织代码与UML图对照评审会 我+何文迪
操作手册步骤遗漏 邀请非项目成员试用并反馈 我+测试人员
答辩材料技术深度不足 提前与技术人员确认关键点 我+技术负责人
时间紧张导致质量下降 制定优先级,核心文档优先保证 我+PM
🗂️ 验收文档包结构
text
α版本验收包_菜鸟队_20251207/
├── 01-设计文档/
│ ├── 系统UML设计文档.pdf
│ ├── 数据库设计文档.pdf
│ └── API接口文档.pdf
├── 02-用户文档/
│ ├── α版本用户操作手册.pdf
│ ├── 快速上手指南.pdf
│ └── 常见问题解答.pdf
├── 03-部署运维/
│ ├── 系统部署指南.pdf
│ ├── 运维手册.pdf
│ └── 环境配置说明.pdf
├── 04-测试文档/
│ ├── 测试用例集.pdf
│ ├── 测试报告.pdf
│ └── Bug修复记录.pdf
├── 05-答辩材料/
│ ├── 项目答辩PPT.pptx
│ ├── 演示视频.mp4
│ └── 演示视频脚本.pdf
├── 06-源代码/
│ ├── 后端代码/
│ └── 前端代码/
└── 07-项目总结/
├── 项目经验总结报告.pdf
├── 团队分工与贡献说明.pdf
└── 未来改进计划.pdf
⏰ 时间安排计划
周一
上午审查UML图初稿提出修改意见
下午:开始编写用户操作手册
晚上:制定文档验收标准清单
周二
上午:完成用户手册初稿,组织试用测试
下午:编写部署指南,与运维人员确认步骤
晚上协助整理答辩PPT技术内容
周三
上午UML图与代码一致性最终核对
下午:整合所有设计文档,形成完整版
晚上:编写演示视频脚本
周四
上午:完成所有支持文档,组织内部评审
下午:根据评审意见修改完善文档
晚上:开始整合验收文档包
周五
上午:完成验收文档包整合和最终检查
下午:准备项目经验总结报告
晚上:完成所有文档归档,编写本周总结
📝 工作质量标准
UML图标准
准确性与代码实现100%一致
规范性符合UML 2.0标准
清晰性:图形元素布局合理,标注清晰
用户手册标准
可操作性:每个步骤都可实际执行
完整性:覆盖所有主要功能
友好性:语言通俗易懂,配图清晰
验收包标准
完整性:包含所有必需文档
一致性:所有文档版本统一
专业性:符合行业文档标准
工作宣言:
个人周计划-第11周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-12-01
结束时间: 2025-12-07
🎯 本周核心目标
作为项目文档编写人员本周将全面负责“α版本项目验收周”的文档统筹与质量保障工作。核心任务是确保所有交付文档UML模型、用户手册、部署指南、答辩材料的专业性、准确性和完整性支持团队顺利完成项目验收和答辩演示。
📋 任务分解与分配
序号 任务内容 负责人 协作人 情况说明
1 UML模型文档质量审查与整合 我 王腾云、何文迪 审查用例图、类图、时序图的准确性和规范性整合为完整的《系统UML设计文档》。
2 系统用户手册编写 我 全体成员 编写面向最终用户的《α版本用户操作手册》,涵盖注册、登录、绑卡、转账、查询等全部功能。
3 系统部署与运维指南编写 我 张豪、何文迪 编写《系统部署指南》和《运维手册》,记录环境要求、部署步骤、常见问题排查方法。
4 答辩演示材料文档支持 我 PM、王家伟 协助整理答辩PPT的技术内容、架构图和功能亮点描述确保表述准确专业。
5 演示视频脚本与字幕制作 我 PM、王家伟 编写演示视频的解说脚本,制作中文字幕,确保演示内容清晰易懂。
6 项目验收文档包整合 我 全体成员 整合所有验收文档,建立清晰的目录结构,生成完整的《α版本验收文档包》。
7 代码与文档一致性最终核查 我 何文迪、张豪 对UML图与代码实现进行最终核对修正发现的偏差确保设计与实现一致。
8 团队经验教训文档化 我 全体成员 收集整理项目开发过程中的经验教训,形成《项目经验总结报告》。
📁 预期交付成果
UML与设计文档周二前
✅ 《系统UML设计文档整合版
用例图Use Case Diagram
类图Class Diagram核心业务层
转账业务时序图Sequence Diagram
✅ 《UML图与代码一致性核查报告》
用户与运维文档(周三前)
✅ 《α版本用户操作手册》
✅ 《系统部署与配置指南》
✅ 《运维手册与常见问题解答》
答辩支持材料(周四前)
✅ 答辩PPT技术内容审核报告
✅ 演示视频脚本与字幕文件
✅ 答辩Q&A预准备文档
最终验收包(周五)
✅ 《α版本验收文档完整包》
✅ 《项目经验总结报告》
✅ 《文档质量自查报告》
🎯 文档工作重点
准确性保障
UML图代码核对与代码负责人逐行核对时序图调用链
操作步骤验证:用户手册每个步骤都经过实际操作验证
技术表述审核:确保所有技术描述准确无歧义
用户体验优化
手册易读性:使用清晰的步骤编号和截图说明
问题预防:在手册中提前预警常见操作误区
多版本适配:考虑不同操作系统和浏览器的差异
完整性检查
文档清单核对:使用检查清单确保无遗漏文档
版本一致性:确保所有文档引用相同的系统版本
格式统一性:统一所有文档的字体、格式、样式
📊 风险管理
潜在风险 应对策略 责任人
UML图与代码偏差 组织代码与UML图对照评审会 我+何文迪
操作手册步骤遗漏 邀请非项目成员试用并反馈 我+测试人员
答辩材料技术深度不足 提前与技术人员确认关键点 我+技术负责人
时间紧张导致质量下降 制定优先级,核心文档优先保证 我+PM
🗂️ 验收文档包结构
text
α版本验收包_菜鸟队_20251207/
├── 01-设计文档/
│ ├── 系统UML设计文档.pdf
│ ├── 数据库设计文档.pdf
│ └── API接口文档.pdf
├── 02-用户文档/
│ ├── α版本用户操作手册.pdf
│ ├── 快速上手指南.pdf
│ └── 常见问题解答.pdf
├── 03-部署运维/
│ ├── 系统部署指南.pdf
│ ├── 运维手册.pdf
│ └── 环境配置说明.pdf
├── 04-测试文档/
│ ├── 测试用例集.pdf
│ ├── 测试报告.pdf
│ └── Bug修复记录.pdf
├── 05-答辩材料/
│ ├── 项目答辩PPT.pptx
│ ├── 演示视频.mp4
│ └── 演示视频脚本.pdf
├── 06-源代码/
│ ├── 后端代码/
│ └── 前端代码/
└── 07-项目总结/
├── 项目经验总结报告.pdf
├── 团队分工与贡献说明.pdf
└── 未来改进计划.pdf
⏰ 时间安排计划
周一
上午审查UML图初稿提出修改意见
下午:开始编写用户操作手册
晚上:制定文档验收标准清单
周二
上午:完成用户手册初稿,组织试用测试
下午:编写部署指南,与运维人员确认步骤
晚上协助整理答辩PPT技术内容
周三
上午UML图与代码一致性最终核对
下午:整合所有设计文档,形成完整版
晚上:编写演示视频脚本
周四
上午:完成所有支持文档,组织内部评审
下午:根据评审意见修改完善文档
晚上:开始整合验收文档包
周五
上午:完成验收文档包整合和最终检查
下午:准备项目经验总结报告
晚上:完成所有文档归档,编写本周总结
📝 工作质量标准
UML图标准
准确性与代码实现100%一致
规范性符合UML 2.0标准
清晰性:图形元素布局合理,标注清晰
用户手册标准
可操作性:每个步骤都可实际执行
完整性:覆盖所有主要功能
友好性:语言通俗易懂,配图清晰
验收包标准
完整性:包含所有必需文档
一致性:所有文档版本统一
专业性:符合行业文档标准
工作宣言:
本周我将以确保“文档零误差、演示零失误、验收零问题”为目标,通过严谨的文档审查、系统的知识整合和专业的材料准备,为团队的α版本验收工作提供坚实的文档保障,让我们的项目成果以最专业、最完整的形式呈现。

@ -1,208 +1,208 @@
个人周总结-第11周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-12-01
结束时间: 2025-12-07
📊 本周任务完成情况
序号 总结内容 是否完成 情况说明
1 UML模型文档质量审查与整合 完成 完成了用例图、类图、时序图的审查和整合发现并修正了3处与代码不一致的地方。
2 系统用户手册编写 完成 编写了《α版本用户操作手册》28页涵盖所有功能经过3名非项目成员试用验证。
3 系统部署与运维指南编写 完成 编写了《部署指南》和《运维手册》,详细记录了环境配置和常见问题解决方案。
4 答辩演示材料文档支持 完成 协助审核了答辩PPT技术内容确保架构描述准确功能亮点突出。
5 演示视频脚本与字幕制作 完成 编写了8分钟的演示视频脚本制作了完整的中文字幕视频演示流畅专业。
6 项目验收文档包整合 完成 整合了7大类文档形成了完整的《α版本验收文档包》总大小86MB
7 代码与文档一致性最终核查 完成 组织了代码与UML图对照评审会确保了设计与实现的100%一致性。
8 团队经验教训文档化 完成 收集整理了团队经验教训,形成了《项目经验总结报告》,包含安全、协作、质量三个维度。
📁 文档产出清单
设计文档类
✅ 《系统UML设计文档整合版
用例图识别6个参与者12个核心用例
类图包含18个核心类及其关系
时序图:详细展示转账业务流程
✅ 《UML图与代码一致性核查报告》
用户与运维文档
✅ 《α版本用户操作手册》28页56个操作步骤
✅ 《系统部署与配置指南》
✅ 《运维手册与常见问题解答》收录21个常见问题
✅ 《快速上手指南》5分钟快速入门
答辩支持材料
✅ 答辩PPT技术内容审核报告提出8处修改建议
✅ 演示视频脚本8分钟完整脚本
✅ 演示视频字幕文件(中文字幕)
✅ 答辩预准备Q&A文档准备15个可能问题
最终验收包
✅ 《α版本验收文档完整包》7大类23个文档
✅ 《项目经验总结报告》
安全意识薄弱问题分析
文档与代码偏差问题反思
团队协作亮点总结
✅ 《文档质量自查报告》
🏆 工作亮点与成效
文档质量突出
准确性100%UML图与代码实现完全一致
实用性验证:用户手册经过非项目成员实际试用验证
专业性体现:验收文档包符合行业标准
风险预防有效
演示备份完善协助准备的演示视频作为有效Plan B
问题提前发现在文档核对中发现3个设计实现偏差
Q&A充分准备预准备的答辩问题覆盖了所有关键点
量化成果显著
指标 目标值 实际值 达成率
文档准确性 100% 100% 100%
用户手册易用性评分 ≥4分 4.5分 113%
验收包完整性 100% 100% 100%
团队文档满意度 ≥4.5分 4.8分 107%
答辩准备充分度 ≥90% 95% 106%
🔍 关键问题与创新解决方案
遇到的主要挑战
UML图细节偏差时序图中一个工具类的调用层级与代码不符
手册步骤验证:某些操作步骤在不同浏览器下表现不一致
时间极度紧张:验收前夜还在调整文档细节
创新的解决方案
代码遍历比对使用IDE的调用链分析工具辅助核对时序图
多环境测试在Chrome、Firefox、Edge三个浏览器验证操作步骤
优先级工作法:将文档按重要性分级,确保核心文档质量
📈 工作方法创新
创新的工作方法
反向验证法从代码反推设计验证UML图准确性
用户视角测试:邀请完全不了解项目的人试用手册
风险预演法:模拟答辩场景,预测可能问题并准备
实践成果显著
问题零遗漏:所有文档问题在验收前发现并解决
体验优化:用户手册获得试用人员好评
答辩顺利:团队答辩演示流畅,回答问题准确
📌 本周小结
作为文档编写人员,本周在“α版本项目验收周”中发挥了关键作用。通过严谨的文档审查、系统的知识整合和专业的材料准备,确保了项目以最完整、最专业的形式呈现,为团队顺利通过验收提供了坚实的文档保障。
核心价值体现:
质量守护者:确保了所有交付文档的准确性和专业性
知识整合者:将分散的知识系统化整合为完整文档体系
风险预防者:通过充分的准备预防了演示和答辩风险
团队支持者:为团队的验收工作提供了全面的文档支持
关键成就总结:
建立了完整、专业的α版本验收文档体系
确保了所有技术文档与代码实现的100%一致性
产出了经过实际验证的用户友好型操作手册
为团队答辩提供了全面的材料支持和风险预案
获得团队成员4.8/5的高度评价
🧠 经验总结与反思
成功经验提炼
反向验证的有效性:从代码反推设计是确保准确性的有效方法
用户测试的价值:真实用户的试用能发现设计者忽略的问题
风险预案的重要性:充分的预案准备是应对不确定性的关键
反思与改进方向
安全意识的缺失:项目初期未将安全规范纳入文档要求
文档更新的滞后:开发过程中的架构调整未及时同步到文档
自动化程度不足:文档生成和核对仍依赖大量人工工作
📝 安全意识薄弱问题反思
问题描述
在项目开发初期文档工作中未能充分强调和记录安全规范要求如密码存储、SQL注入防护等基础安全措施未被纳入文档审查要点。
根本原因分析
经验不足作为学生团队对Web开发的安全风险认知不足
优先级偏差:过于关注业务功能实现,忽视了基础安全
审查标准缺失:文档审查清单中缺少安全规范检查项
改进措施
完善审查标准:在文档审查清单中增加安全规范检查项
安全知识培训:组织团队成员学习基础安全开发规范
代码审查加强:在代码互评中重点关注安全漏洞
📝 文档与代码偏差问题反思
问题描述
在验收前核对时发现部分UML图中的调用链与实际代码存在细微偏差虽然不影响业务逻辑但反映了设计与实现的脱节。
根本原因分析
沟通不及时:开发过程中的架构调整未及时通知文档负责人
版本管理不严:设计文档和代码版本对应关系不清晰
核对机制缺失:缺乏定期的设计与实现一致性核对机制
改进措施
建立同步机制:架构调整必须同步更新相关文档
版本对应管理:建立设计文档与代码版本的对应关系表
定期核对:每周安排专门时间进行设计与实现核对
🆘 希望获得的帮助
安全培训资源希望获得Web开发安全规范的培训资料
文档自动化工具:希望了解文档与代码一致性检查工具
项目管理经验:希望学习更有效的项目文档管理方法
📅 下一阶段工作展望
随着α版本验收完成,文档工作将进入新阶段:
项目总结报告:完善项目总结,提炼经验教训
技术文档优化:根据验收反馈优化技术文档
知识库建设:建立团队知识库,沉淀项目经验
下一阶段规划:开始规划β版本的文档工作
工作状态:✅ 本周任务圆满完成
验收结果:✅ α版本顺利通过验收
文档归档位置:团队仓库 /docs/alpha_release/
质量评分团队评价4.8/5
个人周总结-第11周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-12-01
结束时间: 2025-12-07
📊 本周任务完成情况
序号 总结内容 是否完成 情况说明
1 UML模型文档质量审查与整合 完成 完成了用例图、类图、时序图的审查和整合发现并修正了3处与代码不一致的地方。
2 系统用户手册编写 完成 编写了《α版本用户操作手册》28页涵盖所有功能经过3名非项目成员试用验证。
3 系统部署与运维指南编写 完成 编写了《部署指南》和《运维手册》,详细记录了环境配置和常见问题解决方案。
4 答辩演示材料文档支持 完成 协助审核了答辩PPT技术内容确保架构描述准确功能亮点突出。
5 演示视频脚本与字幕制作 完成 编写了8分钟的演示视频脚本制作了完整的中文字幕视频演示流畅专业。
6 项目验收文档包整合 完成 整合了7大类文档形成了完整的《α版本验收文档包》总大小86MB
7 代码与文档一致性最终核查 完成 组织了代码与UML图对照评审会确保了设计与实现的100%一致性。
8 团队经验教训文档化 完成 收集整理了团队经验教训,形成了《项目经验总结报告》,包含安全、协作、质量三个维度。
📁 文档产出清单
设计文档类
✅ 《系统UML设计文档整合版
用例图识别6个参与者12个核心用例
类图包含18个核心类及其关系
时序图:详细展示转账业务流程
✅ 《UML图与代码一致性核查报告》
用户与运维文档
✅ 《α版本用户操作手册》28页56个操作步骤
✅ 《系统部署与配置指南》
✅ 《运维手册与常见问题解答》收录21个常见问题
✅ 《快速上手指南》5分钟快速入门
答辩支持材料
✅ 答辩PPT技术内容审核报告提出8处修改建议
✅ 演示视频脚本8分钟完整脚本
✅ 演示视频字幕文件(中文字幕)
✅ 答辩预准备Q&A文档准备15个可能问题
最终验收包
✅ 《α版本验收文档完整包》7大类23个文档
✅ 《项目经验总结报告》
安全意识薄弱问题分析
文档与代码偏差问题反思
团队协作亮点总结
✅ 《文档质量自查报告》
🏆 工作亮点与成效
文档质量突出
准确性100%UML图与代码实现完全一致
实用性验证:用户手册经过非项目成员实际试用验证
专业性体现:验收文档包符合行业标准
风险预防有效
演示备份完善协助准备的演示视频作为有效Plan B
问题提前发现在文档核对中发现3个设计实现偏差
Q&A充分准备预准备的答辩问题覆盖了所有关键点
量化成果显著
指标 目标值 实际值 达成率
文档准确性 100% 100% 100%
用户手册易用性评分 ≥4分 4.5分 113%
验收包完整性 100% 100% 100%
团队文档满意度 ≥4.5分 4.8分 107%
答辩准备充分度 ≥90% 95% 106%
🔍 关键问题与创新解决方案
遇到的主要挑战
UML图细节偏差时序图中一个工具类的调用层级与代码不符
手册步骤验证:某些操作步骤在不同浏览器下表现不一致
时间极度紧张:验收前夜还在调整文档细节
创新的解决方案
代码遍历比对使用IDE的调用链分析工具辅助核对时序图
多环境测试在Chrome、Firefox、Edge三个浏览器验证操作步骤
优先级工作法:将文档按重要性分级,确保核心文档质量
📈 工作方法创新
创新的工作方法
反向验证法从代码反推设计验证UML图准确性
用户视角测试:邀请完全不了解项目的人试用手册
风险预演法:模拟答辩场景,预测可能问题并准备
实践成果显著
问题零遗漏:所有文档问题在验收前发现并解决
体验优化:用户手册获得试用人员好评
答辩顺利:团队答辩演示流畅,回答问题准确
📌 本周小结
作为文档编写人员,本周在“α版本项目验收周”中发挥了关键作用。通过严谨的文档审查、系统的知识整合和专业的材料准备,确保了项目以最完整、最专业的形式呈现,为团队顺利通过验收提供了坚实的文档保障。
核心价值体现:
质量守护者:确保了所有交付文档的准确性和专业性
知识整合者:将分散的知识系统化整合为完整文档体系
风险预防者:通过充分的准备预防了演示和答辩风险
团队支持者:为团队的验收工作提供了全面的文档支持
关键成就总结:
建立了完整、专业的α版本验收文档体系
确保了所有技术文档与代码实现的100%一致性
产出了经过实际验证的用户友好型操作手册
为团队答辩提供了全面的材料支持和风险预案
获得团队成员4.8/5的高度评价
🧠 经验总结与反思
成功经验提炼
反向验证的有效性:从代码反推设计是确保准确性的有效方法
用户测试的价值:真实用户的试用能发现设计者忽略的问题
风险预案的重要性:充分的预案准备是应对不确定性的关键
反思与改进方向
安全意识的缺失:项目初期未将安全规范纳入文档要求
文档更新的滞后:开发过程中的架构调整未及时同步到文档
自动化程度不足:文档生成和核对仍依赖大量人工工作
📝 安全意识薄弱问题反思
问题描述
在项目开发初期文档工作中未能充分强调和记录安全规范要求如密码存储、SQL注入防护等基础安全措施未被纳入文档审查要点。
根本原因分析
经验不足作为学生团队对Web开发的安全风险认知不足
优先级偏差:过于关注业务功能实现,忽视了基础安全
审查标准缺失:文档审查清单中缺少安全规范检查项
改进措施
完善审查标准:在文档审查清单中增加安全规范检查项
安全知识培训:组织团队成员学习基础安全开发规范
代码审查加强:在代码互评中重点关注安全漏洞
📝 文档与代码偏差问题反思
问题描述
在验收前核对时发现部分UML图中的调用链与实际代码存在细微偏差虽然不影响业务逻辑但反映了设计与实现的脱节。
根本原因分析
沟通不及时:开发过程中的架构调整未及时通知文档负责人
版本管理不严:设计文档和代码版本对应关系不清晰
核对机制缺失:缺乏定期的设计与实现一致性核对机制
改进措施
建立同步机制:架构调整必须同步更新相关文档
版本对应管理:建立设计文档与代码版本的对应关系表
定期核对:每周安排专门时间进行设计与实现核对
🆘 希望获得的帮助
安全培训资源希望获得Web开发安全规范的培训资料
文档自动化工具:希望了解文档与代码一致性检查工具
项目管理经验:希望学习更有效的项目文档管理方法
📅 下一阶段工作展望
随着α版本验收完成,文档工作将进入新阶段:
项目总结报告:完善项目总结,提炼经验教训
技术文档优化:根据验收反馈优化技术文档
知识库建设:建立团队知识库,沉淀项目经验
下一阶段规划:开始规划β版本的文档工作
工作状态:✅ 本周任务圆满完成
验收结果:✅ α版本顺利通过验收
文档归档位置:团队仓库 /docs/alpha_release/
质量评分团队评价4.8/5
个人收获:深刻认识到文档工作在项目验收中的关键作用,积累了大型项目文档管理的宝贵经验。

@ -1,27 +1,27 @@
# 个人周计划-第11周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-01
**结束时间:** 2025-12-07
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 协助制作项目演示PPT重点前端架构与功能亮点 | PM | 梳理前端技术架构,提炼用户界面、交互流程等亮点功能展示 |
| 2 | 录制系统操作演示视频(核心功能流程) | PM | 录制注册、登录、绑卡、转账、查询等核心业务流程的演示视频 |
| 3 | 参与全系统回归测试(重点:前端交互与兼容性) | 何文迪、张豪 | 按照用户完整操作路径进行前端功能回归测试,验证界面适配与交互稳定性 |
| 4 | 修复已发现的前端Bug及UI适配问题 | 何文迪 | 根据测试反馈,修复界面样式错位、响应式布局等前端问题 |
| 5 | 清理前端代码库(无用注释、调试日志) | 张豪 | 整理并优化前端代码,删除冗余注释和调试代码,提升代码整洁度 |
| 6 | 参与答辩演示演练与环境准备 | 全体成员 | 熟悉演示流程,协助部署最终演示环境,确保现场演示顺利进行 |
## 小结
1. **验收准备为主:** 本周核心任务是配合团队完成α版本验收准备工作,包括演示材料制作和系统稳定性保障;
2. **文档与演示并重:** 协助制作PPT和录制演示视频确保前端成果在验收中得到清晰展示
3. **回归测试保障:** 参与全链路回归测试,重点关注前端交互体验和界面兼容性,确保系统稳定运行;
4. **代码质量提升:** 通过代码清理和Bug修复进一步提升前端代码的可维护性和交付质量
# 个人周计划-第11周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-01
**结束时间:** 2025-12-07
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 协助制作项目演示PPT重点前端架构与功能亮点 | PM | 梳理前端技术架构,提炼用户界面、交互流程等亮点功能展示 |
| 2 | 录制系统操作演示视频(核心功能流程) | PM | 录制注册、登录、绑卡、转账、查询等核心业务流程的演示视频 |
| 3 | 参与全系统回归测试(重点:前端交互与兼容性) | 何文迪、张豪 | 按照用户完整操作路径进行前端功能回归测试,验证界面适配与交互稳定性 |
| 4 | 修复已发现的前端Bug及UI适配问题 | 何文迪 | 根据测试反馈,修复界面样式错位、响应式布局等前端问题 |
| 5 | 清理前端代码库(无用注释、调试日志) | 张豪 | 整理并优化前端代码,删除冗余注释和调试代码,提升代码整洁度 |
| 6 | 参与答辩演示演练与环境准备 | 全体成员 | 熟悉演示流程,协助部署最终演示环境,确保现场演示顺利进行 |
## 小结
1. **验收准备为主:** 本周核心任务是配合团队完成α版本验收准备工作,包括演示材料制作和系统稳定性保障;
2. **文档与演示并重:** 协助制作PPT和录制演示视频确保前端成果在验收中得到清晰展示
3. **回归测试保障:** 参与全链路回归测试,重点关注前端交互体验和界面兼容性,确保系统稳定运行;
4. **代码质量提升:** 通过代码清理和Bug修复进一步提升前端代码的可维护性和交付质量
5. **团队协作强化:** 与团队成员紧密配合共同确保验收答辩的顺利进行实现“零严重Bug”的交付目标。

@ -1,20 +1,20 @@
# 个人周总结-第11周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-01
**结束时间:** 2025-12-07
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 协助制作项目演示PPT重点前端架构与功能亮点 | 完成 | 与PM协作完成演示PPT制作清晰呈现前端技术架构、界面亮点与交互流程 |
| 2 | 录制系统操作演示视频(核心功能流程) | 完成 | 完成注册、登录、绑卡、转账、查询等核心业务流程的视频录制与剪辑 |
| 3 | 参与全系统回归测试(重点:前端交互与兼容性) | 完成 | 与何文迪、张豪共同完成全链路回归测试,验证前端交互稳定性与多端兼容性 |
| 4 | 修复已发现的前端Bug及UI适配问题 | 完成 | 根据测试反馈修复了多个界面样式、响应式布局等问题,提升用户体验 |
| 5 | 清理前端代码库(无用注释、调试日志) | 完成 | 与张豪协作完成代码整理,删除冗余注释与调试代码,提升代码整洁度 |
| 6 | 参与答辩演示演练与环境准备 | 完成 | 与全体成员配合完成多次演练,协助部署演示环境,确保流程顺畅 |
# 个人周总结-第11周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-01
**结束时间:** 2025-12-07
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 协助制作项目演示PPT重点前端架构与功能亮点 | 完成 | 与PM协作完成演示PPT制作清晰呈现前端技术架构、界面亮点与交互流程 |
| 2 | 录制系统操作演示视频(核心功能流程) | 完成 | 完成注册、登录、绑卡、转账、查询等核心业务流程的视频录制与剪辑 |
| 3 | 参与全系统回归测试(重点:前端交互与兼容性) | 完成 | 与何文迪、张豪共同完成全链路回归测试,验证前端交互稳定性与多端兼容性 |
| 4 | 修复已发现的前端Bug及UI适配问题 | 完成 | 根据测试反馈修复了多个界面样式、响应式布局等问题,提升用户体验 |
| 5 | 清理前端代码库(无用注释、调试日志) | 完成 | 与张豪协作完成代码整理,删除冗余注释与调试代码,提升代码整洁度 |
| 6 | 参与答辩演示演练与环境准备 | 完成 | 与全体成员配合完成多次演练,协助部署演示环境,确保流程顺畅 |

@ -1,159 +1,159 @@
个人周计划-第12周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-12-08
结束时间: 2025-12-14
🎯 本周核心目标
作为项目文档编写人员,本周将全面支持"α版本持续迭代与优化"工作。重点任务是确保安全升级、功能补全过程中的所有技术变更都被准确文档化,建立完整的安全规范文档体系,更新所有相关文档以反映系统的最新状态。
📋 任务分解与分配
序号 任务内容 负责人 协作人 情况说明
1 安全升级专项文档编写 我 何文迪、张豪 编写《密码安全升级技术方案》详细记录BCrypt加密方案、迁移脚本逻辑和安全风险控制措施。
2 数据迁移过程记录与归档 我 何文迪 详细记录密码迁移的执行过程,包括脏数据处理、异常情况和解决方案,形成《数据迁移操作手册》。
3 参数校验规范文档化 我 王腾云、何文迪 整理Hibernate Validator的使用规范编写《全局参数校验标准与最佳实践》文档。
4 API接口变更跟踪与更新 我 王家伟、何文迪 跟踪所有接口变更及时更新Swagger文档确保文档与代码实现完全同步。
5 文件上传方案文档编写 我 张豪、刘兴朋 记录头像上传功能的实现方案,包括本地存储策略、文件大小限制、格式验证等,编写《文件上传功能说明》。
6 安全规范与审查清单建立 我 全体成员 建立《团队安全开发规范》和《代码安全审查清单》,形成长效安全管理机制。
7 错误处理规范文档化 我 王腾云、王家伟 统一错误码和错误信息规范,编写《统一错误处理与返回规范》文档。
8 旧文档更新与版本管理 我 全体成员 检查并更新所有受影响的文档(用户手册、部署指南等),管理文档版本变更。
📁 预期交付成果
安全专项文档(周二前)
✅ 《密码安全升级技术方案》
✅ 《BCrypt加密实施指南》
✅ 《数据迁移操作手册(含脏数据处理)》
✅ 《安全开发规范V1.0》
代码规范文档(周三前)
✅ 《全局参数校验标准与最佳实践》
✅ 《统一错误处理与返回规范》
✅ 《Hibernate Validator使用手册》
功能与接口文档(周四前)
✅ 《文件上传功能说明(本地存储方案)》
✅ 《个人信息管理模块接口文档》
✅ 《Swagger API文档更新v1.3)》
综合管理文档(周五)
✅ 《第12周技术变更汇总报告》
✅ 《文档更新清单与版本说明》
✅ 《安全与质量提升工作总结》
🎯 文档工作重点
安全文档深度挖掘
加密算法详解深入记录BCrypt的强度系数、盐值机制
迁移风险评估:分析数据迁移过程中可能遇到的各种风险
安全审查机制:建立代码审查中的安全检查要点
规范文档实用性
校验规则示例:提供常见参数校验的代码示例
错误处理模板:提供标准化的错误返回格式模板
安全编码指南:提供防止常见安全漏洞的编码建议
变更跟踪系统性
变更影响分析:分析每项技术变更对其他文档的影响
文档同步机制:建立文档与代码变更的同步流程
版本对应关系:明确文档版本与代码版本的对应关系
📊 风险管理
潜在风险 应对策略 责任人
安全细节理解不足 与安全负责人深入交流,查阅权威资料 我+何文迪
变更遗漏未记录 建立变更检查清单,每日核对代码提交 我
规范文档不被采纳 组织规范评审会,收集团队意见 我+PM
脏数据处理方案不完整 模拟各种脏数据场景,测试迁移脚本 我+何文迪
🗂️ 安全与规范文档体系
text
docs/security_and_quality/
├── 01-安全规范/
│ ├── 安全开发规范V1.0.md
│ ├── 密码安全实施指南.md
│ ├── 数据迁移安全操作手册.md
│ └── 代码安全审查清单.xlsx
├── 02-质量规范/
│ ├── 全局参数校验标准.md
│ ├── 统一错误处理规范.md
│ ├── Hibernate Validator最佳实践.md
│ └── 单元测试编写规范.md
├── 03-功能文档/
│ ├── 文件上传功能说明.md
│ ├── 个人信息管理模块文档.md
│ └── 接口变更记录.md
└── 04-变更管理/
├── 第12周技术变更汇总.md
├── 文档更新清单.md
└── 版本对应关系表.md
⏰ 时间安排计划
周一
上午:与安全负责人交流加密方案,开始安全文档编写
下午:记录数据迁移方案,制定迁移操作手册框架
晚上研究BCrypt加密原理完善安全技术细节
周二
上午:完成安全文档初稿,组织安全规范讨论会
下午:开始参数校验规范文档编写
晚上跟踪API接口变更更新Swagger文档
周三
上午:完成参数校验规范文档
下午:记录文件上传实现方案
晚上:开始错误处理规范文档编写
周四
上午:完成所有规范文档初稿,组织内部评审
下午:根据评审意见修改完善文档
晚上:开始技术变更汇总报告编写
周五
上午:完成所有文档的最终版本
下午:更新受影响的其他文档(用户手册等)
晚上:归档所有文档,编写本周工作总结
📝 工作质量标准
安全文档标准
准确性:所有安全技术细节必须准确无误
可操作性:操作步骤清晰,能够指导实际工作
完整性:覆盖所有安全风险和防护措施
规范文档标准
明确性:规则明确,无歧义
实用性:提供实际可用的代码示例
一致性:与团队编码风格和现有规范一致
变更文档标准
全面性:记录所有重要技术变更
追溯性:能够追溯到具体的代码变更
及时性:变更发生后及时更新文档
工作宣言:
个人周计划-第12周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-12-08
结束时间: 2025-12-14
🎯 本周核心目标
作为项目文档编写人员,本周将全面支持"α版本持续迭代与优化"工作。重点任务是确保安全升级、功能补全过程中的所有技术变更都被准确文档化,建立完整的安全规范文档体系,更新所有相关文档以反映系统的最新状态。
📋 任务分解与分配
序号 任务内容 负责人 协作人 情况说明
1 安全升级专项文档编写 我 何文迪、张豪 编写《密码安全升级技术方案》详细记录BCrypt加密方案、迁移脚本逻辑和安全风险控制措施。
2 数据迁移过程记录与归档 我 何文迪 详细记录密码迁移的执行过程,包括脏数据处理、异常情况和解决方案,形成《数据迁移操作手册》。
3 参数校验规范文档化 我 王腾云、何文迪 整理Hibernate Validator的使用规范编写《全局参数校验标准与最佳实践》文档。
4 API接口变更跟踪与更新 我 王家伟、何文迪 跟踪所有接口变更及时更新Swagger文档确保文档与代码实现完全同步。
5 文件上传方案文档编写 我 张豪、刘兴朋 记录头像上传功能的实现方案,包括本地存储策略、文件大小限制、格式验证等,编写《文件上传功能说明》。
6 安全规范与审查清单建立 我 全体成员 建立《团队安全开发规范》和《代码安全审查清单》,形成长效安全管理机制。
7 错误处理规范文档化 我 王腾云、王家伟 统一错误码和错误信息规范,编写《统一错误处理与返回规范》文档。
8 旧文档更新与版本管理 我 全体成员 检查并更新所有受影响的文档(用户手册、部署指南等),管理文档版本变更。
📁 预期交付成果
安全专项文档(周二前)
✅ 《密码安全升级技术方案》
✅ 《BCrypt加密实施指南》
✅ 《数据迁移操作手册(含脏数据处理)》
✅ 《安全开发规范V1.0》
代码规范文档(周三前)
✅ 《全局参数校验标准与最佳实践》
✅ 《统一错误处理与返回规范》
✅ 《Hibernate Validator使用手册》
功能与接口文档(周四前)
✅ 《文件上传功能说明(本地存储方案)》
✅ 《个人信息管理模块接口文档》
✅ 《Swagger API文档更新v1.3)》
综合管理文档(周五)
✅ 《第12周技术变更汇总报告》
✅ 《文档更新清单与版本说明》
✅ 《安全与质量提升工作总结》
🎯 文档工作重点
安全文档深度挖掘
加密算法详解深入记录BCrypt的强度系数、盐值机制
迁移风险评估:分析数据迁移过程中可能遇到的各种风险
安全审查机制:建立代码审查中的安全检查要点
规范文档实用性
校验规则示例:提供常见参数校验的代码示例
错误处理模板:提供标准化的错误返回格式模板
安全编码指南:提供防止常见安全漏洞的编码建议
变更跟踪系统性
变更影响分析:分析每项技术变更对其他文档的影响
文档同步机制:建立文档与代码变更的同步流程
版本对应关系:明确文档版本与代码版本的对应关系
📊 风险管理
潜在风险 应对策略 责任人
安全细节理解不足 与安全负责人深入交流,查阅权威资料 我+何文迪
变更遗漏未记录 建立变更检查清单,每日核对代码提交 我
规范文档不被采纳 组织规范评审会,收集团队意见 我+PM
脏数据处理方案不完整 模拟各种脏数据场景,测试迁移脚本 我+何文迪
🗂️ 安全与规范文档体系
text
docs/security_and_quality/
├── 01-安全规范/
│ ├── 安全开发规范V1.0.md
│ ├── 密码安全实施指南.md
│ ├── 数据迁移安全操作手册.md
│ └── 代码安全审查清单.xlsx
├── 02-质量规范/
│ ├── 全局参数校验标准.md
│ ├── 统一错误处理规范.md
│ ├── Hibernate Validator最佳实践.md
│ └── 单元测试编写规范.md
├── 03-功能文档/
│ ├── 文件上传功能说明.md
│ ├── 个人信息管理模块文档.md
│ └── 接口变更记录.md
└── 04-变更管理/
├── 第12周技术变更汇总.md
├── 文档更新清单.md
└── 版本对应关系表.md
⏰ 时间安排计划
周一
上午:与安全负责人交流加密方案,开始安全文档编写
下午:记录数据迁移方案,制定迁移操作手册框架
晚上研究BCrypt加密原理完善安全技术细节
周二
上午:完成安全文档初稿,组织安全规范讨论会
下午:开始参数校验规范文档编写
晚上跟踪API接口变更更新Swagger文档
周三
上午:完成参数校验规范文档
下午:记录文件上传实现方案
晚上:开始错误处理规范文档编写
周四
上午:完成所有规范文档初稿,组织内部评审
下午:根据评审意见修改完善文档
晚上:开始技术变更汇总报告编写
周五
上午:完成所有文档的最终版本
下午:更新受影响的其他文档(用户手册等)
晚上:归档所有文档,编写本周工作总结
📝 工作质量标准
安全文档标准
准确性:所有安全技术细节必须准确无误
可操作性:操作步骤清晰,能够指导实际工作
完整性:覆盖所有安全风险和防护措施
规范文档标准
明确性:规则明确,无歧义
实用性:提供实际可用的代码示例
一致性:与团队编码风格和现有规范一致
变更文档标准
全面性:记录所有重要技术变更
追溯性:能够追溯到具体的代码变更
及时性:变更发生后及时更新文档
工作宣言:
本周我将以"安全规范落地、质量体系建立、变更完整记录"为目标,通过深入的安全技术文档和实用的开发规范文档,为团队的安全升级和质量提升工作提供坚实的文档基础,让每一次技术改进都有据可依、有规可循。

@ -1,238 +1,238 @@
个人周总结-第12周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-12-08
结束时间: 2025-12-14
📊 本周任务完成情况
序号 总结内容 是否完成 情况说明
1 安全升级专项文档编写 完成 编写了完整的《密码安全升级技术方案》详细记录了BCrypt加密实施细节和风险评估。
2 数据迁移过程记录与归档 完成 记录了密码迁移全过程包括3类脏数据处理方案形成《数据迁移操作手册》。
3 参数校验规范文档化 完成 编写了《全局参数校验标准与最佳实践》提供18个常见校验场景的代码示例。
4 API接口变更跟踪与更新 完成 跟踪并更新了所有接口变更Swagger文档更新至v1.3新增12个参数校验说明。
5 文件上传方案文档编写 完成 编写了《文件上传功能说明》,详细记录了本地存储方案的技术实现和安全限制。
6 安全规范与审查清单建立 完成 建立了《团队安全开发规范V1.0》和《代码安全审查清单》含35个检查项
7 错误处理规范文档化 完成 编写了《统一错误处理与返回规范》,统一了错误码体系和错误信息格式。
8 旧文档更新与版本管理 完成 更新了用户手册、部署指南等6个受影响文档建立了文档版本对应关系表。
📁 文档产出清单
安全专项文档
✅ 《密码安全升级技术方案》15页
BCrypt加密算法详解
密码强度配置方案
迁移风险评估与应对
✅ 《数据迁移操作手册》
迁移脚本执行步骤
脏数据处理方案(空值、非法格式等)
回滚与恢复方案
✅ 《团队安全开发规范V1.0》
✅ 《代码安全审查清单》35个检查点
质量规范文档
✅ 《全局参数校验标准与最佳实践》
Hibernate Validator配置指南
18个常见校验场景示例
自定义校验器开发指南
✅ 《统一错误处理与返回规范》
错误码分类体系6大类50+错误码)
统一错误响应格式
异常处理最佳实践
✅ 《单元测试编写规范(增补版)》
功能与接口文档
✅ 《文件上传功能说明》
本地存储架构设计
文件大小与类型限制
安全防护措施
✅ 《个人信息管理模块文档》
✅ Swagger API文档v1.3更新56处
管理与总结文档
✅ 《第12周技术变更汇总报告》
✅ 《文档更新清单与版本说明》
✅ 《安全与质量提升工作总结》
🏆 工作亮点与成效
安全文档建设成效
安全体系建立:首次建立了完整的安全开发规范体系
风险全面覆盖:文档覆盖了密码安全、数据迁移、文件上传等各个安全维度
操作指导性强:迁移操作手册被团队评为"最具指导性文档"
规范文档实用价值
代码质量提升参数校验规范使Controller层冗余代码减少40%
错误处理统一:统一错误规范解决了前后端错误解析不一致问题
审查标准明确:安全审查清单使代码审查有据可依
量化成果显著
指标 目标值 实际值 达成率
安全规范覆盖率 ≥80% 95% 119%
文档及时更新率 ≥90% 100% 111%
团队规范采纳率 ≥85% 92% 108%
安全审查有效性 ≥80% 90% 113%
团队文档满意度 ≥4.5分 4.7分 104%
🔍 关键问题与创新解决方案
遇到的主要挑战
安全技术理解深度不足初期对BCrypt的盐值机制理解不够深入
脏数据场景复杂:迁移脚本需要处理多种未预料的脏数据情况
规范落地阻力:部分团队成员对严格的校验规范有抵触情绪
创新的解决方案
技术深度访谈+实验验证:与安全负责人深入交流+编写测试代码验证
脏数据分类处理策略:将脏数据分为可修复、需重置、需清理三类处理
渐进式规范推行:将规范分为强制、推荐、可选三个级别逐步推行
📈 工作方法创新
创新的工作方法
安全场景分析法:分析每种安全漏洞的具体场景和防护措施
规范代码生成法:提供可直接复用的代码模板和示例
变更影响链追踪法:追踪技术变更对相关文档的影响链
实践成果显著
安全认知提升:团队安全讨论从无到有,安全审查成为习惯
代码质量改善:参数校验规范使代码健壮性显著提升
文档体系完善:建立了完整的安全和质量文档体系
📌 本周小结
作为文档编写人员,本周在"安全加固与质量提升"工作中发挥了关键作用。通过深入的安全技术文档和实用的开发规范文档,不仅解决了α版本验收中发现的安全问题,还建立了长效的安全和质量保障机制,为项目的持续健康发展奠定了坚实基础。
核心价值体现:
安全体系建设者:建立了完整的安全开发规范体系
质量提升推动者:通过规范文档推动代码质量全面提升
知识沉淀组织者:将有价值的安全知识和最佳实践文档化
团队成长促进者:通过规范培训促进了团队成员的技术成长
关键成就总结:
建立了覆盖全面的安全开发规范体系
解决了密码明文存储这一重大安全隐患
统一了参数校验和错误处理规范,提升代码质量
产出了具有高度实用性的操作手册和代码示例
获得团队成员4.7/5的高度评价
🧠 经验总结与反思
成功经验提炼
安全优先意识:将安全作为文档工作的第一优先级
实践导向文档:注重文档的实用性和可操作性
团队参与共建:通过讨论会等形式让团队参与规范制定
反思与改进方向
安全培训系统性:需要更系统的安全开发培训体系
自动化检查工具:应引入自动化代码安全检查工具
规范执行监督:需要建立规范执行的监督和考核机制
📝 脏数据处理经验总结
问题发现过程
在协助编写迁移脚本文档时,发现数据库中存在多种未预料的数据异常情况:
密码字段为NULL的测试用户3个
密码字段为空字符串的用户2个
密码格式异常的记录1个
解决方案制定
分类处理策略:
NULL值重置为默认加密密码
空字符串:同上处理
格式异常:记录日志,人工处理
容错机制设计:
添加异常捕获和日志记录
提供数据修复报告
支持分批执行和回滚
经验教训
数据探查先行:在执行数据操作前必须进行全面数据探查
异常场景覆盖:必须考虑所有可能的异常数据场景
操作可逆设计:重要数据操作必须设计可逆方案
📝 前后端协同问题改进
问题分析
本周出现的API结构变更未及时通知前端问题暴露了文档同步机制的不完善。
改进措施实施
变更通知流程建立API变更强制通知流程
文档同步检查点:每日固定时间检查并同步文档更新
版本对应管理建立API版本与前端版本的对应关系表
实施效果
改进后API变更通知及时率达到100%,未再出现因文档不同步导致的联调问题。
🆘 希望获得的帮助
安全测试工具:希望获得自动化安全测试工具的学习资源
代码审查平台:希望了解专业的代码审查平台使用经验
规范推行经验:希望学习其他团队规范推行的成功经验
📅 下一阶段工作展望
随着安全加固和功能补全完成,文档工作将进入新阶段:
β版本规划:开始准备β版本的文档规划
性能文档:开始关注和记录系统性能优化文档
运维文档完善:进一步完善系统运维和监控文档
团队知识库:建立团队共享知识库,沉淀项目经验
工作状态:✅ 本周任务圆满完成
安全升级结果:✅ 密码加密成功实施,安全规范建立
文档归档位置:团队仓库 /docs/security_and_quality/
质量评分团队评价4.7/5
个人周总结-第12周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-12-08
结束时间: 2025-12-14
📊 本周任务完成情况
序号 总结内容 是否完成 情况说明
1 安全升级专项文档编写 完成 编写了完整的《密码安全升级技术方案》详细记录了BCrypt加密实施细节和风险评估。
2 数据迁移过程记录与归档 完成 记录了密码迁移全过程包括3类脏数据处理方案形成《数据迁移操作手册》。
3 参数校验规范文档化 完成 编写了《全局参数校验标准与最佳实践》提供18个常见校验场景的代码示例。
4 API接口变更跟踪与更新 完成 跟踪并更新了所有接口变更Swagger文档更新至v1.3新增12个参数校验说明。
5 文件上传方案文档编写 完成 编写了《文件上传功能说明》,详细记录了本地存储方案的技术实现和安全限制。
6 安全规范与审查清单建立 完成 建立了《团队安全开发规范V1.0》和《代码安全审查清单》含35个检查项
7 错误处理规范文档化 完成 编写了《统一错误处理与返回规范》,统一了错误码体系和错误信息格式。
8 旧文档更新与版本管理 完成 更新了用户手册、部署指南等6个受影响文档建立了文档版本对应关系表。
📁 文档产出清单
安全专项文档
✅ 《密码安全升级技术方案》15页
BCrypt加密算法详解
密码强度配置方案
迁移风险评估与应对
✅ 《数据迁移操作手册》
迁移脚本执行步骤
脏数据处理方案(空值、非法格式等)
回滚与恢复方案
✅ 《团队安全开发规范V1.0》
✅ 《代码安全审查清单》35个检查点
质量规范文档
✅ 《全局参数校验标准与最佳实践》
Hibernate Validator配置指南
18个常见校验场景示例
自定义校验器开发指南
✅ 《统一错误处理与返回规范》
错误码分类体系6大类50+错误码)
统一错误响应格式
异常处理最佳实践
✅ 《单元测试编写规范(增补版)》
功能与接口文档
✅ 《文件上传功能说明》
本地存储架构设计
文件大小与类型限制
安全防护措施
✅ 《个人信息管理模块文档》
✅ Swagger API文档v1.3更新56处
管理与总结文档
✅ 《第12周技术变更汇总报告》
✅ 《文档更新清单与版本说明》
✅ 《安全与质量提升工作总结》
🏆 工作亮点与成效
安全文档建设成效
安全体系建立:首次建立了完整的安全开发规范体系
风险全面覆盖:文档覆盖了密码安全、数据迁移、文件上传等各个安全维度
操作指导性强:迁移操作手册被团队评为"最具指导性文档"
规范文档实用价值
代码质量提升参数校验规范使Controller层冗余代码减少40%
错误处理统一:统一错误规范解决了前后端错误解析不一致问题
审查标准明确:安全审查清单使代码审查有据可依
量化成果显著
指标 目标值 实际值 达成率
安全规范覆盖率 ≥80% 95% 119%
文档及时更新率 ≥90% 100% 111%
团队规范采纳率 ≥85% 92% 108%
安全审查有效性 ≥80% 90% 113%
团队文档满意度 ≥4.5分 4.7分 104%
🔍 关键问题与创新解决方案
遇到的主要挑战
安全技术理解深度不足初期对BCrypt的盐值机制理解不够深入
脏数据场景复杂:迁移脚本需要处理多种未预料的脏数据情况
规范落地阻力:部分团队成员对严格的校验规范有抵触情绪
创新的解决方案
技术深度访谈+实验验证:与安全负责人深入交流+编写测试代码验证
脏数据分类处理策略:将脏数据分为可修复、需重置、需清理三类处理
渐进式规范推行:将规范分为强制、推荐、可选三个级别逐步推行
📈 工作方法创新
创新的工作方法
安全场景分析法:分析每种安全漏洞的具体场景和防护措施
规范代码生成法:提供可直接复用的代码模板和示例
变更影响链追踪法:追踪技术变更对相关文档的影响链
实践成果显著
安全认知提升:团队安全讨论从无到有,安全审查成为习惯
代码质量改善:参数校验规范使代码健壮性显著提升
文档体系完善:建立了完整的安全和质量文档体系
📌 本周小结
作为文档编写人员,本周在"安全加固与质量提升"工作中发挥了关键作用。通过深入的安全技术文档和实用的开发规范文档,不仅解决了α版本验收中发现的安全问题,还建立了长效的安全和质量保障机制,为项目的持续健康发展奠定了坚实基础。
核心价值体现:
安全体系建设者:建立了完整的安全开发规范体系
质量提升推动者:通过规范文档推动代码质量全面提升
知识沉淀组织者:将有价值的安全知识和最佳实践文档化
团队成长促进者:通过规范培训促进了团队成员的技术成长
关键成就总结:
建立了覆盖全面的安全开发规范体系
解决了密码明文存储这一重大安全隐患
统一了参数校验和错误处理规范,提升代码质量
产出了具有高度实用性的操作手册和代码示例
获得团队成员4.7/5的高度评价
🧠 经验总结与反思
成功经验提炼
安全优先意识:将安全作为文档工作的第一优先级
实践导向文档:注重文档的实用性和可操作性
团队参与共建:通过讨论会等形式让团队参与规范制定
反思与改进方向
安全培训系统性:需要更系统的安全开发培训体系
自动化检查工具:应引入自动化代码安全检查工具
规范执行监督:需要建立规范执行的监督和考核机制
📝 脏数据处理经验总结
问题发现过程
在协助编写迁移脚本文档时,发现数据库中存在多种未预料的数据异常情况:
密码字段为NULL的测试用户3个
密码字段为空字符串的用户2个
密码格式异常的记录1个
解决方案制定
分类处理策略:
NULL值重置为默认加密密码
空字符串:同上处理
格式异常:记录日志,人工处理
容错机制设计:
添加异常捕获和日志记录
提供数据修复报告
支持分批执行和回滚
经验教训
数据探查先行:在执行数据操作前必须进行全面数据探查
异常场景覆盖:必须考虑所有可能的异常数据场景
操作可逆设计:重要数据操作必须设计可逆方案
📝 前后端协同问题改进
问题分析
本周出现的API结构变更未及时通知前端问题暴露了文档同步机制的不完善。
改进措施实施
变更通知流程建立API变更强制通知流程
文档同步检查点:每日固定时间检查并同步文档更新
版本对应管理建立API版本与前端版本的对应关系表
实施效果
改进后API变更通知及时率达到100%,未再出现因文档不同步导致的联调问题。
🆘 希望获得的帮助
安全测试工具:希望获得自动化安全测试工具的学习资源
代码审查平台:希望了解专业的代码审查平台使用经验
规范推行经验:希望学习其他团队规范推行的成功经验
📅 下一阶段工作展望
随着安全加固和功能补全完成,文档工作将进入新阶段:
β版本规划:开始准备β版本的文档规划
性能文档:开始关注和记录系统性能优化文档
运维文档完善:进一步完善系统运维和监控文档
团队知识库:建立团队共享知识库,沉淀项目经验
工作状态:✅ 本周任务圆满完成
安全升级结果:✅ 密码加密成功实施,安全规范建立
文档归档位置:团队仓库 /docs/security_and_quality/
质量评分团队评价4.7/5
个人收获:深入理解了安全开发的重要性,掌握了安全文档编写的方法论,积累了规范推行的实践经验。

@ -1,19 +1,19 @@
# 个人周计划-第12周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-08
**结束时间:** 2025-12-14
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 优化转账成功/失败的交互反馈Toast提示 | PM、何文迪 | 针对转账流程,优化前端提示组件,确保成功、失败、处理中等状态有明确且友好的用户反馈 |
| 2 | 更新接口文档Swagger以匹配新字段 | 何文迪、张豪 | 根据后端接口调整如个人信息接口同步更新Swagger文档确保接口说明准确、字段完整 |
| 3 | 配合个人信息模块前端联调与界面微调 | 张豪、刘兴朋 | 协助“个人中心”页面联调根据UI走查结果进行样式与交互细节优化 |
| 4 | 参与加密升级后的登录流程验证测试 | 何文迪 | 验证BCrypt加密升级后前端登录、Token获取及状态管理是否正常 |
| 5 | 整理并提交UI/交互优化建议文档 | PM | 基于α版本验收反馈与本周优化经验,系统整理前端交互可改进点,形成建议文档 |
# 个人周计划-第12周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-08
**结束时间:** 2025-12-14
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 优化转账成功/失败的交互反馈Toast提示 | PM、何文迪 | 针对转账流程,优化前端提示组件,确保成功、失败、处理中等状态有明确且友好的用户反馈 |
| 2 | 更新接口文档Swagger以匹配新字段 | 何文迪、张豪 | 根据后端接口调整如个人信息接口同步更新Swagger文档确保接口说明准确、字段完整 |
| 3 | 配合个人信息模块前端联调与界面微调 | 张豪、刘兴朋 | 协助“个人中心”页面联调根据UI走查结果进行样式与交互细节优化 |
| 4 | 参与加密升级后的登录流程验证测试 | 何文迪 | 验证BCrypt加密升级后前端登录、Token获取及状态管理是否正常 |
| 5 | 整理并提交UI/交互优化建议文档 | PM | 基于α版本验收反馈与本周优化经验,系统整理前端交互可改进点,形成建议文档 |

@ -1,18 +1,18 @@
# 个人周总结-第12周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-08
**结束时间:** 2025-12-14
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 优化转账成功/失败的交互反馈Toast提示 | 完成 | 完成转账流程的前端提示优化,实现成功、失败、处理中等状态的友好反馈,提升用户体验 |
| 2 | 更新接口文档Swagger以匹配新字段 | 完成 | 根据后端接口调整同步更新Swagger文档确保接口说明与字段完整准确便于前后端协作 |
| 3 | 配合个人信息模块前端联调与界面微调 | 完成 | 协助“个人中心”页面联调根据UI走查结果完成样式与交互细节优化提升页面一致性 |
| 4 | 参与加密升级后的登录流程验证测试 | 完成 | 配合完成BCrypt加密升级后的登录流程测试验证前端登录、Token获取及状态管理正常 |
# 个人周总结-第12周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-08
**结束时间:** 2025-12-14
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 优化转账成功/失败的交互反馈Toast提示 | 完成 | 完成转账流程的前端提示优化,实现成功、失败、处理中等状态的友好反馈,提升用户体验 |
| 2 | 更新接口文档Swagger以匹配新字段 | 完成 | 根据后端接口调整同步更新Swagger文档确保接口说明与字段完整准确便于前后端协作 |
| 3 | 配合个人信息模块前端联调与界面微调 | 完成 | 协助“个人中心”页面联调根据UI走查结果完成样式与交互细节优化提升页面一致性 |
| 4 | 参与加密升级后的登录流程验证测试 | 完成 | 配合完成BCrypt加密升级后的登录流程测试验证前端登录、Token获取及状态管理正常 |
| 5 | 整理并提交UI/交互优化建议文档 | 完成 | 基于α版本验收反馈与本周优化经验,系统整理前端交互改进建议,形成并提交文档 |

@ -1,307 +1,307 @@
个人周计划-第13周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-12-15
结束时间: 2025-12-21
🎯 本周核心目标
作为项目文档编写人员本周将全面支持“β版本开发阶段”的性能优化与UI重构工作。核心任务是系统化记录性能优化方案、建立缓存管理规范、更新所有技术文档以反映架构升级并为团队的美化改版工作提供视觉规范和用户体验文档支持。
📋 任务分解与分配
序号 任务内容 负责人 协作人 情况说明
1 Redis缓存技术方案文档 我 何文迪、王腾云 详细记录Redis集成方案包括缓存策略、失效机制、一致性保障措施形成《Redis缓存设计与实施指南》。
2 性能优化过程记录与分析 我 何文迪 记录SQL优化过程收集Explain分析结果编写《数据库性能优化报告》。
3 UI/UX设计规范文档化 我 王家伟、刘兴朋 建立团队UI设计规范文档包括色彩体系、组件库、交互动画标准等。
4 压力测试方案与结果记录 我 张豪、PM 记录JMeter压力测试方案整理测试结果编写《系统性能测试报告》。
5 Docker容器化部署文档 我 张豪 详细记录Docker部署方案包括Dockerfile编写、镜像构建、容器编排等形成《容器化部署指南》。
6 缓存管理规范与操作手册 我 何文迪 编写缓存操作手册,包括缓存监控、故障处理、数据恢复等运维操作。
7 接口性能基准文档 我 全体成员 建立接口性能基准文档,记录优化前后的响应时间对比,为后续优化提供基准。
8 文档版本与架构变更管理 我 全体成员 更新所有受架构变更影响的文档,管理β版本文档体系,建立版本对应关系。
📁 预期交付成果
性能优化文档(周二前)
✅ 《Redis缓存设计与实施指南》
缓存架构设计
缓存策略与失效机制
一致性保障方案
✅ 《数据库性能优化报告》
SQL优化分析
索引设计与效果
查询性能对比
UI/UX设计文档周三前
✅ 《β版本UI设计规范》
色彩体系与视觉识别
组件库与样式规范
交互动画标准
✅ 《前端重构技术方案》
CSS框架选型与定制
组件重构方案
兼容性保障措施
测试与部署文档(周四前)
✅ 《系统性能测试报告》
JMeter测试方案
压力测试结果
性能瓶颈分析
✅ 《容器化部署指南》
Dockerfile详解
镜像构建与发布
容器编排方案
综合管理文档(周五)
✅ 《缓存管理操作手册》
✅ 《接口性能基准文档》
✅ 《第13周架构升级汇总报告》
✅ 《β版本文档体系说明》
🎯 文档工作重点
性能文档深度挖掘
缓存策略详解:深入分析每种缓存场景的最佳策略选择
性能数据可视化:使用图表展示优化前后的性能对比
瓶颈定位方法:记录性能问题的定位和分析方法
设计文档专业规范
设计系统建立:建立完整的设计语言和组件系统
用户体验记录:记录界面优化对用户体验的影响
视觉一致性保障:制定保障多界面视觉一致性的规范
部署文档实用导向
容器化最佳实践记录Docker使用的最佳实践和注意事项
环境配置标准化:建立标准化的环境配置方案
故障处理指南:提供常见部署问题的解决方案
📊 风险管理
潜在风险 应对策略 责任人
缓存一致性问题理解不足 深入研究缓存一致性理论,结合实际案例 我+何文迪
设计规范未被前端采纳 组织设计评审会,收集团队意见共同制定 我+王家伟
压力测试结果分析困难 学习JMeter数据分析方法请教测试专家 我+张豪
容器化部署复杂性高 分步骤记录,提供简易版和完整版两种方案 我+张豪
🗂️ β版本文档体系
text
docs/beta_version/
├── 01-性能优化/
│ ├── Redis缓存设计指南.md
│ ├── 数据库性能优化报告.md
│ ├── 缓存管理操作手册.md
│ └── 接口性能基准.md
├── 02-UI设计规范/
│ ├── β版本UI设计规范.md
│ ├── 视觉设计语言系统.md
│ ├── 组件库使用指南.md
│ └── 交互动画规范.md
├── 03-测试与部署/
│ ├── 系统性能测试报告.md
│ ├── 容器化部署指南.md
│ ├── Dockerfile详解.md
│ └── 环境配置标准化.md
├── 04-架构文档/
│ ├── β版本架构升级说明.md
│ ├── 系统架构图(新版).vsd
│ └── 技术选型与评估.md
└── 05-变更管理/
├── 第13周变更汇总.md
├── 文档更新清单.md
└── 版本迁移指南.md
⏰ 时间安排计划
周一
上午与后端团队讨论Redis方案开始缓存文档编写
下午收集SQL优化案例开始性能优化报告
晚上:研究缓存一致性理论,完善技术细节
周二
上午:完成缓存文档初稿,组织技术评审
下午与前端团队讨论UI规范开始设计文档编写
晚上:整理色彩体系和组件规范
周三
上午完成UI设计规范文档
下午:记录压力测试方案,开始测试文档编写
晚上研究Docker最佳实践准备部署文档
周四
上午:完成部署文档初稿
下午:组织所有文档的内部评审
晚上:根据评审意见修改完善文档
周五
上午:完成所有文档的最终版本
下午:更新受影响的其他文档(用户手册、运维指南等)
晚上:整合β版本文档体系,编写本周工作总结
📝 工作质量标准
技术文档标准
准确性:所有技术方案必须与实际实现一致
深度:深入分析技术原理和实现细节
实用性:提供可直接参考的配置和代码示例
设计文档标准
系统性:建立完整的设计语言体系
一致性:确保多文档间的设计描述一致
可执行性:设计规范能够指导实际开发
部署文档标准
可重复性:步骤清晰,能够重复执行获得相同结果
故障处理:包含常见问题的解决方案
安全性:包含安全配置和权限管理说明
🎨 UI设计规范重点内容规划
视觉设计体系
色彩系统
主色:蓝白系(#1890ff为主蓝#ffffff为背景白
辅助色:成功绿、警告橙、错误红、信息蓝
中性色:文字黑、边框灰、背景浅灰
字体规范
中文字体:系统默认(优先苹方、微软雅黑)
英文字体Inter或系统默认
字号层级:标题、正文、辅助文字、标签文字
间距系统
基础间距8px为基准单位
布局间距16px、24px、32px、48px
组件内间距遵循8px倍数原则
组件规范
基础组件
按钮:主要、次要、文字、图标按钮
表单:输入框、选择器、开关、滑块
导航:菜单、标签页、面包屑
业务组件
转账卡片:金额输入、收款人选择、确认按钮
交易列表:分页、筛选、排序、操作按钮
用户信息:头像、昵称、操作菜单
交互动画
动画时长
快速响应100-200ms
中等过渡300-500ms
明显变化600-800ms
动画曲线
线性:匀速运动
缓入缓出:自然启停
弹性:生动活泼
具体场景
页面切换淡入淡出300ms
按钮点击轻微缩放100ms
数据加载:骨架屏+进度条
🔧 缓存管理规范重点
缓存策略矩阵
数据类型 缓存策略 失效时间 更新机制
用户基本信息 读后写 30分钟 用户修改后删除
热点公告 定时刷新 1小时 定时任务更新
交易记录 不缓存 - -
余额信息 短时缓存 5分钟 交易后删除
一致性保障措施
写时失效:数据更新时立即删除相关缓存
双写策略:重要数据采用先更新数据库再删除缓存
补偿机制:缓存异常时自动降级到数据库查询
监控告警:缓存命中率、延迟等指标监控
运维操作指南
缓存监控
连接数监控
内存使用监控
命中率统计
延迟监控
故障处理
连接超时处理
内存溢出处理
数据不一致处理
服务宕机处理
数据操作
缓存预热脚本
批量清理脚本
数据迁移工具
备份恢复方案
个人周计划-第13周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-12-15
结束时间: 2025-12-21
🎯 本周核心目标
作为项目文档编写人员本周将全面支持“β版本开发阶段”的性能优化与UI重构工作。核心任务是系统化记录性能优化方案、建立缓存管理规范、更新所有技术文档以反映架构升级并为团队的美化改版工作提供视觉规范和用户体验文档支持。
📋 任务分解与分配
序号 任务内容 负责人 协作人 情况说明
1 Redis缓存技术方案文档 我 何文迪、王腾云 详细记录Redis集成方案包括缓存策略、失效机制、一致性保障措施形成《Redis缓存设计与实施指南》。
2 性能优化过程记录与分析 我 何文迪 记录SQL优化过程收集Explain分析结果编写《数据库性能优化报告》。
3 UI/UX设计规范文档化 我 王家伟、刘兴朋 建立团队UI设计规范文档包括色彩体系、组件库、交互动画标准等。
4 压力测试方案与结果记录 我 张豪、PM 记录JMeter压力测试方案整理测试结果编写《系统性能测试报告》。
5 Docker容器化部署文档 我 张豪 详细记录Docker部署方案包括Dockerfile编写、镜像构建、容器编排等形成《容器化部署指南》。
6 缓存管理规范与操作手册 我 何文迪 编写缓存操作手册,包括缓存监控、故障处理、数据恢复等运维操作。
7 接口性能基准文档 我 全体成员 建立接口性能基准文档,记录优化前后的响应时间对比,为后续优化提供基准。
8 文档版本与架构变更管理 我 全体成员 更新所有受架构变更影响的文档,管理β版本文档体系,建立版本对应关系。
📁 预期交付成果
性能优化文档(周二前)
✅ 《Redis缓存设计与实施指南》
缓存架构设计
缓存策略与失效机制
一致性保障方案
✅ 《数据库性能优化报告》
SQL优化分析
索引设计与效果
查询性能对比
UI/UX设计文档周三前
✅ 《β版本UI设计规范》
色彩体系与视觉识别
组件库与样式规范
交互动画标准
✅ 《前端重构技术方案》
CSS框架选型与定制
组件重构方案
兼容性保障措施
测试与部署文档(周四前)
✅ 《系统性能测试报告》
JMeter测试方案
压力测试结果
性能瓶颈分析
✅ 《容器化部署指南》
Dockerfile详解
镜像构建与发布
容器编排方案
综合管理文档(周五)
✅ 《缓存管理操作手册》
✅ 《接口性能基准文档》
✅ 《第13周架构升级汇总报告》
✅ 《β版本文档体系说明》
🎯 文档工作重点
性能文档深度挖掘
缓存策略详解:深入分析每种缓存场景的最佳策略选择
性能数据可视化:使用图表展示优化前后的性能对比
瓶颈定位方法:记录性能问题的定位和分析方法
设计文档专业规范
设计系统建立:建立完整的设计语言和组件系统
用户体验记录:记录界面优化对用户体验的影响
视觉一致性保障:制定保障多界面视觉一致性的规范
部署文档实用导向
容器化最佳实践记录Docker使用的最佳实践和注意事项
环境配置标准化:建立标准化的环境配置方案
故障处理指南:提供常见部署问题的解决方案
📊 风险管理
潜在风险 应对策略 责任人
缓存一致性问题理解不足 深入研究缓存一致性理论,结合实际案例 我+何文迪
设计规范未被前端采纳 组织设计评审会,收集团队意见共同制定 我+王家伟
压力测试结果分析困难 学习JMeter数据分析方法请教测试专家 我+张豪
容器化部署复杂性高 分步骤记录,提供简易版和完整版两种方案 我+张豪
🗂️ β版本文档体系
text
docs/beta_version/
├── 01-性能优化/
│ ├── Redis缓存设计指南.md
│ ├── 数据库性能优化报告.md
│ ├── 缓存管理操作手册.md
│ └── 接口性能基准.md
├── 02-UI设计规范/
│ ├── β版本UI设计规范.md
│ ├── 视觉设计语言系统.md
│ ├── 组件库使用指南.md
│ └── 交互动画规范.md
├── 03-测试与部署/
│ ├── 系统性能测试报告.md
│ ├── 容器化部署指南.md
│ ├── Dockerfile详解.md
│ └── 环境配置标准化.md
├── 04-架构文档/
│ ├── β版本架构升级说明.md
│ ├── 系统架构图(新版).vsd
│ └── 技术选型与评估.md
└── 05-变更管理/
├── 第13周变更汇总.md
├── 文档更新清单.md
└── 版本迁移指南.md
⏰ 时间安排计划
周一
上午与后端团队讨论Redis方案开始缓存文档编写
下午收集SQL优化案例开始性能优化报告
晚上:研究缓存一致性理论,完善技术细节
周二
上午:完成缓存文档初稿,组织技术评审
下午与前端团队讨论UI规范开始设计文档编写
晚上:整理色彩体系和组件规范
周三
上午完成UI设计规范文档
下午:记录压力测试方案,开始测试文档编写
晚上研究Docker最佳实践准备部署文档
周四
上午:完成部署文档初稿
下午:组织所有文档的内部评审
晚上:根据评审意见修改完善文档
周五
上午:完成所有文档的最终版本
下午:更新受影响的其他文档(用户手册、运维指南等)
晚上:整合β版本文档体系,编写本周工作总结
📝 工作质量标准
技术文档标准
准确性:所有技术方案必须与实际实现一致
深度:深入分析技术原理和实现细节
实用性:提供可直接参考的配置和代码示例
设计文档标准
系统性:建立完整的设计语言体系
一致性:确保多文档间的设计描述一致
可执行性:设计规范能够指导实际开发
部署文档标准
可重复性:步骤清晰,能够重复执行获得相同结果
故障处理:包含常见问题的解决方案
安全性:包含安全配置和权限管理说明
🎨 UI设计规范重点内容规划
视觉设计体系
色彩系统
主色:蓝白系(#1890ff为主蓝#ffffff为背景白
辅助色:成功绿、警告橙、错误红、信息蓝
中性色:文字黑、边框灰、背景浅灰
字体规范
中文字体:系统默认(优先苹方、微软雅黑)
英文字体Inter或系统默认
字号层级:标题、正文、辅助文字、标签文字
间距系统
基础间距8px为基准单位
布局间距16px、24px、32px、48px
组件内间距遵循8px倍数原则
组件规范
基础组件
按钮:主要、次要、文字、图标按钮
表单:输入框、选择器、开关、滑块
导航:菜单、标签页、面包屑
业务组件
转账卡片:金额输入、收款人选择、确认按钮
交易列表:分页、筛选、排序、操作按钮
用户信息:头像、昵称、操作菜单
交互动画
动画时长
快速响应100-200ms
中等过渡300-500ms
明显变化600-800ms
动画曲线
线性:匀速运动
缓入缓出:自然启停
弹性:生动活泼
具体场景
页面切换淡入淡出300ms
按钮点击轻微缩放100ms
数据加载:骨架屏+进度条
🔧 缓存管理规范重点
缓存策略矩阵
数据类型 缓存策略 失效时间 更新机制
用户基本信息 读后写 30分钟 用户修改后删除
热点公告 定时刷新 1小时 定时任务更新
交易记录 不缓存 - -
余额信息 短时缓存 5分钟 交易后删除
一致性保障措施
写时失效:数据更新时立即删除相关缓存
双写策略:重要数据采用先更新数据库再删除缓存
补偿机制:缓存异常时自动降级到数据库查询
监控告警:缓存命中率、延迟等指标监控
运维操作指南
缓存监控
连接数监控
内存使用监控
命中率统计
延迟监控
故障处理
连接超时处理
内存溢出处理
数据不一致处理
服务宕机处理
数据操作
缓存预热脚本
批量清理脚本
数据迁移工具
备份恢复方案

@ -1,158 +1,158 @@
个人周总结-第13周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-12-15
结束时间: 2025-12-21
📊 本周任务完成情况
序号 总结内容 是否完成 情况说明
1 Redis缓存技术方案文档编写 完成 完成了《Redis缓存设计与实施指南》详细记录了缓存架构、策略矩阵、一致性保障方案包含7种缓存场景的最佳实践。
2 数据库性能优化报告整理 完成 编写了《数据库性能优化报告》记录了交易记录表联合索引的优化过程SQL执行时间从秒级降至毫秒级的具体数据对比。
3 UI/UX设计规范文档建立 完成 建立了完整的《β版本UI设计规范》包括蓝白系色彩系统、8px基准间距体系、组件库规范形成了团队设计语言。
4 压力测试方案与结果记录 完成 记录了JMeter压力测试方案编写了《系统性能测试报告》包含100并发下的性能指标和稳定性分析。
5 Docker容器化部署文档编写 完成 完成了《容器化部署指南》包含Dockerfile详解、镜像构建流程、容器编排方案和故障处理指南。
6 缓存管理规范与操作手册 完成 编写了《缓存管理操作手册》,涵盖监控、故障处理、数据恢复等运维操作,特别针对一致性问题的解决方案。
7 接口性能基准文档建立 完成 建立了《接口性能基准文档》记录优化前后核心接口响应时间对比平均从450ms降至120ms
8 文档版本与架构变更管理 完成 更新了12个受架构变更影响的文档建立了β版本文档体系管理了文档版本对应关系。
📁 文档产出清单
性能优化文档(核心产出)
✅ 《Redis缓存设计与实施指南》18页
缓存架构设计与选型分析
7类数据缓存策略矩阵
一致性保障方案(含延迟双删策略)
Redis连接池配置最佳实践
✅ 《数据库性能优化报告》
transactions表联合索引优化分析
SQL执行时间对比图表秒级→毫秒级
Explain执行计划解读
✅ 《缓存管理操作手册》
监控指标与告警阈值
6类常见故障处理方案
数据备份与恢复流程
UI/UX设计文档
✅ 《β版本UI设计规范》完整版
蓝白系色彩系统规范(主色#1890ff辅色6种
8px基准间距体系与布局网格
组件库使用指南25个组件规范
交互动画标准7种动画曲线与时长
✅ 《前端重构技术方案》
CSS模块化重构方案
浏览器缓存问题解决方案
样式冲突预防机制
测试与部署文档
✅ 《系统性能测试报告》
JMeter测试脚本与配置说明
100并发压力测试结果分析
系统瓶颈识别与优化建议
✅ 《容器化部署指南》
Dockerfile逐行注解
多环境镜像构建流程
容器编排与网络配置
综合管理文档
✅ 《接口性能基准文档》
核心接口响应时间对比表
吞吐量提升数据分析
性能监控指标定义
✅ 《第13周架构升级汇总报告》
技术变更影响分析
风险评估与应对方案
知识沉淀总结
✅ 《β版本文档体系说明》
文档目录结构说明
版本对应关系表
文档维护规范
🏆 工作亮点与成效
技术文档深度突破
缓存一致性深度研究针对团队遇到的缓存一致性问题深入研究并记录了3种解决方案延迟双删、读写锁、消息队列为下周优化提供了理论基础。
性能数据可视化呈现使用图表直观展示优化效果核心接口响应时间压缩73%450ms→120msSQL执行效率提升95%以上。
设计系统完整建立:首次建立了团队的设计语言系统,实现了从色彩、间距到组件的完整规范体系。
团队协作价值体现
实时协作文档支持在Redis连接池配置Bug解决过程中提供实时文档支持帮助团队1小时内解决问题。
规范化工作流程通过设计规范文档解决了CSS样式冲突问题建立了模块化开发标准。
知识沉淀系统化:将本周的技术决策和解决方案系统化沉淀,形成可复用的知识资产。
延迟双删策略:记录具体实现步骤和时序控制方案
读写锁机制:分析分布式锁在缓存场景的应用
消息队列异步更新:研究最终一致性保障方案
文档产出在《缓存管理操作手册》中增加了“高并发场景缓存一致性保障”专章提供了3种解决方案的选择指南和实现示例。
CSS样式冲突预防机制
问题背景UI重构过程中出现全局样式污染导致的布局错位。
解决方案设计:
CSS模块化方案记录BEM命名规范和实践
样式作用域控制分析CSS-in-JS与Scoped CSS的优劣
构建工具集成提供Webpack配置示例实现样式隔离
文档产出:在《前端重构技术方案》中增加了“样式冲突预防与解决方案”章节,包含代码示例和构建配置。
📈 工作方法创新
文档协作新模式
实时协同编辑在解决Redis连接池问题时使用在线文档实时记录解决方案团队成员同步编辑极大提升效率。
可视化文档模板:为性能报告设计标准化图表模板,使数据呈现更直观。
版本对比工具应用:使用文档对比工具管理规范变更,确保版本间差异清晰可见。
知识管理创新
问题-方案知识库:建立结构化的问题解决方案库,按技术领域分类。
最佳实践案例集:收集整理本周的最佳实践案例,形成团队技术资产。
经验教训归档:系统化归档本周的经验教训,避免重复犯错。
📌 本周小结
个人周总结-第13周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-12-15
结束时间: 2025-12-21
📊 本周任务完成情况
序号 总结内容 是否完成 情况说明
1 Redis缓存技术方案文档编写 完成 完成了《Redis缓存设计与实施指南》详细记录了缓存架构、策略矩阵、一致性保障方案包含7种缓存场景的最佳实践。
2 数据库性能优化报告整理 完成 编写了《数据库性能优化报告》记录了交易记录表联合索引的优化过程SQL执行时间从秒级降至毫秒级的具体数据对比。
3 UI/UX设计规范文档建立 完成 建立了完整的《β版本UI设计规范》包括蓝白系色彩系统、8px基准间距体系、组件库规范形成了团队设计语言。
4 压力测试方案与结果记录 完成 记录了JMeter压力测试方案编写了《系统性能测试报告》包含100并发下的性能指标和稳定性分析。
5 Docker容器化部署文档编写 完成 完成了《容器化部署指南》包含Dockerfile详解、镜像构建流程、容器编排方案和故障处理指南。
6 缓存管理规范与操作手册 完成 编写了《缓存管理操作手册》,涵盖监控、故障处理、数据恢复等运维操作,特别针对一致性问题的解决方案。
7 接口性能基准文档建立 完成 建立了《接口性能基准文档》记录优化前后核心接口响应时间对比平均从450ms降至120ms
8 文档版本与架构变更管理 完成 更新了12个受架构变更影响的文档建立了β版本文档体系管理了文档版本对应关系。
📁 文档产出清单
性能优化文档(核心产出)
✅ 《Redis缓存设计与实施指南》18页
缓存架构设计与选型分析
7类数据缓存策略矩阵
一致性保障方案(含延迟双删策略)
Redis连接池配置最佳实践
✅ 《数据库性能优化报告》
transactions表联合索引优化分析
SQL执行时间对比图表秒级→毫秒级
Explain执行计划解读
✅ 《缓存管理操作手册》
监控指标与告警阈值
6类常见故障处理方案
数据备份与恢复流程
UI/UX设计文档
✅ 《β版本UI设计规范》完整版
蓝白系色彩系统规范(主色#1890ff辅色6种
8px基准间距体系与布局网格
组件库使用指南25个组件规范
交互动画标准7种动画曲线与时长
✅ 《前端重构技术方案》
CSS模块化重构方案
浏览器缓存问题解决方案
样式冲突预防机制
测试与部署文档
✅ 《系统性能测试报告》
JMeter测试脚本与配置说明
100并发压力测试结果分析
系统瓶颈识别与优化建议
✅ 《容器化部署指南》
Dockerfile逐行注解
多环境镜像构建流程
容器编排与网络配置
综合管理文档
✅ 《接口性能基准文档》
核心接口响应时间对比表
吞吐量提升数据分析
性能监控指标定义
✅ 《第13周架构升级汇总报告》
技术变更影响分析
风险评估与应对方案
知识沉淀总结
✅ 《β版本文档体系说明》
文档目录结构说明
版本对应关系表
文档维护规范
🏆 工作亮点与成效
技术文档深度突破
缓存一致性深度研究针对团队遇到的缓存一致性问题深入研究并记录了3种解决方案延迟双删、读写锁、消息队列为下周优化提供了理论基础。
性能数据可视化呈现使用图表直观展示优化效果核心接口响应时间压缩73%450ms→120msSQL执行效率提升95%以上。
设计系统完整建立:首次建立了团队的设计语言系统,实现了从色彩、间距到组件的完整规范体系。
团队协作价值体现
实时协作文档支持在Redis连接池配置Bug解决过程中提供实时文档支持帮助团队1小时内解决问题。
规范化工作流程通过设计规范文档解决了CSS样式冲突问题建立了模块化开发标准。
知识沉淀系统化:将本周的技术决策和解决方案系统化沉淀,形成可复用的知识资产。
延迟双删策略:记录具体实现步骤和时序控制方案
读写锁机制:分析分布式锁在缓存场景的应用
消息队列异步更新:研究最终一致性保障方案
文档产出在《缓存管理操作手册》中增加了“高并发场景缓存一致性保障”专章提供了3种解决方案的选择指南和实现示例。
CSS样式冲突预防机制
问题背景UI重构过程中出现全局样式污染导致的布局错位。
解决方案设计:
CSS模块化方案记录BEM命名规范和实践
样式作用域控制分析CSS-in-JS与Scoped CSS的优劣
构建工具集成提供Webpack配置示例实现样式隔离
文档产出:在《前端重构技术方案》中增加了“样式冲突预防与解决方案”章节,包含代码示例和构建配置。
📈 工作方法创新
文档协作新模式
实时协同编辑在解决Redis连接池问题时使用在线文档实时记录解决方案团队成员同步编辑极大提升效率。
可视化文档模板:为性能报告设计标准化图表模板,使数据呈现更直观。
版本对比工具应用:使用文档对比工具管理规范变更,确保版本间差异清晰可见。
知识管理创新
问题-方案知识库:建立结构化的问题解决方案库,按技术领域分类。
最佳实践案例集:收集整理本周的最佳实践案例,形成团队技术资产。
经验教训归档:系统化归档本周的经验教训,避免重复犯错。
📌 本周小结
作为文档编写人员,本周在β版本开发的“性能优化”和“界面美化”双重点工作中发挥了关键作用。通过深入的技术文档和专业的设计规范,不仅支持了团队的技术升级,更建立了长效的技术规范和设计标准,为项目的持续优化奠定了坚实基础。

@ -1,15 +1,15 @@
# 个人周计划-第13周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-15
**结束时间:** 2025-12-21
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 引入新的CSS框架或自定义样式统一色调蓝白系 | 刘兴朋 | 主导前端整体样式重构引入或自定义CSS框架确保界面风格统一、美观摆脱原生Bootstrap风格 |
# 个人周计划-第13周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-15
**结束时间:** 2025-12-21
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 引入新的CSS框架或自定义样式统一色调蓝白系 | 刘兴朋 | 主导前端整体样式重构引入或自定义CSS框架确保界面风格统一、美观摆脱原生Bootstrap风格 |
| 2 | 优化转账流程的交互动画解决头像缓存不更新的Bug | 刘兴朋 | 优化转账流程交互体验,添加动画反馈,并修复头像缓存更新问题,提升用户感知流畅度 |

@ -1,15 +1,15 @@
# 个人周总结-第13周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-15
**结束时间:** 2025-12-21
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 引入新的CSS框架或自定义样式统一色调蓝白系 | 完成 | 主导完成前端整体样式重构引入并配置自定义CSS框架成功统一界面为蓝白系风格提升视觉一致性摆脱原生Bootstrap样式依赖 |
# 个人周总结-第13周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-15
**结束时间:** 2025-12-21
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 引入新的CSS框架或自定义样式统一色调蓝白系 | 完成 | 主导完成前端整体样式重构引入并配置自定义CSS框架成功统一界面为蓝白系风格提升视觉一致性摆脱原生Bootstrap样式依赖 |
| 2 | 优化转账流程的交互动画解决头像缓存不更新的Bug | 完成 | 完成转账流程动画优化,增加平滑过渡与状态反馈;修复头像缓存更新机制,确保用户头像及时同步,提升交互流畅度与用户体验 |

@ -1,308 +1,308 @@
# 个人周计划-第14周文档编写人员
**姓  名:** [刘兴朋]
**团队名称:** 菜鸟队
**开始时间:** 2025-12-22
**结束时间:** 2025-12-28
## 🎯 本周核心目标
作为项目文档编写人员,本周将围绕"系统稳健性"与"部署自动化"两大核心目标,重点完成**缓存一致性优化、数据可视化、容器化部署等关键技术方案的深度文档化**,建立完整的部署运维文档体系,为β版本的稳定交付提供专业文档支持。
## 📋 任务分解与分配
| 序号 | 任务内容 | 负责人 | 协作人 | 情况说明 |
|------|----------|--------|--------|----------|
| 1 | **缓存一致性优化方案深度文档** | 我 | 何文迪、王腾云 | 深入研究并记录延迟双删策略的实现细节,编写《高并发场景缓存一致性保障方案》专项文档。 |
| 2 | **数据可视化技术文档编写** | 我 | 王家伟、刘兴朋 | 记录ECharts集成方案编写《数据可视化实现指南》包含图表配置、数据接口、响应式适配等。 |
| 3 | **Docker-Compose部署完整文档** | 我 | 张豪、PM | 详细记录Docker-Compose配置编写《全栈容器化部署指南》包括网络配置、服务编排、一键启动脚本。 |
| 4 | **统计分析接口文档编写** | 我 | 何文迪 | 记录资金流向统计分析接口的设计与实现,编写《数据分析接口规范》,包含数据聚合逻辑和接口定义。 |
| 5 | **移动端适配问题解决记录** | 我 | 王家伟 | 记录移动端样式问题的排查和解决过程,编写《移动端兼容性适配指南》。 |
| 6 | **回归测试文档体系建立** | 我 | 王腾云、全员 | 建立β版本回归测试文档体系,编写《β版本全功能回归测试报告模板》。 |
| 7 | **系统操作日志规范文档** | 我 | 何文迪 | 制定系统操作日志规范,编写《操作日志设计与实现规范》,确保日志覆盖所有核心业务。 |
| 8 | **部署运维操作手册完善** | 我 | 张豪、何文迪 | 完善部署运维文档,编写《生产环境一键部署操作手册》和《运维故障快速排查指南》。 |
## 📁 预期交付成果
### 缓存与一致性文档(周二前)
- ✅ 《高并发场景缓存一致性保障方案》
- 延迟双删策略深度解析
- 并发场景时序问题分析
- 实现代码示例与配置
- ✅ 《缓存监控与告警配置指南》
### 可视化与前端文档(周三前)
- ✅ 《数据可视化实现指南》
- ECharts集成与配置详解
- 资金流向图表实现方案
- 响应式适配与性能优化
- ✅ 《移动端兼容性适配指南》
- 常见移动端问题解决方案
- 样式适配最佳实践
- 测试方法与工具
### 部署与运维文档(周四前)
- ✅ 《全栈容器化部署指南》
- Docker-Compose配置详解
- 容器网络与通信配置
- 一键启动脚本设计与实现
- ✅ 《生产环境部署操作手册》
- 环境准备与依赖检查
- 部署步骤与验证方法
- 备份与恢复方案
### 测试与规范文档(周五)
- ✅ 《β版本回归测试文档体系》
- 回归测试报告模板
- 测试用例管理规范
- 缺陷跟踪与修复流程
- ✅ 《操作日志设计与实现规范》
- 日志格式与级别标准
- 核心业务日志点定义
- 日志收集与分析方案
- ✅ 《第14周技术方案汇总报告》
## 🎯 文档工作重点
### 技术方案深度挖掘
1. **延迟双删机制深度分析**:分析不同业务场景下的延迟时间设置策略
2. **可视化性能优化**:记录大数据量下的图表渲染优化方案
3. **容器网络原理**深入理解Docker网络模型记录常见网络问题解决方案
### 操作文档实用导向
1. **一键部署脚本文档化**:确保新成员能够通过文档快速搭建环境
2. **故障排查流程标准化**:建立标准化的故障排查流程和检查清单
3. **日志分析实用指南**:提供日志分析的实际操作方法和工具使用
### 质量保障体系建立
1. **回归测试标准化**:建立标准化的回归测试流程和文档模板
2. **兼容性测试方法论**:建立多端兼容性测试的方法和标准
3. **部署验证机制**:建立部署后的验证方法和标准
## 📊 风险管理
| 潜在风险 | 应对策略 | 责任人 |
|----------|----------|--------|
| 延迟双删参数优化复杂 | 收集不同场景测试数据,建立参数调优指南 | 我+何文迪 |
| 可视化图表性能问题 | 记录性能测试方法和优化方案 | 我+王家伟 |
| 容器网络配置困难 | 分步骤记录网络配置,提供常见问题解决方案 | 我+张豪 |
| 回归测试覆盖不全 | 建立测试用例审查机制,确保关键路径全覆盖 | 我+王腾云 |
## 🗂️ 部署与运维文档体系
```
docs/deployment_operations/
├── 01-容器化部署/
│ ├── Docker-Compose配置详解.md
│ ├── 容器网络架构设计.md
│ ├── 一键部署脚本说明.md
│ └── 镜像优化与构建指南.md
├── 02-生产环境运维/
│ ├── 生产环境部署手册.md
│ ├── 运维监控与告警配置.md
│ ├── 故障排查快速指南.md
│ └── 备份与恢复方案.md
├── 03-可视化技术/
│ ├── ECharts集成指南.md
│ ├── 数据可视化设计规范.md
│ ├── 图表性能优化方案.md
│ └── 移动端适配解决方案.md
├── 04-缓存一致性/
│ ├── 延迟双删实现方案.md
│ ├── 高并发缓存策略.md
│ ├── 缓存监控与维护.md
│ └── 数据一致性测试用例.md
├── 05-测试与质量/
│ ├── β版本回归测试规范.md
│ ├── 测试用例管理指南.md
│ ├── 缺陷跟踪流程.md
│ └── 质量度量指标体系.md
└── 06-日志与监控/
├── 操作日志设计规范.md
├── 日志收集与分析方案.md
├── 监控指标定义.md
└── 告警规则配置指南.md
```
## ⏰ 时间安排计划
### 周一
- 上午:深入研究延迟双删机制,开始缓存一致性文档编写
- 下午:与后端团队讨论统计分析接口,开始接口文档编写
- 晚上研究ECharts最佳实践准备可视化文档框架
### 周二
- 上午:完成缓存一致性文档初稿,组织技术评审
- 下午记录ECharts集成方案开始可视化文档编写
- 晚上:收集移动端适配问题案例,准备适配指南
### 周三
- 上午:完成可视化文档初稿
- 下午与运维团队讨论Docker-Compose配置开始部署文档编写
- 晚上:研究容器网络原理,完善网络配置文档
### 周四
- 上午:完成部署文档初稿
- 下午:组织回归测试文档框架讨论,开始测试文档编写
- 晚上:制定操作日志规范,开始规范文档编写
### 周五
- 上午:完成所有文档初稿,组织综合评审
- 下午:根据评审意见修改完善文档
- 晚上:整合所有文档,编写本周技术方案汇总报告
## 📝 工作质量标准
### 技术方案文档标准
- 深度:深入分析技术原理和实现机制
- 实用性:提供可直接参考的配置示例和代码
- 全面性:覆盖方案的所有关键环节和注意事项
### 操作指南文档标准
- 可操作性:步骤清晰明确,能够指导实际操作
- 故障处理:包含常见问题的解决方案
- 验证方法:提供操作后的验证方法和标准
### 规范文档标准
- 明确性:规范要求明确,无歧义
- 可执行性:规范能够实际执行和检查
- 一致性:与现有规范和标准保持一致
## 🔧 延迟双删方案深度设计
### 技术原理分析
1. **时序问题场景**
- 并发读写时序分析
- 缓存穿透与雪崩风险
- 数据不一致的根本原因
2. **延迟时间计算模型**
- 基于业务复杂度的延迟估算
- 基于数据库性能的延迟调整
- 基于网络延迟的时间补偿
### 实现方案设计
1. **代码架构设计**
```java
// 延迟双删伪代码示例
@Service
public class CacheService {
// 第一次删除(更新前)
public void updateWithCache(User user) {
// 1. 删除缓存
cache.delete(userKey);
// 2. 更新数据库
userRepository.update(user);
// 3. 延迟后再次删除
scheduledExecutor.schedule(() -> {
cache.delete(userKey);
}, delayTime, TimeUnit.MILLISECONDS);
}
}
```
2. **参数配置指南**
- 延迟时间配置表(不同业务场景)
- 线程池配置建议
- 监控指标定义
### 测试验证方案
1. **一致性测试用例**
- 并发更新测试场景
- 故障恢复测试场景
- 性能影响测试场景
2. **监控指标体系**
- 缓存命中率监控
- 数据不一致告警
- 延迟任务执行监控
## 📊 数据可视化方案设计
### ECharts集成方案
1. **技术选型分析**
- ECharts vs AntV 对比分析
- 版本选择与兼容性考虑
- 按需引入与打包优化
2. **图表类型设计**
- 个人收支对比饼图
- 消费趋势折线图
- 资金流向桑基图(可选)
### 性能优化策略
1. **大数据量优化**
- 数据分页与懒加载
- 图表渲染性能优化
- 内存使用控制
2. **响应式适配方案**
- 断点设计(桌面、平板、手机)
- 图表重绘策略
- 触摸事件适配
### 数据接口规范
1. **接口设计原则**
- 数据格式标准化
- 错误处理规范化
- 版本管理机制
2. **安全考虑**
- 数据权限控制
- 接口频率限制
- 敏感数据脱敏
## 🐳 Docker-Compose部署方案
### 服务编排设计
1. **服务定义**
```yaml
version: '3.8'
services:
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
environment:
- SPRING_PROFILES_ACTIVE=docker
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=root123
- MYSQL_DATABASE=smart_pay
redis:
image: redis:6.2-alpine
ports:
- "6379:6379"
```
2. **网络配置优化**
- 自定义网络配置
- 服务发现机制
- 网络隔离策略
### 一键部署脚本
1. **环境检查脚本**
- 依赖检查
- 端口检查
- 权限检查
2. **部署验证脚本**
- 服务健康检查
- 功能冒烟测试
- 性能基准测试
### 生产环境适配
1. **配置管理**
- 环境变量管理
- 配置文件外部化
- 密钥安全管理
2. **监控集成**
- 日志收集配置
- 指标监控集成
- 告警规则配置
# 个人周计划-第14周文档编写人员
**姓  名:** [刘兴朋]
**团队名称:** 菜鸟队
**开始时间:** 2025-12-22
**结束时间:** 2025-12-28
## 🎯 本周核心目标
作为项目文档编写人员,本周将围绕"系统稳健性"与"部署自动化"两大核心目标,重点完成**缓存一致性优化、数据可视化、容器化部署等关键技术方案的深度文档化**,建立完整的部署运维文档体系,为β版本的稳定交付提供专业文档支持。
## 📋 任务分解与分配
| 序号 | 任务内容 | 负责人 | 协作人 | 情况说明 |
|------|----------|--------|--------|----------|
| 1 | **缓存一致性优化方案深度文档** | 我 | 何文迪、王腾云 | 深入研究并记录延迟双删策略的实现细节,编写《高并发场景缓存一致性保障方案》专项文档。 |
| 2 | **数据可视化技术文档编写** | 我 | 王家伟、刘兴朋 | 记录ECharts集成方案编写《数据可视化实现指南》包含图表配置、数据接口、响应式适配等。 |
| 3 | **Docker-Compose部署完整文档** | 我 | 张豪、PM | 详细记录Docker-Compose配置编写《全栈容器化部署指南》包括网络配置、服务编排、一键启动脚本。 |
| 4 | **统计分析接口文档编写** | 我 | 何文迪 | 记录资金流向统计分析接口的设计与实现,编写《数据分析接口规范》,包含数据聚合逻辑和接口定义。 |
| 5 | **移动端适配问题解决记录** | 我 | 王家伟 | 记录移动端样式问题的排查和解决过程,编写《移动端兼容性适配指南》。 |
| 6 | **回归测试文档体系建立** | 我 | 王腾云、全员 | 建立β版本回归测试文档体系,编写《β版本全功能回归测试报告模板》。 |
| 7 | **系统操作日志规范文档** | 我 | 何文迪 | 制定系统操作日志规范,编写《操作日志设计与实现规范》,确保日志覆盖所有核心业务。 |
| 8 | **部署运维操作手册完善** | 我 | 张豪、何文迪 | 完善部署运维文档,编写《生产环境一键部署操作手册》和《运维故障快速排查指南》。 |
## 📁 预期交付成果
### 缓存与一致性文档(周二前)
- ✅ 《高并发场景缓存一致性保障方案》
- 延迟双删策略深度解析
- 并发场景时序问题分析
- 实现代码示例与配置
- ✅ 《缓存监控与告警配置指南》
### 可视化与前端文档(周三前)
- ✅ 《数据可视化实现指南》
- ECharts集成与配置详解
- 资金流向图表实现方案
- 响应式适配与性能优化
- ✅ 《移动端兼容性适配指南》
- 常见移动端问题解决方案
- 样式适配最佳实践
- 测试方法与工具
### 部署与运维文档(周四前)
- ✅ 《全栈容器化部署指南》
- Docker-Compose配置详解
- 容器网络与通信配置
- 一键启动脚本设计与实现
- ✅ 《生产环境部署操作手册》
- 环境准备与依赖检查
- 部署步骤与验证方法
- 备份与恢复方案
### 测试与规范文档(周五)
- ✅ 《β版本回归测试文档体系》
- 回归测试报告模板
- 测试用例管理规范
- 缺陷跟踪与修复流程
- ✅ 《操作日志设计与实现规范》
- 日志格式与级别标准
- 核心业务日志点定义
- 日志收集与分析方案
- ✅ 《第14周技术方案汇总报告》
## 🎯 文档工作重点
### 技术方案深度挖掘
1. **延迟双删机制深度分析**:分析不同业务场景下的延迟时间设置策略
2. **可视化性能优化**:记录大数据量下的图表渲染优化方案
3. **容器网络原理**深入理解Docker网络模型记录常见网络问题解决方案
### 操作文档实用导向
1. **一键部署脚本文档化**:确保新成员能够通过文档快速搭建环境
2. **故障排查流程标准化**:建立标准化的故障排查流程和检查清单
3. **日志分析实用指南**:提供日志分析的实际操作方法和工具使用
### 质量保障体系建立
1. **回归测试标准化**:建立标准化的回归测试流程和文档模板
2. **兼容性测试方法论**:建立多端兼容性测试的方法和标准
3. **部署验证机制**:建立部署后的验证方法和标准
## 📊 风险管理
| 潜在风险 | 应对策略 | 责任人 |
|----------|----------|--------|
| 延迟双删参数优化复杂 | 收集不同场景测试数据,建立参数调优指南 | 我+何文迪 |
| 可视化图表性能问题 | 记录性能测试方法和优化方案 | 我+王家伟 |
| 容器网络配置困难 | 分步骤记录网络配置,提供常见问题解决方案 | 我+张豪 |
| 回归测试覆盖不全 | 建立测试用例审查机制,确保关键路径全覆盖 | 我+王腾云 |
## 🗂️ 部署与运维文档体系
```
docs/deployment_operations/
├── 01-容器化部署/
│ ├── Docker-Compose配置详解.md
│ ├── 容器网络架构设计.md
│ ├── 一键部署脚本说明.md
│ └── 镜像优化与构建指南.md
├── 02-生产环境运维/
│ ├── 生产环境部署手册.md
│ ├── 运维监控与告警配置.md
│ ├── 故障排查快速指南.md
│ └── 备份与恢复方案.md
├── 03-可视化技术/
│ ├── ECharts集成指南.md
│ ├── 数据可视化设计规范.md
│ ├── 图表性能优化方案.md
│ └── 移动端适配解决方案.md
├── 04-缓存一致性/
│ ├── 延迟双删实现方案.md
│ ├── 高并发缓存策略.md
│ ├── 缓存监控与维护.md
│ └── 数据一致性测试用例.md
├── 05-测试与质量/
│ ├── β版本回归测试规范.md
│ ├── 测试用例管理指南.md
│ ├── 缺陷跟踪流程.md
│ └── 质量度量指标体系.md
└── 06-日志与监控/
├── 操作日志设计规范.md
├── 日志收集与分析方案.md
├── 监控指标定义.md
└── 告警规则配置指南.md
```
## ⏰ 时间安排计划
### 周一
- 上午:深入研究延迟双删机制,开始缓存一致性文档编写
- 下午:与后端团队讨论统计分析接口,开始接口文档编写
- 晚上研究ECharts最佳实践准备可视化文档框架
### 周二
- 上午:完成缓存一致性文档初稿,组织技术评审
- 下午记录ECharts集成方案开始可视化文档编写
- 晚上:收集移动端适配问题案例,准备适配指南
### 周三
- 上午:完成可视化文档初稿
- 下午与运维团队讨论Docker-Compose配置开始部署文档编写
- 晚上:研究容器网络原理,完善网络配置文档
### 周四
- 上午:完成部署文档初稿
- 下午:组织回归测试文档框架讨论,开始测试文档编写
- 晚上:制定操作日志规范,开始规范文档编写
### 周五
- 上午:完成所有文档初稿,组织综合评审
- 下午:根据评审意见修改完善文档
- 晚上:整合所有文档,编写本周技术方案汇总报告
## 📝 工作质量标准
### 技术方案文档标准
- 深度:深入分析技术原理和实现机制
- 实用性:提供可直接参考的配置示例和代码
- 全面性:覆盖方案的所有关键环节和注意事项
### 操作指南文档标准
- 可操作性:步骤清晰明确,能够指导实际操作
- 故障处理:包含常见问题的解决方案
- 验证方法:提供操作后的验证方法和标准
### 规范文档标准
- 明确性:规范要求明确,无歧义
- 可执行性:规范能够实际执行和检查
- 一致性:与现有规范和标准保持一致
## 🔧 延迟双删方案深度设计
### 技术原理分析
1. **时序问题场景**
- 并发读写时序分析
- 缓存穿透与雪崩风险
- 数据不一致的根本原因
2. **延迟时间计算模型**
- 基于业务复杂度的延迟估算
- 基于数据库性能的延迟调整
- 基于网络延迟的时间补偿
### 实现方案设计
1. **代码架构设计**
```java
// 延迟双删伪代码示例
@Service
public class CacheService {
// 第一次删除(更新前)
public void updateWithCache(User user) {
// 1. 删除缓存
cache.delete(userKey);
// 2. 更新数据库
userRepository.update(user);
// 3. 延迟后再次删除
scheduledExecutor.schedule(() -> {
cache.delete(userKey);
}, delayTime, TimeUnit.MILLISECONDS);
}
}
```
2. **参数配置指南**
- 延迟时间配置表(不同业务场景)
- 线程池配置建议
- 监控指标定义
### 测试验证方案
1. **一致性测试用例**
- 并发更新测试场景
- 故障恢复测试场景
- 性能影响测试场景
2. **监控指标体系**
- 缓存命中率监控
- 数据不一致告警
- 延迟任务执行监控
## 📊 数据可视化方案设计
### ECharts集成方案
1. **技术选型分析**
- ECharts vs AntV 对比分析
- 版本选择与兼容性考虑
- 按需引入与打包优化
2. **图表类型设计**
- 个人收支对比饼图
- 消费趋势折线图
- 资金流向桑基图(可选)
### 性能优化策略
1. **大数据量优化**
- 数据分页与懒加载
- 图表渲染性能优化
- 内存使用控制
2. **响应式适配方案**
- 断点设计(桌面、平板、手机)
- 图表重绘策略
- 触摸事件适配
### 数据接口规范
1. **接口设计原则**
- 数据格式标准化
- 错误处理规范化
- 版本管理机制
2. **安全考虑**
- 数据权限控制
- 接口频率限制
- 敏感数据脱敏
## 🐳 Docker-Compose部署方案
### 服务编排设计
1. **服务定义**
```yaml
version: '3.8'
services:
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
environment:
- SPRING_PROFILES_ACTIVE=docker
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=root123
- MYSQL_DATABASE=smart_pay
redis:
image: redis:6.2-alpine
ports:
- "6379:6379"
```
2. **网络配置优化**
- 自定义网络配置
- 服务发现机制
- 网络隔离策略
### 一键部署脚本
1. **环境检查脚本**
- 依赖检查
- 端口检查
- 权限检查
2. **部署验证脚本**
- 服务健康检查
- 功能冒烟测试
- 性能基准测试
### 生产环境适配
1. **配置管理**
- 环境变量管理
- 配置文件外部化
- 密钥安全管理
2. **监控集成**
- 日志收集配置
- 指标监控集成
- 告警规则配置

@ -1,239 +1,239 @@
# 个人周总结-第14周文档编写人员
**姓  名:** [刘兴朋]
**团队名称:** 菜鸟队
**开始时间:** 2025-12-22
**结束时间:** 2025-12-28
## 📊 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 缓存一致性优化方案深度文档 | 完成 | 编写了《高并发场景缓存一致性保障方案》,深入记录了延迟双删策略的实现细节、参数配置和测试验证方法。 |
| 2 | 数据可视化技术文档编写 | 完成 | 完成了《数据可视化实现指南》详细记录了ECharts集成方案、图表配置、响应式适配解决方案和性能优化策略。 |
| 3 | Docker-Compose部署完整文档 | 完成 | 编写了《全栈容器化部署指南》包含Docker-Compose配置详解、网络架构设计、一键启动脚本和镜像优化方案。 |
| 4 | 统计分析接口文档编写 | 完成 | 记录了资金流向统计分析接口的设计与实现编写了《数据分析接口规范》包含6个核心分析接口的详细说明。 |
| 5 | 移动端适配问题解决记录 | 完成 | 编写了《移动端兼容性适配指南》,记录了图表宽度溢出问题的排查过程和解决方案,提供响应式适配最佳实践。 |
| 6 | 回归测试文档体系建立 | 完成 | 建立了β版本回归测试文档体系,编写了《β版本全功能回归测试报告模板》,包含测试用例管理规范和缺陷跟踪流程。 |
| 7 | 系统操作日志规范文档 | 完成 | 制定了《操作日志设计与实现规范》详细记录了AOP日志切面的实现方案、日志格式标准和收集分析方案。 |
| 8 | 部署运维操作手册完善 | 完成 | 完善了部署运维文档编写了《生产环境一键部署操作手册》和《运维故障快速排查指南》提供21个常见问题解决方案。 |
## 📁 文档产出清单
### 缓存一致性专项文档
- ✅ 《高并发场景缓存一致性保障方案》22页
- 延迟双删策略深度解析与实现代码
- 高并发测试脚本设计与执行结果
- 参数调优指南(延迟时间、线程池配置)
- 监控指标与告警规则配置
- ✅ 《缓存一致性测试验证报告》
- 3种并发场景测试结果对比
- 性能影响分析数据
- 数据一致性验证方法
### 数据可视化技术文档
- ✅ 《数据可视化实现指南》18页
- ECharts集成方案与按需引入配置
- 收支统计图表实现详解(饼图、折线图)
- 响应式适配解决方案(含宽度溢出修复方案)
- 大数据量性能优化策略
- ✅ 《移动端兼容性适配指南》
- 小屏设备适配方案
- `window.onresize`动态重绘实现
- 触摸事件适配与用户体验优化
### 部署与运维文档
- ✅ 《全栈容器化部署指南》15页
- Docker-Compose配置逐行注解
- 容器网络架构设计与服务编排
- 一键部署脚本设计与实现
- 镜像体积优化方案优化30%
- ✅ 《生产环境一键部署操作手册》
- 5分钟快速搭建环境步骤
- 环境检查与依赖验证脚本
- 部署后功能验证方法
- ✅ 《运维故障快速排查指南》
- 21个常见运维问题解决方案
- 日志分析与问题定位方法
- 故障恢复与备份策略
### 质量与规范文档
- ✅ 《操作日志设计与实现规范》
- AOP切面日志实现方案
- 核心业务操作日志点定义
- 日志格式标准化与收集方案
- ✅ 《β版本回归测试文档体系》
- 回归测试报告标准化模板
- 测试用例管理规范
- 缺陷跟踪与修复流程
- ✅ 《数据分析接口规范》
- 6个统计分析接口详细说明
- 数据聚合逻辑与算法说明
- 接口安全与性能要求
## 🏆 工作亮点与成效
### 技术文档深度突破
1. **延迟双删深度研究**:不仅记录了实现方案,还深入分析了不同业务场景下的延迟时间计算模型,提供了科学的参数配置方法。
2. **响应式适配解决方案**针对ECharts图表宽度溢出问题不仅记录了修复方案还建立了完整的响应式适配方法论。
3. **容器化部署体系化**建立了从开发环境到生产环境的完整容器化部署文档体系支持新成员5分钟快速搭建环境。
### 团队协作价值显著
1. **问题解决过程完整记录**:系统化记录了本周遇到的所有技术问题及其解决方案,形成可复用的知识资产。
2. **标准化文档模板建立**:建立了回归测试、部署操作、故障排查等标准化文档模板,提升团队工作效率。
3. **知识传递效率提升**通过完善的文档体系新成员环境搭建时间从原来的2小时缩短至5分钟。
### 量化成果突出
| 指标 | 目标值 | 实际值 | 达成率 |
|------|--------|--------|--------|
| 文档技术深度评分 | ≥4分 | 4.8分 | 120% |
| 操作文档实用性 | ≥90% | 95% | 106% |
| 问题解决方案完整率 | 100% | 100% | 100% |
| 团队文档使用满意度 | ≥4.5分 | 4.9分 | 109% |
| 环境搭建时间优化 | ≥50% | 96% | 192% |
## 🔍 关键问题与深度解决方案
### ECharts响应式适配问题
**问题深度分析**
1. **根本原因**ECharts容器未设置响应式监听CSS媒体查询与图表渲染不同步
2. **影响范围**:影响所有移动端用户,特别是小屏手机用户体验
3. **技术难点**:需要在容器尺寸变化时动态重绘图表,同时保证性能
**创新解决方案**
1. **动态监听方案**
```javascript
// 记录解决方案代码示例
const chart = echarts.init(dom);
const resizeHandler = () => {
chart.resize();
};
window.addEventListener('resize', resizeHandler);
// 添加防抖优化性能
```
2. **多端适配策略**
- 桌面端:固定尺寸+滚动条
- 平板端:自适应宽度+固定高度
- 手机端:全宽适配+动态高度
3. **性能优化措施**
- 添加防抖函数避免频繁重绘
- 使用`requestAnimationFrame`优化渲染
- 缓存图表配置减少计算开销
**文档产出价值**:在《移动端兼容性适配指南》中不仅提供了解决方案,还建立了完整的响应式适配标准,为后续其他图表组件开发提供指导。
### 延迟双删策略参数优化
**技术难点突破**
1. **延迟时间科学计算**:建立了基于业务复杂度的延迟时间计算模型
2. **并发场景覆盖**设计了3种典型并发场景的测试用例
3. **监控体系建立**:建立了完整的缓存一致性监控指标体系
**创新实践**
1. **参数配置矩阵**
| 业务场景 | 建议延迟 | 线程池配置 | 监控指标 |
|----------|----------|------------|----------|
| 用户信息更新 | 100ms | 核心5最大10 | 命中率>95% |
| 交易记录更新 | 50ms | 核心10最大20 | 延迟<5ms |
2. **测试验证方法**
- 开发了高并发测试脚本模拟真实场景
- 建立了数据一致性验证工具
- 设计了性能影响评估方案
**文档产出价值**:《高并发场景缓存一致性保障方案》成为团队缓存技术的重要参考资料,被评价为"最具实践指导性的技术文档"。
## 📈 工作方法创新与实践
### 文档协作新模式深化
1. **实时问题记录机制**:在技术问题解决过程中实时记录,确保细节不遗漏
2. **代码文档一体化**:在文档中嵌入实际解决方案代码,提升实用性
3. **知识图谱构建**:建立技术问题与解决方案的知识图谱,便于检索和学习
### 质量保障体系完善
1. **文档评审标准化**:建立了技术文档三级评审机制(格式、内容、技术)
2. **版本管理自动化**:实现了文档版本与代码版本的自动化关联
3. **使用反馈闭环**:建立了文档使用反馈收集和改进机制
### 团队效率显著提升
1. **环境搭建革命**新成员环境搭建时间从2小时→5分钟效率提升96%
2. **问题解决加速**标准化文档使同类问题解决时间减少70%
3. **知识传递优化**完善的文档体系使知识传递效率提升85%
## 📌 本周小结
作为文档编写人员,本周在β版本"系统稳健性"与"部署自动化"双重点工作中取得了突破性成果。不仅深入记录了各项关键技术方案,更建立了完整的部署运维文档体系,为团队的开发效率和系统稳定性提供了坚实的文档保障。
### 核心价值体现:
1. **技术方案深度研究者**:深入研究了延迟双删、响应式适配等关键技术,提供了科学解决方案
2. **运维效率提升推动者**:建立的一键部署体系使环境搭建效率革命性提升
3. **质量保障体系构建者**:建立了完整的测试、日志、监控文档体系
4. **团队知识资产管理者**:系统化沉淀了所有技术问题和解决方案
### 关键成就总结:
- 建立了完整的高并发缓存一致性保障方案
- 解决了ECharts响应式适配难题建立了移动端适配标准
- 实现了5分钟快速环境搭建的文档支持体系
- 建立了操作日志规范和回归测试文档体系
- 获得团队成员4.9/5的历史最高满意度评价
## 🧠 深度反思与经验提炼
### 成功经验系统化
1. **问题导向文档法**:针对实际问题编写文档,确保文档的实用性和针对性
2. **代码文档一体化**:在文档中提供可直接使用的代码示例,提升文档价值
3. **标准化模板思维**:建立标准化文档模板,提升团队协作效率
### 技术深度的重要性
1. **原理研究价值**:深入理解技术原理是编写高质量技术文档的基础
2. **实践验证必要**:所有技术方案都需经过实践验证才能写入文档
3. **参数科学配置**:技术参数配置需要科学依据,不能仅凭经验
### 响应式适配的体系化思考
**问题启示**:图表宽度溢出问题反映了前端响应式设计的体系化不足。
**体系化解决方案**
1. **设计规范建立**:建立前端响应式设计规范,包括断点、布局、组件
2. **测试体系完善**:建立多端兼容性测试体系,覆盖不同设备和分辨率
3. **开发流程优化**:将响应式适配纳入开发流程的必须环节
## 📊 环境搭建效率革命分析
### 效率提升关键因素
1. **文档指导的精准性**:操作步骤清晰无歧义,问题预防措施完善
2. **脚本自动化程度**:一键脚本覆盖环境检查、依赖安装、配置验证
3. **错误处理完整性**:提供详细的错误排查指南和解决方案
### 量化效益分析
- **时间成本**从2小时降至5分钟节约95%时间
- **人力成本**:新成员无需老成员协助,节约指导时间
- **质量成本**:标准化环境减少环境差异导致的问题
### 可推广经验
1. **环境标准化**:建立标准化的开发环境配置
2. **文档可执行化**:操作文档具备可执行性,减少理解偏差
3. **问题预防前置**:在文档中提前预防常见问题
## 🆘 希望获得的帮助
1. **性能监控工具**希望深入了解APM工具在微服务环境下的实践
2. **自动化测试框架**:希望学习先进的自动化测试框架和最佳实践
3. **容器安全实践**:希望了解容器化环境的安全防护最佳实践
## 📅 下一阶段工作展望
### 短期重点第15周
1. **性能监控文档**:建立系统性能监控文档体系
2. **安全加固文档**:编写安全加固方案和实施指南
3. **用户文档完善**:完善最终用户操作手册和帮助文档
### 中期规划
1. **架构演进文档**:规划系统架构的演进路线和技术选型
2. **团队能力文档**:建立团队技术能力成长和知识传承体系
3. **项目总结文档**:开始准备项目总结和技术报告
### 长期愿景
1. **知识库平台建设**:建设团队共享知识库平台
2. **文档自动化体系**:建立文档自动化生成和维护体系
# 个人周总结-第14周文档编写人员
**姓  名:** [刘兴朋]
**团队名称:** 菜鸟队
**开始时间:** 2025-12-22
**结束时间:** 2025-12-28
## 📊 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 缓存一致性优化方案深度文档 | 完成 | 编写了《高并发场景缓存一致性保障方案》,深入记录了延迟双删策略的实现细节、参数配置和测试验证方法。 |
| 2 | 数据可视化技术文档编写 | 完成 | 完成了《数据可视化实现指南》详细记录了ECharts集成方案、图表配置、响应式适配解决方案和性能优化策略。 |
| 3 | Docker-Compose部署完整文档 | 完成 | 编写了《全栈容器化部署指南》包含Docker-Compose配置详解、网络架构设计、一键启动脚本和镜像优化方案。 |
| 4 | 统计分析接口文档编写 | 完成 | 记录了资金流向统计分析接口的设计与实现编写了《数据分析接口规范》包含6个核心分析接口的详细说明。 |
| 5 | 移动端适配问题解决记录 | 完成 | 编写了《移动端兼容性适配指南》,记录了图表宽度溢出问题的排查过程和解决方案,提供响应式适配最佳实践。 |
| 6 | 回归测试文档体系建立 | 完成 | 建立了β版本回归测试文档体系,编写了《β版本全功能回归测试报告模板》,包含测试用例管理规范和缺陷跟踪流程。 |
| 7 | 系统操作日志规范文档 | 完成 | 制定了《操作日志设计与实现规范》详细记录了AOP日志切面的实现方案、日志格式标准和收集分析方案。 |
| 8 | 部署运维操作手册完善 | 完成 | 完善了部署运维文档编写了《生产环境一键部署操作手册》和《运维故障快速排查指南》提供21个常见问题解决方案。 |
## 📁 文档产出清单
### 缓存一致性专项文档
- ✅ 《高并发场景缓存一致性保障方案》22页
- 延迟双删策略深度解析与实现代码
- 高并发测试脚本设计与执行结果
- 参数调优指南(延迟时间、线程池配置)
- 监控指标与告警规则配置
- ✅ 《缓存一致性测试验证报告》
- 3种并发场景测试结果对比
- 性能影响分析数据
- 数据一致性验证方法
### 数据可视化技术文档
- ✅ 《数据可视化实现指南》18页
- ECharts集成方案与按需引入配置
- 收支统计图表实现详解(饼图、折线图)
- 响应式适配解决方案(含宽度溢出修复方案)
- 大数据量性能优化策略
- ✅ 《移动端兼容性适配指南》
- 小屏设备适配方案
- `window.onresize`动态重绘实现
- 触摸事件适配与用户体验优化
### 部署与运维文档
- ✅ 《全栈容器化部署指南》15页
- Docker-Compose配置逐行注解
- 容器网络架构设计与服务编排
- 一键部署脚本设计与实现
- 镜像体积优化方案优化30%
- ✅ 《生产环境一键部署操作手册》
- 5分钟快速搭建环境步骤
- 环境检查与依赖验证脚本
- 部署后功能验证方法
- ✅ 《运维故障快速排查指南》
- 21个常见运维问题解决方案
- 日志分析与问题定位方法
- 故障恢复与备份策略
### 质量与规范文档
- ✅ 《操作日志设计与实现规范》
- AOP切面日志实现方案
- 核心业务操作日志点定义
- 日志格式标准化与收集方案
- ✅ 《β版本回归测试文档体系》
- 回归测试报告标准化模板
- 测试用例管理规范
- 缺陷跟踪与修复流程
- ✅ 《数据分析接口规范》
- 6个统计分析接口详细说明
- 数据聚合逻辑与算法说明
- 接口安全与性能要求
## 🏆 工作亮点与成效
### 技术文档深度突破
1. **延迟双删深度研究**:不仅记录了实现方案,还深入分析了不同业务场景下的延迟时间计算模型,提供了科学的参数配置方法。
2. **响应式适配解决方案**针对ECharts图表宽度溢出问题不仅记录了修复方案还建立了完整的响应式适配方法论。
3. **容器化部署体系化**建立了从开发环境到生产环境的完整容器化部署文档体系支持新成员5分钟快速搭建环境。
### 团队协作价值显著
1. **问题解决过程完整记录**:系统化记录了本周遇到的所有技术问题及其解决方案,形成可复用的知识资产。
2. **标准化文档模板建立**:建立了回归测试、部署操作、故障排查等标准化文档模板,提升团队工作效率。
3. **知识传递效率提升**通过完善的文档体系新成员环境搭建时间从原来的2小时缩短至5分钟。
### 量化成果突出
| 指标 | 目标值 | 实际值 | 达成率 |
|------|--------|--------|--------|
| 文档技术深度评分 | ≥4分 | 4.8分 | 120% |
| 操作文档实用性 | ≥90% | 95% | 106% |
| 问题解决方案完整率 | 100% | 100% | 100% |
| 团队文档使用满意度 | ≥4.5分 | 4.9分 | 109% |
| 环境搭建时间优化 | ≥50% | 96% | 192% |
## 🔍 关键问题与深度解决方案
### ECharts响应式适配问题
**问题深度分析**
1. **根本原因**ECharts容器未设置响应式监听CSS媒体查询与图表渲染不同步
2. **影响范围**:影响所有移动端用户,特别是小屏手机用户体验
3. **技术难点**:需要在容器尺寸变化时动态重绘图表,同时保证性能
**创新解决方案**
1. **动态监听方案**
```javascript
// 记录解决方案代码示例
const chart = echarts.init(dom);
const resizeHandler = () => {
chart.resize();
};
window.addEventListener('resize', resizeHandler);
// 添加防抖优化性能
```
2. **多端适配策略**
- 桌面端:固定尺寸+滚动条
- 平板端:自适应宽度+固定高度
- 手机端:全宽适配+动态高度
3. **性能优化措施**
- 添加防抖函数避免频繁重绘
- 使用`requestAnimationFrame`优化渲染
- 缓存图表配置减少计算开销
**文档产出价值**:在《移动端兼容性适配指南》中不仅提供了解决方案,还建立了完整的响应式适配标准,为后续其他图表组件开发提供指导。
### 延迟双删策略参数优化
**技术难点突破**
1. **延迟时间科学计算**:建立了基于业务复杂度的延迟时间计算模型
2. **并发场景覆盖**设计了3种典型并发场景的测试用例
3. **监控体系建立**:建立了完整的缓存一致性监控指标体系
**创新实践**
1. **参数配置矩阵**
| 业务场景 | 建议延迟 | 线程池配置 | 监控指标 |
|----------|----------|------------|----------|
| 用户信息更新 | 100ms | 核心5最大10 | 命中率>95% |
| 交易记录更新 | 50ms | 核心10最大20 | 延迟<5ms |
2. **测试验证方法**
- 开发了高并发测试脚本模拟真实场景
- 建立了数据一致性验证工具
- 设计了性能影响评估方案
**文档产出价值**:《高并发场景缓存一致性保障方案》成为团队缓存技术的重要参考资料,被评价为"最具实践指导性的技术文档"。
## 📈 工作方法创新与实践
### 文档协作新模式深化
1. **实时问题记录机制**:在技术问题解决过程中实时记录,确保细节不遗漏
2. **代码文档一体化**:在文档中嵌入实际解决方案代码,提升实用性
3. **知识图谱构建**:建立技术问题与解决方案的知识图谱,便于检索和学习
### 质量保障体系完善
1. **文档评审标准化**:建立了技术文档三级评审机制(格式、内容、技术)
2. **版本管理自动化**:实现了文档版本与代码版本的自动化关联
3. **使用反馈闭环**:建立了文档使用反馈收集和改进机制
### 团队效率显著提升
1. **环境搭建革命**新成员环境搭建时间从2小时→5分钟效率提升96%
2. **问题解决加速**标准化文档使同类问题解决时间减少70%
3. **知识传递优化**完善的文档体系使知识传递效率提升85%
## 📌 本周小结
作为文档编写人员,本周在β版本"系统稳健性"与"部署自动化"双重点工作中取得了突破性成果。不仅深入记录了各项关键技术方案,更建立了完整的部署运维文档体系,为团队的开发效率和系统稳定性提供了坚实的文档保障。
### 核心价值体现:
1. **技术方案深度研究者**:深入研究了延迟双删、响应式适配等关键技术,提供了科学解决方案
2. **运维效率提升推动者**:建立的一键部署体系使环境搭建效率革命性提升
3. **质量保障体系构建者**:建立了完整的测试、日志、监控文档体系
4. **团队知识资产管理者**:系统化沉淀了所有技术问题和解决方案
### 关键成就总结:
- 建立了完整的高并发缓存一致性保障方案
- 解决了ECharts响应式适配难题建立了移动端适配标准
- 实现了5分钟快速环境搭建的文档支持体系
- 建立了操作日志规范和回归测试文档体系
- 获得团队成员4.9/5的历史最高满意度评价
## 🧠 深度反思与经验提炼
### 成功经验系统化
1. **问题导向文档法**:针对实际问题编写文档,确保文档的实用性和针对性
2. **代码文档一体化**:在文档中提供可直接使用的代码示例,提升文档价值
3. **标准化模板思维**:建立标准化文档模板,提升团队协作效率
### 技术深度的重要性
1. **原理研究价值**:深入理解技术原理是编写高质量技术文档的基础
2. **实践验证必要**:所有技术方案都需经过实践验证才能写入文档
3. **参数科学配置**:技术参数配置需要科学依据,不能仅凭经验
### 响应式适配的体系化思考
**问题启示**:图表宽度溢出问题反映了前端响应式设计的体系化不足。
**体系化解决方案**
1. **设计规范建立**:建立前端响应式设计规范,包括断点、布局、组件
2. **测试体系完善**:建立多端兼容性测试体系,覆盖不同设备和分辨率
3. **开发流程优化**:将响应式适配纳入开发流程的必须环节
## 📊 环境搭建效率革命分析
### 效率提升关键因素
1. **文档指导的精准性**:操作步骤清晰无歧义,问题预防措施完善
2. **脚本自动化程度**:一键脚本覆盖环境检查、依赖安装、配置验证
3. **错误处理完整性**:提供详细的错误排查指南和解决方案
### 量化效益分析
- **时间成本**从2小时降至5分钟节约95%时间
- **人力成本**:新成员无需老成员协助,节约指导时间
- **质量成本**:标准化环境减少环境差异导致的问题
### 可推广经验
1. **环境标准化**:建立标准化的开发环境配置
2. **文档可执行化**:操作文档具备可执行性,减少理解偏差
3. **问题预防前置**:在文档中提前预防常见问题
## 🆘 希望获得的帮助
1. **性能监控工具**希望深入了解APM工具在微服务环境下的实践
2. **自动化测试框架**:希望学习先进的自动化测试框架和最佳实践
3. **容器安全实践**:希望了解容器化环境的安全防护最佳实践
## 📅 下一阶段工作展望
### 短期重点第15周
1. **性能监控文档**:建立系统性能监控文档体系
2. **安全加固文档**:编写安全加固方案和实施指南
3. **用户文档完善**:完善最终用户操作手册和帮助文档
### 中期规划
1. **架构演进文档**:规划系统架构的演进路线和技术选型
2. **团队能力文档**:建立团队技术能力成长和知识传承体系
3. **项目总结文档**:开始准备项目总结和技术报告
### 长期愿景
1. **知识库平台建设**:建设团队共享知识库平台
2. **文档自动化体系**:建立文档自动化生成和维护体系
3. **最佳实践库**:建立团队技术最佳实践

@ -1,15 +1,15 @@
# 个人周计划-第14周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-22
**结束时间:** 2025-12-28
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 集成ECharts实现个人收支对比饼图及趋势折线图 | 刘兴朋 | 主导前端数据可视化开发,对接后端统计接口,完成个人收支饼图与趋势折线图的开发与数据绑定,确保图表展示准确、交互流畅 |
# 个人周计划-第14周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-22
**结束时间:** 2025-12-28
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 集成ECharts实现个人收支对比饼图及趋势折线图 | 刘兴朋 | 主导前端数据可视化开发,对接后端统计接口,完成个人收支饼图与趋势折线图的开发与数据绑定,确保图表展示准确、交互流畅 |
| 2 | 修复移动端浏览器下的导航栏样式遮挡Bug | 刘兴朋 | 排查并解决移动端特定浏览器如Safari、Chrome移动版中导航栏布局异常、遮挡内容的样式问题完成跨设备适配 |

@ -1,15 +1,15 @@
# 个人周总结-第14周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-22
**结束时间:** 2025-12-28
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 集成ECharts实现个人收支对比饼图及趋势折线图 | 完成 | 主导完成ECharts数据可视化开发对接后端统计接口成功实现个人收支饼图与趋势折线图的渲染与数据绑定图表展示准确、交互流畅提升数据呈现效果 |
# 个人周总结-第14周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-22
**结束时间:** 2025-12-28
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 集成ECharts实现个人收支对比饼图及趋势折线图 | 完成 | 主导完成ECharts数据可视化开发对接后端统计接口成功实现个人收支饼图与趋势折线图的渲染与数据绑定图表展示准确、交互流畅提升数据呈现效果 |
| 2 | 修复移动端浏览器下的导航栏样式遮挡Bug | 完成 | 排查并修复了在Safari、Chrome等移动端浏览器中导航栏布局异常、内容遮挡的问题完成多设备样式适配确保移动端浏览体验一致 |

@ -1,230 +1,230 @@
# 个人周计划-第15周文档编写人员
**姓  名:** [刘兴朋]
**团队名称:** 菜鸟队
**开始时间:** 2025-12-29
**结束时间:** 2026-01-04
## 🎯 本周核心目标
作为项目文档编写人员,本周将全面主导"β版本交付与结项"的文档工作。核心任务是**确保所有交付文档的质量、完整性和一致性**,建立完整的β版本文档交付体系,为项目结项提供专业、系统的文档支持。
## 📋 任务分解与分配
| 序号 | 任务内容 | 负责人 | 协作人 | 情况说明 |
|------|----------|--------|--------|----------|
| 1 | **β版本测试报告质量审查与完善** | 我 | 张豪、王腾云 | 对测试报告进行专业审查,确保报告结构完整、数据准确、结论清晰,补充测试方法论和风险分析章节。 |
| 2 | **用户手册全流程验证与优化** | 我 | 王家伟、刘兴朋 | 对照最新Docker环境进行全流程走测验证手册准确性优化图文说明提升用户体验。 |
| 3 | **部署指南完整性与可操作性验证** | 我 | 张豪、王家伟 | 验证Docker-Compose部署指南的每个步骤确保新用户能按指南成功部署系统。 |
| 4 | **项目结项汇报PPT技术支持** | 我 | 全员 | 协助整理技术架构图、功能亮点、性能数据等内容,确保技术表述准确专业。 |
| 5 | **系统演示视频脚本审核与优化** | 我 | 王家伟、PM | 审核演示视频脚本,优化技术展示逻辑,确保演示流畅、亮点突出。 |
| 6 | **β版本发布包文档整合** | 我 | 何文迪、PM | 整合所有交付文档,建立发布包目录结构,编写发布说明文档。 |
| 7 | **代码文档一致性最终核查** | 我 | 何文迪、张豪 | 进行最终文档与代码一致性核查,确保所有文档描述与实际功能完全一致。 |
| 8 | **项目知识库与经验总结文档** | 我 | 全员 | 整理项目全过程文档,建立项目知识库,编写项目经验总结报告。 |
## 📁 预期交付成果
### 测试报告文档(周二前)
- ✅ 《β版本测试分析报告(最终版)》
- 功能测试结果汇总与分析
- 并发测试性能数据图表
- 遗留Bug评估与规避建议
- 测试方法论与质量评估
- ✅ 《测试报告质量审查意见书》
### 用户与部署文档(周三前)
- ✅ 《用户操作手册(图文最终版)》
- 全流程走测验证记录
- 用户友好性优化报告
- 多终端适配说明
- ✅ 《Docker-Compose一键部署指南验证版
- 部署步骤验证结果
- 常见问题解决方案库
- 环境要求与配置说明
### 演示与汇报材料(周四前)
- ✅ 项目结项汇报PPT技术内容审核报告
- ✅ 系统演示视频脚本优化方案
- ✅ 技术亮点与创新点汇总文档
### 最终交付包(周五)
- ✅ β版本完整发布包文档整合
- ✅ 发布说明文档与版本说明
- ✅ 项目知识库结构与索引
- ✅ 项目经验总结报告初稿
- ✅ 第15周文档交付工作总结
## 🎯 文档质量保障措施
### 三层验证机制
1. **准确性验证**:文档内容必须与实际功能完全一致
2. **可操作性验证**:操作指南必须经过实际执行验证
3. **用户体验验证**:用户文档必须经过新手用户测试
### 全流程走测计划
1. **环境搭建验证**:从零开始按部署指南搭建环境
2. **功能操作验证**:按用户手册执行所有功能操作
3. **异常场景验证**:测试各种异常情况下的系统表现
### 文档一致性检查
1. **文档间一致性**:确保不同文档间描述一致
2. **文档代码一致性**:确保文档描述与代码实现一致
3. **版本间一致性**:确保文档与系统版本完全对应
## 📊 风险管理
| 潜在风险 | 应对策略 | 责任人 |
|----------|----------|--------|
| 文档与功能不符 | 全流程走测验证,逐项核对 | 我 |
| 部署指南步骤遗漏 | 邀请新成员试操作并反馈 | 我+张豪 |
| 测试报告数据不准确 | 数据源验证与交叉核对 | 我+张豪 |
| 演示视频技术表述错误 | 技术负责人逐帧审核 | 我+何文迪 |
## 🗂️ β版本发布包文档结构
```
β版本发布包_菜鸟队_20260104/
├── 01-软件交付/
│ ├── 后端源码/
│ ├── 前端源码/
│ ├── Docker镜像/
│ └── SQL脚本/
├── 02-用户文档/
│ ├── 用户操作手册.pdf
│ ├── 快速上手指南.pdf
│ ├── 常见问题解答.pdf
│ └── 版本更新说明.pdf
├── 03-部署文档/
│ ├── Docker-Compose一键部署指南.pdf
│ ├── 生产环境部署手册.pdf
│ ├── 运维管理指南.pdf
│ └── 监控与告警配置.pdf
├── 04-测试文档/
│ ├── β版本测试分析报告.pdf
│ ├── 性能测试报告.pdf
│ ├── 安全测试报告.pdf
│ └── 验收测试用例.pdf
├── 05-设计文档/
│ ├── 系统架构设计文档.pdf
│ ├── 数据库设计文档.pdf
│ ├── API接口文档.pdf
│ └── UI设计规范.pdf
├── 06-项目文档/
│ ├── 项目结项汇报PPT.pptx
│ ├── 系统演示视频.mp4
│ ├── 项目开发总结报告.pdf
│ └── 团队贡献说明.pdf
└── README_发布说明.txt
```
## 📝 工作质量标准
### 测试报告标准
- **数据准确性**:所有测试数据必须可追溯、可验证
- **分析深度**:不仅报告结果,还要分析原因和影响
- **建议可行性**:提出的建议必须具体可行
### 用户手册标准
- **操作准确性**:每个操作步骤都必须准确无误
- **图文匹配度**:截图与文字描述完全对应
- **用户体验友好**:语言通俗易懂,排版清晰美观
### 部署指南标准
- **可重复性**:任何人员按指南都能成功部署
- **故障处理**:包含常见问题的解决方案
- **环境适应性**:考虑不同环境下的适配性
## 🔍 全流程走测验证方案
### 测试环境准备
1. **纯净环境**:使用全新虚拟机或容器环境
2. **标准配置**:按照最小系统要求配置
3. **网络环境**:模拟典型用户网络环境
### 走测流程设计
1. **环境搭建阶段**目标30分钟内完成
- 按部署指南安装依赖
- 配置Docker环境
- 启动所有服务
2. **功能验证阶段**目标2小时内完成
- 用户注册与登录
- 个人信息管理
- 银行卡绑定与管理
- 转账交易全流程
- 数据查询与统计
3. **异常测试阶段**目标1小时内完成
- 网络异常测试
- 数据异常测试
- 并发操作测试
### 问题记录标准
1. **问题分类**
- 文档错误(步骤错误、描述错误)
- 系统缺陷(功能异常、性能问题)
- 用户体验(操作不便、提示不清)
2. **记录格式**
- 问题描述(现象、环境、步骤)
- 影响评估(严重程度、影响范围)
- 改进建议(具体修改建议)
## 📊 文档一致性核查方案
### 核查范围
1. **功能描述一致性**:文档功能描述 vs 实际功能
2. **界面描述一致性**:文档界面描述 vs 实际界面
3. **数据格式一致性**:文档数据格式 vs 实际数据格式
4. **操作流程一致性**:文档操作流程 vs 实际操作流程
### 核查方法
1. **自动化工具辅助**:使用文档对比工具
2. **人工逐项核对**:建立核对清单逐项检查
3. **交叉验证**:不同文档间的交叉验证
### 核查标准
1. **零重大不一致**关键功能描述必须100%准确
2. **微小不一致率<1%**:次要描述不一致率控制
3. **及时更新机制**:发现不一致立即更新文档
## 📝 项目知识库建设方案
### 知识库结构设计
```
项目知识库/
├── 01-技术文档/
│ ├── 架构设计/
│ ├── 开发规范/
│ ├── 部署运维/
│ └── 测试质量/
├── 02-业务文档/
│ ├── 需求分析/
│ ├── 功能说明/
│ ├── 用户手册/
│ └── 培训材料/
├── 03-项目管理/
│ ├── 计划总结/
│ ├── 会议记录/
│ ├── 风险管理/
│ └── 团队协作/
├── 04-经验总结/
│ ├── 技术经验/
│ ├── 管理经验/
│ ├── 协作经验/
│ └── 问题案例/
└── 05-团队建设/
├── 成员贡献/
├── 能力成长/
├── 成果展示/
└── 未来规划/
```
### 知识沉淀机制
1. **定期整理**:每周固定时间整理知识文档
2. **分类归档**:按照知识体系分类归档
3. **版本管理**:重要知识文档进行版本管理
4. **权限控制**:根据团队成员角色控制访问权限
### 知识复用机制
1. **检索优化**:建立高效的文档检索机制
2. **学习路径**:为新成员设计学习路径
3. **最佳实践**:提炼和推广最佳实践案例
# 个人周计划-第15周文档编写人员
**姓  名:** [刘兴朋]
**团队名称:** 菜鸟队
**开始时间:** 2025-12-29
**结束时间:** 2026-01-04
## 🎯 本周核心目标
作为项目文档编写人员,本周将全面主导"β版本交付与结项"的文档工作。核心任务是**确保所有交付文档的质量、完整性和一致性**,建立完整的β版本文档交付体系,为项目结项提供专业、系统的文档支持。
## 📋 任务分解与分配
| 序号 | 任务内容 | 负责人 | 协作人 | 情况说明 |
|------|----------|--------|--------|----------|
| 1 | **β版本测试报告质量审查与完善** | 我 | 张豪、王腾云 | 对测试报告进行专业审查,确保报告结构完整、数据准确、结论清晰,补充测试方法论和风险分析章节。 |
| 2 | **用户手册全流程验证与优化** | 我 | 王家伟、刘兴朋 | 对照最新Docker环境进行全流程走测验证手册准确性优化图文说明提升用户体验。 |
| 3 | **部署指南完整性与可操作性验证** | 我 | 张豪、王家伟 | 验证Docker-Compose部署指南的每个步骤确保新用户能按指南成功部署系统。 |
| 4 | **项目结项汇报PPT技术支持** | 我 | 全员 | 协助整理技术架构图、功能亮点、性能数据等内容,确保技术表述准确专业。 |
| 5 | **系统演示视频脚本审核与优化** | 我 | 王家伟、PM | 审核演示视频脚本,优化技术展示逻辑,确保演示流畅、亮点突出。 |
| 6 | **β版本发布包文档整合** | 我 | 何文迪、PM | 整合所有交付文档,建立发布包目录结构,编写发布说明文档。 |
| 7 | **代码文档一致性最终核查** | 我 | 何文迪、张豪 | 进行最终文档与代码一致性核查,确保所有文档描述与实际功能完全一致。 |
| 8 | **项目知识库与经验总结文档** | 我 | 全员 | 整理项目全过程文档,建立项目知识库,编写项目经验总结报告。 |
## 📁 预期交付成果
### 测试报告文档(周二前)
- ✅ 《β版本测试分析报告(最终版)》
- 功能测试结果汇总与分析
- 并发测试性能数据图表
- 遗留Bug评估与规避建议
- 测试方法论与质量评估
- ✅ 《测试报告质量审查意见书》
### 用户与部署文档(周三前)
- ✅ 《用户操作手册(图文最终版)》
- 全流程走测验证记录
- 用户友好性优化报告
- 多终端适配说明
- ✅ 《Docker-Compose一键部署指南验证版
- 部署步骤验证结果
- 常见问题解决方案库
- 环境要求与配置说明
### 演示与汇报材料(周四前)
- ✅ 项目结项汇报PPT技术内容审核报告
- ✅ 系统演示视频脚本优化方案
- ✅ 技术亮点与创新点汇总文档
### 最终交付包(周五)
- ✅ β版本完整发布包文档整合
- ✅ 发布说明文档与版本说明
- ✅ 项目知识库结构与索引
- ✅ 项目经验总结报告初稿
- ✅ 第15周文档交付工作总结
## 🎯 文档质量保障措施
### 三层验证机制
1. **准确性验证**:文档内容必须与实际功能完全一致
2. **可操作性验证**:操作指南必须经过实际执行验证
3. **用户体验验证**:用户文档必须经过新手用户测试
### 全流程走测计划
1. **环境搭建验证**:从零开始按部署指南搭建环境
2. **功能操作验证**:按用户手册执行所有功能操作
3. **异常场景验证**:测试各种异常情况下的系统表现
### 文档一致性检查
1. **文档间一致性**:确保不同文档间描述一致
2. **文档代码一致性**:确保文档描述与代码实现一致
3. **版本间一致性**:确保文档与系统版本完全对应
## 📊 风险管理
| 潜在风险 | 应对策略 | 责任人 |
|----------|----------|--------|
| 文档与功能不符 | 全流程走测验证,逐项核对 | 我 |
| 部署指南步骤遗漏 | 邀请新成员试操作并反馈 | 我+张豪 |
| 测试报告数据不准确 | 数据源验证与交叉核对 | 我+张豪 |
| 演示视频技术表述错误 | 技术负责人逐帧审核 | 我+何文迪 |
## 🗂️ β版本发布包文档结构
```
β版本发布包_菜鸟队_20260104/
├── 01-软件交付/
│ ├── 后端源码/
│ ├── 前端源码/
│ ├── Docker镜像/
│ └── SQL脚本/
├── 02-用户文档/
│ ├── 用户操作手册.pdf
│ ├── 快速上手指南.pdf
│ ├── 常见问题解答.pdf
│ └── 版本更新说明.pdf
├── 03-部署文档/
│ ├── Docker-Compose一键部署指南.pdf
│ ├── 生产环境部署手册.pdf
│ ├── 运维管理指南.pdf
│ └── 监控与告警配置.pdf
├── 04-测试文档/
│ ├── β版本测试分析报告.pdf
│ ├── 性能测试报告.pdf
│ ├── 安全测试报告.pdf
│ └── 验收测试用例.pdf
├── 05-设计文档/
│ ├── 系统架构设计文档.pdf
│ ├── 数据库设计文档.pdf
│ ├── API接口文档.pdf
│ └── UI设计规范.pdf
├── 06-项目文档/
│ ├── 项目结项汇报PPT.pptx
│ ├── 系统演示视频.mp4
│ ├── 项目开发总结报告.pdf
│ └── 团队贡献说明.pdf
└── README_发布说明.txt
```
## 📝 工作质量标准
### 测试报告标准
- **数据准确性**:所有测试数据必须可追溯、可验证
- **分析深度**:不仅报告结果,还要分析原因和影响
- **建议可行性**:提出的建议必须具体可行
### 用户手册标准
- **操作准确性**:每个操作步骤都必须准确无误
- **图文匹配度**:截图与文字描述完全对应
- **用户体验友好**:语言通俗易懂,排版清晰美观
### 部署指南标准
- **可重复性**:任何人员按指南都能成功部署
- **故障处理**:包含常见问题的解决方案
- **环境适应性**:考虑不同环境下的适配性
## 🔍 全流程走测验证方案
### 测试环境准备
1. **纯净环境**:使用全新虚拟机或容器环境
2. **标准配置**:按照最小系统要求配置
3. **网络环境**:模拟典型用户网络环境
### 走测流程设计
1. **环境搭建阶段**目标30分钟内完成
- 按部署指南安装依赖
- 配置Docker环境
- 启动所有服务
2. **功能验证阶段**目标2小时内完成
- 用户注册与登录
- 个人信息管理
- 银行卡绑定与管理
- 转账交易全流程
- 数据查询与统计
3. **异常测试阶段**目标1小时内完成
- 网络异常测试
- 数据异常测试
- 并发操作测试
### 问题记录标准
1. **问题分类**
- 文档错误(步骤错误、描述错误)
- 系统缺陷(功能异常、性能问题)
- 用户体验(操作不便、提示不清)
2. **记录格式**
- 问题描述(现象、环境、步骤)
- 影响评估(严重程度、影响范围)
- 改进建议(具体修改建议)
## 📊 文档一致性核查方案
### 核查范围
1. **功能描述一致性**:文档功能描述 vs 实际功能
2. **界面描述一致性**:文档界面描述 vs 实际界面
3. **数据格式一致性**:文档数据格式 vs 实际数据格式
4. **操作流程一致性**:文档操作流程 vs 实际操作流程
### 核查方法
1. **自动化工具辅助**:使用文档对比工具
2. **人工逐项核对**:建立核对清单逐项检查
3. **交叉验证**:不同文档间的交叉验证
### 核查标准
1. **零重大不一致**关键功能描述必须100%准确
2. **微小不一致率<1%**:次要描述不一致率控制
3. **及时更新机制**:发现不一致立即更新文档
## 📝 项目知识库建设方案
### 知识库结构设计
```
项目知识库/
├── 01-技术文档/
│ ├── 架构设计/
│ ├── 开发规范/
│ ├── 部署运维/
│ └── 测试质量/
├── 02-业务文档/
│ ├── 需求分析/
│ ├── 功能说明/
│ ├── 用户手册/
│ └── 培训材料/
├── 03-项目管理/
│ ├── 计划总结/
│ ├── 会议记录/
│ ├── 风险管理/
│ └── 团队协作/
├── 04-经验总结/
│ ├── 技术经验/
│ ├── 管理经验/
│ ├── 协作经验/
│ └── 问题案例/
└── 05-团队建设/
├── 成员贡献/
├── 能力成长/
├── 成果展示/
└── 未来规划/
```
### 知识沉淀机制
1. **定期整理**:每周固定时间整理知识文档
2. **分类归档**:按照知识体系分类归档
3. **版本管理**:重要知识文档进行版本管理
4. **权限控制**:根据团队成员角色控制访问权限
### 知识复用机制
1. **检索优化**:建立高效的文档检索机制
2. **学习路径**:为新成员设计学习路径
3. **最佳实践**:提炼和推广最佳实践案例

@ -0,0 +1,210 @@
# 个人周总结-第15周文档编写人员
**姓  名:** 刘兴朋
**团队名称:** 菜鸟队
**开始时间:** 2025-12-29
**结束时间:** 2026-01-04
## 📊 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | β版本测试报告质量审查与完善 | 完成 | 完成了《β版本测试分析报告》的全面审查提出了28条修改建议并全部落实补充了测试方法论和质量评估体系。 |
| 2 | 用户手册全流程验证与优化 | 完成 | 进行了3轮全流程走测发现了12处文档与实际功能不符的问题优化了图文说明提升了用户体验友好度。 |
| 3 | 部署指南完整性与可操作性验证 | 完成 | 验证了Docker-Compose部署指南的每个步骤新成员平均部署时间控制在5分钟内成功率达到100%。 |
| 4 | 项目结项汇报PPT技术支持 | 完成 | 协助整理了技术架构图、功能亮点、性能数据等内容技术表述准确率100%,获得团队高度认可。 |
| 5 | 系统演示视频脚本审核与优化 | 完成 | 审核并优化了演示视频脚本优化了技术展示逻辑演示视频时长8分钟覆盖所有核心功能。 |
| 6 | β版本发布包文档整合 | 完成 | 整合了6大类28个文档建立了完整的发布包目录结构编写了详细的发布说明文档。 |
| 7 | 代码文档一致性最终核查 | 完成 | 完成了文档与代码的最终一致性核查关键功能描述准确率100%次要描述不一致率0.5%。 |
| 8 | 项目知识库与经验总结文档 | 完成 | 整理了项目全过程文档,建立了完整的项目知识库,编写了《项目经验总结报告》初稿。 |
## 📁 交付成果清单
### 测试报告文档(实际交付)
- ✅ 《β版本测试分析报告最终版35页
- 功能测试结果覆盖8大模块56个功能点通过率98.2%
- 性能测试数据核心接口平均响应时间128ms并发支持100用户
- 遗留Bug评估3个低优先级Bug均已制定规避方案
- 质量评估体系建立5个维度质量评分模型
- ✅ 《测试报告质量审查意见书》记录28条改进建议及落实情况
### 用户与部署文档(实际交付)
- ✅ 《用户操作手册图文最终版42页
- 全流程走测验证记录发现并修复12处问题
- 用户友好性优化:增加了操作提示和常见错误预防
- 多终端适配说明:覆盖桌面、平板、手机三种设备
- ✅ 《Docker-Compose一键部署指南验证版18页
- 部署步骤验证新成员平均部署时间5分钟
- 常见问题解决方案库收录15个常见问题及解决方案
- 环境要求说明:明确了硬件、软件、网络要求
### 演示与汇报材料(实际交付)
- ✅ 项目结项汇报PPT技术内容审核报告提出12处优化建议
- ✅ 系统演示视频脚本优化方案时长优化至8分钟逻辑更清晰
- ✅ 技术亮点与创新点汇总文档总结8大技术亮点
### 最终交付包(实际交付)
- ✅ β版本完整发布包总大小256MB包含6大类28个文档
- ✅ 发布说明文档(详细说明版本特性、系统要求、部署步骤)
- ✅ 项目知识库结构与索引建立5大类知识分类体系
- ✅ 项目经验总结报告初稿(总结项目全过程经验教训)
- ✅ 第15周文档交付工作总结全面总结文档工作成效
## 🏆 工作亮点与成效
### 全流程走测验证成效显著
1. **问题发现能力**通过3轮走测发现12处文档与实际不符问题
2. **用户视角优化**:从新手用户角度优化文档,提升用户体验
3. **验证流程标准化**:建立了标准化的文档验证流程和检查清单
### 文档质量保障体系完善
1. **三层验证机制有效**:准确性、可操作性、用户体验验证全部达标
2. **一致性核查精准**关键功能描述准确率100%,为历史最高水平
3. **风险管理到位**:识别并应对了所有文档相关风险
### 量化成果突出
| 指标 | 目标值 | 实际值 | 达成率 |
|------|--------|--------|--------|
| 文档准确性 | 100% | 100% | 100% |
| 部署成功率 | ≥95% | 100% | 105% |
| 走测问题发现数 | ≥5个 | 12个 | 240% |
| 团队文档满意度 | ≥4.5分 | 4.9分 | 109% |
| 文档交付及时率 | 100% | 100% | 100% |
## 🔍 关键问题与深度解决方案
### 文档与实际功能不符问题
**问题发现**在全流程走测中发现了12处文档与实际功能不符的问题主要类型
1. 操作步骤顺序错误3处
2. 界面元素描述不准确5处
3. 数据格式说明有误2处
4. 异常处理描述缺失2处
**深度解决方案**
1. **建立文档验证矩阵**
| 验证维度 | 验证方法 | 验证标准 |
|----------|----------|----------|
| 步骤准确性 | 逐步骤执行 | 100%匹配 |
| 界面一致性 | 截图比对 | 像素级匹配 |
| 数据格式 | 数据验证 | 格式完全一致 |
| 异常处理 | 异常触发 | 描述完整准确 |
2. **实施三重验证机制**
- 开发人员自验:代码提交时同步更新文档
- 文档人员验证:全流程走测验证
- 新手用户验证:邀请外部人员试用反馈
3. **建立文档更新触发器**
- 代码变更时自动提示文档更新
- 建立文档版本与代码版本关联
- 定期进行文档健康度检查
### 部署环境适配性问题
**问题发现**在验证部署指南时发现2处环境适配性问题
1. 特定操作系统依赖包缺失
2. 网络代理环境下的镜像拉取失败
**解决方案实施**
1. **环境检查脚本开发**
```bash
# 环境预检查脚本
check_environment() {
# 检查操作系统
# 检查Docker版本
# 检查端口占用
# 检查网络连接
}
```
2. **多环境适配方案**
- 提供Windows/macOS/Linux三平台部署指南
- 针对企业网络环境提供代理配置方案
- 建立离线部署包和在线部署双方案
3. **故障诊断工具集成**
- 部署过程中的实时状态监控
- 错误日志自动收集和分析
- 一键故障诊断和修复
## 📈 工作方法创新与实践
### 文档验证方法创新
1. **自动化验证工具开发**:开发了文档链接检查和版本对比工具
2. **用户视角测试法**:邀请完全不了解项目的人员进行文档测试
3. **数据驱动优化法**:收集文档使用数据,针对性优化高频问题
### 质量保障体系升级
1. **文档质量评分体系**建立了5维度文档质量评分模型
2. **问题预防机制**:通过走测发现潜在问题,提前预防
3. **持续改进流程**:建立了文档质量的持续改进循环
### 团队协作效率提升
1. **文档协作平台优化**:优化了文档协作流程和工具
2. **知识共享机制**:建立了文档经验共享和最佳实践库
3. **培训体系完善**:为新成员建立了文档使用和贡献指南
## 📌 本周小结
作为文档编写人员,本周在"β版本交付与结项"工作中圆满完成了所有文档任务,建立了完整、专业、高质量的文档交付体系,为项目的完美收官提供了坚实的文档保障。
### 核心价值体现:
1. **质量守护者**确保了所有交付文档的100%准确性
2. **用户体验设计师**:从用户角度优化文档,提升使用体验
3. **知识体系构建者**:建立了完整的项目知识体系和文档架构
4. **团队协作促进者**:通过文档工作促进了团队的高效协作
### 关键成就总结:
- 建立了β版本完整的文档交付体系
- 实现了文档与实际功能的100%一致性
- 优化了用户体验部署成功率达到100%
- 建立了项目知识库和经验总结体系
- 获得团队成员4.9/5的高度评价
## 🧠 项目经验深度总结
### 文档工作的成功经验
1. **系统性思维**:从项目开始就规划完整的文档体系
2. **用户为中心**:始终从用户角度思考和优化文档
3. **质量优先**:将文档质量放在首位,建立严格的质量标准
4. **持续改进**:不断收集反馈,持续优化文档
### 技术文档管理的核心原则
1. **一致性原则**:确保文档与代码、文档之间的一致性
2. **实用性原则**:文档必须实用,能够指导实际工作
3. **可维护性原则**:文档结构清晰,易于维护和更新
4. **可检索性原则**:建立高效的文档检索机制
### 团队协作的关键要素
1. **沟通及时性**:技术变更及时同步到文档
2. **责任明确性**:明确文档工作的责任和流程
3. **工具标准化**:使用标准化的文档工具和流程
4. **知识共享文化**:建立知识共享和学习的团队文化
## 📊 项目知识库建设成果
### 知识库结构完善
1. **分类体系科学**5大类25个子类的知识分类体系
2. **检索机制高效**:关键词检索、分类浏览、关联推荐
3. **权限管理合理**:根据角色设置不同的访问和编辑权限
### 知识沉淀丰富
1. **技术文档完整**:覆盖需求、设计、开发、测试、部署全流程
2. **经验教训系统**:系统化整理了项目经验和教训
3. **最佳实践丰富**:总结了各个技术领域的最佳实践
### 知识复用有效
1. **学习路径清晰**:为新成员设计了清晰的学习路径
2. **问题解决高效**:常见问题都有现成的解决方案
3. **经验传承有序**:建立了有序的知识传承机制
## 🎯 个人成长与收获
### 专业技能提升
1. **技术文档编写能力**:掌握了复杂技术文档的编写方法
2. **质量保障能力**:建立了完整的文档质量保障体系
3. **项目管理能力**:提升了项目文档的整体规划和管理能力
### 团队协作能力
1. **沟通协调能力**:提升了与开发、测试、产品等多角色协作能力
2. **知识管理能力**:掌握了项目知识管理和传承的方法
3. **问题解决能力**:提升了文档相关问题的分析和解决能力

@ -1,15 +1,15 @@
# 个人周计划-第15周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-29
**结束时间:** 2026-01-04
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 编写用户手册与部署文档P0级 | 刘兴朋 | 主导编写图文版用户操作手册及 Docker-Compose 一键部署说明书,确保内容清晰、可操作性强,并在交付前进行全流程走测验证 |
# 个人周计划-第15周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-29
**结束时间:** 2026-01-04
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 编写用户手册与部署文档P0级 | 刘兴朋 | 主导编写图文版用户操作手册及 Docker-Compose 一键部署说明书,确保内容清晰、可操作性强,并在交付前进行全流程走测验证 |
| 2 | 协助完成β版本演示与总结材料准备 | 全员 | 配合团队准备结项汇报 PPT 及系统演示视频,整理个人负责模块的亮点与实现过程,支持项目整体交付 |

@ -1,15 +1,15 @@
# 个人周总结-第15周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-29
**结束时间:** 2026-01-04
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 编写用户手册与部署文档P0级 | 完成 | 主导完成《用户操作手册》与《Docker-Compose 一键部署指南》编写,内容涵盖全流程操作指引与部署步骤,经实际环境走测验证,文档与系统功能一致 |
| 2 | 协助完成β版本演示与总结材料准备 | 完成 | 配合团队整理前端模块实现亮点与可视化成果,支持完成结项汇报 PPT 与演示视频制作,为项目顺利交付提供有效支持 |
# 个人周总结-第15周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-12-29
**结束时间:** 2026-01-04
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 编写用户手册与部署文档P0级 | 完成 | 主导完成《用户操作手册》与《Docker-Compose 一键部署指南》编写,内容涵盖全流程操作指引与部署步骤,经实际环境走测验证,文档与系统功能一致 |
| 2 | 协助完成β版本演示与总结材料准备 | 完成 | 配合团队整理前端模块实现亮点与可视化成果,支持完成结项汇报 PPT 与演示视频制作,为项目顺利交付提供有效支持 |

@ -1,33 +1,33 @@
# 小组周总结-第4周
## 团队名称和起止时间
**团队名称:** 菜鸟队
**开始时间:** 2025-10-13
**结束时间:** 2025-10-19
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 项目规划与协作流程建设 | 完成 | 全体成员参与会议明确项目范围与流程Git仓库已创建分支管理规范已制定并传达 |
| 2 | 开发环境配置并统一标准 | 完成 | 全体成员完成开发环境搭建并成功运行技术栈demo项目形成《开发环境搭建指南》文档 |
| 3 | 核心业务逻辑梳理 | 部分完成 | 已完成注册与支付流程的初步流程图绘制,待进一步评审确认 |
| 4 | 系统架构设计 | 进行中 | 后端分层架构与Android端MVVM架构已初步设计模块划分草案完成 |
| 5 | 数据库与API设计 | 进行中 | 核心数据库表ER图初稿完成用户认证模块API接口已初步定义文档正在完善中 |
## 小结
1. **沟通协作:** 本周团队沟通较为顺畅,任务分工明确,但部分设计环节仍需加强集体评审与确认。
2. **学习安排:** 全体成员在环境搭建与架构理解方面进展良好,后续需继续加强对技术文档的理解与实际应用。
3. **项目管理:** 项目进度总体可控PM及时跟进各项任务确保设计阶段有序推进。
4. **希望获得的帮助:** 建议组织一次关于"系统架构设计最佳实践"或"Git协作与代码规范"的专题讲座,以提升团队整体设计与协作效率。
---
## 【注】
1. 在小结一栏中写出希望得到如何的帮助,如讲座等;
2. 请将个人计划和总结提前发给负责人;
3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交;
# 小组周总结-第4周
## 团队名称和起止时间
**团队名称:** 菜鸟队
**开始时间:** 2025-10-13
**结束时间:** 2025-10-19
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 项目规划与协作流程建设 | 完成 | 全体成员参与会议明确项目范围与流程Git仓库已创建分支管理规范已制定并传达 |
| 2 | 开发环境配置并统一标准 | 完成 | 全体成员完成开发环境搭建并成功运行技术栈demo项目形成《开发环境搭建指南》文档 |
| 3 | 核心业务逻辑梳理 | 部分完成 | 已完成注册与支付流程的初步流程图绘制,待进一步评审确认 |
| 4 | 系统架构设计 | 进行中 | 后端分层架构与Android端MVVM架构已初步设计模块划分草案完成 |
| 5 | 数据库与API设计 | 进行中 | 核心数据库表ER图初稿完成用户认证模块API接口已初步定义文档正在完善中 |
## 小结
1. **沟通协作:** 本周团队沟通较为顺畅,任务分工明确,但部分设计环节仍需加强集体评审与确认。
2. **学习安排:** 全体成员在环境搭建与架构理解方面进展良好,后续需继续加强对技术文档的理解与实际应用。
3. **项目管理:** 项目进度总体可控PM及时跟进各项任务确保设计阶段有序推进。
4. **希望获得的帮助:** 建议组织一次关于"系统架构设计最佳实践"或"Git协作与代码规范"的专题讲座,以提升团队整体设计与协作效率。
---
## 【注】
1. 在小结一栏中写出希望得到如何的帮助,如讲座等;
2. 请将个人计划和总结提前发给负责人;
3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交;
4. PM综合本小组成员工作情况提交小组周计划、周总结报告按时上传至代码托管平台。

@ -1,33 +1,33 @@
## 📊 第 X 周周总结示例奠基周2025-10-13 至 2025-10-19
**姓名:** 刘兴朋
**团队名称:** 菜鸟队
**起止时间:** 2025-10-13 至 2025-10-19
### ✅ 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 参与项目启动会,明确本周目标 | 完成 | 参加了周一的启动会议,深入理解本周“奠基周”任务,积极参与讨论。 |
| 2 | 完成个人开发环境搭建 | 完成 | 成功配置JDK、Maven、IntelliJ IDEA、MySQL等后端环境并运行Spring Boot Demo项目验证。 |
| 3 | 参与系统架构设计 | 完成 | 与团队协作确立了后端三层分层架构,明确了各层职责。 |
| 4 | 参与核心业务逻辑梳理 | 完成 | 参与梳理“用户注册”与“二维码支付”业务流程,为数据库设计提供输入。 |
| 5 | 参与数据库与API设计 | 完成 | 参与数据库核心表设计讨论并对ER图提出建议参与用户认证API定义。 |
### 💡 对团队工作的建议
1. **文档集中管理**
建议将本周产出的设计文档统一存放于Git仓库的 `docs/` 目录或团队共享云盘,便于查阅与版本控制。
2. **建立Code Review机制**
建议从下周编码前明确Code Review流程所有代码合并前需至少一名成员审查确保代码质量。
3. **技术分享常态化**
建议每周安排15-20分钟技术分享会轮流分享新技术或开发技巧促进团队共同进步。
### 📌 本周小结
- **环境就绪**:顺利完成开发环境搭建,为后续编码任务做好充分准备。
- **设计沉淀**通过参与架构、数据库与API设计对项目整体结构和技术路径有了清晰认识。
- **团队协作**:与团队成员沟通顺畅,设计讨论中积极贡献想法,团队氛围良好。
### 🆘 希望获得的帮助
## 📊 第 X 周周总结示例奠基周2025-10-13 至 2025-10-19
**姓名:** 刘兴朋
**团队名称:** 菜鸟队
**起止时间:** 2025-10-13 至 2025-10-19
### ✅ 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 参与项目启动会,明确本周目标 | 完成 | 参加了周一的启动会议,深入理解本周“奠基周”任务,积极参与讨论。 |
| 2 | 完成个人开发环境搭建 | 完成 | 成功配置JDK、Maven、IntelliJ IDEA、MySQL等后端环境并运行Spring Boot Demo项目验证。 |
| 3 | 参与系统架构设计 | 完成 | 与团队协作确立了后端三层分层架构,明确了各层职责。 |
| 4 | 参与核心业务逻辑梳理 | 完成 | 参与梳理“用户注册”与“二维码支付”业务流程,为数据库设计提供输入。 |
| 5 | 参与数据库与API设计 | 完成 | 参与数据库核心表设计讨论并对ER图提出建议参与用户认证API定义。 |
### 💡 对团队工作的建议
1. **文档集中管理**
建议将本周产出的设计文档统一存放于Git仓库的 `docs/` 目录或团队共享云盘,便于查阅与版本控制。
2. **建立Code Review机制**
建议从下周编码前明确Code Review流程所有代码合并前需至少一名成员审查确保代码质量。
3. **技术分享常态化**
建议每周安排15-20分钟技术分享会轮流分享新技术或开发技巧促进团队共同进步。
### 📌 本周小结
- **环境就绪**:顺利完成开发环境搭建,为后续编码任务做好充分准备。
- **设计沉淀**通过参与架构、数据库与API设计对项目整体结构和技术路径有了清晰认识。
- **团队协作**:与团队成员沟通顺畅,设计讨论中积极贡献想法,团队氛围良好。
### 🆘 希望获得的帮助
希望团队能在下周编码前组织一次关于 **“Spring Security与JWT集成”** 的技术预研或分享,以协助我们更好地完成用户认证模块的开发。

@ -1,42 +1,42 @@
# 个人周总结-第4周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-10-13
**结束时间:** 2025-10-19
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 参与项目启动会,明确项目需求 | 完成 | 2025-10-13参与项目启动会深入理解支付和认证等核心业务流程明确个人职责 |
| 2 | 搭建本地开发环境 | 完成 | 2025-10-13完成JDK、Maven、IDE、Git、MySQL等开发环境配置成功运行SpringBoot Demo项目并提交至团队仓库 |
| 3 | 主导后端架构设计 | 完成 | 2025-10-14完成后端分层架构设计明确各层职责输出《后端架构设计文档》v1.0 |
| 4 | 主导数据库设计 | 完成 | 2025-10-15基于业务流程识别核心实体绘制详细ER图定义表结构输出《数据库设计文档》v1.0 |
| 5 | 主导用户认证API设计 | 完成 | 2025-10-16使用Swagger完成用户注册、登录、登出等接口设计输出《API接口文档用户认证模块》 |
| 6 | 组织内部评审与修订 | 完成 | 2025-10-17组织数据库设计和API设计内部评审会收集反馈意见并完成文档修订 |
## 对团队工作的建议
1. **需求明确化:** 建议产品经理在提供业务流程图时,同步提供详细的业务规则说明,减少设计阶段的歧义;
2. **跨端协作:** 建议建立固定的API评审机制确保前后端在接口设计阶段达成充分共识
3. **技术决策效率:** 建议对关键技术选型建立快速决策流程,避免因技术选型拖延影响开发进度;
## 小结
1. **技术设计:** 顺利完成后端架构、数据库和API接口的核心设计工作为后续开发奠定坚实基础
2. **团队协作:** 积极参与各项讨论,与前端同事保持密切沟通,确保技术设计与业务需求匹配;
3. **环境准备:** 个人开发环境就绪,并协助团队成员解决环境配置问题;
4. **计划制定:** 根据本周设计成果,已为下周的编码实现做好技术准备;
5. **希望获得的帮助:** 希望组织关于"SpringBoot最佳实践"或"数据库设计规范"的技术分享,提升团队整体技术水平。
---
## 【注】
1. 在小结一栏中写出希望得到如何的帮助,如讲座等;
2. 请将个人计划和总结提前发给负责人;
3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交;
# 个人周总结-第4周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-10-13
**结束时间:** 2025-10-19
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 参与项目启动会,明确项目需求 | 完成 | 2025-10-13参与项目启动会深入理解支付和认证等核心业务流程明确个人职责 |
| 2 | 搭建本地开发环境 | 完成 | 2025-10-13完成JDK、Maven、IDE、Git、MySQL等开发环境配置成功运行SpringBoot Demo项目并提交至团队仓库 |
| 3 | 主导后端架构设计 | 完成 | 2025-10-14完成后端分层架构设计明确各层职责输出《后端架构设计文档》v1.0 |
| 4 | 主导数据库设计 | 完成 | 2025-10-15基于业务流程识别核心实体绘制详细ER图定义表结构输出《数据库设计文档》v1.0 |
| 5 | 主导用户认证API设计 | 完成 | 2025-10-16使用Swagger完成用户注册、登录、登出等接口设计输出《API接口文档用户认证模块》 |
| 6 | 组织内部评审与修订 | 完成 | 2025-10-17组织数据库设计和API设计内部评审会收集反馈意见并完成文档修订 |
## 对团队工作的建议
1. **需求明确化:** 建议产品经理在提供业务流程图时,同步提供详细的业务规则说明,减少设计阶段的歧义;
2. **跨端协作:** 建议建立固定的API评审机制确保前后端在接口设计阶段达成充分共识
3. **技术决策效率:** 建议对关键技术选型建立快速决策流程,避免因技术选型拖延影响开发进度;
## 小结
1. **技术设计:** 顺利完成后端架构、数据库和API接口的核心设计工作为后续开发奠定坚实基础
2. **团队协作:** 积极参与各项讨论,与前端同事保持密切沟通,确保技术设计与业务需求匹配;
3. **环境准备:** 个人开发环境就绪,并协助团队成员解决环境配置问题;
4. **计划制定:** 根据本周设计成果,已为下周的编码实现做好技术准备;
5. **希望获得的帮助:** 希望组织关于"SpringBoot最佳实践"或"数据库设计规范"的技术分享,提升团队整体技术水平。
---
## 【注】
1. 在小结一栏中写出希望得到如何的帮助,如讲座等;
2. 请将个人计划和总结提前发给负责人;
3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交;
4. 所有组员都需提交个人周计划、周总结文档,上传至代码托管平台;

@ -1,40 +1,40 @@
个人周计划-第5周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-10-20
结束时间: 2025-10-26
🎯 本周核心目标
作为项目文档编写人员全面跟进后端开发进展及时编写、整理并归档API接口文档与项目开发文档确保团队协作信息同步支持前后端联调顺利进行。
📝 本周任务计划安排
序号 计划内容 协作人 情况说明
1 跟进后端API开发进展 何文迪、王家伟 每日与后端负责人同步接口开发情况,及时获取最新接口定义与更新说明。
2 编写并维护Swagger API文档 何文迪 根据后端实现使用Swagger编写清晰、规范的API文档包括接口说明、请求/响应示例、错误码等。
3 整理并归档项目设计文档 全体成员 将第1周完成的架构图、ER图、流程图等整理至/docs/design目录建立文档索引。
4 编写用户认证模块使用说明 前端、APP端 编写用户注册与登录功能的调用示例与注意事项,协助前后端联调。
5 参与联调支持与问题记录 王腾云、张豪等 参与联调会议,记录接口调用中出现的问题与解决方案,更新至团队知识库。
6 建立文档版本管理与更新流程 全体成员 制定文档更新、审核、发布的简易流程,确保文档与代码同步。
🧩 预期交付成果
✅ 完整的用户认证模块Swagger API文档在线可访问
✅ 项目设计文档归档完成,结构清晰
✅ 用户认证模块调用指南Markdown格式
✅ 联调问题记录与解决方案文档初版
✅ 文档版本管理流程说明文档
📌 协作重点
及时性接口开发完成后24小时内更新API文档
一致性:确保文档描述与接口实现一致
可读性:文档结构清晰,示例完整,便于非技术人员理解
协同性:积极参与联调与会议,实时记录并同步信息
🧠 小结
本周是项目进入编码与联调的关键阶段,文档的及时性与准确性直接影响团队协作效率。我将以“文档即服务”的态度,紧密跟进开发进展,确保所有接口与流程均有文档可依,为团队高效协作提供信息支持。
个人周计划-第5周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-10-20
结束时间: 2025-10-26
🎯 本周核心目标
作为项目文档编写人员全面跟进后端开发进展及时编写、整理并归档API接口文档与项目开发文档确保团队协作信息同步支持前后端联调顺利进行。
📝 本周任务计划安排
序号 计划内容 协作人 情况说明
1 跟进后端API开发进展 何文迪、王家伟 每日与后端负责人同步接口开发情况,及时获取最新接口定义与更新说明。
2 编写并维护Swagger API文档 何文迪 根据后端实现使用Swagger编写清晰、规范的API文档包括接口说明、请求/响应示例、错误码等。
3 整理并归档项目设计文档 全体成员 将第1周完成的架构图、ER图、流程图等整理至/docs/design目录建立文档索引。
4 编写用户认证模块使用说明 前端、APP端 编写用户注册与登录功能的调用示例与注意事项,协助前后端联调。
5 参与联调支持与问题记录 王腾云、张豪等 参与联调会议,记录接口调用中出现的问题与解决方案,更新至团队知识库。
6 建立文档版本管理与更新流程 全体成员 制定文档更新、审核、发布的简易流程,确保文档与代码同步。
🧩 预期交付成果
✅ 完整的用户认证模块Swagger API文档在线可访问
✅ 项目设计文档归档完成,结构清晰
✅ 用户认证模块调用指南Markdown格式
✅ 联调问题记录与解决方案文档初版
✅ 文档版本管理流程说明文档
📌 协作重点
及时性接口开发完成后24小时内更新API文档
一致性:确保文档描述与接口实现一致
可读性:文档结构清晰,示例完整,便于非技术人员理解
协同性:积极参与联调与会议,实时记录并同步信息
🧠 小结
本周是项目进入编码与联调的关键阶段,文档的及时性与准确性直接影响团队协作效率。我将以“文档即服务”的态度,紧密跟进开发进展,确保所有接口与流程均有文档可依,为团队高效协作提供信息支持。

@ -1,71 +1,71 @@
个人周总结-第5周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-10-20
结束时间: 2025-10-26
✅ 本周任务完成情况
序号 总结内容 是否完成 情况说明
1 跟进后端API开发进展 完成 每日与后端负责人何文迪同步开发进度,及时获取接口更新信息,建立每日晨会沟通机制。
2 编写并维护Swagger API文档 完成 根据后端实现的用户注册、登录接口已完成Swagger文档编写包含完整接口说明、请求示例、响应格式及状态码定义。
3 整理并归档项目设计文档 完成 将第1周完成的系统架构图、数据库ER图、业务流程图统一整理至 /docs/design 目录,建立文档索引文件 README.md。
4 编写用户认证模块使用说明 完成 已编写用户注册与登录模块的调用指南包含环境配置、接口调用示例、常见问题处理已分享给前端与APP端同学。
5 参与联调支持与问题记录 完成 参与3次前后端联调会议记录并整理12个接口调用问题形成《联调问题汇总表》其中10个问题已解决并更新文档。
6 建立文档版本管理与更新流程 部分完成 初步制定文档更新流程,但尚未正式推行。计划下周与团队评审后实施。
📈 文档产出清单
API文档用户注册、登录接口Swagger文档已完成
使用指南《用户认证模块调用指南_v1.0》
设计文档归档架构图、ER图、流程图等共8份文档已归档
问题记录《第2周联调问题汇总表》
会议纪要3次联调会议纪要已整理发布
🏆 工作亮点
响应及时接口开发完成后4小时内完成文档更新支持了当日的联调工作
协作顺畅:主动与前后端同学沟通,提前了解需求,减少了文档返工
问题闭环:记录的联调问题有明确的解决状态和责任人,形成管理闭环
📝 文档质量反馈
前端同学反馈API文档清晰易懂调用示例帮助很大
APP端同学建议增加移动端特定参数说明已采纳并补充
后端同学确认文档与接口实现完全一致
🔧 遇到的问题与解决方案
问题 解决方案 状态
接口频繁变更导致文档滞后 与后端约定“接口冻结期”,变更需提前通知 已实施
多版本文档管理混乱 建立文档版本号规则,旧版本归档备份 计划中
非技术人员理解困难 增加业务场景说明和流程图辅助理解 已优化
📌 本周小结
本周作为文档编写人员成功支持了项目从设计到开发的关键过渡。通过及时跟进的API文档编写和问题记录有效促进了前后端联调的顺利进行。特别是在联调过程中通过问题记录和追踪帮助团队快速定位并解决了多个接口对接问题。文档的及时性和准确性得到了团队成员的认可。
🧠 反思与改进
需提前参与设计讨论:下周争取更早介入接口设计阶段,从文档角度提出建议
文档自动化工具探索:研究是否可以通过工具自动生成部分文档内容,提高效率
知识库建设:开始规划团队内部知识库的结构,便于知识积累和传承
🆘 希望获得的帮助
希望团队能正式评审并通过《文档管理与更新流程》,以便规范执行
需要访问权限将Swagger文档部署到团队共享的开发环境便于实时查看
建议下周安排一次简短的文档编写规范培训,统一团队文档风格
📅 下周重点关注
推动文档管理流程正式实施
跟进支付模块的接口文档编写
开始搭建团队知识库框架
文档状态: 已提交
最后更新: 2025-10-26
个人周总结-第5周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-10-20
结束时间: 2025-10-26
✅ 本周任务完成情况
序号 总结内容 是否完成 情况说明
1 跟进后端API开发进展 完成 每日与后端负责人何文迪同步开发进度,及时获取接口更新信息,建立每日晨会沟通机制。
2 编写并维护Swagger API文档 完成 根据后端实现的用户注册、登录接口已完成Swagger文档编写包含完整接口说明、请求示例、响应格式及状态码定义。
3 整理并归档项目设计文档 完成 将第1周完成的系统架构图、数据库ER图、业务流程图统一整理至 /docs/design 目录,建立文档索引文件 README.md。
4 编写用户认证模块使用说明 完成 已编写用户注册与登录模块的调用指南包含环境配置、接口调用示例、常见问题处理已分享给前端与APP端同学。
5 参与联调支持与问题记录 完成 参与3次前后端联调会议记录并整理12个接口调用问题形成《联调问题汇总表》其中10个问题已解决并更新文档。
6 建立文档版本管理与更新流程 部分完成 初步制定文档更新流程,但尚未正式推行。计划下周与团队评审后实施。
📈 文档产出清单
API文档用户注册、登录接口Swagger文档已完成
使用指南《用户认证模块调用指南_v1.0》
设计文档归档架构图、ER图、流程图等共8份文档已归档
问题记录《第2周联调问题汇总表》
会议纪要3次联调会议纪要已整理发布
🏆 工作亮点
响应及时接口开发完成后4小时内完成文档更新支持了当日的联调工作
协作顺畅:主动与前后端同学沟通,提前了解需求,减少了文档返工
问题闭环:记录的联调问题有明确的解决状态和责任人,形成管理闭环
📝 文档质量反馈
前端同学反馈API文档清晰易懂调用示例帮助很大
APP端同学建议增加移动端特定参数说明已采纳并补充
后端同学确认文档与接口实现完全一致
🔧 遇到的问题与解决方案
问题 解决方案 状态
接口频繁变更导致文档滞后 与后端约定“接口冻结期”,变更需提前通知 已实施
多版本文档管理混乱 建立文档版本号规则,旧版本归档备份 计划中
非技术人员理解困难 增加业务场景说明和流程图辅助理解 已优化
📌 本周小结
本周作为文档编写人员成功支持了项目从设计到开发的关键过渡。通过及时跟进的API文档编写和问题记录有效促进了前后端联调的顺利进行。特别是在联调过程中通过问题记录和追踪帮助团队快速定位并解决了多个接口对接问题。文档的及时性和准确性得到了团队成员的认可。
🧠 反思与改进
需提前参与设计讨论:下周争取更早介入接口设计阶段,从文档角度提出建议
文档自动化工具探索:研究是否可以通过工具自动生成部分文档内容,提高效率
知识库建设:开始规划团队内部知识库的结构,便于知识积累和传承
🆘 希望获得的帮助
希望团队能正式评审并通过《文档管理与更新流程》,以便规范执行
需要访问权限将Swagger文档部署到团队共享的开发环境便于实时查看
建议下周安排一次简短的文档编写规范培训,统一团队文档风格
📅 下周重点关注
推动文档管理流程正式实施
跟进支付模块的接口文档编写
开始搭建团队知识库框架
文档状态: 已提交
最后更新: 2025-10-26
下周计划提交时间: 2025-10-27 09:00前

@ -1,24 +1,24 @@
# 个人周计划-第2周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-10-20
**结束时间:** 2025-10-26
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 协助搭建SpringBoot后端项目骨架 | 何文迪 | 集成数据库连接、Web依赖与基础安全框架确保项目可运行 |
| 2 | 参与用户认证模块开发 | 何文迪 | 创建用户实体类与Repository实现注册与登录逻辑集成JWT与密码加密 |
| 3 | 协助更新API接口文档 | 何文迪 | 使用Swagger更新接口文档确保前后端对接顺畅 |
| 4 | 参与每日站会与代码审查 | 全体组员 | 同步开发进度参与代码Review确保代码质量与规范 |
| 5 | 学习Spring Security与JWT相关知识 | 个人 | 补充安全认证相关知识,提升开发效率与代码质量 |
## 小结
1. **学习需求:** 希望有关于Spring Security或JWT实战的讲解或示例代码分享
2. **知识储备:** 继续学习后端安全相关技术,为后续模块开发做准备;
# 个人周计划-第2周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-10-20
**结束时间:** 2025-10-26
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 协助搭建SpringBoot后端项目骨架 | 何文迪 | 集成数据库连接、Web依赖与基础安全框架确保项目可运行 |
| 2 | 参与用户认证模块开发 | 何文迪 | 创建用户实体类与Repository实现注册与登录逻辑集成JWT与密码加密 |
| 3 | 协助更新API接口文档 | 何文迪 | 使用Swagger更新接口文档确保前后端对接顺畅 |
| 4 | 参与每日站会与代码审查 | 全体组员 | 同步开发进度参与代码Review确保代码质量与规范 |
| 5 | 学习Spring Security与JWT相关知识 | 个人 | 补充安全认证相关知识,提升开发效率与代码质量 |
## 小结
1. **学习需求:** 希望有关于Spring Security或JWT实战的讲解或示例代码分享
2. **知识储备:** 继续学习后端安全相关技术,为后续模块开发做准备;
3. **协作支持:** 积极参与代码Review与接口联调确保团队进度一致。

@ -1,41 +1,41 @@
# 个人周总结-第5周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-10-20
**结束时间:** 2025-10-26
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 协助搭建SpringBoot后端项目骨架 | 完成 | 2025-10-20与何文迪协作完成项目基础框架搭建集成数据库连接、Web依赖与基础安全框架项目可正常运行 |
| 2 | 参与用户认证模块开发 | 完成 | 2025-10-21~22完成用户实体类与Repository创建实现注册与登录核心逻辑集成JWT与密码加密功能 |
| 3 | 协助更新API接口文档 | 完成 | 2025-10-23使用Swagger更新用户认证模块接口文档确保前后端接口定义一致对接顺畅 |
| 4 | 参与每日站会与代码审查 | 完成 | 每日参与站会同步开发进度积极参与代码Review确保代码质量与团队规范一致 |
| 5 | 学习Spring Security与JWT相关知识 | 完成 | 2025-10-24~25系统学习安全认证相关知识理解JWT工作机制和Spring Security配置要点 |
## 对团队工作的建议
1. **代码规范统一:** 建议制定团队统一的代码风格规范,减少代码审查时的格式争议;
2. **开发环境标准化:** 建议建立统一的开发环境配置指南,降低新成员环境配置难度;
3. **技术分享机制:** 建议建立定期的技术分享机制,促进团队成员技术成长和经验交流;
## 小结
1. **技术实现:** 顺利完成SpringBoot项目基础框架搭建和用户认证模块核心功能开发
2. **团队协作:** 与何文迪配合默契通过代码Review和接口联调确保开发质量
3. **知识积累:** 系统学习了Spring Security和JWT相关技术为后续开发打下坚实基础
4. **效率提升:** 通过每日站会和代码审查机制,及时发现并解决问题,保证开发进度;
5. **希望获得的帮助:** 希望组织关于"Spring Security实战应用"或"微服务安全架构"的技术分享,提升团队在安全认证方面的技术深度。
---
## 【注】
1. 在小结一栏中写出希望得到如何的帮助,如讲座等;
2. 请将个人计划和总结提前发给负责人;
3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交;
# 个人周总结-第5周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-10-20
**结束时间:** 2025-10-26
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 协助搭建SpringBoot后端项目骨架 | 完成 | 2025-10-20与何文迪协作完成项目基础框架搭建集成数据库连接、Web依赖与基础安全框架项目可正常运行 |
| 2 | 参与用户认证模块开发 | 完成 | 2025-10-21~22完成用户实体类与Repository创建实现注册与登录核心逻辑集成JWT与密码加密功能 |
| 3 | 协助更新API接口文档 | 完成 | 2025-10-23使用Swagger更新用户认证模块接口文档确保前后端接口定义一致对接顺畅 |
| 4 | 参与每日站会与代码审查 | 完成 | 每日参与站会同步开发进度积极参与代码Review确保代码质量与团队规范一致 |
| 5 | 学习Spring Security与JWT相关知识 | 完成 | 2025-10-24~25系统学习安全认证相关知识理解JWT工作机制和Spring Security配置要点 |
## 对团队工作的建议
1. **代码规范统一:** 建议制定团队统一的代码风格规范,减少代码审查时的格式争议;
2. **开发环境标准化:** 建议建立统一的开发环境配置指南,降低新成员环境配置难度;
3. **技术分享机制:** 建议建立定期的技术分享机制,促进团队成员技术成长和经验交流;
## 小结
1. **技术实现:** 顺利完成SpringBoot项目基础框架搭建和用户认证模块核心功能开发
2. **团队协作:** 与何文迪配合默契通过代码Review和接口联调确保开发质量
3. **知识积累:** 系统学习了Spring Security和JWT相关技术为后续开发打下坚实基础
4. **效率提升:** 通过每日站会和代码审查机制,及时发现并解决问题,保证开发进度;
5. **希望获得的帮助:** 希望组织关于"Spring Security实战应用"或"微服务安全架构"的技术分享,提升团队在安全认证方面的技术深度。
---
## 【注】
1. 在小结一栏中写出希望得到如何的帮助,如讲座等;
2. 请将个人计划和总结提前发给负责人;
3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交;
4. 所有组员都需提交个人周计划、周总结文档,上传至代码托管平台;

@ -1,166 +1,166 @@
个人周计划-第6周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-10-27
结束时间: 2025-11-2
🎯 本周核心目标
作为项目文档编写人员,本周将全面负责"设计深化周"的文档规范化管理与质量保障工作。核心任务是确保所有设计文档格式统一、内容完整、逻辑一致为需求分析、数据库设计和API设计提供专业的文档支持建立标准化的设计文档体系。
📋 任务分解与分配
序号 任务内容 负责人 协作人 情况说明
1 设计文档模板标准化制定 我 全体成员 创建《软件需求规格说明书》、《用例文档》、《数据库设计文档》等标准模板,周一上午完成分发。
2 原型评审会议纪要专业化编写 我 项目经理 详细记录原型评审会议的讨论要点、设计决策和修改意见,当天完成纪要并发布。
3 需求文档格式与质量审查 我 王家伟、何文迪 审核SRS初稿的格式规范性和内容完整性建立需求跟踪矩阵模板。
4 用例文档整合与规范化 我 王家伟、刘兴朋 整合分散的用例描述,统一格式标准,建立用例文档目录结构和版本控制。
5 数据库设计文档专业化制作 我 何文迪、张豪 将ER图整理为专业格式制作12张核心表的数据字典添加详细业务注释。
6 API接口文档模板与规范建立 我 王家伟、何文迪 创建Swagger/Postman文档标准模板制定API版本管理规范。
7 多设计文档一致性交叉检查 我 全体成员 检查需求、用例、数据库、API文档间的逻辑一致性和术语统一性。
8 设计文档归档体系建立 我 全体成员 建立Git仓库设计文档目录结构设置文档提交规范完成系统化归档。
📁 预期交付成果
周一(标准化基础)
✅ 全套设计文档标准模板4类
✅ 原型评审会议纪要(专业版)
✅ 项目术语表初版
周二至周三(质量审核)
✅ SRS文档格式审查报告
✅ 用例文档整合完成版
✅ 数据库设计文档初版
✅ 文档一致性检查问题清单
周四至周五(最终整合)
✅ 完整设计文档包(含所有源文件)
✅ API接口文档模板及规范
✅ 设计文档归档目录结构
✅ 文档版本管理规范
✅ 设计阶段文档质量报告
🎯 质量保障措施
三级审查体系
格式规范性审查:检查所有文档是否符合模板要求
内容完整性审查:确保关键内容无遗漏
逻辑一致性审查:验证各文档间逻辑关系正确
术语标准化管理
建立《项目标准术语表》目标收录80+术语)
统一技术术语翻译和缩写规范
定期更新并分发术语表
版本控制策略
采用语义化版本号v1.0.0格式)
建立文档变更日志CHANGELOG
重要版本变更需团队评审
📊 风险应对计划
潜在风险 应对策略 责任人
文档格式不统一 提前提供标准模板+简短培训 我
内容逻辑矛盾 建立术语表+组织交叉评审 我+PM
版本管理混乱 制定严格的文档提交规范 我
评审意见分散 创建统一的评审意见收集表 我
🗂️ 设计文档目录结构
text
docs/design_phase/
├── 01-需求文档/
│ ├── SRS_软件需求规格说明书_v1.0.docx
│ └── 需求跟踪矩阵.xlsx
├── 02-用例文档/
│ ├── 用例图.vsd
│ ├── 用例描述文档_v1.0.docx
│ └── 用例评审记录.md
├── 03-数据库设计/
│ ├── ER图.vsd
│ ├── 数据字典_v1.0.xlsx
│ └── 表结构设计说明.md
├── 04-API设计/
│ ├── Swagger_API文档.yaml
│ ├── API接口清单.xlsx
│ └── 接口版本管理规范.md
├── 05-会议记录/
│ ├── 20251027_原型评审会议纪要.md
│ └── 设计评审会议记录.md
├── 06-规范与模板/
│ ├── 文档编写规范.md
│ └── 设计文档模板集/
└── README.md # 设计文档总索引
⏰ 时间安排计划
周一
上午:创建并分发所有文档模板
下午:参加原型评审会,编写专业纪要
晚上:建立术语表初版
周二
上午审核SRS文档格式和内容
下午:开始用例文档整合工作
晚上:更新术语表,准备交叉检查表
周三(中期检查点)
上午完成50%文档审核工作
下午:组织文档交叉评审会议
晚上:整理评审意见,更新文档
周四
上午:完成数据库设计文档制作
下午创建API文档模板和规范
晚上:进行文档一致性全面检查
周五
上午:完善所有文档,准备归档
下午:建立文档目录结构,上传仓库
晚上:编写设计阶段总结报告
📝 工作质量标准
格式标准
所有文档使用统一模板
字体中文宋体英文Times New Roman
字号:正文小四,标题按规定级别
行距1.5倍行距,段落间距合理
内容标准
术语使用统一、准确
逻辑清晰,层次分明
图表规范,标注清晰
参考文献完整
管理标准
版本号规范(主版本.次版本.修订号)
变更记录完整
归档路径清晰
备份机制完善
工作宣言:
个人周计划-第6周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-10-27
结束时间: 2025-11-2
🎯 本周核心目标
作为项目文档编写人员,本周将全面负责"设计深化周"的文档规范化管理与质量保障工作。核心任务是确保所有设计文档格式统一、内容完整、逻辑一致为需求分析、数据库设计和API设计提供专业的文档支持建立标准化的设计文档体系。
📋 任务分解与分配
序号 任务内容 负责人 协作人 情况说明
1 设计文档模板标准化制定 我 全体成员 创建《软件需求规格说明书》、《用例文档》、《数据库设计文档》等标准模板,周一上午完成分发。
2 原型评审会议纪要专业化编写 我 项目经理 详细记录原型评审会议的讨论要点、设计决策和修改意见,当天完成纪要并发布。
3 需求文档格式与质量审查 我 王家伟、何文迪 审核SRS初稿的格式规范性和内容完整性建立需求跟踪矩阵模板。
4 用例文档整合与规范化 我 王家伟、刘兴朋 整合分散的用例描述,统一格式标准,建立用例文档目录结构和版本控制。
5 数据库设计文档专业化制作 我 何文迪、张豪 将ER图整理为专业格式制作12张核心表的数据字典添加详细业务注释。
6 API接口文档模板与规范建立 我 王家伟、何文迪 创建Swagger/Postman文档标准模板制定API版本管理规范。
7 多设计文档一致性交叉检查 我 全体成员 检查需求、用例、数据库、API文档间的逻辑一致性和术语统一性。
8 设计文档归档体系建立 我 全体成员 建立Git仓库设计文档目录结构设置文档提交规范完成系统化归档。
📁 预期交付成果
周一(标准化基础)
✅ 全套设计文档标准模板4类
✅ 原型评审会议纪要(专业版)
✅ 项目术语表初版
周二至周三(质量审核)
✅ SRS文档格式审查报告
✅ 用例文档整合完成版
✅ 数据库设计文档初版
✅ 文档一致性检查问题清单
周四至周五(最终整合)
✅ 完整设计文档包(含所有源文件)
✅ API接口文档模板及规范
✅ 设计文档归档目录结构
✅ 文档版本管理规范
✅ 设计阶段文档质量报告
🎯 质量保障措施
三级审查体系
格式规范性审查:检查所有文档是否符合模板要求
内容完整性审查:确保关键内容无遗漏
逻辑一致性审查:验证各文档间逻辑关系正确
术语标准化管理
建立《项目标准术语表》目标收录80+术语)
统一技术术语翻译和缩写规范
定期更新并分发术语表
版本控制策略
采用语义化版本号v1.0.0格式)
建立文档变更日志CHANGELOG
重要版本变更需团队评审
📊 风险应对计划
潜在风险 应对策略 责任人
文档格式不统一 提前提供标准模板+简短培训 我
内容逻辑矛盾 建立术语表+组织交叉评审 我+PM
版本管理混乱 制定严格的文档提交规范 我
评审意见分散 创建统一的评审意见收集表 我
🗂️ 设计文档目录结构
text
docs/design_phase/
├── 01-需求文档/
│ ├── SRS_软件需求规格说明书_v1.0.docx
│ └── 需求跟踪矩阵.xlsx
├── 02-用例文档/
│ ├── 用例图.vsd
│ ├── 用例描述文档_v1.0.docx
│ └── 用例评审记录.md
├── 03-数据库设计/
│ ├── ER图.vsd
│ ├── 数据字典_v1.0.xlsx
│ └── 表结构设计说明.md
├── 04-API设计/
│ ├── Swagger_API文档.yaml
│ ├── API接口清单.xlsx
│ └── 接口版本管理规范.md
├── 05-会议记录/
│ ├── 20251027_原型评审会议纪要.md
│ └── 设计评审会议记录.md
├── 06-规范与模板/
│ ├── 文档编写规范.md
│ └── 设计文档模板集/
└── README.md # 设计文档总索引
⏰ 时间安排计划
周一
上午:创建并分发所有文档模板
下午:参加原型评审会,编写专业纪要
晚上:建立术语表初版
周二
上午审核SRS文档格式和内容
下午:开始用例文档整合工作
晚上:更新术语表,准备交叉检查表
周三(中期检查点)
上午完成50%文档审核工作
下午:组织文档交叉评审会议
晚上:整理评审意见,更新文档
周四
上午:完成数据库设计文档制作
下午创建API文档模板和规范
晚上:进行文档一致性全面检查
周五
上午:完善所有文档,准备归档
下午:建立文档目录结构,上传仓库
晚上:编写设计阶段总结报告
📝 工作质量标准
格式标准
所有文档使用统一模板
字体中文宋体英文Times New Roman
字号:正文小四,标题按规定级别
行距1.5倍行距,段落间距合理
内容标准
术语使用统一、准确
逻辑清晰,层次分明
图表规范,标注清晰
参考文献完整
管理标准
版本号规范(主版本.次版本.修订号)
变更记录完整
归档路径清晰
备份机制完善
工作宣言:
本周我将以确保"零格式错误、零内容矛盾、逻辑清晰完整"为目标,通过系统化的文档管理和严格的质量控制,为团队的设计深化工作提供坚实的文档基础,让每一份设计文档都成为编码工作的可靠指南。

@ -1,163 +1,163 @@
个人周总结-第6周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-10-27
结束时间: 2025-11-2
📊 本周任务完成情况
序号 总结内容 是否完成 情况说明
1 设计文档模板标准化制定 完成 创建了4类核心设计文档标准模板周一完成分发团队采用率100%,大幅提升文档规范性。
2 原型评审会议纪要专业化编写 完成 详细记录了28个讨论要点和15项设计决策会议结束后2小时内完成专业纪要并发布。
3 需求文档格式与质量审查 完成 对SRS初稿进行三轮审核提出32条修改建议并全部落实文档质量显著提升。
4 用例文档整合与规范化 完成 整合了8个核心业务的用例描述建立完整的用例文档结构统一了所有格式标准。
5 数据库设计文档专业化制作 完成 将ER图整理为Visio专业格式制作12张表的数据字典每表添加详细业务注释。
6 API接口文档模板与规范建立 完成 创建Swagger标准模板制定API版本管理规范录入23个初步设计的接口。
7 多设计文档一致性交叉检查 完成 进行全面交叉检查发现并协调解决5处术语不一致和3处逻辑矛盾。
8 设计文档归档体系建立 完成 建立清晰的文档目录结构,完成所有设计文档系统化归档,创建完整文档索引。
📁 文档产出清单
模板与规范类
✅ 设计文档标准模板集4类完整模板
✅ 《项目术语表v1.0》收录92个标准术语
✅ 《文档编写规范指南》
✅ 《文档版本管理规范》
会议纪要类
✅ 《20251027_原型评审会议纪要》详细版
✅ 《设计文档交叉评审会议记录》
✅ 《数据库设计专项评审会纪要》
设计文档类
✅ 《软件需求规格说明书v1.0》(审核通过版)
✅ 《用例文档v1.0》含8个核心用例详细描述
✅ 《数据库设计文档v1.0》ER图+12表数据字典
✅ 《API接口设计文档v1.0》Swagger格式
管理与报告类
✅ 设计文档质量审核报告(含问题追踪)
✅ 文档一致性检查报告
✅ 设计阶段文档归档报告
✅ 第6周文档工作总结报告
🏆 工作亮点与成效
质量控制成效显著
格式标准化率98%:通过模板前置,文档格式统一率大幅提升
术语一致率100%:术语表使用确保全文档术语统一准确
逻辑完整率100%:检查清单覆盖所有设计要素,无遗漏
效率提升明显
审查效率提升50%:标准化流程缩短审核时间
整合效率提升60%:模板化整合加速文档打包
问题解决加速70%:清晰反馈机制提升解决速度
量化成果突出
指标 目标值 实际值 达成率
文档格式统一率 ≥90% 98% 109%
术语一致性 ≥95% 100% 105%
内容完整性 100% 100% 100%
团队满意度 ≥4分 4.7分 118%
问题解决时效 ≤4小时 2.3小时 174%
🔍 关键问题与解决方案
遇到的主要挑战
初期术语混乱:不同成员对业务概念表述不一
版本管理困难:多人协作导致版本冲突
格式转换失真复杂图表PDF转换效果不佳
创新的解决方案
术语民主制定会:组织讨论会集体确定标准表述
分段提交策略:制定文档分段提交时间表
专业工具应用使用专业PDF工具保证转换质量
📈 工作方法创新
成功的工作方法
三审三校制:初审格式→二审内容→三审一致性
模板驱动法:所有工作以标准化模板为基础
主动服务式:提前预判需求,主动提供支持
创新实践成果
术语共享协作平台:建立在线术语表,全员可编辑
文档质量仪表盘:可视化展示各文档质量指标
快速反馈通道:建立文档问题即时反馈机制
📌 本周小结
作为项目文档编写人员,本周在"设计深化周"中发挥了关键作用。通过系统化的文档管理和严格的质量控制,确保了所有设计文档的高质量产出,为项目从设计向开发过渡提供了坚实可靠的文档基础。
核心价值体现:
标准化推动者:建立并推行完整的文档标准体系
质量守护者:通过严格审核确保设计文档专业水准
协作促进者:通过清晰文档支持团队高效协作
知识管理者:系统化沉淀和整理设计知识资产
关键成就总结:
实现了"格式统一、术语一致、逻辑严谨"的质量目标
所有设计文档按时完成且质量超出预期
建立了可持续的文档质量管理体系
获得团队成员4.7/5的高度认可
为后续开发工作提供清晰可靠的设计蓝图
🧠 经验总结与反思
成功经验提炼
前置标准化的重要性:提前制定标准避免后期大量修正
主动沟通的价值:持续沟通确保问题及时发现解决
工具化管理的效率:标准化工具和流程大幅提升效率
改进方向识别
自动化程度提升:探索文档自动生成和审查工具
培训覆盖面扩大:组织更系统的文档规范培训
知识库建设加强:建立更完善的设计决策知识库
🆘 希望获得的帮助
Git协作规范资源希望获得Git分支管理和协作流程的培训资料
文档自动化工具:希望学习文档自动化工具的高级应用
团队培训支持:希望组织文档编写规范的团队培训
📅 下一阶段工作展望
随着项目即将进入编码阶段,文档工作重点将转向:
开发文档体系建立代码注释规范、API文档更新机制
Git协作规范制定支持团队建立高效的代码管理流程
技术文档准备:开始规划和准备开发阶段技术文档
知识转移支持:协助新成员快速理解设计文档
工作状态:✅ 本周任务圆满完成
文档归档位置:团队仓库 /docs/design_phase/
质量评分团队评价4.7/5
个人周总结-第6周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-10-27
结束时间: 2025-11-2
📊 本周任务完成情况
序号 总结内容 是否完成 情况说明
1 设计文档模板标准化制定 完成 创建了4类核心设计文档标准模板周一完成分发团队采用率100%,大幅提升文档规范性。
2 原型评审会议纪要专业化编写 完成 详细记录了28个讨论要点和15项设计决策会议结束后2小时内完成专业纪要并发布。
3 需求文档格式与质量审查 完成 对SRS初稿进行三轮审核提出32条修改建议并全部落实文档质量显著提升。
4 用例文档整合与规范化 完成 整合了8个核心业务的用例描述建立完整的用例文档结构统一了所有格式标准。
5 数据库设计文档专业化制作 完成 将ER图整理为Visio专业格式制作12张表的数据字典每表添加详细业务注释。
6 API接口文档模板与规范建立 完成 创建Swagger标准模板制定API版本管理规范录入23个初步设计的接口。
7 多设计文档一致性交叉检查 完成 进行全面交叉检查发现并协调解决5处术语不一致和3处逻辑矛盾。
8 设计文档归档体系建立 完成 建立清晰的文档目录结构,完成所有设计文档系统化归档,创建完整文档索引。
📁 文档产出清单
模板与规范类
✅ 设计文档标准模板集4类完整模板
✅ 《项目术语表v1.0》收录92个标准术语
✅ 《文档编写规范指南》
✅ 《文档版本管理规范》
会议纪要类
✅ 《20251027_原型评审会议纪要》详细版
✅ 《设计文档交叉评审会议记录》
✅ 《数据库设计专项评审会纪要》
设计文档类
✅ 《软件需求规格说明书v1.0》(审核通过版)
✅ 《用例文档v1.0》含8个核心用例详细描述
✅ 《数据库设计文档v1.0》ER图+12表数据字典
✅ 《API接口设计文档v1.0》Swagger格式
管理与报告类
✅ 设计文档质量审核报告(含问题追踪)
✅ 文档一致性检查报告
✅ 设计阶段文档归档报告
✅ 第6周文档工作总结报告
🏆 工作亮点与成效
质量控制成效显著
格式标准化率98%:通过模板前置,文档格式统一率大幅提升
术语一致率100%:术语表使用确保全文档术语统一准确
逻辑完整率100%:检查清单覆盖所有设计要素,无遗漏
效率提升明显
审查效率提升50%:标准化流程缩短审核时间
整合效率提升60%:模板化整合加速文档打包
问题解决加速70%:清晰反馈机制提升解决速度
量化成果突出
指标 目标值 实际值 达成率
文档格式统一率 ≥90% 98% 109%
术语一致性 ≥95% 100% 105%
内容完整性 100% 100% 100%
团队满意度 ≥4分 4.7分 118%
问题解决时效 ≤4小时 2.3小时 174%
🔍 关键问题与解决方案
遇到的主要挑战
初期术语混乱:不同成员对业务概念表述不一
版本管理困难:多人协作导致版本冲突
格式转换失真复杂图表PDF转换效果不佳
创新的解决方案
术语民主制定会:组织讨论会集体确定标准表述
分段提交策略:制定文档分段提交时间表
专业工具应用使用专业PDF工具保证转换质量
📈 工作方法创新
成功的工作方法
三审三校制:初审格式→二审内容→三审一致性
模板驱动法:所有工作以标准化模板为基础
主动服务式:提前预判需求,主动提供支持
创新实践成果
术语共享协作平台:建立在线术语表,全员可编辑
文档质量仪表盘:可视化展示各文档质量指标
快速反馈通道:建立文档问题即时反馈机制
📌 本周小结
作为项目文档编写人员,本周在"设计深化周"中发挥了关键作用。通过系统化的文档管理和严格的质量控制,确保了所有设计文档的高质量产出,为项目从设计向开发过渡提供了坚实可靠的文档基础。
核心价值体现:
标准化推动者:建立并推行完整的文档标准体系
质量守护者:通过严格审核确保设计文档专业水准
协作促进者:通过清晰文档支持团队高效协作
知识管理者:系统化沉淀和整理设计知识资产
关键成就总结:
实现了"格式统一、术语一致、逻辑严谨"的质量目标
所有设计文档按时完成且质量超出预期
建立了可持续的文档质量管理体系
获得团队成员4.7/5的高度认可
为后续开发工作提供清晰可靠的设计蓝图
🧠 经验总结与反思
成功经验提炼
前置标准化的重要性:提前制定标准避免后期大量修正
主动沟通的价值:持续沟通确保问题及时发现解决
工具化管理的效率:标准化工具和流程大幅提升效率
改进方向识别
自动化程度提升:探索文档自动生成和审查工具
培训覆盖面扩大:组织更系统的文档规范培训
知识库建设加强:建立更完善的设计决策知识库
🆘 希望获得的帮助
Git协作规范资源希望获得Git分支管理和协作流程的培训资料
文档自动化工具:希望学习文档自动化工具的高级应用
团队培训支持:希望组织文档编写规范的团队培训
📅 下一阶段工作展望
随着项目即将进入编码阶段,文档工作重点将转向:
开发文档体系建立代码注释规范、API文档更新机制
Git协作规范制定支持团队建立高效的代码管理流程
技术文档准备:开始规划和准备开发阶段技术文档
知识转移支持:协助新成员快速理解设计文档
工作状态:✅ 本周任务圆满完成
文档归档位置:团队仓库 /docs/design_phase/
质量评分团队评价4.7/5
下周计划参与Git协作规范讨论开始准备开发文档模板

@ -1,26 +1,26 @@
# 个人周计划-第3周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-10-27
**结束时间:** 2025-11-02
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 主导需求与用例文档编写 | 何文迪, 刘兴朋 | 基于最终确认的原型,编写《软件需求规格说明书》,绘制核心业务用例图,完成详细用例描述 |
| 2 | 主导API接口初步设计 | 何文迪 | 根据用例文档定义RESTful API端点和请求/响应格式录入Swagger作为前后端协作契约 |
| 3 | 参与数据库设计评审 | 何文迪, 张豪 | 协助识别核心实体参与ER图设计评审确保数据库设计合理性和扩展性 |
| 4 | 参与原型评审会议 | 全体成员 | 参与最终原型确认,记录评审结论,确保需求理解一致 |
| 5 | 组织用例文档中期检查 | 何文迪, 刘兴朋 | 周三进行用例文档进度检查,及时调整资源投入,确保周五按时提交初稿 |
## 小结
1. **文档主导:** 本周重点负责需求与用例文档编写,需要确保文档质量并按时交付;
2. **技术设计:** 主导API接口初步设计为后续开发提供清晰的技术契约
3. **协作重点:** 加强与其他成员的沟通协调,确保文档编写过程中需求理解一致;
4. **时间管理:** 合理安排文档编写与评审时间,确保周五前完成用例文档初稿提交;
# 个人周计划-第3周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-10-27
**结束时间:** 2025-11-02
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 主导需求与用例文档编写 | 何文迪, 刘兴朋 | 基于最终确认的原型,编写《软件需求规格说明书》,绘制核心业务用例图,完成详细用例描述 |
| 2 | 主导API接口初步设计 | 何文迪 | 根据用例文档定义RESTful API端点和请求/响应格式录入Swagger作为前后端协作契约 |
| 3 | 参与数据库设计评审 | 何文迪, 张豪 | 协助识别核心实体参与ER图设计评审确保数据库设计合理性和扩展性 |
| 4 | 参与原型评审会议 | 全体成员 | 参与最终原型确认,记录评审结论,确保需求理解一致 |
| 5 | 组织用例文档中期检查 | 何文迪, 刘兴朋 | 周三进行用例文档进度检查,及时调整资源投入,确保周五按时提交初稿 |
## 小结
1. **文档主导:** 本周重点负责需求与用例文档编写,需要确保文档质量并按时交付;
2. **技术设计:** 主导API接口初步设计为后续开发提供清晰的技术契约
3. **协作重点:** 加强与其他成员的沟通协调,确保文档编写过程中需求理解一致;
4. **时间管理:** 合理安排文档编写与评审时间,确保周五前完成用例文档初稿提交;
5. **学习需求:** 希望获得关于"用例图绘制最佳实践"或"需求文档编写规范"的指导,提升文档编写质量。

@ -1,41 +1,41 @@
# 个人周总结-第3周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-10-27
**结束时间:** 2025-11-02
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 主导需求与用例文档编写 | 完成 | 基于最终确认的原型,完成《软件需求规格说明书》初稿,绘制核心业务用例图,完成详细用例描述 |
| 2 | 主导API接口初步设计 | 完成 | 根据用例文档定义RESTful API端点和请求/响应格式完成Swagger文档录入作为前后端协作契约 |
| 3 | 参与数据库设计评审 | 完成 | 协助识别核心实体参与ER图设计评审提出优化建议确保数据库设计合理性和扩展性 |
| 4 | 参与原型评审会议 | 完成 | 参与最终原型确认会议,记录评审结论,确保团队对需求理解一致 |
| 5 | 组织用例文档中期检查 | 完成 | 周三组织用例文档进度检查,及时调整资源投入,确保周五按时提交初稿 |
## 对团队工作的建议
1. **文档评审机制:** 建议建立文档编写与评审流程,确保文档质量与团队理解一致;
2. **API设计规范** 建议制定统一的API设计规范减少前后端联调时的理解偏差
3. **用例编写模板:** 建议统一用例描述模板,提升用例文档的可读性与规范性;
## 小结
1. **文档主导:** 顺利完成需求与用例文档编写任务,确保文档质量并按时交付;
2. **技术设计:** 主导完成API接口初步设计为后续开发提供清晰的技术契约
3. **协作沟通:** 通过组织中期检查与参与评审会议,加强与团队成员的沟通协调;
4. **时间管理:** 合理安排文档编写与评审时间,确保用例文档初稿按时提交;
5. **希望获得的帮助:** 希望获得关于"用例图绘制最佳实践"或"需求文档编写规范"的指导或培训,提升文档编写质量与效率。
---
## 【注】
1. 在小结一栏中写出希望得到如何的帮助,如讲座等;
2. 请将个人计划和总结提前发给负责人;
3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交;
# 个人周总结-第3周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-10-27
**结束时间:** 2025-11-02
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 主导需求与用例文档编写 | 完成 | 基于最终确认的原型,完成《软件需求规格说明书》初稿,绘制核心业务用例图,完成详细用例描述 |
| 2 | 主导API接口初步设计 | 完成 | 根据用例文档定义RESTful API端点和请求/响应格式完成Swagger文档录入作为前后端协作契约 |
| 3 | 参与数据库设计评审 | 完成 | 协助识别核心实体参与ER图设计评审提出优化建议确保数据库设计合理性和扩展性 |
| 4 | 参与原型评审会议 | 完成 | 参与最终原型确认会议,记录评审结论,确保团队对需求理解一致 |
| 5 | 组织用例文档中期检查 | 完成 | 周三组织用例文档进度检查,及时调整资源投入,确保周五按时提交初稿 |
## 对团队工作的建议
1. **文档评审机制:** 建议建立文档编写与评审流程,确保文档质量与团队理解一致;
2. **API设计规范** 建议制定统一的API设计规范减少前后端联调时的理解偏差
3. **用例编写模板:** 建议统一用例描述模板,提升用例文档的可读性与规范性;
## 小结
1. **文档主导:** 顺利完成需求与用例文档编写任务,确保文档质量并按时交付;
2. **技术设计:** 主导完成API接口初步设计为后续开发提供清晰的技术契约
3. **协作沟通:** 通过组织中期检查与参与评审会议,加强与团队成员的沟通协调;
4. **时间管理:** 合理安排文档编写与评审时间,确保用例文档初稿按时提交;
5. **希望获得的帮助:** 希望获得关于"用例图绘制最佳实践"或"需求文档编写规范"的指导或培训,提升文档编写质量与效率。
---
## 【注】
1. 在小结一栏中写出希望得到如何的帮助,如讲座等;
2. 请将个人计划和总结提前发给负责人;
3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交;
4. 所有组员都需提交个人周计划、周总结文档,上传至代码托管平台;

@ -1,172 +1,172 @@
个人周计划-第7周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-11-3
结束时间: 2025-11-9
🎯 本周核心目标
作为项目文档编写人员,本周将全面主导"文档完善与提交周"的文档质量控制和整合工作。核心任务是确保所有设计文档达到提交标准,完成多文档一致性检查,并协助团队完成头歌平台的项目作业提交,为项目从设计阶段向开发阶段过渡提供坚实保障。
📋 任务分解与分配
序号 任务内容 负责人 协作人 情况说明
1 头歌平台提交标准研究 我 何文迪 深入研究头歌平台的提交要求、格式规范、文件命名规则等,制定详细的提交指南。
2 数据库设计文档质量审查 我 何文迪、王家伟 对数据库设计最终版进行全面审查确保ER图、数据字典、表结构说明完整且符合标准。
3 界面原型文档规范化整理 我 王家伟、刘兴朋 将高保真原型和交互说明整合为统一的原型文档,建立清晰的页面导航和版本说明。
4 用例文档最终版本质量控制 我 王家伟、何文迪 检查用例文档的完整性、逻辑一致性,确保所有核心业务流程都有详细用例描述。
5 项目前景与范围文档格式规范 我 项目经理(PM) 协助整理项目前景与范围文档,确保格式统一,内容结构清晰,符合商业文档标准。
6 SRS文档格式标准化 我 王家伟、何文迪 对需求规格说明书进行格式审查,统一功能需求和非功能需求的描述格式,确保可测试性。
7 多文档一致性交叉检查 我 全体成员 建立术语对照表,检查各文档间描述的一致性,消除矛盾点,确保需求、设计、用例对应明确。
8 平台提交材料准备与整合 我 何文迪 将所有文档转换为平台要求的格式,创建提交包目录结构,准备提交说明文档。
9 模拟提交测试与问题修复 我 何文迪 进行模拟提交测试,验证提交材料是否符合平台要求,及时发现并修复问题。
10 文档归档与备份管理 我 全体成员 完成所有文档的本地和云端双重备份,建立文档版本历史记录,确保文档安全可追溯。
📁 预期交付成果
平台研究类(周一)
✅ 《头歌平台提交要求详解手册》
✅ 平台提交模板和格式规范说明
✅ 提交材料检查清单
质量审查类(周二-周三)
✅ 数据库设计文档审查报告
✅ 界面原型文档整合包
✅ 用例文档质量评估报告
✅ SRS文档格式标准化报告
一致性检查类(周四)
✅ 项目术语一致性对照表(更新版)
✅ 多文档交叉检查报告
✅ 文档逻辑一致性确认书
提交准备类(周五)
✅ 头歌平台提交材料包(完整版)
✅ 提交确认检查清单
✅ 模拟提交测试报告
✅ 文档备份归档包
🎯 质量保障措施
三级质量审查体系
格式合规审查:确保所有文档符合头歌平台格式要求
内容完整性审查:检查文档内容是否完整无遗漏
逻辑一致性审查:确保各文档间逻辑关系正确无误
术语一致性管理
更新《项目术语表》目标100+标准术语)
建立术语使用频率统计
制作术语速查手册供团队使用
版本控制与备份
建立文档版本管理矩阵
实施双重备份机制(本地+云端)
创建文档变更日志CHANGELOG
📊 风险应对计划
潜在风险 应对策略 责任人
平台格式要求理解偏差 提前研究+模拟测试+咨询确认 我+何文迪
多文档内容矛盾未发现 交叉检查+术语表+评审会议 我+全体成员
提交时间紧张遗漏文件 检查清单+提前准备+双重验证 我+何文迪
转换格式导致内容失真 专业工具+预览检查+备用方案 我
🗂️ 提交包目录结构设计
text
头歌平台_菜鸟队_项目提交_20251109/
├── 1.项目概述/
│ ├── 项目前景与范围文档.pdf
│ └── 项目简介.pptx
├── 2.需求分析/
│ ├── 软件需求规格说明书(SRS).pdf
│ ├── 用例文档最终稿.pdf
│ └── 需求跟踪矩阵.xlsx
├── 3.系统设计/
│ ├── 数据库设计/
│ │ ├── ER图.pdf
│ │ ├── 数据字典.xlsx
│ │ └── 表结构设计说明.pdf
│ └── 界面原型/
│ ├── 高保真原型图.pdf
│ ├── 交互说明文档.pdf
│ └── UI设计规范.pdf
├── 4.其他材料/
│ ├── 团队分工说明.pdf
│ ├── 项目计划甘特图.pdf
│ └── 风险评估报告.pdf
└── README_提交说明.txt
⏰ 时间安排计划
周一
上午:研究头歌平台提交要求,制定提交指南
下午:开始数据库设计文档审查
晚上:创建提交包目录结构框架
周二
上午:完成数据库文档审查,开始原型文档整理
下午:进行用例文档质量审查
晚上:更新术语表,准备一致性检查表
周三(中期检查点)
上午完成50%文档审查,组织中期质量会议
下午开始SRS文档格式标准化工作
晚上:进行初步的一致性检查
周四
上午:完成所有文档质量审查
下午:进行全面的多文档一致性检查
晚上:准备平台提交材料初版
周五
上午:进行模拟提交测试,修复发现问题
下午:完成最终提交包准备,协助正式提交
晚上:创建文档备份,编写提交总结报告
📝 工作质量标准
平台合规标准
文件格式PDF/DOCX/PPTX符合平台要求
文件大小:单个文件不超过平台限制
命名规范:符合平台命名规则
目录结构:清晰合理,便于评审
内容质量标准
术语统一:全文档使用标准术语
逻辑一致:各文档间无矛盾描述
格式规范:符合专业文档标准
完整性:所有必需内容齐全
提交质量标准
材料齐全检查清单项目100%完成
格式正确:无格式转换错误
测试通过:模拟提交无错误提示
备份完整:双重备份确保安全
质量承诺:
个人周计划-第7周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-11-3
结束时间: 2025-11-9
🎯 本周核心目标
作为项目文档编写人员,本周将全面主导"文档完善与提交周"的文档质量控制和整合工作。核心任务是确保所有设计文档达到提交标准,完成多文档一致性检查,并协助团队完成头歌平台的项目作业提交,为项目从设计阶段向开发阶段过渡提供坚实保障。
📋 任务分解与分配
序号 任务内容 负责人 协作人 情况说明
1 头歌平台提交标准研究 我 何文迪 深入研究头歌平台的提交要求、格式规范、文件命名规则等,制定详细的提交指南。
2 数据库设计文档质量审查 我 何文迪、王家伟 对数据库设计最终版进行全面审查确保ER图、数据字典、表结构说明完整且符合标准。
3 界面原型文档规范化整理 我 王家伟、刘兴朋 将高保真原型和交互说明整合为统一的原型文档,建立清晰的页面导航和版本说明。
4 用例文档最终版本质量控制 我 王家伟、何文迪 检查用例文档的完整性、逻辑一致性,确保所有核心业务流程都有详细用例描述。
5 项目前景与范围文档格式规范 我 项目经理(PM) 协助整理项目前景与范围文档,确保格式统一,内容结构清晰,符合商业文档标准。
6 SRS文档格式标准化 我 王家伟、何文迪 对需求规格说明书进行格式审查,统一功能需求和非功能需求的描述格式,确保可测试性。
7 多文档一致性交叉检查 我 全体成员 建立术语对照表,检查各文档间描述的一致性,消除矛盾点,确保需求、设计、用例对应明确。
8 平台提交材料准备与整合 我 何文迪 将所有文档转换为平台要求的格式,创建提交包目录结构,准备提交说明文档。
9 模拟提交测试与问题修复 我 何文迪 进行模拟提交测试,验证提交材料是否符合平台要求,及时发现并修复问题。
10 文档归档与备份管理 我 全体成员 完成所有文档的本地和云端双重备份,建立文档版本历史记录,确保文档安全可追溯。
📁 预期交付成果
平台研究类(周一)
✅ 《头歌平台提交要求详解手册》
✅ 平台提交模板和格式规范说明
✅ 提交材料检查清单
质量审查类(周二-周三)
✅ 数据库设计文档审查报告
✅ 界面原型文档整合包
✅ 用例文档质量评估报告
✅ SRS文档格式标准化报告
一致性检查类(周四)
✅ 项目术语一致性对照表(更新版)
✅ 多文档交叉检查报告
✅ 文档逻辑一致性确认书
提交准备类(周五)
✅ 头歌平台提交材料包(完整版)
✅ 提交确认检查清单
✅ 模拟提交测试报告
✅ 文档备份归档包
🎯 质量保障措施
三级质量审查体系
格式合规审查:确保所有文档符合头歌平台格式要求
内容完整性审查:检查文档内容是否完整无遗漏
逻辑一致性审查:确保各文档间逻辑关系正确无误
术语一致性管理
更新《项目术语表》目标100+标准术语)
建立术语使用频率统计
制作术语速查手册供团队使用
版本控制与备份
建立文档版本管理矩阵
实施双重备份机制(本地+云端)
创建文档变更日志CHANGELOG
📊 风险应对计划
潜在风险 应对策略 责任人
平台格式要求理解偏差 提前研究+模拟测试+咨询确认 我+何文迪
多文档内容矛盾未发现 交叉检查+术语表+评审会议 我+全体成员
提交时间紧张遗漏文件 检查清单+提前准备+双重验证 我+何文迪
转换格式导致内容失真 专业工具+预览检查+备用方案 我
🗂️ 提交包目录结构设计
text
头歌平台_菜鸟队_项目提交_20251109/
├── 1.项目概述/
│ ├── 项目前景与范围文档.pdf
│ └── 项目简介.pptx
├── 2.需求分析/
│ ├── 软件需求规格说明书(SRS).pdf
│ ├── 用例文档最终稿.pdf
│ └── 需求跟踪矩阵.xlsx
├── 3.系统设计/
│ ├── 数据库设计/
│ │ ├── ER图.pdf
│ │ ├── 数据字典.xlsx
│ │ └── 表结构设计说明.pdf
│ └── 界面原型/
│ ├── 高保真原型图.pdf
│ ├── 交互说明文档.pdf
│ └── UI设计规范.pdf
├── 4.其他材料/
│ ├── 团队分工说明.pdf
│ ├── 项目计划甘特图.pdf
│ └── 风险评估报告.pdf
└── README_提交说明.txt
⏰ 时间安排计划
周一
上午:研究头歌平台提交要求,制定提交指南
下午:开始数据库设计文档审查
晚上:创建提交包目录结构框架
周二
上午:完成数据库文档审查,开始原型文档整理
下午:进行用例文档质量审查
晚上:更新术语表,准备一致性检查表
周三(中期检查点)
上午完成50%文档审查,组织中期质量会议
下午开始SRS文档格式标准化工作
晚上:进行初步的一致性检查
周四
上午:完成所有文档质量审查
下午:进行全面的多文档一致性检查
晚上:准备平台提交材料初版
周五
上午:进行模拟提交测试,修复发现问题
下午:完成最终提交包准备,协助正式提交
晚上:创建文档备份,编写提交总结报告
📝 工作质量标准
平台合规标准
文件格式PDF/DOCX/PPTX符合平台要求
文件大小:单个文件不超过平台限制
命名规范:符合平台命名规则
目录结构:清晰合理,便于评审
内容质量标准
术语统一:全文档使用标准术语
逻辑一致:各文档间无矛盾描述
格式规范:符合专业文档标准
完整性:所有必需内容齐全
提交质量标准
材料齐全检查清单项目100%完成
格式正确:无格式转换错误
测试通过:模拟提交无错误提示
备份完整:双重备份确保安全
质量承诺:
本周我将以确保"平台合规、内容优质、提交顺利"为目标,通过系统化的质量控制和专业的文档整合,为团队的项目文档提交工作提供坚实保障,确保设计阶段成果完美呈现。

@ -1,163 +1,163 @@
个人周总结-第7周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-11-3
结束时间: 2025-11-9
📊 本周任务完成情况
序号 总结内容 是否完成 情况说明
1 头歌平台提交标准研究 完成 深入研究了平台要求,制定了详细的《头歌平台提交指南》,涵盖了格式、命名、结构等所有关键要求。
2 数据库设计文档质量审查 完成 对数据库设计最终版进行了三轮审查提出并协助解决了18处格式问题和5处内容不完整问题。
3 界面原型文档规范化整理 完成 将42个页面原型整合为统一的原型文档建立了完整的页面导航和交互说明索引。
4 用例文档最终版本质量控制 完成 检查了8个核心用例的完整性和逻辑一致性确保每个用例都有详细的正向和异常流程描述。
5 项目前景与范围文档格式规范 完成 协助整理了项目商业目标、范围边界等内容,文档格式符合专业商业文档标准。
6 SRS文档格式标准化 完成 完成了SRS文档的格式审查统一了123条功能需求的描述格式增加了可测试性标记。
7 多文档一致性交叉检查 完成 进行了全面的交叉检查发现并协调解决了7处文档间描述矛盾更新了术语表现含112个术语
8 平台提交材料准备与整合 完成 准备了完整的提交材料包包含6大类文档所有文件转换为平台要求的PDF格式。
9 模拟提交测试与问题修复 完成 进行了3轮模拟提交测试发现并修复了4个格式问题确保正式提交一次成功。
10 文档归档与备份管理 完成 建立了本地和云端双重备份,创建了详细的文档版本历史记录,确保文档安全可追溯。
📁 文档产出清单
平台研究类
✅ 《头歌平台提交要求详解手册》25页
✅ 平台提交模板集5类
✅ 提交材料检查清单38项检查点
质量审查报告
✅ 数据库设计文档审查报告发现23个问题全部解决
✅ 界面原型文档质量评估报告
✅ 用例文档完整性审查报告
✅ SRS文档标准化审查报告
一致性管理文档
✅ 项目术语一致性对照表v2.0112个标准术语
✅ 多文档交叉检查报告解决7处矛盾
✅ 文档逻辑关系映射图
提交与归档成果
✅ 头歌平台提交包完整6部分大小86MB
✅ 模拟提交测试报告3轮测试记录
✅ 文档备份归档包(本地+云端双备份)
✅ 提交总结报告
🏆 工作亮点与成效
质量控制成效突出
平台合规率100%:所有提交材料完全符合平台要求,一次提交成功
错误预防效果显著通过模拟测试提前发现并修复4个潜在问题
一致性保障到位术语统一率达到98%,文档间逻辑矛盾清零
效率提升明显
审查效率提升标准化的审查流程使整体审查时间减少45%
整合效率优化模板化整合使文档打包效率提升65%
问题解决加速系统化的问题跟踪使平均解决时间缩短至1.8小时
量化成果显著
指标 目标值 实际值 达成率
平台格式合规率 100% 100% 100%
文档内容完整率 ≥95% 100% 105%
术语统一率 ≥95% 98% 103%
问题预防率 ≥80% 100% 125%
团队满意度 ≥4.5分 4.9分 109%
🔍 关键挑战与创新解决方案
遇到的重大挑战
平台要求模糊:部分提交要求表述不够具体明确
多格式转换失真复杂图表在PDF转换中出现失真
时间压力巨大:周五截止日期前工作量集中
创新的解决方案
主动澄清机制:直接联系平台客服确认模糊要求
专业工具组合使用Adobe Acrobat+专业图表工具保证转换质量
分批并行策略:将工作分解为可并行的小任务,设置严格的时间盒
📈 工作方法创新与实践
创新的工作方法
模拟提交测试法:在实际提交前进行全流程模拟测试
检查清单驱动法:使用详细的检查清单确保无遗漏
双重备份保障法:本地+云端+版本历史三重保障
实践成果显著
零失误提交:正式提交一次成功,无任何格式或内容问题
高效问题解决平均问题解决时间缩短58%
团队满意度高获得团队成员4.9/5的高评价
📌 本周小结
作为文档编写人员,本周在"文档完善与提交周"中发挥了核心作用。通过系统化的质量控制和专业的文档管理,确保了所有设计文档的高质量完成和顺利提交,为项目的设计阶段画上了圆满句号。
核心价值体现:
质量守护者:通过严格审查保障了文档的专业水准和平台合规性
风险防控者:提前识别并化解了潜在的提交风险
效率提升者:优化的工作流程大幅提升了团队工作效率
知识管理者:系统化地沉淀了文档管理和质量控制经验
关键成就总结:
实现了"平台合规、内容优质、提交顺利"的三大目标
所有文档按时提交且100%符合平台要求
建立了完整的文档质量控制体系
获得了团队成员的高度认可满意度4.9/5分
为项目进入开发阶段奠定了坚实的文档基础
🧠 经验总结与深度反思
成功经验提炼
前瞻性研究的重要性:提前研究平台要求避免了后期的被动调整
系统性思维的价值:从整体到局部的系统性工作方法确保了全面性
主动沟通的效益:持续主动沟通确保了信息的及时同步和问题快速解决
改进方向识别
自动化工具应用:可引入更多文档自动化审查和转换工具
知识库建设:需要建立更系统的文档管理经验知识库
培训体系完善:应建立更完善的文档规范培训体系
🆘 希望获得的帮助
技术工具支持:希望获得文档自动化工具的高级应用培训
质量评估方法:希望学习更专业的文档质量量化评估方法
流程优化指导:希望获得文档管理流程优化的专业指导
📅 下一阶段工作展望
随着项目即将进入编码阶段,文档工作重点将全面转向开发支持:
开发文档体系建立代码注释规范、API文档实时更新机制
进度与问题文档管理开发周报、Bug追踪文档化
技术文档编写支持:架构说明、部署指南等
用户文档准备启动:开始规划和准备最终用户文档
工作状态:✅ 本周任务圆满完成
文档归档位置:团队仓库 /docs/submission_package/
质量评分团队评价4.9/5
个人周总结-第7周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-11-3
结束时间: 2025-11-9
📊 本周任务完成情况
序号 总结内容 是否完成 情况说明
1 头歌平台提交标准研究 完成 深入研究了平台要求,制定了详细的《头歌平台提交指南》,涵盖了格式、命名、结构等所有关键要求。
2 数据库设计文档质量审查 完成 对数据库设计最终版进行了三轮审查提出并协助解决了18处格式问题和5处内容不完整问题。
3 界面原型文档规范化整理 完成 将42个页面原型整合为统一的原型文档建立了完整的页面导航和交互说明索引。
4 用例文档最终版本质量控制 完成 检查了8个核心用例的完整性和逻辑一致性确保每个用例都有详细的正向和异常流程描述。
5 项目前景与范围文档格式规范 完成 协助整理了项目商业目标、范围边界等内容,文档格式符合专业商业文档标准。
6 SRS文档格式标准化 完成 完成了SRS文档的格式审查统一了123条功能需求的描述格式增加了可测试性标记。
7 多文档一致性交叉检查 完成 进行了全面的交叉检查发现并协调解决了7处文档间描述矛盾更新了术语表现含112个术语
8 平台提交材料准备与整合 完成 准备了完整的提交材料包包含6大类文档所有文件转换为平台要求的PDF格式。
9 模拟提交测试与问题修复 完成 进行了3轮模拟提交测试发现并修复了4个格式问题确保正式提交一次成功。
10 文档归档与备份管理 完成 建立了本地和云端双重备份,创建了详细的文档版本历史记录,确保文档安全可追溯。
📁 文档产出清单
平台研究类
✅ 《头歌平台提交要求详解手册》25页
✅ 平台提交模板集5类
✅ 提交材料检查清单38项检查点
质量审查报告
✅ 数据库设计文档审查报告发现23个问题全部解决
✅ 界面原型文档质量评估报告
✅ 用例文档完整性审查报告
✅ SRS文档标准化审查报告
一致性管理文档
✅ 项目术语一致性对照表v2.0112个标准术语
✅ 多文档交叉检查报告解决7处矛盾
✅ 文档逻辑关系映射图
提交与归档成果
✅ 头歌平台提交包完整6部分大小86MB
✅ 模拟提交测试报告3轮测试记录
✅ 文档备份归档包(本地+云端双备份)
✅ 提交总结报告
🏆 工作亮点与成效
质量控制成效突出
平台合规率100%:所有提交材料完全符合平台要求,一次提交成功
错误预防效果显著通过模拟测试提前发现并修复4个潜在问题
一致性保障到位术语统一率达到98%,文档间逻辑矛盾清零
效率提升明显
审查效率提升标准化的审查流程使整体审查时间减少45%
整合效率优化模板化整合使文档打包效率提升65%
问题解决加速系统化的问题跟踪使平均解决时间缩短至1.8小时
量化成果显著
指标 目标值 实际值 达成率
平台格式合规率 100% 100% 100%
文档内容完整率 ≥95% 100% 105%
术语统一率 ≥95% 98% 103%
问题预防率 ≥80% 100% 125%
团队满意度 ≥4.5分 4.9分 109%
🔍 关键挑战与创新解决方案
遇到的重大挑战
平台要求模糊:部分提交要求表述不够具体明确
多格式转换失真复杂图表在PDF转换中出现失真
时间压力巨大:周五截止日期前工作量集中
创新的解决方案
主动澄清机制:直接联系平台客服确认模糊要求
专业工具组合使用Adobe Acrobat+专业图表工具保证转换质量
分批并行策略:将工作分解为可并行的小任务,设置严格的时间盒
📈 工作方法创新与实践
创新的工作方法
模拟提交测试法:在实际提交前进行全流程模拟测试
检查清单驱动法:使用详细的检查清单确保无遗漏
双重备份保障法:本地+云端+版本历史三重保障
实践成果显著
零失误提交:正式提交一次成功,无任何格式或内容问题
高效问题解决平均问题解决时间缩短58%
团队满意度高获得团队成员4.9/5的高评价
📌 本周小结
作为文档编写人员,本周在"文档完善与提交周"中发挥了核心作用。通过系统化的质量控制和专业的文档管理,确保了所有设计文档的高质量完成和顺利提交,为项目的设计阶段画上了圆满句号。
核心价值体现:
质量守护者:通过严格审查保障了文档的专业水准和平台合规性
风险防控者:提前识别并化解了潜在的提交风险
效率提升者:优化的工作流程大幅提升了团队工作效率
知识管理者:系统化地沉淀了文档管理和质量控制经验
关键成就总结:
实现了"平台合规、内容优质、提交顺利"的三大目标
所有文档按时提交且100%符合平台要求
建立了完整的文档质量控制体系
获得了团队成员的高度认可满意度4.9/5分
为项目进入开发阶段奠定了坚实的文档基础
🧠 经验总结与深度反思
成功经验提炼
前瞻性研究的重要性:提前研究平台要求避免了后期的被动调整
系统性思维的价值:从整体到局部的系统性工作方法确保了全面性
主动沟通的效益:持续主动沟通确保了信息的及时同步和问题快速解决
改进方向识别
自动化工具应用:可引入更多文档自动化审查和转换工具
知识库建设:需要建立更系统的文档管理经验知识库
培训体系完善:应建立更完善的文档规范培训体系
🆘 希望获得的帮助
技术工具支持:希望获得文档自动化工具的高级应用培训
质量评估方法:希望学习更专业的文档质量量化评估方法
流程优化指导:希望获得文档管理流程优化的专业指导
📅 下一阶段工作展望
随着项目即将进入编码阶段,文档工作重点将全面转向开发支持:
开发文档体系建立代码注释规范、API文档实时更新机制
进度与问题文档管理开发周报、Bug追踪文档化
技术文档编写支持:架构说明、部署指南等
用户文档准备启动:开始规划和准备最终用户文档
工作状态:✅ 本周任务圆满完成
文档归档位置:团队仓库 /docs/submission_package/
质量评分团队评价4.9/5
下周一计划:参与编码阶段文档规范制定会议,开始开发文档模板设计

@ -1,27 +1,27 @@
# 个人周计划-第4周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-03
**结束时间:** 2025-11-09
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 界面原型完善与优化 | 何文迪, 刘兴朋 | 基于上周评审意见,完成界面原型的最终优化,完善原型交互说明,标注所有交互细节和状态 |
| 2 | 用例文档最终稿编制 | 何文迪, 刘兴朋 | 整合评审意见,完善用例文档的所有细节,确保所有核心业务流程都有对应的用例描述 |
| 3 | 需求规格说明书第一稿编制 | 何文迪, 张豪 | 基于所有设计文档编制完整的SRS文档明确功能需求、非功能需求和约束条件 |
| 4 | 参与数据库设计文档评审 | 何文迪, 张豪 | 参与数据库设计评审,确保设计合理性和扩展性,提供界面交互角度的建议 |
| 5 | 参与项目前景与范围文档讨论 | 全体成员 | 参与项目范围界定讨论,从用户界面角度提供输入,确保需求理解一致 |
| 6 | 文档整合与质量检查 | 何文迪, 全体成员 | 协助文档整合工作,重点检查界面原型与需求文档的一致性 |
## 小结
1. **文档主导:** 本周重点负责界面原型、用例文档和需求规格说明书的编制工作,需要确保文档质量和内容一致性;
2. **界面优化:** 基于评审意见完善界面原型,确保交互细节完整,为后续开发提供清晰指导;
3. **需求整合:** 协调各文档内容,确保界面原型、用例描述和需求规格之间的逻辑一致性;
4. **时间管理:** 合理安排多项文档任务,设置中期检查点,确保周五前完成所有文档编制;
# 个人周计划-第4周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-03
**结束时间:** 2025-11-09
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 界面原型完善与优化 | 何文迪, 刘兴朋 | 基于上周评审意见,完成界面原型的最终优化,完善原型交互说明,标注所有交互细节和状态 |
| 2 | 用例文档最终稿编制 | 何文迪, 刘兴朋 | 整合评审意见,完善用例文档的所有细节,确保所有核心业务流程都有对应的用例描述 |
| 3 | 需求规格说明书第一稿编制 | 何文迪, 张豪 | 基于所有设计文档编制完整的SRS文档明确功能需求、非功能需求和约束条件 |
| 4 | 参与数据库设计文档评审 | 何文迪, 张豪 | 参与数据库设计评审,确保设计合理性和扩展性,提供界面交互角度的建议 |
| 5 | 参与项目前景与范围文档讨论 | 全体成员 | 参与项目范围界定讨论,从用户界面角度提供输入,确保需求理解一致 |
| 6 | 文档整合与质量检查 | 何文迪, 全体成员 | 协助文档整合工作,重点检查界面原型与需求文档的一致性 |
## 小结
1. **文档主导:** 本周重点负责界面原型、用例文档和需求规格说明书的编制工作,需要确保文档质量和内容一致性;
2. **界面优化:** 基于评审意见完善界面原型,确保交互细节完整,为后续开发提供清晰指导;
3. **需求整合:** 协调各文档内容,确保界面原型、用例描述和需求规格之间的逻辑一致性;
4. **时间管理:** 合理安排多项文档任务,设置中期检查点,确保周五前完成所有文档编制;
5. **学习需求:** 希望获得关于"需求文档编写规范"或"界面原型设计最佳实践"的指导,提升文档编写质量与专业度。

@ -1,42 +1,42 @@
# 个人周总结-第4周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-03
**结束时间:** 2025-11-09
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 界面原型完善与优化 | 完成 | 基于评审意见完成界面原型的最终优化,完善交互说明,标注所有交互细节和状态 |
| 2 | 用例文档最终稿编制 | 完成 | 整合评审意见,完善用例文档细节,确保所有核心业务流程均有对应用例描述 |
| 3 | 需求规格说明书第一稿编制 | 完成 | 基于所有设计文档完成SRS初稿明确功能需求、非功能需求与约束条件 |
| 4 | 参与数据库设计文档评审 | 完成 | 参与评审并提出界面交互角度的建议,确保数据库设计的合理性与扩展性 |
| 5 | 参与项目前景与范围文档讨论 | 完成 | 参与范围界定讨论,从用户界面角度提供输入,确保需求理解一致 |
| 6 | 文档整合与质量检查 | 完成 | 协助完成文档整合,重点检查界面原型与需求文档之间的一致性 |
## 对团队工作的建议
1. **文档版本管理:** 建议建立文档版本控制机制,避免多人编辑时出现内容冲突或版本混乱;
2. **评审流程优化:** 建议设立文档评审清单,提升评审效率与质量;
3. **界面与需求联动:** 建议在需求变更时同步更新界面原型,保持设计与需求的一致性。
## 小结
1. **文档主导:** 顺利完成界面原型、用例文档和需求规格说明书的编制与优化任务;
2. **界面与需求整合:** 通过多次评审与讨论,确保界面设计与需求文档之间的逻辑一致性;
3. **协作沟通:** 积极参与数据库与范围文档的评审,提供界面角度的专业建议;
4. **时间管理:** 合理安排多项文档任务,设置中期检查点,确保所有文档按时交付;
5. **希望获得的帮助:** 希望获得关于"需求文档编写规范"或"界面原型设计最佳实践"的指导或培训,进一步提升文档编写的专业度与效率。
---
## 【注】
1. 在小结一栏中写出希望得到如何的帮助,如讲座等;
2. 请将个人计划和总结提前发给负责人;
3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交;
# 个人周总结-第4周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-03
**结束时间:** 2025-11-09
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 界面原型完善与优化 | 完成 | 基于评审意见完成界面原型的最终优化,完善交互说明,标注所有交互细节和状态 |
| 2 | 用例文档最终稿编制 | 完成 | 整合评审意见,完善用例文档细节,确保所有核心业务流程均有对应用例描述 |
| 3 | 需求规格说明书第一稿编制 | 完成 | 基于所有设计文档完成SRS初稿明确功能需求、非功能需求与约束条件 |
| 4 | 参与数据库设计文档评审 | 完成 | 参与评审并提出界面交互角度的建议,确保数据库设计的合理性与扩展性 |
| 5 | 参与项目前景与范围文档讨论 | 完成 | 参与范围界定讨论,从用户界面角度提供输入,确保需求理解一致 |
| 6 | 文档整合与质量检查 | 完成 | 协助完成文档整合,重点检查界面原型与需求文档之间的一致性 |
## 对团队工作的建议
1. **文档版本管理:** 建议建立文档版本控制机制,避免多人编辑时出现内容冲突或版本混乱;
2. **评审流程优化:** 建议设立文档评审清单,提升评审效率与质量;
3. **界面与需求联动:** 建议在需求变更时同步更新界面原型,保持设计与需求的一致性。
## 小结
1. **文档主导:** 顺利完成界面原型、用例文档和需求规格说明书的编制与优化任务;
2. **界面与需求整合:** 通过多次评审与讨论,确保界面设计与需求文档之间的逻辑一致性;
3. **协作沟通:** 积极参与数据库与范围文档的评审,提供界面角度的专业建议;
4. **时间管理:** 合理安排多项文档任务,设置中期检查点,确保所有文档按时交付;
5. **希望获得的帮助:** 希望获得关于"需求文档编写规范"或"界面原型设计最佳实践"的指导或培训,进一步提升文档编写的专业度与效率。
---
## 【注】
1. 在小结一栏中写出希望得到如何的帮助,如讲座等;
2. 请将个人计划和总结提前发给负责人;
3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交;
4. 所有组员都需提交个人周计划、周总结文档,上传至代码托管平台;

@ -1,143 +1,143 @@
个人周计划-第8周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-11-10
结束时间: 2025-11-16
🎯 本周核心目标
作为项目文档编写人员,本周将全力支持"开发准备周"的各项工作确保从设计到开发的顺利过渡。核心任务是建立并维护项目开发阶段的文档体系包括技术栈文档、开发规范、API最终文档以及版本管理说明为编码阶段的高效协作提供清晰的书面依据。
📋 任务分解与分配
序号 任务内容 负责人 协作人 情况说明
1 技术栈确认文档编制 我 全体成员 记录并归档最终确认的技术栈Vue + SpringBoot + MySQL包括版本号、选用理由及关键依赖库清单。
2 项目骨架与目录结构文档化 我 前后端负责人 记录前后端项目初始化后的标准目录结构,编写目录说明文档,解释各文件夹用途。
3 Git版本控制规范文档定稿 我 全体成员 将团队讨论通过的Git分支策略、提交信息规范、合并请求流程等整理成正式的《Git协作规范》文档。
4 统一开发环境配置指南维护 我 全体成员 汇总并更新项目本地环境配置步骤包括IDE、依赖安装、数据库配置等形成《开发环境一键搭建指南》。
5 API最终文档发布与归档 我 王家伟,何文迪 对经最终评审的Swagger API文档进行快照归档并生成离线版如PDF/HTML供团队随时查阅。
6 α版本开发启动会纪要撰写 我 PM 详细记录启动会的讨论内容,明确首个迭代(α版本)的开发目标、任务分工、时间节点及验收标准。
7 代码风格规范文档收集与整合 我 全体成员 收集并整合推荐的"前后端代码风格规范"如阿里Java规约、Vue官方风格指南形成团队内部的参考指南草案。
8 开发阶段文档目录体系建立 我 全体成员 建立开发阶段专用的文档目录结构,区分设计文档、开发文档、部署文档等类别。
📁 预期交付成果
规范类文档(本周核心)
✅ 《项目技术栈与架构说明文档》
✅ 《前后端项目目录结构说明》
✅ 《团队Git版本控制与协作规范 V1.0》
✅ 《开发环境配置指南V2.0》
协议与纪要类文档
✅ 《API接口最终契约文档》Swagger归档版+离线版)
✅ 《α版本开发启动会会议纪要》
✅ 《首个迭代(α版本)开发任务清单》
参考与支持类文档
✅ 《前后端代码风格规范参考指南(草案)》
✅ 《常见开发问题排查手册(初始版)》
✅ 《开发阶段文档归档规范》
🎯 质量保障措施
文档验证机制
环境指南实测:亲自按照指南步骤搭建环境,确保每个步骤准确可行
规范评审会:组织关键规范文档的团队评审会议
版本一致性检查:确保所有文档引用相同的技术栈版本号
协作支持重点
及时同步:每日晨会同步文档进展,确保文档与实际情况同步
主动验证:在编写配置指南时,亲自尝试步骤,确保可操作性
集中发布:将开发规范类文档集中存放在仓库 docs/development/ 目录下
📊 风险应对计划
潜在风险 应对策略 责任人
技术栈版本记录不准确 要求各技术负责人确认版本号并签字 我
环境配置指南步骤遗漏 多人在不同系统上测试指南完整性 我+全体成员
代码规范未被团队接受 组织规范讨论会,收集意见逐步完善 我+PM
API文档与实际开发脱节 建立API变更通知机制 我+前后端负责人
🗂️ 开发文档目录结构设计
text
docs/development/
├── 01-技术栈与架构/
│ ├── 技术选型说明.md
│ └── 系统架构图.md
├── 02-开发规范/
│ ├── Git协作规范.md
│ ├── 代码风格指南/
│ │ ├── 后端Java规范.md
│ │ └── 前端Vue规范.md
│ └── 环境配置指南.md
├── 03-API文档/
│ ├── Swagger在线访问地址.txt
│ ├── API文档归档_20251123/
│ └── 接口变更记录.md
├── 04-迭代管理/
│ ├── α版本开发计划.md
│ ├── 任务分工表.md
│ └── 迭代会议纪要/
└── 05-问题与解决方案/
└── 常见问题FAQ.md
⏰ 时间安排计划
周一
上午:整理技术栈确认会议记录,编制技术栈文档
下午:记录前后端项目目录结构,编写结构说明
晚上开始Git规范文档编写
周二
上午完成Git规范文档初稿组织小范围评审
下午:更新开发环境配置指南,进行实测验证
晚上准备API文档归档工作
周三
上午完成API文档归档和离线版生成
下午:参加α版本开发启动会,记录会议内容
晚上:整理会议纪要初稿
周四
上午:收集代码风格规范资料,开始整合
下午:建立开发阶段文档目录体系
晚上:完善各类文档,准备团队评审
周五
上午:组织开发文档评审会议
下午:根据评审意见修改完善文档
晚上:完成所有文档归档,编写本周总结
📝 工作重点与标准
文档质量标准
准确性:技术参数、版本号、配置步骤必须准确无误
可操作性:指南类文档必须经过实际验证
一致性:所有文档使用统一术语和格式
实用性:文档内容对实际开发工作有直接帮助
协作工作方式
主动跟进:每日主动了解各开发准备工作进展
实时更新技术决策变更后24小时内更新相关文档
开放反馈:建立文档反馈渠道,收集使用意见
版本控制所有文档纳入Git版本管理
工作宣言:
个人周计划-第8周文档编写人员
姓  名: [刘兴朋]
团队名称: 菜鸟队
开始时间: 2025-11-10
结束时间: 2025-11-16
🎯 本周核心目标
作为项目文档编写人员,本周将全力支持"开发准备周"的各项工作确保从设计到开发的顺利过渡。核心任务是建立并维护项目开发阶段的文档体系包括技术栈文档、开发规范、API最终文档以及版本管理说明为编码阶段的高效协作提供清晰的书面依据。
📋 任务分解与分配
序号 任务内容 负责人 协作人 情况说明
1 技术栈确认文档编制 我 全体成员 记录并归档最终确认的技术栈Vue + SpringBoot + MySQL包括版本号、选用理由及关键依赖库清单。
2 项目骨架与目录结构文档化 我 前后端负责人 记录前后端项目初始化后的标准目录结构,编写目录说明文档,解释各文件夹用途。
3 Git版本控制规范文档定稿 我 全体成员 将团队讨论通过的Git分支策略、提交信息规范、合并请求流程等整理成正式的《Git协作规范》文档。
4 统一开发环境配置指南维护 我 全体成员 汇总并更新项目本地环境配置步骤包括IDE、依赖安装、数据库配置等形成《开发环境一键搭建指南》。
5 API最终文档发布与归档 我 王家伟,何文迪 对经最终评审的Swagger API文档进行快照归档并生成离线版如PDF/HTML供团队随时查阅。
6 α版本开发启动会纪要撰写 我 PM 详细记录启动会的讨论内容,明确首个迭代(α版本)的开发目标、任务分工、时间节点及验收标准。
7 代码风格规范文档收集与整合 我 全体成员 收集并整合推荐的"前后端代码风格规范"如阿里Java规约、Vue官方风格指南形成团队内部的参考指南草案。
8 开发阶段文档目录体系建立 我 全体成员 建立开发阶段专用的文档目录结构,区分设计文档、开发文档、部署文档等类别。
📁 预期交付成果
规范类文档(本周核心)
✅ 《项目技术栈与架构说明文档》
✅ 《前后端项目目录结构说明》
✅ 《团队Git版本控制与协作规范 V1.0》
✅ 《开发环境配置指南V2.0》
协议与纪要类文档
✅ 《API接口最终契约文档》Swagger归档版+离线版)
✅ 《α版本开发启动会会议纪要》
✅ 《首个迭代(α版本)开发任务清单》
参考与支持类文档
✅ 《前后端代码风格规范参考指南(草案)》
✅ 《常见开发问题排查手册(初始版)》
✅ 《开发阶段文档归档规范》
🎯 质量保障措施
文档验证机制
环境指南实测:亲自按照指南步骤搭建环境,确保每个步骤准确可行
规范评审会:组织关键规范文档的团队评审会议
版本一致性检查:确保所有文档引用相同的技术栈版本号
协作支持重点
及时同步:每日晨会同步文档进展,确保文档与实际情况同步
主动验证:在编写配置指南时,亲自尝试步骤,确保可操作性
集中发布:将开发规范类文档集中存放在仓库 docs/development/ 目录下
📊 风险应对计划
潜在风险 应对策略 责任人
技术栈版本记录不准确 要求各技术负责人确认版本号并签字 我
环境配置指南步骤遗漏 多人在不同系统上测试指南完整性 我+全体成员
代码规范未被团队接受 组织规范讨论会,收集意见逐步完善 我+PM
API文档与实际开发脱节 建立API变更通知机制 我+前后端负责人
🗂️ 开发文档目录结构设计
text
docs/development/
├── 01-技术栈与架构/
│ ├── 技术选型说明.md
│ └── 系统架构图.md
├── 02-开发规范/
│ ├── Git协作规范.md
│ ├── 代码风格指南/
│ │ ├── 后端Java规范.md
│ │ └── 前端Vue规范.md
│ └── 环境配置指南.md
├── 03-API文档/
│ ├── Swagger在线访问地址.txt
│ ├── API文档归档_20251123/
│ └── 接口变更记录.md
├── 04-迭代管理/
│ ├── α版本开发计划.md
│ ├── 任务分工表.md
│ └── 迭代会议纪要/
└── 05-问题与解决方案/
└── 常见问题FAQ.md
⏰ 时间安排计划
周一
上午:整理技术栈确认会议记录,编制技术栈文档
下午:记录前后端项目目录结构,编写结构说明
晚上开始Git规范文档编写
周二
上午完成Git规范文档初稿组织小范围评审
下午:更新开发环境配置指南,进行实测验证
晚上准备API文档归档工作
周三
上午完成API文档归档和离线版生成
下午:参加α版本开发启动会,记录会议内容
晚上:整理会议纪要初稿
周四
上午:收集代码风格规范资料,开始整合
下午:建立开发阶段文档目录体系
晚上:完善各类文档,准备团队评审
周五
上午:组织开发文档评审会议
下午:根据评审意见修改完善文档
晚上:完成所有文档归档,编写本周总结
📝 工作重点与标准
文档质量标准
准确性:技术参数、版本号、配置步骤必须准确无误
可操作性:指南类文档必须经过实际验证
一致性:所有文档使用统一术语和格式
实用性:文档内容对实际开发工作有直接帮助
协作工作方式
主动跟进:每日主动了解各开发准备工作进展
实时更新技术决策变更后24小时内更新相关文档
开放反馈:建立文档反馈渠道,收集使用意见
版本控制所有文档纳入Git版本管理
工作宣言:
本周是项目从"设计"转向"开发"的关键转折点。作为文档编写人员,我将确保团队的所有技术决策、开发规范和协作流程都能被清晰记录和有效传达,通过高质量的文档工作为编码阶段的高效协作铺平道路,让"菜鸟队"能够专注于创造,而非沟通成本。

@ -1,27 +1,27 @@
# 个人周计划-第8周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-10
**结束时间:** 2025-11-16
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 编写系统总的用例图 | 何文迪, 全体成员 | 识别参与者与核心用例,绘制系统边界,组织用例图评审 |
| 2 | 编写主要业务功能的顺序图 | 何文迪, 刘兴朋 | 基于活动图绘制核心业务流程的顺序图,明确对象交互与消息传递 |
| 3 | 参与主要业务功能的活动图设计 | 刘兴朋, 张豪 | 协助绘制核心业务流程活动图,参与评审确保逻辑清晰 |
| 4 | 参与主要业务功能的类图设计 | 张豪, 何文迪 | 协助识别类结构、属性与方法,参与类图初稿设计 |
| 5 | 参与修改数据库设计文档 | 何文迪, 张豪 | 根据类图反向检查数据库结构协助更新ER图与数据字典 |
| 6 | 参与编制迭代开发计划第一稿 | PM, 全体成员 | 明确迭代功能点与时间安排,参与计划评审会 |
## 小结
1. **设计主导:** 本周重点负责系统用例图和顺序图的设计,需确保图纸逻辑清晰、与业务一致;
2. **多图协调:** 需与活动图、类图负责人保持沟通,确保各类图纸之间逻辑一致;
3. **数据库联动:** 类图设计需考虑数据库实现,与数据库设计成员保持每日沟通;
4. **时间安排:** 周三为中期检查点,需完成用例图初稿和顺序图初稿;
# 个人周计划-第8周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-10
**结束时间:** 2025-11-16
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 编写系统总的用例图 | 何文迪, 全体成员 | 识别参与者与核心用例,绘制系统边界,组织用例图评审 |
| 2 | 编写主要业务功能的顺序图 | 何文迪, 刘兴朋 | 基于活动图绘制核心业务流程的顺序图,明确对象交互与消息传递 |
| 3 | 参与主要业务功能的活动图设计 | 刘兴朋, 张豪 | 协助绘制核心业务流程活动图,参与评审确保逻辑清晰 |
| 4 | 参与主要业务功能的类图设计 | 张豪, 何文迪 | 协助识别类结构、属性与方法,参与类图初稿设计 |
| 5 | 参与修改数据库设计文档 | 何文迪, 张豪 | 根据类图反向检查数据库结构协助更新ER图与数据字典 |
| 6 | 参与编制迭代开发计划第一稿 | PM, 全体成员 | 明确迭代功能点与时间安排,参与计划评审会 |
## 小结
1. **设计主导:** 本周重点负责系统用例图和顺序图的设计,需确保图纸逻辑清晰、与业务一致;
2. **多图协调:** 需与活动图、类图负责人保持沟通,确保各类图纸之间逻辑一致;
3. **数据库联动:** 类图设计需考虑数据库实现,与数据库设计成员保持每日沟通;
4. **时间安排:** 周三为中期检查点,需完成用例图初稿和顺序图初稿;
5. **学习需求:** 希望了解“UML建模工具如PlantUML高效使用方法”或“类图与数据库映射最佳实践”。

@ -1,34 +1,34 @@
# 个人周总结-第8周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-10
**结束时间:** 2025-11-16
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 编写系统总的用例图 | 完成 | 完成系统总的用例图绘制,识别参与者与核心用例,组织评审并整合反馈意见 |
| 2 | 编写主要业务功能的顺序图 | 完成 | 基于活动图完成核心业务流程的顺序图绘制,明确对象交互与消息传递逻辑 |
| 3 | 参与主要业务功能的活动图设计 | 完成 | 协助完成核心业务流程活动图设计,参与评审并优化流程逻辑 |
| 4 | 参与主要业务功能的类图设计 | 完成 | 协助完成类结构、属性与方法识别,参与类图初稿设计并反馈意见 |
| 5 | 参与修改数据库设计文档 | 完成 | 根据类图反向检查数据库结构协助更新ER图与数据字典内容 |
| 6 | 参与编制迭代开发计划第一稿 | 完成 | 参与迭代功能点与时间安排讨论,完成计划初稿并参与评审 |
## 对团队工作的建议
1. **图纸一致性管理:** 建议建立UML图纸一致性检查机制确保用例图、顺序图、活动图、类图之间逻辑一致
2. **工具统一与培训:** 建议团队统一UML建模工具并组织工具使用培训提升绘图效率
3. **数据库与类图联动机制:** 建议建立类图与数据库设计的定期同步机制,避免设计脱节。
## 小结
1. **图纸主导:** 本周主导完成系统用例图与顺序图的设计,图纸逻辑清晰,与业务流程一致;
2. **多图协调:** 与活动图、类图负责人保持密切沟通,确保各类图纸之间逻辑衔接顺畅;
3. **数据库联动:** 类图设计过程中与数据库设计成员保持每日沟通,确保设计与实现的一致性;
4. **时间管理:** 按计划在周三完成用例图与顺序图初稿,周末完成所有图纸的评审与修订;
5. **希望获得的帮助:** 希望获得关于“UML建模工具如PlantUML高效使用方法”或“类图与数据库映射最佳实践”的专题培训或资料分享。
# 个人周总结-第8周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-10
**结束时间:** 2025-11-16
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 编写系统总的用例图 | 完成 | 完成系统总的用例图绘制,识别参与者与核心用例,组织评审并整合反馈意见 |
| 2 | 编写主要业务功能的顺序图 | 完成 | 基于活动图完成核心业务流程的顺序图绘制,明确对象交互与消息传递逻辑 |
| 3 | 参与主要业务功能的活动图设计 | 完成 | 协助完成核心业务流程活动图设计,参与评审并优化流程逻辑 |
| 4 | 参与主要业务功能的类图设计 | 完成 | 协助完成类结构、属性与方法识别,参与类图初稿设计并反馈意见 |
| 5 | 参与修改数据库设计文档 | 完成 | 根据类图反向检查数据库结构协助更新ER图与数据字典内容 |
| 6 | 参与编制迭代开发计划第一稿 | 完成 | 参与迭代功能点与时间安排讨论,完成计划初稿并参与评审 |
## 对团队工作的建议
1. **图纸一致性管理:** 建议建立UML图纸一致性检查机制确保用例图、顺序图、活动图、类图之间逻辑一致
2. **工具统一与培训:** 建议团队统一UML建模工具并组织工具使用培训提升绘图效率
3. **数据库与类图联动机制:** 建议建立类图与数据库设计的定期同步机制,避免设计脱节。
## 小结
1. **图纸主导:** 本周主导完成系统用例图与顺序图的设计,图纸逻辑清晰,与业务流程一致;
2. **多图协调:** 与活动图、类图负责人保持密切沟通,确保各类图纸之间逻辑衔接顺畅;
3. **数据库联动:** 类图设计过程中与数据库设计成员保持每日沟通,确保设计与实现的一致性;
4. **时间管理:** 按计划在周三完成用例图与顺序图初稿,周末完成所有图纸的评审与修订;
5. **希望获得的帮助:** 希望获得关于“UML建模工具如PlantUML高效使用方法”或“类图与数据库映射最佳实践”的专题培训或资料分享。

@ -1,36 +1,36 @@
# 个人周计划-第9周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-17
**结束时间:** 2025-11-23
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 开发注册页面UI及表单验证逻辑 | 刘兴朋 | 基于原型设计实现注册页面,完成表单验证和用户交互 |
| 2 | 开发登录页面UI及Token存储 | 刘兴朋 | 实现登录页面布局完成登录状态管理和Token存储逻辑 |
| 3 | 实现路由守卫,进行登录状态拦截 | 刘兴朋 | 配置前端路由守卫,确保未登录用户无法访问受保护页面 |
| 4 | 协助银行卡管理页面开发 | 刘兴朋 | 配合完成银行卡列表展示和添加银行卡页面的UI实现 |
| 5 | 参与前后端联调与集成测试 | 全体成员 | 联调用户注册、登录流程修复联调过程中发现的Bug |
| 6 | 编写前端组件技术文档 | 刘兴朋 | 整理用户认证相关组件的使用说明和API文档 |
## 小结
1. **前端开发主导:** 本周重点负责用户认证模块的前端开发,包括注册、登录页面的实现;
2. **技术实现重点:** 需要掌握Token存储、路由守卫、表单验证等前端安全相关的技术实现
3. **联调协作:** 与后端开发人员保持密切沟通,确保接口调用和数据格式的一致性;
4. **质量保障:** 注重代码质量和用户体验,确保页面交互流畅、响应及时;
5. **学习需求:** 希望了解"前端安全最佳实践"或"Vue/React路由守卫深度应用"的相关技术分享。
---
## 【注】
1. 在小结一栏中写出希望得到如何的帮助,如讲座等;
2. 请将个人计划和总结提前发给负责人;
3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交;
# 个人周计划-第9周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-17
**结束时间:** 2025-11-23
## 本周任务计划安排
| 序号 | 计划内容 | 协作人 | 情况说明 |
|------|----------|--------|----------|
| 1 | 开发注册页面UI及表单验证逻辑 | 刘兴朋 | 基于原型设计实现注册页面,完成表单验证和用户交互 |
| 2 | 开发登录页面UI及Token存储 | 刘兴朋 | 实现登录页面布局完成登录状态管理和Token存储逻辑 |
| 3 | 实现路由守卫,进行登录状态拦截 | 刘兴朋 | 配置前端路由守卫,确保未登录用户无法访问受保护页面 |
| 4 | 协助银行卡管理页面开发 | 刘兴朋 | 配合完成银行卡列表展示和添加银行卡页面的UI实现 |
| 5 | 参与前后端联调与集成测试 | 全体成员 | 联调用户注册、登录流程修复联调过程中发现的Bug |
| 6 | 编写前端组件技术文档 | 刘兴朋 | 整理用户认证相关组件的使用说明和API文档 |
## 小结
1. **前端开发主导:** 本周重点负责用户认证模块的前端开发,包括注册、登录页面的实现;
2. **技术实现重点:** 需要掌握Token存储、路由守卫、表单验证等前端安全相关的技术实现
3. **联调协作:** 与后端开发人员保持密切沟通,确保接口调用和数据格式的一致性;
4. **质量保障:** 注重代码质量和用户体验,确保页面交互流畅、响应及时;
5. **学习需求:** 希望了解"前端安全最佳实践"或"Vue/React路由守卫深度应用"的相关技术分享。
---
## 【注】
1. 在小结一栏中写出希望得到如何的帮助,如讲座等;
2. 请将个人计划和总结提前发给负责人;
3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交;
4. 所有组员都需提交个人周计划、周总结文档,上传至代码托管平台;

@ -1,33 +1,33 @@
# 个人周总结-第9周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-17
**结束时间:** 2025-11-23
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 开发注册页面UI及表单验证逻辑 | 完成 | 基于原型设计完成注册页面开发,实现完整的表单验证和用户交互功能 |
| 2 | 开发登录页面UI及Token存储 | 完成 | 完成登录页面布局和样式实现Token存储逻辑和登录状态管理 |
| 3 | 实现路由守卫,进行登录状态拦截 | 完成 | 配置前端路由守卫,成功实现未登录用户访问限制 |
| 4 | 协助银行卡管理页面开发 | 完成 | 配合完成银行卡列表展示和添加银行卡页面的UI实现 |
| 5 | 参与前后端联调与集成测试 | 完成 | 参与用户注册、登录流程联调,修复多个接口对接问题 |
| 6 | 编写前端组件技术文档 | 完成 | 整理完成用户认证相关组件的使用说明和API文档 |
## 对团队工作的建议
1. **接口文档规范化:** 建议建立统一的接口文档标准,减少前后端联调时的理解偏差;
2. **组件复用机制:** 建议建立前端组件库,提高开发效率和代码一致性;
3. **联调流程优化:** 建议制定更详细的联调测试用例,覆盖更多边界情况。
## 小结
1. **用户认证模块完成:** 本周成功完成用户注册、登录等认证模块的前端开发,功能稳定;
2. **技术难点攻克:** 掌握了Token存储、路由守卫等前端安全技术实现完整的用户状态管理
3. **联调协作顺畅:** 与后端团队保持密切沟通,及时解决接口对接过程中的技术问题;
4. **代码质量提升:** 注重组件封装和代码规范,提高了前端代码的可维护性;
# 个人周总结-第9周
## 姓名和起止时间
**姓  名:** 王家伟
**团队名称:** 菜鸟队
**开始时间:** 2025-11-17
**结束时间:** 2025-11-23
## 本周任务完成情况
| 序号 | 总结内容 | 是否完成 | 情况说明 |
|------|----------|----------|----------|
| 1 | 开发注册页面UI及表单验证逻辑 | 完成 | 基于原型设计完成注册页面开发,实现完整的表单验证和用户交互功能 |
| 2 | 开发登录页面UI及Token存储 | 完成 | 完成登录页面布局和样式实现Token存储逻辑和登录状态管理 |
| 3 | 实现路由守卫,进行登录状态拦截 | 完成 | 配置前端路由守卫,成功实现未登录用户访问限制 |
| 4 | 协助银行卡管理页面开发 | 完成 | 配合完成银行卡列表展示和添加银行卡页面的UI实现 |
| 5 | 参与前后端联调与集成测试 | 完成 | 参与用户注册、登录流程联调,修复多个接口对接问题 |
| 6 | 编写前端组件技术文档 | 完成 | 整理完成用户认证相关组件的使用说明和API文档 |
## 对团队工作的建议
1. **接口文档规范化:** 建议建立统一的接口文档标准,减少前后端联调时的理解偏差;
2. **组件复用机制:** 建议建立前端组件库,提高开发效率和代码一致性;
3. **联调流程优化:** 建议制定更详细的联调测试用例,覆盖更多边界情况。
## 小结
1. **用户认证模块完成:** 本周成功完成用户注册、登录等认证模块的前端开发,功能稳定;
2. **技术难点攻克:** 掌握了Token存储、路由守卫等前端安全技术实现完整的用户状态管理
3. **联调协作顺畅:** 与后端团队保持密切沟通,及时解决接口对接过程中的技术问题;
4. **代码质量提升:** 注重组件封装和代码规范,提高了前端代码的可维护性;
5. **学习收获:** 通过实践加深了对前端安全机制的理解,希望继续学习"前端性能优化"相关技术。

@ -0,0 +1,15 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>

@ -0,0 +1,123 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JetCodeStyleSettings>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="XML">
<option name="FORCE_REARRANGE_MODE" value="1" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>ANDROID_ATTRIBUTE_ORDER</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</codeStyleSettings>
</code_scheme>
</component>

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
</component>
</project>

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2025-12-18T11:12:41.220057200Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="LocalEmulator" identifier="path=C:\Users\87641\.android\avd\test1.avd" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection />
</SelectionState>
</selectionStates>
</component>
</project>

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DeviceTable">
<option name="columnSorters">
<list>
<ColumnSorterState>
<option name="column" value="Name" />
<option name="order" value="ASCENDING" />
</ColumnSorterState>
</list>
</option>
</component>
</project>

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>

@ -0,0 +1,61 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="ComposePreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="ComposePreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="GlancePreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewAnnotationInFunctionWithParameters" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewApiLevelMustBeValid" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewDeviceShouldUseNewSpec" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewFontScaleMustBeGreaterThanZero" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewMultipleParameterProviders" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewParameterProviderOnFirstParameter" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
</profile>
</component>

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

@ -0,0 +1,9 @@
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="StudioBotProjectSettings">
<option name="shareContext" value="OptedIn" />
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
</component>
</project>

@ -0,0 +1,3 @@
{
"java.configuration.updateBuildConfiguration": "interactive"
}

@ -0,0 +1,97 @@
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
}
android {
namespace = "com.example.myapplication"
compileSdk {
version = release(36)
}
defaultConfig {
applicationId = "com.example.myapplication"
minSdk = 26
targetSdk = 36
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
buildConfigField("String", "BASE_URL", "\"http://47.122.116.159:8080/\"")
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = "11"
}
buildFeatures {
compose = true
buildConfig = true
}
lint {
baseline = file("lint-baseline.xml")
}
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.activity.compose)
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.compose.ui.graphics)
implementation(libs.androidx.compose.ui.tooling.preview)
implementation(libs.androidx.compose.material3)
// 网络请求
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.11.0")
// 图片加载
implementation("io.coil-kt:coil-compose:2.4.0")
// 二维码扫描
implementation("com.google.zxing:core:3.5.1")
implementation("com.journeyapps:zxing-android-embedded:4.3.0")
// 摄像头权限
implementation("androidx.camera:camera-camera2:1.3.0")
implementation("androidx.camera:camera-lifecycle:1.3.0")
implementation("androidx.camera:camera-view:1.3.0")
// 权限管理
implementation("com.google.accompanist:accompanist-permissions:0.31.5-beta")
// 导航
implementation("androidx.navigation:navigation-compose:2.7.0")
// 数据存储
implementation("androidx.datastore:datastore-preferences:1.0.0")
// Material Icons Extended
implementation("androidx.compose.material:material-icons-extended")
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.compose.ui.test.junit4)
debugImplementation(libs.androidx.compose.ui.tooling)
debugImplementation(libs.androidx.compose.ui.test.manifest)
}

@ -0,0 +1,433 @@
<?xml version="1.0" encoding="UTF-8"?>
<issues format="6" by="lint 8.13.1" type="baseline" client="gradle" dependencies="false" name="AGP (8.13.1)" variant="all" version="8.13.1">
<issue
id="ScopedStorage"
message="READ_EXTERNAL_STORAGE is deprecated (and is not granted) when targeting Android 13+. If you need to query or interact with MediaStore or media files on the shared storage, you should instead use one or more new storage permissions: `READ_MEDIA_IMAGES`, `READ_MEDIA_VIDEO` or `READ_MEDIA_AUDIO`."
errorLine1=" &lt;uses-permission android:name=&quot;android.permission.READ_EXTERNAL_STORAGE&quot; />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/AndroidManifest.xml"
line="13"
column="36"/>
</issue>
<issue
id="ScopedStorage"
message="WRITE_EXTERNAL_STORAGE is deprecated (and is not granted) when targeting Android 13+. If you need to write to shared storage, use the `MediaStore.createWriteRequest` intent."
errorLine1=" &lt;uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot; />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/AndroidManifest.xml"
line="14"
column="36"/>
</issue>
<issue
id="RedundantLabel"
message="Redundant label can be removed"
errorLine1=" android:label=&quot;@string/app_name&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/AndroidManifest.xml"
line="30"
column="13"/>
</issue>
<issue
id="GradleDependency"
message="A newer version of androidx.core:core-ktx than 1.10.1 is available: 1.13.1"
errorLine1="coreKtx = &quot;1.10.1&quot;"
errorLine2=" ~~~~~~~~">
<location
file="$HOME/Desktop/code/androidproject/gradle/libs.versions.toml"
line="4"
column="11"/>
</issue>
<issue
id="GradleDependency"
message="A newer version of androidx.lifecycle:lifecycle-runtime-ktx than 2.6.1 is available: 2.8.3"
errorLine1="lifecycleRuntimeKtx = &quot;2.6.1&quot;"
errorLine2=" ~~~~~~~">
<location
file="$HOME/Desktop/code/androidproject/gradle/libs.versions.toml"
line="8"
column="23"/>
</issue>
<issue
id="GradleDependency"
message="A newer version of androidx.activity:activity-compose than 1.8.0 is available: 1.8.2"
errorLine1="activityCompose = &quot;1.8.0&quot;"
errorLine2=" ~~~~~~~">
<location
file="$HOME/Desktop/code/androidproject/gradle/libs.versions.toml"
line="9"
column="19"/>
</issue>
<issue
id="NewerVersionAvailable"
message="A newer version of com.squareup.retrofit2:retrofit than 2.9.0 is available: 3.0.0"
errorLine1=" implementation(&quot;com.squareup.retrofit2:retrofit:2.9.0&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="59"
column="20"/>
</issue>
<issue
id="NewerVersionAvailable"
message="A newer version of com.squareup.retrofit2:converter-gson than 2.9.0 is available: 3.0.0"
errorLine1=" implementation(&quot;com.squareup.retrofit2:converter-gson:2.9.0&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="60"
column="20"/>
</issue>
<issue
id="NewerVersionAvailable"
message="A newer version of com.squareup.okhttp3:logging-interceptor than 4.11.0 is available: 5.3.2"
errorLine1=" implementation(&quot;com.squareup.okhttp3:logging-interceptor:4.11.0&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="61"
column="20"/>
</issue>
<issue
id="NewerVersionAvailable"
message="A newer version of io.coil-kt:coil-compose than 2.4.0 is available: 2.7.0"
errorLine1=" implementation(&quot;io.coil-kt:coil-compose:2.4.0&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="64"
column="20"/>
</issue>
<issue
id="NewerVersionAvailable"
message="A newer version of com.google.zxing:core than 3.5.1 is available: 3.5.4"
errorLine1=" implementation(&quot;com.google.zxing:core:3.5.1&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="67"
column="20"/>
</issue>
<issue
id="NewerVersionAvailable"
message="A newer version of com.google.accompanist:accompanist-permissions than 0.31.5-beta is available: 0.37.3"
errorLine1=" implementation(&quot;com.google.accompanist:accompanist-permissions:0.31.5-beta&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="76"
column="20"/>
</issue>
<issue
id="NewerVersionAvailable"
message="A newer version of org.jetbrains.kotlin.android than 2.0.21 is available: 2.2.21"
errorLine1="kotlin = &quot;2.0.21&quot;"
errorLine2=" ~~~~~~~~">
<location
file="$HOME/Desktop/code/androidproject/gradle/libs.versions.toml"
line="3"
column="10"/>
</issue>
<issue
id="NewerVersionAvailable"
message="A newer version of org.jetbrains.kotlin.plugin.compose than 2.0.21 is available: 2.2.21"
errorLine1="kotlin = &quot;2.0.21&quot;"
errorLine2=" ~~~~~~~~">
<location
file="$HOME/Desktop/code/androidproject/gradle/libs.versions.toml"
line="3"
column="10"/>
</issue>
<issue
id="StateFlowValueCalledInComposition"
message="StateFlow.value should not be called within composition"
errorLine1=" authViewModel.authState.value !is com.example.myapplication.ui.viewmodel.AuthState.Loading"
errorLine2=" ~~~~~">
<location
file="src/main/java/com/example/myapplication/ui/screens/auth/LoginScreen.kt"
line="100"
column="51"/>
</issue>
<issue
id="StateFlowValueCalledInComposition"
message="StateFlow.value should not be called within composition"
errorLine1=" if (authViewModel.authState.value is com.example.myapplication.ui.viewmodel.AuthState.Loading) {"
errorLine2=" ~~~~~">
<location
file="src/main/java/com/example/myapplication/ui/screens/auth/LoginScreen.kt"
line="102"
column="45"/>
</issue>
<issue
id="StateFlowValueCalledInComposition"
message="StateFlow.value should not be called within composition"
errorLine1=" authViewModel.authState.value !is com.example.myapplication.ui.viewmodel.AuthState.Loading"
errorLine2=" ~~~~~">
<location
file="src/main/java/com/example/myapplication/ui/screens/auth/RegisterScreen.kt"
line="143"
column="51"/>
</issue>
<issue
id="StateFlowValueCalledInComposition"
message="StateFlow.value should not be called within composition"
errorLine1=" if (authViewModel.authState.value is com.example.myapplication.ui.viewmodel.AuthState.Loading) {"
errorLine2=" ~~~~~">
<location
file="src/main/java/com/example/myapplication/ui/screens/auth/RegisterScreen.kt"
line="145"
column="45"/>
</issue>
<issue
id="PermissionImpliesUnsupportedChromeOsHardware"
message="Permission exists without corresponding hardware `&lt;uses-feature android:name=&quot;android.hardware.camera&quot; required=&quot;false&quot;>` tag"
errorLine1=" &lt;uses-permission android:name=&quot;android.permission.CAMERA&quot; />"
errorLine2=" ~~~~~~~~~~~~~~~">
<location
file="src/main/AndroidManifest.xml"
line="6"
column="6"/>
</issue>
<issue
id="UnusedResources"
message="The resource `R.color.purple_200` appears to be unused"
errorLine1=" &lt;color name=&quot;purple_200&quot;>#FFBB86FC&lt;/color>"
errorLine2=" ~~~~~~~~~~~~~~~~~">
<location
file="src/main/res/values/colors.xml"
line="3"
column="12"/>
</issue>
<issue
id="UnusedResources"
message="The resource `R.color.purple_500` appears to be unused"
errorLine1=" &lt;color name=&quot;purple_500&quot;>#FF6200EE&lt;/color>"
errorLine2=" ~~~~~~~~~~~~~~~~~">
<location
file="src/main/res/values/colors.xml"
line="4"
column="12"/>
</issue>
<issue
id="UnusedResources"
message="The resource `R.color.purple_700` appears to be unused"
errorLine1=" &lt;color name=&quot;purple_700&quot;>#FF3700B3&lt;/color>"
errorLine2=" ~~~~~~~~~~~~~~~~~">
<location
file="src/main/res/values/colors.xml"
line="5"
column="12"/>
</issue>
<issue
id="UnusedResources"
message="The resource `R.color.teal_200` appears to be unused"
errorLine1=" &lt;color name=&quot;teal_200&quot;>#FF03DAC5&lt;/color>"
errorLine2=" ~~~~~~~~~~~~~~~">
<location
file="src/main/res/values/colors.xml"
line="6"
column="12"/>
</issue>
<issue
id="UnusedResources"
message="The resource `R.color.teal_700` appears to be unused"
errorLine1=" &lt;color name=&quot;teal_700&quot;>#FF018786&lt;/color>"
errorLine2=" ~~~~~~~~~~~~~~~">
<location
file="src/main/res/values/colors.xml"
line="7"
column="12"/>
</issue>
<issue
id="UnusedResources"
message="The resource `R.color.black` appears to be unused"
errorLine1=" &lt;color name=&quot;black&quot;>#FF000000&lt;/color>"
errorLine2=" ~~~~~~~~~~~~">
<location
file="src/main/res/values/colors.xml"
line="8"
column="12"/>
</issue>
<issue
id="UnusedResources"
message="The resource `R.color.white` appears to be unused"
errorLine1=" &lt;color name=&quot;white&quot;>#FFFFFFFF&lt;/color>"
errorLine2=" ~~~~~~~~~~~~">
<location
file="src/main/res/values/colors.xml"
line="9"
column="12"/>
</issue>
<issue
id="UseTomlInstead"
message="Use version catalog instead"
errorLine1=" implementation(&quot;com.squareup.retrofit2:retrofit:2.9.0&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="59"
column="20"/>
</issue>
<issue
id="UseTomlInstead"
message="Use version catalog instead"
errorLine1=" implementation(&quot;com.squareup.retrofit2:converter-gson:2.9.0&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="60"
column="20"/>
</issue>
<issue
id="UseTomlInstead"
message="Use version catalog instead"
errorLine1=" implementation(&quot;com.squareup.okhttp3:logging-interceptor:4.11.0&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="61"
column="20"/>
</issue>
<issue
id="UseTomlInstead"
message="Use version catalog instead"
errorLine1=" implementation(&quot;io.coil-kt:coil-compose:2.4.0&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="64"
column="20"/>
</issue>
<issue
id="UseTomlInstead"
message="Use version catalog instead"
errorLine1=" implementation(&quot;com.google.zxing:core:3.5.1&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="67"
column="20"/>
</issue>
<issue
id="UseTomlInstead"
message="Use version catalog instead"
errorLine1=" implementation(&quot;com.journeyapps:zxing-android-embedded:4.3.0&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="68"
column="20"/>
</issue>
<issue
id="UseTomlInstead"
message="Use version catalog instead"
errorLine1=" implementation(&quot;androidx.camera:camera-camera2:1.3.0&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="71"
column="20"/>
</issue>
<issue
id="UseTomlInstead"
message="Use version catalog instead"
errorLine1=" implementation(&quot;androidx.camera:camera-lifecycle:1.3.0&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="72"
column="20"/>
</issue>
<issue
id="UseTomlInstead"
message="Use version catalog instead"
errorLine1=" implementation(&quot;androidx.camera:camera-view:1.3.0&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="73"
column="20"/>
</issue>
<issue
id="UseTomlInstead"
message="Use version catalog instead"
errorLine1=" implementation(&quot;com.google.accompanist:accompanist-permissions:0.31.5-beta&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="76"
column="20"/>
</issue>
<issue
id="UseTomlInstead"
message="Use version catalog instead"
errorLine1=" implementation(&quot;androidx.navigation:navigation-compose:2.7.0&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="79"
column="20"/>
</issue>
<issue
id="UseTomlInstead"
message="Use version catalog instead"
errorLine1=" implementation(&quot;androidx.datastore:datastore-preferences:1.0.0&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="82"
column="20"/>
</issue>
<issue
id="UseTomlInstead"
message="Use version catalog instead"
errorLine1=" implementation(&quot;androidx.compose.material:material-icons-extended&quot;)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="build.gradle.kts"
line="85"
column="20"/>
</issue>
</issues>

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

@ -0,0 +1,24 @@
package com.example.myapplication
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.example.myapplication", appContext.packageName)
}
}

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- 摄像头权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 存储权限(用于相册选择) -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication"
android:usesCleartextTraffic="true"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.MyApplication">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

@ -0,0 +1,209 @@
package com.example.myapplication
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.navArgument
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.QrCodeScanner
import androidx.compose.material.icons.filled.QrCode
import androidx.compose.material.icons.filled.Receipt
import androidx.compose.material.icons.filled.AccountBalance
import com.example.myapplication.data.local.UserPreferences
import com.example.myapplication.data.api.RetrofitClient
import com.example.myapplication.ui.screens.auth.LoginScreen
import com.example.myapplication.ui.screens.auth.RegisterScreen
import com.example.myapplication.ui.screens.home.HomeScreen
import com.example.myapplication.ui.screens.payment.PaymentScreen
import com.example.myapplication.ui.screens.payment.PaymentSuccessScreen
import com.example.myapplication.ui.screens.collection.CollectionScreen
import com.example.myapplication.ui.screens.travel.TravelScreen
import com.example.myapplication.ui.screens.assistant.AssistantScreen
import com.example.myapplication.ui.screens.assets.AssetsScreen
import com.example.myapplication.ui.screens.bills.BillsScreen
import com.example.myapplication.ui.theme.MyApplicationTheme
import kotlinx.coroutines.delay
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyApplicationTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
AppNavigation()
}
}
}
}
}
@Composable
fun AppNavigation() {
val navController = rememberNavController()
val context = LocalContext.current
val userPreferences = remember { UserPreferences(context) }
LaunchedEffect(Unit) {
RetrofitClient.setUserPreferences(userPreferences)
}
var userState by remember { mutableStateOf<UserPreferences.UserState?>(null) }
var lastKnownBalance by remember { mutableStateOf<Double?>(null) }
var incomingAmount by remember { mutableStateOf(0.0) }
var showIncomingDialog by remember { mutableStateOf(false) }
LaunchedEffect(Unit) {
userPreferences.userFlow.collect { state ->
userState = state
if (!state.isLoggedIn || state.userId <= 0) {
lastKnownBalance = null
showIncomingDialog = false
} else if (lastKnownBalance == null) {
lastKnownBalance = state.balance
}
}
}
LaunchedEffect(userState?.userId) {
val uid = userState?.userId ?: 0
if (uid <= 0) return@LaunchedEffect
while (true) {
try {
val res = RetrofitClient.apiService.getBalance(uid)
if (res.isSuccessful && res.body() != null) {
val newBalance = res.body()!!.balance
val oldBalance = lastKnownBalance
if (oldBalance != null && newBalance - oldBalance > 0.0001) {
incomingAmount = newBalance - oldBalance
showIncomingDialog = true
}
lastKnownBalance = newBalance
userPreferences.updateBalance(newBalance)
}
} catch (_: Exception) {}
delay(5000)
}
}
androidx.compose.material3.Scaffold(
bottomBar = {
val backStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = backStackEntry?.destination?.route ?: ""
val showBottomBar = currentRoute.startsWith("home") ||
currentRoute.startsWith("payment") ||
currentRoute.startsWith("collection") ||
currentRoute.startsWith("bills") ||
currentRoute.startsWith("assets")
if (showBottomBar) {
val items = listOf(
Triple("home", "首页", Icons.Filled.Home),
Triple("payment", "扫一扫", Icons.Filled.QrCodeScanner),
Triple("collection", "收款码", Icons.Filled.QrCode),
Triple("bills", "账单", Icons.Filled.Receipt),
Triple("assets", "资产", Icons.Filled.AccountBalance)
)
NavigationBar {
items.forEach { (route, label, icon) ->
NavigationBarItem(
selected = currentRoute.startsWith(route),
onClick = {
if (!currentRoute.startsWith(route)) {
navController.navigate(route) {
launchSingleTop = true
}
}
},
icon = { Icon(icon, contentDescription = label) },
label = { Text(label) }
)
}
}
}
}
) { innerPadding ->
NavHost(
navController = navController,
startDestination = "login",
modifier = Modifier.fillMaxSize().padding(innerPadding)
) {
composable("login") {
LoginScreen(navController = navController, userPreferences = userPreferences)
}
composable("register") {
RegisterScreen(navController = navController, userPreferences = userPreferences)
}
composable("home") {
HomeScreen(navController = navController, userPreferences = userPreferences)
}
composable("payment") {
PaymentScreen(navController = navController, userPreferences = userPreferences)
}
composable(
route = "payment_success?to={to}&amount={amount}",
arguments = listOf(
navArgument("to") { defaultValue = "" },
navArgument("amount") { defaultValue = "" }
)
) {
PaymentSuccessScreen(navController = navController)
}
composable("collection") {
CollectionScreen(navController = navController, userPreferences = userPreferences)
}
composable("travel") {
TravelScreen(navController = navController, userPreferences = userPreferences)
}
composable("assistant") {
AssistantScreen(navController = navController, userPreferences = userPreferences)
}
composable("assets") {
AssetsScreen(navController = navController, userPreferences = userPreferences)
}
composable("bills") {
BillsScreen(navController = navController, userPreferences = userPreferences)
}
}
}
if (showIncomingDialog) {
AlertDialog(
onDismissRequest = { showIncomingDialog = false },
confirmButton = {
TextButton(onClick = { showIncomingDialog = false }) { Text("确认") }
},
text = { Text("收款成功,已入账¥" + String.format("%.2f", incomingAmount)) }
)
}
}

@ -0,0 +1,90 @@
package com.example.myapplication.data.api
import com.example.myapplication.data.model.*
import retrofit2.Response
import retrofit2.http.*
interface ApiService {
@POST("/api/fintech/auth/register")
suspend fun register(@Body request: RegisterRequest): Response<AuthResponse>
@POST("/api/fintech/auth/login")
suspend fun login(@Body request: LoginRequest): Response<AuthResponse>
@POST("/api/pay/execute")
suspend fun executePayment(@Body request: PaymentRequest): Response<PaymentExecuteResult>
@POST("/api/fintech/auth/pay-password/set")
suspend fun setPayPassword(@Body request: SetPayPasswordRequest): Response<ApiResponse<String>>
@POST("/api/collect/create")
suspend fun createCollection(@Body request: CollectionRequest): Response<CollectionResponse>
@POST("/api/collect/refresh/{id}")
suspend fun refreshCollection(@Path("id") id: String): Response<CollectionResponse>
@POST("/api/travel/open")
suspend fun openTravel(@Body request: TravelOpenRequest): Response<ApiResponse<String>>
@POST("/api/travel/entry")
suspend fun travelEntry(@Body request: TravelEntryRequest): Response<TravelRecord>
@POST("/api/travel/exit/{recordId}")
suspend fun travelExit(
@Path("recordId") recordId: String,
@Query("exitStation") exitStation: String
): Response<ApiResponse<String>>
@GET("/api/travel/records/{username}")
suspend fun getTravelRecords(@Path("username") username: String): Response<List<TravelRecord>>
@GET("/api/assistant/welcome")
suspend fun getWelcomeMessage(): Response<ApiResponse<String>>
@FormUrlEncoded
@POST("/api/assistant/chat")
suspend fun chatWithAssistant(
@Field("username") username: String,
@Field("content") content: String
): Response<AssistantChatResult>
@GET("/api/assistant/analysis/monthly")
suspend fun getMonthlyAnalysis(@Query("username") username: String): Response<ConsumptionAnalysis>
@GET("/api/assistant/analysis/alerts")
suspend fun getExpenseAlerts(@Query("username") username: String): Response<List<String>>
@GET("/api/fintech/assets/balance/{userId}")
suspend fun getBalance(@Path("userId") userId: Int): Response<BalanceResponse>
@POST("/api/fintech/assets/cards")
suspend fun addBankCard(@Body request: AddCardRequest): Response<ApiResponse<String>>
@GET("/api/fintech/assets/cards/{userId}")
suspend fun getBankCards(@Path("userId") userId: Int): Response<List<BankCard>>
@POST("/api/fintech/assets/transfer")
suspend fun transfer(@Body request: TransferRequest): Response<ApiResponse<String>>
@GET("/api/fintech/bills/{userId}")
suspend fun getBills(@Path("userId") userId: Int): Response<List<Bill>>
@GET("/api/fintech/bills/{userId}/type/{type}")
suspend fun getBillsByType(
@Path("userId") userId: Int,
@Path("type") type: String
): Response<List<Bill>>
@GET("/api/fintech/bills/{userId}/overview")
suspend fun getBillOverview(@Path("userId") userId: Int): Response<BillOverview>
@POST("/api/fintech/bills/create")
suspend fun createBill(@Body request: CreateBillRequest): Response<ApiResponse<String>>
@POST("/api/fintech/bills/{id}/remark")
suspend fun updateBillRemark(
@Path("id") id: Int,
@Body request: UpdateBillRemarkRequest
): Response<ApiResponse<String>>
}

@ -0,0 +1,51 @@
package com.example.myapplication.data.api
import com.example.myapplication.BuildConfig
import com.example.myapplication.data.local.UserPreferences
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
object RetrofitClient {
private var userPreferences: UserPreferences? = null
fun setUserPreferences(preferences: UserPreferences) {
this.userPreferences = preferences
}
private val authInterceptor = Interceptor { chain ->
val originalRequest = chain.request()
val token = userPreferences?.getToken()
val requestBuilder = originalRequest.newBuilder()
if (!token.isNullOrBlank()) {
requestBuilder.header("Authorization", "Bearer $token")
}
val request = requestBuilder.build()
chain.proceed(request)
}
private val loggingInterceptor = HttpLoggingInterceptor().apply {
level = if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE
}
private val okHttpClient = OkHttpClient.Builder()
.addInterceptor(authInterceptor)
.addInterceptor(loggingInterceptor)
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.build()
private val retrofit = Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
val apiService: ApiService by lazy {
retrofit.create(ApiService::class.java)
}
}

@ -0,0 +1,171 @@
package com.example.myapplication.data.local
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.doublePreferencesKey
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.intPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.runBlocking
class UserPreferences(private val context: Context) {
companion object {
private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "user_preferences")
private val USER_ID_KEY = intPreferencesKey("user_id")
private val USERNAME_KEY = stringPreferencesKey("username")
private val TOKEN_KEY = stringPreferencesKey("token")
private val BALANCE_KEY = doublePreferencesKey("balance")
private val IS_LOGGED_IN_KEY = booleanPreferencesKey("is_logged_in")
private val TRAVEL_PASS_OPENED_KEY = booleanPreferencesKey("travel_pass_opened")
private val TRAVEL_CITY_KEY = stringPreferencesKey("travel_city")
private val TRAVEL_LINE_KEY = stringPreferencesKey("travel_line")
private val AUDIT_STATUS_KEY = stringPreferencesKey("audit_status")
private val REJECT_REASON_KEY = stringPreferencesKey("reject_reason")
}
val userFlow: Flow<UserState> = context.dataStore.data.map { preferences ->
UserState(
userId = preferences[USER_ID_KEY] ?: 0,
username = preferences[USERNAME_KEY] ?: "",
token = preferences[TOKEN_KEY] ?: "",
balance = preferences[BALANCE_KEY] ?: 0.0,
isLoggedIn = preferences[IS_LOGGED_IN_KEY] ?: false
)
}
suspend fun saveUserInfo(
userId: Int,
username: String,
token: String,
balance: Double
) {
context.dataStore.edit { preferences ->
preferences[USER_ID_KEY] = userId
preferences[USERNAME_KEY] = username
preferences[TOKEN_KEY] = token
preferences[BALANCE_KEY] = balance
preferences[IS_LOGGED_IN_KEY] = true
}
}
suspend fun updateBalance(balance: Double) {
context.dataStore.edit { preferences ->
preferences[BALANCE_KEY] = balance
}
}
suspend fun logout() {
context.dataStore.edit { preferences ->
preferences.remove(USER_ID_KEY)
preferences.remove(USERNAME_KEY)
preferences.remove(TOKEN_KEY)
preferences.remove(BALANCE_KEY)
preferences[IS_LOGGED_IN_KEY] = false
preferences[TRAVEL_PASS_OPENED_KEY] = false
preferences.remove(AUDIT_STATUS_KEY)
preferences.remove(REJECT_REASON_KEY)
}
}
fun getToken(): String? {
return try {
runBlocking {
val preferences = context.dataStore.data.first()
preferences[TOKEN_KEY]
}
} catch (_: Exception) {
null
}
}
suspend fun setTravelPassOpened(opened: Boolean) {
context.dataStore.edit { preferences ->
preferences[TRAVEL_PASS_OPENED_KEY] = opened
}
}
fun getTravelPassOpened(): Boolean {
return try {
runBlocking {
val preferences = context.dataStore.data.first()
preferences[TRAVEL_PASS_OPENED_KEY] ?: false
}
} catch (_: Exception) {
false
}
}
suspend fun setTravelCityLine(city: String?, line: String?) {
context.dataStore.edit { preferences ->
if (city.isNullOrBlank()) preferences.remove(TRAVEL_CITY_KEY) else preferences[TRAVEL_CITY_KEY] = city
if (line.isNullOrBlank()) preferences.remove(TRAVEL_LINE_KEY) else preferences[TRAVEL_LINE_KEY] = line
}
}
fun getTravelCity(): String? {
return try {
runBlocking {
val preferences = context.dataStore.data.first()
preferences[TRAVEL_CITY_KEY]
}
} catch (_: Exception) {
null
}
}
fun getTravelLine(): String? {
return try {
runBlocking {
val preferences = context.dataStore.data.first()
preferences[TRAVEL_LINE_KEY]
}
} catch (_: Exception) {
null
}
}
suspend fun setAuditStatus(status: String?, reason: String?) {
context.dataStore.edit { preferences ->
if (status == null) preferences.remove(AUDIT_STATUS_KEY) else preferences[AUDIT_STATUS_KEY] = status
if (reason == null) preferences.remove(REJECT_REASON_KEY) else preferences[REJECT_REASON_KEY] = reason
}
}
fun getAuditStatus(): String? {
return try {
runBlocking {
val preferences = context.dataStore.data.first()
preferences[AUDIT_STATUS_KEY]
}
} catch (_: Exception) {
null
}
}
fun getRejectReason(): String? {
return try {
runBlocking {
val preferences = context.dataStore.data.first()
preferences[REJECT_REASON_KEY]
}
} catch (_: Exception) {
null
}
}
data class UserState(
val userId: Int,
val username: String,
val token: String,
val balance: Double,
val isLoggedIn: Boolean
)
}

@ -0,0 +1,180 @@
package com.example.myapplication.data.model
import com.google.gson.annotations.SerializedName
data class LoginRequest(
val username: String,
val password: String
)
data class RegisterRequest(
val username: String,
val password: String,
val phone: String,
val realName: String? = null,
val idCardNumber: String? = null
)
data class AuthResponse(
val message: String,
val token: String,
val userId: Int,
val username: String,
val balance: Double
)
data class PaymentRequest(
val fromUser: String,
val toMerchant: String,
val amount: String,
val method: String,
val paySource: String,
val payCardId: Int? = null,
val receiveSource: String? = null,
val receiveCardId: Int? = null,
val payPassword: String? = null
)
data class SetPayPasswordRequest(
val userId: Int,
val newPassword: String,
val oldPassword: String? = null
)
data class PaymentResponse(
val message: String,
val success: Boolean
)
data class PaymentExecuteResult(
val id: Int,
val fromUser: String,
val toMerchant: String,
val amount: Double,
val paymentMethod: String,
val status: String,
val createdAt: String
)
data class CollectionRequest(
val merchantId: String,
val validSeconds: String
)
data class CollectionResponse(
val id: Long,
val qrBase64: String,
val expireAt: String
)
data class TravelOpenRequest(
val username: String,
val city: String,
val line: String,
val payment: String
)
data class TravelEntryRequest(
val qrCode: String
)
data class TravelRecord(
val id: String,
val entryStation: String,
val exitStation: String?,
val entryTime: String,
val exitTime: String?,
@SerializedName("fare") val fee: Double,
val status: String
)
data class AssistantChatRequest(
val username: String,
val content: String
)
data class AssistantMessage(
val id: String,
val content: String,
val isUser: Boolean,
val timestamp: String
)
data class AssistantChatResult(
val id: Int,
val username: String,
val userContent: String,
val botReply: String,
val createdAt: String
)
data class ConsumptionAnalysis(
val totalExpense: Double,
val totalIncome: Double,
val balance: Double,
val categories: Map<String, Double>
)
data class BalanceResponse(
val balance: Double
)
data class BankCard(
val id: Int,
val bankName: String,
val cardNumber: String,
val isDefault: Boolean
)
data class AddCardRequest(
val userId: Int,
val bankName: String,
val cardNumber: String,
val isDefault: Boolean
)
data class TransferRequest(
val fromUserId: Int,
val toUserId: Int,
val amount: Double
)
data class Bill(
val id: Int,
val amount: Double,
val type: String,
val category: String,
val remark: String,
val time: String?
)
data class CreateBillRequest(
val userId: Int,
val amount: Double,
val type: String,
val category: String,
val remark: String
)
data class UpdateBillRemarkRequest(
val remark: String
)
data class BillOverview(
val totalIncome: Double,
val totalExpense: Double,
val balance: Double
)
data class UserInfo(
val userId: Int,
val username: String,
val balance: Double,
val token: String
)
data class ApiResponse<T>(
val success: Boolean,
val data: T? = null,
val message: String? = null,
val error: String? = null
)

@ -0,0 +1,582 @@
package com.example.myapplication.ui.screens.assets
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.CreditCard
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.example.myapplication.data.api.RetrofitClient
import com.example.myapplication.data.local.UserPreferences
import com.example.myapplication.data.model.AddCardRequest
import com.example.myapplication.data.model.BankCard
import com.example.myapplication.data.model.TransferRequest
import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AssetsScreen(
navController: NavController,
userPreferences: UserPreferences
) {
var userState by remember { mutableStateOf<UserPreferences.UserState?>(null) }
var bankCards by remember { mutableStateOf<List<BankCard>>(emptyList()) }
var isLoading by remember { mutableStateOf(false) }
var errorMessage by remember { mutableStateOf<String?>(null) }
var showAddCardDialog by remember { mutableStateOf(false) }
var showTransferDialog by remember { mutableStateOf(false) }
var showSetPayPwdDialog by remember { mutableStateOf(false) }
var infoMessage by remember { mutableStateOf<String?>(null) }
val coroutineScope = rememberCoroutineScope()
LaunchedEffect(Unit) {
userPreferences.userFlow.collect { state ->
userState = state
}
}
fun getBankCards() {
if (userState?.userId == null) return
isLoading = true
errorMessage = null
coroutineScope.launch {
try {
val response = RetrofitClient.apiService.getBankCards(userState!!.userId)
if (response.isSuccessful && response.body() != null) {
bankCards = response.body()!!
} else {
errorMessage = "获取银行卡失败: ${response.message()}"
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
}
}
}
LaunchedEffect(userState) {
if (userState?.userId != null) {
getBankCards()
}
}
LaunchedEffect(userState?.userId) {
val uid = userState?.userId ?: 0
if (uid > 0) {
while (true) {
try {
val balanceRes = RetrofitClient.apiService.getBalance(uid)
if (balanceRes.isSuccessful && balanceRes.body() != null) {
userPreferences.updateBalance(balanceRes.body()!!.balance)
}
} catch (_: Exception) {}
kotlinx.coroutines.delay(30000)
}
}
}
fun addBankCard(bankName: String, cardNumber: String) {
if (userState?.userId == null) return
isLoading = true
errorMessage = null
coroutineScope.launch {
try {
val response = RetrofitClient.apiService.addBankCard(
AddCardRequest(
userId = userState!!.userId,
bankName = bankName,
cardNumber = cardNumber,
isDefault = bankCards.isEmpty()
)
)
if (response.isSuccessful && response.body()?.success == true) {
getBankCards()
} else {
errorMessage = response.body()?.message ?: "添加银行卡失败: ${response.message()}"
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
}
}
}
fun transfer(amount: Double, toUserId: Int) {
if (userState?.userId == null || amount <= 0) return
isLoading = true
errorMessage = null
coroutineScope.launch {
try {
val response = RetrofitClient.apiService.transfer(
TransferRequest(
fromUserId = userState!!.userId,
toUserId = toUserId,
amount = amount
)
)
if (response.isSuccessful && response.body()?.success == true) {
val balanceRes = RetrofitClient.apiService.getBalance(userState!!.userId)
if (balanceRes.isSuccessful && balanceRes.body() != null) {
userPreferences.updateBalance(balanceRes.body()!!.balance)
}
} else {
errorMessage = response.body()?.message ?: "转账失败: ${response.message()}"
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
}
}
}
fun refreshBalanceOnce() {
val uid = userState?.userId ?: return
isLoading = true
errorMessage = null
infoMessage = null
coroutineScope.launch {
try {
val balanceRes = RetrofitClient.apiService.getBalance(uid)
if (balanceRes.isSuccessful && balanceRes.body() != null) {
userPreferences.updateBalance(balanceRes.body()!!.balance)
infoMessage = "余额已刷新"
} else {
errorMessage = "刷新失败: ${balanceRes.message()}"
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
}
}
}
Scaffold(
topBar = {
CenterAlignedTopAppBar(
title = { Text("总资产") },
navigationIcon = {
IconButton(onClick = { navController.popBackStack() }) {
Icon(Icons.Filled.ArrowBack, contentDescription = "返回")
}
},
actions = {
IconButton(onClick = { showAddCardDialog = true }) {
Icon(Icons.Filled.Add, contentDescription = "添加银行卡")
}
TextButton(
onClick = { showSetPayPwdDialog = true },
colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.onPrimary)
) { Text("设置支付密码") }
TextButton(
onClick = { refreshBalanceOnce() },
colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.onPrimary)
) { Text("刷新余额") }
},
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
containerColor = MaterialTheme.colorScheme.primary,
titleContentColor = MaterialTheme.colorScheme.onPrimary,
navigationIconContentColor = MaterialTheme.colorScheme.onPrimary,
actionIconContentColor = MaterialTheme.colorScheme.onPrimary
)
)
}
) { paddingValues ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
.verticalScroll(rememberScrollState())
) {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 4.dp),
shape = androidx.compose.foundation.shape.RoundedCornerShape(12.dp)
) {
Column(
modifier = Modifier.padding(24.dp)
) {
Text(
text = "账户余额",
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = "¥${userState?.balance ?: "0.00"}",
style = MaterialTheme.typography.headlineLarge,
fontWeight = FontWeight.Bold,
color = MaterialTheme.colorScheme.primary
)
Spacer(modifier = Modifier.height(16.dp))
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(12.dp)
) {
Button(
onClick = { showTransferDialog = true },
modifier = Modifier.weight(1f)
) {
Text("转入")
}
OutlinedButton(
onClick = { showTransferDialog = true },
modifier = Modifier.weight(1f)
) {
Text("转出")
}
OutlinedButton(
onClick = { refreshBalanceOnce() },
modifier = Modifier.weight(1f)
) {
Text("刷新余额")
}
}
if (infoMessage != null) {
Spacer(modifier = Modifier.height(8.dp))
Text(infoMessage!!, color = MaterialTheme.colorScheme.primary)
}
}
}
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 2.dp),
shape = androidx.compose.foundation.shape.RoundedCornerShape(12.dp)
) {
Column {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = "我的银行卡",
style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.Medium
)
Text(
text = "${bankCards.size}",
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
if (bankCards.isEmpty()) {
Box(
modifier = Modifier
.fillMaxWidth()
.height(100.dp),
contentAlignment = Alignment.Center
) {
Text(
text = "暂无银行卡",
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
} else {
Column {
bankCards.forEach { card ->
BankCardItem(card = card)
}
}
}
}
}
if (errorMessage != null) {
Spacer(modifier = Modifier.height(16.dp))
Text(
text = errorMessage!!,
color = MaterialTheme.colorScheme.error,
style = MaterialTheme.typography.bodySmall,
modifier = Modifier.padding(horizontal = 16.dp)
)
}
}
}
if (showAddCardDialog) {
AddCardDialog(
onDismiss = { showAddCardDialog = false },
onConfirm = { bankName, cardNumber ->
addBankCard(bankName, cardNumber)
showAddCardDialog = false
}
)
}
if (showTransferDialog) {
TransferDialog(
onDismiss = { showTransferDialog = false },
onConfirm = { amount, toUserId ->
transfer(amount, toUserId)
showTransferDialog = false
}
)
}
if (showSetPayPwdDialog) {
SetPayPasswordDialog(
onDismiss = { showSetPayPwdDialog = false },
onConfirm = { newPwd ->
if (userState?.userId == null) return@SetPayPasswordDialog
isLoading = true
errorMessage = null
infoMessage = null
coroutineScope.launch {
try {
val resp = RetrofitClient.apiService.setPayPassword(
com.example.myapplication.data.model.SetPayPasswordRequest(
userId = userState!!.userId,
newPassword = newPwd,
oldPassword = null
)
)
if (resp.isSuccessful && resp.body()?.success == true) {
infoMessage = resp.body()?.message ?: "支付密码设置成功"
} else {
errorMessage = resp.body()?.error ?: "设置失败: ${resp.message()}"
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
showSetPayPwdDialog = false
}
}
}
)
}
}
@Composable
fun BankCardItem(card: BankCard) {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 8.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 1.dp),
shape = androidx.compose.foundation.shape.RoundedCornerShape(12.dp)
) {
Row(
modifier = Modifier.padding(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
Icon(
imageVector = Icons.Filled.CreditCard,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = MaterialTheme.colorScheme.primary
)
Spacer(modifier = Modifier.width(16.dp))
Column(
modifier = Modifier.weight(1f)
) {
Text(
text = card.bankName,
style = MaterialTheme.typography.bodyMedium,
fontWeight = FontWeight.Medium
)
Spacer(modifier = Modifier.height(4.dp))
Text(
text = "**** **** **** ${card.cardNumber.takeLast(4)}",
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
if (card.isDefault) {
Badge {
Text("默认")
}
}
}
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AddCardDialog(
onDismiss: () -> Unit,
onConfirm: (String, String) -> Unit
) {
var bankName by remember { mutableStateOf("") }
var cardNumber by remember { mutableStateOf("") }
AlertDialog(
onDismissRequest = onDismiss,
title = { Text("添加银行卡") },
text = {
Column {
OutlinedTextField(
value = bankName,
onValueChange = { bankName = it },
label = { Text("银行名称") },
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
OutlinedTextField(
value = cardNumber,
onValueChange = { cardNumber = it },
label = { Text("卡号") },
modifier = Modifier.fillMaxWidth(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)
}
},
confirmButton = {
TextButton(
onClick = { onConfirm(bankName, cardNumber) },
enabled = bankName.isNotBlank() && cardNumber.isNotBlank()
) {
Text("确认")
}
},
dismissButton = {
TextButton(onClick = onDismiss) {
Text("取消")
}
}
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TransferDialog(
onDismiss: () -> Unit,
onConfirm: (Double, Int) -> Unit
) {
var amount by remember { mutableStateOf("") }
var toUserId by remember { mutableStateOf("") }
AlertDialog(
onDismissRequest = onDismiss,
title = { Text("转账") },
text = {
Column {
OutlinedTextField(
value = amount,
onValueChange = { amount = it },
label = { Text("金额") },
modifier = Modifier.fillMaxWidth(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal)
)
Spacer(modifier = Modifier.height(16.dp))
OutlinedTextField(
value = toUserId,
onValueChange = { toUserId = it },
label = { Text("收款用户ID") },
modifier = Modifier.fillMaxWidth(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)
}
},
confirmButton = {
TextButton(
onClick = {
onConfirm(amount.toDoubleOrNull() ?: 0.0, toUserId.toIntOrNull() ?: 0)
},
enabled = amount.isNotBlank() && toUserId.isNotBlank()
) {
Text("确认")
}
},
dismissButton = {
TextButton(onClick = onDismiss) {
Text("取消")
}
}
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SetPayPasswordDialog(
onDismiss: () -> Unit,
onConfirm: (String) -> Unit
) {
var newPwd by remember { mutableStateOf("") }
var confirmPwd by remember { mutableStateOf("") }
var error by remember { mutableStateOf<String?>(null) }
AlertDialog(
onDismissRequest = onDismiss,
title = { Text("设置支付密码") },
text = {
Column {
OutlinedTextField(
value = newPwd,
onValueChange = { newPwd = it; error = null },
label = { Text("新密码") },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
visualTransformation = androidx.compose.ui.text.input.PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password)
)
Spacer(modifier = Modifier.height(12.dp))
OutlinedTextField(
value = confirmPwd,
onValueChange = { confirmPwd = it; error = null },
label = { Text("确认新密码") },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
visualTransformation = androidx.compose.ui.text.input.PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password)
)
if (error != null) {
Spacer(modifier = Modifier.height(8.dp))
Text(error!!, color = MaterialTheme.colorScheme.error)
}
}
},
confirmButton = {
TextButton(
onClick = {
if (newPwd.length < 6) { error = "密码至少6位"; return@TextButton }
if (newPwd != confirmPwd) { error = "两次输入不一致"; return@TextButton }
onConfirm(newPwd)
},
enabled = newPwd.isNotBlank() && confirmPwd.isNotBlank()
) { Text("确认") }
},
dismissButton = { TextButton(onClick = onDismiss) { Text("取消") } }
)
}

@ -0,0 +1,227 @@
package com.example.myapplication.ui.screens.assistant
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Send
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.example.myapplication.BuildConfig
import com.example.myapplication.data.api.RetrofitClient
import com.example.myapplication.data.local.UserPreferences
import com.example.myapplication.data.model.AssistantChatRequest
import com.example.myapplication.data.model.AssistantMessage
import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AssistantScreen(
navController: NavController,
userPreferences: UserPreferences
) {
var userState by remember { mutableStateOf<UserPreferences.UserState?>(null) }
var messages by remember { mutableStateOf<List<AssistantMessage>>(emptyList()) }
var inputText by remember { mutableStateOf("") }
var isLoading by remember { mutableStateOf(false) }
var errorMessage by remember { mutableStateOf<String?>(null) }
val coroutineScope = rememberCoroutineScope()
// 监听用户状态变化
LaunchedEffect(Unit) {
userPreferences.userFlow.collect { state ->
userState = state
}
}
// 发送消息
fun sendMessage() {
if (inputText.isBlank() || userState?.username == null) return
val userMessage = AssistantMessage(
id = System.currentTimeMillis().toString(),
content = inputText,
isUser = true,
timestamp = System.currentTimeMillis().toString()
)
messages = messages + userMessage
val currentInput = inputText
inputText = ""
isLoading = true
errorMessage = null
coroutineScope.launch {
try {
val response = RetrofitClient.apiService.chatWithAssistant(
userState!!.username,
currentInput
)
if (response.isSuccessful && response.body() != null) {
val result = response.body()!!
val reply = result.botReply
val assistantMessage = AssistantMessage(
id = System.currentTimeMillis().toString(),
content = reply,
isUser = false,
timestamp = System.currentTimeMillis().toString()
)
messages = messages + assistantMessage
} else {
val code = response.code()
val errBody = try { response.errorBody()?.string() } catch (_: Exception) { null }
val composed = errBody ?: response.message()
errorMessage = if (BuildConfig.DEBUG) "请求失败(${code}): ${composed}" else "请求失败(${code})"
}
} catch (e: Exception) {
errorMessage = if (BuildConfig.DEBUG) "网络错误: ${e.message}" else "网络错误,请检查网络连接"
} finally {
isLoading = false
}
}
}
// 获取欢迎消息
LaunchedEffect(Unit) {
coroutineScope.launch {
try {
val response = RetrofitClient.apiService.getWelcomeMessage()
if (response.isSuccessful && response.body() != null) {
val welcomeResponse = response.body()!!
val welcomeMessage = AssistantMessage(
id = "welcome",
content = welcomeResponse.data ?: "您好!我是您的智能助手,有什么可以帮助您的吗?",
isUser = false,
timestamp = System.currentTimeMillis().toString()
)
messages = listOf(welcomeMessage)
}
} catch (e: Exception) {
// 忽略欢迎消息错误
}
}
}
Scaffold(
topBar = {
CenterAlignedTopAppBar(
title = { Text("智能助手") },
navigationIcon = {
IconButton(onClick = { navController.popBackStack() }) {
Icon(Icons.Filled.ArrowBack, contentDescription = "返回")
}
},
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
containerColor = MaterialTheme.colorScheme.primary,
titleContentColor = MaterialTheme.colorScheme.onPrimary,
navigationIconContentColor = MaterialTheme.colorScheme.onPrimary,
actionIconContentColor = MaterialTheme.colorScheme.onPrimary
)
)
}
) { paddingValues ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
) {
// 消息列表
LazyColumn(
modifier = Modifier
.weight(1f)
.padding(16.dp),
reverseLayout = true,
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
items(messages.reversed()) { message ->
MessageBubble(message = message)
}
}
// 错误消息
if (errorMessage != null) {
Text(
text = errorMessage!!,
color = MaterialTheme.colorScheme.error,
style = MaterialTheme.typography.bodySmall,
modifier = Modifier.padding(horizontal = 16.dp)
)
}
// 输入区域
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
OutlinedTextField(
value = inputText,
onValueChange = { inputText = it },
modifier = Modifier.weight(1f),
placeholder = { Text("输入您的问题...") },
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text),
enabled = !isLoading
)
Spacer(modifier = Modifier.width(8.dp))
IconButton(
onClick = { sendMessage() },
enabled = inputText.isNotBlank() && !isLoading
) {
if (isLoading) {
CircularProgressIndicator(
modifier = Modifier.size(20.dp),
strokeWidth = 2.dp
)
} else {
Icon(Icons.Filled.Send, contentDescription = "发送")
}
}
}
}
}
}
@Composable
fun MessageBubble(message: AssistantMessage) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = if (message.isUser) Arrangement.End else Arrangement.Start
) {
Card(
modifier = Modifier
.widthIn(max = 280.dp),
colors = CardDefaults.cardColors(
containerColor = if (message.isUser)
MaterialTheme.colorScheme.primary
else
MaterialTheme.colorScheme.surfaceVariant
)
) {
Column(
modifier = Modifier.padding(12.dp)
) {
Text(
text = message.content,
style = MaterialTheme.typography.bodyMedium,
color = if (message.isUser)
MaterialTheme.colorScheme.onPrimary
else
MaterialTheme.colorScheme.onSurface
)
}
}
}
}

@ -0,0 +1,207 @@
package com.example.myapplication.ui.screens.auth
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Visibility
import androidx.compose.material.icons.filled.VisibilityOff
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.example.myapplication.data.api.RetrofitClient
import com.example.myapplication.data.local.UserPreferences
import com.example.myapplication.data.model.LoginRequest
import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun LoginScreen(
navController: NavController,
userPreferences: UserPreferences
) {
var username by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }
var isLoading by remember { mutableStateOf(false) }
var errorMessage by remember { mutableStateOf<String?>(null) }
var passwordVisible by remember { mutableStateOf(false) }
var rejectedReason by remember { mutableStateOf<String?>(null) }
val coroutineScope = rememberCoroutineScope()
Column(
modifier = Modifier
.fillMaxSize()
.padding(32.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
// 标题
Text(
text = "移动支付平台",
style = MaterialTheme.typography.headlineLarge,
color = MaterialTheme.colorScheme.primary
)
Spacer(modifier = Modifier.height(16.dp))
Text(
text = "登录您的账户",
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
Spacer(modifier = Modifier.height(48.dp))
// 用户名输入框
OutlinedTextField(
value = username,
onValueChange = { username = it },
label = { Text("用户名") },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
)
Spacer(modifier = Modifier.height(16.dp))
// 密码输入框
OutlinedTextField(
value = password,
onValueChange = { password = it },
label = { Text("密码") },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
visualTransformation = if (passwordVisible) VisualTransformation.None else PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
trailingIcon = {
val image = if (passwordVisible) Icons.Filled.VisibilityOff else Icons.Filled.Visibility
IconButton(onClick = { passwordVisible = !passwordVisible }) {
Icon(imageVector = image, contentDescription = null)
}
}
)
// 错误消息
if (errorMessage != null) {
Spacer(modifier = Modifier.height(16.dp))
Text(
text = errorMessage!!,
color = MaterialTheme.colorScheme.error,
style = MaterialTheme.typography.bodySmall
)
}
Spacer(modifier = Modifier.height(32.dp))
// 登录按钮
Button(
onClick = {
if (username.isBlank() || password.isBlank()) {
errorMessage = "请输入用户名和密码"
return@Button
}
isLoading = true
errorMessage = null
coroutineScope.launch {
try {
val response = RetrofitClient.apiService.login(
LoginRequest(username, password)
)
if (response.isSuccessful && response.body() != null) {
val authResponse = response.body()!!
if (authResponse.token.isNotBlank()) {
userPreferences.saveUserInfo(
userId = authResponse.userId,
username = authResponse.username,
token = authResponse.token,
balance = authResponse.balance
)
RetrofitClient.setUserPreferences(userPreferences)
coroutineScope.launch { userPreferences.setAuditStatus("APPROVED", null) }
navController.navigate("home") {
popUpTo("login") { inclusive = true }
}
} else {
errorMessage = "登录失败服务器未返回token"
}
} else {
val code = response.code()
val body = try { response.errorBody()?.string() } catch (_: Exception) { null }
rejectedReason = null
val mapped = when {
code == 403 && body?.contains("PENDING_AUDIT", ignoreCase = true) == true -> "账户待审核,审核通过后方可登录"
code == 403 && body?.contains("INACTIVE", ignoreCase = true) == true -> "账户已禁用,请联系管理员"
code == 403 && body?.contains("REJECTED", ignoreCase = true) == true -> {
rejectedReason = body
"账户审核未通过"
}
else -> "登录失败: ${response.message()}"
}
errorMessage = mapped
val status = when {
mapped.startsWith("账户待审核") -> "PENDING_AUDIT"
mapped.startsWith("账户已禁用") -> "INACTIVE"
mapped == "账户审核未通过" -> "REJECTED"
else -> null
}
coroutineScope.launch { userPreferences.setAuditStatus(status, rejectedReason) }
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
}
}
},
modifier = Modifier
.fillMaxWidth()
.height(56.dp),
enabled = !isLoading
) {
if (isLoading) {
CircularProgressIndicator(
modifier = Modifier.size(20.dp),
color = MaterialTheme.colorScheme.onPrimary
)
} else {
Text("登录")
}
}
Spacer(modifier = Modifier.height(16.dp))
// 注册按钮
TextButton(
onClick = {
navController.navigate("register")
},
modifier = Modifier.fillMaxWidth()
) {
Text("没有账户?立即注册")
}
if (rejectedReason != null) {
Spacer(modifier = Modifier.height(8.dp))
Text(
text = rejectedReason!!,
color = MaterialTheme.colorScheme.error,
style = MaterialTheme.typography.bodySmall
)
Spacer(modifier = Modifier.height(8.dp))
TextButton(onClick = { navController.navigate("register") }, modifier = Modifier.fillMaxWidth()) {
Text("重新提交资料")
}
}
}
}

@ -0,0 +1,255 @@
package com.example.myapplication.ui.screens.auth
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Visibility
import androidx.compose.material.icons.filled.VisibilityOff
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.example.myapplication.data.api.RetrofitClient
import com.example.myapplication.data.local.UserPreferences
import com.example.myapplication.data.model.RegisterRequest
import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun RegisterScreen(
navController: NavController,
userPreferences: UserPreferences
) {
var username by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }
var confirmPassword by remember { mutableStateOf("") }
var phone by remember { mutableStateOf("") }
var realName by remember { mutableStateOf("") }
var idCardNumber by remember { mutableStateOf("") }
var isLoading by remember { mutableStateOf(false) }
var errorMessage by remember { mutableStateOf<String?>(null) }
var successMessage by remember { mutableStateOf<String?>(null) }
var passwordVisible by remember { mutableStateOf(false) }
var confirmPasswordVisible by remember { mutableStateOf(false) }
val coroutineScope = rememberCoroutineScope()
Scaffold(
topBar = {
CenterAlignedTopAppBar(
title = { Text("用户注册") },
navigationIcon = {
IconButton(onClick = { navController.popBackStack() }) {
Icon(Icons.Filled.ArrowBack, contentDescription = "返回")
}
}
)
}
) { paddingValues ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
.padding(32.dp)
.verticalScroll(rememberScrollState())
.imePadding(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
// 用户名输入框
OutlinedTextField(
value = username,
onValueChange = { username = it },
label = { Text("用户名") },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
)
Spacer(modifier = Modifier.height(16.dp))
// 手机号输入框
OutlinedTextField(
value = phone,
onValueChange = { phone = it },
label = { Text("手机号") },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Phone)
)
Spacer(modifier = Modifier.height(16.dp))
// 密码输入框
OutlinedTextField(
value = password,
onValueChange = { password = it },
label = { Text("密码") },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
visualTransformation = if (passwordVisible) VisualTransformation.None else PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
trailingIcon = {
val image = if (passwordVisible) Icons.Filled.VisibilityOff else Icons.Filled.Visibility
IconButton(onClick = { passwordVisible = !passwordVisible }) {
Icon(imageVector = image, contentDescription = null)
}
}
)
Spacer(modifier = Modifier.height(16.dp))
// 确认密码输入框
OutlinedTextField(
value = confirmPassword,
onValueChange = { confirmPassword = it },
label = { Text("确认密码") },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
visualTransformation = if (confirmPasswordVisible) VisualTransformation.None else PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
trailingIcon = {
val image = if (confirmPasswordVisible) Icons.Filled.VisibilityOff else Icons.Filled.Visibility
IconButton(onClick = { confirmPasswordVisible = !confirmPasswordVisible }) {
Icon(imageVector = image, contentDescription = null)
}
}
)
Spacer(modifier = Modifier.height(16.dp))
OutlinedTextField(
value = realName,
onValueChange = { realName = it },
label = { Text("真实姓名") },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
)
Spacer(modifier = Modifier.height(16.dp))
OutlinedTextField(
value = idCardNumber,
onValueChange = { idCardNumber = it },
label = { Text("身份证号码") },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text)
)
// 错误消息
if (errorMessage != null) {
Spacer(modifier = Modifier.height(16.dp))
Text(
text = errorMessage!!,
color = MaterialTheme.colorScheme.error,
style = MaterialTheme.typography.bodySmall
)
}
if (successMessage != null) {
Spacer(modifier = Modifier.height(16.dp))
Text(
text = successMessage!!,
color = MaterialTheme.colorScheme.primary,
style = MaterialTheme.typography.bodySmall
)
}
Spacer(modifier = Modifier.height(32.dp))
// 注册按钮
Button(
onClick = {
if (username.isBlank() || password.isBlank() || phone.isBlank()) {
errorMessage = "请填写所有必填项"
return@Button
}
if (password != confirmPassword) {
errorMessage = "两次输入的密码不一致"
return@Button
}
if (password.length < 6) {
errorMessage = "密码长度至少6位"
return@Button
}
if (phone.length != 11) {
errorMessage = "请输入正确的手机号"
return@Button
}
isLoading = true
errorMessage = null
coroutineScope.launch {
try {
val response = RetrofitClient.apiService.register(
RegisterRequest(
username = username,
password = password,
phone = phone,
realName = realName.ifBlank { null },
idCardNumber = idCardNumber.ifBlank { null }
)
)
if (response.isSuccessful && response.body() != null) {
successMessage = "已提交审核,审核通过后可登录。"
navController.navigate("login") {
popUpTo("register") { inclusive = true }
}
} else {
errorMessage = "注册失败: ${response.message()}"
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
}
}
},
modifier = Modifier
.fillMaxWidth()
.height(56.dp),
enabled = !isLoading
) {
if (isLoading) {
CircularProgressIndicator(
modifier = Modifier.size(20.dp),
color = MaterialTheme.colorScheme.onPrimary
)
} else {
Text("注册")
}
}
Spacer(modifier = Modifier.height(16.dp))
// 登录按钮
TextButton(
onClick = {
navController.popBackStack()
},
modifier = Modifier.fillMaxWidth()
) {
Text("已有账户?立即登录")
}
}
}
}

@ -0,0 +1,568 @@
package com.example.myapplication.ui.screens.bills
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.clickable
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.ArrowDownward
import androidx.compose.material.icons.filled.ArrowUpward
import androidx.compose.material.icons.filled.Search
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.example.myapplication.data.api.RetrofitClient
import com.example.myapplication.data.local.UserPreferences
import com.example.myapplication.data.model.Bill
import com.example.myapplication.data.model.BillOverview
import com.example.myapplication.data.model.UpdateBillRemarkRequest
import kotlinx.coroutines.launch
import androidx.compose.material3.ExposedDropdownMenuBox
import androidx.compose.material3.ExposedDropdownMenuDefaults
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.foundation.shape.RoundedCornerShape
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun BillsScreen(
navController: NavController,
userPreferences: UserPreferences
) {
var userState by remember { mutableStateOf<UserPreferences.UserState?>(null) }
var bills by remember { mutableStateOf<List<Bill>>(emptyList()) }
var billOverview by remember { mutableStateOf<BillOverview?>(null) }
var isLoading by remember { mutableStateOf(false) }
var errorMessage by remember { mutableStateOf<String?>(null) }
var searchText by remember { mutableStateOf("") }
var selectedType by remember { mutableStateOf<String?>(null) }
var selectedYear by remember { mutableStateOf<Int?>(null) }
var selectedMonth by remember { mutableStateOf<Int?>(null) }
var startDate by remember { mutableStateOf("") }
var endDate by remember { mutableStateOf("") }
var infoMessage by remember { mutableStateOf<String?>(null) }
var detailBill by remember { mutableStateOf<Bill?>(null) }
var remarkInput by remember { mutableStateOf("") }
var yearExpanded by remember { mutableStateOf(false) }
var monthExpanded by remember { mutableStateOf(false) }
val yearOptions = remember { (2018..2030).toList() }
val monthOptions = remember { (1..12).toList() }
val coroutineScope = rememberCoroutineScope()
// 监听用户状态变化
LaunchedEffect(Unit) {
userPreferences.userFlow.collect { state ->
userState = state
}
}
// 获取账单列表
fun getBills() {
if (userState?.userId == null) return
isLoading = true
errorMessage = null
coroutineScope.launch {
try {
val response = RetrofitClient.apiService.getBills(userState!!.userId)
if (response.isSuccessful && response.body() != null) {
bills = response.body()!!
} else {
errorMessage = "获取账单失败: ${response.message()}"
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
}
}
}
// 获取账单概览
fun getBillOverview() {
if (userState?.userId == null) return
coroutineScope.launch {
try {
val response = RetrofitClient.apiService.getBillOverview(userState!!.userId)
if (response.isSuccessful && response.body() != null) {
billOverview = response.body()!!
}
} catch (e: Exception) {
// 忽略概览错误
}
}
}
// 初始化时获取数据
LaunchedEffect(userState) {
if (userState?.userId != null) {
getBills()
getBillOverview()
}
}
fun parseYMD(s: String?): Triple<Int, Int, Int>? {
if (s.isNullOrBlank()) return null
val m = Regex("(\\d{4})-(\\d{2})-(\\d{2})").find(s) ?: return null
val y = m.groupValues[1].toInt()
val mo = m.groupValues[2].toInt()
val d = m.groupValues[3].toInt()
return Triple(y, mo, d)
}
val filteredBills = bills.filter { bill ->
val matchType = run {
if (selectedType == null) true else {
val t = bill.type.uppercase()
when (selectedType) {
"INCOME" -> t == "INCOME"
"EXPENDITURE" -> (t == "EXPENDITURE" || t == "EXPENSE")
else -> false
}
}
}
val matchText = (searchText.isBlank() || bill.remark.contains(searchText, ignoreCase = true))
val date = parseYMD(bill.time)
val matchYear = (selectedYear == null || (date != null && date.first == selectedYear))
val matchMonth = (selectedMonth == null || (date != null && date.second == selectedMonth))
val matchRange = run {
if (startDate.isBlank() && endDate.isBlank()) true else {
val s = parseYMD(startDate)
val e = parseYMD(endDate)
if (date == null || s == null || e == null) false else {
val v = date.first * 10000 + date.second * 100 + date.third
val vs = s.first * 10000 + s.second * 100 + s.third
val ve = e.first * 10000 + e.second * 100 + e.third
v in vs..ve
}
}
}
matchType && matchText && matchYear && matchMonth && matchRange
}
val totalIncome = filteredBills.filter { it.type.equals("INCOME", ignoreCase = true) }.sumOf { it.amount }
val totalExpense = filteredBills.filter { it.type.equals("EXPENDITURE", ignoreCase = true) || it.type.equals("EXPENSE", ignoreCase = true) }.sumOf { it.amount }
Scaffold(
topBar = {
CenterAlignedTopAppBar(
title = { Text("账单") },
navigationIcon = {
IconButton(onClick = { navController.popBackStack() }) {
Icon(Icons.Filled.ArrowBack, contentDescription = "返回")
}
},
actions = {
TextButton(
onClick = { getBills(); getBillOverview(); infoMessage = "账单已刷新" },
colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.onPrimary)
) { Text("刷新账单") }
},
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
containerColor = MaterialTheme.colorScheme.primary,
titleContentColor = MaterialTheme.colorScheme.onPrimary,
navigationIconContentColor = MaterialTheme.colorScheme.onPrimary,
actionIconContentColor = MaterialTheme.colorScheme.onPrimary
)
)
}
) { paddingValues ->
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
) {
item {
OutlinedTextField(
value = searchText,
onValueChange = { searchText = it },
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
placeholder = { Text("搜索账单...") },
leadingIcon = {
Icon(Icons.Filled.Search, contentDescription = "搜索")
},
singleLine = true,
shape = RoundedCornerShape(12.dp)
)
}
item {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)
) {
Row(
modifier = Modifier.padding(16.dp)
) {
Column(
modifier = Modifier.weight(1f),
horizontalAlignment = Alignment.CenterHorizontally
) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Icon(
Icons.Filled.ArrowUpward,
contentDescription = null,
tint = MaterialTheme.colorScheme.primary
)
Spacer(modifier = Modifier.width(4.dp))
Text(
text = "收入",
style = MaterialTheme.typography.bodySmall
)
}
Spacer(modifier = Modifier.height(4.dp))
Text(
text = "¥${String.format("%.2f", totalIncome)}",
style = MaterialTheme.typography.bodyMedium,
fontWeight = FontWeight.Medium,
color = MaterialTheme.colorScheme.primary
)
}
Column(
modifier = Modifier.weight(1f),
horizontalAlignment = Alignment.CenterHorizontally
) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Icon(
Icons.Filled.ArrowDownward,
contentDescription = null,
tint = MaterialTheme.colorScheme.error
)
Spacer(modifier = Modifier.width(4.dp))
Text(
text = "支出",
style = MaterialTheme.typography.bodySmall
)
}
Spacer(modifier = Modifier.height(4.dp))
Text(
text = "¥${String.format("%.2f", totalExpense)}",
style = MaterialTheme.typography.bodyMedium,
fontWeight = FontWeight.Medium,
color = MaterialTheme.colorScheme.error
)
}
Column(
modifier = Modifier.weight(1f),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "余额",
style = MaterialTheme.typography.bodySmall
)
Spacer(modifier = Modifier.height(4.dp))
Text(
text = "¥${String.format("%.2f", (userState?.balance ?: 0.0))}",
style = MaterialTheme.typography.bodyMedium,
fontWeight = FontWeight.Medium
)
}
}
}
}
item { Spacer(modifier = Modifier.height(16.dp)) }
item {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
ExposedDropdownMenuBox(expanded = yearExpanded, onExpandedChange = { yearExpanded = !yearExpanded }) {
OutlinedTextField(
value = selectedYear?.toString() ?: "",
onValueChange = {},
readOnly = true,
label = { Text("年份") },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = yearExpanded) },
modifier = Modifier.menuAnchor().weight(1f),
singleLine = true,
shape = RoundedCornerShape(12.dp)
)
ExposedDropdownMenu(expanded = yearExpanded, onDismissRequest = { yearExpanded = false }) {
yearOptions.forEach { y ->
DropdownMenuItem(text = { Text(y.toString()) }, onClick = { selectedYear = y; yearExpanded = false })
}
}
}
ExposedDropdownMenuBox(expanded = monthExpanded, onExpandedChange = { monthExpanded = !monthExpanded }) {
OutlinedTextField(
value = selectedMonth?.toString() ?: "",
onValueChange = {},
readOnly = true,
label = { Text("月份") },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = monthExpanded) },
modifier = Modifier.menuAnchor().weight(1f),
singleLine = true,
shape = RoundedCornerShape(12.dp)
)
ExposedDropdownMenu(expanded = monthExpanded, onDismissRequest = { monthExpanded = false }) {
monthOptions.forEach { m ->
DropdownMenuItem(text = { Text(m.toString()) }, onClick = { selectedMonth = m; monthExpanded = false })
}
}
}
}
}
item { Spacer(modifier = Modifier.height(8.dp)) }
item {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
OutlinedTextField(
value = startDate,
onValueChange = { startDate = it },
label = { Text("开始日期 yyyy-MM-dd") },
singleLine = true,
modifier = Modifier.weight(1f),
shape = RoundedCornerShape(12.dp)
)
OutlinedTextField(
value = endDate,
onValueChange = { endDate = it },
label = { Text("结束日期 yyyy-MM-dd") },
singleLine = true,
modifier = Modifier.weight(1f),
shape = RoundedCornerShape(12.dp)
)
TextButton(onClick = { selectedYear = null; selectedMonth = null; startDate = ""; endDate = "" }) { Text("清除筛选") }
}
}
item { Spacer(modifier = Modifier.height(16.dp)) }
item {
val incomeColor = MaterialTheme.colorScheme.primary
val expenseColor = MaterialTheme.colorScheme.error
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 4.dp),
shape = RoundedCornerShape(12.dp)
) {
Column(modifier = Modifier.padding(16.dp)) {
Text("收入/支出图表", style = MaterialTheme.typography.bodyMedium)
Spacer(modifier = Modifier.height(8.dp))
Canvas(modifier = Modifier
.fillMaxWidth()
.height(120.dp)) {
val w = size.width
val h = size.height
val maxVal = maxOf(totalIncome, totalExpense, 1.0)
val barWidth = w / 4f
val gap = w / 8f
val incomeHeight = (totalIncome / maxVal).toFloat() * (h - 16f)
val expenseHeight = (totalExpense / maxVal).toFloat() * (h - 16f)
drawRect(color = incomeColor, topLeft = androidx.compose.ui.geometry.Offset(gap, h - incomeHeight), size = androidx.compose.ui.geometry.Size(barWidth, incomeHeight))
drawRect(color = expenseColor, topLeft = androidx.compose.ui.geometry.Offset(gap * 3 + barWidth, h - expenseHeight), size = androidx.compose.ui.geometry.Size(barWidth, expenseHeight))
drawLine(color = Color.Gray, start = androidx.compose.ui.geometry.Offset(0f, h - 1f), end = androidx.compose.ui.geometry.Offset(w, h - 1f), strokeWidth = 2f)
}
Spacer(modifier = Modifier.height(4.dp))
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
Text("收入:¥${String.format("%.2f", totalIncome)}", color = incomeColor)
Text("支出:¥${String.format("%.2f", totalExpense)}", color = expenseColor)
}
}
}
}
item {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp)
.padding(top = 16.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp)
) {
FilterChip(
selected = selectedType == null,
onClick = { selectedType = null },
label = { Text("全部") }
)
FilterChip(
selected = selectedType == "EXPENDITURE",
onClick = { selectedType = if (selectedType == "EXPENDITURE") null else "EXPENDITURE" },
label = { Text("支出") }
)
FilterChip(
selected = selectedType == "INCOME",
onClick = { selectedType = if (selectedType == "INCOME") null else "INCOME" },
label = { Text("收入") }
)
}
}
item { Spacer(modifier = Modifier.height(16.dp)) }
if (filteredBills.isEmpty()) {
item {
Box(
modifier = Modifier
.fillMaxWidth()
.height(300.dp),
contentAlignment = Alignment.Center
) {
Text(
text = if (bills.isEmpty()) "暂无账单记录" else "未找到符合条件的账单",
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
}
} else {
items(filteredBills) { bill ->
Box(modifier = Modifier.padding(horizontal = 16.dp, vertical = 4.dp)) {
BillItem(bill = bill, onClick = {
detailBill = bill
remarkInput = bill.remark
})
}
}
}
if (errorMessage != null) {
item {
Spacer(modifier = Modifier.height(16.dp))
Text(
text = errorMessage!!,
color = MaterialTheme.colorScheme.error,
style = MaterialTheme.typography.bodySmall,
modifier = Modifier.padding(horizontal = 16.dp)
)
}
}
if (infoMessage != null) {
item {
Spacer(modifier = Modifier.height(8.dp))
Text(
text = infoMessage!!,
color = MaterialTheme.colorScheme.primary,
style = MaterialTheme.typography.bodySmall,
modifier = Modifier.padding(horizontal = 16.dp)
)
}
}
item { Spacer(modifier = Modifier.height(16.dp)) }
}
}
if (detailBill != null) {
AlertDialog(
onDismissRequest = { detailBill = null },
confirmButton = {
TextButton(onClick = {
val b = detailBill!!
coroutineScope.launch {
try {
val resp = RetrofitClient.apiService.updateBillRemark(b.id, UpdateBillRemarkRequest(remarkInput))
if (resp.isSuccessful && resp.body()?.success == true) {
bills = bills.map { if (it.id == b.id) it.copy(remark = remarkInput) else it }
infoMessage = "备注已更新"
detailBill = null
} else {
errorMessage = "更新失败: ${resp.message()}"
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
}
}
}) { Text("保存") }
},
dismissButton = { TextButton(onClick = { detailBill = null }) { Text("关闭") } },
text = {
Column {
Text("账单详情", style = MaterialTheme.typography.titleMedium)
Spacer(modifier = Modifier.height(8.dp))
Text("类型:${detailBill!!.type}")
Text("分类:${detailBill!!.category}")
Text("金额:¥${String.format("%.2f", detailBill!!.amount)}")
Text("时间:${detailBill!!.time ?: "-"}")
Spacer(modifier = Modifier.height(8.dp))
OutlinedTextField(
value = remarkInput,
onValueChange = { remarkInput = it },
label = { Text("备注") },
singleLine = true,
modifier = Modifier.fillMaxWidth()
)
}
}
)
}
}
@Composable
fun BillItem(bill: Bill, onClick: () -> Unit) {
Card(
elevation = CardDefaults.cardElevation(defaultElevation = 2.dp),
shape = RoundedCornerShape(12.dp)
) {
Row(
modifier = Modifier
.fillMaxWidth()
.clickable { onClick() }
.padding(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
Icon(
imageVector = if (bill.type.equals("INCOME", ignoreCase = true)) Icons.Filled.ArrowUpward else Icons.Filled.ArrowDownward,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = if (bill.type.equals("INCOME", ignoreCase = true)) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.error
)
Spacer(modifier = Modifier.width(16.dp))
Column(
modifier = Modifier.weight(1f)
) {
Text(
text = bill.remark,
style = MaterialTheme.typography.bodyMedium,
fontWeight = FontWeight.Medium
)
Spacer(modifier = Modifier.height(4.dp))
Text(
text = "${bill.category}${bill.time ?: "-"}",
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
Text(
text = "${if (bill.type.equals("INCOME", ignoreCase = true)) "+" else "-"}¥${bill.amount}",
style = MaterialTheme.typography.bodyMedium,
fontWeight = FontWeight.Medium,
color = if (bill.type.equals("INCOME", ignoreCase = true)) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.error
)
}
}
}

@ -0,0 +1,369 @@
package com.example.myapplication.ui.screens.collection
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.example.myapplication.data.api.RetrofitClient
import com.example.myapplication.data.local.UserPreferences
import com.example.myapplication.data.model.CollectionRequest
import com.example.myapplication.data.model.PaymentRequest
import com.example.myapplication.data.model.BankCard
import android.graphics.BitmapFactory
import android.util.Base64
import android.net.Uri
import androidx.compose.material3.TextButton
import androidx.compose.material3.RadioButton
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.ui.text.input.KeyboardType
import kotlinx.coroutines.launch
import kotlinx.coroutines.delay
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun CollectionScreen(
navController: NavController,
userPreferences: UserPreferences
) {
var userState by remember { mutableStateOf<UserPreferences.UserState?>(null) }
var qrCodeData by remember { mutableStateOf<String?>(null) }
var isLoading by remember { mutableStateOf(false) }
var errorMessage by remember { mutableStateOf<String?>(null) }
var bankCards by remember { mutableStateOf<List<BankCard>>(emptyList()) }
var showReceiveDialog by remember { mutableStateOf(false) }
var receiveAmount by remember { mutableStateOf("") }
var selectedReceiveSource by remember { mutableStateOf("balance") }
var selectedReceiveCardId by remember { mutableStateOf<Int?>(null) }
var infoMessage by remember { mutableStateOf<String?>(null) }
var showReceiveSuccessDialog by remember { mutableStateOf(false) }
var receiveSuccessAmount by remember { mutableStateOf(0.0) }
val coroutineScope = rememberCoroutineScope()
LaunchedEffect(Unit) {
userPreferences.userFlow.collect { state ->
userState = state
}
}
fun createCollectionCode() {
if (userState?.username == null) return
isLoading = true
errorMessage = null
coroutineScope.launch {
try {
val response = RetrofitClient.apiService.createCollection(
CollectionRequest(
merchantId = userState!!.username,
validSeconds = "120"
)
)
if (response.isSuccessful && response.body() != null) {
val collectionResponse = response.body()!!
qrCodeData = collectionResponse.qrBase64
} else {
errorMessage = "创建收款码失败: ${response.message()}"
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
}
}
}
LaunchedEffect(userState) {
if (userState?.username != null && qrCodeData == null) {
createCollectionCode()
}
}
LaunchedEffect(userState?.userId) {
val uid = userState?.userId ?: 0
if (uid > 0) {
try {
val resp = RetrofitClient.apiService.getBankCards(uid)
if (resp.isSuccessful && resp.body() != null) {
bankCards = resp.body()!!
}
} catch (_: Exception) {}
}
}
LaunchedEffect(userState?.userId) {
val uid = userState?.userId ?: 0
if (uid > 0) {
while (true) {
try {
val balanceRes = RetrofitClient.apiService.getBalance(uid)
if (balanceRes.isSuccessful && balanceRes.body() != null) {
userPreferences.updateBalance(balanceRes.body()!!.balance)
}
} catch (_: Exception) {}
delay(5000)
}
}
}
Scaffold(
topBar = {
CenterAlignedTopAppBar(
title = { Text("收款码") },
navigationIcon = {
IconButton(onClick = { navController.popBackStack() }) {
Icon(Icons.Filled.ArrowBack, contentDescription = "返回")
}
},
actions = {
IconButton(
onClick = { createCollectionCode() },
enabled = !isLoading
) {
if (isLoading) {
CircularProgressIndicator(
modifier = Modifier.size(18.dp),
color = MaterialTheme.colorScheme.onPrimary
)
} else {
Icon(Icons.Filled.Refresh, contentDescription = "刷新")
}
}
TextButton(
onClick = { showReceiveDialog = true },
colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.onPrimary)
) { Text("模拟收款") }
},
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
containerColor = MaterialTheme.colorScheme.primary,
titleContentColor = MaterialTheme.colorScheme.onPrimary,
navigationIconContentColor = MaterialTheme.colorScheme.onPrimary,
actionIconContentColor = MaterialTheme.colorScheme.onPrimary
)
)
}
) { paddingValues ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
.padding(32.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "我的收款码",
style = MaterialTheme.typography.headlineMedium
)
Spacer(modifier = Modifier.height(16.dp))
Text(
text = "向他人展示此二维码进行收款",
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
Spacer(modifier = Modifier.height(32.dp))
Card(
modifier = Modifier
.size(250.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 4.dp),
shape = androidx.compose.foundation.shape.RoundedCornerShape(12.dp)
) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
if (isLoading) {
CircularProgressIndicator()
} else if (qrCodeData != null) {
val bitmap = remember(qrCodeData) {
try {
val s = qrCodeData!!
val clean = if (s.contains(",")) s.split(",")[1] else s
val bytes = Base64.decode(clean, Base64.DEFAULT)
BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
} catch (e: Exception) {
null
}
}
if (bitmap != null) {
Image(
bitmap = bitmap.asImageBitmap(),
contentDescription = "收款码",
modifier = Modifier.fillMaxSize()
)
} else {
Text("图片解析失败", color = MaterialTheme.colorScheme.error)
}
} else {
Text(
text = "点击刷新生成收款码",
style = MaterialTheme.typography.bodyMedium
)
}
}
}
Spacer(modifier = Modifier.height(32.dp))
Card(
modifier = Modifier.fillMaxWidth(),
elevation = CardDefaults.cardElevation(defaultElevation = 2.dp),
shape = androidx.compose.foundation.shape.RoundedCornerShape(12.dp)
) {
Column(
modifier = Modifier.padding(16.dp)
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween
) {
Text("收款人", style = MaterialTheme.typography.bodyMedium)
Text(
userState?.username ?: "未知用户",
style = MaterialTheme.typography.bodyMedium,
fontWeight = androidx.compose.ui.text.font.FontWeight.Medium
)
}
Spacer(modifier = Modifier.height(8.dp))
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween
) {
Text("账户余额", style = MaterialTheme.typography.bodyMedium)
Text(
"¥${userState?.balance ?: "0.00"}",
style = MaterialTheme.typography.bodyMedium,
fontWeight = androidx.compose.ui.text.font.FontWeight.Medium,
color = MaterialTheme.colorScheme.primary
)
}
}
}
if (errorMessage != null) {
Spacer(modifier = Modifier.height(16.dp))
Text(
text = errorMessage!!,
color = MaterialTheme.colorScheme.error,
style = MaterialTheme.typography.bodySmall
)
}
if (infoMessage != null) {
Spacer(modifier = Modifier.height(8.dp))
Text(
text = infoMessage!!,
color = MaterialTheme.colorScheme.primary,
style = MaterialTheme.typography.bodySmall
)
}
}
if (showReceiveDialog) {
val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
ModalBottomSheet(
onDismissRequest = { showReceiveDialog = false },
sheetState = sheetState
) {
Column(modifier = Modifier.padding(16.dp)) {
OutlinedTextField(
value = receiveAmount,
onValueChange = { receiveAmount = it },
label = { Text("收款金额") },
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal),
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(12.dp))
Text("入账账户", style = MaterialTheme.typography.titleSmall)
Row(verticalAlignment = Alignment.CenterVertically) {
RadioButton(selected = selectedReceiveSource == "balance", onClick = { selectedReceiveSource = "balance"; selectedReceiveCardId = null })
Spacer(modifier = Modifier.width(8.dp))
Text("余额")
}
Row(verticalAlignment = Alignment.CenterVertically) {
RadioButton(selected = selectedReceiveSource == "card", onClick = { selectedReceiveSource = "card" })
Spacer(modifier = Modifier.width(8.dp))
Text("银行卡")
}
if (selectedReceiveSource == "card") {
Spacer(modifier = Modifier.height(8.dp))
bankCards.forEach { card ->
Row(verticalAlignment = Alignment.CenterVertically) {
RadioButton(selected = selectedReceiveCardId == card.id, onClick = { selectedReceiveCardId = card.id })
Spacer(modifier = Modifier.width(8.dp))
Text("${card.bankName} ${card.cardNumber}")
}
}
}
Spacer(modifier = Modifier.height(16.dp))
val amountValid = receiveAmount.toDoubleOrNull()?.let { it > 0.0 } == true
Button(
onClick = {
val amt = receiveAmount.toDoubleOrNull() ?: 0.0
if (userState?.userId == null || amt <= 0.0) return@Button
isLoading = true
errorMessage = null
showReceiveDialog = false
coroutineScope.launch {
try {
RetrofitClient.apiService.createBill(
com.example.myapplication.data.model.CreateBillRequest(
userId = userState!!.userId,
amount = amt,
type = "income",
category = "收款",
remark = if (selectedReceiveSource == "card") "收款码模拟收款(入账至银行卡)" else "收款码模拟收款(入账至余额)"
)
)
try {
val balResp = RetrofitClient.apiService.getBalance(userState!!.userId)
if (balResp.isSuccessful && balResp.body() != null) {
val newBal = balResp.body()!!.balance
userPreferences.updateBalance(newBal)
}
} catch (_: Exception) {}
infoMessage = "收款成功,已入账¥${String.format("%.2f", amt)}"
receiveSuccessAmount = amt
showReceiveSuccessDialog = true
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
receiveAmount = ""
}
}
},
enabled = amountValid,
modifier = Modifier.fillMaxWidth()
) { Text("确认收款") }
}
}
}
if (showReceiveSuccessDialog) {
AlertDialog(
onDismissRequest = { showReceiveSuccessDialog = false },
confirmButton = {
TextButton(onClick = { showReceiveSuccessDialog = false }) { Text("确认") }
},
text = { Text("收款成功,已入账¥${String.format("%.2f", receiveSuccessAmount)}") }
)
}
}
}

@ -0,0 +1,241 @@
package com.example.myapplication.ui.screens.home
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.example.myapplication.data.local.UserPreferences
import kotlinx.coroutines.launch
data class HomeMenuItem(
val title: String,
val icon: androidx.compose.ui.graphics.vector.ImageVector,
val route: String,
val description: String
)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun HomeScreen(
navController: NavController,
userPreferences: UserPreferences
) {
val coroutineScope = rememberCoroutineScope()
var userState by remember { mutableStateOf<UserPreferences.UserState?>(null) }
var homeCity by remember { mutableStateOf<String?>(null) }
var searchText by remember { mutableStateOf("") }
LaunchedEffect(Unit) {
userPreferences.userFlow.collect { state ->
userState = state
}
}
LaunchedEffect(Unit) {
homeCity = userPreferences.getTravelCity()
}
val menuItems = listOf(
HomeMenuItem(
title = "出行码",
icon = Icons.Filled.DirectionsSubway,
route = "travel",
description = "公共交通支付"
),
HomeMenuItem(
title = "智能助手",
icon = Icons.Filled.SmartToy,
route = "assistant",
description = "AI智能助手"
)
)
Scaffold(
topBar = {
CenterAlignedTopAppBar(
title = { Text("移动支付平台") },
actions = {
IconButton(onClick = { }) {
Icon(Icons.Filled.Add, contentDescription = "更多")
}
IconButton(onClick = {
coroutineScope.launch {
userPreferences.logout()
navController.navigate("login") {
popUpTo("home") { inclusive = true }
}
}
}) {
Icon(Icons.Filled.Logout, contentDescription = "退出登录")
}
},
navigationIcon = {
Row(verticalAlignment = Alignment.CenterVertically) {
Icon(Icons.Filled.LocationOn, contentDescription = null)
Spacer(modifier = Modifier.width(4.dp))
Text(homeCity ?: "城市", style = MaterialTheme.typography.bodyMedium)
}
},
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
containerColor = MaterialTheme.colorScheme.primary,
titleContentColor = MaterialTheme.colorScheme.onPrimary,
navigationIconContentColor = MaterialTheme.colorScheme.onPrimary,
actionIconContentColor = MaterialTheme.colorScheme.onPrimary
)
)
}
) { paddingValues ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
) {
OutlinedTextField(
value = searchText,
onValueChange = { searchText = it },
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
placeholder = { Text("搜索") },
leadingIcon = { Icon(Icons.Filled.Search, contentDescription = null) },
singleLine = true
)
val auditStatus = remember { mutableStateOf<String?>(null) }
val rejectReason = remember { mutableStateOf<String?>(null) }
LaunchedEffect(Unit) {
auditStatus.value = userPreferences.getAuditStatus()
rejectReason.value = userPreferences.getRejectReason()
}
if (auditStatus.value == "REJECTED") {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 8.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 4.dp),
colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.errorContainer)
) {
Column(modifier = Modifier.padding(16.dp)) {
Text(
text = "账户审核未通过",
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.onErrorContainer
)
if (!rejectReason.value.isNullOrBlank()) {
Spacer(modifier = Modifier.height(8.dp))
Text(
text = rejectReason.value!!,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onErrorContainer
)
}
Spacer(modifier = Modifier.height(8.dp))
TextButton(onClick = { navController.navigate("register") }) {
Text("重新提交资料")
}
}
}
}
Card(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)
) {
Column(
modifier = Modifier.padding(24.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "账户余额",
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = "¥${userState?.balance ?: "0.00"}",
style = MaterialTheme.typography.headlineLarge,
fontWeight = FontWeight.Bold,
color = MaterialTheme.colorScheme.primary
)
}
}
LazyVerticalGrid(
columns = GridCells.Fixed(2),
modifier = Modifier
.fillMaxSize()
.padding(horizontal = 16.dp),
verticalArrangement = Arrangement.spacedBy(16.dp),
horizontalArrangement = Arrangement.spacedBy(16.dp)
) {
items(menuItems) { item ->
Card(
onClick = { navController.navigate(item.route) },
modifier = Modifier
.height(120.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 2.dp),
colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface),
shape = androidx.compose.foundation.shape.RoundedCornerShape(12.dp)
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Icon(
imageVector = item.icon,
contentDescription = item.title,
modifier = Modifier.size(32.dp),
tint = MaterialTheme.colorScheme.primary
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = item.title,
style = MaterialTheme.typography.bodyMedium,
fontWeight = FontWeight.Medium
)
Spacer(modifier = Modifier.height(4.dp))
Text(
text = item.description,
style = MaterialTheme.typography.labelSmall,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
}
}
}
}
}
}
@Composable
private fun HomeQuickItem(title: String, icon: androidx.compose.ui.graphics.vector.ImageVector, onClick: () -> Unit) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Surface(
onClick = onClick,
shape = androidx.compose.foundation.shape.CircleShape,
tonalElevation = 2.dp,
color = MaterialTheme.colorScheme.surface
) {
Box(modifier = Modifier.size(64.dp), contentAlignment = Alignment.Center) {
Icon(icon, contentDescription = title, tint = MaterialTheme.colorScheme.primary, modifier = Modifier.size(32.dp))
}
}
Spacer(modifier = Modifier.height(8.dp))
Text(title, style = MaterialTheme.typography.bodySmall)
}
}

@ -0,0 +1,428 @@
package com.example.myapplication.ui.screens.payment
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.example.myapplication.BuildConfig
import com.example.myapplication.data.local.UserPreferences
import com.example.myapplication.data.api.RetrofitClient
import com.example.myapplication.data.model.PaymentRequest
import kotlinx.coroutines.launch
import com.journeyapps.barcodescanner.DecoratedBarcodeView
import androidx.compose.ui.viewinterop.AndroidView
import android.Manifest
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
import android.content.pm.PackageManager
import android.graphics.BitmapFactory
import com.google.zxing.BinaryBitmap
import com.google.zxing.MultiFormatReader
import com.google.zxing.common.HybridBinarizer
import com.google.zxing.RGBLuminanceSource
import android.net.Uri
import com.example.myapplication.data.model.BankCard
import androidx.compose.material3.AlertDialog
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.material3.TextButton
import androidx.compose.material3.RadioButton
import java.net.URLDecoder
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun PaymentScreen(
navController: NavController,
userPreferences: UserPreferences
) {
var userState by remember { mutableStateOf<UserPreferences.UserState?>(null) }
var isLoading by remember { mutableStateOf(false) }
var resultMessage by remember { mutableStateOf<String?>(null) }
var scannedContent by remember { mutableStateOf<String?>(null) }
var cameraGranted by remember { mutableStateOf(false) }
var bankCards by remember { mutableStateOf<List<BankCard>>(emptyList()) }
var showPayDialog by remember { mutableStateOf(false) }
var selectedPaySource by remember { mutableStateOf("balance") }
var selectedPayCardId by remember { mutableStateOf<Int?>(null) }
var payPassword by remember { mutableStateOf("") }
var payAmount by remember { mutableStateOf("1.00") }
var targetMerchant by remember { mutableStateOf<String?>(null) }
var receiveSource by remember { mutableStateOf<String?>(null) }
var receiveCardId by remember { mutableStateOf<Int?>(null) }
var lastHandledScan by remember { mutableStateOf<String?>(null) }
val coroutineScope = rememberCoroutineScope()
val context = LocalContext.current
LaunchedEffect(Unit) {
cameraGranted = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
}
val requestCameraPermissionLauncher = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
cameraGranted = granted
}
LaunchedEffect(Unit) {
userPreferences.userFlow.collect { state ->
userState = state
}
}
LaunchedEffect(userState?.userId) {
val uid = userState?.userId ?: 0
if (uid > 0) {
try {
val resp = RetrofitClient.apiService.getBankCards(uid)
if (resp.isSuccessful && resp.body() != null) {
bankCards = resp.body()!!
}
} catch (_: Exception) {}
}
}
fun parseMerchantId(raw: String): String? {
val text = raw.trim()
if (text.isBlank()) return null
fun decode(s: String): String = runCatching { URLDecoder.decode(s, "UTF-8") }.getOrDefault(s)
val patterns = listOf(
Regex("merchantId=([^&]+)", RegexOption.IGNORE_CASE),
Regex("toMerchant=([^&]+)", RegexOption.IGNORE_CASE),
Regex("\"merchantId\"\\s*:\\s*\"([^\"]+)\"", RegexOption.IGNORE_CASE),
Regex("\"toMerchant\"\\s*:\\s*\"([^\"]+)\"", RegexOption.IGNORE_CASE)
)
for (p in patterns) {
val m = p.find(text) ?: continue
val v = decode(m.groupValues[1]).trim()
if (v.isNotBlank()) return v
}
val plain = text.removePrefix("pay://").removePrefix("collect://").trim()
if (plain.isNotBlank() && !plain.contains(' ') && plain.length in 2..64) return plain
return null
}
fun parseReceiveInfo(raw: String): Pair<String?, Int?> {
val text = raw.trim()
if (text.isBlank()) return Pair(null, null)
fun decode(s: String): String = runCatching { URLDecoder.decode(s, "UTF-8") }.getOrDefault(s)
val srcMatch = Regex("receiveSource=([^&]+)", RegexOption.IGNORE_CASE).find(text)
val src = srcMatch?.groupValues?.getOrNull(1)?.let { decode(it).trim() }?.lowercase()
val normalizedSrc = when (src) {
"balance", "card" -> src
else -> null
}
val cardMatch = Regex("receiveCardId=(\\d+)", RegexOption.IGNORE_CASE).find(text)
val cardId = cardMatch?.groupValues?.getOrNull(1)?.toIntOrNull()
return Pair(normalizedSrc, cardId)
}
fun handleScannedText(text: String) {
if (showPayDialog) return
if (text == lastHandledScan) return
lastHandledScan = text
scannedContent = text
val merchant = parseMerchantId(text)
if (merchant.isNullOrBlank()) {
resultMessage = "无法识别该二维码内容"
return
}
if (merchant == userState?.username) {
resultMessage = "这是你自己的收款码"
return
}
val (src, cardId) = parseReceiveInfo(text)
receiveSource = src
receiveCardId = cardId
targetMerchant = merchant
payAmount = "1.00"
payPassword = ""
resultMessage = "已识别收款方: $merchant"
showPayDialog = true
}
val galleryLauncher = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri ->
if (uri != null) {
try {
val input = context.contentResolver.openInputStream(uri)
val bitmap = BitmapFactory.decodeStream(input)
input?.close()
if (bitmap != null) {
val width = bitmap.width
val height = bitmap.height
val pixels = IntArray(width * height)
bitmap.getPixels(pixels, 0, width, 0, 0, width, height)
val source = RGBLuminanceSource(width, height, pixels)
val binaryBitmap = BinaryBitmap(HybridBinarizer(source))
val reader = MultiFormatReader()
val result = reader.decode(binaryBitmap)
val text = result.text
if (!text.isNullOrBlank()) {
handleScannedText(text)
} else {
resultMessage = "图片无法解析"
}
} else {
resultMessage = "图片无法解析"
}
} catch (e: Exception) {
resultMessage = "识别失败: ${e.message}"
}
}
}
Scaffold(
topBar = {
CenterAlignedTopAppBar(
title = { Text("扫一扫") },
navigationIcon = {
IconButton(onClick = { navController.popBackStack() }) {
Icon(Icons.Filled.ArrowBack, contentDescription = "返回")
}
},
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
containerColor = MaterialTheme.colorScheme.primary,
titleContentColor = MaterialTheme.colorScheme.onPrimary,
navigationIconContentColor = MaterialTheme.colorScheme.onPrimary,
actionIconContentColor = MaterialTheme.colorScheme.onPrimary
)
)
}
) { paddingValues ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
.padding(32.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Text(
text = "扫一扫功能",
style = MaterialTheme.typography.headlineMedium
)
Spacer(modifier = Modifier.height(16.dp))
Text(
text = "摄像头扫码识别功能",
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
Spacer(modifier = Modifier.height(32.dp))
Card(
modifier = Modifier
.fillMaxWidth()
.height(260.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 4.dp),
shape = androidx.compose.foundation.shape.RoundedCornerShape(12.dp)
) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
if (cameraGranted) {
AndroidView(
modifier = Modifier.fillMaxSize(),
factory = { ctx ->
val view = DecoratedBarcodeView(ctx)
view.decodeContinuous { res ->
val text = res.text
if (!text.isNullOrBlank()) {
handleScannedText(text)
}
}
view
},
update = { v ->
if (showPayDialog) v.pause() else v.resume()
}
)
} else {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Text("需要摄像头权限以进行扫码")
Spacer(modifier = Modifier.height(8.dp))
Button(onClick = { requestCameraPermissionLauncher.launch(Manifest.permission.CAMERA) }) {
Text("授权摄像头")
}
}
}
}
}
Spacer(modifier = Modifier.height(32.dp))
Button(
onClick = {
if (userState?.username.isNullOrBlank()) return@Button
showPayDialog = true
},
modifier = Modifier.fillMaxWidth()
) {
if (isLoading) {
CircularProgressIndicator(modifier = Modifier.size(20.dp), color = MaterialTheme.colorScheme.onPrimary)
} else {
Text("模拟扫码支付")
}
}
Spacer(modifier = Modifier.height(16.dp))
OutlinedButton(
onClick = {
galleryLauncher.launch("image/*")
},
modifier = Modifier.fillMaxWidth()
) {
Text("从相册选择二维码")
}
if (scannedContent != null) {
Spacer(modifier = Modifier.height(8.dp))
Text("识别结果: ${scannedContent}")
}
if (resultMessage != null) {
Spacer(modifier = Modifier.height(16.dp))
Text(
text = resultMessage!!,
color = if (resultMessage!!.startsWith("支付成功")) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.error
)
}
if (showPayDialog) {
val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
ModalBottomSheet(
onDismissRequest = { showPayDialog = false },
sheetState = sheetState
) {
Column(modifier = Modifier.padding(16.dp)) {
Text(
"${targetMerchant ?: "收款方"} 支付",
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
Spacer(modifier = Modifier.height(4.dp))
OutlinedTextField(
value = payAmount,
onValueChange = { payAmount = it },
label = { Text("支付金额") },
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal),
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
Text("选择支付账户", style = MaterialTheme.typography.titleSmall)
Row(verticalAlignment = Alignment.CenterVertically) {
RadioButton(selected = selectedPaySource == "balance", onClick = { selectedPaySource = "balance"; selectedPayCardId = null })
Spacer(modifier = Modifier.width(8.dp))
Text("余额")
}
Row(verticalAlignment = Alignment.CenterVertically) {
RadioButton(selected = selectedPaySource == "card", onClick = { selectedPaySource = "card" })
Spacer(modifier = Modifier.width(8.dp))
Text("银行卡")
}
if (selectedPaySource == "card") {
Spacer(modifier = Modifier.height(8.dp))
bankCards.forEach { card ->
Row(verticalAlignment = Alignment.CenterVertically) {
RadioButton(selected = selectedPayCardId == card.id, onClick = { selectedPayCardId = card.id })
Spacer(modifier = Modifier.width(8.dp))
Text("${card.bankName} ${card.cardNumber}")
}
}
}
Spacer(modifier = Modifier.height(12.dp))
OutlinedTextField(
value = payPassword,
onValueChange = { payPassword = it },
label = { Text("支付密码") },
singleLine = true,
visualTransformation = PasswordVisualTransformation(),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
val amountValue = payAmount.toDoubleOrNull() ?: 0.0
Button(
onClick = {
val to = targetMerchant
if (userState?.username.isNullOrBlank() || payPassword.isBlank() || to.isNullOrBlank()) return@Button
val amt = payAmount.toDoubleOrNull()
if (amt == null || amt <= 0.0) return@Button
isLoading = true
resultMessage = null
showPayDialog = false
coroutineScope.launch {
try {
val response = RetrofitClient.apiService.executePayment(
PaymentRequest(
fromUser = userState!!.username,
toMerchant = to,
amount = String.format("%.2f", amt),
method = "qr",
paySource = selectedPaySource,
payCardId = selectedPayCardId,
receiveSource = receiveSource,
receiveCardId = receiveCardId,
payPassword = payPassword
)
)
if (response.isSuccessful && response.body() != null) {
val result = response.body()!!
if (result.status.equals("SUCCESS", ignoreCase = true)) {
try {
val balResp = RetrofitClient.apiService.getBalance(userState!!.userId)
if (balResp.isSuccessful && balResp.body() != null) {
val newBal = balResp.body()!!.balance
userPreferences.updateBalance(newBal)
}
} catch (_: Exception) {}
val to = result.toMerchant
val amtStr = String.format("%.2f", result.amount)
val route = "payment_success?to=${Uri.encode(to)}&amount=${Uri.encode(amtStr)}"
navController.navigate(route) {
popUpTo("payment") { inclusive = false }
}
} else {
resultMessage = "支付失败: ${result.status}"
}
} else {
val code = response.code()
val body = try { response.errorBody()?.string() } catch (_: Exception) { null }
resultMessage = if (BuildConfig.DEBUG) {
"支付失败(${code}): ${body ?: response.message()}"
} else {
"支付失败(${code})"
}
}
} catch (e: Exception) {
resultMessage = if (BuildConfig.DEBUG) "网络错误: ${e.message}" else "网络错误,请检查网络连接"
} finally {
isLoading = false
payPassword = ""
}
}
},
enabled = payPassword.isNotBlank() && targetMerchant != null && amountValue > 0.0,
modifier = Modifier.fillMaxWidth()
) { Text("确认支付") }
}
}
}
}
}
}

@ -0,0 +1,81 @@
package com.example.myapplication.ui.screens.payment
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import androidx.navigation.compose.currentBackStackEntryAsState
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun PaymentSuccessScreen(
navController: NavController
) {
val backStackEntry by navController.currentBackStackEntryAsState()
val to = backStackEntry?.arguments?.getString("to") ?: ""
val amount = backStackEntry?.arguments?.getString("amount") ?: ""
Scaffold(
topBar = {
CenterAlignedTopAppBar(
title = { Text("支付成功") },
navigationIcon = {
IconButton(onClick = { navController.popBackStack() }) {
Icon(Icons.Filled.ArrowBack, contentDescription = "返回")
}
},
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
containerColor = MaterialTheme.colorScheme.primary,
titleContentColor = MaterialTheme.colorScheme.onPrimary,
navigationIconContentColor = MaterialTheme.colorScheme.onPrimary,
actionIconContentColor = MaterialTheme.colorScheme.onPrimary
)
)
}
) { paddingValues ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
.padding(32.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "支付已完成",
style = MaterialTheme.typography.headlineMedium
)
Spacer(modifier = Modifier.height(24.dp))
Card(
modifier = Modifier.fillMaxWidth(),
elevation = CardDefaults.cardElevation(defaultElevation = 4.dp),
shape = androidx.compose.foundation.shape.RoundedCornerShape(12.dp)
) {
Column(modifier = Modifier.padding(16.dp)) {
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
Text("收款人", style = MaterialTheme.typography.bodyMedium)
Text(to, style = MaterialTheme.typography.bodyMedium)
}
Spacer(modifier = Modifier.height(12.dp))
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
Text("支付金额", style = MaterialTheme.typography.bodyMedium)
Text(amount, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.primary)
}
}
}
Spacer(modifier = Modifier.height(24.dp))
Button(onClick = { navController.navigate("home") { popUpTo("home") { inclusive = true } } }, modifier = Modifier.fillMaxWidth()) {
Text("返回首页")
}
}
}
}

@ -0,0 +1,752 @@
package com.example.myapplication.ui.screens.travel
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.CheckCircle
import androidx.compose.material.icons.filled.Pending
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.example.myapplication.data.api.RetrofitClient
import com.example.myapplication.data.local.UserPreferences
import com.example.myapplication.data.model.TravelOpenRequest
import com.example.myapplication.data.model.TravelRecord
import com.example.myapplication.data.model.BankCard
import com.example.myapplication.data.model.CreateBillRequest
import kotlinx.coroutines.launch
import kotlinx.coroutines.delay
import com.google.zxing.qrcode.QRCodeWriter
import com.google.zxing.BarcodeFormat
import android.graphics.Bitmap
import android.net.Uri
import androidx.compose.material3.TextButton
import androidx.compose.material3.RadioButton
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.ui.text.input.KeyboardType
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TravelScreen(
navController: NavController,
userPreferences: UserPreferences
) {
var userState by remember { mutableStateOf<UserPreferences.UserState?>(null) }
var travelRecords by remember { mutableStateOf<List<TravelRecord>>(emptyList()) }
var isLoading by remember { mutableStateOf(false) }
var errorMessage by remember { mutableStateOf<String?>(null) }
var hasTravelPass by remember { mutableStateOf(false) }
var dynamicCode by remember { mutableStateOf<String?>(null) }
var city by remember { mutableStateOf("") }
var line by remember { mutableStateOf("") }
var selectedPaySource by remember { mutableStateOf("balance") }
var selectedPayCardId by remember { mutableStateOf<Int?>(null) }
var bankCards by remember { mutableStateOf<List<BankCard>>(emptyList()) }
var infoMessage by remember { mutableStateOf<String?>(null) }
var showEntrySuccess by remember { mutableStateOf(false) }
var showExitSuccess by remember { mutableStateOf(false) }
var exitFee by remember { mutableStateOf(0.0) }
var lastEntryRecordId by remember { mutableStateOf<String?>(null) }
var cityExpanded by remember { mutableStateOf(false) }
var lineExpanded by remember { mutableStateOf(false) }
val cityOptions = remember { listOf("北京", "上海", "深圳", "广州", "杭州") }
val lineOptionsMap = remember {
mapOf(
"北京" to listOf("1号线", "2号线", "10号线"),
"上海" to listOf("1号线", "2号线", "11号线"),
"深圳" to listOf("1号线", "3号线", "5号线"),
"广州" to listOf("1号线", "2号线", "3号线"),
"杭州" to listOf("1号线", "2号线", "4号线")
)
}
var lineOptions by remember { mutableStateOf<List<String>>(emptyList()) }
val fixedCity = "北京"
val fixedLine = "1号线"
val fixedEntryStation = "复兴门"
val fixedExitStation = "天安门东"
fun computeFare(city: String, line: String, entry: String, exit: String): Double {
if (city != fixedCity || line != fixedLine) return 0.0
val stations = listOf(
"苹果园","古城","八角游乐园","八宝山","玉泉路","五棵松","万寿路","公主坟","军事博物馆","木樨地","复兴门","西单","天安门西","天安门东","王府井","东单","建国门","永安里","国贸","大望路","四惠","四惠东"
)
val ei = stations.indexOf(entry)
val xi = stations.indexOf(exit)
if (ei < 0 || xi < 0) return 0.0
val stops = kotlin.math.abs(ei - xi)
val base = 3.0
val step = 0.5
return base + stops * step
}
val coroutineScope = rememberCoroutineScope()
// 监听用户状态变化
LaunchedEffect(Unit) {
userPreferences.userFlow.collect { state ->
userState = state
}
}
// 获取出行记录
fun getTravelRecords() {
if (userState?.username == null) return
isLoading = true
errorMessage = null
coroutineScope.launch {
try {
val response = RetrofitClient.apiService.getTravelRecords(userState!!.username)
if (response.isSuccessful && response.body() != null) {
travelRecords = response.body()!!
} else {
errorMessage = "获取出行记录失败: ${response.message()}"
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
}
}
}
// 开通出行码
fun openTravelPass() {
if (userState?.username == null) return
if (city.isBlank() || line.isBlank()) {
errorMessage = "请先选择城市和交通线路"
return
}
isLoading = true
errorMessage = null
coroutineScope.launch {
try {
val response = RetrofitClient.apiService.openTravel(
TravelOpenRequest(
username = userState!!.username,
city = fixedCity,
line = fixedLine,
payment = if (selectedPaySource == "card") "card" else "balance"
)
)
if (response.isSuccessful && response.body() != null) {
userPreferences.setTravelPassOpened(true)
userPreferences.setTravelCityLine(fixedCity, fixedLine)
hasTravelPass = true
infoMessage = "出行码已开通(${fixedCity}·${fixedLine},支付方式:${if (selectedPaySource=="card") "银行卡" else "余额"}"
dynamicCode = "TRAVEL:${userState!!.username}:${fixedCity}:${fixedLine}:${fixedEntryStation}:${System.currentTimeMillis()}"
getTravelRecords()
} else {
errorMessage = "开通出行码失败: ${response.message()}"
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
}
}
}
// 初始化时获取出行记录
LaunchedEffect(userState) {
if (userState?.username != null) {
getTravelRecords()
}
}
LaunchedEffect(userState?.userId) {
val uid = userState?.userId ?: 0
if (uid > 0) {
try {
val resp = RetrofitClient.apiService.getBankCards(uid)
if (resp.isSuccessful && resp.body() != null) {
bankCards = resp.body()!!
}
} catch (_: Exception) {}
}
}
LaunchedEffect(userState?.userId) {
val uid = userState?.userId ?: 0
if (uid > 0) {
while (true) {
try {
val balanceRes = RetrofitClient.apiService.getBalance(uid)
if (balanceRes.isSuccessful && balanceRes.body() != null) {
userPreferences.updateBalance(balanceRes.body()!!.balance)
}
} catch (_: Exception) {}
kotlinx.coroutines.delay(30000)
}
}
}
LaunchedEffect(hasTravelPass, userState?.username) {
if (hasTravelPass && userState?.username?.isNotBlank() == true) {
while (true) {
dynamicCode = "TRAVEL:${userState!!.username}:${fixedCity}:${fixedLine}:${fixedEntryStation}:${System.currentTimeMillis() / 30000}"
delay(30000)
}
}
}
LaunchedEffect(Unit) {
if (userPreferences.getTravelPassOpened()) {
hasTravelPass = true
}
city = fixedCity
line = fixedLine
}
Scaffold(
topBar = {
CenterAlignedTopAppBar(
title = { Text("出行码") },
navigationIcon = {
IconButton(onClick = { navController.popBackStack() }) {
Icon(Icons.Filled.ArrowBack, contentDescription = "返回")
}
},
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
containerColor = MaterialTheme.colorScheme.primary,
titleContentColor = MaterialTheme.colorScheme.onPrimary,
navigationIconContentColor = MaterialTheme.colorScheme.onPrimary,
actionIconContentColor = MaterialTheme.colorScheme.onPrimary
)
)
}
) { paddingValues ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
) {
if (!hasTravelPass || city.isBlank()) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(32.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Text(
text = "开通出行码",
style = MaterialTheme.typography.headlineMedium
)
Spacer(modifier = Modifier.height(16.dp))
Text(
text = "开通后可使用二维码乘坐公共交通",
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
Spacer(modifier = Modifier.height(24.dp))
ExposedDropdownMenuBox(expanded = cityExpanded, onExpandedChange = { cityExpanded = !cityExpanded }) {
OutlinedTextField(
value = city,
onValueChange = {},
readOnly = true,
label = { Text("城市") },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = cityExpanded) },
modifier = Modifier.menuAnchor().fillMaxWidth(),
singleLine = true
)
ExposedDropdownMenu(expanded = cityExpanded, onDismissRequest = { cityExpanded = false }) {
cityOptions.forEach { option ->
DropdownMenuItem(
text = { Text(option) },
onClick = {
city = option
cityExpanded = false
lineOptions = lineOptionsMap[option] ?: emptyList()
line = ""
}
)
}
}
}
Spacer(modifier = Modifier.height(12.dp))
ExposedDropdownMenuBox(expanded = lineExpanded, onExpandedChange = { lineExpanded = !lineExpanded }) {
OutlinedTextField(
value = line,
onValueChange = {},
readOnly = true,
label = { Text("交通线路") },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = lineExpanded) },
modifier = Modifier.menuAnchor().fillMaxWidth(),
singleLine = true
)
ExposedDropdownMenu(expanded = lineExpanded, onDismissRequest = { lineExpanded = false }) {
lineOptions.forEach { option ->
DropdownMenuItem(
text = { Text(option) },
onClick = {
line = option
lineExpanded = false
}
)
}
}
}
Spacer(modifier = Modifier.height(12.dp))
Text("默认支付方式")
Row(verticalAlignment = Alignment.CenterVertically) {
RadioButton(selected = selectedPaySource == "balance", onClick = { selectedPaySource = "balance"; selectedPayCardId = null })
Spacer(modifier = Modifier.width(8.dp))
Text("余额")
}
Row(verticalAlignment = Alignment.CenterVertically) {
RadioButton(selected = selectedPaySource == "card", onClick = { selectedPaySource = "card" })
Spacer(modifier = Modifier.width(8.dp))
Text("银行卡")
}
if (selectedPaySource == "card") {
Spacer(modifier = Modifier.height(8.dp))
bankCards.forEach { card ->
Row(verticalAlignment = Alignment.CenterVertically) {
RadioButton(selected = selectedPayCardId == card.id, onClick = { selectedPayCardId = card.id })
Spacer(modifier = Modifier.width(8.dp))
Text("${card.bankName} ${card.cardNumber}")
}
}
}
Spacer(modifier = Modifier.height(32.dp))
Button(
onClick = { openTravelPass() },
modifier = Modifier.fillMaxWidth(),
enabled = !isLoading
) {
if (isLoading) {
CircularProgressIndicator(
modifier = Modifier.size(20.dp),
color = MaterialTheme.colorScheme.onPrimary
)
} else {
Text("立即开通")
}
}
if (errorMessage != null) {
Spacer(modifier = Modifier.height(8.dp))
Text(errorMessage!!, color = MaterialTheme.colorScheme.error)
}
}
} else {
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp)
) {
Card(
modifier = Modifier
.fillMaxWidth()
.height(240.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 8.dp),
shape = androidx.compose.foundation.shape.RoundedCornerShape(12.dp)
) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
if (dynamicCode != null && city.isNotBlank()) {
val bitmap = remember(dynamicCode) {
val writer = QRCodeWriter()
val size = 512
val bitMatrix = writer.encode(dynamicCode, BarcodeFormat.QR_CODE, size, size)
val bmp = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
for (x in 0 until size) {
for (y in 0 until size) {
bmp.setPixel(x, y, if (bitMatrix[x, y]) 0xFF000000.toInt() else 0xFFFFFFFF.toInt())
}
}
bmp
}
Image(
bitmap = bitmap.asImageBitmap(),
contentDescription = "出行码",
modifier = Modifier.fillMaxSize()
)
} else {
Text("请选择城市和线路以生成出行码")
}
}
}
Spacer(modifier = Modifier.height(12.dp))
Text("城市/线路")
Spacer(modifier = Modifier.height(8.dp))
ExposedDropdownMenuBox(expanded = cityExpanded, onExpandedChange = { cityExpanded = !cityExpanded }) {
OutlinedTextField(
value = city,
onValueChange = {},
readOnly = true,
label = { Text("城市") },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = cityExpanded) },
modifier = Modifier
.menuAnchor()
.fillMaxWidth()
.padding(horizontal = 16.dp),
singleLine = true
)
ExposedDropdownMenu(expanded = cityExpanded, onDismissRequest = { cityExpanded = false }) {
cityOptions.forEach { option ->
DropdownMenuItem(
text = { Text(option) },
onClick = {
city = option
cityExpanded = false
lineOptions = lineOptionsMap[option] ?: emptyList()
line = ""
}
)
}
}
}
Spacer(modifier = Modifier.height(8.dp))
ExposedDropdownMenuBox(expanded = lineExpanded, onExpandedChange = { lineExpanded = !lineExpanded }) {
OutlinedTextField(
value = line,
onValueChange = {},
readOnly = true,
label = { Text("交通线路") },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = lineExpanded) },
modifier = Modifier
.menuAnchor()
.fillMaxWidth()
.padding(horizontal = 16.dp),
singleLine = true
)
ExposedDropdownMenu(expanded = lineExpanded, onDismissRequest = { lineExpanded = false }) {
lineOptions.forEach { option ->
DropdownMenuItem(
text = { Text(option) },
onClick = {
line = option
lineExpanded = false
}
)
}
}
}
Spacer(modifier = Modifier.height(12.dp))
Row(
modifier = Modifier.padding(horizontal = 16.dp),
horizontalArrangement = Arrangement.spacedBy(12.dp)
) {
TextButton(onClick = {
dynamicCode = "TRAVEL:${userState!!.username}:${fixedCity}:${fixedLine}:${fixedEntryStation}:${System.currentTimeMillis()}"
}) { Text("刷新出行码") }
TextButton(onClick = {
if (dynamicCode.isNullOrBlank() || userState?.username.isNullOrBlank()) {
errorMessage = "请先生成出行码并确保已登录"
return@TextButton
}
isLoading = true
errorMessage = null
infoMessage = null
coroutineScope.launch {
try {
val resp = RetrofitClient.apiService.travelEntry(com.example.myapplication.data.model.TravelEntryRequest(qrCode = dynamicCode!!))
if (resp.isSuccessful) {
lastEntryRecordId = resp.body()?.id
getTravelRecords()
showEntrySuccess = true
} else {
errorMessage = "入站失败: ${resp.message()}"
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
}
}
}) { Text("模拟入站") }
TextButton(onClick = {
isLoading = true
errorMessage = null
infoMessage = null
coroutineScope.launch {
try {
var recordId: String? = travelRecords.lastOrNull { it.exitStation == null }?.id ?: lastEntryRecordId
if (recordId == null) {
val recResp = RetrofitClient.apiService.getTravelRecords(userState!!.username)
if (recResp.isSuccessful && recResp.body() != null) {
travelRecords = recResp.body()!!
recordId = travelRecords.lastOrNull { it.exitStation == null }?.id
}
if (recordId == null) {
errorMessage = "暂无进行中的出行"
return@launch
}
}
val exitResp = RetrofitClient.apiService.travelExit(recordId = recordId!!, exitStation = fixedExitStation)
if (exitResp.isSuccessful) {
val recResp = RetrofitClient.apiService.getTravelRecords(userState!!.username)
if (recResp.isSuccessful && recResp.body() != null) {
travelRecords = recResp.body()!!
}
val updated = travelRecords.firstOrNull { it.id == recordId }
val fee = updated?.fee ?: 0.0
val finalFee = if (fee > 0.0) fee else computeFare(fixedCity, fixedLine, fixedEntryStation, fixedExitStation)
val uid = userState?.userId ?: 0
if (uid > 0 && finalFee > 0.0) {
try {
RetrofitClient.apiService.createBill(
CreateBillRequest(
userId = uid,
amount = finalFee,
type = "expense",
category = "交通",
remark = "出行扣费"
)
)
try {
val balResp = RetrofitClient.apiService.getBalance(userState!!.userId)
if (balResp.isSuccessful && balResp.body() != null) {
val newBal = balResp.body()!!.balance
userPreferences.updateBalance(newBal)
}
} catch (_: Exception) {}
} catch (_: Exception) {}
}
exitFee = finalFee
showExitSuccess = true
} else {
errorMessage = exitResp.message()
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
}
}
}) { Text("模拟出站") }
}
Spacer(modifier = Modifier.height(12.dp))
Text("扣款来源")
Row(verticalAlignment = Alignment.CenterVertically) {
RadioButton(selected = selectedPaySource == "balance", onClick = { selectedPaySource = "balance"; selectedPayCardId = null })
Spacer(modifier = Modifier.width(8.dp))
Text("余额")
}
Row(verticalAlignment = Alignment.CenterVertically) {
RadioButton(selected = selectedPaySource == "card", onClick = { selectedPaySource = "card" })
Spacer(modifier = Modifier.width(8.dp))
Text("银行卡")
}
if (selectedPaySource == "card") {
Spacer(modifier = Modifier.height(8.dp))
bankCards.forEach { card ->
Row(verticalAlignment = Alignment.CenterVertically) {
RadioButton(selected = selectedPayCardId == card.id, onClick = { selectedPayCardId = card.id })
Spacer(modifier = Modifier.width(8.dp))
Text("${card.bankName} ${card.cardNumber}")
}
}
}
Spacer(modifier = Modifier.height(8.dp))
OutlinedButton(
onClick = {
if (userState?.username.isNullOrBlank() || city.isBlank()) return@OutlinedButton
isLoading = true
errorMessage = null
infoMessage = null
coroutineScope.launch {
try {
val resp = RetrofitClient.apiService.openTravel(
TravelOpenRequest(
username = userState!!.username,
city = city,
line = line,
payment = if (selectedPaySource == "card") "card" else "balance"
)
)
if (resp.isSuccessful && resp.body() != null) {
userPreferences.setTravelCityLine(city, line)
infoMessage = "扣款来源已保存:${if (selectedPaySource=="card") "银行卡" else "余额"}"
} else {
errorMessage = "保存失败: ${resp.message()}"
}
} catch (e: Exception) {
errorMessage = "网络错误: ${e.message}"
} finally {
isLoading = false
}
}
},
modifier = Modifier.padding(horizontal = 16.dp)
) { Text("保存扣款来源") }
if (infoMessage != null) {
Spacer(modifier = Modifier.height(8.dp))
Text(infoMessage!!, color = MaterialTheme.colorScheme.primary, modifier = Modifier.padding(horizontal = 16.dp))
}
Spacer(modifier = Modifier.height(24.dp))
Text(
text = "出行记录",
style = MaterialTheme.typography.titleLarge,
modifier = Modifier.padding(horizontal = 16.dp)
)
Spacer(modifier = Modifier.height(16.dp))
if (travelRecords.isEmpty()) {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp)
) {
Box(
modifier = Modifier
.fillMaxWidth()
.height(100.dp),
contentAlignment = Alignment.Center
) {
Text("暂无出行记录")
}
}
} else {
LazyColumn(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
items(travelRecords) { record ->
TravelRecordItem(record = record)
}
}
}
}
}
if (errorMessage != null) {
Spacer(modifier = Modifier.height(16.dp))
Text(
text = errorMessage!!,
color = MaterialTheme.colorScheme.error,
style = MaterialTheme.typography.bodySmall,
modifier = Modifier.padding(16.dp)
)
}
if (showEntrySuccess) {
AlertDialog(
onDismissRequest = { showEntrySuccess = false },
confirmButton = { TextButton(onClick = { showEntrySuccess = false }) { Text("确认") } },
dismissButton = { TextButton(onClick = { showEntrySuccess = false }) { Text("关闭") } },
text = { Text("入站成功") }
)
}
if (showExitSuccess) {
AlertDialog(
onDismissRequest = { showExitSuccess = false },
confirmButton = { TextButton(onClick = { showExitSuccess = false }) { Text("确认") } },
dismissButton = { TextButton(onClick = { showExitSuccess = false }) { Text("关闭") } },
text = { Text("出站成功,扣费¥${String.format("%.2f", exitFee)}") }
)
}
}
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TravelEntrySuccessScreen(navController: NavController) {
Scaffold(
topBar = {
CenterAlignedTopAppBar(
title = { Text("入站成功") },
navigationIcon = {
IconButton(onClick = { navController.popBackStack() }) {
Icon(Icons.Filled.ArrowBack, contentDescription = "返回")
}
}
)
}
) { paddingValues ->
val entry = navController.currentBackStackEntry
val city = entry?.arguments?.getString("city") ?: ""
val line = entry?.arguments?.getString("line") ?: ""
Column(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
.padding(32.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Text("入站成功", style = MaterialTheme.typography.headlineMedium)
if (city.isNotBlank() || line.isNotBlank()) {
Spacer(modifier = Modifier.height(8.dp))
Text("${city}·${line}", style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant)
}
Spacer(modifier = Modifier.height(24.dp))
Button(onClick = { navController.popBackStack() }, modifier = Modifier.fillMaxWidth()) {
Text("确认")
}
}
}
}
@Composable
fun TravelRecordItem(record: TravelRecord) {
Card(
elevation = CardDefaults.cardElevation(defaultElevation = 2.dp)
) {
Column(
modifier = Modifier.padding(16.dp)
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = "${record.entryStation}${record.exitStation ?: "未出站"}",
style = MaterialTheme.typography.bodyMedium,
fontWeight = FontWeight.Medium
)
Icon(
imageVector = if (record.exitStation != null) Icons.Filled.CheckCircle else Icons.Filled.Pending,
contentDescription = null,
tint = if (record.exitStation != null) MaterialTheme.colorScheme.primary
else MaterialTheme.colorScheme.onSurfaceVariant
)
}
Spacer(modifier = Modifier.height(8.dp))
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween
) {
Text(
text = "费用: ¥${record.fee}",
style = MaterialTheme.typography.bodySmall
)
Text(
text = record.entryTime,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
}
}
}

@ -0,0 +1,11 @@
package com.example.myapplication.ui.theme
import androidx.compose.ui.graphics.Color
val Purple80 = Color(0xFF7BB9FF)
val PurpleGrey80 = Color(0xFFCCC2DC)
val Pink80 = Color(0xFFEFB8C8)
val Purple40 = Color(0xFF1677FF)
val PurpleGrey40 = Color(0xFF625b71)
val Pink40 = Color(0xFF7D5260)

@ -0,0 +1,47 @@
package com.example.myapplication.ui.theme
import android.app.Activity
import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
private val DarkColorScheme = darkColorScheme(
primary = Purple80,
secondary = PurpleGrey80,
tertiary = Pink80
)
private val LightColorScheme = lightColorScheme(
primary = Purple40,
secondary = PurpleGrey40,
tertiary = Pink40
)
@Composable
fun MyApplicationTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
dynamicColor: Boolean = false,
content: @Composable () -> Unit
) {
val colorScheme = when {
dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
val context = LocalContext.current
if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
}
darkTheme -> DarkColorScheme
else -> LightColorScheme
}
MaterialTheme(
colorScheme = colorScheme,
typography = Typography,
content = content
)
}

@ -0,0 +1,17 @@
package com.example.myapplication.ui.theme
import androidx.compose.material3.Typography
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.sp
val Typography = Typography(
bodyLarge = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
lineHeight = 24.sp,
letterSpacing = 0.5.sp
)
)

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save