docs: 重写 AGENTS.md 和 README.md 项目文档
- AGENTS.md 精简 Codex 协作说明,聚焦扫码打卡链路等既有约定 - README.md 补充核心功能、目录结构、开发命令等项目描述 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Showing
2 changed files
with
180 additions
and
26 deletions
This diff is collapsed. Click to expand it.
| 1 | -## 项目介绍 | 1 | +# lls_program |
| 2 | 2 | ||
| 3 | -基于Taro4的微信小程序模版,集成了常用的功能,如登录、注册、列表、详情、购物车等。 | 3 | +`lls_program` 是一个基于 Taro 4 + Vue 3 + NutUI 的微信小程序项目,当前业务围绕家庭管理、活动参与、积分奖励,以及海报/扫码打卡展开。 |
| 4 | + | ||
| 5 | +这不是一个通用模板仓库。当前代码里已经有比较明确的业务结构,尤其是扫码打卡链路、资料补全链路、家庭创建/加入链路,后续开发建议直接沿用现有实现方式,而不是重新搭一套平行流程。 | ||
| 4 | 6 | ||
| 5 | ## 技术栈 | 7 | ## 技术栈 |
| 6 | 8 | ||
| 7 | -- Taro4 | 9 | +- Taro `4.1.7` |
| 8 | -- Vue3 | 10 | +- Vue `3.3` |
| 9 | -- TypeScript | 11 | +- NutUI Taro `4.3.13` |
| 10 | -- Pinia | 12 | +- Pinia `3.0` |
| 13 | +- TailwindCSS `3.4` | ||
| 11 | - Less | 14 | - Less |
| 15 | +- axios-miniprogram | ||
| 16 | +- Vitest | ||
| 17 | + | ||
| 18 | +## 核心功能 | ||
| 19 | + | ||
| 20 | +- 微信小程序登录与静默授权 | ||
| 21 | +- 家庭创建、加入、家庭资料维护 | ||
| 22 | +- 用户资料补全与注册来源归因 | ||
| 23 | +- 活动详情、海报打卡、扫码打卡 | ||
| 24 | +- 积分、奖励、优惠券相关页面 | ||
| 25 | +- 地理位置相关能力与位置权限接入 | ||
| 26 | + | ||
| 27 | +## 当前重点业务链路 | ||
| 28 | + | ||
| 29 | +### 扫码打卡 | ||
| 30 | + | ||
| 31 | +当前扫码打卡已接入真实接口,主要页面和工具如下: | ||
| 32 | + | ||
| 33 | +- 列表页:`src/pages/ScanCheckinList/index.vue` | ||
| 34 | +- 详情页:`src/pages/ScanCheckinDetail/index.vue` | ||
| 35 | +- API:`src/api/map.js` | ||
| 36 | +- 地理围栏:`src/utils/checkinLocation.js` | ||
| 37 | +- 扫码参数解析:`src/utils/scanCheckin.js` | ||
| 38 | +- 回跳参数处理:`src/utils/returnUrl.js` | ||
| 39 | +- 富文本渲染:`src/components/RichTextRenderer.vue` | ||
| 40 | + | ||
| 41 | +当前流程: | ||
| 42 | + | ||
| 43 | +1. 用户进入扫码打卡详情页 | ||
| 44 | +2. 点击“扫码打卡”时先检查是否已有家庭 | ||
| 45 | +3. 没有家庭则提示后跳转 `Welcome` | ||
| 46 | +4. `Welcome -> AddProfile -> Welcome -> CreateFamily/JoinFamily -> 原详情页` | ||
| 47 | +5. 返回详情页后再次扫码 | ||
| 48 | +6. 若关卡启用地理围栏,先重新静默获取当前位置并判断范围 | ||
| 49 | +7. 调起微信扫码 | ||
| 50 | +8. 从二维码结果中解析真实的 `activity_id` / `detail_id` | ||
| 51 | +9. 调用真实打卡接口 | ||
| 52 | +10. 成功后跳到扫码关卡列表页 | ||
| 53 | + | ||
| 54 | +补充约定: | ||
| 55 | + | ||
| 56 | +- 打卡参数来自二维码内容,不来自当前页面路由参数 | ||
| 57 | +- 注册来源归因目前通过 `reg_source`、`reg_stage_id` 透传 | ||
| 58 | +- `reg_activity_id` 已经不再使用 | ||
| 59 | +- `return_url` 回跳统一通过 `src/utils/returnUrl.js` 处理 | ||
| 12 | 60 | ||
| 13 | ## 项目结构 | 61 | ## 项目结构 |
| 14 | 62 | ||
| 15 | -- src | 63 | +```text |
| 16 | - - api:请求接口 | 64 | +src/ |
| 17 | - - assets:静态资源 | 65 | +├── api/ # 接口定义,只放请求相关代码 |
| 18 | - - components:全局组件 | 66 | +├── assets/ # 静态资源 |
| 19 | - - config:项目配置 | 67 | +├── components/ # 通用组件 |
| 20 | - - pages:页面 | 68 | +├── pages/ # 页面 |
| 21 | - - stores:状态管理 | 69 | +├── stores/ # Pinia 状态管理 |
| 22 | - - utils:工具函数 | 70 | +├── utils/ # 工具函数、流程辅助 |
| 23 | - - app.config.js:项目配置 | 71 | +├── app.config.js # 页面注册、权限声明 |
| 24 | - - app.js:应用入口 | 72 | +└── app.less # 全局样式 |
| 25 | - - app.less:全局样式 | 73 | +``` |
| 26 | -- taro.config.js:Taro配置 | 74 | + |
| 27 | -- tsconfig.json:TypeScript配置 | 75 | +几个常用目录说明: |
| 28 | -- package.json:依赖配置 | 76 | + |
| 29 | - | 77 | +- `src/api/user.js`:用户认证、资料接口 |
| 30 | -## 项目运行 | 78 | +- `src/api/family.js`:家庭相关接口 |
| 31 | - | 79 | +- `src/api/map.js`:地图、扫码关卡、扫码打卡相关接口 |
| 32 | -1. 安装依赖 | 80 | +- `src/utils/request.js`:请求拦截器、`sessionid` 注入 |
| 81 | +- `src/utils/userProfile.js`:资料相关 helper | ||
| 82 | +- `src/components/RichTextRenderer.vue`:富文本渲染组件 | ||
| 83 | + | ||
| 84 | +## 开发约定 | ||
| 85 | + | ||
| 86 | +### API 与 helper 分层 | ||
| 87 | + | ||
| 88 | +- `src/api/*.js` 只放接口调用 | ||
| 89 | +- 参数拼装、字段解析、距离计算、回跳处理等逻辑放 `src/utils/` | ||
| 90 | + | ||
| 91 | +例如: | ||
| 92 | + | ||
| 93 | +- `buildUpdateUserProfilePayload` 在 `src/utils/userProfile.js` | ||
| 94 | +- 扫码结果解析在 `src/utils/scanCheckin.js` | ||
| 95 | +- 地理围栏判断在 `src/utils/checkinLocation.js` | ||
| 96 | + | ||
| 97 | +### 请求返回判断 | ||
| 98 | + | ||
| 99 | +所有接口都要显式判断: | ||
| 100 | + | ||
| 101 | +```javascript | ||
| 102 | +if (res.code === 1) { | ||
| 103 | + // success | ||
| 104 | +} | ||
| 105 | +``` | ||
| 106 | + | ||
| 107 | +不要写成: | ||
| 108 | + | ||
| 109 | +```javascript | ||
| 110 | +if (res.code) { | ||
| 111 | + // 不推荐 | ||
| 112 | +} | ||
| 113 | +``` | ||
| 114 | + | ||
| 115 | +### 小程序环境约束 | ||
| 116 | + | ||
| 117 | +页面里不要使用浏览器 API: | ||
| 118 | + | ||
| 119 | +- `window` | ||
| 120 | +- `document` | ||
| 121 | +- `localStorage` | ||
| 122 | +- 原生 `fetch` | ||
| 123 | + | ||
| 124 | +统一使用 Taro API: | ||
| 125 | + | ||
| 126 | +- `Taro.navigateTo` | ||
| 127 | +- `Taro.redirectTo` | ||
| 128 | +- `Taro.switchTab` | ||
| 129 | +- `Taro.scanCode` | ||
| 130 | +- `Taro.getLocation` | ||
| 131 | + | ||
| 132 | +### 页面生命周期 | ||
| 133 | + | ||
| 134 | +页面优先使用 Taro 提供的生命周期: | ||
| 135 | + | ||
| 136 | +- `useLoad` | ||
| 137 | +- `useShow` | ||
| 138 | +- `useDidShow` | ||
| 139 | +- `useReady` | ||
| 140 | + | ||
| 141 | +## 登录与认证 | ||
| 142 | + | ||
| 143 | +项目当前通过 `sessionid` 维持服务端登录态: | ||
| 144 | + | ||
| 145 | +- 从 storage 读取 `sessionid` | ||
| 146 | +- 在请求拦截器中注入到 `cookie` | ||
| 147 | +- 401 交给现有授权/跳转逻辑处理 | ||
| 148 | + | ||
| 149 | +需要注意: | ||
| 150 | + | ||
| 151 | +- `sessionid` 只是认证凭证 | ||
| 152 | +- 它不等于“用户一定能继续后续业务流程” | ||
| 153 | +- 业务上是否可继续,仍要结合资料、家庭、活动规则等条件判断 | ||
| 154 | + | ||
| 155 | +## 本地开发 | ||
| 156 | + | ||
| 157 | +### 安装依赖 | ||
| 33 | 158 | ||
| 34 | ```bash | 159 | ```bash |
| 35 | npm install | 160 | npm install |
| 36 | ``` | 161 | ``` |
| 37 | 162 | ||
| 38 | -2. 运行项目 | 163 | +### 微信小程序开发 |
| 39 | 164 | ||
| 40 | ```bash | 165 | ```bash |
| 41 | npm run dev:weapp | 166 | npm run dev:weapp |
| 42 | ``` | 167 | ``` |
| 43 | 168 | ||
| 44 | -3. 打包项目 | 169 | +### 微信小程序构建 |
| 45 | 170 | ||
| 46 | ```bash | 171 | ```bash |
| 47 | npm run build:weapp | 172 | npm run build:weapp |
| 48 | ``` | 173 | ``` |
| 174 | + | ||
| 175 | +### 其他常用命令 | ||
| 176 | + | ||
| 177 | +```bash | ||
| 178 | +npm run dev:h5 | ||
| 179 | +npm run dev:alipay | ||
| 180 | +npm run dev:tt | ||
| 181 | +npm run lint | ||
| 182 | +npm run format | ||
| 183 | +npm run test:run | ||
| 184 | +``` | ||
| 185 | + | ||
| 186 | +## 页面注册与权限 | ||
| 187 | + | ||
| 188 | +页面统一在 `src/app.config.js` 中注册。 | ||
| 189 | + | ||
| 190 | +当前已经声明位置相关能力: | ||
| 191 | + | ||
| 192 | +- `requiredPrivateInfos: ['getLocation']` | ||
| 193 | +- `permission.scope.userLocation` | ||
| 194 | + | ||
| 195 | +这也是扫码打卡地理围栏能力能直接接上的基础配置。 | ||
| 196 | + | ||
| 197 | +## 备注 | ||
| 198 | + | ||
| 199 | +- NutUI 组件是自动导入的,不需要手动 import | ||
| 200 | +- `ScanCheckinDetail` 顶部 banner 现在使用 NutUI `nut-swiper` | ||
| 201 | +- `ScanCheckinDetail` 富文本展示统一使用 `RichTextRenderer` | ||
| 202 | +- 如果只是调整扫码详情页底部按钮视觉位置,优先改样式,不要顺手改业务逻辑 | ... | ... |
-
Please register or login to post a comment