298 lines
7.6 KiB
Markdown
298 lines
7.6 KiB
Markdown
# 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. 后续建类似页面
|
||
|
||
这份记录只保留 Season6 的实际创建过程,不再维护通用建页输入规则。
|
||
|
||
以后建立同类页面时:
|
||
|
||
```text
|
||
1. 先按 建页操作模板.md 创建页面目录、页面创建信息.md 和 page.config.js。
|
||
2. 在页面目录中的 页面创建信息.md 里补参考页面、图片、模块、接口和组件需求。
|
||
3. 再让 Codex 按该 md 继续生成 index.vue 初版页面。
|
||
```
|
||
|
||
最新规则以 [建页执行流程.md](../建页/建页执行流程.md) 为准,组件和配置片段以 [建页资料库.md](../建页/建页资料库.md) 为准。
|
||
|
||
## 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 新增代码引起的,构建仍正常完成。
|