feat: 完善淘宝小程序拍照、报告与登录流程

接入本地实时识别和自动三连拍,调整报告裁切、商品跳转、分享标题及居中页眉;完善游客会话、后台渠道隔离、部署脚本与回归测试。
This commit is contained in:
xsl
2026-11-04 15:07:51 +08:00
parent 381da60ae4
commit 774376fa16
147 changed files with 17420 additions and 597 deletions
+38 -13
View File
@@ -1,15 +1,21 @@
<import src="../../components/brand-header.axml" />
<template is="brand-header" data="{{brandHeader: brandHeader}}" />
<!-- ═════ 08 报告页 —— 对照 H5 index.html #s-report L174-291 ═════
结构逐块对应:.report-title → .card.card-summary(环形评分 + 生物可视年龄 + 三维度)
→ 三组 .dimension-title + .card.card-detail(紧塑力 2 视图 / 透亮感 3 视图 / 稳韧力 2 视图)
→ .prod-title → .card.report-care-products(日常护理 + 推荐产品)→ .report-disclaimer。
样式见 report.acss;数据仍由 utils/report-model.js 的 model()/layers()/marks() 产出。 -->
<view class="report">
<view class="report" style="padding-top:{{brandHeader.height}}px;">
<view class="session-guard" a:if="{{identityChecking || identityError}}">
<view>{{identityChecking ? '正在确认当前淘宝账号…' : identityError}}</view>
<button a:if="{{identityError}}" class="btn-primary" onTap="onRetryIdentity">重新验证</button>
</view>
<!-- H5 #s-report: background:#efefef url(bg-report-h5.webp) center top/100% auto。
该 webp 为 1080×7512 的纯 #EFEFEF 单色图(全图仅一种颜色 239,239,239),
与 app.acss 里 page 的底色完全等价;acss 侧不再引 32MB 解码量的空图,
直接用 page 底色(否则 <image> 还会把页面滚动高度撑到 2608px)。 -->
<view class="report-body">
<view class="report-body" hidden="{{identityChecking || identityError}}">
<!-- H5 h1.report-title -->
<view class="report-title">您的肌肤状态表现</view>
@@ -71,13 +77,14 @@
<text class="dtab-tx">{{tab.name}}</text>
</view>
</view>
<view class="detail-viewport">
<view class="detail-panels">
<view class="detail-viewport {{card.dragging ? 'dragging' : ''}}" style="{{card.height ? 'height:' + card.height + 'px;' : ''}}">
<view class="detail-panels {{card.dragging ? 'dragging' : ''}}" style="transform:translateX(-{{card.index * 100}}%) translateX({{card.dragOffset || 0}}px);">
<block a:for="{{card.views}}" a:for-item="view" a:for-index="vi" a:key="key">
<!-- H5 用 transform 横滑切换;acss 只渲染当前面板,视觉等价 -->
<view class="dpanel" a:if="{{card.index === vi}}">
<!-- Keep all panels mounted for the H5 finger-following track. -->
<view class="dpanel {{card.index === vi ? 'active' : ''}}" aria-hidden="{{card.index !== vi}}">
<view class="ditem">
<view class="viz-frame {{view.frameCls}}">
<view class="viz-frame {{view.frameCls}}" data-card="{{card.key}}" data-view="{{view.key}}"
onTouchStart="onPanelTouchStart" onTouchMove="onPanelTouchMove" onTouchEnd="onPanelTouchEnd" onTouchCancel="onPanelTouchCancel" onTap="onZoomPhoto">
<!-- hasVisual=false 时整块画框只留占位文案(H5 renderViz 的降级:轮廓/肤色/平滑度/痘痘
必须有人脸照片,皱纹/水分/泛红可只挂 face_maps 图层) -->
<view class="viz-stage" a:if="{{view.hasVisual}}">
@@ -94,13 +101,15 @@
</view>
<!-- H5 .contour-sides(轮廓=原图;皱纹=原图压暗 + 侧脸皱纹图层 / 加载态) -->
<view class="contour-sides {{view.dim ? 'wrinkle-sides' : ''}}" a:if="{{sidesShown && (view.dim || view.key === 'contour')}}">
<view class="contour-sides contour-sides-reversed {{view.dim ? 'wrinkle-sides' : ''}}" a:if="{{sidesShown && (view.dim || view.key === 'contour')}}">
<block a:for="{{sides}}" a:for-item="side" a:key="key">
<view class="contour-side {{side.key === 'right' ? 'right' : ''}}" a:if="{{side.photo}}">
<image class="side-img" src="{{side.photo}}" mode="aspectFill" />
<view class="contour-side {{side.key === 'right' ? 'right' : ''}}" a:if="{{side.photo}}"
data-card="{{card.key}}" data-view="{{view.key}}" data-side="{{side.key}}" onTap="onZoomPhoto">
<image class="side-img" src="{{side.photo}}" mode="{{side.photoStyle ? 'scaleToFill' : 'aspectFill'}}" style="{{side.photoStyle}}"
data-side="{{side.key}}" data-photo="{{side.photo}}" onLoad="onSidePhotoLoad" />
<block a:if="{{view.dim}}">
<view class="side-dim"></view>
<image class="side-img" a:if="{{side.layer}}" src="{{side.layer}}" mode="aspectFill" />
<image class="side-img" a:if="{{side.layer}}" src="{{side.layer}}" mode="{{side.photoStyle ? 'scaleToFill' : 'aspectFill'}}" style="{{side.photoStyle}}" />
<view class="side-loading" a:if="{{side.loading}}"><view>皱纹标注</view><view>加载中…</view></view>
</block>
</view>
@@ -157,7 +166,23 @@
<view class="report-disclaimer-line">*仅根据您最近的测肤记录推荐。</view>
</view>
<!-- 小程序独有入口(H5 报告页无此按钮):保留既有的历史报告跳转 -->
<button class="btn-primary btn-more" onTap="onHistory">查看历史报告</button>
</view>
<!-- H5: tap an inspection image to enlarge; tap again to return. -->
<view class="report-zoom" a:if="{{zoom && !identityChecking && !identityError}}" onTap="onCloseZoom" catchTouchMove="noop">
<view class="report-zoom-enter">
<view class="report-zoom-frame" style="{{zoom.frameStyle}}">
<view class="viz-stage" a:if="{{!zoom.side}}">
<image class="viz-photo" a:if="{{zoom.photo}}" src="{{zoom.photo}}" mode="{{zoom.fit}}" style="{{zoom.photoStyle}}" />
<view class="viz-dim" a:if="{{zoom.dark}}"></view>
<image class="viz-layer {{zoom.blend ? 'viz-blend' : ''}}" a:for="{{zoom.layers}}" a:for-item="layer" a:key="*this" src="{{layer}}" mode="scaleToFill" style="opacity:{{zoom.alpha}};{{zoom.photoStyle}}" />
<view class="viz-mark" a:for="{{zoom.marks}}" a:for-item="mark" a:key="id" style="left:{{mark.left}}%;top:{{mark.top}}%;width:{{mark.width}}%;height:{{mark.height}}%;border-color:{{mark.color}};"></view>
</view>
<block a:else>
<image class="report-zoom-side report-zoom-bitmap" src="{{zoom.bakedPhoto || zoom.photo}}" mode="aspectFit"
data-photo="{{zoom.photo}}" data-generation="{{zoom.generation}}" onLoad="onZoomSideLoad" />
</block>
</view>
</view>
</view>
<canvas id="report-side-zoom-canvas" canvas-id="report-side-zoom-canvas" width="835" height="738" class="report-zoom-canvas" />
</view>