10 KiB
10 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
项目定位
爱上萍乡用户端微信小程序(C端),基于 uni-app + Vue 3 + TypeScript + Pinia。仅包含用户端功能,不含管理端。
技术栈
| 技术 | 版本 | 说明 |
|---|---|---|
| Vue | 3.5.x | 核心框架 |
| uni-app | 3.0.0-alpha | 跨平台框架(当前仅编译微信小程序) |
| TypeScript | 4.9.x | 类型系统 |
| Pinia | 3.x | 状态管理(仅 user store) |
| Vite | 5.2.8 | 构建工具 |
| @dcloudio/uni-ui | 1.5.x | UI 组件库(easycom 自动导入) |
| sass | 1.101.x | 样式预处理 |
运行命令
pnpm install # 安装依赖
pnpm run dev:mp-weixin # 微信小程序开发构建
pnpm run build:mp-weixin # 微信小程序生产构建
pnpm run type-check # TypeScript 类型检查(vue-tsc --noEmit)
构建产物在 dist/build/mp-weixin/,用微信开发者工具导入此目录。
目录结构
src/
├── api/ # API 接口层
│ ├── request.ts # HTTP 封装(uni.request + Token 注入 + 401 处理)
│ ├── types.ts # 公共类型定义
│ ├── user.ts # 微信登录(两种方式)
│ ├── card.ts # 年卡接口
│ └── order.ts # 订单接口
├── components/ # 公共组件
│ ├── mc-glass.vue # 毛玻璃卡片
│ ├── card-item.vue # 年卡列表项
│ ├── empty-state.vue # 空状态占位
│ ├── announcement-modal.vue # 公告弹窗
│ ├── confirm-modal.vue # 确认弹窗
│ ├── design-button.vue # 设计系统按钮
│ ├── design-card.vue # 设计系统卡片
│ ├── design-input.vue # 设计系统输入框
│ └── section-label.vue # 区块标题
├── config/
│ └── index.ts # API_BASE / TOKEN_KEY / 环境变量
├── mock/ # Mock 数据(VITE_USE_MOCK=true 时启用)
│ ├── index.ts # USE_MOCK 开关
│ ├── images.ts # 图片 URL
│ ├── notice.ts # 公告数据
│ ├── scenic.ts # 景区列表数据
│ └── scenic-detail.ts # 景区详情数据
├── pages/ # 主包页面
│ ├── index/index.vue # 首页(轮播 + 热门景区 + 精选活动)
│ ├── qrcode/index.vue # 入园码(tabBar 旅游卡)
│ ├── login/login.vue # 登录页(微信手机号授权)
│ ├── login/agreement.vue # 服务条款
│ ├── login/privacy.vue # 隐私条款
│ └── profile/index.vue # 个人中心(tabBar)
├── packages/user/ # 分包:用户相关(年卡、订单、预约)
│ ├── api/
│ │ ├── card.ts # 年卡 API
│ │ └── order.ts # 订单 API
│ ├── pages/
│ │ ├── card/list.vue # 年卡列表
│ │ ├── card/detail.vue # 年卡详情
│ │ ├── card/buy.vue # 年卡购买
│ │ ├── card/activate.vue # 年卡激活
│ │ ├── card/qrcode.vue # 入园码
│ │ ├── card/bind.vue # 年卡绑定
│ │ ├── bind.vue # 绑卡激活
│ │ ├── buy.vue # 超级玩家卡购买
│ │ ├── union-buy.vue # 工会购买
│ │ ├── card-notice.vue # 用卡须知
│ │ ├── order/list.vue # 订单列表
│ │ ├── order/detail.vue # 订单详情
│ │ ├── reserve/index.vue # 景区预约
│ │ ├── reserve/success.vue # 预约成功/详情
│ │ └── reserve/list.vue # 预约/使用记录
│ └── mock/
│ └── order.ts # 订单 mock 数据
├── packages/content/ # 分包:内容展示(景区、公告、帮助)
│ └── pages/
│ ├── scenic-list.vue # 景区列表(custom navbar)
│ ├── scenic-detail.vue # 景区详情
│ ├── notice-list.vue # 通知公告
│ ├── usage-guide.vue # 使用说明
│ └── faq.vue # 常见问题
├── store/
│ └── user.ts # 用户状态(token 持久化 + 登录判断)
├── styles/ # 设计系统样式
│ ├── main.scss # 入口(全局样式)
│ ├── _tokens.scss # 设计令牌(对齐 uni.scss)
│ ├── _mixins.scss # 混入(text-display / text-body / text-mono 等)
│ ├── _animations.scss # 动画
│ └── _utilities.scss # 工具类
├── static/ # 静态资源(tabBar 图标、logo 等)
├── utils/
│ └── index.ts # 工具函数(showToast / navigateTo 等)
├── App.vue # 根组件(隐私协议检查)
├── main.ts # 入口(createSSRApp + Pinia)
├── manifest.json # uni-app 配置(AppID)
├── pages.json # 路由 + tabBar + 分包 + easycom
└── uni.scss # 全局 SCSS 变量(自动注入到每个组件)
架构设计
分层
页面(.vue) → API 层(api/*.ts) → request.ts → uni.request → 后端
↕
Store(store/user.ts) ← 仅管理 token + 登录状态
- 页面直接调用 API,不经过 store(年卡、订单等模块)
- 只有 user 模块使用 store,因为需要跨页面共享 token 和登录状态
- request.ts 统一处理 Token 注入、401 跳转、响应格式解析(兼容
code/errcode两种业务状态码)
路由
- 3 个 tabBar 页面:首页、旅游卡(入园码)、我的
- 主包:首页、登录、隐私/服务条款、个人中心
- 分包
packages/user:年卡、订单、预约功能 - 分包
packages/content:景区列表/详情、公告、使用说明、FAQ
微信登录
两种登录方式并存:
- OAuth2 登录(当前使用):
wx.login()→encryptedData+iv→POST /open-api/auth/oauth2→ 返回openId作为 token - 手机号登录(旧方式):
button[open-type=getPhoneNumber]→phoneCode+loginCode→POST /mp-api/auth/wx-login
后端对接
- 后端项目:
jxxx-dscp(Spring Boot 2.7 + MyBatis-Plus) - 路由渠道:
RouteChannel.MP_API(/mp-api) - 认证方式:Bearer Token(
Authorization: Bearer {accessToken}) - 响应格式:
{ code, msg, data, errcode, errmsg }(code === 200或errcode === 0视为成功) - 用户表:
member表,channel = 99(Channel_CY,产研小程序) - Token 表:
system_oauth2_access_token,clientId = "mp-99"
Mock 系统
通过环境变量 VITE_USE_MOCK=true 启用。各页面在 onLoad 中检查 USE_MOCK 标志,为 true 时直接从 mock 文件渲染数据,不发起网络请求。
设计系统
样式体系基于 uv-ui 设计系统(uv-* 变量命名),通过 uni.scss 全局注入 SCSS 变量,每个组件无需额外 import 即可使用。
核心变量
| 类别 | 变量前缀 | 示例 |
|---|---|---|
| 品牌色 | $uv-primary / $color-accent |
#3c9cff |
| 语义色 | $uv-error / $uv-success / $uv-warning |
红/绿/橙 |
| 中性色 | $uv-main-color / $uv-bg-color / $uv-border-color |
黑/灰/白 |
| 字体 | $font-family-display / $font-family-body |
思源宋体 / PingFang |
| 字号 | $font-size-* |
xxs: 18rpx ~ display: 72rpx |
| 间距 | $spacing-* |
0 ~ 160rpx |
| 圆角 | $radius-* |
sm: 8rpx ~ full: 9999rpx |
| 阴影 | $shadow-* |
sm ~ xl + accent |
字体
- 展示字体:
SourceHanSerifCN(思源宋体),用于标题 - 正文字体:系统字体栈(
-apple-system, PingFang SC, Helvetica Neue) - 等宽字体:
Menlo, Monaco, Courier New
样式文件
uni.scss— source of truth,自动注入到每个组件src/styles/_tokens.scss— 兼容层,对齐uni.scss的值,供main.scss使用src/styles/main.scss— 全局样式入口,在App.vue中通过@use导入- 另外还有
_mixins.scss、_animations.scss、_utilities.scss
环境配置
| 文件 | API 地址 | 用途 |
|---|---|---|
.env.local |
http://localhost:48080 |
本地开发(配合后端 local profile) |
.env.dev |
https://dscp-dev.hn12301.net |
开发环境 |
.env.uat |
https://dscp-uat.hn12301.net |
UAT 测试 |
Git 远程
gitee→https://gitee.com/jacobxu666/zhy-mp-test.git(唯一远程,main跟踪此分支)- 当前分支:
xuchao
开发注意事项
- API 前缀:所有接口走
/mp-api(不是/manage-api,那是管理后台) - Token 管理:
app_token存在uni.storage中,通过request.ts的getToken/setToken/removeToken管理 - 分包策略:年卡/订单/预约放
packages/user,景区内容放packages/content,主包仅放首页/登录/个人中心/入园码 - 条件编译:
#ifdef MP-WEIXIN包裹微信特有逻辑 - 隐私协议:
App.vue中wx.getPrivacySetting检查,未同意前不能调授权 API - 微信开发者工具调试:需勾选「不校验合法域名」才能请求 localhost
- Mock 模式:设置
VITE_USE_MOCK=true可离线开发,不依赖后端 - 样式对齐:
uni.scss是设计令牌的 source of truth,src/styles/_tokens.scss仅供main.scss兼容使用,新增样式变量优先在uni.scss中定义