feat(v3.4.16): partner UX, package pricing, CS gate, HQ list polish

Stop auto ST from validation_error; show package prices with right-aligned layout; partner store list status/filter and onboard CS QR gate; HQ store table truncation/fixed actions; expose CS config in wechat_mini settings; bind local servers for LAN.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-09 16:00:45 +08:00
parent 07630c9046
commit 46361ec713
21 changed files with 637 additions and 221 deletions
@@ -108,6 +108,13 @@ function formatRedeemTime(input?: string | null) {
return formatShanghaiDateTime(input);
}
function formatPackagePriceYuan(price: string | number) {
const n = typeof price === 'number' ? price : Number(price);
if (!Number.isFinite(n)) return '0';
if (Math.abs(n - Math.round(n)) < 1e-9) return String(Math.round(n));
return n.toFixed(2).replace(/\.?0+$/, '');
}
function formatRedeemAmountYuan(amount: number | string) {
const n = typeof amount === 'number' ? amount : Number(amount);
if (!Number.isFinite(n)) return '0';
@@ -419,7 +426,12 @@ export default function StoreDetailPage() {
className="store-detail-package-list-item"
onClick={() => openPackageDetail(index)}
>
<Text className="store-detail-package-list-title">{pkg.name}</Text>
<View className="store-detail-package-list-row">
<Text className="store-detail-package-list-title">{pkg.name}</Text>
<Text className="store-detail-package-list-price">
&nbsp;&nbsp;&nbsp;&nbsp;¥{formatPackagePriceYuan(pkg.price)}
</Text>
</View>
</View>
))}
</View>
+36 -9
View File
@@ -281,13 +281,36 @@
padding-bottom: 0;
}
.store-detail-package-list-title {
/* 名称在左可换行;价格始终贴该行最右侧 */
.store-detail-package-list-row {
/* display: flex;
flex-wrap: wrap;
align-items: flex-start;
column-gap: 12px;
row-gap: 4px; */
display: block;
width: 100%;
}
.store-detail-package-list-title {
min-width: 0;
font-family: var(--font-headline);
font-size: 15px;
line-height: 1.5;
font-weight: 500;
color: var(--color-on-surface);
word-break: break-word;
display: inline;
}
.store-detail-package-list-price {
display: inline;
margin-left: auto;
font-size: 15px;
line-height: 1.5;
font-weight: 600;
color: var(--color-heritage-red, #a61d24);
text-align: right;
}
.store-detail-package-list-item:active {
@@ -315,15 +338,18 @@
padding: 8px 16px 4px 16px;
}
/* 与门店详情套餐列表一致:名称在左可换行;价格始终贴该行最右侧 */
.store-package-detail-title-row {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
flex-wrap: wrap;
align-items: flex-end;
column-gap: 16px;
row-gap: 4px;
width: 100%;
}
.store-package-detail-title {
flex: 1;
/* flex: 1 1 10em; */
min-width: 0;
font-family: var(--font-headline);
font-size: 20px;
@@ -334,13 +360,14 @@
}
.store-package-detail-price {
flex-shrink: 0;
font-size: 24px;
/* flex: 0 0 auto; */
margin-left: auto;
font-size: 20px;
font-weight: 700;
line-height: 1.35;
color: #a61d24;
line-height: 1.4;
color: var(--color-heritage-red, #a61d24);
text-align: right;
white-space: nowrap;
}
.store-package-detail-store {