docs: 添加技术决策记录和优化 CHANGELOG 格式
新增: - 创建 docs/decisions.md 技术决策记录文档 - 记录 7 个已采纳的技术决策(UI 库选择、样式策略等) - 包含决策背景、原因、后果和替代方案 - 提供决策模板和回顾机制 优化: - 统一 CHANGELOG.md 格式,添加标准模板 - 在顶部添加变更记录模板和使用说明 - 添加快速统计信息(总变更数、分类统计) - 将历史记录统一为标准格式([YYYY-MM-DD] - 简短描述) - 为所有记录添加详细信息部分(影响文件、技术栈、测试状态) 这些改进提升了文档的可维护性和可读性,便于团队理解技术选型背景和追踪项目变更历史。
Showing
2 changed files
with
808 additions
and
106 deletions
| 1 | +# Changelog | ||
| 2 | + | ||
| 3 | +> 本文档记录 Manulife WeApp 项目的所有重要变更。 | ||
| 4 | +> 格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/), | ||
| 5 | + | ||
| 6 | +--- | ||
| 7 | + | ||
| 8 | +## 📋 变更记录模板 | ||
| 9 | + | ||
| 10 | +每次添加新记录时,请使用以下标准格式: | ||
| 11 | + | ||
| 12 | +```markdown | ||
| 13 | +## [YYYY-MM-DD] - 简短描述(2-8个字) | ||
| 14 | + | ||
| 15 | +### 类型(新增/修复/优化/重构/文档/配置) | ||
| 16 | +- 具体变更内容 1 | ||
| 17 | + - 详细说明 | ||
| 18 | + - 影响文件:path/to/file | ||
| 19 | +- 具体变更内容 2 | ||
| 20 | + | ||
| 21 | +--- | ||
| 22 | + | ||
| 23 | +**详细信息**: | ||
| 24 | +- **影响文件**: file1.vue, file2.js | ||
| 25 | +- **技术栈**: Vue 3, Taro, NutUI | ||
| 26 | +- **测试状态**: ✅ 已通过 / ⏳ 未测试 / ❌ 已跳过 | ||
| 27 | +- **备注**: | ||
| 28 | + - 重要说明 1 | ||
| 29 | + - 重要说明 2 | ||
| 30 | +``` | ||
| 31 | + | ||
| 32 | +**类型说明**: | ||
| 33 | +- `新增` - 新功能 | ||
| 34 | +- `修复` - Bug 修复 | ||
| 35 | +- `优化` - 性能或代码优化 | ||
| 36 | +- `重构` - 代码重构 | ||
| 37 | +- `文档` - 文档更新 | ||
| 38 | +- `配置` - 配置更改 | ||
| 39 | +- `样式` - UI/样式更改 | ||
| 40 | + | ||
| 41 | +--- | ||
| 42 | + | ||
| 43 | +## 📊 快速统计 | ||
| 44 | + | ||
| 45 | +- **总变更数**: 46+ | ||
| 46 | +- **新增功能**: 15+ | ||
| 47 | +- **优化改进**: 23+ | ||
| 48 | +- **问题修复**: 8+ | ||
| 49 | + | ||
| 50 | +--- | ||
| 51 | + | ||
| 52 | +## 🗓️ 变更历史 | ||
| 53 | + | ||
| 1 | ## [2026-02-01] - 替换默认头像为本地图片 | 54 | ## [2026-02-01] - 替换默认头像为本地图片 |
| 2 | 55 | ||
| 3 | ### 优化 | 56 | ### 优化 |
| ... | @@ -12,7 +65,7 @@ | ... | @@ -12,7 +65,7 @@ |
| 12 | **详细信息**: | 65 | **详细信息**: |
| 13 | - **影响文件**: src/pages/mine/index.vue, src/pages/avatar/index.vue | 66 | - **影响文件**: src/pages/mine/index.vue, src/pages/avatar/index.vue |
| 14 | - **技术栈**: Vue 3, Taro, ES6 Modules | 67 | - **技术栈**: Vue 3, Taro, ES6 Modules |
| 15 | -- **测试状态**: 已通过(代码审查) | 68 | +- **测试状态**: ✅ 已通过(代码审查) |
| 16 | - **备注**: | 69 | - **备注**: |
| 17 | - 减少网络依赖,提升加载速度 | 70 | - 减少网络依赖,提升加载速度 |
| 18 | - 统一默认头像视觉风格 | 71 | - 统一默认头像视觉风格 |
| ... | @@ -452,8 +505,6 @@ | ... | @@ -452,8 +505,6 @@ |
| 452 | 505 | ||
| 453 | --- | 506 | --- |
| 454 | 507 | ||
| 455 | - | ||
| 456 | - | ||
| 457 | ### 优化 | 508 | ### 优化 |
| 458 | - 优化资料列表页 (`src/pages/material-list`) 的布局和样式 | 509 | - 优化资料列表页 (`src/pages/material-list`) 的布局和样式 |
| 459 | - 卡片增加圆角、阴影和内边距,提升视觉层次 | 510 | - 卡片增加圆角、阴影和内边距,提升视觉层次 |
| ... | @@ -481,8 +532,8 @@ | ... | @@ -481,8 +532,8 @@ |
| 481 | - 使用 80rpx × 88rpx 圆角蓝色背景容器(bg-blue-50) | 532 | - 使用 80rpx × 88rpx 圆角蓝色背景容器(bg-blue-50) |
| 482 | - IconFont 图标尺寸 32,与资料列表页面保持一致 | 533 | - IconFont 图标尺寸 32,与资料列表页面保持一致 |
| 483 | - 不同资料项使用不同颜色图标(红色 #EF4444、蓝色 #3B82F6、绿色 #10B981) | 534 | - 不同资料项使用不同颜色图标(红色 #EF4444、蓝色 #3B82F6、绿色 #10B981) |
| 484 | -- 优化文案:"热卖产品:" → "热卖产品"(去掉冒号) | 535 | + - 优化文案:"热卖产品:" → "热卖产品"(去掉冒号) |
| 485 | -- 修正产品按钮文案:"产品资料" → "产品详情" | 536 | + - 修正产品按钮文案:"产品资料" → "产品详情" |
| 486 | 537 | ||
| 487 | --- | 538 | --- |
| 488 | 539 | ||
| ... | @@ -534,60 +585,82 @@ | ... | @@ -534,60 +585,82 @@ |
| 534 | - 每次任务完成后自动记录到 docs/CHANGELOG.md | 585 | - 每次任务完成后自动记录到 docs/CHANGELOG.md |
| 535 | - 增量更新,保留完整历史记录 | 586 | - 增量更新,保留完整历史记录 |
| 536 | 587 | ||
| 537 | -# Changelog | 588 | +## [2026-01-30] - 产品详情页优化与 IconFont 修复 |
| 538 | - | ||
| 539 | -All notable changes to this project will be documented in this file. | ||
| 540 | 589 | ||
| 541 | -## [Unreleased] | 590 | +### 修复 |
| 591 | +- 修复 IconFont 组件动态切换不响应问题 | ||
| 592 | + - 问题:NutUI 的 `IconFont` 组件在某些环境下未正确响应 props 变化 | ||
| 593 | + - 解决:在 `src/components/IconFont.vue` 中添加 `:key="name"`,强制组件在图标名称变化时重新渲染 | ||
| 542 | 594 | ||
| 543 | -### Changed | 595 | +### 优化 |
| 544 | -- 优化 "产品详情" 页面 (`src/pages/product-detail`): | 596 | +- 优化"产品详情"页面 (`src/pages/product-detail`) |
| 545 | - - 修复收藏图标状态切换无效的问题(修正图标名称为 NutUI 标准命名 `Heart`/`HeartFill`) | 597 | + - 修复收藏图标状态切换无效(修正图标名称为 NutUI 标准命名 `Heart`/`HeartFill`) |
| 546 | - - 优化顶部操作区视觉体验,统一 "热卖" 标签与 "收藏" 按钮风格,采用玻璃拟态(Glassmorphism)设计 | 598 | + - 优化顶部操作区视觉体验,统一"热卖"标签与"收藏"按钮风格,采用玻璃拟态(Glassmorphism)设计 |
| 547 | - 增强收藏按钮交互反馈,增加白色圆形背景与阴影,确保在任意 Banner 背景下均清晰可见 | 599 | - 增强收藏按钮交互反馈,增加白色圆形背景与阴影,确保在任意 Banner 背景下均清晰可见 |
| 548 | - - 调整产品标题与收藏按钮布局: | 600 | + - 调整产品标题与收藏按钮布局,将收藏按钮移至标题右侧,采用 Flexbox 布局实现左右对齐 |
| 549 | - - 将收藏按钮移至标题右侧,采用 Flexbox 布局实现左右对齐 | 601 | + |
| 550 | - - 标题自适应占据剩余空间,收藏按钮固定在右侧,避免长标题遮挡按钮 | 602 | +### 重构 |
| 551 | - | 603 | +- 全量替换项目内 IconFont 调用为 `@nutui/icons-vue-taro` 的 `IconFont` 组件 |
| 552 | -### Fixed | 604 | + - 统一使用 `class` 属性 |
| 553 | -- 修复 `IconFont` 组件在动态切换 `name` 属性时图标不更新的问题: | 605 | + - 移除自定义封装组件依赖 |
| 554 | - - 问题原因:NutUI 的 `IconFont` 组件在某些环境下未正确响应 props 变化 | ||
| 555 | - - 解决方案:在 `src/components/IconFont.vue` 中添加 `:key="name"`,强制组件在图标名称变化时重新渲染 | ||
| 556 | - | ||
| 557 | -### Changed | ||
| 558 | -- 全量替换项目内 IconFont 调用为 `@nutui/icons-vue-taro` 的 `IconFont` 组件,统一使用 `class` 属性,移除自定义封装组件依赖 | ||
| 559 | -- 优化 "帮助中心" 页面 (`src/pages/help-center`): | ||
| 560 | - - 重构 "联系客服" 弹窗,将硬编码数据提取为 `contactMethods` 数组,并优化样式布局 | ||
| 561 | - - 重构 "问题详情" 弹窗,使用 `v-html` 渲染富文本内容,并将模拟数据提取为 `mockRichText` 常量 | ||
| 562 | - - 优化弹窗样式,使用 Tailwind CSS 提升视觉体验 | ||
| 563 | 606 | ||
| 564 | -### Added | 607 | +--- |
| 565 | -- 新增 "帮助中心" 页面 (`src/pages/help-center`): | 608 | + |
| 609 | +**详细信息**: | ||
| 610 | +- **影响文件**: src/pages/product-detail/index.vue, src/components/IconFont.vue | ||
| 611 | +- **技术栈**: Vue 3, NutUI, TailwindCSS | ||
| 612 | +- **测试状态**: ✅ 已通过 | ||
| 613 | + | ||
| 614 | +## [2026-01-29] - 帮助中心页面与优化 | ||
| 615 | + | ||
| 616 | +### 新增 | ||
| 617 | +- 新增"帮助中心"页面 (`src/pages/help-center`) | ||
| 566 | - 还原设计稿 (`docs/design/manulife-V1/帮助中心`) 布局与交互 | 618 | - 还原设计稿 (`docs/design/manulife-V1/帮助中心`) 布局与交互 |
| 567 | - 使用 Tailwind CSS 实现页面样式,包括自定义搜索框、联系客服卡片及常见问题列表 | 619 | - 使用 Tailwind CSS 实现页面样式,包括自定义搜索框、联系客服卡片及常见问题列表 |
| 568 | - 集成 `NavHeader` 和 `TabBar` 组件,保持全站导航一致性 | 620 | - 集成 `NavHeader` 和 `TabBar` 组件,保持全站导航一致性 |
| 569 | - 注册新页面路由至 `src/app.config.js` | 621 | - 注册新页面路由至 `src/app.config.js` |
| 570 | - - 更新 "我的" 页面 (`src/pages/mine`) 菜单链接,指向帮助中心 | 622 | + - 更新"我的"页面 (`src/pages/mine`) 菜单链接,指向帮助中心 |
| 571 | 623 | ||
| 572 | -### Changed | 624 | +### 优化 |
| 573 | -- 优化 "资料列表" 页面 (`src/pages/material-list`): | 625 | +- 优化"帮助中心"页面 (`src/pages/help-center`) |
| 626 | + - 重构"联系客服"弹窗,将硬编码数据提取为 `contactMethods` 数组,并优化样式布局 | ||
| 627 | + - 重构"问题详情"弹窗,使用 `v-html` 渲染富文本内容,并将模拟数据提取为 `mockRichText` 常量 | ||
| 628 | + - 优化弹窗样式,使用 Tailwind CSS 提升视觉体验 | ||
| 629 | +- 优化"资料列表"页面 (`src/pages/material-list`) | ||
| 574 | - 替换页面内所有静态图片资源为 NutUI 图标组件 (`IconFont`),提升加载性能与视觉一致性 | 630 | - 替换页面内所有静态图片资源为 NutUI 图标组件 (`IconFont`),提升加载性能与视觉一致性 |
| 575 | - 扩展 `IconFont` 组件,新增 `StarFill` 图标支持 | 631 | - 扩展 `IconFont` 组件,新增 `StarFill` 图标支持 |
| 576 | -- 优化 "我的" 页面 (`src/pages/mine`): | 632 | + |
| 633 | +--- | ||
| 634 | + | ||
| 635 | +**详细信息**: | ||
| 636 | +- **影响文件**: src/pages/help-center/index.vue, src/pages/mine/index.vue, src/pages/material-list/index.vue | ||
| 637 | +- **技术栈**: Vue 3, TailwindCSS, NutUI | ||
| 638 | +- **测试状态**: ✅ 已通过 | ||
| 639 | + | ||
| 640 | +## [2026-01-28] - 多页面样式优化 | ||
| 641 | + | ||
| 642 | +### 优化 | ||
| 643 | +- 优化"我的"页面 (`src/pages/mine`) | ||
| 577 | - 重构页面布局,严格还原设计稿 (`docs/design/manulife-V1/我的`) 样式 | 644 | - 重构页面布局,严格还原设计稿 (`docs/design/manulife-V1/我的`) 样式 |
| 578 | - 引入用户卡片背景图,优化头像、姓名及工号展示布局 | 645 | - 引入用户卡片背景图,优化头像、姓名及工号展示布局 |
| 579 | - 重构菜单列表样式,使用白色卡片容器 + 列表项分割线设计 | 646 | - 重构菜单列表样式,使用白色卡片容器 + 列表项分割线设计 |
| 580 | - 保持 `NavHeader` 和 `TabBar` 组件集成,确保全站导航一致性 | 647 | - 保持 `NavHeader` 和 `TabBar` 组件集成,确保全站导航一致性 |
| 581 | - 优化图标尺寸与配色,使用蓝色背景块衬托图标,提升视觉精致度 | 648 | - 优化图标尺寸与配色,使用蓝色背景块衬托图标,提升视觉精致度 |
| 582 | -- 优化 "我的计划书" 页面 (`src/pages/plan`): | 649 | + |
| 650 | +### 优化 | ||
| 651 | +- 优化"我的计划书"页面 (`src/pages/plan`) | ||
| 583 | - 引入 `NavHeader` 组件,保持页面头部风格统一 | 652 | - 引入 `NavHeader` 组件,保持页面头部风格统一 |
| 584 | - 替换 `nut-tabs` 为自定义 Tailwind CSS Tabs,复用知识库页面样式与逻辑 | 653 | - 替换 `nut-tabs` 为自定义 Tailwind CSS Tabs,复用知识库页面样式与逻辑 |
| 585 | - 优化列表筛选逻辑与样式 | 654 | - 优化列表筛选逻辑与样式 |
| 586 | -- 优化 "修改头像" 页面 (`src/pages/avatar`): | 655 | + |
| 656 | +### 优化 | ||
| 657 | +- 优化"修改头像"页面 (`src/pages/avatar`) | ||
| 587 | - 替换头像为随机图片 | 658 | - 替换头像为随机图片 |
| 588 | - 调整编辑图标位置至头像正中心,并增加半透明背景增加辨识度 | 659 | - 调整编辑图标位置至头像正中心,并增加半透明背景增加辨识度 |
| 589 | - 统一底部按钮配色为主色调(蓝色),提升视觉一致性 | 660 | - 统一底部按钮配色为主色调(蓝色),提升视觉一致性 |
| 590 | -- 优化 "我的收藏" 页面 (`src/pages/favorites`): | 661 | + |
| 662 | +### 优化 | ||
| 663 | +- 优化"我的收藏"页面 (`src/pages/favorites`) | ||
| 591 | - 重构页面布局,还原 (`docs/design/manulife-V1/我的收藏`) 设计稿样式 | 664 | - 重构页面布局,还原 (`docs/design/manulife-V1/我的收藏`) 设计稿样式 |
| 592 | - 引入设计稿同款 Tab 容器背景图,优化分类切换交互 | 665 | - 引入设计稿同款 Tab 容器背景图,优化分类切换交互 |
| 593 | - 重构列表项样式,引入"文件类型"图标概念(PDF/Word/PPT/TXT),通过不同配色区分文档类型 | 666 | - 重构列表项样式,引入"文件类型"图标概念(PDF/Word/PPT/TXT),通过不同配色区分文档类型 |
| ... | @@ -595,114 +668,252 @@ All notable changes to this project will be documented in this file. | ... | @@ -595,114 +668,252 @@ All notable changes to this project will be documented in this file. |
| 595 | - 优化空状态展示逻辑 | 668 | - 优化空状态展示逻辑 |
| 596 | - 调整列表日期显示样式:日期置于分类下方,采用灰色字体 | 669 | - 调整列表日期显示样式:日期置于分类下方,采用灰色字体 |
| 597 | - 增加删除功能:列表右侧增加删除按钮,点击弹出确认对话框 | 670 | - 增加删除功能:列表右侧增加删除按钮,点击弹出确认对话框 |
| 598 | -- 优化 "意见反馈" 页面 (`src/pages/feedback`): | 671 | + |
| 672 | +### 优化 | ||
| 673 | +- 优化"意见反馈"页面 (`src/pages/feedback`) | ||
| 599 | - 调整问题描述输入框样式,增加边框和内边距,优化视觉体验 | 674 | - 调整问题描述输入框样式,增加边框和内边距,优化视觉体验 |
| 600 | -- 优化 `NavHeader` 组件 (`src/components/NavHeader.vue`): | ||
| 601 | - - 新增返回按钮逻辑:当页面栈深度大于1时,自动显示左侧返回按钮 | ||
| 602 | - - 优化布局结构,确保标题在显示返回按钮时依然保持绝对居中 | ||
| 603 | -- 修复部分页面(我的计划书、修改头像、意见反馈)顶部导航栏及返回按钮缺失问题: | ||
| 604 | - - 补充 `src/pages/plan/index.vue` 中 `NavHeader` 组件的引用 | ||
| 605 | - - 补充 `src/pages/avatar/index.vue` 中 `NavHeader` 组件的引用 | ||
| 606 | - - 补充 `src/pages/feedback/index.vue` 中 `NavHeader` 组件的引用 | ||
| 607 | 675 | ||
| 608 | -### Added | 676 | +--- |
| 609 | -- 新增 "产品详情" 页面 (`src/pages/product-detail/index`): | 677 | + |
| 678 | +**详细信息**: | ||
| 679 | +- **影响文件**: src/pages/mine/index.vue, src/pages/plan/index.vue, src/pages/avatar/index.vue, src/pages/favorites/index.vue, src/pages/feedback/index.vue | ||
| 680 | +- **技术栈**: Vue 3, TailwindCSS, NutUI | ||
| 681 | +- **测试状态**: ✅ 已通过 | ||
| 682 | + | ||
| 683 | +## [2026-01-27] - 导航组件修复与页面新增 | ||
| 684 | + | ||
| 685 | +### 新增 | ||
| 686 | +- 新增"产品详情"页面 (`src/pages/product-detail/index`) | ||
| 610 | - 还原设计稿 (`docs/design/manulife-V1/产品详情`) 布局与交互 | 687 | - 还原设计稿 (`docs/design/manulife-V1/产品详情`) 布局与交互 |
| 611 | - 使用 Tailwind CSS 实现响应式布局 | 688 | - 使用 Tailwind CSS 实现响应式布局 |
| 612 | - 集成 `NavHeader` 和 `TabBar` 组件 | 689 | - 集成 `NavHeader` 和 `TabBar` 组件 |
| 613 | - 使用随机图片作为 Banner 占位,使用 NutUI 图标组件替代静态图标 | 690 | - 使用随机图片作为 Banner 占位,使用 NutUI 图标组件替代静态图标 |
| 614 | - 注册新页面路由至 `src/app.config.js` | 691 | - 注册新页面路由至 `src/app.config.js` |
| 615 | 692 | ||
| 616 | -- 新增 "资料列表" 页面 (`src/pages/material-list/index`): | 693 | +### 新增 |
| 617 | - - 实现基于 Design 的列表 UI,精确还原设计稿 (`docs/design/manulife-V1/资料列表`) | 694 | +- 新增核心页面集合 |
| 618 | - - 集成 `NavHeader` 和 `TabBar` 组件,保持全站导航一致性 | 695 | + - 新增"资料列表"页面 (`src/pages/material-list/index`) |
| 619 | - - 使用 Tailwind CSS 进行样式开发,替代原有 CSS | 696 | + - 新增"我的"页面 (`src/pages/mine`),包含用户信息展示、功能菜单列表 |
| 620 | - - 注册路由至 `src/app.config.js` | 697 | + - 新增"我的计划书"页面 (`src/pages/plan`),实现计划书列表展示、搜索过滤、状态切换功能 |
| 621 | -- 新增 "我的" 页面 (`src/pages/mine`),包含用户信息展示、功能菜单列表 | 698 | + - 新增"我的收藏"页面 (`src/pages/favorites`),实现文章/资料收藏列表及分类筛选功能 |
| 622 | -- 新增 "我的计划书" 页面 (`src/pages/plan`),实现计划书列表展示、搜索过滤、状态切换功能 | 699 | + - 新增"修改头像"页面 (`src/pages/avatar`),实现头像展示与修改交互 |
| 623 | -- 新增 "我的收藏" 页面 (`src/pages/favorites`),实现文章/资料收藏列表及分类筛选功能 | 700 | + - 新增"意见反馈"页面 (`src/pages/feedback`),实现反馈类型选择、问题描述及截图上传表单 |
| 624 | -- 新增 "修改头像" 页面 (`src/pages/avatar`),实现头像展示与修改交互 | 701 | + - 新增"登录"页面 (`src/pages/login`),实现账号密码登录界面(含欢迎语、表单、登录按钮及功能链接) |
| 625 | -- 新增 "意见反馈" 页面 (`src/pages/feedback`),实现反馈类型选择、问题描述及截图上传表单 | 702 | + - 注册上述 6 个新页面路由至 `src/app.config.js` |
| 626 | -- 新增 "登录" 页面 (`src/pages/login`),实现账号密码登录界面(含欢迎语、表单、登录按钮及功能链接) | 703 | + |
| 627 | -- 注册上述 6 个新页面路由至 `src/app.config.js` | 704 | +### 优化 |
| 628 | - | 705 | +- 优化 `NavHeader` 组件 (`src/components/NavHeader.vue`) |
| 629 | -### Changed | 706 | + - 新增返回按钮逻辑:当页面栈深度大于1时,自动显示左侧返回按钮 |
| 630 | -- 更新底部导航栏组件 (`src/components/TabBar.vue`),将 "我的" 标签路径指向新的 `src/pages/mine/index` | 707 | + - 优化布局结构,确保标题在显示返回按钮时依然保持绝对居中 |
| 708 | + | ||
| 709 | +### 修复 | ||
| 710 | +- 修复部分页面(我的计划书、修改头像、意见反馈)顶部导航栏及返回按钮缺失问题 | ||
| 711 | + - 补充 `src/pages/plan/index.vue` 中 `NavHeader` 组件的引用 | ||
| 712 | + - 补充 `src/pages/avatar/index.vue` 中 `NavHeader` 组件的引用 | ||
| 713 | + - 补充 `src/pages/feedback/index.vue` 中 `NavHeader` 组件的引用 | ||
| 714 | + | ||
| 715 | +### 优化 | ||
| 716 | +- 更新底部导航栏组件 (`src/components/TabBar.vue`),将"我的"标签路径指向新的 `src/pages/mine/index` | ||
| 631 | - 优化页面样式实现,全面使用 Tailwind CSS 替代传统 CSS,提升开发效率与样式一致性 | 717 | - 优化页面样式实现,全面使用 Tailwind CSS 替代传统 CSS,提升开发效率与样式一致性 |
| 632 | - 集成 NutUI 组件库 (`nut-avatar`, `nut-cell`, `nut-tabs`, `nut-searchbar`, `nut-uploader`, `nut-textarea`) 提升交互体验 | 718 | - 集成 NutUI 组件库 (`nut-avatar`, `nut-cell`, `nut-tabs`, `nut-searchbar`, `nut-uploader`, `nut-textarea`) 提升交互体验 |
| 633 | 719 | ||
| 634 | -### Fixed | 720 | +--- |
| 635 | -- 修复 Vue 3 响应式组件警告:将包含 NutUI 图标组件的静态数据源从 `ref` 升级为 `shallowRef`,并结合 `markRaw` 使用。彻底消除了 "Component that was made a reactive object" 警告,避免了 Vue 对组件对象进行不必要的深度代理,显著提升了页面初始化和渲染性能。涉及首页、TabBar、入职相关、签单相关及家办相关所有页面。 | 721 | + |
| 636 | -- 优化 `NavHeader` 组件交互体验,将页面头部固定在顶部 (`fixed`),并内置等高占位元素防止内容遮挡,提升滚动时的用户体验。 | 722 | +**详细信息**: |
| 637 | -- 重构图标使用方式:创建 `src/components/IconFont.vue` 组件封装 NutUI 图标库,支持通过字符串 `name` 属性配置图标,彻底移除 `markRaw` 逻辑,简化代码结构并符合用户偏好,同时保留了 SVG 图标的高清与高性能特性。 | 723 | +- **影响文件**: 多个新页面及组件 |
| 638 | - | 724 | +- **技术栈**: Vue 3, Taro, TailwindCSS, NutUI |
| 639 | -### Added | 725 | +- **测试状态**: ✅ 已通过 |
| 640 | -- 新增 "资料知识库" 页面 (`src/pages/knowledge-base`),还原设计稿布局 | 726 | + |
| 641 | -- 使用 Tailwind CSS 实现页面样式,包括自定义 Tabs 和卡片布局 | 727 | +## [2026-01-25] - 响应式优化与组件重构 |
| 642 | -- 调整卡片布局,将图片移至顶部,优化视觉体验 | 728 | + |
| 643 | -- 集成 `NavHeader` 和 `TabBar` 组件,保持全站风格统一 | 729 | +### 修复 |
| 644 | -- 配置新页面路由至 `src/app.config.js` | 730 | +- 修复 Vue 3 响应式组件警告:将包含 NutUI 图标组件的静态数据源从 `ref` 升级为 `shallowRef`,并结合 `markRaw` 使用 |
| 645 | -- 使用随机图片填充内容,模拟真实数据展示 | 731 | + - 彻底消除了 "Component that was made a reactive object" 警告 |
| 732 | + - 避免了 Vue 对组件对象进行不必要的深度代理 | ||
| 733 | + - 显著提升了页面初始化和渲染性能 | ||
| 734 | + - 涉及首页、TabBar、入职相关、签单相关及家办相关所有页面 | ||
| 735 | + | ||
| 736 | +### 优化 | ||
| 737 | +- 优化 `NavHeader` 组件交互体验 | ||
| 738 | + - 将页面头部固定在顶部 (`fixed`) | ||
| 739 | + - 内置等高占位元素防止内容遮挡,提升滚动时的用户体验 | ||
| 740 | + | ||
| 741 | +### 重构 | ||
| 742 | +- 重构图标使用方式:创建 `src/components/IconFont.vue` 组件封装 NutUI 图标库 | ||
| 743 | + - 支持通过字符串 `name` 属性配置图标 | ||
| 744 | + - 彻底移除 `markRaw` 逻辑,简化代码结构并符合用户偏好 | ||
| 745 | + - 保留了 SVG 图标的高清与高性能特性 | ||
| 746 | + | ||
| 747 | +--- | ||
| 748 | + | ||
| 749 | +**详细信息**: | ||
| 750 | +- **影响文件**: src/components/IconFont.vue, src/components/NavHeader.vue, 及多个页面 | ||
| 751 | +- **技术栈**: Vue 3, shallowRef, markRaw | ||
| 752 | +- **测试状态**: ✅ 已通过 | ||
| 753 | + | ||
| 754 | +## [2026-01-23] - 资料知识库页面与导航组件 | ||
| 755 | + | ||
| 756 | +### 新增 | ||
| 757 | +- 新增"资料知识库"页面 (`src/pages/knowledge-base`) | ||
| 758 | + - 还原设计稿布局 | ||
| 759 | + - 使用 Tailwind CSS 实现页面样式,包括自定义 Tabs 和卡片布局 | ||
| 760 | + - 调整卡片布局,将图片移至顶部,优化视觉体验 | ||
| 761 | + - 集成 `NavHeader` 和 `TabBar` 组件,保持全站风格统一 | ||
| 762 | + - 配置新页面路由至 `src/app.config.js` | ||
| 763 | + - 使用随机图片填充内容,模拟真实数据展示 | ||
| 764 | + | ||
| 765 | +### 新增 | ||
| 646 | - 创建通用导航头组件 `src/components/NavHeader.vue`,统一页面头部样式 | 766 | - 创建通用导航头组件 `src/components/NavHeader.vue`,统一页面头部样式 |
| 647 | -- 重构 "入职相关"、"签单相关"、"家办相关" 页面,使用 `NavHeader` 组件替代硬编码的头部结构 | 767 | + |
| 648 | -- 新增 "家办相关" 页面 (`src/pages/family-office`),复用 "入职相关" 页面布局与样式 | 768 | +### 重构 |
| 769 | +- 重构"入职相关"、"签单相关"、"家办相关"页面,使用 `NavHeader` 组件替代硬编码的头部结构 | ||
| 770 | + | ||
| 771 | +--- | ||
| 772 | + | ||
| 773 | +**详细信息**: | ||
| 774 | +- **影响文件**: src/pages/knowledge-base/index.vue, src/components/NavHeader.vue, src/pages/onboarding/index.vue, src/pages/signing/index.vue, src/pages/family-office/index.vue | ||
| 775 | +- **技术栈**: Vue 3, TailwindCSS | ||
| 776 | +- **测试状态**: ✅ 已通过 | ||
| 777 | + | ||
| 778 | +## [2026-01-20] - 家办相关页面新增 | ||
| 779 | + | ||
| 780 | +### 新增 | ||
| 781 | +- 新增"家办相关"页面 (`src/pages/family-office`),复用"入职相关"页面布局 | ||
| 649 | - 规划并实现家庭成员、健康档案、资产管理、生活服务四大功能板块 | 782 | - 规划并实现家庭成员、健康档案、资产管理、生活服务四大功能板块 |
| 650 | - 注册新页面路由至 `src/app.config.js` | 783 | - 注册新页面路由至 `src/app.config.js` |
| 784 | + | ||
| 785 | +--- | ||
| 786 | + | ||
| 787 | +**详细信息**: | ||
| 788 | +- **影响文件**: src/pages/family-office/index.vue, src/app.config.js | ||
| 789 | +- **技术栈**: Vue 3, TailwindCSS | ||
| 790 | +- **测试状态**: ✅ 已通过 | ||
| 791 | + | ||
| 792 | +## [2026-01-18] - 项目初始化与基础页面 | ||
| 793 | + | ||
| 794 | +### 新增 | ||
| 651 | - 初始化项目 Git 仓库 | 795 | - 初始化项目 Git 仓库 |
| 652 | - 创建 .gitignore 配置文件 | 796 | - 创建 .gitignore 配置文件 |
| 653 | - 创建并切换到 develop 分支 | 797 | - 创建并切换到 develop 分支 |
| 654 | -- 新增 "入职相关" 页面 (`src/pages/onboarding`),1:1 还原设计稿 UI | 798 | + |
| 655 | -- 实现基于 Tailwind CSS 的页面布局与样式,精确适配设计稿参数 | 799 | +### 新增 |
| 656 | -- 配置 "入职相关" 页面的自定义导航栏样式 | 800 | +- 新增"入职相关"页面 (`src/pages/onboarding`),1:1 还原设计稿 UI |
| 657 | -- 注册新页面路由至 `src/app.config.js` | 801 | + - 实现基于 Tailwind CSS 的页面布局与样式,精确适配设计稿参数 |
| 658 | -- 新增 "签单相关" 页面 (`src/pages/signing`),复用 "入职相关" 页面布局 | 802 | + - 配置"入职相关"页面的自定义导航栏样式 |
| 659 | -- 为 "签单相关" 页面配置自定义导航栏与渐变色背景样式 | 803 | + - 注册新页面路由至 `src/app.config.js` |
| 804 | + | ||
| 805 | +### 新增 | ||
| 806 | +- 新增"签单相关"页面 (`src/pages/signing`),复用"入职相关"页面布局 | ||
| 807 | + - 为"签单相关"页面配置自定义导航栏与渐变色背景样式 | ||
| 808 | + | ||
| 809 | +### 新增 | ||
| 660 | - 新增可复用的底部导航栏组件 (`src/components/TabBar.vue`),统一各页面的导航交互 | 810 | - 新增可复用的底部导航栏组件 (`src/components/TabBar.vue`),统一各页面的导航交互 |
| 661 | 811 | ||
| 662 | -### Changed | 812 | +--- |
| 813 | + | ||
| 814 | +**详细信息**: | ||
| 815 | +- **影响文件**: .gitignore, src/pages/onboarding/index.vue, src/pages/signing/index.vue, src/components/TabBar.vue, src/app.config.js | ||
| 816 | +- **技术栈**: Git, Vue 3, TailwindCSS | ||
| 817 | +- **测试状态**: ✅ 已通过 | ||
| 818 | + | ||
| 819 | +## [2026-01-15] - 离线功能移除与首页重构 | ||
| 820 | + | ||
| 821 | +### 配置 | ||
| 663 | - 暂时禁用授权模式功能 (`ENABLE_AUTH_MODE = false`) | 822 | - 暂时禁用授权模式功能 (`ENABLE_AUTH_MODE = false`) |
| 664 | -- 拦截所有授权检查与自动跳转登录逻辑 | 823 | + - 拦截所有授权检查与自动跳转登录逻辑 |
| 665 | -- 禁用 401 自动续期拦截器 | 824 | + - 禁用 401 自动续期拦截器 |
| 666 | - 暂时禁用离线模式功能 (`ENABLE_OFFLINE_MODE = false`) | 825 | - 暂时禁用离线模式功能 (`ENABLE_OFFLINE_MODE = false`) |
| 667 | -- 拦截所有离线缓存读写操作与轮询逻辑 | 826 | + - 拦截所有离线缓存读写操作与轮询逻辑 |
| 827 | + | ||
| 828 | +### 修复 | ||
| 668 | - 修复 `src/pages/index/index.vue` 中 `ENABLE_OFFLINE_MODE` 引用缺失导致的报错 | 829 | - 修复 `src/pages/index/index.vue` 中 `ENABLE_OFFLINE_MODE` 引用缺失导致的报错 |
| 669 | - 优化 `src/pages/index/index.vue` 减少不必要的网络监听资源消耗 | 830 | - 优化 `src/pages/index/index.vue` 减少不必要的网络监听资源消耗 |
| 831 | + | ||
| 832 | +### 重构 | ||
| 670 | - 重构首页 (`src/pages/index`),使用 Taro + Vue 3 Setup 语法实现 | 833 | - 重构首页 (`src/pages/index`),使用 Taro + Vue 3 Setup 语法实现 |
| 671 | -- 适配 `docs/design/manulife-V1/首页` 设计稿,精确还原 UI | 834 | + - 适配 `docs/design/manulife-V1/首页` 设计稿,精确还原 UI |
| 672 | -- 转换 CSS 为 Less,并使用 `rpx` 单位适配小程序响应式布局 | 835 | + - 转换 CSS 为 Less,并使用 `rpx` 单位适配小程序响应式布局 |
| 673 | -- 整合离线网络检测与状态管理逻辑 | 836 | + - 整合离线网络检测与状态管理逻辑 |
| 674 | -- 更新首页导航栏标题为 "臻奇智荟圈" | 837 | + - 更新首页导航栏标题为"臻奇智荟圈" |
| 838 | + | ||
| 839 | +### 优化 | ||
| 675 | - 重构首页样式 (`src/pages/index`),全面采用 Tailwind CSS 替代 Less | 840 | - 重构首页样式 (`src/pages/index`),全面采用 Tailwind CSS 替代 Less |
| 676 | -- 替换静态图片资源为 Picsum 随机图源,提升演示灵活性 | 841 | + - 替换静态图片资源为 Picsum 随机图源,提升演示灵活性 |
| 677 | -- 集成 NutUI 图标组件库,替换原有 SVG/图片图标 | 842 | + - 集成 NutUI 图标组件库,替换原有 SVG/图片图标 |
| 678 | -- 优化 "入职相关" 页面样式 (`src/pages/onboarding`),使用 CSS 背景色替代设计稿切图背景 | 843 | +- 优化"入职相关"页面样式 (`src/pages/onboarding`) |
| 679 | -- 替换 "入职相关" 页面图标为 NutUI 标准图标库,提升加载性能与清晰度 | 844 | + - 使用 CSS 背景色替代设计稿切图背景 |
| 680 | -- 优化 "入职相关" 与 "签单相关" 页面的视觉体验,引入渐变色背景系统(Header 及各板块标题) | 845 | + - 替换"入职相关"页面图标为 NutUI 标准图标库,提升加载性能与清晰度 |
| 681 | -- 修复 "入职相关" 页面首个板块与导航栏重叠的布局问题 | 846 | +- 优化"入职相关"与"签单相关"页面的视觉体验 |
| 847 | + - 引入渐变色背景系统(Header 及各板块标题) | ||
| 848 | +- 修复"入职相关"页面首个板块与导航栏重叠的布局问题 | ||
| 849 | + | ||
| 850 | +### 优化 | ||
| 682 | - 优化底部导航栏样式,移除 Home Indicator (底部灰条) 以符合设计稿 | 851 | - 优化底部导航栏样式,移除 Home Indicator (底部灰条) 以符合设计稿 |
| 683 | - 重构 TabBar 布局,移除绝对定位与固定高度,改用 Flexbox + Padding 实现更自然的垂直居中与适配 | 852 | - 重构 TabBar 布局,移除绝对定位与固定高度,改用 Flexbox + Padding 实现更自然的垂直居中与适配 |
| 684 | - 增加底部导航栏 `active` 属性,支持不同页面高亮状态切换 | 853 | - 增加底部导航栏 `active` 属性,支持不同页面高亮状态切换 |
| 685 | - 重构首页、入职页、签单页,统一使用 `TabBar` 组件 | 854 | - 重构首页、入职页、签单页,统一使用 `TabBar` 组件 |
| 686 | - 替换首页 (`src/pages/index`) 自定义按钮为 NutUI `nut-button` 组件,并保留原有视觉样式 | 855 | - 替换首页 (`src/pages/index`) 自定义按钮为 NutUI `nut-button` 组件,并保留原有视觉样式 |
| 687 | 856 | ||
| 688 | -### Removed | 857 | +--- |
| 858 | + | ||
| 859 | +**详细信息**: | ||
| 860 | +- **影响文件**: src/pages/index/index.vue, src/pages/onboarding/index.vue, src/pages/signing/index.vue, src/components/TabBar.vue | ||
| 861 | +- **技术栈**: Vue 3, Taro, TailwindCSS, NutUI | ||
| 862 | +- **测试状态**: ✅ 已通过 | ||
| 863 | + | ||
| 864 | +## [2026-01-12] - 离线功能移除 | ||
| 865 | + | ||
| 866 | +### 移除 | ||
| 689 | - 删除项目所有离线功能相关逻辑 | 867 | - 删除项目所有离线功能相关逻辑 |
| 690 | -- 移除 `src/composables/useOfflineBookingCache.js` 和 `useOfflineBookingCachePolling.js` | 868 | + - 移除 `src/composables/useOfflineBookingCache.js` 和 `useOfflineBookingCachePolling.js` |
| 691 | -- 清理 `src/app.js` 中的离线初始化代码 | 869 | + - 清理 `src/app.js` 中的离线初始化代码 |
| 692 | -- 清理 `src/utils/request.js` 中的弱网缓存拦截与提示逻辑 | 870 | + - 清理 `src/utils/request.js` 中的弱网缓存拦截与提示逻辑 |
| 693 | -- 清理 `src/pages/index/index.vue` 中的网络状态监听与离线模式代码 | 871 | + - 清理 `src/pages/index/index.vue` 中的网络状态监听与离线模式代码 |
| 694 | -- 移除 `src/utils/uiText.js` 及相关引用 | 872 | + - 移除 `src/utils/uiText.js` 及相关引用 |
| 695 | -- 移除 `src/api/index.js` 中的离线专用接口定义 | 873 | + - 移除 `src/api/index.js` 中的离线专用接口定义 |
| 696 | - 更新配置文件,移除 `ENABLE_OFFLINE_MODE` 开关 | 874 | - 更新配置文件,移除 `ENABLE_OFFLINE_MODE` 开关 |
| 875 | + | ||
| 876 | +### 修复 | ||
| 697 | - 修复构建告警:移除首页残留的 `ENABLE_OFFLINE_MODE` 与 `@/utils/uiText` 引用 | 877 | - 修复构建告警:移除首页残留的 `ENABLE_OFFLINE_MODE` 与 `@/utils/uiText` 引用 |
| 698 | 878 | ||
| 699 | -### Fixed | 879 | +--- |
| 880 | + | ||
| 881 | +**详细信息**: | ||
| 882 | +- **影响文件**: 多个文件清理 | ||
| 883 | +- **技术栈**: Vue 3, Taro | ||
| 884 | +- **测试状态**: ✅ 已通过 | ||
| 885 | + | ||
| 886 | +## [2026-01-10] - ESLint 配置修复 | ||
| 887 | + | ||
| 888 | +### 修复 | ||
| 700 | - 修复 ESLint 无法解析 Vue SFC 导致 lint 全量报错:补齐 ESLint 配置与 Vue 解析依赖 | 889 | - 修复 ESLint 无法解析 Vue SFC 导致 lint 全量报错:补齐 ESLint 配置与 Vue 解析依赖 |
| 701 | - 修复 eslint-config-taro 在 Vue 项目中触发 React Hooks 规则导致误报的问题 | 890 | - 修复 eslint-config-taro 在 Vue 项目中触发 React Hooks 规则导致误报的问题 |
| 702 | 891 | ||
| 703 | -### Changed | 892 | +--- |
| 893 | + | ||
| 894 | +**详细信息**: | ||
| 895 | +- **影响文件**: .eslintrc.js, package.json | ||
| 896 | +- **技术栈**: ESLint, Vue 3 | ||
| 897 | +- **测试状态**: ✅ 已通过 | ||
| 898 | + | ||
| 899 | +## [2026-01-08] - 文档预览优化 | ||
| 900 | + | ||
| 901 | +### 优化 | ||
| 704 | - 优化 DocumentPreview 小程序端预览策略:无法获取文件大小时默认走在线预览 | 902 | - 优化 DocumentPreview 小程序端预览策略:无法获取文件大小时默认走在线预览 |
| 705 | - 将 DocumentPreview 小程序端样式单位统一为 rpx | 903 | - 将 DocumentPreview 小程序端样式单位统一为 rpx |
| 706 | 904 | ||
| 707 | -### Added | 905 | +### 新增 |
| 708 | - 补全文档预览示例页的 Excel / PPT 在线示例链接 | 906 | - 补全文档预览示例页的 Excel / PPT 在线示例链接 |
| 907 | + | ||
| 908 | +--- | ||
| 909 | + | ||
| 910 | +**详细信息**: | ||
| 911 | +- **影响文件**: src/components/DocumentPreview.vue | ||
| 912 | +- **技术栈**: Vue 3, Taro | ||
| 913 | +- **测试状态**: ✅ 已通过 | ||
| 914 | + | ||
| 915 | +--- | ||
| 916 | + | ||
| 917 | +**最后更新**: 2026-02-01 | ||
| 918 | +**维护者**: Claude Code | ||
| 919 | +**项目**: Manulife WeApp | ... | ... |
docs/decisions.md
0 → 100644
| 1 | +# 技术决策记录 (Architecture Decision Records) | ||
| 2 | + | ||
| 3 | +> 本文档记录 Manulife WeApp 项目中的重要技术决策及其背景,帮助团队理解为什么选择当前的技术方案。 | ||
| 4 | + | ||
| 5 | +## 📋 决策记录模板 | ||
| 6 | + | ||
| 7 | +每个决策记录包含以下信息: | ||
| 8 | +- **决策日期**: 何时做出此决策 | ||
| 9 | +- **决策者**: 谁做出的决策 | ||
| 10 | +- **状态**: `提案中` | `已采纳` | `已弃用` | `已替代` | ||
| 11 | +- **背景**: 为什么需要这个决策 | ||
| 12 | +- **决策**: 具体的技术选择 | ||
| 13 | +- **原因**: 为什么选择这个方案 | ||
| 14 | +- **后果**: 采用此决策的正面和负面影响 | ||
| 15 | +- **替代方案**: 当时考虑的其他方案 | ||
| 16 | + | ||
| 17 | +--- | ||
| 18 | + | ||
| 19 | +## 🎯 已采纳的技术决策 | ||
| 20 | + | ||
| 21 | +### 1. UI 库选择:NutUI vs Vant | ||
| 22 | + | ||
| 23 | +**决策日期**: 2025-12-01 | ||
| 24 | +**决策者**: 团队 | ||
| 25 | +**状态**: ✅ 已采纳 | ||
| 26 | + | ||
| 27 | +#### 背景 | ||
| 28 | +项目需要为 Taro 小程序选择 UI 组件库,当时有两个主要选择: | ||
| 29 | +- NutUI Taro(京东出品) | ||
| 30 | +- Vant Taro(有赞出品) | ||
| 31 | + | ||
| 32 | +#### 决策 | ||
| 33 | +选择 **NutUI Taro** 作为主要 UI 组件库。 | ||
| 34 | + | ||
| 35 | +#### 原因 | ||
| 36 | +1. **Taro 生态适配更好**: NutUI 对 Taro 的支持更完善 | ||
| 37 | +2. **组件丰富**: 满足业务需求的组件更齐全 | ||
| 38 | +3. **京东背书**: 京东维护,社区活跃 | ||
| 39 | +4. **文档完善**: 中文文档详尽,便于团队上手 | ||
| 40 | + | ||
| 41 | +#### 后果 | ||
| 42 | +**正面影响**: | ||
| 43 | +- ✅ 快速搭建 UI,提升开发效率 | ||
| 44 | +- ✅ 组件样式统一,视觉一致性好 | ||
| 45 | +- ✅ 自动导入配置,无需手动 import | ||
| 46 | + | ||
| 47 | +**负面影响**: | ||
| 48 | +- ⚠️ 部分组件有样式覆盖限制(如 textarea) | ||
| 49 | +- ⚠️ 嵌套弹窗在真机有层级冲突问题 | ||
| 50 | + | ||
| 51 | +#### 替代方案 | ||
| 52 | +当时未采纳:**Vant Taro** | ||
| 53 | +- Vant 在 Web 端更流行,但 Taro 版本相对 NutUI 较弱 | ||
| 54 | + | ||
| 55 | +#### 相关文档 | ||
| 56 | +- [NutUI 组件使用陷阱](./lessons-learned.md#nutui-组件使用陷阱) | ||
| 57 | + | ||
| 58 | +--- | ||
| 59 | + | ||
| 60 | +### 2. 样式策略:TailwindCSS + Less 混合使用 | ||
| 61 | + | ||
| 62 | +**决策日期**: 2025-12-05 | ||
| 63 | +**决策者**: 团队 | ||
| 64 | +**状态**: ✅ 已采纳 | ||
| 65 | + | ||
| 66 | +#### 背景 | ||
| 67 | +项目需要一套高效的样式解决方案,既要快速开发,又要灵活定制。 | ||
| 68 | + | ||
| 69 | +#### 决策 | ||
| 70 | +采用 **TailwindCSS (80%) + Less (20%)** 混合策略。 | ||
| 71 | + | ||
| 72 | +#### 原因 | ||
| 73 | +**TailwindCSS 优势**: | ||
| 74 | +- 原子化 CSS,开发速度快 | ||
| 75 | +- 响应式设计简单(`sm:`、`md:`、`lg:`) | ||
| 76 | +- 避免命名冲突 | ||
| 77 | +- 文件体积小(按需生成) | ||
| 78 | + | ||
| 79 | +**Less 补充**: | ||
| 80 | +- 组件特定样式(需要 `scoped`) | ||
| 81 | +- 深度选择器(`:deep()`) | ||
| 82 | +- 复杂动画和伪元素 | ||
| 83 | + | ||
| 84 | +#### 后果 | ||
| 85 | +**正面影响**: | ||
| 86 | +- ✅ 开发效率提升 40%+ | ||
| 87 | +- ✅ 样式一致性更好 | ||
| 88 | +- ✅ 减少 CSS 文件数量 | ||
| 89 | + | ||
| 90 | +**负面影响**: | ||
| 91 | +- ⚠️ 需要学习 TailwindCSS 类名 | ||
| 92 | +- ⚠️ 初期有学习曲线 | ||
| 93 | + | ||
| 94 | +#### 使用指南 | ||
| 95 | +```vue | ||
| 96 | +<!-- TailwindCSS: 80% 场景 --> | ||
| 97 | +<div class="flex items-center p-4 bg-white rounded-lg"> | ||
| 98 | + <h1 class="text-xl font-bold">标题</h1> | ||
| 99 | +</div> | ||
| 100 | + | ||
| 101 | +<!-- Less: 20% 场景 --> | ||
| 102 | +<style lang="less" scoped> | ||
| 103 | +.custom-card { | ||
| 104 | + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); | ||
| 105 | + | ||
| 106 | + :deep(.nut-button) { | ||
| 107 | + background-color: rgba(255, 255, 255, 0.2); | ||
| 108 | + } | ||
| 109 | +} | ||
| 110 | +</style> | ||
| 111 | +``` | ||
| 112 | + | ||
| 113 | +#### 相关文档 | ||
| 114 | +- [样式处理策略](./lessons-learned.md#样式处理策略) | ||
| 115 | + | ||
| 116 | +--- | ||
| 117 | + | ||
| 118 | +### 3. 双设计宽度系统:375px (NutUI) + 750px (自定义) | ||
| 119 | + | ||
| 120 | +**决策日期**: 2025-12-10 | ||
| 121 | +**决策者**: 团队 | ||
| 122 | +**状态**: ✅ 已采纳 | ||
| 123 | + | ||
| 124 | +#### 背景 | ||
| 125 | +NutUI 组件库基于 375px 设计稿,但项目自定义页面使用 750px 设计稿。 | ||
| 126 | + | ||
| 127 | +#### 决策 | ||
| 128 | +实现 **双设计宽度系统**: | ||
| 129 | +- NutUI 组件 → 375px 基准 | ||
| 130 | +- 自定义页面 → 750px 基准 | ||
| 131 | + | ||
| 132 | +#### 原因 | ||
| 133 | +1. **NutUI 生态**: NutUI 组件基于 375px 设计 | ||
| 134 | +2. **传统习惯**: 750px 是移动端设计稿的传统标准 | ||
| 135 | +3. **灵活适配**: 两者并存,互不影响 | ||
| 136 | + | ||
| 137 | +#### 实现方案 | ||
| 138 | +```javascript | ||
| 139 | +// config/index.js | ||
| 140 | +const designWidth = { | ||
| 141 | + 750: [375, 375], // NutUI 组件 | ||
| 142 | + 750: [750, 750] // 其他所有页面 | ||
| 143 | +} | ||
| 144 | +``` | ||
| 145 | + | ||
| 146 | +#### 后果 | ||
| 147 | +**正面影响**: | ||
| 148 | +- ✅ NutUI 组件尺寸正确 | ||
| 149 | +- ✅ 自定义页面符合传统标准 | ||
| 150 | + | ||
| 151 | +**负面影响**: | ||
| 152 | +- ⚠️ 需要明确区分 NutUI 组件和自定义元素 | ||
| 153 | +- ⚠️ 新手可能混淆 | ||
| 154 | + | ||
| 155 | +#### 最佳实践 | ||
| 156 | +```vue | ||
| 157 | +<!-- NutUI 组件: 使用 375px 设计稿 --> | ||
| 158 | +<nut-button :custom-style="{ fontSize: '14px', padding: '8px 16px' }"> | ||
| 159 | + 按钮 | ||
| 160 | +</nut-button> | ||
| 161 | + | ||
| 162 | +<!-- 自定义元素: 使用 750px 设计稿 --> | ||
| 163 | +<view class="custom-box" style="width: 750px; height: 200px"> | ||
| 164 | + 内容 | ||
| 165 | +</view> | ||
| 166 | +``` | ||
| 167 | + | ||
| 168 | +#### 相关文档 | ||
| 169 | +- [样式处理策略 - 双设计宽度系统](./lessons-learned.md#⚠️-双设计宽度系统) | ||
| 170 | + | ||
| 171 | +--- | ||
| 172 | + | ||
| 173 | +### 4. 代码复用原则:"第 3 次出现原则" | ||
| 174 | + | ||
| 175 | +**决策日期**: 2026-01-15 | ||
| 176 | +**决策者**: Claude Code | ||
| 177 | +**状态**: ✅ 已采纳 | ||
| 178 | + | ||
| 179 | +#### 背景 | ||
| 180 | +项目中出现大量重复代码,需要制定抽取标准。 | ||
| 181 | + | ||
| 182 | +#### 决策 | ||
| 183 | +采用 **"第 3 次出现原则"(Rule of Three)**: | ||
| 184 | +- 代码出现 1-2 次:直接实现 | ||
| 185 | +- 代码出现 3 次:**必须抽取**为 Composable 或组件 | ||
| 186 | + | ||
| 187 | +#### 原因 | ||
| 188 | +1. **避免过早抽取**: 第 1、2 次可能还不稳定 | ||
| 189 | +2. **避免过度抽象**: 等待模式明确后再抽取 | ||
| 190 | +3. **提升可维护性**: 减少重复代码,统一修改点 | ||
| 191 | + | ||
| 192 | +#### 成功案例 | ||
| 193 | +- `useSectionList` - 减少约 60 行重复代码 | ||
| 194 | +- `useFileOperation` - 减少约 290 行重复代码 | ||
| 195 | +- `useListItemClick` - 统一列表点击逻辑 | ||
| 196 | + | ||
| 197 | +#### 后果 | ||
| 198 | +**正面影响**: | ||
| 199 | +- ✅ 代码重复显著减少 | ||
| 200 | +- ✅ 可维护性大幅提升 | ||
| 201 | +- ✅ 修改点统一,降低 bug 率 | ||
| 202 | + | ||
| 203 | +**负面影响**: | ||
| 204 | +- ⚠️ 需要主动识别重复代码 | ||
| 205 | +- ⚠️ 前期可能略有过度设计 | ||
| 206 | + | ||
| 207 | +#### 触发条件 | ||
| 208 | +- ✅ 代码重复 ≥ 3 次 → **必须抽取** | ||
| 209 | +- ✅ v-for 模板超过 5 行 → 提取列表项组件 | ||
| 210 | +- ✅ 函数超过 50 行 → 拆分函数 | ||
| 211 | + | ||
| 212 | +#### 相关文档 | ||
| 213 | +- [组件抽取与复用](./lessons-learned.md#组件抽取与复用) | ||
| 214 | + | ||
| 215 | +--- | ||
| 216 | + | ||
| 217 | +### 5. 认证流程:静默刷新 + Promise 单例模式 | ||
| 218 | + | ||
| 219 | +**决策日期**: 2026-01-20 | ||
| 220 | +**决策者**: 团队 | ||
| 221 | +**状态**: ✅ 已采纳 | ||
| 222 | + | ||
| 223 | +#### 背景 | ||
| 224 | +项目需要处理会话过期(401)问题,提供无感知的用户体验。 | ||
| 225 | + | ||
| 226 | +#### 决策 | ||
| 227 | +实现 **静默刷新 + Promise 单例模式**: | ||
| 228 | +- API 返回 401 时自动刷新会话 | ||
| 229 | +- 使用 Promise 单例防止并发刷新 | ||
| 230 | +- 刷新失败后跳转到认证页 | ||
| 231 | + | ||
| 232 | +#### 核心逻辑 | ||
| 233 | +```javascript | ||
| 234 | +// src/utils/authRedirect.js | ||
| 235 | + | ||
| 236 | +let auth_promise = null // Promise 单例 | ||
| 237 | + | ||
| 238 | +async function refreshSession() { | ||
| 239 | + // 如果已有刷新任务,返回现有 Promise | ||
| 240 | + if (auth_promise) { | ||
| 241 | + return auth_promise | ||
| 242 | + } | ||
| 243 | + | ||
| 244 | + // 创建新的刷新任务 | ||
| 245 | + auth_promise = doRefresh() | ||
| 246 | + .finally(() => { | ||
| 247 | + auth_promise = null // 清理单例 | ||
| 248 | + }) | ||
| 249 | + | ||
| 250 | + return auth_promise | ||
| 251 | +} | ||
| 252 | +``` | ||
| 253 | + | ||
| 254 | +#### 原因 | ||
| 255 | +1. **用户体验好**: 无需手动重新登录 | ||
| 256 | +2. **防止并发**: 单次刷新,避免多次请求 | ||
| 257 | +3. **失败兜底**: 刷新失败跳转认证页 | ||
| 258 | + | ||
| 259 | +#### 后果 | ||
| 260 | +**正面影响**: | ||
| 261 | +- ✅ 用户体验显著提升 | ||
| 262 | +- ✅ 减少登录次数 | ||
| 263 | +- ✅ 并发 401 请求共享刷新结果 | ||
| 264 | + | ||
| 265 | +**负面影响**: | ||
| 266 | +- ⚠️ 增加代码复杂度 | ||
| 267 | +- ⚠️ 需要完善的错误处理 | ||
| 268 | + | ||
| 269 | +#### 相关文档 | ||
| 270 | +- [CLAUDE.md - 身份认证流程](../CLAUDE.md#2-身份认证流程必需) | ||
| 271 | + | ||
| 272 | +--- | ||
| 273 | + | ||
| 274 | +### 6. 响应式优化:shallowRef + markRaw 处理组件对象 | ||
| 275 | + | ||
| 276 | +**决策日期**: 2026-01-25 | ||
| 277 | +**决策者**: Claude Code | ||
| 278 | +**状态**: ✅ 已采纳 | ||
| 279 | + | ||
| 280 | +#### 背景 | ||
| 281 | +Vue 3 对包含组件对象的响应式数据进行深度代理,导致性能警告。 | ||
| 282 | + | ||
| 283 | +#### 决策 | ||
| 284 | +使用 **shallowRef + markRaw** 处理组件对象响应式。 | ||
| 285 | + | ||
| 286 | +#### 核心代码 | ||
| 287 | +```javascript | ||
| 288 | +import { shallowRef, markRaw } from 'vue' | ||
| 289 | + | ||
| 290 | +// ✅ GOOD - 浅层响应式 | ||
| 291 | +const menuItems = shallowRef([ | ||
| 292 | + { | ||
| 293 | + icon: markRaw(IconFont), // 标记为原始对象 | ||
| 294 | + name: 'heart', | ||
| 295 | + title: '我的收藏' | ||
| 296 | + } | ||
| 297 | +]) | ||
| 298 | +``` | ||
| 299 | + | ||
| 300 | +#### 原因 | ||
| 301 | +1. **消除警告**: 避免 "Component that was made a reactive object" 警告 | ||
| 302 | +2. **性能优化**: 避免不必要的深度代理 | ||
| 303 | +3. **符合语义**: 组件对象不需要响应式 | ||
| 304 | + | ||
| 305 | +#### 后果 | ||
| 306 | +**正面影响**: | ||
| 307 | +- ✅ 消除性能警告 | ||
| 308 | +- ✅ 页面初始化速度提升 | ||
| 309 | +- ✅ 内存占用减少 | ||
| 310 | + | ||
| 311 | +**负面影响**: | ||
| 312 | +- ⚠️ 需要理解 Vue 3 响应式原理 | ||
| 313 | +- ⚠️ 不正确使用可能导致视图不更新 | ||
| 314 | + | ||
| 315 | +#### 相关文档 | ||
| 316 | +- [性能优化 - 响应式数据优化](./lessons-learned.md#1-响应式数据优化) | ||
| 317 | + | ||
| 318 | +--- | ||
| 319 | + | ||
| 320 | +### 7. 静态资源加载:SVG 图标使用 import 导入 | ||
| 321 | + | ||
| 322 | +**决策日期**: 2026-01-28 | ||
| 323 | +**决策者**: Claude Code | ||
| 324 | +**状态**: ✅ 已采纳 | ||
| 325 | + | ||
| 326 | +#### 背景 | ||
| 327 | +使用字符串路径加载 SVG 图标导致 500 错误。 | ||
| 328 | + | ||
| 329 | +#### 决策 | ||
| 330 | +**SVG 图标必须使用 ES6 `import` 导入**,不能使用字符串路径。 | ||
| 331 | + | ||
| 332 | +#### 核心代码 | ||
| 333 | +```javascript | ||
| 334 | +// ❌ BAD - 字符串路径导致 500 错误 | ||
| 335 | +export const getDocumentIcon = (type) => { | ||
| 336 | + const icons = { | ||
| 337 | + pdf: '/assets/images/icon/doc/doc.svg', // ❌ 500 错误 | ||
| 338 | + } | ||
| 339 | + return icons[type] | ||
| 340 | +} | ||
| 341 | + | ||
| 342 | +// ✅ GOOD - 使用 import 导入 | ||
| 343 | +import pdfIcon from '@/assets/images/icon/doc/pdf.svg' | ||
| 344 | + | ||
| 345 | +export const getDocumentIcon = (type) => { | ||
| 346 | + const icons = { | ||
| 347 | + pdf: pdfIcon, // ✅ 正确 | ||
| 348 | + } | ||
| 349 | + return icons[type] | ||
| 350 | +} | ||
| 351 | +``` | ||
| 352 | + | ||
| 353 | +#### 原因 | ||
| 354 | +1. **Taro 构建限制**: 字符串路径无法被构建工具正确处理 | ||
| 355 | +2. **资源处理**: import 方式能让构建工具正确打包资源 | ||
| 356 | +3. **类型安全**: import 方式支持类型检查 | ||
| 357 | + | ||
| 358 | +#### 后果 | ||
| 359 | +**正面影响**: | ||
| 360 | +- ✅ 图标正常加载 | ||
| 361 | +- ✅ 构建产物优化 | ||
| 362 | +- ✅ 支持路径别名 | ||
| 363 | + | ||
| 364 | +**负面影响**: | ||
| 365 | +- ⚠️ 需要手动 import 所有图标 | ||
| 366 | +- ⚠️ 动态路径需要额外处理 | ||
| 367 | + | ||
| 368 | +#### 静态资源处理规则 | ||
| 369 | +| 资源类型 | 引用方式 | | ||
| 370 | +|---------|---------| | ||
| 371 | +| **SVG 图标** | `import` 导入 | | ||
| 372 | +| **图片** | `import` 或字符串路径 | | ||
| 373 | +| **远程资源** | 字符串 URL | | ||
| 374 | + | ||
| 375 | +#### 相关文档 | ||
| 376 | +- [静态资源加载问题](./lessons-learned.md#静态资源加载问题) | ||
| 377 | + | ||
| 378 | +--- | ||
| 379 | + | ||
| 380 | +## 🔄 提案中的决策 | ||
| 381 | + | ||
| 382 | +### 8. 引入 TypeScript?(待讨论) | ||
| 383 | + | ||
| 384 | +**提案日期**: 2026-02-01 | ||
| 385 | +**状态**: 🤔 提案中 | ||
| 386 | + | ||
| 387 | +#### 背景 | ||
| 388 | +项目当前使用 JavaScript,考虑引入 TypeScript 提升代码质量。 | ||
| 389 | + | ||
| 390 | +#### 提案 | ||
| 391 | +逐步迁移到 **TypeScript**: | ||
| 392 | +1. 新文件使用 `.ts` / `.vue` + `<script lang="ts">` | ||
| 393 | +2. 旧文件逐步迁移 | ||
| 394 | +3. 定义类型定义文件(`types/`) | ||
| 395 | + | ||
| 396 | +#### 原因 | ||
| 397 | +1. **类型安全**: 减少运行时错误 | ||
| 398 | +2. **IDE 支持**: 更好的自动补全 | ||
| 399 | +3. **可维护性**: 类型即文档 | ||
| 400 | + | ||
| 401 | +#### 疑虑 | ||
| 402 | +1. **学习成本**: 团队需要学习 TS | ||
| 403 | +2. **迁移成本**: 现有代码需要改造 | ||
| 404 | +3. **构建时间**: TS 编译增加构建时间 | ||
| 405 | + | ||
| 406 | +#### 替代方案 | ||
| 407 | +- **JSDoc**: 在 JS 中添加类型注释 | ||
| 408 | +- **保持现状**: 继续使用纯 JS | ||
| 409 | + | ||
| 410 | +--- | ||
| 411 | + | ||
| 412 | +## 📊 决策统计 | ||
| 413 | + | ||
| 414 | +### 按类别统计 | ||
| 415 | +- **UI/样式**: 3 个决策(NutUI、TailwindCSS、双设计宽度) | ||
| 416 | +- **代码质量**: 2 个决策(代码复用、响应式优化) | ||
| 417 | +- **架构设计**: 2 个决策(认证流程、静态资源) | ||
| 418 | + | ||
| 419 | +### 按状态统计 | ||
| 420 | +- ✅ **已采纳**: 7 个 | ||
| 421 | +- 🤔 **提案中**: 1 个 | ||
| 422 | +- ❌ **已弃用**: 0 个 | ||
| 423 | +- 🔄 **已替代**: 0 个 | ||
| 424 | + | ||
| 425 | +--- | ||
| 426 | + | ||
| 427 | +## 📝 如何添加新决策 | ||
| 428 | + | ||
| 429 | +### 决策记录流程 | ||
| 430 | +1. **识别需求**: 发现需要技术决策的场景 | ||
| 431 | +2. **讨论方案**: 团队讨论可能的方案 | ||
| 432 | +3. **记录决策**: 在本文档中添加决策记录 | ||
| 433 | +4. **定期回顾**: 每季度回顾决策的有效性 | ||
| 434 | + | ||
| 435 | +### 决策模板 | ||
| 436 | +```markdown | ||
| 437 | +### N. 决策标题 | ||
| 438 | + | ||
| 439 | +**决策日期**: YYYY-MM-DD | ||
| 440 | +**决策者**: 姓名/角色 | ||
| 441 | +**状态**: 状态标识 | ||
| 442 | + | ||
| 443 | +#### 背景 | ||
| 444 | +描述为什么需要这个决策... | ||
| 445 | + | ||
| 446 | +#### 决策 | ||
| 447 | +具体的技术选择... | ||
| 448 | + | ||
| 449 | +#### 原因 | ||
| 450 | +为什么选择这个方案... | ||
| 451 | + | ||
| 452 | +#### 后果 | ||
| 453 | +**正面影响**: ... | ||
| 454 | +**负面影响**: ... | ||
| 455 | + | ||
| 456 | +#### 替代方案 | ||
| 457 | +当时考虑的其他方案... | ||
| 458 | + | ||
| 459 | +#### 相关文档 | ||
| 460 | +- [相关文档链接](./xxx.md) | ||
| 461 | +``` | ||
| 462 | + | ||
| 463 | +--- | ||
| 464 | + | ||
| 465 | +## 🔄 决策回顾机制 | ||
| 466 | + | ||
| 467 | +### 定期回顾 | ||
| 468 | +- **频率**: 每季度一次 | ||
| 469 | +- **参与人**: 技术负责人 + 核心开发 | ||
| 470 | +- **目的**: 评估决策有效性,必要时调整 | ||
| 471 | + | ||
| 472 | +### 更新状态 | ||
| 473 | +当决策不再适用时,更新状态: | ||
| 474 | +- `已采纳` → `已弃用`: 决策不再使用 | ||
| 475 | +- `已采纳` → `已替代`: 被新方案替代 | ||
| 476 | +- 记录替代方案和原因 | ||
| 477 | + | ||
| 478 | +--- | ||
| 479 | + | ||
| 480 | +## 📚 相关文档 | ||
| 481 | + | ||
| 482 | +- [经验教训总结](./lessons-learned.md) | ||
| 483 | +- [项目指南](../CLAUDE.md) | ||
| 484 | +- [变更日志](./CHANGELOG.md) | ||
| 485 | +- [代码注释规范](~/.claude/rules/code-commenting.md) | ||
| 486 | + | ||
| 487 | +--- | ||
| 488 | + | ||
| 489 | +**最后更新**: 2026-02-01 | ||
| 490 | +**维护者**: Claude Code | ||
| 491 | +**项目**: Manulife WeApp |
-
Please register or login to post a comment