hookehuyr

docs: 重写 AGENTS.md 和 README.md 项目文档

- AGENTS.md 精简 Codex 协作说明,聚焦扫码打卡链路等既有约定
- README.md 补充核心功能、目录结构、开发命令等项目描述

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
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 +- 如果只是调整扫码详情页底部按钮视觉位置,优先改样式,不要顺手改业务逻辑
......