**删掉上一轮自建的领取页** - `pages/claim-skin/*`、`services/claim-skin.ts`、`types/claim-skin.ts`、`tests/claim-skin.test.ts` 及其样式(client.css 里 `.claim-skin-*` 整段 254 行) - 后台我加的展示项:「皮肤自动发货」筛选项、执行器标签、「买家提交信息」卡片 **路径式链接复用现成领取页** - `utils/claim-path.ts`(中性命名 `isClaimPath` / `resolveClaimToken`)+ 单测 - `App.tsx`:pathname 命中 `/claim/<token>` → 独立 BrowserRouter 渲染**现成的 `ClaimPage`** (页面零复制零改动:它只用 `useParams`,不读 hash);`#/claim/:token` 仍走主站 HashRouter, 两者互不影响,且有用例断言 hash 入口不命中路径判定 **物品图片** - 后端领取详情的 `product.imageUrl` 接上(内部 SKU 在 `spec_json.code` / `sku_code` / `sku_name` 哪个字段都能回退找到图,映射不到返回空串) - 领取页新增 `ClaimProductImage`:居中大图(宽度 min(220px,62%)、圆角 16px), 空值或加载失败都降级虚线占位块,不出现破图 `npm run check`:前端 128 / 128 全绿(去掉旧用例 17 个、新增路径与图片用例)
41 lines
1.8 KiB
TypeScript
41 lines
1.8 KiB
TypeScript
import assert from 'node:assert/strict'
|
||
import test from 'node:test'
|
||
|
||
import { isClaimPath, resolveClaimToken } from '../src/utils/claim-path.ts'
|
||
|
||
test('isClaimPath:只认路径式 /claim/<token>,容忍结尾斜杠', () => {
|
||
assert.equal(isClaimPath('/claim/abc123'), true)
|
||
assert.equal(isClaimPath('/claim/abc123/'), true)
|
||
assert.equal(isClaimPath('/claim/abc123//'), true)
|
||
})
|
||
|
||
test('isClaimPath:/claim、/claim/、多段路径、其它路径都不算', () => {
|
||
assert.equal(isClaimPath('/claim'), false)
|
||
assert.equal(isClaimPath('/claim/'), false)
|
||
assert.equal(isClaimPath('/claim/a/b'), false)
|
||
assert.equal(isClaimPath('/redeem'), false)
|
||
assert.equal(isClaimPath('/admin/claim/abc'), false)
|
||
assert.equal(isClaimPath('/'), false)
|
||
assert.equal(isClaimPath(''), false)
|
||
assert.equal(isClaimPath(null), false)
|
||
assert.equal(isClaimPath(undefined), false)
|
||
})
|
||
|
||
test('isClaimPath:打手页是 hash 路由,pathname 为 / 或 hash 串时不命中', () => {
|
||
// 打手链接形如 https://<域名>/#/claim/<token>:pathname 是 '/',hash 才是路由
|
||
assert.equal(isClaimPath('/'), false)
|
||
assert.equal(isClaimPath('#/claim/abc123'), false)
|
||
// 路径本身带 token 时,多出来的 hash 片段会被忽略
|
||
assert.equal(isClaimPath('/claim/abc123#/claim/other'), true)
|
||
})
|
||
|
||
test('resolveClaimToken:取出并解码 token 片段', () => {
|
||
assert.equal(resolveClaimToken('/claim/abc123'), 'abc123')
|
||
assert.equal(resolveClaimToken('/claim/abc123/?x=1'), 'abc123')
|
||
assert.equal(resolveClaimToken('/claim/a%2Fb'), 'a/b')
|
||
assert.equal(resolveClaimToken('/claim/%E4%B8%AD%E6%96%87'), '中文')
|
||
// 非法百分号编码退回原始片段,交给后端判定
|
||
assert.equal(resolveClaimToken('/claim/100%'), '100%')
|
||
assert.equal(resolveClaimToken('/redeem'), '')
|
||
})
|