feat: 活动页面建立流程模块化尝试
This commit is contained in:
parent
b75bbeaeb7
commit
ac77b82c51
302
docs/活动页/幸运美金第6季创建记录.md
Normal file
302
docs/活动页/幸运美金第6季创建记录.md
Normal file
@ -0,0 +1,302 @@
|
|||||||
|
# LuckyDollars Season6 创建记录
|
||||||
|
|
||||||
|
本文记录按《快速建立活动页方案》创建 `LuckyDollars Season6` 新活动页的实际步骤。Season6 被当作一个新页面处理:有独立页面目录、独立图片目录、独立页面配置、独立路由和权限配置。为了先验证页面效果,接口参数暂时沿用 Season5。
|
||||||
|
|
||||||
|
## 1. 确认页面类型和模块
|
||||||
|
|
||||||
|
Season6 属于复杂活动页,包含以下模块:
|
||||||
|
|
||||||
|
```text
|
||||||
|
reward
|
||||||
|
ranking
|
||||||
|
lottery
|
||||||
|
task
|
||||||
|
withdraw
|
||||||
|
history
|
||||||
|
rule
|
||||||
|
```
|
||||||
|
|
||||||
|
页面功能目标:先做出与 Season5 行为一致的活动页,后续再替换 Season6 的真实图片和活动接口参数。
|
||||||
|
|
||||||
|
## 2. 创建页面目录
|
||||||
|
|
||||||
|
创建新页面目录:
|
||||||
|
|
||||||
|
```text
|
||||||
|
src/views/Activities/LuckyDollars/Season6/
|
||||||
|
src/views/Activities/LuckyDollars/Season6/components/
|
||||||
|
```
|
||||||
|
|
||||||
|
创建后包含:
|
||||||
|
|
||||||
|
```text
|
||||||
|
src/views/Activities/LuckyDollars/Season6/index.vue
|
||||||
|
src/views/Activities/LuckyDollars/Season6/page.config.js
|
||||||
|
src/views/Activities/LuckyDollars/Season6/components/Barrage.vue
|
||||||
|
src/views/Activities/LuckyDollars/Season6/components/topUser.vue
|
||||||
|
```
|
||||||
|
|
||||||
|
说明:当前 UI 结构参考 Season5 的实现,但 Season6 已抽出自己的页面配置,不直接依赖 Season5 的图片路径和路由。
|
||||||
|
|
||||||
|
## 3. 创建页面配置
|
||||||
|
|
||||||
|
新增:
|
||||||
|
|
||||||
|
```text
|
||||||
|
src/views/Activities/LuckyDollars/Season6/page.config.js
|
||||||
|
```
|
||||||
|
|
||||||
|
配置内容包括:
|
||||||
|
|
||||||
|
```js
|
||||||
|
export const pageConfig = {
|
||||||
|
name: 'LuckyDollars Season6',
|
||||||
|
routePath: '/activities/lucky-dollars-season6',
|
||||||
|
assetPath: 'Activities/LuckyDollars/Season6/',
|
||||||
|
|
||||||
|
activity: {
|
||||||
|
activityId: '2007771533999124198',
|
||||||
|
activityCode: '24198',
|
||||||
|
rewardActivityType: 'CONSUMPTION_ACTIVITY',
|
||||||
|
rankingActivityType: 'USER_RECHARGE_DRAW',
|
||||||
|
},
|
||||||
|
|
||||||
|
modules: ['reward', 'ranking', 'lottery', 'task', 'withdraw', 'history', 'rule'],
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
当前 `activityId` 和 `activityCode` 沿用 Season5,仅用于验证 Season6 页面是否完整可用。后续接真实 Season6 活动时,只改这里。
|
||||||
|
|
||||||
|
## 4. 配置图片路径
|
||||||
|
|
||||||
|
页面中不写死路径,统一从 `pageConfig.assetPath` 获取:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const imageUrl = (filename) => getPngUrl(pageConfig.assetPath, filename)
|
||||||
|
const webpUrl = (filename) => getWebpUrl(pageConfig.assetPath, filename)
|
||||||
|
```
|
||||||
|
|
||||||
|
Season6 的图片路径为:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Activities/LuckyDollars/Season6/
|
||||||
|
```
|
||||||
|
|
||||||
|
开发环境会解析为:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/oss/h5/Azizi/Activities/LuckyDollars/Season6/xxx.png
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. 创建本地 OSS 图片目录
|
||||||
|
|
||||||
|
创建:
|
||||||
|
|
||||||
|
```text
|
||||||
|
public/oss/h5/Azizi/Activities/LuckyDollars/Season6/
|
||||||
|
```
|
||||||
|
|
||||||
|
这个目录用于开发阶段模拟真实 OSS。你已把 Season6 图片补充到该目录。
|
||||||
|
|
||||||
|
注意:`vite.config.js` 中 `/oss` 开发代理已调整为“本地 public 文件优先,本地不存在再代理 CDN”。这样本地 Season6 图片可以直接被 dev server 读取。
|
||||||
|
|
||||||
|
## 6. 按图片清单配置多语言
|
||||||
|
|
||||||
|
Season6 使用图片清单中的支持语言生成多语言图片回退。
|
||||||
|
|
||||||
|
在 `page.config.js` 中声明哪些图片支持语言后缀:
|
||||||
|
|
||||||
|
```js
|
||||||
|
images: {
|
||||||
|
localized: {
|
||||||
|
helpInfo: ['ar'],
|
||||||
|
historyBg: ['ar'],
|
||||||
|
historyBt: ['ar'],
|
||||||
|
lotteryBt: ['ar'],
|
||||||
|
lotteryBtActive: ['ar'],
|
||||||
|
rankBt: ['ar'],
|
||||||
|
rankBtActive: ['ar'],
|
||||||
|
rewardReceive: ['ar'],
|
||||||
|
rewardReceived: ['ar'],
|
||||||
|
rewardReceiveNot: ['ar'],
|
||||||
|
rulesBt: ['ar'],
|
||||||
|
ruleInfo: ['ar'],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
页面中使用:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const getImgName = (filename) => {
|
||||||
|
return getLocalizedImageName(filename, currentLangType.value)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
如果当前语言没有对应图片,自动回退原图,避免请求不存在的图片。
|
||||||
|
|
||||||
|
## 7. 配置排行榜模式
|
||||||
|
|
||||||
|
Season6 的排行榜沿用 Season5 接口,属于服务端分页模式:
|
||||||
|
|
||||||
|
```js
|
||||||
|
ranking: {
|
||||||
|
loadMode: 'remote',
|
||||||
|
pageSize: 20,
|
||||||
|
topCount: 3,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
数据流:
|
||||||
|
|
||||||
|
```text
|
||||||
|
首次请求 pageNo = 1
|
||||||
|
上拉触底后请求 pageNo + 1
|
||||||
|
把新数据追加到 rankingAdd
|
||||||
|
rankingTotal = ranking + rankingAdd
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8. 配置抽奖模式
|
||||||
|
|
||||||
|
Season6 当前奖品已经画在抽奖背景图上,因此抽奖格子属于 `track-only` 模式:
|
||||||
|
|
||||||
|
```js
|
||||||
|
lottery: {
|
||||||
|
prizeRenderMode: 'track-only',
|
||||||
|
slotCount: 9,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
含义:
|
||||||
|
|
||||||
|
```text
|
||||||
|
接口奖品用于计算中奖位置
|
||||||
|
页面只渲染高亮框转圈
|
||||||
|
不在格子内额外渲染奖品图和文字
|
||||||
|
```
|
||||||
|
|
||||||
|
## 9. 增加路由
|
||||||
|
|
||||||
|
在 `src/router/index.js` 中增加:
|
||||||
|
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
path: '/activities/lucky-dollars-season6',
|
||||||
|
name: 'lucky-dollars-season6',
|
||||||
|
component: () => import('../views/Activities/LuckyDollars/Season6/index.vue'),
|
||||||
|
meta: { requiresAuth: true },
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
访问地址:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/activities/lucky-dollars-season6
|
||||||
|
```
|
||||||
|
|
||||||
|
## 10. 补充安全白名单
|
||||||
|
|
||||||
|
在 `src/config/security.js` 的 `PUBLIC_PATHS` 中加入:
|
||||||
|
|
||||||
|
```js
|
||||||
|
'/activities/lucky-dollars-season6'
|
||||||
|
```
|
||||||
|
|
||||||
|
否则页面可能被安全路径检查拦截。
|
||||||
|
|
||||||
|
## 11. 补充权限配置
|
||||||
|
|
||||||
|
在 `src/utils/permissionManager.js` 的 `ACTIVITIES` 中加入:
|
||||||
|
|
||||||
|
```js
|
||||||
|
'/activities/lucky-dollars-season6'
|
||||||
|
```
|
||||||
|
|
||||||
|
否则页面可能被权限管理拦截。
|
||||||
|
|
||||||
|
## 12. 修改页面内跳转来源
|
||||||
|
|
||||||
|
页面内跳转到提现页时,`from` 参数改为 Season6 自己的路由:
|
||||||
|
|
||||||
|
```js
|
||||||
|
query: { from: '/activities/lucky-dollars-season6', activeAction: 'incomeShow' }
|
||||||
|
```
|
||||||
|
|
||||||
|
## 13. 当前仍沿用的参考实现
|
||||||
|
|
||||||
|
为了快速验证视觉和功能,当前 Season6 的主体模板结构、样式细节、弹幕组件、顶部用户组件等仍参考 Season5 的实现。
|
||||||
|
|
||||||
|
本次已先接入以下通用能力,避免新页面只能整页复制:
|
||||||
|
|
||||||
|
```text
|
||||||
|
useLotteryDraw
|
||||||
|
ActivityLotteryGrid
|
||||||
|
useActivityAssets
|
||||||
|
```
|
||||||
|
|
||||||
|
已落地内容:
|
||||||
|
|
||||||
|
- `useActivityAssets`:Season6 的图片 URL、多语言图片名从 `pageConfig` 读取。
|
||||||
|
- `ActivityLotteryGrid`:Season6 的抽奖格子、高亮框、中心按钮区域从页面模板中抽离。
|
||||||
|
- `useLotteryDraw`:Season6 的抽奖转圈动画从页面脚本中抽离。
|
||||||
|
- `pageConfig.lottery`:抽奖背景内容布局、格子布局、历史按钮位置、奖品展示模式改为配置。
|
||||||
|
|
||||||
|
暂未强行改造:
|
||||||
|
|
||||||
|
```text
|
||||||
|
useActivityTabs
|
||||||
|
useActivityRanking
|
||||||
|
```
|
||||||
|
|
||||||
|
原因:Season6 当前标签页和排行榜与大量现有展示状态耦合,继续硬改收益不高。后续真正新建页面时,初始骨架应直接使用这两个 composable,避免一开始就写多个 `reward/rankShow/lotteryShow/incomeShow` 布尔值。
|
||||||
|
|
||||||
|
## 14. 后续给 Codex 建类似页面时的输入
|
||||||
|
|
||||||
|
以后建立同类页面时,不需要说“复制某页面”。建议先按 [建页操作模板.md](./建页操作模板.md) 让 Codex 创建专属页面信息 md,再把必要信息填进去,例如:
|
||||||
|
|
||||||
|
```text
|
||||||
|
页面类型:Activities
|
||||||
|
新页面目录:src/views/Activities/LuckyDollars/Season7
|
||||||
|
参考页面:src/views/Activities/LuckyDollars/Season6
|
||||||
|
路由 path:/activities/lucky-dollars-season7
|
||||||
|
OSS 图片路径:Activities/LuckyDollars/Season7/
|
||||||
|
模块:reward / ranking / lottery / task / withdraw / history / rule
|
||||||
|
排行榜分页方式:remote
|
||||||
|
抽奖奖品展示:track-only
|
||||||
|
多语言图片:按页面创建信息 md 的 3.1 图片清单处理
|
||||||
|
接口参数:先沿用 Season6 或填写真实 activityId/activityCode
|
||||||
|
```
|
||||||
|
|
||||||
|
Codex 应产出可运行初始版本,你再调整具体样式和图片对位。
|
||||||
|
|
||||||
|
## 15. 本地图片 404 处理记录
|
||||||
|
|
||||||
|
开发时曾出现:
|
||||||
|
|
||||||
|
```text
|
||||||
|
GET http://localhost:5173/oss/h5/Azizi/Activities/LuckyDollars/Season6/lotteryBtActive.png 404
|
||||||
|
```
|
||||||
|
|
||||||
|
原因:开发环境的 `/oss` 代理会转发到 CDN。如果本地 dev server 没有优先读取 `public/oss/...`,Season6 这种还没上传到服务端 OSS 的图片就会请求失败。
|
||||||
|
|
||||||
|
处理方式:调整 `vite.config.js` 的 `/oss` 代理,先判断请求文件是否存在于项目 `public` 目录,存在则直接返回本地 public 路径;不存在再代理到 CDN。
|
||||||
|
|
||||||
|
修改配置后需要重启 `npm run dev`,旧 dev server 不会自动吃到 `vite.config.js` 的变更。
|
||||||
|
|
||||||
|
## 16. 验证记录
|
||||||
|
|
||||||
|
已运行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
结果:构建成功。
|
||||||
|
|
||||||
|
构建期间仍有既有警告:
|
||||||
|
|
||||||
|
```text
|
||||||
|
../assets/images/Azizi/secondBg.png referenced in ../assets/images/Azizi/secondBg.png didn't resolve at build time
|
||||||
|
```
|
||||||
|
|
||||||
|
该警告不是 Season6 新增代码引起的,构建仍正常完成。
|
||||||
223
docs/活动页/建页执行流程.md
Normal file
223
docs/活动页/建页执行流程.md
Normal file
@ -0,0 +1,223 @@
|
|||||||
|
# 建页执行流程
|
||||||
|
|
||||||
|
这份文档给 Codex 执行用。用户不需要阅读这里,用户只需要按 [建页操作模板.md](./建页操作模板.md) 操作。
|
||||||
|
|
||||||
|
## 1. 用户只给页面名称和创建位置时
|
||||||
|
|
||||||
|
当用户只提供类似信息:
|
||||||
|
|
||||||
|
```text
|
||||||
|
页面名称:LuckyDollars Season7
|
||||||
|
创建位置:src/views/Activities/LuckyDollars/Season7
|
||||||
|
```
|
||||||
|
|
||||||
|
只执行以下步骤:
|
||||||
|
|
||||||
|
```text
|
||||||
|
1. 根据路径判断页面类型:
|
||||||
|
- src/views/Activities 下为 Activities
|
||||||
|
- src/views/Ranking 下为 Ranking
|
||||||
|
2. 在 docs/活动页/ 下创建专属页面信息 md。
|
||||||
|
3. md 文件名使用中文或页面名,例如 LuckyDollars-Season7-创建信息.md。
|
||||||
|
4. 预填页面类型、页面名称、页面目录、route path、route name、OSS 相对路径、本地开发目录。
|
||||||
|
5. route path 和 route name 根据页面类型、页面名称、页面目录自动生成;用户后续可以自行修改。
|
||||||
|
6. 安全白名单片段和权限页面片段也使用 route path 自动生成,不留空。
|
||||||
|
7. OSS 相对路径和本地开发目录根据页面类型和页面目录自动生成;用户后续可以自行修改。
|
||||||
|
8. 如果本地开发目录已存在且里面有图片,扫描图片文件并预填 3.1 多语言图片清单。
|
||||||
|
9. 根据页面类型、3.1 图片清单和模块预设,自动预填 3.2、3.3、4.x 模块配置。
|
||||||
|
10. 只把无法推断或风险较高的字段留空,并在备注中说明需要用户确认。
|
||||||
|
11. 本轮不创建页面代码,除非用户明确要求继续创建页面。
|
||||||
|
```
|
||||||
|
|
||||||
|
路由自动生成规则:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Activities 页面:
|
||||||
|
src/views/Activities/LuckyDollars/Season6
|
||||||
|
-> route path: /activities/lucky-dollars-season6
|
||||||
|
-> route name: lucky-dollars-season6
|
||||||
|
|
||||||
|
Ranking 页面:
|
||||||
|
src/views/Ranking/OverallSeason2
|
||||||
|
-> route path: /ranking/overall-season2
|
||||||
|
-> route name: overall-season2
|
||||||
|
```
|
||||||
|
|
||||||
|
安全白名单和权限页面片段生成规则:
|
||||||
|
|
||||||
|
```text
|
||||||
|
src/config/security.js:使用 route path。
|
||||||
|
src/utils/permissionManager.js:使用 route path,后面注释使用页面名称。
|
||||||
|
```
|
||||||
|
|
||||||
|
OSS 路径生成规则:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Activities 页面:
|
||||||
|
src/views/Activities/LuckyDollars/Season6
|
||||||
|
-> OSS 相对路径: Activities/LuckyDollars/Season6/
|
||||||
|
-> 本地开发目录: public/oss/h5/Azizi/Activities/LuckyDollars/Season6/
|
||||||
|
|
||||||
|
Ranking 页面:
|
||||||
|
src/views/Ranking/OverallSeason2
|
||||||
|
-> OSS 相对路径: Ranking/OverallSeason2/
|
||||||
|
-> 本地开发目录: public/oss/h5/Azizi/Ranking/OverallSeason2/
|
||||||
|
```
|
||||||
|
|
||||||
|
多语言图片自动扫描规则:
|
||||||
|
|
||||||
|
```text
|
||||||
|
scanDir = 专属 md 中的本地开发目录
|
||||||
|
只扫描常见图片扩展名:png、jpg、jpeg、webp、gif、svg。
|
||||||
|
忽略 .gitkeep 等非图片文件。
|
||||||
|
文件名不带语言后缀时,记为 en 原图,例如 bg0.png -> bg0: en。
|
||||||
|
文件名带 _ar、_bn、_tr 等语言后缀时,按基础名合并,例如 rankBt.png + rankBt_ar.png -> rankBt: en, ar。
|
||||||
|
如果只有 rankBt_ar.png 且没有 rankBt.png,也生成 rankBt: ar,并在备注里标记缺少原图。
|
||||||
|
默认支持 ar、bn、tr;遇到其它形如 _xx 的语言后缀时也保留,但生成页面时需要确认是否接入。
|
||||||
|
生成 3.1 图片清单时,按图片名首字母排序,排序忽略大小写。
|
||||||
|
专属 md 的 3.1 展示扫描结果;备注优先匹配 docs/活动页/建页资料库.md 中的常用图片中文用途。
|
||||||
|
能匹配到常用名时不要写“扫描生成”,例如 bg0 写“页面背景第 0 段”,rankBt 写“排行榜按钮”。
|
||||||
|
匹配不到常用名时,根据图片名语义推断中文用途;用户的图片名通常按功能命名,例如 taskTalk 可写“聊天任务图标”,RewardRecharge500 可写“充值 500 奖励图”。
|
||||||
|
rankingTopBg 统一解释为“排行榜前几名展示区背景”;历史 topBg 也按该含义解释,不要写成“顶部区域背景”。
|
||||||
|
只有图片名完全看不出功能时,才备注“待确认用途”,方便用户回头改。
|
||||||
|
不再要求用户填写“多语言图片规则”;生成页面时直接读取 3.1 中每张图片的支持语言。
|
||||||
|
3.2 和 3.3 默认按图片用途自动生成:首屏背景、默认标签页、顶部信息、默认模块放 blocking;弹窗、非默认标签页、抽奖结果、下方模块放 background。
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. 用户补完专属 md 并要求继续建页时
|
||||||
|
|
||||||
|
执行顺序:
|
||||||
|
|
||||||
|
```text
|
||||||
|
1. 读取专属页面信息 md。
|
||||||
|
2. 读取 docs/活动页/建页操作模板.md。
|
||||||
|
3. 读取 docs/活动页/建页资料库.md。
|
||||||
|
4. 如果有参考页面,读取参考页面结构和接口用法。
|
||||||
|
5. 只处理专属 md 中已填写的信息,未填写项跳过。
|
||||||
|
6. 创建页面目录。
|
||||||
|
7. 创建 page.config.js。
|
||||||
|
8. 创建或生成 index.vue 初版。
|
||||||
|
9. 如果专属 md 中“是否需要 Codex 自动创建本地开发目录”为“是”,创建 public/oss/h5/Azizi/... 本地图片目录。
|
||||||
|
10. 添加路由。
|
||||||
|
11. 补充 src/config/security.js。
|
||||||
|
12. 补充 src/utils/permissionManager.js。
|
||||||
|
13. 按需接入组件和 composable。
|
||||||
|
14. 运行 npm run build。
|
||||||
|
15. 把完成项、跳过项、待补项、验证结果写回专属 md。
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. 执行原则
|
||||||
|
|
||||||
|
```text
|
||||||
|
专属 md 没填的项,不猜。
|
||||||
|
专属 md 中需要用户填写的模块配置、接口参数、组件需求,优先使用 JSON 代码块,不使用 Markdown 表格。
|
||||||
|
扫描生成的图片清单和预加载清单可以保留 Markdown 表格,因为它们主要用于检查和排序。
|
||||||
|
模块图片优先从 3.1 图片清单中按图片名语义推断;推断不到时再参考建页资料库给默认名,并标记待确认。
|
||||||
|
模块预设里的图片名只有在 3.1 图片清单存在时才直接写入;不存在时留空,并在 remark 中写“本地图片清单未扫描到 xxx,待确认”。
|
||||||
|
常见模块接口优先走模块预设,不要求用户重复填写。
|
||||||
|
如果同一个模块在不同页面存在接口或字段差异,且没有提供参考页面,要先问用户参考哪个页面的模块。
|
||||||
|
参考页面只作为结构和接口参考,不把新页面当成复制旧页面。
|
||||||
|
新增 js/vue 文件尽量加中文注释。
|
||||||
|
docs 下文件和文件夹使用中文命名。
|
||||||
|
页面初版以能运行、结构清楚、方便微调为目标。
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. page.config.js 建议结构
|
||||||
|
|
||||||
|
新页面优先使用分组后的模块配置,不再使用单纯数组:
|
||||||
|
|
||||||
|
```js
|
||||||
|
export const pageConfig = {
|
||||||
|
name: '',
|
||||||
|
routePath: '',
|
||||||
|
assetPath: '',
|
||||||
|
|
||||||
|
activity: {
|
||||||
|
activityId: '',
|
||||||
|
activityCode: '',
|
||||||
|
activityType: '',
|
||||||
|
rankingActivityType: '',
|
||||||
|
rewardActivityType: '',
|
||||||
|
},
|
||||||
|
|
||||||
|
modules: {
|
||||||
|
tabs: [],
|
||||||
|
sections: [],
|
||||||
|
popups: [],
|
||||||
|
features: [],
|
||||||
|
},
|
||||||
|
|
||||||
|
images: {
|
||||||
|
localized: {},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
含义:
|
||||||
|
|
||||||
|
```text
|
||||||
|
tabs:标签页模块,如 reward、ranking、lottery、withdraw
|
||||||
|
sections:页面区块,如 task、badgeReward、myInfo
|
||||||
|
popups:弹窗,如 rule、help、history、result
|
||||||
|
features:功能能力,如 countdown、barrage、transfer、exchange
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. 路由和权限
|
||||||
|
|
||||||
|
每个新页面都要确认:
|
||||||
|
|
||||||
|
```text
|
||||||
|
src/router/index.js
|
||||||
|
src/config/security.js
|
||||||
|
src/utils/permissionManager.js
|
||||||
|
```
|
||||||
|
|
||||||
|
如果专属 md 中明确写“不需要”,才跳过。
|
||||||
|
|
||||||
|
## 6. 图片和缓存
|
||||||
|
|
||||||
|
开发期图片目录:
|
||||||
|
|
||||||
|
```text
|
||||||
|
public/oss/h5/Azizi/Activities/PageName/
|
||||||
|
public/oss/h5/Azizi/Ranking/PageName/
|
||||||
|
```
|
||||||
|
|
||||||
|
页面代码中仍使用 OSS 相对路径:
|
||||||
|
|
||||||
|
```js
|
||||||
|
assetPath: 'Activities/PageName/'
|
||||||
|
assetPath: 'Ranking/PageName/'
|
||||||
|
```
|
||||||
|
|
||||||
|
替换同名 OSS 图片时,需要提醒用户更新:
|
||||||
|
|
||||||
|
```text
|
||||||
|
src/config/imageCacheVersion.js
|
||||||
|
```
|
||||||
|
|
||||||
|
分阶段预加载实现规则:
|
||||||
|
|
||||||
|
```text
|
||||||
|
1. page.config.js 中保留两个列表:
|
||||||
|
- preload.blocking:进入页面前同步预加载,参与加载动画。
|
||||||
|
- preload.background:进入页面后后台预加载,不参与加载动画。
|
||||||
|
2. blocking 列表为空时,不强制等待图片,页面可直接进入。
|
||||||
|
3. background 列表为空时,不生成额外逻辑或生成 no-op 逻辑。
|
||||||
|
4. 两个列表都要走同一套 imageUrl/getImgName 规则,保证本地 OSS、线上 OSS、图片缓存和多语言后缀一致。
|
||||||
|
5. 后台预加载在 blocking 完成、页面可见后执行,优先使用 requestIdleCallback,兼容时用 setTimeout。
|
||||||
|
6. 后台预加载失败只记录日志,不影响页面展示和交互。
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. 完成后写回专属 md
|
||||||
|
|
||||||
|
建页完成后,在专属 md 的“建页后记录”中补充:
|
||||||
|
|
||||||
|
```text
|
||||||
|
已完成:
|
||||||
|
未填写所以跳过:
|
||||||
|
待用户微调:
|
||||||
|
构建结果:
|
||||||
|
本地图片目录:
|
||||||
|
路由 path:
|
||||||
|
```
|
||||||
447
docs/活动页/建页操作模板.md
Normal file
447
docs/活动页/建页操作模板.md
Normal file
@ -0,0 +1,447 @@
|
|||||||
|
# 建页操作模板
|
||||||
|
|
||||||
|
这份文档只回答一个问题:你要怎么操作,才能让我快速生成 `src/views/Activities` 或 `src/views/Ranking` 的初版页面。
|
||||||
|
|
||||||
|
真正建页时不需要一次说完整需求。推荐先让我创建一份“页面创建信息 md”,你在里面按坑位填写;你没填的项,我生成初版时先不处理。
|
||||||
|
|
||||||
|
相关资料:
|
||||||
|
|
||||||
|
- [建页资料库.md](./建页资料库.md):组件用法、常用图片名、配置选项。
|
||||||
|
- [建页执行流程.md](./建页执行流程.md):我真正执行建页时遵守的流程。
|
||||||
|
- [快速建立活动页方案.md](./快速建立活动页方案.md):文档入口和总览。
|
||||||
|
|
||||||
|
## 1. 推荐操作流程
|
||||||
|
|
||||||
|
第一次只告诉我页面名称和创建位置:
|
||||||
|
|
||||||
|
```text
|
||||||
|
新建活动页:LuckyDollars Season7
|
||||||
|
创建位置:src/views/Activities/LuckyDollars/Season7
|
||||||
|
```
|
||||||
|
|
||||||
|
或者:
|
||||||
|
|
||||||
|
```text
|
||||||
|
新建排行榜页:Overall Season2
|
||||||
|
创建位置:src/views/Ranking/OverallSeason2
|
||||||
|
```
|
||||||
|
|
||||||
|
我收到后只做一件事:在 `docs/活动页/` 下创建专属页面信息 md,例如:
|
||||||
|
|
||||||
|
```text
|
||||||
|
docs/活动页/LuckyDollars-Season7-创建信息.md
|
||||||
|
```
|
||||||
|
|
||||||
|
这份 md 会先填好:
|
||||||
|
|
||||||
|
```text
|
||||||
|
页面类型
|
||||||
|
页面名称
|
||||||
|
页面目录
|
||||||
|
route path
|
||||||
|
route name
|
||||||
|
OSS 相对路径
|
||||||
|
本地开发目录
|
||||||
|
```
|
||||||
|
|
||||||
|
其中 `route path` 和 `route name` 会根据页面类型、页面名称、页面目录自动生成。你有特殊需求时,直接在 md 里改掉即可。
|
||||||
|
|
||||||
|
`OSS 相对路径` 和 `本地开发目录` 也会根据页面类型和页面目录自动生成。你只需要选择是否让我自动创建本地开发目录。
|
||||||
|
|
||||||
|
其它信息会尽量由图片扫描和模块预设先填好;只有无法推断的地方才留给你补。
|
||||||
|
|
||||||
|
你填完后,再告诉我:
|
||||||
|
|
||||||
|
```text
|
||||||
|
按 docs/活动页/LuckyDollars-Season7-创建信息.md 继续生成初版页面
|
||||||
|
```
|
||||||
|
|
||||||
|
我再根据你填写的信息创建页面、配置、路由、权限、本地 OSS 目录,并把执行结果写回这份专属 md。
|
||||||
|
|
||||||
|
## 2. 填写规则
|
||||||
|
|
||||||
|
- 模块配置:优先由 Codex 根据页面类型、扫描图片和参考页面自动预设;你只改不符合预期的地方。
|
||||||
|
- 图片名和模块图片:优先从 `3.1 多语言图片清单` 和模块预设中自动推断,通常不用额外填写。
|
||||||
|
- 模块接口:常见模块会自动预设,例如抽奖、奖池、任务、排行榜、中奖历史这类接口不用每次手写。
|
||||||
|
- 没填且无法推断的模块:我先不实现,或标记为“待确认”。
|
||||||
|
- 参考页面只作为结构和接口参考,不代表新页面就是复制旧页面。
|
||||||
|
- 初版页面只保证结构、路径、接口位置、基础交互可用,图片对位和局部样式后续你再微调。
|
||||||
|
- 需要你填写的模块配置、接口参数、组件需求,尽量使用 JSON 代码块,避免用 Markdown 表格对齐。
|
||||||
|
|
||||||
|
## 3. 专属页面信息 md 模板
|
||||||
|
|
||||||
|
我创建专属页面信息 md 时使用下面模板。基础信息会先填好,模块、预加载和图片用途会尽量根据扫描结果自动预设。
|
||||||
|
|
||||||
|
````md
|
||||||
|
# 页面创建信息
|
||||||
|
|
||||||
|
## 1. 基础信息
|
||||||
|
|
||||||
|
- 页面类型:Activities / Ranking
|
||||||
|
- 页面名称:
|
||||||
|
- 页面目录:
|
||||||
|
- 参考页面:
|
||||||
|
- 备注:
|
||||||
|
|
||||||
|
## 2. 路由和权限
|
||||||
|
|
||||||
|
- route path:
|
||||||
|
- route name:
|
||||||
|
- 是否需要登录:是 / 否
|
||||||
|
- 是否加入 `src/config/security.js`:是 / 否
|
||||||
|
- 是否加入 `src/utils/permissionManager.js`:是 / 否
|
||||||
|
|
||||||
|
说明:`route path` 和 `route name` 由 Codex 先自动生成,你可以按需要修改。
|
||||||
|
|
||||||
|
生成规则:
|
||||||
|
|
||||||
|
| 页面类型 | 示例目录 | route path | route name |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| Activities | `src/views/Activities/LuckyDollars/Season6` | `/activities/lucky-dollars-season6` | `lucky-dollars-season6` |
|
||||||
|
| Ranking | `src/views/Ranking/OverallSeason2` | `/ranking/overall-season2` | `overall-season2` |
|
||||||
|
|
||||||
|
### 2.1 路由、白名单、权限片段说明
|
||||||
|
|
||||||
|
专属页面信息 md 中可以展示这三个片段,但不需要你重复填写:
|
||||||
|
|
||||||
|
```text
|
||||||
|
路由代码片段:使用 route path、route name 和页面目录生成。
|
||||||
|
安全白名单片段:值等于 route path,补充到 src/config/security.js。
|
||||||
|
权限页面片段:值等于 route path,后面注释使用页面名称,补充到 src/utils/permissionManager.js。
|
||||||
|
```
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
```js
|
||||||
|
'/activities/lucky-dollars-season6'
|
||||||
|
'/activities/lucky-dollars-season6' // LuckyDollars Season6
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. OSS 图片目录
|
||||||
|
|
||||||
|
- OSS 相对路径:
|
||||||
|
- 本地开发目录:
|
||||||
|
- 是否需要 Codex 自动创建本地开发目录:是 / 否
|
||||||
|
- 图片是否已放入本地目录:是 / 否
|
||||||
|
|
||||||
|
说明:OSS 相对路径和本地开发目录由 Codex 自动预填。
|
||||||
|
|
||||||
|
生成规则:
|
||||||
|
|
||||||
|
| 页面类型 | 示例页面目录 | OSS 相对路径 | 本地开发目录 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| Activities | `src/views/Activities/LuckyDollars/Season6` | `Activities/LuckyDollars/Season6/` | `public/oss/h5/Azizi/Activities/LuckyDollars/Season6/` |
|
||||||
|
| Ranking | `src/views/Ranking/OverallSeason2` | `Ranking/OverallSeason2/` | `public/oss/h5/Azizi/Ranking/OverallSeason2/` |
|
||||||
|
|
||||||
|
如果“是否需要 Codex 自动创建本地开发目录”填“是”,Codex 建页时会创建该目录,方便你直接把图片放进去。
|
||||||
|
|
||||||
|
### 3.1 多语言图片清单
|
||||||
|
|
||||||
|
这部分可由 Codex 扫描本地开发目录自动生成。规则:
|
||||||
|
|
||||||
|
- 无后缀图片视为 `en` 原图,例如 `rankBt.png`。
|
||||||
|
- `_ar`、`_bn`、`_tr` 这类后缀视为对应语言,例如 `rankBt_ar.png`。
|
||||||
|
- 扫描时会按基础图片名合并语言,例如 `rankBt.png` + `rankBt_ar.png` 生成 `rankBt | en, ar`。
|
||||||
|
- 图片清单按图片名首字母排序,排序时忽略大小写,方便你快速找图。
|
||||||
|
- 备注优先按 [建页资料库.md](./建页资料库.md) 的常用图片名整理成中文用途,例如 `bg0` 写“页面背景第 0 段”,`rankBt` 写“排行榜按钮”。
|
||||||
|
- 如果资料库里没有对应图片名,Codex 可以按图片名语义自己起中文用途,例如 `taskTalk` 推断为“聊天任务图标”,`RewardRecharge500` 推断为“充值 500 奖励图”。
|
||||||
|
- 新页面推荐用 `rankingTopBg` 表示“排行榜前几名展示区背景”;历史图片名 `topBg` 也按这个含义识别,不再按“页面顶部背景”处理。
|
||||||
|
- 其它语言后缀可按页面实际情况扩展;没识别到对应语言图片时,页面代码回退使用原图。
|
||||||
|
- 页面生成时不再单独填写“多语言图片规则”,直接以这张清单为准。
|
||||||
|
|
||||||
|
| 图片名 | 支持语言 | 备注 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| | | Codex 扫描并匹配或推断中文用途,必要时你再改 |
|
||||||
|
|
||||||
|
### 3.2 进入页面前同步预加载图片
|
||||||
|
|
||||||
|
这里填写需要和进入页面预加载动画同步的关键图片。Codex 生成页面时会先等待这些图片加载完成,再结束加载动画。
|
||||||
|
|
||||||
|
| 图片名 | 是否包含多语言 | 备注 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| | | |
|
||||||
|
|
||||||
|
### 3.3 进入页面后后台预加载图片
|
||||||
|
|
||||||
|
这里填写不参与进入页面动画、但希望进入页面后继续自动预加载的图片。适合下方长背景、弹窗图、非默认标签页图片、抽奖结果图等。
|
||||||
|
|
||||||
|
| 图片名 | 是否包含多语言 | 备注 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| | | |
|
||||||
|
|
||||||
|
## 4. 模块配置
|
||||||
|
|
||||||
|
这一部分会优先由 Codex 根据页面类型、扫描到的图片名和参考页面自动预设。你只需要改不符合预期的部分;删除或设为 `false` 的模块,初版页面会跳过。
|
||||||
|
|
||||||
|
### 4.1 标签页模块
|
||||||
|
|
||||||
|
填写方式:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"enabled": "",
|
||||||
|
"defaultValue": "",
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"value": "reward",
|
||||||
|
"labelKey": "recharge_reward",
|
||||||
|
"buttonImage": "rewardBt",
|
||||||
|
"activeButtonImage": "rewardBtActive",
|
||||||
|
"remark": "奖励"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "ranking",
|
||||||
|
"labelKey": "ranking",
|
||||||
|
"buttonImage": "rankBt",
|
||||||
|
"activeButtonImage": "rankBtActive",
|
||||||
|
"remark": "排行榜"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 页面区块模块
|
||||||
|
|
||||||
|
常见区块:
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "reward",
|
||||||
|
"enabled": "",
|
||||||
|
"apis": [],
|
||||||
|
"images": [],
|
||||||
|
"remark": "奖励区块"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ranking",
|
||||||
|
"enabled": "",
|
||||||
|
"apis": [],
|
||||||
|
"images": [],
|
||||||
|
"remark": "排行榜区块"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lottery",
|
||||||
|
"enabled": "",
|
||||||
|
"apis": [],
|
||||||
|
"images": [],
|
||||||
|
"remark": "抽奖区块"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "task",
|
||||||
|
"enabled": "",
|
||||||
|
"apis": [],
|
||||||
|
"images": [],
|
||||||
|
"remark": "任务区块"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "withdraw",
|
||||||
|
"enabled": "",
|
||||||
|
"apis": [],
|
||||||
|
"images": [],
|
||||||
|
"remark": "提现/兑换区块"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "countdown",
|
||||||
|
"enabled": "",
|
||||||
|
"apis": [],
|
||||||
|
"images": [],
|
||||||
|
"remark": "倒计时区块"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 弹窗模块
|
||||||
|
|
||||||
|
常见弹窗:
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "rule",
|
||||||
|
"triggerImage": "",
|
||||||
|
"backgroundImage": "",
|
||||||
|
"contentImage": "",
|
||||||
|
"apis": [],
|
||||||
|
"remark": "规则弹窗"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "help",
|
||||||
|
"triggerImage": "",
|
||||||
|
"backgroundImage": "",
|
||||||
|
"contentImage": "",
|
||||||
|
"apis": [],
|
||||||
|
"remark": "帮助弹窗"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "history",
|
||||||
|
"triggerImage": "",
|
||||||
|
"backgroundImage": "",
|
||||||
|
"contentImage": "",
|
||||||
|
"apis": [],
|
||||||
|
"remark": "历史记录弹窗"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "result",
|
||||||
|
"triggerImage": "",
|
||||||
|
"backgroundImage": "",
|
||||||
|
"contentImage": "",
|
||||||
|
"apis": [],
|
||||||
|
"remark": "中奖结果弹窗"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "rewardDetail",
|
||||||
|
"triggerImage": "",
|
||||||
|
"backgroundImage": "",
|
||||||
|
"contentImage": "",
|
||||||
|
"apis": [],
|
||||||
|
"remark": "奖励详情弹窗"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.4 排行榜模块
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"enabled": "",
|
||||||
|
"api": "",
|
||||||
|
"loadMode": "remote / local",
|
||||||
|
"pageSize": "",
|
||||||
|
"topCount": "",
|
||||||
|
"myRankingPath": "",
|
||||||
|
"fieldMap": {
|
||||||
|
"avatar": "",
|
||||||
|
"name": "",
|
||||||
|
"value": "",
|
||||||
|
"userId": "",
|
||||||
|
"rank": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.5 抽奖模块
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"enabled": "",
|
||||||
|
"drawApis": [],
|
||||||
|
"prizePoolApi": "",
|
||||||
|
"drawCountApi": "",
|
||||||
|
"extraApis": [],
|
||||||
|
"displayMode": "track-only / prize-card / custom",
|
||||||
|
"slotCount": "",
|
||||||
|
"centerButtonPosition": "",
|
||||||
|
"historyButtonPosition": "inside / below / absolute / external / hidden",
|
||||||
|
"images": {
|
||||||
|
"background": "",
|
||||||
|
"activeFrame": "",
|
||||||
|
"singleDrawButton": "",
|
||||||
|
"multiDrawButton": "",
|
||||||
|
"historyButton": "",
|
||||||
|
"resultBackground": ""
|
||||||
|
},
|
||||||
|
"remark": ""
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. 接口参数
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"activityId": "",
|
||||||
|
"activityCode": "",
|
||||||
|
"activityType": "",
|
||||||
|
"rankingActivityType": "",
|
||||||
|
"rewardActivityType": "",
|
||||||
|
"otherParams": {}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. 组件需求
|
||||||
|
|
||||||
|
需要哪个就填“是”,不需要或没填的我先不接。
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "BackgroundLayer",
|
||||||
|
"enabled": "",
|
||||||
|
"remark": "长背景分段"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "itemCenter",
|
||||||
|
"enabled": "",
|
||||||
|
"remark": "图片容器"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "topUser / TopUser",
|
||||||
|
"enabled": "",
|
||||||
|
"remark": "前三名用户展示"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Barrage",
|
||||||
|
"enabled": "",
|
||||||
|
"remark": "弹幕"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ActivityTabs",
|
||||||
|
"enabled": "",
|
||||||
|
"remark": "标签页"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ActivityLotteryGrid",
|
||||||
|
"enabled": "",
|
||||||
|
"remark": "抽奖格子"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. 建页后记录
|
||||||
|
|
||||||
|
这部分由 Codex 建页后填写。
|
||||||
|
|
||||||
|
### 7.1 已完成
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
### 7.2 未填写所以跳过
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
### 7.3 待你微调
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
### 7.4 验证结果
|
||||||
|
|
||||||
|
- `npm run build`:
|
||||||
|
- 备注:
|
||||||
|
````
|
||||||
|
|
||||||
|
## 4. 预设选项说明
|
||||||
|
|
||||||
|
这些选项填到专属页面信息 md 时,按下面含义理解。
|
||||||
|
|
||||||
|
| 选项 | 可选值 | 说明 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 页面类型 | `Activities` / `Ranking` | 活动页或排行榜页 |
|
||||||
|
| 预加载方式 | `同步预加载` / `后台预加载` | 同步预加载参与进入动画,后台预加载不阻塞进入页面 |
|
||||||
|
| 排行榜加载方式 | `remote` / `local` | `remote` 为接口分页,`local` 为前端切片 |
|
||||||
|
| 抽奖展示方式 | `track-only` / `prize-card` / `custom` | 只转框 / 显示奖品卡 / 自定义格子 |
|
||||||
|
| 历史按钮位置 | `inside` / `below` / `absolute` / `external` / `hidden` | 抽奖历史按钮放置方式 |
|
||||||
|
|
||||||
|
## 5. 初版页面完成后你检查什么
|
||||||
|
|
||||||
|
```text
|
||||||
|
页面能打开
|
||||||
|
图片路径不 404
|
||||||
|
切语言时图片后缀符合预期
|
||||||
|
路由能进入
|
||||||
|
security 和 permissionManager 已补
|
||||||
|
排行榜能首屏展示
|
||||||
|
上拉加载策略正确:remote 请求下一页 / local slice 下一段
|
||||||
|
抽奖点击后有高亮转圈,并能停到中奖位置
|
||||||
|
弹窗能打开关闭
|
||||||
|
npm run build 通过
|
||||||
|
```
|
||||||
532
docs/活动页/建页资料库.md
Normal file
532
docs/活动页/建页资料库.md
Normal file
@ -0,0 +1,532 @@
|
|||||||
|
# 建页资料库
|
||||||
|
|
||||||
|
这份文档存放建页时常用但不需要每次都手写的信息:组件用法、常用图片名、配置片段。
|
||||||
|
|
||||||
|
## 1. 常用组件用法
|
||||||
|
|
||||||
|
### 1.1 BackgroundLayer
|
||||||
|
|
||||||
|
用途:长页面背景分段渲染,适合 `bg0/bg1/bg2/bg3` 这类长活动页。
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<BackgroundLayer :backgroundImages="[imageUrl('bg0'), imageUrl('bg1'), imageUrl('bg2')]" />
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.2 itemCenter
|
||||||
|
|
||||||
|
用途:背景图 + 内部绝对定位内容,是活动页最常用的图片容器。
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<itemCenter :imgUrl="imageUrl('rewardBg')" contentStyle="padding: 10vw 6vw;">
|
||||||
|
<!-- 内容 -->
|
||||||
|
</itemCenter>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.3 topUser / TopUser
|
||||||
|
|
||||||
|
用途:前三名用户展示。不同页面可能有自己的 `components/topUser.vue`,新页面可先从参考页面复制一份再微调。
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<TopUser
|
||||||
|
:avatarUrl="item.userAvatar"
|
||||||
|
:name="item.userName"
|
||||||
|
:distributionValue="item.amount"
|
||||||
|
/>
|
||||||
|
```
|
||||||
|
|
||||||
|
```js
|
||||||
|
import TopUser from './components/topUser.vue'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.4 Barrage
|
||||||
|
|
||||||
|
用途:中奖用户、活动动态等弹幕。LuckyDollars 页面常用。
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<Barrage :list="barrageList" />
|
||||||
|
```
|
||||||
|
|
||||||
|
```js
|
||||||
|
import Barrage from './components/Barrage.vue'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.5 ActivityTabs
|
||||||
|
|
||||||
|
用途:图片背景标签页。适合初始页面快速搭标签切换。
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<ActivityTabs
|
||||||
|
:bg-url="imageUrl('tagsBg')"
|
||||||
|
:indicator-url="imageUrl('tagBtBg')"
|
||||||
|
:tabs="visibleTabs"
|
||||||
|
:active-value="currentTab"
|
||||||
|
@change="changeTab"
|
||||||
|
/>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.6 ActivityLotteryGrid
|
||||||
|
|
||||||
|
用途:抽奖格子、高亮框和中心按钮区域。不同抽奖背景只改 `page.config.js` 里的布局。
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<ActivityLotteryGrid
|
||||||
|
:prizes="prizeList"
|
||||||
|
:slot-count="pageConfig.lottery.slotCount"
|
||||||
|
:active-index="activeIndex"
|
||||||
|
:active-frame-url="imageUrl('prizeActiveFrame')"
|
||||||
|
:grid-style="pageConfig.lottery.grid.style"
|
||||||
|
:position-map="pageConfig.lottery.grid.positionMap"
|
||||||
|
:button-grid-area="pageConfig.lottery.grid.buttonGridArea"
|
||||||
|
:prize-render-mode="pageConfig.lottery.prizeRenderMode"
|
||||||
|
:disabled="isRolling"
|
||||||
|
@draw="draw(1)"
|
||||||
|
/>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. 常用图片名清单
|
||||||
|
|
||||||
|
下面的图片名来自 `src/views/Activities` 和 `src/views/Ranking` 中常见的 `imageUrl('xxx')`、`webpUrl('xxx')`、`getImgName('xxx')` 用法。新页面不需要全部准备,按模块挑选即可。
|
||||||
|
|
||||||
|
注意:图片名大小写必须和文件名一致。项目里已有一些历史命名,例如 `RankingItem`、`RankingBottomBorder`、`rechargehidden`,这里按现有代码保留。
|
||||||
|
|
||||||
|
### 2.1 页面背景和顶部
|
||||||
|
|
||||||
|
```js
|
||||||
|
imageUrl('bg') // 页面主背景
|
||||||
|
imageUrl('bg0') // 页面背景第 0 段
|
||||||
|
imageUrl('bg1') // 页面背景第 1 段
|
||||||
|
imageUrl('bg2') // 页面背景第 2 段
|
||||||
|
imageUrl('bg3') // 页面背景第 3 段
|
||||||
|
webpUrl('pageTop') // 页面顶部 WebP 背景
|
||||||
|
imageUrl('timeBg') // 活动时间背景
|
||||||
|
imageUrl('dayBg') // 日期/天数背景
|
||||||
|
imageUrl('TimeBg') // 活动时间背景,历史大写命名
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.1.1 排行榜前几名展示区
|
||||||
|
|
||||||
|
推荐新页面使用 `rankingTopBg`,含义更明确:排行榜前几名展示区背景,不限定一定是前三名。
|
||||||
|
|
||||||
|
```js
|
||||||
|
imageUrl('rankingTopBg') // 排行榜前几名展示区背景,推荐新命名
|
||||||
|
imageUrl('topBg') // 排行榜前几名展示区背景,历史命名,不再作为页面顶部背景理解
|
||||||
|
imageUrl('top1') // 第一名头像/排名装饰
|
||||||
|
imageUrl('top2') // 第二名头像/排名装饰
|
||||||
|
imageUrl('top3') // 第三名头像/排名装饰
|
||||||
|
imageUrl('top1Bg') // 第一名独立背景
|
||||||
|
imageUrl('top2Bg') // 第二名独立背景
|
||||||
|
imageUrl('top3Bg') // 第三名独立背景
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 标签页和按钮
|
||||||
|
|
||||||
|
```js
|
||||||
|
imageUrl('tagsBg') // 标签页整体背景
|
||||||
|
imageUrl('tagBtBg') // 标签页选中底图
|
||||||
|
imageUrl(getImgName('rankBt')) // 排行榜未选中按钮
|
||||||
|
imageUrl(getImgName('rankBtActive')) // 排行榜选中按钮
|
||||||
|
imageUrl(getImgName('rankingBt')) // 排行按钮
|
||||||
|
imageUrl(getImgName('rankingBtActive')) // 排行选中按钮
|
||||||
|
imageUrl(getImgName('lotteryBt')) // 抽奖未选中按钮
|
||||||
|
imageUrl(getImgName('lotteryBtActive')) // 抽奖选中按钮
|
||||||
|
imageUrl(getImgName('rewardBt')) // 奖励未选中按钮
|
||||||
|
imageUrl(getImgName('rewardBtActive')) // 奖励选中按钮
|
||||||
|
imageUrl(getImgName('rechargeBt')) // 充值未选中按钮
|
||||||
|
imageUrl(getImgName('rechargeBtActive')) // 充值选中按钮
|
||||||
|
imageUrl(getImgName('redeemBt')) // 兑换按钮
|
||||||
|
imageUrl(getImgName('withdrawalBt')) // 提现未选中按钮
|
||||||
|
imageUrl(getImgName('withdrawalBtActive')) // 提现选中按钮
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3 排行榜
|
||||||
|
|
||||||
|
```js
|
||||||
|
imageUrl('RankingMain') // 排行榜主体背景
|
||||||
|
imageUrl('RankingItem') // 排行榜列表项背景
|
||||||
|
imageUrl('rankingItemBg') // 排行榜列表项背景,另一套命名
|
||||||
|
imageUrl('RankingTopBorder') // 排行榜顶部边框
|
||||||
|
imageUrl('RankingBottomBorder') // 排行榜底部边框
|
||||||
|
imageUrl('RankingBorder') // 排行榜通用边框
|
||||||
|
imageUrl('myRankingBg') // 我的排名固定栏背景
|
||||||
|
imageUrl('rankingNumBg') // 排名数字背景
|
||||||
|
imageUrl('rankingTopBg') // 排行榜前几名展示区背景,推荐新命名
|
||||||
|
imageUrl('topBg') // 排行榜前几名展示区背景,历史命名
|
||||||
|
imageUrl('top1') // 第一名头像/排名装饰
|
||||||
|
imageUrl('top2') // 第二名头像/排名装饰
|
||||||
|
imageUrl('top3') // 第三名头像/排名装饰
|
||||||
|
imageUrl('top1Bg') // 第一名独立背景
|
||||||
|
imageUrl('top2Bg') // 第二名独立背景
|
||||||
|
imageUrl('top3Bg') // 第三名独立背景
|
||||||
|
imageUrl('top1-charm') // 魅力榜第一名装饰
|
||||||
|
imageUrl('top2-charm') // 魅力榜第二名装饰
|
||||||
|
imageUrl('top3-charm') // 魅力榜第三名装饰
|
||||||
|
imageUrl('top1-wealth') // 财富榜第一名装饰
|
||||||
|
imageUrl('top2-wealth') // 财富榜第二名装饰
|
||||||
|
imageUrl('top3-wealth') // 财富榜第三名装饰
|
||||||
|
imageUrl('top1-room') // 房间榜第一名装饰
|
||||||
|
imageUrl('top2-room') // 房间榜第二名装饰
|
||||||
|
imageUrl('top3-room') // 房间榜第三名装饰
|
||||||
|
imageUrl('myRankingBg-charm') // 魅力榜我的排名背景
|
||||||
|
imageUrl('myRankingBg-wealth') // 财富榜我的排名背景
|
||||||
|
imageUrl('myRankingBg-room') // 房间榜我的排名背景
|
||||||
|
imageUrl('RankingItem-charm') // 魅力榜列表项背景
|
||||||
|
imageUrl('RankingItem-wealth') // 财富榜列表项背景
|
||||||
|
imageUrl('RankingItem-room') // 房间榜列表项背景
|
||||||
|
imageUrl('tabSelectedBg') // 榜单分类选中底图
|
||||||
|
imageUrl('rankingSeasonBt') // 赛季榜按钮
|
||||||
|
imageUrl('rankingSeasonBtActive') // 赛季榜选中按钮
|
||||||
|
imageUrl('rankingWeeklyBt') // 周榜按钮
|
||||||
|
imageUrl('rankingWeeklyBtActive') // 周榜选中按钮
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.4 抽奖
|
||||||
|
|
||||||
|
```js
|
||||||
|
imageUrl('lottery') // 抽奖机/抽奖盘背景
|
||||||
|
imageUrl('lotteryBg') // 抽奖区域背景
|
||||||
|
imageUrl('prizeActiveFrame') // 抽奖高亮框
|
||||||
|
imageUrl('draw1BtBg') // 单抽按钮背景
|
||||||
|
imageUrl('draw10BtBg') // 十连抽按钮背景
|
||||||
|
imageUrl('resultBg') // 中奖结果弹窗背景
|
||||||
|
imageUrl('resultBack') // 中奖结果上一页按钮
|
||||||
|
imageUrl('resultNext') // 中奖结果下一页按钮
|
||||||
|
imageUrl('resultBt') // 中奖结果确认按钮
|
||||||
|
imageUrl('resultGoOnBt') // 继续抽奖按钮
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.5 奖励和奖品
|
||||||
|
|
||||||
|
```js
|
||||||
|
imageUrl('rewardBg') // 奖励模块背景
|
||||||
|
imageUrl('reward_banner') // 奖励横幅
|
||||||
|
imageUrl('rewards') // 奖励集合图
|
||||||
|
imageUrl('rewardBack') // 奖励上一页按钮
|
||||||
|
imageUrl('rewardNext') // 奖励下一页按钮
|
||||||
|
imageUrl(getImgName('rewardReceive')) // 奖励领取按钮
|
||||||
|
imageUrl(getImgName('rewardReceived')) // 奖励已领取按钮
|
||||||
|
imageUrl(getImgName('rewardReceiveNot')) // 奖励不可领取按钮
|
||||||
|
imageUrl(getImgName('receiveBt')) // 领取按钮
|
||||||
|
imageUrl(getImgName('receivedBt')) // 已领取按钮
|
||||||
|
imageUrl('reward_gift') // 礼物奖励图标
|
||||||
|
imageUrl('reward_frame') // 头像框奖励图标
|
||||||
|
imageUrl('reward_ride') // 座驾奖励图标
|
||||||
|
imageUrl('ticket') // 抽奖券图标
|
||||||
|
imageUrl('crystal') // 水晶/活动货币图标
|
||||||
|
imageUrl('debris') // 碎片/道具图标
|
||||||
|
imageUrl('giftBg') // 礼物背景
|
||||||
|
imageUrl('giftItemBg') // 礼物列表项背景
|
||||||
|
imageUrl('RewardRecharge100') // 充值 100 奖励图
|
||||||
|
imageUrl('RewardRecharge500') // 充值 500 奖励图
|
||||||
|
imageUrl('RewardRecharge1000') // 充值 1000 奖励图
|
||||||
|
imageUrl('RewardRecharge3000') // 充值 3000 奖励图
|
||||||
|
imageUrl('RewardRecharge5000') // 充值 5000 奖励图
|
||||||
|
imageUrl('RewardRecharge10000') // 充值 10000 奖励图
|
||||||
|
imageUrl('rechargeReward100') // 充值 100 奖励图,另一套命名
|
||||||
|
imageUrl('rechargeReward500') // 充值 500 奖励图,另一套命名
|
||||||
|
imageUrl('rechargeReward1000') // 充值 1000 奖励图,另一套命名
|
||||||
|
imageUrl('rechargeReward3000') // 充值 3000 奖励图,另一套命名
|
||||||
|
imageUrl('rechargeReward5000') // 充值 5000 奖励图,另一套命名
|
||||||
|
imageUrl('rechargeReward10000') // 充值 10000 奖励图,另一套命名
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.6 任务
|
||||||
|
|
||||||
|
```js
|
||||||
|
imageUrl('taskBtGo') // 任务去完成按钮
|
||||||
|
imageUrl('taskBtReceive') // 任务领取按钮
|
||||||
|
imageUrl('taskBtReceived') // 任务已领取按钮
|
||||||
|
imageUrl('taskGame') // 游戏任务图标
|
||||||
|
imageUrl('taskGift') // 送礼任务图标
|
||||||
|
imageUrl('taskRecharge') // 充值任务图标
|
||||||
|
imageUrl('taskTalk') // 聊天/上麦任务图标
|
||||||
|
imageUrl('taskItemBg') // 任务列表项背景
|
||||||
|
imageUrl('taskListBg') // 任务列表背景
|
||||||
|
imageUrl('taskTypeGame') // 游戏任务类型图标
|
||||||
|
imageUrl('taskTypeGift') // 礼物任务类型图标
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.7 弹窗、规则、帮助和历史
|
||||||
|
|
||||||
|
```js
|
||||||
|
imageUrl(getImgName('helpInfo')) // 帮助说明图片
|
||||||
|
imageUrl('helpBg') // 帮助弹窗背景
|
||||||
|
imageUrl('helpBt') // 帮助按钮
|
||||||
|
imageUrl(getImgName('ruleInfo')) // 规则说明图片
|
||||||
|
imageUrl('ruleInfoBg') // 规则弹窗背景
|
||||||
|
imageUrl(getImgName('ruleTitle')) // 规则标题图
|
||||||
|
imageUrl(getImgName('rulesBt')) // 规则按钮
|
||||||
|
imageUrl(getImgName('historyBt')) // 历史按钮
|
||||||
|
imageUrl(getImgName('historyBg')) // 历史弹窗背景
|
||||||
|
imageUrl('historyTopBg') // 历史弹窗顶部背景
|
||||||
|
imageUrl('recordBg') // 记录列表背景
|
||||||
|
imageUrl('closeBt') // 关闭按钮
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.8 用户信息、充值和收益
|
||||||
|
|
||||||
|
```js
|
||||||
|
imageUrl('myInfoBg') // 我的信息背景
|
||||||
|
imageUrl('myAvatarFrame') // 我的头像框
|
||||||
|
imageUrl('userNameBorder') // 用户名边框
|
||||||
|
imageUrl('userFrame') // 用户头像框
|
||||||
|
imageUrl('earningInfoBg') // 收益信息背景
|
||||||
|
imageUrl('earningsBg') // 收益背景
|
||||||
|
imageUrl('distribution') // 分发/派奖图标
|
||||||
|
imageUrl('rechargehidden') // 充值金额隐藏图标
|
||||||
|
imageUrl('rechargeShow') // 充值金额显示图标
|
||||||
|
imageUrl('rechargeNumHidden') // 充值数字隐藏图标
|
||||||
|
imageUrl('rechargeNumShow') // 充值数字显示图标
|
||||||
|
imageUrl('amountHiddenBt') // 金额隐藏按钮
|
||||||
|
imageUrl('amountShowBt') // 金额显示按钮
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.9 游戏玩法和特殊模块
|
||||||
|
|
||||||
|
```js
|
||||||
|
imageUrl('gameLotteryBt') // 游戏玩法-抽奖按钮
|
||||||
|
imageUrl('gameLotteryBtActive') // 游戏玩法-抽奖选中按钮
|
||||||
|
imageUrl('gameSignInBt') // 游戏玩法-签到按钮
|
||||||
|
imageUrl('gameSignInBtActive') // 游戏玩法-签到选中按钮
|
||||||
|
imageUrl('gameExchangeBt') // 游戏玩法-兑换按钮
|
||||||
|
imageUrl('gameExchangeBtActive') // 游戏玩法-兑换选中按钮
|
||||||
|
imageUrl('goodsItem') // 兑换商品项背景
|
||||||
|
imageUrl('makeUpBtBg') // 补签按钮背景
|
||||||
|
imageUrl('rewardGoodsBg') // 奖励物品背景
|
||||||
|
imageUrl('progressBar') // 进度条图片
|
||||||
|
imageUrl('timeBack') // 时间/日期上一页按钮
|
||||||
|
imageUrl('timeNext') // 时间/日期下一页按钮
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. 模块预设
|
||||||
|
|
||||||
|
这些预设用于创建“页面创建信息 md”时自动填充,目标是少问、少填、先生成能跑的初版。图片字段优先从 `3.1 多语言图片清单` 中匹配;没有匹配到的图片名可以留空或标记待确认。
|
||||||
|
|
||||||
|
### 3.1 Activities 通用活动页
|
||||||
|
|
||||||
|
适用:`src/views/Activities` 下类似 LuckyDollars、LesserBairam、SpringFestival 的活动页。
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"reward": {
|
||||||
|
"enabledWhenAnyImageExists": ["rewardBg", "rewardReceive", "rewardReceived", "rewardReceiveNot"],
|
||||||
|
"apis": ["activityRewardConfigs", "myRecharge", "receiveRechargeReward"],
|
||||||
|
"defaultImages": ["rewardBg", "rewardReceive", "rewardReceived", "rewardReceiveNot", "ticket", "reward_gift", "reward_frame", "reward_ride"],
|
||||||
|
"remark": "充值/消费奖励模块"
|
||||||
|
},
|
||||||
|
"ranking": {
|
||||||
|
"enabledWhenAnyImageExists": ["RankingItem", "myRankingBg", "rankingTopBg", "topBg", "top1", "top2", "top3", "rankBt", "rankBtActive"],
|
||||||
|
"apis": ["ranklist"],
|
||||||
|
"loadMode": "remote",
|
||||||
|
"pageSize": 20,
|
||||||
|
"topCount": 3,
|
||||||
|
"myRankingPath": "ranklist.body.currentUser",
|
||||||
|
"fieldMap": {
|
||||||
|
"avatar": "userAvatar",
|
||||||
|
"name": "userName",
|
||||||
|
"value": "amount",
|
||||||
|
"userId": "userId",
|
||||||
|
"rank": "rank"
|
||||||
|
},
|
||||||
|
"defaultImages": ["RankingItem", "myRankingBg", "rankingTopBg", "top1", "top2", "top3"],
|
||||||
|
"remark": "活动内排行榜,常见为接口分页"
|
||||||
|
},
|
||||||
|
"lottery": {
|
||||||
|
"enabledWhenAnyImageExists": ["lottery", "lotteryBg", "prizeActiveFrame", "lotteryBt", "lotteryBtActive"],
|
||||||
|
"drawApis": ["onceDraw", "multiDraw"],
|
||||||
|
"prizePoolApi": "activityDetail",
|
||||||
|
"drawCountApi": "myTickets",
|
||||||
|
"extraApis": ["myTotalDrawCount", "rewardConfigsBadge", "winnerHistory"],
|
||||||
|
"historyApi": "drawRecords",
|
||||||
|
"displayMode": "track-only",
|
||||||
|
"slotCount": 8,
|
||||||
|
"historyButtonPosition": "inside",
|
||||||
|
"defaultImages": {
|
||||||
|
"background": "lottery",
|
||||||
|
"activeFrame": "prizeActiveFrame",
|
||||||
|
"historyButton": "historyBt",
|
||||||
|
"resultBackground": "resultBg"
|
||||||
|
},
|
||||||
|
"remark": "抽奖接口基本固定;奖品展示方式按页面图片调整"
|
||||||
|
},
|
||||||
|
"task": {
|
||||||
|
"enabledWhenAnyImageExists": ["taskBtGo", "taskBtReceive", "taskBtReceived", "taskGame", "taskGift", "taskRecharge", "taskTalk"],
|
||||||
|
"apis": ["ActTaskList", "receiveTickets"],
|
||||||
|
"defaultImages": ["taskBtGo", "taskBtReceive", "taskBtReceived", "taskGame", "taskGift", "taskRecharge", "taskTalk"],
|
||||||
|
"remark": "任务列表和任务领奖"
|
||||||
|
},
|
||||||
|
"withdraw": {
|
||||||
|
"enabledWhenAnyImageExists": ["earningInfoBg", "myInfoBg"],
|
||||||
|
"apis": ["withdrawableAmount", "transferActivityDollar", "exchangeCoin"],
|
||||||
|
"defaultImages": ["earningInfoBg", "myInfoBg"],
|
||||||
|
"remark": "提现、转账或兑换模块"
|
||||||
|
},
|
||||||
|
"popups": {
|
||||||
|
"rule": {
|
||||||
|
"enabledWhenAnyImageExists": ["rulesBt", "ruleInfo"],
|
||||||
|
"triggerImage": "rulesBt",
|
||||||
|
"contentImage": "ruleInfo"
|
||||||
|
},
|
||||||
|
"help": {
|
||||||
|
"enabledWhenAnyImageExists": ["helpBt", "helpInfo"],
|
||||||
|
"triggerImage": "helpBt",
|
||||||
|
"contentImage": "helpInfo"
|
||||||
|
},
|
||||||
|
"history": {
|
||||||
|
"enabledWhenAnyImageExists": ["historyBt", "historyBg"],
|
||||||
|
"triggerImage": "historyBt",
|
||||||
|
"backgroundImage": "historyBg",
|
||||||
|
"apis": ["drawRecords"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 Ranking 独立排行榜页
|
||||||
|
|
||||||
|
适用:`src/views/Ranking` 下独立排行榜页。这里要特别区分加载方式:
|
||||||
|
|
||||||
|
- `remote`:接口支持 `pageNo/pageSize`,上拉时继续请求下一页。
|
||||||
|
- `local`:接口一次返回完整榜单,前端先展示一段,上拉时 `slice` 下一段,例如 `src/views/Ranking/Overall/Ranking.vue`。
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"ranking": {
|
||||||
|
"loadMode": "local / remote",
|
||||||
|
"topCount": 3,
|
||||||
|
"pageSize": 10,
|
||||||
|
"fieldMap": {
|
||||||
|
"avatar": "avatar",
|
||||||
|
"name": "nickname",
|
||||||
|
"value": "quantityFormat",
|
||||||
|
"userId": "id",
|
||||||
|
"rank": "rank"
|
||||||
|
},
|
||||||
|
"commonImages": [
|
||||||
|
"RankingItem",
|
||||||
|
"myRankingBg",
|
||||||
|
"top1",
|
||||||
|
"top2",
|
||||||
|
"top3",
|
||||||
|
"tabSelectedBg"
|
||||||
|
],
|
||||||
|
"remark": "如果接口差异不明确,先问用户参考哪个 Ranking 页面"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3 什么时候需要问用户
|
||||||
|
|
||||||
|
```text
|
||||||
|
同一模块存在多个接口版本时,问参考页面。
|
||||||
|
抽奖模块不是 8 格或不是 track-only 时,问抽奖展示方式。
|
||||||
|
排行榜接口不知道是 remote 还是 local 时,问参考页面或看接口是否传 pageNo/pageSize。
|
||||||
|
图片名看不出用途且无法从参考页面推断时,标记待确认,不阻塞初版生成。
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. 页面配置片段
|
||||||
|
|
||||||
|
### 4.1 图片工具
|
||||||
|
|
||||||
|
```js
|
||||||
|
import { useActivityAssets } from '@/composables/activity/useActivityAssets.js'
|
||||||
|
import { pageConfig } from './page.config.js'
|
||||||
|
|
||||||
|
const currentLangType = computed(() => {
|
||||||
|
return langStore.selectedLang?.type || 'en'
|
||||||
|
})
|
||||||
|
|
||||||
|
const { imageUrl, webpUrl, getImageName: getImgName } = useActivityAssets(
|
||||||
|
pageConfig,
|
||||||
|
currentLangType,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 标签页
|
||||||
|
|
||||||
|
```js
|
||||||
|
import { useActivityTabs } from '@/composables/activity/useActivityTabs.js'
|
||||||
|
|
||||||
|
const { currentTab, visibleTabs, isTab, changeTab } = useActivityTabs(pageConfig.tabs, {
|
||||||
|
translate: t,
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 排行榜
|
||||||
|
|
||||||
|
```js
|
||||||
|
import { useActivityRanking } from '@/composables/activity/useActivityRanking.js'
|
||||||
|
|
||||||
|
const rankingState = useActivityRanking({
|
||||||
|
loadMode: pageConfig.ranking.loadMode,
|
||||||
|
pageSize: pageConfig.ranking.pageSize,
|
||||||
|
topCount: pageConfig.ranking.topCount,
|
||||||
|
fetchPage: ({ pageNo, pageSize }) => {
|
||||||
|
return ranklist({
|
||||||
|
activityId: pageConfig.activity.activityId,
|
||||||
|
pageNo,
|
||||||
|
pageSize,
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.4 抽奖
|
||||||
|
|
||||||
|
```js
|
||||||
|
import { useLotteryDraw } from '@/composables/activity/useLotteryDraw.js'
|
||||||
|
|
||||||
|
const { activeIndex, isRolling, startLottery } = useLotteryDraw({
|
||||||
|
getSlotCount: () => prizeList.value.length || pageConfig.lottery.slotCount,
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.5 分阶段图片预加载
|
||||||
|
|
||||||
|
用途:把首屏关键图片和后续图片拆开。首屏关键图片参与进入页面加载动画;弹窗、非默认标签页、下方长背景等图片在页面进入后后台继续预加载。
|
||||||
|
|
||||||
|
```js
|
||||||
|
// 进入页面前必须完成的图片,加载完成后再结束 loading 动画。
|
||||||
|
const blockingPreloadImageNames = pageConfig.preload?.blocking || []
|
||||||
|
|
||||||
|
// 进入页面后继续后台加载的图片,不阻塞页面展示。
|
||||||
|
const backgroundPreloadImageNames = pageConfig.preload?.background || []
|
||||||
|
|
||||||
|
// 统一走 imageUrl 和 getImgName,保证本地 OSS、线上 OSS、缓存版本、多语言后缀规则一致。
|
||||||
|
const resolvePreloadUrls = (names = []) => {
|
||||||
|
return [...new Set(names)].map((name) => imageUrl(getImgName(name)))
|
||||||
|
}
|
||||||
|
|
||||||
|
const preloadImageList = (urls = []) => {
|
||||||
|
return Promise.all(
|
||||||
|
urls.map((url) => new Promise((resolve) => {
|
||||||
|
const img = new Image()
|
||||||
|
img.onload = resolve
|
||||||
|
img.onerror = resolve
|
||||||
|
img.src = url
|
||||||
|
})),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const preloadBlockingImages = async () => {
|
||||||
|
await preloadImageList(resolvePreloadUrls(blockingPreloadImageNames))
|
||||||
|
}
|
||||||
|
|
||||||
|
const preloadBackgroundImages = () => {
|
||||||
|
const urls = resolvePreloadUrls(backgroundPreloadImageNames)
|
||||||
|
if (!urls.length) return
|
||||||
|
|
||||||
|
// 后台预加载不影响当前页面展示,所以失败也只吞掉。
|
||||||
|
const run = () => preloadImageList(urls).catch(() => {})
|
||||||
|
if (window.requestIdleCallback) {
|
||||||
|
window.requestIdleCallback(run)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
setTimeout(run, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
await preloadBlockingImages()
|
||||||
|
isLoading.value = false
|
||||||
|
preloadBackgroundImages()
|
||||||
|
})
|
||||||
|
```
|
||||||
65
docs/活动页/快速建立活动页方案.md
Normal file
65
docs/活动页/快速建立活动页方案.md
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
# 活动页与排行榜页建页文档总览
|
||||||
|
|
||||||
|
当前 `src/views/Activities` 和 `src/views/Ranking` 的快速建页流程已经收敛为三份文档。
|
||||||
|
|
||||||
|
## 1. 你主要看哪份
|
||||||
|
|
||||||
|
优先看:
|
||||||
|
|
||||||
|
[建页操作模板.md](./建页操作模板.md)
|
||||||
|
|
||||||
|
用途:
|
||||||
|
|
||||||
|
```text
|
||||||
|
告诉你怎么操作
|
||||||
|
告诉你第一次只需要提供什么
|
||||||
|
提供专属页面信息 md 模板
|
||||||
|
保留需要填写的模块、接口、图片名、组件需求
|
||||||
|
```
|
||||||
|
|
||||||
|
以后新建页面时,推荐先告诉 Codex:
|
||||||
|
|
||||||
|
```text
|
||||||
|
页面名称:
|
||||||
|
创建位置:
|
||||||
|
```
|
||||||
|
|
||||||
|
Codex 会先创建专属页面信息 md 给你填写。
|
||||||
|
|
||||||
|
## 2. 有用资料放在哪
|
||||||
|
|
||||||
|
[建页资料库.md](./建页资料库.md)
|
||||||
|
|
||||||
|
用途:
|
||||||
|
|
||||||
|
```text
|
||||||
|
常用组件用法
|
||||||
|
常用 imageUrl 图片名和中文用途
|
||||||
|
图片工具、标签页、排行榜、抽奖配置片段
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Codex 执行流程放在哪
|
||||||
|
|
||||||
|
[建页执行流程.md](./建页执行流程.md)
|
||||||
|
|
||||||
|
用途:
|
||||||
|
|
||||||
|
```text
|
||||||
|
规定 Codex 先建专属页面信息 md
|
||||||
|
规定 Codex 只处理你填写过的信息
|
||||||
|
规定 Codex 如何生成初版页面
|
||||||
|
规定完成后要把结果写回专属 md
|
||||||
|
```
|
||||||
|
|
||||||
|
你平时不需要看这份,除非想确认 Codex 会怎么执行。
|
||||||
|
|
||||||
|
## 4. 历史创建记录
|
||||||
|
|
||||||
|
[幸运美金第6季创建记录.md](./幸运美金第6季创建记录.md)
|
||||||
|
|
||||||
|
用途:
|
||||||
|
|
||||||
|
```text
|
||||||
|
记录 LuckyDollars Season6 当时的创建过程
|
||||||
|
作为历史参考,不作为新的通用模板
|
||||||
|
```
|
||||||
429
src/views/Activities/LuckyDollars/Season6/页面创建信息-完整参考.md
Normal file
429
src/views/Activities/LuckyDollars/Season6/页面创建信息-完整参考.md
Normal file
@ -0,0 +1,429 @@
|
|||||||
|
# 页面创建信息
|
||||||
|
|
||||||
|
## 1. 基础信息
|
||||||
|
|
||||||
|
- 页面类型:Activities
|
||||||
|
- 页面名称:LuckyDollars Season6
|
||||||
|
- 页面目录:src/views/Activities/LuckyDollars/Season6
|
||||||
|
- 参考页面:src/views/Activities/LuckyDollars/Season5
|
||||||
|
- 备注:作为新页面处理,初版效果参考 Season5,接口参数和图片可先沿用 Season5/Season6 测试数据。
|
||||||
|
|
||||||
|
## 2. 路由和权限
|
||||||
|
|
||||||
|
- route path:/activities/lucky-dollars-season6
|
||||||
|
- route name:lucky-dollars-season6
|
||||||
|
- 是否需要登录:是
|
||||||
|
- 是否加入 `src/config/security.js`:是
|
||||||
|
- 是否加入 `src/utils/permissionManager.js`:是
|
||||||
|
|
||||||
|
### 2.1 路由代码片段
|
||||||
|
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
path: '/activities/lucky-dollars-season6',
|
||||||
|
name: 'lucky-dollars-season6',
|
||||||
|
component: () => import('../views/Activities/LuckyDollars/Season6/index.vue'),
|
||||||
|
meta: { requiresAuth: true },
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 安全白名单片段
|
||||||
|
|
||||||
|
建页时由 Codex 使用上面的 route path 补充到 `src/config/security.js`。
|
||||||
|
|
||||||
|
```js
|
||||||
|
'/activities/lucky-dollars-season6'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3 权限页面片段
|
||||||
|
|
||||||
|
建页时由 Codex 使用上面的 route path 补充到 `src/utils/permissionManager.js`,后面的注释使用页面名称。
|
||||||
|
|
||||||
|
```js
|
||||||
|
'/activities/lucky-dollars-season6' // 幸运美金第 6 季
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. OSS 图片目录
|
||||||
|
|
||||||
|
- OSS 相对路径:Activities/LuckyDollars/Season6/
|
||||||
|
- 本地开发目录:public/oss/h5/Azizi/Activities/LuckyDollars/Season6/
|
||||||
|
- 是否需要 Codex 自动创建本地开发目录:是
|
||||||
|
- 图片是否已放入本地目录:是
|
||||||
|
|
||||||
|
说明:OSS 相对路径和本地开发目录由 Codex 根据页面类型和页面目录自动生成。如果“是否需要 Codex 自动创建本地开发目录”填“是”,Codex 建页时会先创建这个目录。
|
||||||
|
|
||||||
|
### 3.1 多语言图片清单
|
||||||
|
|
||||||
|
说明:下面清单由 Codex 扫描本地开发目录自动生成。`en` 表示无后缀原图,`ar` 表示存在 `_ar` 图片。页面生成时以这张清单为准处理多语言图片。
|
||||||
|
|
||||||
|
| 图片名 | 支持语言 | 备注 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| bg0 | en | 页面背景第 0 段 |
|
||||||
|
| bg1 | en | 页面背景第 1 段 |
|
||||||
|
| bg2 | en | 页面背景第 2 段 |
|
||||||
|
| bg3 | en | 页面背景第 3 段 |
|
||||||
|
| helpInfo | en, ar | 帮助说明图 |
|
||||||
|
| historyBg | en, ar | 历史弹窗背景 |
|
||||||
|
| historyBt | en, ar | 历史按钮 |
|
||||||
|
| lottery | en | 抽奖机背景 |
|
||||||
|
| lotteryBt | en, ar | 抽奖按钮 |
|
||||||
|
| lotteryBtActive | en, ar | 抽奖选中按钮 |
|
||||||
|
| myAvatarFrame | en | 我的头像框 |
|
||||||
|
| myInfoBg | en | 我的信息背景 |
|
||||||
|
| myRankingBg | en | 我的排名背景 |
|
||||||
|
| prizeActiveFrame | en | 抽奖高亮框 |
|
||||||
|
| rankBt | en, ar | 排行榜按钮 |
|
||||||
|
| rankBtActive | en, ar | 排行榜选中按钮 |
|
||||||
|
| RankingItem | en | 排行榜列表项背景 |
|
||||||
|
| rechargehidden | en | 充值隐藏图标 |
|
||||||
|
| rechargeShow | en | 充值显示图标 |
|
||||||
|
| reward_frame | en | 头像框奖励图标 |
|
||||||
|
| reward_gift | en | 礼物奖励图标 |
|
||||||
|
| reward_ride | en | 座驾奖励图标 |
|
||||||
|
| rewardBack | en | 奖励上一页 |
|
||||||
|
| rewardBg | en | 奖励背景 |
|
||||||
|
| rewardNext | en | 奖励下一页 |
|
||||||
|
| rewardReceive | en, ar | 奖励领取按钮 |
|
||||||
|
| rewardReceived | en, ar | 奖励已领取按钮 |
|
||||||
|
| rewardReceiveNot | en, ar | 奖励不可领取按钮 |
|
||||||
|
| RewardRecharge100 | en | 充值奖励 100 |
|
||||||
|
| RewardRecharge1000 | en | 充值奖励 1000 |
|
||||||
|
| RewardRecharge10000 | en | 充值奖励 10000 |
|
||||||
|
| RewardRecharge3000 | en | 充值奖励 3000 |
|
||||||
|
| RewardRecharge500 | en | 充值奖励 500 |
|
||||||
|
| RewardRecharge5000 | en | 充值奖励 5000 |
|
||||||
|
| ruleInfo | en, ar | 规则说明图 |
|
||||||
|
| rulesBt | en, ar | 规则按钮 |
|
||||||
|
| tagBtBg | en | 标签选中底图 |
|
||||||
|
| tagsBg | en | 标签背景 |
|
||||||
|
| taskBtGo | en | 任务去完成按钮 |
|
||||||
|
| taskBtReceive | en | 任务领取按钮 |
|
||||||
|
| taskBtReceived | en | 任务已领取按钮 |
|
||||||
|
| taskGame | en | 游戏任务图标 |
|
||||||
|
| taskGift | en | 礼物任务图标 |
|
||||||
|
| taskRecharge | en | 充值任务图标 |
|
||||||
|
| taskTalk | en | 聊天任务图标 |
|
||||||
|
| ticket | en | 抽奖券图标 |
|
||||||
|
| timeBg | en | 时间背景 |
|
||||||
|
| top1 | en | 第一名装饰 |
|
||||||
|
| top2 | en | 第二名装饰 |
|
||||||
|
| top3 | en | 第三名装饰 |
|
||||||
|
|
||||||
|
### 3.2 进入页面前同步预加载图片
|
||||||
|
|
||||||
|
说明:这里放进入页面后首屏和默认标签页马上会用到的图片。Season6 参考默认把长背景、顶部时间、标签页、用户信息、奖励模块图片放在同步预加载里。
|
||||||
|
|
||||||
|
| 图片名 | 是否包含多语言 | 备注 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| bg0 | 否 | 首屏长背景 |
|
||||||
|
| bg1 | 否 | 长背景第 1 段 |
|
||||||
|
| bg2 | 否 | 长背景第 2 段 |
|
||||||
|
| bg3 | 否 | 长背景第 3 段 |
|
||||||
|
| timeBg | 否 | 顶部时间模块 |
|
||||||
|
| tagsBg | 否 | 标签背景 |
|
||||||
|
| tagBtBg | 否 | 标签选中底图 |
|
||||||
|
| rankBt | 是 | 首屏标签按钮 |
|
||||||
|
| rankBtActive | 是 | 首屏标签按钮 |
|
||||||
|
| lotteryBt | 是 | 首屏标签按钮 |
|
||||||
|
| lotteryBtActive | 是 | 首屏标签按钮 |
|
||||||
|
| myInfoBg | 否 | 我的信息背景 |
|
||||||
|
| myAvatarFrame | 否 | 我的头像框 |
|
||||||
|
| rechargehidden | 否 | 充值金额隐藏图标 |
|
||||||
|
| rechargeShow | 否 | 充值金额显示图标 |
|
||||||
|
| rewardBg | 否 | 默认奖励模块背景 |
|
||||||
|
| rewardBack | 否 | 奖励上一页按钮 |
|
||||||
|
| rewardNext | 否 | 奖励下一页按钮 |
|
||||||
|
| rewardReceive | 是 | 奖励领取按钮 |
|
||||||
|
| rewardReceived | 是 | 奖励已领取按钮 |
|
||||||
|
| rewardReceiveNot | 是 | 奖励不可领取按钮 |
|
||||||
|
| RewardRecharge100 | 否 | 充值 100 奖励图 |
|
||||||
|
| RewardRecharge500 | 否 | 充值 500 奖励图 |
|
||||||
|
| RewardRecharge1000 | 否 | 充值 1000 奖励图 |
|
||||||
|
| RewardRecharge3000 | 否 | 充值 3000 奖励图 |
|
||||||
|
| RewardRecharge5000 | 否 | 充值 5000 奖励图 |
|
||||||
|
| RewardRecharge10000 | 否 | 充值 10000 奖励图 |
|
||||||
|
|
||||||
|
### 3.3 进入页面后后台预加载图片
|
||||||
|
|
||||||
|
说明:这里放非默认标签页、下方列表、弹窗、抽奖和任务相关图片。它们不阻塞进入页面动画,页面进入后后台继续加载。
|
||||||
|
|
||||||
|
| 图片名 | 是否包含多语言 | 备注 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| lottery | 否 | 切到抽奖页时使用 |
|
||||||
|
| prizeActiveFrame | 否 | 抽奖高亮框 |
|
||||||
|
| ticket | 否 | 抽奖券图标 |
|
||||||
|
| historyBt | 是 | 抽奖历史按钮 |
|
||||||
|
| historyBg | 是 | 历史弹窗背景 |
|
||||||
|
| helpInfo | 是 | 帮助弹窗说明图 |
|
||||||
|
| ruleInfo | 是 | 规则弹窗说明图 |
|
||||||
|
| rulesBt | 是 | 规则按钮 |
|
||||||
|
| RankingItem | 否 | 排行榜列表项背景 |
|
||||||
|
| myRankingBg | 否 | 我的排名背景 |
|
||||||
|
| top1 | 否 | 第一名装饰 |
|
||||||
|
| top2 | 否 | 第二名装饰 |
|
||||||
|
| top3 | 否 | 第三名装饰 |
|
||||||
|
| reward_frame | 否 | 头像框奖励图标 |
|
||||||
|
| reward_gift | 否 | 礼物奖励图标 |
|
||||||
|
| reward_ride | 否 | 座驾奖励图标 |
|
||||||
|
| taskBtGo | 否 | 任务去完成按钮 |
|
||||||
|
| taskBtReceive | 否 | 任务领取按钮 |
|
||||||
|
| taskBtReceived | 否 | 任务已领取按钮 |
|
||||||
|
| taskGame | 否 | 游戏任务图标 |
|
||||||
|
| taskGift | 否 | 礼物任务图标 |
|
||||||
|
| taskRecharge | 否 | 充值任务图标 |
|
||||||
|
| taskTalk | 否 | 聊天任务图标 |
|
||||||
|
|
||||||
|
## 4. 模块配置
|
||||||
|
|
||||||
|
### 4.1 标签页模块
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"defaultValue": "reward",
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"value": "reward",
|
||||||
|
"labelKey": "recharge_reward",
|
||||||
|
"buttonImage": "rankBt",
|
||||||
|
"activeButtonImage": "rankBtActive",
|
||||||
|
"remark": "奖励组内的充值奖励页"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "ranking",
|
||||||
|
"labelKey": "ranking",
|
||||||
|
"buttonImage": "rankBt",
|
||||||
|
"activeButtonImage": "rankBtActive",
|
||||||
|
"remark": "奖励组内的排行榜页"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "lottery",
|
||||||
|
"labelKey": "lottery",
|
||||||
|
"buttonImage": "lotteryBt",
|
||||||
|
"activeButtonImage": "lotteryBtActive",
|
||||||
|
"remark": "抽奖组内的抽奖页"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "withdraw",
|
||||||
|
"labelKey": "withdraw",
|
||||||
|
"buttonImage": "lotteryBt",
|
||||||
|
"activeButtonImage": "lotteryBtActive",
|
||||||
|
"remark": "抽奖组内的提现页"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 页面区块模块
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "reward",
|
||||||
|
"enabled": true,
|
||||||
|
"apis": ["activityRewardConfigs", "myRecharge", "receiveRechargeReward"],
|
||||||
|
"images": ["rewardBg", "rewardReceive", "rewardReceived", "rewardReceiveNot"],
|
||||||
|
"remark": "充值奖励"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ranking",
|
||||||
|
"enabled": true,
|
||||||
|
"apis": ["ranklist"],
|
||||||
|
"images": ["RankingItem", "myRankingBg", "top1", "top2", "top3"],
|
||||||
|
"remark": "服务端分页排行榜"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lottery",
|
||||||
|
"enabled": true,
|
||||||
|
"apis": ["activityDetail", "onceDraw", "multiDraw", "myTickets", "myTotalDrawCount"],
|
||||||
|
"images": ["lottery", "prizeActiveFrame", "ticket"],
|
||||||
|
"remark": "抽奖机"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "task",
|
||||||
|
"enabled": true,
|
||||||
|
"apis": ["ActTaskList", "receiveTickets"],
|
||||||
|
"images": ["taskBtGo", "taskBtReceive", "taskBtReceived"],
|
||||||
|
"remark": "任务列表"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "withdraw",
|
||||||
|
"enabled": true,
|
||||||
|
"apis": ["withdrawableAmount", "transferActivityDollar", "exchangeCoin"],
|
||||||
|
"images": [],
|
||||||
|
"remark": "提现、转账、兑换;本地图片清单未扫描到 earningInfoBg,图片待确认"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "countdown",
|
||||||
|
"enabled": true,
|
||||||
|
"apis": [],
|
||||||
|
"images": ["timeBg"],
|
||||||
|
"remark": "倒计时"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 弹窗模块
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "rule",
|
||||||
|
"triggerImage": "rulesBt",
|
||||||
|
"backgroundImage": "",
|
||||||
|
"contentImage": "ruleInfo",
|
||||||
|
"apis": [],
|
||||||
|
"remark": "规则说明"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "help",
|
||||||
|
"triggerImage": "",
|
||||||
|
"backgroundImage": "",
|
||||||
|
"contentImage": "helpInfo",
|
||||||
|
"apis": [],
|
||||||
|
"remark": "帮助说明;本地图片清单未扫描到 helpBt,触发按钮待确认"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "history",
|
||||||
|
"triggerImage": "historyBt",
|
||||||
|
"backgroundImage": "historyBg",
|
||||||
|
"contentImage": "",
|
||||||
|
"apis": ["drawRecords"],
|
||||||
|
"remark": "中奖历史"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "result",
|
||||||
|
"triggerImage": "",
|
||||||
|
"backgroundImage": "",
|
||||||
|
"contentImage": "",
|
||||||
|
"apis": ["onceDraw", "multiDraw"],
|
||||||
|
"remark": "中奖结果;本地图片清单未扫描到 resultBg,背景图待确认"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "rewardDetail",
|
||||||
|
"triggerImage": "",
|
||||||
|
"backgroundImage": "rewardBg",
|
||||||
|
"contentImage": "",
|
||||||
|
"apis": ["activityRewardConfigs"],
|
||||||
|
"remark": "奖励详情"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.4 排行榜模块
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"api": "ranklist",
|
||||||
|
"loadMode": "remote",
|
||||||
|
"pageSize": 20,
|
||||||
|
"topCount": 3,
|
||||||
|
"myRankingPath": "ranklist.body.currentUser",
|
||||||
|
"fieldMap": {
|
||||||
|
"avatar": "userAvatar",
|
||||||
|
"name": "userName",
|
||||||
|
"value": "amount",
|
||||||
|
"userId": "userId",
|
||||||
|
"rank": "rank"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.5 抽奖模块
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"drawApis": ["onceDraw", "multiDraw"],
|
||||||
|
"prizePoolApi": "activityDetail",
|
||||||
|
"drawCountApi": "myTickets",
|
||||||
|
"extraApis": ["myTotalDrawCount", "rewardConfigsBadge", "winnerHistory"],
|
||||||
|
"displayMode": "track-only",
|
||||||
|
"slotCount": 8,
|
||||||
|
"centerButtonPosition": "grid-area: 2 / 2",
|
||||||
|
"historyButtonPosition": "inside",
|
||||||
|
"images": {
|
||||||
|
"background": "lottery",
|
||||||
|
"activeFrame": "prizeActiveFrame",
|
||||||
|
"singleDrawButton": "无,按钮区域在背景图上",
|
||||||
|
"multiDrawButton": "无,按钮区域在背景图上",
|
||||||
|
"historyButton": "historyBt",
|
||||||
|
"resultBackground": ""
|
||||||
|
},
|
||||||
|
"remark": "奖品内容已画在抽奖背景图上,接口奖品只用于计算高亮框停靠位置;本地图片清单未扫描到 resultBg。"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. 接口参数
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"activityId": "2007771533999124198",
|
||||||
|
"activityCode": "24198",
|
||||||
|
"activityType": "CONSUMPTION_ACTIVITY",
|
||||||
|
"rankingActivityType": "USER_RECHARGE_DRAW",
|
||||||
|
"rewardActivityType": "CONSUMPTION_ACTIVITY",
|
||||||
|
"otherParams": {
|
||||||
|
"drawCount": [1, 10]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. 组件需求
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "BackgroundLayer",
|
||||||
|
"enabled": true,
|
||||||
|
"remark": "使用 bg0/bg1/bg2/bg3 长背景"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "itemCenter",
|
||||||
|
"enabled": true,
|
||||||
|
"remark": "图片容器"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "topUser / TopUser",
|
||||||
|
"enabled": true,
|
||||||
|
"remark": "从参考页面组件复制后微调"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Barrage",
|
||||||
|
"enabled": true,
|
||||||
|
"remark": "从参考页面组件复制后微调"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ActivityTabs",
|
||||||
|
"enabled": "可选",
|
||||||
|
"remark": "如果重做标签页,优先用通用组件"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ActivityLotteryGrid",
|
||||||
|
"enabled": true,
|
||||||
|
"remark": "抽奖格子和高亮框"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. 建页后记录
|
||||||
|
|
||||||
|
这部分由 Codex 建页后填写。
|
||||||
|
|
||||||
|
### 7.1 已完成
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
### 7.2 未填写所以跳过
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
### 7.3 待你微调
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
### 7.4 验证结果
|
||||||
|
|
||||||
|
- `npm run build`:
|
||||||
|
- 备注:
|
||||||
433
src/views/Activities/LuckyDollars/Season6/页面创建信息-待填写.md
Normal file
433
src/views/Activities/LuckyDollars/Season6/页面创建信息-待填写.md
Normal file
@ -0,0 +1,433 @@
|
|||||||
|
# 页面创建信息
|
||||||
|
|
||||||
|
## 1. 基础信息
|
||||||
|
|
||||||
|
- 页面类型:Activities
|
||||||
|
- 页面名称:LuckyDollars Season6
|
||||||
|
- 页面目录:src/views/Activities/LuckyDollars/Season6
|
||||||
|
- 参考页面:src/views/Activities/LuckyDollars/Season5
|
||||||
|
- 备注:作为新页面处理,初版效果参考 Season5,接口参数和图片可先沿用 Season5/Season6 测试数据。
|
||||||
|
|
||||||
|
## 2. 路由和权限
|
||||||
|
|
||||||
|
- route path:/activities/lucky-dollars-season6
|
||||||
|
- route name:lucky-dollars-season6
|
||||||
|
- 是否需要登录:是
|
||||||
|
- 是否加入 `src/config/security.js`:是
|
||||||
|
- 是否加入 `src/utils/permissionManager.js`:是
|
||||||
|
|
||||||
|
### 2.1 路由代码片段
|
||||||
|
|
||||||
|
建页时由 Codex 根据上面的 route path、route name 和页面目录生成。
|
||||||
|
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
path: '/activities/lucky-dollars-season6',
|
||||||
|
name: 'lucky-dollars-season6',
|
||||||
|
component: () => import('../views/Activities/LuckyDollars/Season6/index.vue'),
|
||||||
|
meta: { requiresAuth: true },
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 安全白名单片段
|
||||||
|
|
||||||
|
建页时由 Codex 使用上面的 route path 补充到 `src/config/security.js`。
|
||||||
|
|
||||||
|
```js
|
||||||
|
'/activities/lucky-dollars-season6'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3 权限页面片段
|
||||||
|
|
||||||
|
建页时由 Codex 使用上面的 route path 补充到 `src/utils/permissionManager.js`,后面的注释使用页面名称。
|
||||||
|
|
||||||
|
```js
|
||||||
|
'/activities/lucky-dollars-season6' // 幸运美金第 6 季
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. OSS 图片目录
|
||||||
|
|
||||||
|
- OSS 相对路径:Activities/LuckyDollars/Season6/
|
||||||
|
- 本地开发目录:public/oss/h5/Azizi/Activities/LuckyDollars/Season6/
|
||||||
|
- 是否需要 Codex 自动创建本地开发目录:是
|
||||||
|
- 图片是否已放入本地目录:是
|
||||||
|
|
||||||
|
说明:OSS 相对路径和本地开发目录由 Codex 根据页面类型和页面目录自动生成,你可以按需要修改。如果“是否需要 Codex 自动创建本地开发目录”填“是”,Codex 建页时会先创建这个目录,方便你直接放图片。
|
||||||
|
|
||||||
|
### 3.1 多语言图片清单
|
||||||
|
|
||||||
|
说明:下面清单由 Codex 扫描本地开发目录自动生成。无后缀图片视为 `en` 原图;如存在 `_ar`、`_bn`、`_tr` 等后缀,则合并到同一个图片名的支持语言中。页面生成时以这张清单为准处理多语言图片,你可以按实际需求删除、改名或补备注。
|
||||||
|
|
||||||
|
| 图片名 | 支持语言 | 备注 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| bg0 | en | 页面背景第 0 段 |
|
||||||
|
| bg1 | en | 页面背景第 1 段 |
|
||||||
|
| bg2 | en | 页面背景第 2 段 |
|
||||||
|
| bg3 | en | 页面背景第 3 段 |
|
||||||
|
| helpInfo | en, ar | 帮助说明图 |
|
||||||
|
| historyBg | en, ar | 历史弹窗背景 |
|
||||||
|
| historyBt | en, ar | 历史按钮 |
|
||||||
|
| lottery | en | 抽奖机背景 |
|
||||||
|
| lotteryBt | en, ar | 抽奖按钮 |
|
||||||
|
| lotteryBtActive | en, ar | 抽奖选中按钮 |
|
||||||
|
| myAvatarFrame | en | 我的头像框 |
|
||||||
|
| myInfoBg | en | 我的信息背景 |
|
||||||
|
| myRankingBg | en | 我的排名背景 |
|
||||||
|
| prizeActiveFrame | en | 抽奖高亮框 |
|
||||||
|
| rankBt | en, ar | 排行榜按钮 |
|
||||||
|
| rankBtActive | en, ar | 排行榜选中按钮 |
|
||||||
|
| RankingItem | en | 排行榜列表项背景 |
|
||||||
|
| rechargehidden | en | 充值金额隐藏图标 |
|
||||||
|
| rechargeShow | en | 充值金额显示图标 |
|
||||||
|
| reward_frame | en | 头像框奖励图标 |
|
||||||
|
| reward_gift | en | 礼物奖励图标 |
|
||||||
|
| reward_ride | en | 座驾奖励图标 |
|
||||||
|
| rewardBack | en | 奖励上一页按钮 |
|
||||||
|
| rewardBg | en | 奖励模块背景 |
|
||||||
|
| rewardNext | en | 奖励下一页按钮 |
|
||||||
|
| rewardReceive | en, ar | 奖励领取按钮 |
|
||||||
|
| rewardReceived | en, ar | 奖励已领取按钮 |
|
||||||
|
| rewardReceiveNot | en, ar | 奖励不可领取按钮 |
|
||||||
|
| RewardRecharge100 | en | 充值 100 奖励图 |
|
||||||
|
| RewardRecharge1000 | en | 充值 1000 奖励图 |
|
||||||
|
| RewardRecharge10000 | en | 充值 10000 奖励图 |
|
||||||
|
| RewardRecharge3000 | en | 充值 3000 奖励图 |
|
||||||
|
| RewardRecharge500 | en | 充值 500 奖励图 |
|
||||||
|
| RewardRecharge5000 | en | 充值 5000 奖励图 |
|
||||||
|
| ruleInfo | en, ar | 规则说明图 |
|
||||||
|
| rulesBt | en, ar | 规则按钮 |
|
||||||
|
| tagBtBg | en | 标签页选中底图 |
|
||||||
|
| tagsBg | en | 标签页背景 |
|
||||||
|
| taskBtGo | en | 任务去完成按钮 |
|
||||||
|
| taskBtReceive | en | 任务领取按钮 |
|
||||||
|
| taskBtReceived | en | 任务已领取按钮 |
|
||||||
|
| taskGame | en | 游戏任务图标 |
|
||||||
|
| taskGift | en | 礼物任务图标 |
|
||||||
|
| taskRecharge | en | 充值任务图标 |
|
||||||
|
| taskTalk | en | 聊天任务图标 |
|
||||||
|
| ticket | en | 抽奖券图标 |
|
||||||
|
| timeBg | en | 活动时间背景 |
|
||||||
|
| top1 | en | 第一名装饰 |
|
||||||
|
| top2 | en | 第二名装饰 |
|
||||||
|
| top3 | en | 第三名装饰 |
|
||||||
|
|
||||||
|
### 3.2 进入页面前同步预加载图片
|
||||||
|
|
||||||
|
说明:这里填写会参与进入页面加载动画的关键图片。Codex 生成页面时会先等待这些图片加载完成,再结束预加载动画。
|
||||||
|
|
||||||
|
| 图片名 | 是否包含多语言 | 备注 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| bg0 | 否 | 首屏长背景 |
|
||||||
|
| bg1 | 否 | 长背景第 1 段 |
|
||||||
|
| bg2 | 否 | 长背景第 2 段 |
|
||||||
|
| bg3 | 否 | 长背景第 3 段 |
|
||||||
|
| timeBg | 否 | 顶部时间模块 |
|
||||||
|
| tagsBg | 否 | 标签背景 |
|
||||||
|
| tagBtBg | 否 | 标签选中底图 |
|
||||||
|
| rankBt | 是 | 首屏标签按钮 |
|
||||||
|
| rankBtActive | 是 | 首屏标签按钮 |
|
||||||
|
| lotteryBt | 是 | 首屏标签按钮 |
|
||||||
|
| lotteryBtActive | 是 | 首屏标签按钮 |
|
||||||
|
| myInfoBg | 否 | 我的信息背景 |
|
||||||
|
| myAvatarFrame | 否 | 我的头像框 |
|
||||||
|
| rechargehidden | 否 | 充值金额隐藏图标 |
|
||||||
|
| rechargeShow | 否 | 充值金额显示图标 |
|
||||||
|
| rewardBg | 否 | 默认奖励模块背景 |
|
||||||
|
| rewardBack | 否 | 奖励上一页按钮 |
|
||||||
|
| rewardNext | 否 | 奖励下一页按钮 |
|
||||||
|
| rewardReceive | 是 | 奖励领取按钮 |
|
||||||
|
| rewardReceived | 是 | 奖励已领取按钮 |
|
||||||
|
| rewardReceiveNot | 是 | 奖励不可领取按钮 |
|
||||||
|
| RewardRecharge100 | 否 | 充值 100 奖励图 |
|
||||||
|
| RewardRecharge500 | 否 | 充值 500 奖励图 |
|
||||||
|
| RewardRecharge1000 | 否 | 充值 1000 奖励图 |
|
||||||
|
| RewardRecharge3000 | 否 | 充值 3000 奖励图 |
|
||||||
|
| RewardRecharge5000 | 否 | 充值 5000 奖励图 |
|
||||||
|
| RewardRecharge10000 | 否 | 充值 10000 奖励图 |
|
||||||
|
|
||||||
|
### 3.3 进入页面后后台预加载图片
|
||||||
|
|
||||||
|
说明:这里填写不影响进入页面动画的图片。Codex 可以在首屏图片加载完成后继续后台预加载它们,避免后续打开弹窗、切标签页或滚动到下方时才开始请求图片。
|
||||||
|
|
||||||
|
| 图片名 | 是否包含多语言 | 备注 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| lottery | 否 | 切到抽奖页时使用 |
|
||||||
|
| prizeActiveFrame | 否 | 抽奖高亮框 |
|
||||||
|
| ticket | 否 | 抽奖券图标 |
|
||||||
|
| historyBt | 是 | 抽奖历史按钮 |
|
||||||
|
| historyBg | 是 | 历史弹窗背景 |
|
||||||
|
| helpInfo | 是 | 帮助弹窗说明图 |
|
||||||
|
| ruleInfo | 是 | 规则弹窗说明图 |
|
||||||
|
| rulesBt | 是 | 规则按钮 |
|
||||||
|
| RankingItem | 否 | 排行榜列表项背景 |
|
||||||
|
| myRankingBg | 否 | 我的排名背景 |
|
||||||
|
| top1 | 否 | 第一名装饰 |
|
||||||
|
| top2 | 否 | 第二名装饰 |
|
||||||
|
| top3 | 否 | 第三名装饰 |
|
||||||
|
| reward_frame | 否 | 头像框奖励图标 |
|
||||||
|
| reward_gift | 否 | 礼物奖励图标 |
|
||||||
|
| reward_ride | 否 | 座驾奖励图标 |
|
||||||
|
| taskBtGo | 否 | 任务去完成按钮 |
|
||||||
|
| taskBtReceive | 否 | 任务领取按钮 |
|
||||||
|
| taskBtReceived | 否 | 任务已领取按钮 |
|
||||||
|
| taskGame | 否 | 游戏任务图标 |
|
||||||
|
| taskGift | 否 | 礼物任务图标 |
|
||||||
|
| taskRecharge | 否 | 充值任务图标 |
|
||||||
|
| taskTalk | 否 | 聊天任务图标 |
|
||||||
|
|
||||||
|
## 4. 模块配置
|
||||||
|
|
||||||
|
没有填写的模块,初版页面先不处理。
|
||||||
|
|
||||||
|
### 4.1 标签页模块
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"defaultValue": "reward",
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"value": "reward",
|
||||||
|
"labelKey": "recharge_reward",
|
||||||
|
"buttonImage": "rankBt",
|
||||||
|
"activeButtonImage": "rankBtActive",
|
||||||
|
"remark": "奖励组内的充值奖励页"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "ranking",
|
||||||
|
"labelKey": "ranking",
|
||||||
|
"buttonImage": "rankBt",
|
||||||
|
"activeButtonImage": "rankBtActive",
|
||||||
|
"remark": "奖励组内的排行榜页"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "lottery",
|
||||||
|
"labelKey": "lottery",
|
||||||
|
"buttonImage": "lotteryBt",
|
||||||
|
"activeButtonImage": "lotteryBtActive",
|
||||||
|
"remark": "抽奖组内的抽奖页"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "withdraw",
|
||||||
|
"labelKey": "withdraw",
|
||||||
|
"buttonImage": "lotteryBt",
|
||||||
|
"activeButtonImage": "lotteryBtActive",
|
||||||
|
"remark": "抽奖组内的提现页"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 页面区块模块
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "reward",
|
||||||
|
"enabled": true,
|
||||||
|
"apis": ["activityRewardConfigs", "myRecharge", "receiveRechargeReward"],
|
||||||
|
"images": ["rewardBg", "rewardReceive", "rewardReceived", "rewardReceiveNot"],
|
||||||
|
"remark": "奖励区块"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ranking",
|
||||||
|
"enabled": true,
|
||||||
|
"apis": ["ranklist"],
|
||||||
|
"images": ["RankingItem", "myRankingBg", "top1", "top2", "top3"],
|
||||||
|
"remark": "排行榜区块"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lottery",
|
||||||
|
"enabled": true,
|
||||||
|
"apis": ["activityDetail", "onceDraw", "multiDraw", "myTickets", "myTotalDrawCount"],
|
||||||
|
"images": ["lottery", "prizeActiveFrame", "ticket"],
|
||||||
|
"remark": "抽奖区块"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "task",
|
||||||
|
"enabled": true,
|
||||||
|
"apis": ["ActTaskList", "receiveTickets"],
|
||||||
|
"images": ["taskBtGo", "taskBtReceive", "taskBtReceived"],
|
||||||
|
"remark": "任务区块"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "withdraw",
|
||||||
|
"enabled": true,
|
||||||
|
"apis": ["withdrawableAmount", "transferActivityDollar", "exchangeCoin"],
|
||||||
|
"images": [],
|
||||||
|
"remark": "提现/兑换区块;本地图片清单未扫描到 earningInfoBg,图片待确认"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "countdown",
|
||||||
|
"enabled": true,
|
||||||
|
"apis": [],
|
||||||
|
"images": ["timeBg"],
|
||||||
|
"remark": "倒计时区块,截止日期为 2026-06-01"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 弹窗模块
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "rule",
|
||||||
|
"triggerImage": "rulesBt",
|
||||||
|
"backgroundImage": "",
|
||||||
|
"contentImage": "ruleInfo",
|
||||||
|
"apis": [],
|
||||||
|
"remark": "规则弹窗"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "help",
|
||||||
|
"triggerImage": "",
|
||||||
|
"backgroundImage": "",
|
||||||
|
"contentImage": "helpInfo",
|
||||||
|
"apis": [],
|
||||||
|
"remark": "帮助弹窗;本地图片清单未扫描到 helpBt,触发按钮待确认"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "history",
|
||||||
|
"triggerImage": "historyBt",
|
||||||
|
"backgroundImage": "historyBg",
|
||||||
|
"contentImage": "",
|
||||||
|
"apis": ["drawRecords"],
|
||||||
|
"remark": "历史记录弹窗"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "result",
|
||||||
|
"triggerImage": "",
|
||||||
|
"backgroundImage": "",
|
||||||
|
"contentImage": "",
|
||||||
|
"apis": ["onceDraw", "multiDraw"],
|
||||||
|
"remark": "中奖结果弹窗;本地图片清单未扫描到 resultBg,背景图待确认"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "rewardDetail",
|
||||||
|
"triggerImage": "",
|
||||||
|
"backgroundImage": "rewardBg",
|
||||||
|
"contentImage": "",
|
||||||
|
"apis": ["activityRewardConfigs"],
|
||||||
|
"remark": "奖励详情弹窗"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.4 排行榜模块
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"api": "ranklist",
|
||||||
|
"loadMode": "remote",
|
||||||
|
"pageSize": 20,
|
||||||
|
"topCount": 3,
|
||||||
|
"myRankingPath": "ranklist.body.currentUser",
|
||||||
|
"fieldMap": {
|
||||||
|
"avatar": "userAvatar",
|
||||||
|
"name": "userName",
|
||||||
|
"value": "amount",
|
||||||
|
"userId": "userId",
|
||||||
|
"rank": "rank"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.5 抽奖模块
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"drawApis": ["onceDraw", "multiDraw"],
|
||||||
|
"prizePoolApi": "activityDetail",
|
||||||
|
"drawCountApi": "myTickets",
|
||||||
|
"extraApis": ["myTotalDrawCount", "rewardConfigsBadge", "winnerHistory"],
|
||||||
|
"displayMode": "track-only",
|
||||||
|
"slotCount": 8,
|
||||||
|
"centerButtonPosition": "grid-area: 2 / 2",
|
||||||
|
"historyButtonPosition": "inside",
|
||||||
|
"images": {
|
||||||
|
"background": "lottery",
|
||||||
|
"activeFrame": "prizeActiveFrame",
|
||||||
|
"singleDrawButton": "无,按钮区域在背景图上",
|
||||||
|
"multiDrawButton": "无,按钮区域在背景图上",
|
||||||
|
"historyButton": "historyBt",
|
||||||
|
"resultBackground": ""
|
||||||
|
},
|
||||||
|
"remark": "奖品内容已画在抽奖背景图上,接口奖品只用于计算高亮框停靠位置;本地图片清单未扫描到 resultBg。"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. 接口参数
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"activityId": "",
|
||||||
|
"activityCode": "",
|
||||||
|
"activityType": "",
|
||||||
|
"rankingActivityType": "",
|
||||||
|
"rewardActivityType": "",
|
||||||
|
"otherParams": {}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. 组件需求
|
||||||
|
|
||||||
|
需要哪个就填“是”,不需要或没填的初版页面先不接。
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "BackgroundLayer",
|
||||||
|
"enabled": "",
|
||||||
|
"remark": "长背景分段"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "itemCenter",
|
||||||
|
"enabled": "",
|
||||||
|
"remark": "图片容器"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "topUser / TopUser",
|
||||||
|
"enabled": "",
|
||||||
|
"remark": "前三名用户展示"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Barrage",
|
||||||
|
"enabled": "",
|
||||||
|
"remark": "弹幕"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ActivityTabs",
|
||||||
|
"enabled": "",
|
||||||
|
"remark": "标签页"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ActivityLotteryGrid",
|
||||||
|
"enabled": "",
|
||||||
|
"remark": "抽奖格子"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. 建页后记录
|
||||||
|
|
||||||
|
这部分由 Codex 建页后填写。
|
||||||
|
|
||||||
|
### 7.1 已完成
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
### 7.2 未填写所以跳过
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
### 7.3 待你微调
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
### 7.4 验证结果
|
||||||
|
|
||||||
|
- `npm run build`:
|
||||||
|
- 备注:
|
||||||
@ -3,11 +3,15 @@ import Components from 'unplugin-vue-components/vite'
|
|||||||
|
|
||||||
import { defineConfig } from 'vite'
|
import { defineConfig } from 'vite'
|
||||||
import { fileURLToPath, URL } from 'node:url'
|
import { fileURLToPath, URL } from 'node:url'
|
||||||
|
import { existsSync } from 'node:fs'
|
||||||
|
import { isAbsolute, relative, resolve } from 'node:path'
|
||||||
import { VantResolver } from 'unplugin-vue-components/resolvers'
|
import { VantResolver } from 'unplugin-vue-components/resolvers'
|
||||||
|
|
||||||
const buildTimestamp = Date.now()
|
const buildTimestamp = Date.now()
|
||||||
const PRODUCTION_LIKE_MODES = new Set(['production', 'production-atu'])
|
const PRODUCTION_LIKE_MODES = new Set(['production', 'production-atu'])
|
||||||
const STRIPPABLE_CONSOLE_METHODS = ['log', 'debug', 'info']
|
const STRIPPABLE_CONSOLE_METHODS = ['log', 'debug', 'info']
|
||||||
|
const PUBLIC_DIR = fileURLToPath(new URL('./public', import.meta.url))
|
||||||
|
const PUBLIC_ROOT = resolve(PUBLIC_DIR)
|
||||||
|
|
||||||
function isEscaped(code, index) {
|
function isEscaped(code, index) {
|
||||||
let backslashCount = 0
|
let backslashCount = 0
|
||||||
@ -315,6 +319,23 @@ export default defineConfig(({ mode }) => {
|
|||||||
target: 'https://cdn.azizichat.com',
|
target: 'https://cdn.azizichat.com',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
secure: true,
|
secure: true,
|
||||||
|
bypass: (req) => {
|
||||||
|
const requestUrl = req.url || ''
|
||||||
|
|
||||||
|
try {
|
||||||
|
const pathname = decodeURIComponent(new URL(requestUrl, 'http://localhost').pathname)
|
||||||
|
const localPublicFile = resolve(PUBLIC_ROOT, `.${pathname}`)
|
||||||
|
const localPathInPublic = relative(PUBLIC_ROOT, localPublicFile)
|
||||||
|
|
||||||
|
if (!localPathInPublic.startsWith('..') && !isAbsolute(localPathInPublic) && existsSync(localPublicFile)) {
|
||||||
|
return pathname
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.warn('Failed to check local OSS fallback:', error)
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
},
|
||||||
rewrite: (path) => path.replace(/^\/oss/, ''),
|
rewrite: (path) => path.replace(/^\/oss/, ''),
|
||||||
configure: (proxy) => {
|
configure: (proxy) => {
|
||||||
proxy.on('proxyRes', (proxyRes) => {
|
proxy.on('proxyRes', (proxyRes) => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user