feat(v3.4.15): admin delivery track drawer and mini-user store list polish

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-07 13:25:55 +08:00
parent e4e9eb2169
commit 10fa361983
14 changed files with 404 additions and 106 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

+1 -1
View File
@@ -2,7 +2,7 @@ import Taro from '@tarojs/taro';
import { fetchClientConfig } from './pay-wechat';
/** 与 package.json version 同步,供服务端 minClientVersion 比对 */
export const APP_VERSION = '3.4.14';
export const APP_VERSION = '3.4.15';
export const APP_VERSION_LABEL = `v${APP_VERSION}`;
+26 -32
View File
@@ -40,6 +40,7 @@ import {
toWeappShareMessage,
toWeappShareTimeline,
} from '../../lib/wechat-share';
import openBadgeImg from '../../assets/icons/store-open-badge.png';
type Store = {
id: string;
@@ -341,12 +342,12 @@ export default function StoresPage() {
}
}
function hoursLines(store: Store): string[] {
function hoursText(store: Store): string {
const parts: string[] = [];
if (store.openTime && store.closeTime) parts.push(`${store.openTime}-${store.closeTime}`);
if (store.openTime2 && store.closeTime2) parts.push(`${store.openTime2}-${store.closeTime2}`);
if (!parts.length) parts.push('10:00-22:00');
return parts.map((p, i) => (i === 0 ? `营业时间: ${p}` : p));
return `营业时间: ${parts.join(' ')}`;
}
const sharePayload = useMemo(
@@ -421,45 +422,38 @@ export default function StoresPage() {
className="store-card"
onClick={() => Taro.navigateTo({ url: `/pages/store-detail/index?id=${s.id}` })}
>
{s.coverUrl ? (
<Image className="store-card-cover" src={s.coverUrl} mode="aspectFill" />
) : (
<View className="store-card-cover store-card-cover--empty" />
)}
<View className="store-card-cover-wrap">
{s.coverUrl ? (
<Image className="store-card-cover" src={s.coverUrl} mode="aspectFill" />
) : (
<View className="store-card-cover store-card-cover--empty" />
)}
<Image
className="store-card-open-badge"
src={openBadgeImg}
mode="aspectFit"
/>
</View>
<View className="store-card-body">
{/* 第1行:标题 + 距离 */}
{/* 第1行:标题(截断无省略号,顶到最右) */}
<View className="store-card-row store-card-row--head">
<Text className="store-card-name" numberOfLines={1}>
{s.name}
<Text className="store-card-name">{s.name}</Text>
</View>
{/* 第2行:地址(最多两行)+ 距离 */}
<View className="store-card-row store-card-row--mid">
<Text className="store-card-address" numberOfLines={2}>
{s.address || (s.district ? `${s.district}` : '地址待完善')}
</Text>
<Text className="store-card-distance">
{formatDistanceMeters(s.distanceMeters)}
</Text>
</View>
{/* 第2行:营业时间(多段各占一行,居左 */}
<View className="store-card-hours">
{hoursLines(s).map((line) => (
<Text key={line} className="store-card-hours-line">
{line}
</Text>
))}
</View>
{/* 第3行:地址(最多两行)+ 去核销 */}
<View className="store-card-row store-card-row--foot">
<Text className="store-card-address" numberOfLines={2}>
{s.address || (s.district ? `${s.district}` : '地址待完善')}
</Text>
<View
className="store-card-cta"
onClick={(e) => {
e.stopPropagation();
Taro.navigateTo({ url: '/pages/redeem/index' });
}}
>
<Text className="store-card-cta-text"></Text>
</View>
{/* 第3行:营业时间(同行 */}
<View className="store-card-row store-card-row--hours">
<Text className="store-card-hours">{hoursText(s)}</Text>
</View>
</View>
<Text className="store-card-arrow"></Text>
</View>
))}
</View>
+68 -61
View File
@@ -144,12 +144,12 @@
padding: 4px var(--space-page) 16px;
}
/* 左图右文 */
/* 左图 + 中间文案 + 右侧箭头 */
.store-card {
display: flex;
flex-direction: row;
align-items: flex-start;
gap: 12px;
align-items: center;
gap: 10px;
padding: 12px;
box-sizing: border-box;
background: var(--color-card);
@@ -158,11 +158,19 @@
margin-bottom: 12px;
}
.store-card-cover {
.store-card-cover-wrap {
position: relative;
flex-shrink: 0;
width: 96px;
height: 96px;
border-radius: 8px;
overflow: hidden;
}
.store-card-cover {
width: 100%;
height: 100%;
border-radius: 8px;
background: var(--color-surface-container);
display: block;
}
@@ -171,6 +179,16 @@
background: var(--color-surface-container);
}
.store-card-open-badge {
position: absolute;
top: 0;
right: 0;
width: 44px;
height: 44px;
pointer-events: none;
z-index: 1;
}
.store-card-body {
flex: 1;
min-width: 0;
@@ -184,19 +202,19 @@
.store-card-row {
display: flex;
align-items: center;
align-items: flex-start;
min-width: 0;
overflow: hidden;
}
/* 第1行:加粗标题(单行截断+ 右对齐距离 */
/* 第1行:加粗标题(单行截断,不显示 …,宽度顶到最右) */
.store-card-row--head {
gap: 8px;
height: 22px;
align-items: center;
}
.store-card-name {
flex: 1;
width: 100%;
min-width: 0;
font-family: var(--font-headline);
font-size: 15px;
@@ -204,53 +222,23 @@
line-height: 22px;
color: #1a1a1a;
overflow: hidden;
text-overflow: ellipsis;
text-overflow: clip;
white-space: nowrap;
}
.store-card-distance {
flex-shrink: 0;
max-width: 40%;
font-size: 12px;
font-weight: 400;
line-height: 22px;
color: #999;
text-align: right;
white-space: nowrap;
}
/* 第2行:营业时间独自居左;多段各占一行 */
.store-card-hours {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 2px;
min-width: 0;
}
.store-card-hours-line {
font-size: 11px;
font-weight: 400;
line-height: 16px;
color: #999;
text-align: left;
}
/* 第3行:地址最多两行截断 + 右对齐去核销;与按钮垂直居中 */
.store-card-row--foot {
/* 第2行:地址最多两行 + 右对齐距离 */
.store-card-row--mid {
gap: 8px;
min-height: 28px;
align-items: center;
overflow: visible;
align-items: flex-start;
}
.store-card-address {
flex: 1;
min-width: 0;
font-size: 9px;
font-size: 11px;
font-weight: 400;
line-height: 14px;
max-height: 28px;
line-height: 16px;
max-height: 32px;
color: #999;
text-align: left;
white-space: normal;
@@ -260,25 +248,44 @@
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-clamp: 2;
text-overflow: ellipsis;
}
.store-card-cta {
.store-card-distance {
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
padding: 0 14px;
height: 26px;
border-radius: 999px;
background: var(--color-heritage-red, #a61d24);
box-sizing: border-box;
}
.store-card-cta-text {
max-width: 40%;
padding-top: 1px;
font-size: 12px;
font-weight: 600;
line-height: 26px;
color: #fff;
font-weight: 400;
line-height: 16px;
color: #999;
text-align: right;
white-space: nowrap;
}
/* 第3行:营业时间同行 */
.store-card-row--hours {
align-items: center;
}
.store-card-hours {
width: 100%;
min-width: 0;
font-size: 11px;
font-weight: 400;
line-height: 16px;
color: #999;
overflow: hidden;
text-overflow: clip;
white-space: nowrap;
}
.store-card-arrow {
flex-shrink: 0;
align-self: center;
width: 16px;
font-size: 20px;
font-weight: 300;
line-height: 1;
color: #ccc;
text-align: center;
}