Files
xuanzhi-wx/.ai-specs/coding-specs/2026-04-22-profile-page-static-design.md

214 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# `pages/profile/index` 未登录态静态页面设计
## 文档元信息
- 日期:`2026-04-22`
- 目标页面:`pages/profile/index`
- 设计范围:`结构复刻 + 纯静态展示 + 未登录态`
- 关联文档:`AGENTS.md``README.md`
## 目标
在不引入接口、store、页面跳转和新增组件的前提下`pages/profile/index` 从占位页升级为一个可直接展示的个人中心静态页面。页面目标是复刻参考图的区块结构和信息层级,同时沿用仓库现有暖色、卡片化视觉语言,避免做截图级像素还原。
## 范围与非目标
### 本次范围
- 仅修改 `pages/profile/index.js``pages/profile/index.wxml``pages/profile/index.wxss`
- 页面首屏固定为未登录态
- 页面包含 5 个区块:用户卡片、会员引导卡片、学习资产四宫格、最近记录空状态、其它功能列表
- 页面内容使用静态 `data` 驱动
- 按微信原生小程序常规写法实现,不新增通用组件
### 非目标
- 不接入 `stores/modules/session.js`
- 不调用 `services/api/*``services/request/index.js`
- 不新增图标图片资源、不新增字体资源
- 不接按钮点击、页面跳转、分享能力、登录能力
- 不处理已登录态、真实记录列表、真实资产计数
## 方案选择
### 备选方案
1. 页面内一次性落地
2. 先抽资产区和列表行为局部组件
3. 强行复用现有 `components/base/app-button``components/biz/entry-card`
### 最终选择
采用“页面内一次性落地”方案。
选择原因:
- 当前目标是静态结构复刻,范围小,直接写在页面内更短更稳
- 现有组件与目标结构不贴合,强复用会增加样式扭曲和模板复杂度
- 通过结构化 `data` 和分区 class 命名,后续仍可平滑抽组件,不会锁死实现
## 页面结构
页面按纵向信息流组织,顺序固定如下:
1. 用户卡片
2. 会员引导卡片
3. 学习资产四宫格
4. 最近记录
5. 其它功能
各区块关系如下:
```mermaid
flowchart TD
PAGE["profile-page 页面根容器"] --> USER["用户卡片<br/>头像占位 / 登录文案 / 设置入口占位"]
PAGE --> VIP["会员引导卡片<br/>图标占位 / 说明文案 / CTA 按钮占位"]
PAGE --> ASSET["学习资产四宫格<br/>我的笔记 / 我的书架 / 我的收藏 / 浏览历史"]
PAGE --> RECENT["最近记录卡片<br/>标题 + 空状态文案"]
PAGE --> MORE["其它功能列表<br/>意见反馈 / 分享 APP / 关于我们 / 设置"]
```
## 数据模型
页面 `data` 只承载静态展示信息,建议按 5 组对象/数组组织:
```js
{
userCard: {
avatarText: '?',
title: '点击登录',
subtitle: '登录后查看你的学习资产',
settingsText: '设'
},
vipCard: {
icon: '会员',
title: '开通会员',
subtitle: '解锁更多学习资料、AI 仪表与阅读辅助能力',
actionText: '成为会员'
},
assetItems: [
{ key: 'notes', icon: '记', title: '我的笔记', count: 0 },
{ key: 'bookshelf', icon: '架', title: '我的书架', count: 0 },
{ key: 'favorites', icon: '藏', title: '我的收藏', count: 0 },
{ key: 'history', icon: '史', title: '浏览历史', count: 0 }
],
recentRecord: {
title: '最近记录',
emptyTitle: '还没有回访记录',
emptyDescription: '去典籍阅读或 AI 页完成一次学习,记录会出现在这里。'
},
moreItems: [
{ key: 'feedback', title: '意见反馈' },
{ key: 'share', title: '分享 APP' },
{ key: 'about', title: '关于我们' },
{ key: 'settings', title: '设置' }
]
}
```
约束:
- `assetItems``moreItems` 必须使用 `wx:for`
- `key` 只用于渲染稳定性和后续扩展,不在本次承担业务逻辑
- 所有文本先静态写入 `data`,避免模板中散落魔法字符串
## WXML 结构边界
WXML 只保留三级边界:
- 页面根:`profile-page`
- 区块卡片:`section-card`
- 区块内部局部结构:`profile-header``vip-banner``asset-grid``recent-panel``menu-list`
结构要求:
- 顶部用户卡片和会员卡片为独立卡片,不合并
- 资产区一行固定 4 列,每项包含图标容器、标题、数字
- 最近记录固定为空状态,不渲染列表分支
- 其它功能为纵向列表,每一行使用“左文案 + 右箭头占位”的标准结构
## 样式策略
页面视觉遵循“结构复刻,风格贴合仓库”的原则。
### 页面级
- 延续当前项目已有的米白到浅金渐变背景
- 保持主内容纵向滚动,顶部和底部有稳定安全边距
### 卡片级
- 统一使用浅底、圆角、大留白、轻阴影
- 卡片间距与首页的 `section-card` 节奏接近
- 避免复杂装饰、绝对定位角标和图片背景
### 文本级
- 区块标题延续首页的 `Songti` / serif 风格
- 正文、副文案、数字采用更轻的系统字体层级
- 用户卡片标题突出,辅助说明弱化
### 图标级
- 本次不新增图片资源
- 头像、会员、四宫格图标、右箭头均用字符或简单容器占位
- 图标容器风格统一,避免每块都出现不同视觉语言
## 行为与数据流
本页当前没有真实行为流,只保留静态展示结构。
```mermaid
flowchart LR
DATA["Page data 静态对象"] --> WXML["WXML 区块渲染"]
WXML --> WXSS["WXSS 卡片与布局样式"]
WXSS --> UI["未登录态个人中心静态页面"]
```
约束:
- 不出现 `onLoad` 拉取数据逻辑
- 不出现 `wx.navigateTo``wx.switchTab``wx.login``wx.getUserProfile`
- 不出现依赖外部状态的分支渲染
## 错误处理与边界
由于本次没有网络请求和真实交互,错误处理重点放在布局稳定性:
- `assetItems` 固定为 4 项;若后续数量变化,需要单独评估布局是否仍保持 4 列
- 文案长度以当前中文文案为基准,样式需避免一行被异常挤压
- 图标占位必须在没有外部资源时也能稳定渲染
- 页面在微信常规设备宽度下不能出现卡片溢出、四宫格换行错位、列表箭头挤压
## 测试与验收
本次设计对应的最小验证范围:
1. 页面整体包含 5 个区块,顺序与设计一致
2. 学习资产区稳定为一行 4 列
3. 最近记录展示为空状态,不出现列表分支
4. 其它功能区展示 4 行静态入口
5. 改动范围仅限 `pages/profile/index.*`,不新增业务组件、不接 API / store
若补测试,优先补:
- 页面 `data` 结构渲染测试
- 四宫格与功能列表项数量断言
- 关键标题文案存在性断言
## 实施边界
实施顺序固定为:
1. 重写 `pages/profile/index.js` 中的静态数据
2. 重写 `pages/profile/index.wxml` 的区块结构
3. 重写 `pages/profile/index.wxss` 的整体布局与卡片样式
4. 回查 `app.json``pages/profile/index` 路由已存在,无需新增注册
禁止事项:
- 不提前抽新组件
- 不顺手接登录态
- 不顺手接页面跳转
- 不为“以后可能要用”增加额外抽象