feat: 登录过期自动续登并校验同一账号

This commit is contained in:
2026-08-07 02:53:03 +08:00
parent 0f3132b08e
commit 2182b6dfc9
39 changed files with 704 additions and 74 deletions
+3 -3
View File
@@ -124,9 +124,9 @@ export default function AddressPage() {
</Text>
</View>
<View className='address-actions'>
<Text className='address-act' onTap={() => openEdit(item)}> </Text>
<Text className='address-act' onTap={() => handleCopy(item)}>📋 </Text>
<Text className='address-act delete' onTap={() => handleDelete(item.id)}>🗑 </Text>
<Text className='address-act' onTap={() => openEdit(item)}></Text>
<Text className='address-act' onTap={() => handleCopy(item)}></Text>
<Text className='address-act delete' onTap={() => handleDelete(item.id)}></Text>
</View>
</View>
))}
+1 -1
View File
@@ -167,7 +167,7 @@ export default function DesignListPage() {
const style = STATUS_STYLE[item.status]
const rawIcon = item.productIcon?.startsWith('/icon/') || /^https?:/i.test(item.productIcon || '')
? item.productIcon
: PRODUCT_ICON_MAP[item.productId] || '/icon/四角星.png'
: PRODUCT_ICON_MAP[item.productId] || '/icon/四角星.svg'
const iconSrc = assetUrl(rawIcon)
const isSelected = selected.has(item.id)
return (
+1 -1
View File
@@ -325,7 +325,7 @@ export default function DIYPage() {
<Text className='add-label'></Text>
</View>
</View>
{hasOverlap && <Text className='overlap-hint'> </Text>}
{hasOverlap && <Text className='overlap-hint'></Text>}
</View>
{/* 控制工具栏 */}
+3 -3
View File
@@ -62,7 +62,7 @@ export default function Index() {
<View className='search-card dashed-card'>
<View className='star-badge' />
<View className='search-inner'>
<Image className='search-icon-img' src={assetUrl('/icon/搜索.png')} mode='aspectFit' />
<Image className='search-icon-img' src={assetUrl('/icon/搜索.svg')} mode='aspectFit' />
<Input
className='search-input'
type='text'
@@ -132,7 +132,7 @@ export default function Index() {
<View className='category-img-wrapper'>
<Image
className='category-img-real'
src={PRODUCT_IMG_MAP[cat.id] || assetUrl('/icon/四角星.png')}
src={PRODUCT_IMG_MAP[cat.id] || assetUrl('/icon/四角星.svg')}
mode='aspectFill'
/>
</View>
@@ -144,7 +144,7 @@ export default function Index() {
</View>
{filteredCategories.length === 0 && (
<View className='empty-category dashed-card'>
<Image className='empty-icon-img' src={assetUrl('/icon/搜索.png')} mode='aspectFit' />
<Image className='empty-icon-img' src={assetUrl('/icon/搜索.svg')} mode='aspectFit' />
<Text className='empty-text'></Text>
<Text className='empty-sub'></Text>
</View>
+1 -1
View File
@@ -141,7 +141,7 @@ export default function OrderDetailPage() {
<View className='product-icon-wrapper'>
<Image
className='product-icon-img'
src={assetUrl(order.productIcon?.startsWith('/icon/') || /^https?:/i.test(order.productIcon || '') ? order.productIcon : PRODUCT_ICON_MAP[order.productId] || '/icon/四角星.png')}
src={assetUrl(order.productIcon?.startsWith('/icon/') || /^https?:/i.test(order.productIcon || '') ? order.productIcon : PRODUCT_ICON_MAP[order.productId] || '/icon/四角星.svg')}
mode='aspectFit'
/>
</View>
+1 -1
View File
@@ -108,7 +108,7 @@ export default function OrdersPage() {
const status = STATUS_MAP[order.statusCode] || STATUS_MAP.pending
const rawIcon = order.productIcon?.startsWith('/icon/') || /^https?:/i.test(order.productIcon || '')
? order.productIcon
: '/icon/四角星.png'
: '/icon/四角星.svg'
const iconSrc = assetUrl(rawIcon)
return (
<View key={order.id} className='order-card dashed-card' onTap={() => goDetail(order)}>
+1 -1
View File
@@ -22,7 +22,7 @@ const ICON_MAP: Record<string, string> = {
const STATUS_MAP = [
{ key: 'toDesign', label: '待设计', icon: assetUrl('/icon/三角尺.png') },
{ key: 'pending', label: '待付款', icon: assetUrl('/icon/四角星.png') },
{ key: 'pending', label: '待付款', icon: assetUrl('/icon/四角星.svg') },
{ key: 'paid', label: '待发货', icon: assetUrl('/icon/包裹.png') },
{ key: 'shipping', label: '待收货', icon: assetUrl('/icon/杯子.png') },
{ key: 'done', label: '已完成', icon: assetUrl('/icon/书本.png') }
+2 -1
View File
@@ -13,7 +13,8 @@
}
.udb-lock-icon {
font-size: 80px;
width: 80px;
height: 80px;
margin-bottom: 24px;
}
+3 -2
View File
@@ -1,4 +1,4 @@
import { View, Text, Input, Button } from '@tarojs/components'
import { View, Text, Image, Input, Button } from '@tarojs/components'
import Taro from '@tarojs/taro'
import { useState, useEffect } from 'react'
import './index.scss'
@@ -14,6 +14,7 @@ import { useThemeContext } from '../../context/ThemeContext'
import { useSafeArea } from '../../hooks/useSafeArea'
import { useStatusBar } from '../../hooks/useStatusBar'
import ThemedPageMeta from '../../components/ThemedPageMeta'
import { assetUrl } from '../../utils/asset'
export default function UserDatabasePage() {
const { theme, resolvedTheme } = useThemeContext()
@@ -87,7 +88,7 @@ export default function UserDatabasePage() {
<View className='udb-page'>
<View className='udb-lock-card dashed-card mt-20'>
<View className='star-badge' />
<Text className='udb-lock-icon'>🔐</Text>
<Image className='udb-lock-icon' src={assetUrl('/icon/账号管理.png')} mode='aspectFit' />
<Text className='udb-lock-title'></Text>
<Text className='udb-lock-desc'>访</Text>
<Input
+6 -3
View File
@@ -104,7 +104,8 @@
}
.upload-icon {
font-size: 80px;
width: 80px;
height: 80px;
margin-bottom: 24px;
}
@@ -190,7 +191,8 @@
}
.generating-icon {
font-size: 120px;
width: 120px;
height: 120px;
animation: pulse 2s infinite;
}
@@ -277,7 +279,8 @@
}
.action-icon {
font-size: 48px;
width: 48px;
height: 48px;
margin-bottom: 8px;
}
+6 -5
View File
@@ -6,6 +6,7 @@ import { useThemeContext } from '../../context/ThemeContext'
import { useSafeArea } from '../../hooks/useSafeArea'
import { useStatusBar } from '../../hooks/useStatusBar'
import ThemedPageMeta from '../../components/ThemedPageMeta'
import { assetUrl } from '../../utils/asset'
export default function WordCloudPage() {
const { theme, resolvedTheme } = useThemeContext()
@@ -92,7 +93,7 @@ export default function WordCloudPage() {
<Image className='preview-image' src={baseImage} mode='aspectFit' />
) : (
<View className='upload-placeholder'>
<Text className='upload-icon'>📷</Text>
<Image className='upload-icon' src={assetUrl('/icon/词云生成.png')} mode='aspectFit' />
<Text className='upload-title'></Text>
<Text className='upload-desc'>Logo</Text>
<Text className='upload-tip'></Text>
@@ -148,7 +149,7 @@ export default function WordCloudPage() {
<View className='step-content'>
{isGenerating ? (
<View className='generating-panel'>
<Text className='generating-icon'></Text>
<Image className='generating-icon' src={assetUrl('/icon/词云生成.png')} mode='aspectFit' />
<Text className='generating-title'>...</Text>
<Text className='generating-subtitle'>AI正在将名字融入图案</Text>
<View className='progress-bar'>
@@ -166,15 +167,15 @@ export default function WordCloudPage() {
</View>
<View className='result-actions'>
<View className='action-btn' onTap={handleExportImage}>
<Text className='action-icon'>💾</Text>
<Image className='action-icon' src={assetUrl('/icon/设置.png')} mode='aspectFit' />
<Text className='action-label'></Text>
</View>
<View className='action-btn' onTap={handleGenerate}>
<Text className='action-icon'>🔄</Text>
<Image className='action-icon' src={assetUrl('/icon/词云生成.png')} mode='aspectFit' />
<Text className='action-label'></Text>
</View>
<View className='action-btn' onTap={() => setStep(2)}>
<Text className='action-icon'></Text>
<Image className='action-icon' src={assetUrl('/icon/调色盘.png')} mode='aspectFit' />
<Text className='action-label'></Text>
</View>
</View>