hookehuyr

chore: 将 TODO.md、AGENTS.md、CLAUDE.md 加入 gitignore 并取消追踪

这三个文件属于本地开发辅助文档,不再纳入版本控制。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
......@@ -2,3 +2,6 @@ node_modules
.history
.swc
dist
TODO.md
AGENTS.md
CLAUDE.md
......
This diff is collapsed. Click to expand it.
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## 常用命令
```bash
pnpm dev:weapp # 开发模式(微信小程序,watch)
pnpm build:weapp # 生产构建(微信小程序)
pnpm dev:h5 # 开发模式(H5)
pnpm lint # ESLint 检查
```
包管理器:pnpm。构建产物输出到 `dist/`,微信开发者工具指向此目录。
## 技术栈
Taro 4.1.9 + Vue 3 (Composition API `<script setup>`) + NutUI 4.x + Pinia + axios-miniprogram + Less + TailwindCSS + Webpack 5
## 架构要点
### 双设计宽度体系
`config/index.js``designWidth` 函数根据文件路径判断基准:
- NutUI 组件文件(含 `@nutui`)→ 375px
- 其他所有页面/组件 → 750px
编写样式时注意:NutUI 组件按 375 设计稿,自定义组件按 750 设计稿。
### 认证流程
启动链路(`src/app.js` onLaunch):
1. `saveCurrentPagePath()` 保存当前路径到 routerStore
2. 跳过 auth 页本身
3. 若无 sessionid → `silentAuth()` 静默授权(Taro.login 获取 code → 后端 `openid_wxapp` 换 cookie)
请求链路(`src/utils/request.js` 拦截器):
1. 请求拦截:注入 cookie header、合并默认参数、GET 加时间戳
2. 响应拦截:`code === 401``refreshSession()` 静默续期 → 成功则重放原请求(`__is_retry` 防循环)→ 失败则 `navigateToAuth()` 跳授权页
3. 授权页完成后 `returnToOriginalPage()` 回跳来源页
`auth_promise` 单例锁防止并发重复授权。`navigating_to_auth` + 时间戳防重复跳转。
### HTTP 客户端
`src/utils/request.js`:axios-miniprogram 实例,baseURL 来自 `src/utils/config.js`(按 NODE_ENV 切换),超时 5s。
`src/api/fn.js`:统一请求封装。
- `fn(api)` — 标准化后端返回 `{ code, data, msg }``code === 1` 成功,失败自动 toast
- `fetch.get / fetch.post / fetch.stringifyPost / fetch.basePost` — 封装不同请求方式
### API 定义模式
```javascript
// src/api/index.js — 用 buildApiUrl(action, params) 生成 URL
// buildApiUrl 拼接:${BASE_URL}/srv/?a=${action}&f=...&client_name=...&params...
export const xxxAPI = (params) => buildApiUrl('action_name', params)
// 调用方式
import { fn, fetch } from '@/api/fn'
import { xxxAPI } from '@/api'
const res = await fn(fetch.get(xxxAPI({ key: value })))
```
### 导航
`src/hooks/useGo.js`
- `useGo()` → 返回 `go(path, query)` 函数,支持短路径(`'notice'` 自动补全为 `pages/notice/index`),自动处理 tabbar 降级
- `useReplace()` → 返回 `replace(path, query)` 函数,使用 `redirectTo`
## 路径别名
```
@/utils → src/utils @/components → src/components
@/api → src/api @/stores → src/stores
@/hooks → src/hooks @/composables → src/composables
@/images → src/assets/images @/assets → src/assets
```
## 项目结构
```
src/
├── api/ # 接口定义(index.js 用 buildApiUrl,fn.js 封装请求)
├── assets/ # 静态资源(images/、styles/、css/)
├── components/ # 通用组件
├── composables/ # Composition API hooks
├── hooks/ # useGo 等导航/工具 hooks
├── pages/ # 页面(pages/auth/index 为授权页,必须保留)
├── stores/ # Pinia stores(router.js 管理回跳路径)
└── utils/ # 核心工具(authRedirect.js、request.js、config.js)
```
## 关键约定
- 后端返回格式:`{ code: 1, data, msg }``code === 1` 为成功
- sessionid 存储在 Taro Storage,key 为 `sessionid`
- 公共请求参数(`f``client_name`)在 `src/utils/config.js``REQUEST_DEFAULT_PARAMS` 中配置
- NutUI 组件已配置自动导入(unplugin-vue-components),无需手动 import
- TailwindCSS 已禁用 preflight(`corePlugins.preflight: false`),避免与小程序冲突
- 新增页面必须同时在 `src/app.config.js` 的 pages 数组中注册
- 微信小程序 appid:`wx602d6843b145058b`
### 授权流程
完整链路(`src/utils/authRedirect.js`):
1. **启动**`app.js` onLaunch → `silentAuth()``Taro.login` 获取 code → 后端 `/srv/?a=openid` 换 cookie → 写入 `sessionid`
2. **请求 401**`request.js` 响应拦截器 → `refreshSession()` 续期 → 成功重放原请求(`__is_retry` 防循环)→ 失败 `navigateToAuth()` 跳授权页
3. **授权页**`pages/auth/index``silentAuth()``returnToOriginalPage()` 回跳
4. **防重入**`auth_promise` 单例锁防并发,`navigating_to_auth` + 时间戳防重复跳转
5. **sessionid** 存储在 `Taro Storage`,key 为 `sessionid``hasAuth()` 判断是否已授权
### 支付流程
`src/composables/useWechatMiniPay.js` 统一封装:
1. **手动测试**`pages/pay-test` → 输入 order_id → `pay_by_order_id()` → 获取支付参数 → `Taro.requestPayment`
2. **WebView 桥接**`pages/webview-preview` 内嵌 H5 → H5 跳 `pages/pay-bridge?order_id=xxx` → 自动授权 + 拉起支付 → 支付结束自动返回
3. **API**`getWechatPayParamsAPI({ order_id })` → POST `/srv/?a=pay` 获取微信支付参数(timeStamp/nonceStr/package/signType/paySign)
4. **自动授权**`pay_by_order_id``auto_auth` 选项(默认 true),未授权时先 `refresh_auth()` 再支付
5. **返回格式**`{ code, status: 'success'|'cancel'|'fail'|'auth_required'|..., msg, data }`
# 项目进度
## 当前阶段判断
当前项目已经不是“页面还没搭起来”的阶段,而是“主链路代码基本齐了,正在等真实接口和真机联调收口”的阶段。
可以先把现状理解成两部分:
- 已完成:首页、底部导航、资讯 WebView 承接、授权基础骨架、支付确认页、支付桥页,这些代码结构都已经落地。
- 未完成:真实接口值、正式配置项、授权闭环验证、支付闭环验证、历史演示链路是否下线,这些还需要继续联调和确认。
## 已完成
### 首页与内容接口
- [x] 首页页面已按 Apifox“首页”接口结构改造,当前消费 `volunteer_top_banner``volunteer_bottom_banner``volunteer_home_icon` 三组字段。
- [x] 首页 mock 已按真实接口字段结构补齐,当前图片和图标先复用现有页面假数据,避免真实接口到位后再次大范围改页面。
- [x] 首页页面已增加“当前为 mock 接口结构”的状态提示,后续真实接口出数后可直接去掉该提示。
- [x] 首页顶部 banner 已兼容“单图保持现状,多图自动切 Swiper 轮播”的展示方式,后续只需要继续确认真实返回到底是一组还是多组。
### 底部导航与 WebView
- [x] 底部导航已改成配置驱动模式,不再是页面里写死的静态 tab。
- [x] 首页、资讯、应用、我的这条导航骨架已经串起来,非首页 tab 已按 WebView 容器模式承接。
- [x] 底部导航已兼容 icon class、显隐控制,以及大于 4 个 tab 时的横向滚动展示。
### 资讯链路
- [x] 资讯 tab 已调整为和“应用 / 我的”一致的 WebView 承接模式,当前地址由底部导航配置统一控制。
- [x] `message-detail``src/api/message.js` 已从“当前线上资讯主入口”降级为旧版原生列表/详情演示参考链路。
### 授权与支付
- [x] 应用启动阶段已接入静默授权尝试、失败跳授权页、成功后保留来源页回跳的基础骨架。
- [x] 支付主链路已切到 `order_id -> useWechatMiniPay -> /srv/?a=pay` 这条共享能力链路。
- [x] `pay-confirm` 已作为正式确认支付页落地,负责展示金额并触发支付。
- [x] `pay-bridge` 已作为 H5 / WebView 发起小程序支付的桥页落地,负责自动授权、拉起支付、展示结果并返回上一页。
## 联调中 / 待确认
### 首页与内容接口
- [ ] 首页真实接口还没有返回稳定业务数据,需要继续用真实环境联调返回值。
- [x] 首页接口使用的全局默认请求参数里的 `client_id` 已确认就是正式值,当前无需再为首页单独补配。
- [ ] 继续确认 `volunteer_top_banner` 实际返回是一组还是多组;虽然页面已经兼容两种情况,但还没有拿真实数据拍板。
- [ ] 确认首页接口里的 `title``color` 后续是否启用;当前已保留字段,但页面暂未消费。
### 底部导航与 WebView
- [ ] 底部导航栏还需要联调真实配置接口,继续确认各 tab 的标题、显隐、跳转页和 WebView 地址。
- [ ] “应用”和“我的”页面还缺 2 个可用 WebView URL,提供后再完成联调。
- [ ] 资讯 tab 还需要联调真实配置接口,继续确认标题、显隐和 WebView 地址是否正确。
### 授权
- [ ] 授权功能还没有完整联调,需要确认“未授权进入页面 -> 自动或手动授权 -> 成功回跳原页面”这条闭环是否正常。
- [ ] 还需要确认静默授权失败时,跳授权页、防重复跳转、授权成功回来源页这几个分支在微信开发者工具或真机里是否都正常。
### 支付
- [ ] 支付确认页还没有完整联调,需要确认页面入参、金额展示、点击支付和状态提示是否正常。
- [ ] 支付功能还没有完整联调,需要确认支付参数获取、小程序拉起支付、支付结果返回和回跳流程是否正常。
- [ ] H5 / WebView 发起支付这条桥接链路,还需要重点验证“授权状态检查 -> 拉起支付 -> 成功 / 取消 / 失败 -> 返回上一页”是否完整闭环。
## 后续决策项
- [ ] 旧版 `message-detail``src/api/message.js` 原生列表/详情演示链路,后续再决定是继续保留为参考页,还是统一下线清理。
## 下一步最值得优先推进的事情
- [ ] 先拿到底部导航真实配置,补齐“应用 / 我的”两个 WebView 地址。
- [ ] 再用真实环境把首页接口返回值、授权回跳、支付确认、支付桥页各走一遍。
- [ ] 联调稳定后,再回头清理 mock 提示、历史演示链路和未启用字段。