hookehuyr

docs: 添加技术决策记录和优化 CHANGELOG 格式

新增:
- 创建 docs/decisions.md 技术决策记录文档
  - 记录 7 个已采纳的技术决策(UI 库选择、样式策略等)
  - 包含决策背景、原因、后果和替代方案
  - 提供决策模板和回顾机制

优化:
- 统一 CHANGELOG.md 格式,添加标准模板
  - 在顶部添加变更记录模板和使用说明
  - 添加快速统计信息(总变更数、分类统计)
  - 将历史记录统一为标准格式([YYYY-MM-DD] - 简短描述)
  - 为所有记录添加详细信息部分(影响文件、技术栈、测试状态)

这些改进提升了文档的可维护性和可读性,便于团队理解技术选型背景和追踪项目变更历史。
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
......
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