feat(guest): 支持游客态浏览示例衣物与搭配

游客可点开示例衣物详情与搭配抽屉,不再在浏览路径上要求登录。
This commit is contained in:
2026-09-17 11:41:42 +08:00
parent 45222317af
commit f0503c7ad7
30 changed files with 648 additions and 127 deletions
+235
View File
@@ -0,0 +1,235 @@
import { ClothesItem } from '../types/models'
import { ProcessStatus } from '../utils/config'
/**
* damo 示例素材(游客态唯一数据源)。
*
* 合规背景(微信审核整改):未登录用户必须能完整浏览与点击体验功能服务,
* 因此衣橱示例卡片可点开「示例衣物详情」,详情完全由本地数据渲染,零请求、只读。
*
* 素材来源:项目根目录 damo/damo.json 与 damo/image/(原图 1024×1024),
* 图片已压缩为 512px / quality 82 并复制到 miniprogram/damo/image/ 随包发布,
* 页面通过包内绝对路径引用(如 /damo/image/01_cream_sweater.jpg)。
*/
// 包内图片目录(绝对路径,结尾不带斜杠)
const DAMO_IMAGE = '/damo/image'
// 衣物属性:与 ClothesItem 除 uuid / 图片 / 处理状态之外的字段一一对应
interface DamoAttr {
category_main: string
category_sub: string
style: string
color_main: string
color_sub: string
thickness: string
version: string
material: string
pattern: string
sleeve_type: string
clothes_type: string
neckline_type: string
formality: string
occasions: string
visual_impact: string
name: string
remark: string
}
interface DamoRaw {
uuid: string
file: string
attr: DamoAttr
}
const DAMO_RAW: DamoRaw[] = [
{
uuid: 'damo-01',
file: '01_cream_sweater.jpg',
attr: {
category_main: '上装',
category_sub: '毛衣',
style: '休闲风',
color_main: '米色',
color_sub: '红色',
thickness: '厚',
version: '宽松',
material: '针织',
pattern: 'logo图案',
sleeve_type: '长袖',
clothes_type: '短款',
neckline_type: '圆领',
formality: '2',
occasions: '日常通勤,校园上课',
visual_impact: '3',
name: '米色圆领针织毛衣',
remark: '可见红色胸前图案。',
},
},
{
uuid: 'damo-02',
file: '02_ivory_strap_dress.jpg',
attr: {
category_main: '连衣裙',
category_sub: '吊带裙',
style: '优雅风',
color_main: '米色',
color_sub: '金色',
thickness: '适中',
version: '修身',
material: '',
pattern: '纯色',
sleeve_type: '吊带',
clothes_type: '短款',
neckline_type: '',
formality: '3',
occasions: '约会聚会',
visual_impact: '4',
name: '象牙白金扣吊带连衣短裙',
remark: '象牙白偏米色;胸部为心形领。',
},
},
{
uuid: 'damo-03',
file: '03_white_jk_blouse.jpg',
attr: {
category_main: '上装',
category_sub: '衬衫',
style: '学院风',
color_main: '白色',
color_sub: '藏青色',
thickness: '适中',
version: '常规合身',
material: '',
pattern: '条纹',
sleeve_type: '长袖',
clothes_type: '短款',
neckline_type: '翻领',
formality: '2',
occasions: '校园上课,约会聚会',
visual_impact: '4',
name: '白色长袖JK水手服上衣',
remark: '藏青领口及袖口配白条纹,另有酒红色蝴蝶结;水手领归入翻领。',
},
},
{
uuid: 'damo-04',
file: '04_pink_plaid_skirt.jpg',
attr: {
category_main: '下装',
category_sub: '半身裙',
style: '学院风',
color_main: '粉色',
color_sub: '黑色',
thickness: '适中',
version: '常规合身',
material: '',
pattern: '格纹',
sleeve_type: '',
clothes_type: '短款',
neckline_type: '',
formality: '2',
occasions: '校园上课,约会聚会',
visual_impact: '4',
name: '粉色格纹百褶短裙',
remark: '另有白色格纹;百褶A字廓形。',
},
},
{
uuid: 'damo-05',
file: '05_black_jk_blouse.jpg',
attr: {
category_main: '上装',
category_sub: '衬衫',
style: '学院风',
color_main: '黑色',
color_sub: '酒红色',
thickness: '适中',
version: '常规合身',
material: '',
pattern: '条纹',
sleeve_type: '短袖',
clothes_type: '常规',
neckline_type: '翻领',
formality: '2',
occasions: '校园上课,约会聚会',
visual_impact: '4',
name: '黑色短袖JK水手服上衣',
remark: '酒红色蝴蝶结,领口另有白条纹;水手领归入翻领。',
},
},
{
uuid: 'damo-06',
file: '06_navy_pleated_skirt.jpg',
attr: {
category_main: '下装',
category_sub: '半身裙',
style: '学院风',
color_main: '藏青色',
color_sub: '',
thickness: '适中',
version: '常规合身',
material: '',
pattern: '纯色',
sleeve_type: '',
clothes_type: '短款',
neckline_type: '',
formality: '2',
occasions: '校园上课,日常通勤',
visual_impact: '2',
name: '藏青色百褶半身裙',
remark: '',
},
},
{
uuid: 'damo-07',
file: '07_ivory_pearl_high_heels.jpg',
attr: {
category_main: '鞋',
category_sub: '高跟鞋',
style: '优雅风',
color_main: '米色',
color_sub: '银色',
thickness: '',
version: '',
material: '',
pattern: '纯色',
sleeve_type: '',
clothes_type: '',
neckline_type: '',
formality: '4',
occasions: '婚礼宴会,约会聚会',
visual_impact: '4',
name: '米白色珍珠踝链尖头细高跟鞋',
remark: '可见珍珠式踝链、银色链条和同色立体纹理。',
},
},
]
// 示例衣物:处理状态固定为成功,详情页据此直接渲染正常视图
export const DAMO_CLOTHES: ClothesItem[] = DAMO_RAW.map(
(it): ClothesItem => ({
...it.attr,
clothes_uuid: it.uuid,
processed_image: `${DAMO_IMAGE}/${it.file}`,
image_process_status: ProcessStatus.SUCCESS,
}),
)
const DAMO_MAP: Record<string, ClothesItem> = DAMO_CLOTHES.reduce(
(acc, it) => {
acc[it.clothes_uuid] = it
return acc
},
{} as Record<string, ClothesItem>,
)
// 按 uuid 取示例衣物:未命中返回 null,由调用方决定降级展示
export function findDamoClothes(uuid: string): ClothesItem | null {
return DAMO_MAP[uuid] || null
}
// 游客态唯一一套示例搭配(黑色短袖JK水手服上衣 + 藏青色百褶半身裙)
export const DAMO_OUTFIT_ITEMS: ClothesItem[] = ['damo-05', 'damo-06']
.map((uuid) => findDamoClothes(uuid))
.filter((it): it is ClothesItem => !!it)
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB