docs: 更新文档说明离线预约和义工核销功能
更新 CLAUDE.md 和 README.md 文档,详细说明离线预约记录缓存、轮询机制和义工核销流程 添加弱网文案统一管理和相关页面路径说明 完善项目目录结构和优化建议
Showing
3 changed files
with
48 additions
and
11 deletions
| ... | @@ -89,10 +89,27 @@ pnpm build:h5 # 构建H5端生产包 | ... | @@ -89,10 +89,27 @@ pnpm build:h5 # 构建H5端生产包 |
| 89 | - `main.js`、`host.js`、`counter.js`:存储其他应用级全局状态 | 89 | - `main.js`、`host.js`、`counter.js`:存储其他应用级全局状态 |
| 90 | 90 | ||
| 91 | ### 离线支持 | 91 | ### 离线支持 |
| 92 | -应用实现离线二维码核心功能,逻辑如下: | 92 | +应用实现弱网/离线预约记录能力,核心逻辑如下: |
| 93 | -- 小程序启动时、网络状态变化时,调用 `qrcodeListAPI()` 获取二维码列表 | 93 | +- 离线预约记录缓存:`src/composables/useOfflineBookingCache.js`(key:`OFFLINE_BOOKING_DATA`) |
| 94 | -- 将处理后的二维码数据存储在 `OFFLINE_QR_DATA` 缓存键中 | 94 | +- 启动预加载:`src/app.js` 在合适时机调用 `refresh_offline_booking_cache()` |
| 95 | -- 离线二维码页面路径:`pages/offlineBookingCode/index` | 95 | +- 轮询刷新:`src/composables/useOfflineBookingCachePolling.js` 默认 60s 刷新一次 |
| 96 | +- 请求超时降级:`src/utils/request.js` 超时时优先跳转离线预约记录页(若存在本地缓存) | ||
| 97 | +- 页面入口: | ||
| 98 | + - 离线预约记录列表:`pages/offlineBookingList/index` | ||
| 99 | + - 离线预约记录详情:`pages/offlineBookingDetail/index` | ||
| 100 | + - 离线预约码入口:`pages/offlineBookingCode/index` | ||
| 101 | + | ||
| 102 | +### 弱网文案统一 | ||
| 103 | +弱网相关 toast/modal/banner 文案统一在 `src/utils/uiText.js` 管理,避免多处硬编码。 | ||
| 104 | + | ||
| 105 | +### 义工核销 | ||
| 106 | +义工核销流程相关页面与关键点: | ||
| 107 | +- 义工登录页:`pages/volunteerLogin/index` | ||
| 108 | + - 进入页面先调用 `getUserInfoAPI()` 做权限预检 | ||
| 109 | + - 若已具备义工权限,直接跳转核销页;否则展示登录表单 | ||
| 110 | +- 核销页:`pages/verificationResult/index` | ||
| 111 | + - 点击“核销”触发扫码并调用 `verifyTicketAPI()` 完成核销 | ||
| 112 | + - 展示核销接口返回的结果数据与状态 | ||
| 96 | 113 | ||
| 97 | ## 页面结构 | 114 | ## 页面结构 |
| 98 | 页面文件统一存放于 `src/pages/` 目录,遵循 `pages/[页面名称]/index.vue` 命名规范。 | 115 | 页面文件统一存放于 `src/pages/` 目录,遵循 `pages/[页面名称]/index.vue` 命名规范。 |
| ... | @@ -109,8 +126,11 @@ pnpm build:h5 # 构建H5端生产包 | ... | @@ -109,8 +126,11 @@ pnpm build:h5 # 构建H5端生产包 |
| 109 | - `me`:个人中心页 | 126 | - `me`:个人中心页 |
| 110 | - `search`:按身份证号查询二维码页 | 127 | - `search`:按身份证号查询二维码页 |
| 111 | - `volunteerLogin`:志愿者管理员登录页 | 128 | - `volunteerLogin`:志愿者管理员登录页 |
| 112 | -- `verificationResult`:票务核验结果页 | 129 | +- `verificationResult`:核销页 |
| 113 | -- `offlineBookingCode`:离线预约码访问页 | 130 | +- `weakNetwork`:弱网提示页 |
| 131 | +- `offlineBookingCode`:离线预约码入口页 | ||
| 132 | +- `offlineBookingList`:离线预约记录列表页 | ||
| 133 | +- `offlineBookingDetail`:离线预约记录详情页 | ||
| 114 | 134 | ||
| 115 | ## 配置说明 | 135 | ## 配置说明 |
| 116 | 136 | ... | ... |
| ... | @@ -20,10 +20,22 @@ | ... | @@ -20,10 +20,22 @@ |
| 20 | * 我的页面 (`pages/me/index`) | 20 | * 我的页面 (`pages/me/index`) |
| 21 | * 邀请码/证件号查询 (`pages/search/index`) | 21 | * 邀请码/证件号查询 (`pages/search/index`) |
| 22 | 22 | ||
| 23 | -4. **公共功能** | 23 | +4. **弱网与离线模式** |
| 24 | + * 弱网提示页 (`pages/weakNetwork/index`) | ||
| 25 | + * 离线预约记录列表 (`pages/offlineBookingList/index`) | ||
| 26 | + * 离线预约记录详情/离线二维码 (`pages/offlineBookingDetail/index`) | ||
| 27 | + * 离线预约码入口页 (`pages/offlineBookingCode/index`) | ||
| 28 | + * 离线预约缓存刷新与轮询 (`src/composables/useOfflineBookingCache.js`, `src/composables/useOfflineBookingCachePolling.js`) | ||
| 29 | + | ||
| 30 | +5. **义工核销** | ||
| 31 | + * 义工登录与权限预检 (`pages/volunteerLogin/index`) | ||
| 32 | + * 核销页(扫码核销 + 结果展示)(`pages/verificationResult/index`) | ||
| 33 | + | ||
| 34 | +6. **公共功能** | ||
| 24 | * 全局路由封装 (`hooks/useGo`) | 35 | * 全局路由封装 (`hooks/useGo`) |
| 25 | * API 请求封装 (`utils/request`, `api/index`) | 36 | * API 请求封装 (`utils/request`, `api/index`) |
| 26 | * 登录授权流程 (`pages/auth/index`) | 37 | * 登录授权流程 (`pages/auth/index`) |
| 38 | + * 弱网提示文案统一管理 (`utils/uiText.js`) | ||
| 27 | 39 | ||
| 28 | ## 技术栈 | 40 | ## 技术栈 |
| 29 | 41 | ||
| ... | @@ -39,9 +51,11 @@ | ... | @@ -39,9 +51,11 @@ |
| 39 | * `src/api`: 接口定义 | 51 | * `src/api`: 接口定义 |
| 40 | * `src/assets`: 图片等静态资源 | 52 | * `src/assets`: 图片等静态资源 |
| 41 | * `src/components`: 公共组件 (qrCode, qrCodeSearch, reserveCard等) | 53 | * `src/components`: 公共组件 (qrCode, qrCodeSearch, reserveCard等) |
| 54 | +* `src/composables`: 组合式函数 (离线缓存/轮询等) | ||
| 42 | * `src/pages`: 页面文件 | 55 | * `src/pages`: 页面文件 |
| 43 | * `src/hooks`: 组合式函数 (useGo等) | 56 | * `src/hooks`: 组合式函数 (useGo等) |
| 44 | -* `src/utils`: 工具函数 (request, tools等) | 57 | +* `src/stores`: Pinia 状态管理 (main/router 等) |
| 58 | +* `src/utils`: 工具函数 (request, authRedirect, network, uiText 等) | ||
| 45 | 59 | ||
| 46 | ## 项目运行 | 60 | ## 项目运行 |
| 47 | 61 | ||
| ... | @@ -62,9 +76,10 @@ | ... | @@ -62,9 +76,10 @@ |
| 62 | 76 | ||
| 63 | ## 优化建议 (TODO) | 77 | ## 优化建议 (TODO) |
| 64 | 78 | ||
| 65 | -* [ ] 小程序授权流程有问题 - 已处理 | 79 | +* [x] 小程序授权流程有问题 - 已处理 |
| 66 | -* [ ] 完善支付流程(目前为模拟/H5跳转)- 后端配合 | 80 | +* [ ] 完善支付流程(目前为模拟/H5跳转)- 后端配合联调 |
| 67 | * [ ] 优化图片资源加载(考虑使用 CDN 或分包)- 有离线模式看情况处理 | 81 | * [ ] 优化图片资源加载(考虑使用 CDN 或分包)- 有离线模式看情况处理 |
| 68 | -* [ ] 弱网环境下的优化, 如: 用户端可以获取当前用户的预约码, 管理端可以根据预约码核销预约码 | 82 | +* [x] 弱网环境下的离线预约记录 - 已实现(本地缓存 + 离线列表/详情) |
| 83 | +* [ ] 义工核销接口联调与核销结果字段展示优化(依赖后端返回结构稳定) | ||
| 69 | * [ ] 增强网络请求的错误处理与重试机制 | 84 | * [ ] 增强网络请求的错误处理与重试机制 |
| 70 | * [ ] 补充单元测试 | 85 | * [ ] 补充单元测试 | ... | ... |
| ... | @@ -74,6 +74,7 @@ export const use_offline_booking_cache_polling = (options) => { | ... | @@ -74,6 +74,7 @@ export const use_offline_booking_cache_polling = (options) => { |
| 74 | const start = () => { | 74 | const start = () => { |
| 75 | if (!enabled) return | 75 | if (!enabled) return |
| 76 | polling_ref_count += 1 | 76 | polling_ref_count += 1 |
| 77 | + // TAG: 每次启动轮询时,都增加引用计数 | ||
| 77 | start_offline_booking_cache_polling(options) | 78 | start_offline_booking_cache_polling(options) |
| 78 | is_running.value = true | 79 | is_running.value = true |
| 79 | } | 80 | } |
| ... | @@ -81,6 +82,7 @@ export const use_offline_booking_cache_polling = (options) => { | ... | @@ -81,6 +82,7 @@ export const use_offline_booking_cache_polling = (options) => { |
| 81 | const stop = () => { | 82 | const stop = () => { |
| 82 | if (!is_running.value) return | 83 | if (!is_running.value) return |
| 83 | polling_ref_count = Math.max(0, polling_ref_count - 1) | 84 | polling_ref_count = Math.max(0, polling_ref_count - 1) |
| 85 | + // TAG: 每次停止轮询时,都减少引用计数 | ||
| 84 | if (polling_ref_count === 0) { | 86 | if (polling_ref_count === 0) { |
| 85 | stop_offline_booking_cache_polling() | 87 | stop_offline_booking_cache_polling() |
| 86 | } | 88 | } | ... | ... |
-
Please register or login to post a comment