diff --git a/uniapp/README.md b/uniapp/README.md new file mode 100644 index 0000000..b7a328d --- /dev/null +++ b/uniapp/README.md @@ -0,0 +1,101 @@ +# 学业邑规划 - 小程序前端 + +## 项目概述 + +基于 UniApp + Vue 3 + TypeScript 开发的微信小程序,提供多元智能测评和学业规划服务。 + +## 技术栈 + +| 技术 | 版本 | 说明 | +|------|------|------| +| UniApp | 3.x | 跨平台框架 | +| Vue | 3.x | 前端框架 | +| TypeScript | 5.x | 类型系统 | +| Pinia | 2.x | 状态管理 | +| uni-ui | latest | UI 组件库 | +| Sass | latest | CSS 预处理器 | + +## 快速开始 + +```bash +# 安装依赖 +npm install + +# 开发模式(微信小程序) +npm run dev:mp-weixin + +# 构建生产版本 +npm run build:mp-weixin +``` + +## 项目结构 + +``` +uniapp/ +├── src/ +│ ├── api/ # API 接口 +│ │ ├── request.ts # 请求封装 +│ │ ├── user.ts # 用户接口 +│ │ ├── home.ts # 首页接口 +│ │ ├── assessment.ts # 测评接口 +│ │ ├── order.ts # 订单接口 +│ │ ├── planner.ts # 规划师接口 +│ │ └── invite.ts # 分销接口 +│ ├── components/ # 公共组件 +│ │ ├── common/ # 通用组件 +│ │ └── business/ # 业务组件 +│ ├── composables/ # 组合式函数 +│ │ ├── useAuth.ts # 认证相关 +│ │ ├── usePayment.ts # 支付相关 +│ │ └── useShare.ts # 分享相关 +│ ├── pages/ # 页面 +│ │ ├── index/ # 首页(TabBar) +│ │ ├── team/ # 团队(TabBar) +│ │ ├── mine/ # 我的(TabBar) +│ │ ├── login/ # 登录 +│ │ ├── assessment/ # 测评相关 +│ │ ├── order/ # 订单相关 +│ │ ├── planner/ # 学业规划 +│ │ ├── invite/ # 邀请分销 +│ │ └── about/ # 关于/协议 +│ ├── static/ # 静态资源 +│ │ ├── images/ # 图片 +│ │ └── icons/ # 图标 +│ ├── stores/ # Pinia 状态管理 +│ │ ├── user.ts # 用户状态 +│ │ └── app.ts # 应用状态 +│ ├── styles/ # 全局样式 +│ │ ├── variables.scss # 变量定义 +│ │ ├── mixins.scss # 混入 +│ │ └── common.scss # 通用样式 +│ ├── types/ # 类型定义 +│ │ ├── api.d.ts # API 类型 +│ │ ├── user.d.ts # 用户类型 +│ │ └── assessment.d.ts # 测评类型 +│ ├── utils/ # 工具函数 +│ │ ├── storage.ts # 本地存储 +│ │ ├── format.ts # 格式化 +│ │ └── validate.ts # 验证 +│ ├── App.vue # 根组件 +│ ├── main.ts # 入口文件 +│ ├── manifest.json # 应用配置 +│ ├── pages.json # 页面配置 +│ └── uni.scss # uni-app 样式变量 +├── package.json +├── tsconfig.json +├── vite.config.ts +└── README.md +``` + +## 相关文档 + +- [开发规范](./docs/开发规范.md) +- [页面清单](./docs/页面清单.md) +- [组件文档](./docs/组件文档.md) +- [API 文档](./docs/API文档.md) + +## 设计资源 + +- Figma 设计图:https://www.figma.com/design/88edYGASUcyID6afiwILdf/项目?node-id=432-1991 +- 本地设计图:`docs/设计图/` +- 切图资源:`docs/切图/` diff --git a/uniapp/docs/API文档.md b/uniapp/docs/API文档.md new file mode 100644 index 0000000..c2d4bb7 --- /dev/null +++ b/uniapp/docs/API文档.md @@ -0,0 +1,920 @@ +# 学业邑规划 - 小程序 API 文档 + +本文档定义了小程序端调用的所有后端接口。 + +--- + +## 一、接口规范 + +### 1.1 基础信息 + +| 项目 | 说明 | +|------|------| +| 基础地址 | 开发环境:`http://localhost:5000`
生产环境:`https://api.example.com` | +| 请求方式 | GET / POST | +| 数据格式 | JSON | +| 认证方式 | Bearer Token | + +### 1.2 请求头 + +``` +Content-Type: application/json +Authorization: Bearer {token} +``` + +### 1.3 响应格式 + +```json +{ + "code": 0, + "message": "success", + "data": {} +} +``` + +### 1.4 错误码 + +| 错误码 | 说明 | +|--------|------| +| 0 | 成功 | +| 1001 | 参数错误 | +| 1002 | 未登录 | +| 1003 | 登录已过期 | +| 1004 | 无权限 | +| 2001 | 业务错误 | +| 5000 | 系统错误 | + +--- + +## 二、用户模块 + +### 2.1 微信登录 + +**接口**:`POST /api/user/login` + +**描述**:微信小程序登录 + +**请求参数**: +```typescript +interface LoginRequest { + /** 微信 code */ + code: string + /** 加密手机号数据 */ + encryptedData: string + /** 加密向量 */ + iv: string + /** 邀请人ID(可选) */ + inviteUserId?: number +} +``` + +**响应数据**: +```typescript +interface LoginResponse { + /** 访问令牌 */ + token: string + /** 刷新令牌 */ + refreshToken: string + /** 用户信息 */ + userInfo: UserInfo +} + +interface UserInfo { + id: number + uid: string + nickname: string + avatar: string + phone: string + userLevel: number // 1普通用户 2合伙人 3渠道合伙人 + createTime: string +} +``` + +--- + +### 2.2 获取用户信息 + +**接口**:`GET /api/user/getProfile` + +**描述**:获取当前登录用户信息 + +**响应数据**: +```typescript +interface UserInfo { + id: number + uid: string + nickname: string + avatar: string + phone: string + userLevel: number + balance: number // 可提现余额 + totalIncome: number // 累计收益 + createTime: string +} +``` + +--- + +### 2.3 更新用户信息 + +**接口**:`POST /api/user/updateProfile` + +**描述**:更新用户昵称 + +**请求参数**: +```typescript +interface UpdateProfileRequest { + nickname: string +} +``` + +**响应数据**:`boolean` + +--- + +### 2.4 更新头像 + +**接口**:`POST /api/user/updateAvatar` + +**描述**:更新用户头像 + +**请求参数**: +```typescript +interface UpdateAvatarRequest { + /** 头像文件(Base64 或 URL) */ + avatar: string +} +``` + +**响应数据**: +```typescript +interface UpdateAvatarResponse { + /** 新头像 URL */ + avatarUrl: string +} +``` + +--- + +## 三、首页模块 + +### 3.1 获取 Banner 列表 + +**接口**:`GET /api/home/getBannerList` + +**描述**:获取首页轮播图列表 + +**响应数据**: +```typescript +interface BannerItem { + id: number + title: string + imageUrl: string + linkType: number // 0无跳转 1内部页面 2外部链接 3小程序 + linkUrl: string + appId?: string // 小程序 AppId +} + +type Response = BannerItem[] +``` + +--- + +### 3.2 获取测评入口列表 + +**接口**:`GET /api/home/getAssessmentList` + +**描述**:获取测评类型列表 + +**响应数据**: +```typescript +interface AssessmentType { + id: number + name: string + code: string + imageUrl: string + price: number + status: number // 0已下线 1已上线 2即将上线 +} + +type Response = AssessmentType[] +``` + +--- + +### 3.3 获取宣传图列表 + +**接口**:`GET /api/home/getPromotionList` + +**描述**:获取首页底部宣传图 + +**响应数据**: +```typescript +interface PromotionItem { + id: number + title: string + imageUrl: string +} + +type Response = PromotionItem[] +``` + +--- + +## 四、团队模块 + +### 4.1 获取团队介绍 + +**接口**:`GET /api/team/getInfo` + +**描述**:获取团队介绍图片 + +**响应数据**: +```typescript +interface TeamInfo { + images: string[] // 图片列表 +} +``` + +--- + +## 五、测评模块 + +### 5.1 获取测评介绍 + +**接口**:`GET /api/assessment/getIntro` + +**描述**:获取测评介绍内容(基本信息页顶部) + +**请求参数**: +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| typeId | number | 是 | 测评类型ID | + +**响应数据**: +```typescript +interface AssessmentIntro { + /** 介绍内容(富文本或图片URL) */ + content: string + /** 内容类型:text / image */ + contentType: string + /** 测评价格 */ + price: number +} +``` + +--- + +### 5.2 获取题目列表 + +**接口**:`GET /api/assessment/getQuestionList` + +**描述**:获取测评题目列表 + +**请求参数**: +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| typeId | number | 是 | 测评类型ID | + +**响应数据**: +```typescript +interface Question { + id: number + questionNo: number + content: string +} + +type Response = Question[] +``` + +--- + +### 5.3 提交测评答案 + +**接口**:`POST /api/assessment/submitAnswers` + +**描述**:提交测评答案 + +**请求参数**: +```typescript +interface SubmitAnswersRequest { + /** 测评记录ID */ + recordId: number + /** 答案列表 */ + answers: { + questionId: number + answerValue: number // 1-10 + }[] +} +``` + +**响应数据**: +```typescript +interface SubmitAnswersResponse { + /** 是否提交成功 */ + success: boolean + /** 报告预计生成时间(秒) */ + estimatedTime: number +} +``` + +--- + +### 5.4 查询报告生成状态 + +**接口**:`GET /api/assessment/getResultStatus` + +**描述**:查询测评报告生成状态 + +**请求参数**: +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| recordId | number | 是 | 测评记录ID | + +**响应数据**: +```typescript +interface ResultStatus { + /** 状态:1待测评 2测评中 3生成中 4已完成 */ + status: number + /** 是否完成 */ + isCompleted: boolean +} +``` + +--- + +### 5.5 获取测评结果 + +**接口**:`GET /api/assessment/getResult` + +**描述**:获取测评报告详情 + +**请求参数**: +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| recordId | number | 是 | 测评记录ID | + +**响应数据**: +```typescript +interface AssessmentResult { + /** 基本信息 */ + basicInfo: { + name: string + age: number + educationStage: string + testDate: string + } + /** 八大智能分析 */ + intelligenceAnalysis: { + items: IntelligenceItem[] + topTwo: IntelligenceConclusion[] + bottomTwo: IntelligenceConclusion[] + } + /** 个人特质分析 */ + traitAnalysis: { + items: TraitItem[] + topConclusion: string + } + /** 40项细分能力 */ + abilityAnalysis: { + groups: AbilityGroup[] + topTen: AbilityItem[] + bottomTen: AbilityItem[] + } + /** 其他分析... */ +} + +interface IntelligenceItem { + name: string + code: string + score: number + maxScore: number + percentage: number + rank: number +} + +interface IntelligenceConclusion { + name: string + rank: number + rankName: string // 最强五星 / 较强五星 / 相对较弱 + conclusion: string +} +``` + +--- + +### 5.6 验证邀请码 + +**接口**:`POST /api/assessment/verifyInviteCode` + +**描述**:验证测评邀请码 + +**请求参数**: +```typescript +interface VerifyInviteCodeRequest { + /** 邀请码(5位大写字母) */ + code: string +} +``` + +**响应数据**: +```typescript +interface VerifyInviteCodeResponse { + /** 是否有效 */ + isValid: boolean + /** 错误信息(无效时) */ + errorMessage?: string // "邀请码有误" / "邀请码已被使用" + /** 邀请码ID(有效时) */ + inviteCodeId?: number +} +``` + +--- + +### 5.7 获取往期测评列表 + +**接口**:`GET /api/assessment/getHistoryList` + +**描述**:获取用户的往期测评记录 + +**请求参数**: +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| page | number | 否 | 页码,默认1 | +| pageSize | number | 否 | 每页数量,默认20 | + +**响应数据**: +```typescript +interface AssessmentHistory { + id: number + orderNo: string + assessmentName: string + status: number // 3生成中 4已完成 + statusText: string + testDate: string +} + +interface PageResponse { + list: AssessmentHistory[] + total: number + page: number + pageSize: number + totalPages: number +} +``` + +--- + +## 六、订单模块 + +### 6.1 获取订单列表 + +**接口**:`GET /api/order/getList` + +**描述**:获取用户订单列表 + +**请求参数**: +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| page | number | 否 | 页码,默认1 | +| pageSize | number | 否 | 每页数量,默认20 | +| orderType | number | 否 | 订单类型:1测评 2学业规划 | + +**响应数据**: +```typescript +interface OrderItem { + id: number + orderNo: string + orderType: number + productName: string + amount: number + status: number + statusText: string + createTime: string + /** 测评记录ID(测评订单) */ + assessmentRecordId?: number +} + +interface PageResponse { + list: OrderItem[] + total: number + page: number + pageSize: number + totalPages: number +} +``` + +--- + +### 6.2 获取订单详情 + +**接口**:`GET /api/order/getDetail` + +**描述**:获取订单详情 + +**请求参数**: +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| orderId | number | 是 | 订单ID | + +**响应数据**: +```typescript +interface OrderDetail { + id: number + orderNo: string + orderType: number + productId: number + productName: string + amount: number + payAmount: number + payType: number + status: number + statusText: string + payTime?: string + createTime: string + /** 测评相关 */ + assessmentRecord?: { + id: number + status: number + name: string + phone: string + } + /** 学业规划相关 */ + plannerBooking?: { + id: number + plannerName: string + bookingDate: string + bookingTime: string + } +} +``` + +--- + +### 6.3 创建订单 + +**接口**:`POST /api/order/create` + +**描述**:创建订单 + +**请求参数**: +```typescript +interface CreateOrderRequest { + /** 订单类型:1测评 2学业规划 */ + orderType: number + /** 商品ID(测评类型ID / 规划师ID) */ + productId: number + /** 测评基本信息(测评订单必填) */ + assessmentInfo?: { + name: string + phone: string + gender: number + age: number + educationStage: number + province: string + city: string + district: string + } + /** 规划预约信息(学业规划订单必填) */ + plannerInfo?: { + bookingDate: string + bookingTime: string + name: string + phone: string + gender: number + grade: number + majorName?: string + scoreChinese?: number + scoreMath?: number + scoreEnglish?: number + scorePhysics?: number + scoreChemistry?: number + scoreBiology?: number + scoreGeography?: number + scorePolitics?: number + } + /** 邀请码ID(使用邀请码时) */ + inviteCodeId?: number +} +``` + +**响应数据**: +```typescript +interface CreateOrderResponse { + /** 订单ID */ + orderId: number + /** 订单编号 */ + orderNo: string + /** 支付金额 */ + payAmount: number + /** 是否需要支付(使用邀请码时为 false) */ + needPay: boolean + /** 测评记录ID(测评订单) */ + assessmentRecordId?: number +} +``` + +--- + +### 6.4 发起支付 + +**接口**:`POST /api/order/pay` + +**描述**:发起微信支付 + +**请求参数**: +```typescript +interface PayRequest { + /** 订单ID */ + orderId: number +} +``` + +**响应数据**: +```typescript +interface PayResponse { + /** 微信支付参数 */ + timeStamp: string + nonceStr: string + package: string + signType: string + paySign: string +} +``` + +--- + +### 6.5 查询支付结果 + +**接口**:`GET /api/order/getPayResult` + +**描述**:查询订单支付结果 + +**请求参数**: +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| orderId | number | 是 | 订单ID | + +**响应数据**: +```typescript +interface PayResult { + /** 是否支付成功 */ + isPaid: boolean + /** 订单状态 */ + status: number + /** 测评记录ID(测评订单) */ + assessmentRecordId?: number +} +``` + +--- + +## 七、学业规划模块 + +### 7.1 获取规划师列表 + +**接口**:`GET /api/planner/getList` + +**描述**:获取规划师列表 + +**响应数据**: +```typescript +interface PlannerInfo { + id: number + name: string + avatar: string + introduction: string + price: number +} + +type Response = PlannerInfo[] +``` + +--- + +### 7.2 预约规划 + +**接口**:`POST /api/planner/book` + +**描述**:预约学业规划(创建订单并支付) + +**请求参数**:同 `创建订单` 接口的 `plannerInfo` + +**响应数据**:同 `创建订单` 接口 + +--- + +## 八、分销模块 + +### 8.1 获取邀请信息 + +**接口**:`GET /api/invite/getInfo` + +**描述**:获取邀请页面信息 + +**响应数据**: +```typescript +interface InviteInfo { + /** 邀请链接 */ + inviteUrl: string + /** 邀请码 */ + inviteCode: string + /** 已提现金额 */ + withdrawnAmount: number + /** 待提现金额 */ + pendingAmount: number + /** 邀请人数 */ + inviteCount: number +} +``` + +--- + +### 8.2 生成邀请二维码 + +**接口**:`GET /api/invite/getQrcode` + +**描述**:生成邀请二维码图片 + +**响应数据**: +```typescript +interface QrcodeResponse { + /** 二维码图片 URL */ + qrcodeUrl: string +} +``` + +--- + +### 8.3 获取邀请记录 + +**接口**:`GET /api/invite/getRecordList` + +**描述**:获取邀请记录列表 + +**请求参数**: +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| page | number | 否 | 页码 | +| pageSize | number | 否 | 每页数量 | + +**响应数据**: +```typescript +interface InviteRecord { + /** 用户ID */ + userId: number + /** 用户昵称 */ + nickname: string + /** 用户头像 */ + avatar: string + /** 用户UID */ + uid: string + /** 注册日期 */ + registerDate: string + /** 贡献佣金 */ + commission: number +} + +interface PageResponse { + list: InviteRecord[] + total: number + page: number + pageSize: number + totalPages: number +} +``` + +--- + +### 8.4 获取佣金信息 + +**接口**:`GET /api/invite/getCommission` + +**描述**:获取佣金详情 + +**响应数据**: +```typescript +interface CommissionInfo { + /** 累计收益 */ + totalIncome: number + /** 已提现 */ + withdrawnAmount: number + /** 待提现 */ + pendingAmount: number +} +``` + +--- + +### 8.5 申请提现 + +**接口**:`POST /api/invite/applyWithdraw` + +**描述**:申请提现 + +**请求参数**: +```typescript +interface ApplyWithdrawRequest { + /** 提现金额(整数,最低1元) */ + amount: number +} +``` + +**响应数据**: +```typescript +interface ApplyWithdrawResponse { + /** 是否成功 */ + success: boolean + /** 错误信息 */ + errorMessage?: string // "超出待提现金额" + /** 提现单号 */ + withdrawalNo?: string +} +``` + +--- + +### 8.6 获取提现记录 + +**接口**:`GET /api/invite/getWithdrawList` + +**描述**:获取提现记录列表 + +**请求参数**: +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| page | number | 否 | 页码 | +| pageSize | number | 否 | 每页数量 | + +**响应数据**: +```typescript +interface WithdrawRecord { + id: number + withdrawalNo: string + amount: number + status: number // 1申请中 2提现中 3已提现 4已取消 + statusText: string + createTime: string + payTime?: string +} + +interface PageResponse { + list: WithdrawRecord[] + total: number + page: number + pageSize: number + totalPages: number +} +``` + +--- + +## 九、系统模块 + +### 9.1 获取用户协议 + +**接口**:`GET /api/system/getAgreement` + +**描述**:获取用户协议内容 + +**响应数据**: +```typescript +interface AgreementResponse { + /** 协议内容(富文本) */ + content: string +} +``` + +--- + +### 9.2 获取隐私政策 + +**接口**:`GET /api/system/getPrivacy` + +**描述**:获取隐私政策内容 + +**响应数据**: +```typescript +interface PrivacyResponse { + /** 政策内容(富文本) */ + content: string +} +``` + +--- + +### 9.3 获取关于我们 + +**接口**:`GET /api/system/getAbout` + +**描述**:获取关于我们内容 + +**响应数据**: +```typescript +interface AboutResponse { + /** 内容(富文本) */ + content: string + /** 版本号 */ + version: string +} +``` diff --git a/uniapp/docs/开发规范.md b/uniapp/docs/开发规范.md new file mode 100644 index 0000000..c07fd70 --- /dev/null +++ b/uniapp/docs/开发规范.md @@ -0,0 +1,895 @@ +# 学业邑规划 - 小程序开发规范 + +本文档定义了小程序前端的开发规范和编码标准,所有开发工作必须遵循这些规范。 + +--- + +## 一、命名规范 + +### 1.1 文件命名 + +| 类型 | 规范 | 示例 | +|------|------|------| +| 页面文件夹 | kebab-case | `assessment-info/`, `order-list/` | +| 页面文件 | index.vue | `pages/login/index.vue` | +| 组件文件 | PascalCase | `UserAvatar.vue`, `OrderCard.vue` | +| 组合式函数 | use + camelCase | `useAuth.ts`, `usePayment.ts` | +| 工具函数 | camelCase | `format.ts`, `validate.ts` | +| 类型定义 | camelCase + .d.ts | `user.d.ts`, `api.d.ts` | +| 样式文件 | kebab-case | `variables.scss`, `common.scss` | + +### 1.2 代码命名 + +| 类型 | 规范 | 示例 | +|------|------|------| +| 组件名 | PascalCase | `UserAvatar`, `OrderCard` | +| 变量/函数 | camelCase | `userInfo`, `handleSubmit` | +| 常量 | UPPER_SNAKE_CASE | `API_BASE_URL`, `MAX_PAGE_SIZE` | +| 类型/接口 | PascalCase | `UserInfo`, `OrderStatus` | +| 枚举 | PascalCase | `OrderStatus`, `UserLevel` | +| CSS 类名 | kebab-case | `user-avatar`, `order-card` | +| 事件名 | on + 动词 | `onClick`, `onSubmit`, `onChange` | +| Props | camelCase | `userId`, `showHeader` | +| Emits | kebab-case | `@update:value`, `@item-click` | + +### 1.3 命名示例 + +```typescript +// ✅ 建议 +const userInfo = ref(null) +const isLoading = ref(false) +const orderList = ref([]) + +function handleLogin() { } +function fetchUserInfo() { } +function formatPrice(price: number) { } + +// ❌ 不建议 +const user_info = ref(null) // 不使用下划线 +const data = ref([]) // 命名太模糊 +const info = ref(null) // 命名太模糊 +function login() { } // 缺少动词前缀 +``` + +--- + +## 二、项目结构规范 + +### 2.1 页面结构 + +每个页面文件夹包含: + +``` +pages/assessment/info/ +├── index.vue # 页面主文件 +├── components/ # 页面私有组件(可选) +│ └── InfoForm.vue +└── composables/ # 页面私有组合式函数(可选) + └── useInfoForm.ts +``` + +### 2.2 组件分类 + +``` +components/ +├── common/ # 通用组件(与业务无关) +│ ├── AppButton.vue # 按钮 +│ ├── AppModal.vue # 弹窗 +│ ├── AppEmpty.vue # 空状态 +│ ├── AppLoading.vue # 加载 +│ └── AppNavbar.vue # 导航栏 +├── business/ # 业务组件(与业务相关) +│ ├── UserAvatar.vue # 用户头像 +│ ├── OrderCard.vue # 订单卡片 +│ ├── AssessmentCard.vue # 测评卡片 +│ └── PlannerCard.vue # 规划师卡片 +└── layout/ # 布局组件 + └── TabBar.vue # 底部导航 +``` + +--- + +## 三、Vue 组件规范 + +### 3.1 组件结构 + +```vue + + + + + +``` + +### 3.2 Props 规范 + +```typescript +// ✅ 建议:使用 TypeScript 接口定义 +interface Props { + /** 用户ID(必填) */ + userId: number + /** 标题 */ + title?: string + /** 是否显示 */ + visible?: boolean + /** 列表数据 */ + list?: OrderItem[] +} + +const props = withDefaults(defineProps(), { + title: '默认标题', + visible: false, + list: () => [] +}) + +// ❌ 不建议:使用运行时声明 +const props = defineProps({ + userId: { + type: Number, + required: true + } +}) +``` + +### 3.3 Emits 规范 + +```typescript +// ✅ 建议:使用 TypeScript 接口定义 +interface Emits { + (e: 'submit', data: FormData): void + (e: 'cancel'): void + (e: 'update:visible', value: boolean): void +} + +const emit = defineEmits() + +// 触发事件 +emit('submit', formData) +emit('update:visible', false) +``` + +--- + +## 四、TypeScript 规范 + +### 4.1 类型定义 + +```typescript +// types/user.d.ts + +/** 用户等级 */ +export enum UserLevel { + /** 普通用户 */ + Normal = 1, + /** 合伙人 */ + Partner = 2, + /** 渠道合伙人 */ + ChannelPartner = 3 +} + +/** 用户信息 */ +export interface UserInfo { + /** 用户ID */ + id: number + /** 用户UID */ + uid: string + /** 昵称 */ + nickname: string + /** 头像 */ + avatar: string + /** 手机号 */ + phone: string + /** 用户等级 */ + userLevel: UserLevel + /** 创建时间 */ + createTime: string +} + +/** 登录请求参数 */ +export interface LoginRequest { + /** 微信 code */ + code: string + /** 加密手机号数据 */ + encryptedData: string + /** 加密向量 */ + iv: string +} + +/** 登录响应 */ +export interface LoginResponse { + /** 访问令牌 */ + token: string + /** 刷新令牌 */ + refreshToken: string + /** 用户信息 */ + userInfo: UserInfo +} +``` + +### 4.2 API 类型 + +```typescript +// types/api.d.ts + +/** 通用响应结构 */ +export interface ApiResponse { + /** 状态码 */ + code: number + /** 提示信息 */ + message: string + /** 业务数据 */ + data: T +} + +/** 分页请求参数 */ +export interface PageRequest { + /** 页码 */ + page?: number + /** 每页数量 */ + pageSize?: number +} + +/** 分页响应 */ +export interface PageResponse { + /** 列表数据 */ + list: T[] + /** 总数 */ + total: number + /** 当前页 */ + page: number + /** 每页数量 */ + pageSize: number + /** 总页数 */ + totalPages: number +} +``` + +### 4.3 类型使用 + +```typescript +// ✅ 建议:明确类型 +const userInfo = ref(null) +const orderList = ref([]) +const loading = ref(false) + +// ✅ 函数参数和返回值类型 +function formatPrice(price: number): string { + return `¥${price.toFixed(2)}` +} + +async function fetchOrders(params: PageRequest): Promise> { + const res = await request.get>('/api/order/getList', { params }) + return res.data +} + +// ❌ 不建议:使用 any +const data: any = {} +function handleData(data: any) { } +``` + +--- + +## 五、API 请求规范 + +### 5.1 请求封装 + +```typescript +// api/request.ts +import type { ApiResponse } from '@/types/api' + +const BASE_URL = import.meta.env.VITE_API_BASE_URL + +interface RequestOptions { + url: string + method?: 'GET' | 'POST' + data?: any + params?: any + showLoading?: boolean + showError?: boolean +} + +class Request { + private getToken(): string { + return uni.getStorageSync('token') || '' + } + + async request(options: RequestOptions): Promise> { + const { url, method = 'GET', data, params, showLoading = true, showError = true } = options + + if (showLoading) { + uni.showLoading({ title: '加载中...' }) + } + + try { + const res = await uni.request({ + url: BASE_URL + url, + method, + data: method === 'POST' ? data : undefined, + header: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${this.getToken()}` + } + }) + + const result = res.data as ApiResponse + + if (result.code !== 0) { + if (showError) { + uni.showToast({ title: result.message, icon: 'none' }) + } + throw new Error(result.message) + } + + return result + } finally { + if (showLoading) { + uni.hideLoading() + } + } + } + + get(url: string, options?: Partial) { + return this.request({ url, method: 'GET', ...options }) + } + + post(url: string, data?: any, options?: Partial) { + return this.request({ url, method: 'POST', data, ...options }) + } +} + +export const request = new Request() +``` + +### 5.2 API 模块 + +```typescript +// api/user.ts +import { request } from './request' +import type { LoginRequest, LoginResponse, UserInfo } from '@/types/user' + +/** + * 微信登录 + */ +export function login(data: LoginRequest) { + return request.post('/api/user/login', data) +} + +/** + * 获取用户信息 + */ +export function getUserProfile() { + return request.get('/api/user/getProfile') +} + +/** + * 更新用户信息 + */ +export function updateProfile(data: Partial) { + return request.post('/api/user/updateProfile', data) +} +``` + +### 5.3 API 调用 + +```typescript +// 在组件中使用 +import { getUserProfile } from '@/api/user' + +async function fetchUserInfo() { + try { + const res = await getUserProfile() + userInfo.value = res.data + } catch (error) { + console.error('获取用户信息失败', error) + } +} +``` + +--- + +## 六、状态管理规范 + +### 6.1 Store 定义 + +```typescript +// stores/user.ts +import { defineStore } from 'pinia' +import { ref, computed } from 'vue' +import type { UserInfo } from '@/types/user' +import { getUserProfile, login } from '@/api/user' + +export const useUserStore = defineStore('user', () => { + // 状态 + const token = ref('') + const userInfo = ref(null) + + // 计算属性 + const isLoggedIn = computed(() => !!token.value) + const isPartner = computed(() => (userInfo.value?.userLevel ?? 0) >= 2) + + // 方法 + async function loginAction(code: string, encryptedData: string, iv: string) { + const res = await login({ code, encryptedData, iv }) + token.value = res.data.token + userInfo.value = res.data.userInfo + uni.setStorageSync('token', res.data.token) + } + + async function fetchUserInfo() { + if (!token.value) return + const res = await getUserProfile() + userInfo.value = res.data + } + + function logout() { + token.value = '' + userInfo.value = null + uni.removeStorageSync('token') + } + + // 初始化 + function init() { + token.value = uni.getStorageSync('token') || '' + if (token.value) { + fetchUserInfo() + } + } + + return { + token, + userInfo, + isLoggedIn, + isPartner, + loginAction, + fetchUserInfo, + logout, + init + } +}) +``` + +### 6.2 Store 使用 + +```typescript +// 在组件中使用 +import { useUserStore } from '@/stores/user' + +const userStore = useUserStore() + +// 访问状态 +const { userInfo, isLoggedIn } = storeToRefs(userStore) + +// 调用方法 +await userStore.loginAction(code, encryptedData, iv) +userStore.logout() +``` + +--- + +## 七、样式规范 + +### 7.1 变量定义 + +```scss +// styles/variables.scss + +// 主题色 +$primary-color: #4A90E2; +$primary-color-light: #6BA3E8; +$primary-color-dark: #3A7BC8; + +// 文字颜色 +$text-color: #333333; +$text-color-secondary: #666666; +$text-color-placeholder: #999999; +$text-color-disabled: #CCCCCC; + +// 背景色 +$bg-color: #F5F5F5; +$bg-color-white: #FFFFFF; +$bg-color-gray: #F8F8F8; + +// 边框 +$border-color: #EEEEEE; +$border-radius: 8rpx; +$border-radius-lg: 16rpx; + +// 间距 +$spacing-xs: 8rpx; +$spacing-sm: 16rpx; +$spacing-md: 24rpx; +$spacing-lg: 32rpx; +$spacing-xl: 48rpx; + +// 字体大小 +$font-size-xs: 20rpx; +$font-size-sm: 24rpx; +$font-size-md: 28rpx; +$font-size-lg: 32rpx; +$font-size-xl: 36rpx; + +// 安全区域 +$safe-area-bottom: env(safe-area-inset-bottom); +``` + +### 7.2 BEM 命名 + +```scss +// ✅ 建议:使用 BEM 命名 +.order-card { + // Block + padding: $spacing-md; + background: $bg-color-white; + + // Element + &__header { + display: flex; + justify-content: space-between; + } + + &__title { + font-size: $font-size-lg; + color: $text-color; + } + + &__status { + font-size: $font-size-sm; + color: $text-color-secondary; + } + + &__content { + margin-top: $spacing-sm; + } + + &__footer { + margin-top: $spacing-md; + text-align: right; + } + + // Modifier + &--active { + border-color: $primary-color; + } + + &--disabled { + opacity: 0.5; + } +} +``` + +### 7.3 响应式单位 + +```scss +// ✅ 使用 rpx 作为主要单位 +.container { + padding: 24rpx; + font-size: 28rpx; + border-radius: 8rpx; +} + +// ✅ 固定尺寸使用 px +.icon { + width: 24px; + height: 24px; +} + +// ❌ 不建议混用单位 +.box { + padding: 12px 24rpx; // 不要混用 +} +``` + +--- + +## 八、页面开发流程 + +### 8.1 开发步骤 + +1. **查看设计图** - 确认页面布局和交互 +2. **定义类型** - 在 `types/` 下定义相关类型 +3. **编写 API** - 在 `api/` 下编写接口调用 +4. **创建页面** - 在 `pages/` 下创建页面文件夹 +5. **配置路由** - 在 `pages.json` 中添加页面配置 +6. **编写组件** - 抽取可复用组件 +7. **编写样式** - 使用 BEM 命名,引用变量 +8. **测试验证** - 在模拟器和真机测试 + +### 8.2 页面配置 + +```json +// pages.json +{ + "pages": [ + { + "path": "pages/index/index", + "style": { + "navigationBarTitleText": "首页", + "navigationStyle": "custom" + } + }, + { + "path": "pages/assessment/info/index", + "style": { + "navigationBarTitleText": "填写信息" + } + } + ], + "tabBar": { + "color": "#999999", + "selectedColor": "#4A90E2", + "backgroundColor": "#FFFFFF", + "list": [ + { + "pagePath": "pages/index/index", + "text": "首页", + "iconPath": "static/icons/tab-home.png", + "selectedIconPath": "static/icons/tab-home-active.png" + }, + { + "pagePath": "pages/team/index", + "text": "团队", + "iconPath": "static/icons/tab-team.png", + "selectedIconPath": "static/icons/tab-team-active.png" + }, + { + "pagePath": "pages/mine/index", + "text": "我的", + "iconPath": "static/icons/tab-mine.png", + "selectedIconPath": "static/icons/tab-mine-active.png" + } + ] + } +} +``` + +--- + +## 九、常用工具函数 + +### 9.1 格式化 + +```typescript +// utils/format.ts + +/** + * 格式化价格 + */ +export function formatPrice(price: number): string { + return `¥${price.toFixed(2)}` +} + +/** + * 格式化日期 + */ +export function formatDate(date: string | Date, format = 'YYYY-MM-DD'): string { + const d = new Date(date) + const year = d.getFullYear() + const month = String(d.getMonth() + 1).padStart(2, '0') + const day = String(d.getDate()).padStart(2, '0') + const hour = String(d.getHours()).padStart(2, '0') + const minute = String(d.getMinutes()).padStart(2, '0') + + return format + .replace('YYYY', String(year)) + .replace('MM', month) + .replace('DD', day) + .replace('HH', hour) + .replace('mm', minute) +} + +/** + * 格式化手机号(隐藏中间4位) + */ +export function formatPhone(phone: string): string { + return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2') +} +``` + +### 9.2 验证 + +```typescript +// utils/validate.ts + +/** + * 验证手机号 + */ +export function isValidPhone(phone: string): boolean { + return /^1[3-9]\d{9}$/.test(phone) +} + +/** + * 验证邀请码(5位大写字母) + */ +export function isValidInviteCode(code: string): boolean { + return /^[A-Z]{5}$/.test(code) +} +``` + +### 9.3 存储 + +```typescript +// utils/storage.ts + +const TOKEN_KEY = 'token' +const USER_INFO_KEY = 'userInfo' + +export const storage = { + getToken(): string { + return uni.getStorageSync(TOKEN_KEY) || '' + }, + + setToken(token: string): void { + uni.setStorageSync(TOKEN_KEY, token) + }, + + removeToken(): void { + uni.removeStorageSync(TOKEN_KEY) + }, + + getUserInfo(): T | null { + const data = uni.getStorageSync(USER_INFO_KEY) + return data ? JSON.parse(data) : null + }, + + setUserInfo(info: T): void { + uni.setStorageSync(USER_INFO_KEY, JSON.stringify(info)) + }, + + clear(): void { + uni.clearStorageSync() + } +} +``` + +--- + +## 十、注意事项 + +### 10.1 性能优化 + +- 图片使用 CDN 地址,避免本地大图 +- 列表使用虚拟滚动或分页加载 +- 避免在 `onShow` 中频繁请求数据 +- 使用 `v-if` 而非 `v-show` 控制大组件显示 + +### 10.2 兼容性 + +- 使用 `rpx` 作为主要单位 +- 避免使用不支持的 CSS 属性 +- 测试 iOS 和 Android 两端表现 +- 注意安全区域适配 + +### 10.3 安全 + +- 敏感数据不存储在本地 +- Token 过期自动刷新或跳转登录 +- 支付相关操作需二次确认 +- 用户输入需做 XSS 过滤 + +--- + +## 十一、Git 提交规范 + +### 11.1 提交信息格式 + +``` +(): + + +``` + +### 11.2 Type 类型 + +| Type | 说明 | +|------|------| +| feat | 新功能 | +| fix | 修复 bug | +| docs | 文档更新 | +| style | 代码格式(不影响功能) | +| refactor | 重构 | +| perf | 性能优化 | +| test | 测试 | +| chore | 构建/工具 | + +### 11.3 示例 + +``` +feat(assessment): 添加测评答题页面 + +- 实现题目列表展示 +- 实现选项选择交互 +- 添加提交答案功能 +``` diff --git a/uniapp/docs/组件文档.md b/uniapp/docs/组件文档.md new file mode 100644 index 0000000..97156f7 --- /dev/null +++ b/uniapp/docs/组件文档.md @@ -0,0 +1,501 @@ +# 学业邑规划 - 组件文档 + +本文档定义了小程序中需要开发的公共组件和业务组件。 + +--- + +## 一、组件分类 + +``` +components/ +├── common/ # 通用组件(与业务无关) +├── business/ # 业务组件(与业务相关) +└── layout/ # 布局组件 +``` + +--- + +## 二、通用组件 + +### 2.1 AppButton 按钮 + +**文件**:`components/common/AppButton.vue` + +**功能**:统一的按钮组件,支持多种样式和状态 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| type | string | 'primary' | 按钮类型:primary / secondary / text | +| size | string | 'medium' | 按钮大小:small / medium / large | +| disabled | boolean | false | 是否禁用 | +| loading | boolean | false | 是否加载中 | +| block | boolean | false | 是否块级按钮 | + +**使用示例**: +```vue +提交 +取消 + + 支付¥99元 开始测评 + +``` + +--- + +### 2.2 AppModal 弹窗 + +**文件**:`components/common/AppModal.vue` + +**功能**:统一的弹窗组件 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| visible | boolean | false | 是否显示 | +| title | string | '' | 标题 | +| showClose | boolean | true | 是否显示关闭按钮 | +| maskClosable | boolean | true | 点击遮罩是否关闭 | + +**Emits**: +| 事件 | 参数 | 说明 | +|------|------|------| +| update:visible | boolean | 显示状态变化 | +| close | - | 关闭事件 | + +**使用示例**: +```vue + + 确定要退出登录吗? + + +``` + +--- + +### 2.3 AppEmpty 空状态 + +**文件**:`components/common/AppEmpty.vue` + +**功能**:列表为空时的占位组件 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| image | string | 默认图片 | 空状态图片 | +| text | string | '暂无数据' | 提示文字 | +| showButton | boolean | false | 是否显示按钮 | +| buttonText | string | '' | 按钮文字 | + +**使用示例**: +```vue + + +``` + +--- + +### 2.4 AppLoading 加载 + +**文件**:`components/common/AppLoading.vue` + +**功能**:加载状态组件 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| loading | boolean | false | 是否加载中 | +| text | string | '加载中...' | 加载文字 | +| fullscreen | boolean | false | 是否全屏 | + +**使用示例**: +```vue + + +``` + +--- + +### 2.5 AppNavbar 导航栏 + +**文件**:`components/common/AppNavbar.vue` + +**功能**:自定义导航栏(用于 navigationStyle: custom 的页面) + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| title | string | '' | 标题 | +| showBack | boolean | true | 是否显示返回按钮 | +| showHome | boolean | false | 是否显示首页按钮 | +| bgColor | string | '#fff' | 背景色 | +| textColor | string | '#333' | 文字颜色 | + +**使用示例**: +```vue + + +``` + +--- + +### 2.6 AppInput 输入框 + +**文件**:`components/common/AppInput.vue` + +**功能**:统一的输入框组件 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| modelValue | string | '' | 输入值 | +| type | string | 'text' | 输入类型 | +| placeholder | string | '' | 占位文字 | +| disabled | boolean | false | 是否禁用 | +| maxlength | number | -1 | 最大长度 | +| error | string | '' | 错误提示 | + +**使用示例**: +```vue + +``` + +--- + +### 2.7 AppPicker 选择器 + +**文件**:`components/common/AppPicker.vue` + +**功能**:统一的选择器组件 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| modelValue | any | null | 选中值 | +| options | array | [] | 选项列表 | +| placeholder | string | '请选择' | 占位文字 | +| labelKey | string | 'label' | 显示字段 | +| valueKey | string | 'value' | 值字段 | + +**使用示例**: +```vue + +``` + +--- + +### 2.8 AppRegionPicker 地区选择器 + +**文件**:`components/common/AppRegionPicker.vue` + +**功能**:省市区三级联动选择器 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| province | string | '' | 省份 | +| city | string | '' | 城市 | +| district | string | '' | 区县 | + +**Emits**: +| 事件 | 参数 | 说明 | +|------|------|------| +| change | { province, city, district } | 选择变化 | + +**使用示例**: +```vue + +``` + +--- + +## 三、业务组件 + +### 3.1 UserAvatar 用户头像 + +**文件**:`components/business/UserAvatar.vue` + +**功能**:用户头像展示组件 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| src | string | '' | 头像地址 | +| size | string | 'medium' | 大小:small / medium / large | +| showLevel | boolean | false | 是否显示等级标识 | +| level | number | 1 | 用户等级 | + +**使用示例**: +```vue + + +``` + +--- + +### 3.2 OrderCard 订单卡片 + +**文件**:`components/business/OrderCard.vue` + +**功能**:订单列表项组件 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| order | OrderItem | required | 订单数据 | + +**Emits**: +| 事件 | 参数 | 说明 | +|------|------|------| +| action | { type, order } | 操作按钮点击 | + +**使用示例**: +```vue + +``` + +--- + +### 3.3 AssessmentCard 测评入口卡片 + +**文件**:`components/business/AssessmentCard.vue` + +**功能**:首页测评入口组件 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| assessment | AssessmentType | required | 测评类型数据 | + +**Emits**: +| 事件 | 参数 | 说明 | +|------|------|------| +| click | AssessmentType | 点击事件 | + +**使用示例**: +```vue + +``` + +--- + +### 3.4 PlannerCard 规划师卡片 + +**文件**:`components/business/PlannerCard.vue` + +**功能**:规划师列表项组件 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| planner | PlannerInfo | required | 规划师数据 | +| selected | boolean | false | 是否选中 | + +**Emits**: +| 事件 | 参数 | 说明 | +|------|------|------| +| select | PlannerInfo | 选择事件 | + +**使用示例**: +```vue + +``` + +--- + +### 3.5 QuestionItem 题目组件 + +**文件**:`components/business/QuestionItem.vue` + +**功能**:测评答题页的题目组件 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| question | Question | required | 题目数据 | +| answer | number | null | 当前答案 | +| index | number | required | 题目序号 | + +**Emits**: +| 事件 | 参数 | 说明 | +|------|------|------| +| change | { questionId, value } | 答案变化 | + +**使用示例**: +```vue + +``` + +--- + +### 3.6 InviteRecord 邀请记录项 + +**文件**:`components/business/InviteRecord.vue` + +**功能**:邀请记录列表项组件 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| record | InviteRecord | required | 邀请记录数据 | + +**使用示例**: +```vue + +``` + +--- + +### 3.7 WithdrawRecord 提现记录项 + +**文件**:`components/business/WithdrawRecord.vue` + +**功能**:提现记录列表项组件 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| record | WithdrawRecord | required | 提现记录数据 | + +**使用示例**: +```vue + +``` + +--- + +## 四、布局组件 + +### 4.1 PageContainer 页面容器 + +**文件**:`components/layout/PageContainer.vue` + +**功能**:统一的页面容器,处理安全区域 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| safeBottom | boolean | true | 是否适配底部安全区域 | +| bgColor | string | '#f5f5f5' | 背景色 | + +**使用示例**: +```vue + + + +``` + +--- + +### 4.2 ListContainer 列表容器 + +**文件**:`components/layout/ListContainer.vue` + +**功能**:带下拉刷新和上拉加载的列表容器 + +**Props**: +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| loading | boolean | false | 是否加载中 | +| finished | boolean | false | 是否加载完成 | +| emptyText | string | '暂无数据' | 空状态文字 | + +**Emits**: +| 事件 | 参数 | 说明 | +|------|------|------| +| refresh | - | 下拉刷新 | +| loadMore | - | 上拉加载 | + +**使用示例**: +```vue + + + +``` + +--- + +## 五、组件开发规范 + +### 5.1 组件命名 + +- 通用组件以 `App` 开头:`AppButton`, `AppModal` +- 业务组件使用业务名词:`UserAvatar`, `OrderCard` +- 布局组件以 `Container` 结尾:`PageContainer`, `ListContainer` + +### 5.2 Props 规范 + +- 使用 TypeScript 接口定义 +- 必填属性标注 `required` +- 提供合理的默认值 +- 添加 JSDoc 注释 + +### 5.3 样式规范 + +- 使用 BEM 命名 +- 使用 `scoped` 限制作用域 +- 引用全局变量 +- 避免使用 `!important` + +### 5.4 事件规范 + +- 使用 `emit` 定义类型 +- 事件名使用 kebab-case +- 提供完整的事件参数类型 diff --git a/uniapp/docs/页面清单.md b/uniapp/docs/页面清单.md new file mode 100644 index 0000000..e0c26dc --- /dev/null +++ b/uniapp/docs/页面清单.md @@ -0,0 +1,474 @@ +# 学业邑规划 - 小程序页面清单 + +本文档列出所有小程序页面的详细信息,包括路由、功能、状态和开发优先级。 + +--- + +## 一、页面总览 + +| 序号 | 页面名称 | 路由 | 优先级 | 状态 | +|------|----------|------|--------|------| +| 1 | 首页 | /pages/index/index | P0 | 待开发 | +| 2 | 团队页 | /pages/team/index | P0 | 待开发 | +| 3 | 我的页 | /pages/mine/index | P0 | 待开发 | +| 4 | 登录页 | /pages/login/index | P0 | 待开发 | +| 5 | 个人资料页 | /pages/mine/profile/index | P1 | 待开发 | +| 6 | 业务详情页 | /pages/business/detail/index | P1 | 待开发 | +| 7 | 测评-信息填写 | /pages/assessment/info/index | P0 | 待开发 | +| 8 | 测评-答题页 | /pages/assessment/questions/index | P0 | 待开发 | +| 9 | 测评-生成中 | /pages/assessment/loading/index | P0 | 待开发 | +| 10 | 测评-结果页 | /pages/assessment/result/index | P0 | 待开发 | +| 11 | 我的订单 | /pages/order/list/index | P1 | 待开发 | +| 12 | 往期测评 | /pages/assessment/history/index | P1 | 待开发 | +| 13 | 学业规划-规划师 | /pages/planner/list/index | P2 | 待开发 | +| 14 | 学业规划-预约 | /pages/planner/book/index | P2 | 待开发 | +| 15 | 邀请新用户 | /pages/invite/index | P2 | 待开发 | +| 16 | 关于页 | /pages/about/index | P3 | 待开发 | +| 17 | 用户协议 | /pages/agreement/user/index | P3 | 待开发 | +| 18 | 隐私政策 | /pages/agreement/privacy/index | P3 | 待开发 | + +**优先级说明**: +- P0:核心功能,必须首先完成 +- P1:重要功能,核心功能完成后开发 +- P2:扩展功能,可延后开发 +- P3:辅助功能,最后开发 + +--- + +## 二、TabBar 页面 + +### 2.1 首页 (P0) + +**路由**:`/pages/index/index` + +**设计图**:`docs/设计图/首页.png` + +**功能描述**: +- 展示公司介绍性内容 +- Banner 轮播图(可跳转) +- 测评入口列表 +- 底部宣传长图 + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| Banner 列表 | GET /api/home/getBannerList | 轮播图数据 | +| 测评入口 | GET /api/home/getAssessmentList | 测评类型列表 | +| 宣传图 | GET /api/home/getPromotionList | 底部宣传图 | + +**交互逻辑**: +- 点击 Banner → 根据跳转类型跳转 +- 点击已上线测评 → 进入测评流程 +- 点击即将上线测评 → 弹出提示"该测评暂未开放" + +--- + +### 2.2 团队页 (P0) + +**路由**:`/pages/team/index` + +**设计图**:`docs/设计图/团队.png` + +**功能描述**: +- 展示团队介绍图片 + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 团队介绍 | GET /api/team/getInfo | 团队介绍图片 | + +--- + +### 2.3 我的页 (P0) + +**路由**:`/pages/mine/index` + +**设计图**: +- `docs/设计图/我的-未登录.png` +- `docs/设计图/我的-登录页.png` +- `docs/设计图/我的-退出登录.png` + +**功能描述**: +- 未登录:显示"点击登录" +- 已登录:显示头像、昵称、UID +- 常用功能:我的订单、往期测评、联系我们、邀请新用户(合伙人可见) +- 其他功能:关于、用户协议、隐私政策、退出登录 + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 用户信息 | GET /api/user/getProfile | 用户基本信息 | + +**交互逻辑**: +- 未登录点击头像区域 → 跳转登录页 +- 点击各功能入口 → 跳转对应页面 +- 点击退出登录 → 弹出二次确认弹窗 + +--- + +## 三、登录相关 + +### 3.1 登录页 (P0) + +**路由**:`/pages/login/index` + +**设计图**:`docs/设计图/登录页.png` + +**功能描述**: +- 微信一键登录(获取手机号) +- 用户协议和隐私政策勾选 + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 登录 | POST /api/user/login | 微信登录 | + +**交互逻辑**: +1. 用户点击登录按钮 +2. 调用 `wx.login()` 获取 code +3. 调用 `wx.getPhoneNumber()` 获取加密手机号 +4. 调用后端登录接口 +5. 保存 token,跳转回原页面 + +--- + +### 3.2 个人资料页 (P1) + +**路由**:`/pages/mine/profile/index` + +**设计图**:`docs/设计图/个人资料.png` + +**功能描述**: +- 查看/修改头像 +- 查看/修改昵称 +- 查看 UID(不可修改) + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 用户信息 | GET /api/user/getProfile | 获取用户信息 | +| 更新信息 | POST /api/user/updateProfile | 更新昵称 | +| 更新头像 | POST /api/user/updateAvatar | 更新头像 | + +--- + +## 四、测评相关 + +### 4.1 测评-信息填写页 (P0) + +**路由**:`/pages/assessment/info/index` + +**设计图**: +- `docs/设计图/测评-个人信息填写.png` +- `docs/设计图/测评-个人信息填写2.png` +- `docs/设计图/测评-个人信息填写3.png` +- `docs/设计图/测评-个人信息填写4.png` + +**功能描述**: +- 顶部测评介绍(后台配置) +- 填写基本信息:姓名、手机号、性别、年龄、学业阶段、省市区 +- 两个入口按钮:支付测评、邀请码免费测评 + +**表单字段**: +| 字段 | 类型 | 必填 | 验证规则 | +|------|------|------|----------| +| 姓名 | 文本 | 是 | 非空 | +| 手机号 | 文本 | 是 | 11位手机号格式 | +| 性别 | 单选 | 是 | 男/女 | +| 年龄 | 下拉 | 是 | 10-50岁 | +| 学业阶段 | 下拉 | 是 | 6个选项 | +| 省份 | 下拉 | 是 | 省份列表 | +| 城市 | 下拉 | 是 | 城市列表 | +| 区县 | 下拉 | 是 | 区县列表 | + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 测评介绍 | GET /api/assessment/getIntro | 顶部介绍内容 | +| 验证邀请码 | POST /api/assessment/verifyInviteCode | 验证邀请码 | +| 创建订单 | POST /api/order/create | 创建测评订单 | +| 发起支付 | POST /api/order/pay | 拉起微信支付 | + +**交互逻辑**: +- 有未填写项 → 按钮灰色不可点击 +- 点击支付按钮 → 验证信息 → 创建订单 → 拉起支付 +- 点击邀请码按钮 → 验证信息 → 弹出邀请码输入框 → 验证邀请码 + +--- + +### 4.2 测评-答题页 (P0) + +**路由**:`/pages/assessment/questions/index` + +**设计图**: +- `docs/设计图/测评-题目.png` +- `docs/设计图/测评-提交题目检验空题.png` + +**功能描述**: +- 展示所有题目(80道) +- 每题10个选项 +- 底部提交按钮 +- 提交时检测未答题目 + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 题目列表 | GET /api/assessment/getQuestionList | 获取所有题目 | +| 提交答案 | POST /api/assessment/submitAnswers | 提交测评答案 | + +**交互逻辑**: +- 点击提交 → 检测未答题目 +- 有未答题 → 弹窗显示未答题号 +- 全部已答 → 提交答案 → 跳转生成中页面 + +--- + +### 4.3 测评-生成中页 (P0) + +**路由**:`/pages/assessment/loading/index` + +**设计图**:`docs/设计图/测评-等待测评.png` + +**功能描述**: +- 显示加载动画 +- 提示文字 +- 轮询查询报告状态 +- 生成完成自动跳转 + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 报告状态 | GET /api/assessment/getResultStatus | 查询报告生成状态 | + +--- + +### 4.4 测评-结果页 (P0) + +**路由**:`/pages/assessment/result/index` + +**设计图**:(需补充) + +**功能描述**: +- 展示测评报告 +- 八大智能分析(雷达图) +- 个人特质分析 +- 40项细分能力 +- 其他分析报告 +- 保存到本地(PDF) + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 测评结果 | GET /api/assessment/getResult | 获取完整测评报告 | + +--- + +### 4.5 往期测评页 (P1) + +**路由**:`/pages/assessment/history/index` + +**设计图**:`docs/设计图/往期测评-空状态.png` + +**功能描述**: +- 展示已完成的测评列表 +- 显示测评日期、订单编号、测评项目、报告状态 + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 测评记录 | GET /api/assessment/getHistoryList | 获取往期测评列表 | + +--- + +## 五、订单相关 + +### 5.1 我的订单页 (P1) + +**路由**:`/pages/order/list/index` + +**设计图**: +- `docs/设计图/我的订单.png` +- `docs/设计图/我的订单-空状态.png` + +**功能描述**: +- 展示所有订单 +- 显示订单日期、编号、项目、金额、状态 +- 根据状态显示不同操作按钮 + +**订单状态**: +| 状态 | 说明 | 操作 | +|------|------|------| +| 待测评 | 已支付,未答题 | 开始测评 | +| 测评生成中 | 已答题,生成中 | - | +| 已测评 | 报告已生成 | 查看结果 | +| 退款中 | 申请退款中 | - | +| 已退款 | 退款完成 | - | +| 已支付 | 学业规划订单 | - | + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 订单列表 | GET /api/order/getList | 获取订单列表 | + +--- + +## 六、学业规划 + +### 6.1 规划师选择页 (P2) + +**路由**:`/pages/planner/list/index` + +**设计图**:`docs/设计图/学业规划.png` + +**功能描述**: +- 展示规划师列表 +- 显示照片、姓名、介绍、价格 + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 规划师列表 | GET /api/planner/getList | 获取规划师列表 | + +--- + +### 6.2 规划预约页 (P2) + +**路由**:`/pages/planner/book/index` + +**设计图**: +- `docs/设计图/学业规划2.png` +- `docs/设计图/学业规划3.png` +- `docs/设计图/学业规划4.png` + +**功能描述**: +- 选择预约日期和时间 +- 填写个人信息 +- 根据年级动态显示成绩字段 +- 支付预约费 + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 预约 | POST /api/planner/book | 提交预约信息 | + +--- + +## 七、分销相关 + +### 7.1 邀请新用户页 (P2) + +**路由**:`/pages/invite/index` + +**设计图**: +- `docs/设计图/邀请新用户.png` +- `docs/设计图/邀请新用户-二维码.png` +- `docs/设计图/邀请新用户-提现金额.png` +- `docs/设计图/邀请新用户-提现记录.png` + +**功能描述**: +- 邀请规则说明 +- 生成邀请二维码 +- 分享邀请链接 +- 已提现/待提现金额 +- 申请提现 +- 提现记录 +- 邀请记录列表 + +**访问权限**:仅合伙人及以上可见 + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 邀请信息 | GET /api/invite/getInfo | 获取邀请信息 | +| 生成二维码 | GET /api/invite/getQrcode | 生成邀请二维码 | +| 邀请记录 | GET /api/invite/getRecordList | 获取邀请记录 | +| 佣金信息 | GET /api/invite/getCommission | 获取佣金信息 | +| 申请提现 | POST /api/invite/applyWithdraw | 申请提现 | +| 提现记录 | GET /api/invite/getWithdrawList | 获取提现记录 | + +--- + +## 八、其他页面 + +### 8.1 业务详情页 (P1) + +**路由**:`/pages/business/detail/index` + +**设计图**:`docs/设计图/业务详情页.png` + +**功能描述**: +- 展示业务介绍长图 +- 底部"点击参与"按钮(可选) + +--- + +### 8.2 关于页 (P3) + +**路由**:`/pages/about/index` + +**设计图**:`docs/设计图/关于.png` + +**功能描述**: +- 显示 LOGO +- 显示版本号 + +--- + +### 8.3 用户协议页 (P3) + +**路由**:`/pages/agreement/user/index` + +**设计图**:`docs/设计图/用户/隐私协议.png` + +**功能描述**: +- 显示用户协议内容 + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 用户协议 | GET /api/system/getAgreement | 获取用户协议 | + +--- + +### 8.4 隐私政策页 (P3) + +**路由**:`/pages/agreement/privacy/index` + +**设计图**:`docs/设计图/用户/隐私协议.png` + +**功能描述**: +- 显示隐私政策内容 + +**数据来源**: +| 数据 | 接口 | 说明 | +|------|------|------| +| 隐私政策 | GET /api/system/getPrivacy | 获取隐私政策 | + +--- + +## 九、开发顺序建议 + +### 第一阶段(P0 核心功能) +1. 项目初始化 + 基础框架 +2. TabBar 框架(首页、团队、我的骨架) +3. 登录页 + 登录流程 +4. 首页完整功能 +5. 测评流程(信息填写 → 答题 → 生成中 → 结果) + +### 第二阶段(P1 重要功能) +6. 我的页完整功能 +7. 个人资料页 +8. 我的订单页 +9. 往期测评页 +10. 业务详情页 +11. 团队页 + +### 第三阶段(P2 扩展功能) +12. 学业规划-规划师选择 +13. 学业规划-预约 +14. 邀请新用户(分销功能) + +### 第四阶段(P3 辅助功能) +15. 关于页 +16. 用户协议页 +17. 隐私政策页