{
}
.sidebar {
- width: 180px;
- min-width: 180px;
+ width: 220px;
+ min-width: 220px;
flex-shrink: 0;
background: #F0F0F0;
border-right: 1px solid #e8eaec;
@@ -859,20 +901,104 @@ onUnmounted(() => {
object-fit: contain;
}
-.user-avatar {
+/* 主Logo */
+.main-logo {
display: flex;
align-items: center;
justify-content: center;
- padding: 12px 0;
- margin: 0 0 12px 0;
+ padding: 8px 0;
+ margin: 0 0 16px 0;
}
-.user-avatar img {
- width: 90px;
-
+.main-logo img {
+ width: 120px;
object-fit: contain;
}
+/* 用户头像区域 */
+.user-avatar-section {
+ display: flex;
+ align-items: center;
+ gap: 7px;
+ padding: 8px 10px;
+ margin: 0 0 16px 0;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.avatar-wrapper {
+ flex-shrink: 0;
+ width: 44px;
+ height: 44px;
+ border-radius: 50%;
+ overflow: hidden;
+ background: #fff;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
+}
+
+.user-avatar-img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+.user-info {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ text-align: left;
+}
+
+.user-name-wrapper {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ min-width: 0;
+}
+
+.user-name {
+ font-size: 14px;
+ font-weight: 600;
+ color: #303133;
+ white-space: nowrap;
+ line-height: 1.2;
+ flex-shrink: 0;
+}
+
+.vip-badge {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0px 5px;
+ height: 16px;
+ background: #BAE0FF;
+ border: 1px solid rgba(22, 119, 255, 0.05);
+ border-radius: 8px;
+ font-size: 10px;
+ font-weight: 600;
+ color: rgba(0, 29, 102, 1);
+ white-space: nowrap;
+ flex-shrink: 0;
+ line-height: 100%;
+ text-align: center;
+ letter-spacing: 0%;
+}
+
+.user-action {
+ font-size: 11px;
+ color: #909399;
+ line-height: 1.3;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
.menu-group-title {
font-size: 12px;
color: #909399;
@@ -886,8 +1012,8 @@ onUnmounted(() => {
justify-content: center;
align-items: center;
width: 100%;
- height: 48px;
- margin-bottom: 12px;
+ height: 60px;
+ margin-bottom: 16px;
padding: 0 4px;
box-sizing: border-box;
}
diff --git a/electron-vue-template/src/renderer/api/http.ts b/electron-vue-template/src/renderer/api/http.ts
index a6481b3..249dbf8 100644
--- a/electron-vue-template/src/renderer/api/http.ts
+++ b/electron-vue-template/src/renderer/api/http.ts
@@ -1,6 +1,6 @@
export type HttpMethod = 'GET' | 'POST' | 'DELETE';
-//const RUOYI_BASE = 'http://8.138.23.49:8085';
- const RUOYI_BASE = 'http://192.168.1.89:8085';
+const RUOYI_BASE = 'http://8.138.23.49:8085';
+// const RUOYI_BASE = 'http://192.168.1.89:8085';
export const CONFIG = {
CLIENT_BASE: 'http://localhost:8081',
RUOYI_BASE,
diff --git a/electron-vue-template/src/renderer/components/amazon/AmazonDashboard.vue b/electron-vue-template/src/renderer/components/amazon/AmazonDashboard.vue
index b36f8ee..dd2e320 100644
--- a/electron-vue-template/src/renderer/components/amazon/AmazonDashboard.vue
+++ b/electron-vue-template/src/renderer/components/amazon/AmazonDashboard.vue
@@ -131,7 +131,7 @@ function handleExportData() {
- ASIN查询
+ ASIN监控
@@ -245,7 +245,17 @@ function handleExportData() {
@@ -386,7 +480,7 @@ function handleExportData() {
@@ -507,7 +601,6 @@ function handleExportData() {
align-items: center;
padding: 0px 12px;
gap: 8px;
- width: 140px;
height: 40px;
min-height: 40px;
max-height: 40px;
@@ -518,19 +611,19 @@ function handleExportData() {
flex-shrink: 0;
cursor: pointer;
transition: all 0.2s ease;
- color: #606266;
+ color: #303133;
font-size: 14px;
font-weight: 400;
}
.tab-item:hover {
background: #f0f9ff;
border-color: #1677FF;
- color: #1677FF;
+ color: #303133;
}
.tab-item.active {
background: #FFFFFF;
border: 1px solid #1677FF;
- color: #1677FF;
+ color: #303133;
cursor: default;
}
.tab-icon { width: 20px; height: 20px; flex-shrink: 0; object-fit: contain; }
@@ -576,7 +669,6 @@ function handleExportData() {
display: flex;
flex-direction: column;
box-sizing: border-box;
- transition: width 0.3s ease;
}
.steps-sidebar.narrow {
width: 240px;
@@ -793,7 +885,7 @@ function handleExportData() {
gap: 10px;
width: 90%;
max-width: 872px;
- margin: 0 auto;
+ margin: 16px auto;
background: rgba(0, 0, 0, 0.02);
border: 1px solid rgba(0, 0, 0, 0.06);
border-radius: 8px;
@@ -816,6 +908,7 @@ function handleExportData() {
pointer-events: none;
}
.genmai-info-boxes {
+ margin-bottom: 16px;
box-sizing: border-box;
display: flex;
text-align: left;
@@ -840,7 +933,7 @@ function handleExportData() {
display: flex;
flex-direction: column;
gap: 8px;
- padding: 0 16px;
+ padding: 0px 15px;
}
.info-box:not(:last-child) {
border-right: 1px solid rgba(0, 0, 0, 0.06);
@@ -859,6 +952,8 @@ function handleExportData() {
.info-link {
color: #1677FF;
text-decoration: none;
+ position: relative;
+ z-index: 10;
}
.info-link:hover {
text-decoration: underline;
@@ -909,13 +1004,12 @@ function handleExportData() {
background: transparent;
border-radius: 50%;
}
-.done-banner .banner-icon {
- background: transparent;
-}
-.icon-image {
+.banner-icon svg {
width: 48px;
height: 48px;
- filter: none;
+}
+.done-banner .banner-icon {
+ background: transparent;
}
.banner-content {
flex: 1;
@@ -946,10 +1040,6 @@ function handleExportData() {
.unified-task-card {
width: 70%;
max-width: 900px;
- background: #FFFFFF;
- border: 1px solid rgba(0, 0, 0, 0.06);
- border-radius: 12px;
- box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.08);
overflow: hidden;
}
@@ -982,7 +1072,7 @@ function handleExportData() {
height: 24px;
object-fit: contain;
}
-.status-indicator-icon[src*="inProgress"] {
+.status-indicator-icon.spinning {
animation: spin 1.5s linear infinite;
}
.status-connector {
@@ -1038,6 +1128,9 @@ function handleExportData() {
margin-bottom: 2px;
line-height: 1.4;
}
+.task-name-disabled {
+ color: #909399;
+}
.task-desc {
font-size: 11px;
color: #909399;
@@ -1115,8 +1208,7 @@ function handleExportData() {
}
/* wide保持280px不变 */
.tab-item {
- width: 120px;
- padding: 0px 8px;
+ padding: 0px 15px;
}
}
@@ -1146,8 +1238,13 @@ function handleExportData() {
max-height: 300px;
}
.tab-item {
- width: 100px;
- font-size: 13px;
+ font-size: 12px;
+ padding: 0px 6px;
+ gap: 6px;
+ }
+ .tab-icon {
+ width: 16px;
+ height: 16px;
}
.status-banner,
.unified-task-card {
@@ -1161,9 +1258,9 @@ function handleExportData() {
width: 40px;
height: 40px;
}
- .icon-image {
- width: 24px;
- height: 24px;
+ .banner-icon svg {
+ width: 32px;
+ height: 32px;
}
.banner-title {
font-size: 14px;
diff --git a/electron-vue-template/src/renderer/components/amazon/TrademarkCheckPanel.vue b/electron-vue-template/src/renderer/components/amazon/TrademarkCheckPanel.vue
index 0c999de..ee0f311 100644
--- a/electron-vue-template/src/renderer/components/amazon/TrademarkCheckPanel.vue
+++ b/electron-vue-template/src/renderer/components/amazon/TrademarkCheckPanel.vue
@@ -106,6 +106,7 @@ const completedSteps = computed(() => {
const showTrialExpiredDialog = ref(false)
const trialExpiredType = ref<'device' | 'account' | 'both' | 'subscribe'>('account')
+const showExcelExample = ref(false)
const vipStatus = inject('vipStatus')
function showMessage(message: string, type: 'success' | 'warning' | 'error' | 'info' = 'info') {
@@ -167,7 +168,7 @@ function removeTrademarkFile() {
// 保存会话到后端
async function saveSession() {
if (!trademarkData.value.length) return
-
+
try {
const sessionData = {
fileName: trademarkFileName.value,
@@ -177,7 +178,7 @@ async function saveSession() {
taskProgress: taskProgress.value,
queryStatus: queryStatus.value
}
-
+
const result = await markApi.saveSession(sessionData)
if (result.code === 200 || result.code === 0) {
const username = getUsernameFromToken()
@@ -197,15 +198,13 @@ async function restoreSession() {
const username = getUsernameFromToken()
const saved = localStorage.getItem(`trademark_session_${username}`)
if (!saved) return
-
+
const { sessionId, timestamp } = JSON.parse(saved)
-
- // 检查是否在7天内
if (Date.now() - timestamp > 7 * 24 * 60 * 60 * 1000) {
localStorage.removeItem(`trademark_session_${username}`)
return
}
-
+
const result = await markApi.getSession(sessionId)
if (result.code === 200 || result.code === 0) {
trademarkFileName.value = result.data.fileName || ''
@@ -213,11 +212,33 @@ async function restoreSession() {
trademarkFullData.value = result.data.fullData || []
trademarkHeaders.value = result.data.headers || []
queryStatus.value = result.data.queryStatus || 'idle'
-
+
if (result.data.taskProgress) {
- Object.assign(taskProgress.value, result.data.taskProgress)
+ const saved = result.data.taskProgress
+
+ if (saved.product) {
+ taskProgress.value.product.total = saved.product.total || 0
+ taskProgress.value.product.current = saved.product.current || 0
+ taskProgress.value.product.completed = saved.product.completed || 0
+ }
+
+ if (saved.brand) {
+ taskProgress.value.brand.total = saved.brand.total || 0
+ taskProgress.value.brand.current = saved.brand.current || 0
+ taskProgress.value.brand.completed = saved.brand.completed || 0
+ }
+
+ if (saved.platform) {
+ taskProgress.value.platform.total = saved.platform.total || 0
+ taskProgress.value.platform.current = saved.platform.current || 0
+ taskProgress.value.platform.completed = saved.platform.completed || 0
+ }
}
-
+
+ // 恢复真实数据标记
+ if (taskProgress.value.product.total > 0) isProductTaskRealData.value = true
+ if (taskProgress.value.brand.total > 0) isBrandTaskRealData.value = true
+
emit('updateData', trademarkData.value)
}
} catch (error) {
@@ -742,7 +763,8 @@ defineExpose({
-
-
-
-
+
数据筛查中...
@@ -259,7 +269,11 @@ function handleExportData() {
-
+
已取消查询
@@ -274,7 +288,15 @@ function handleExportData() {
-
+
+
{{ trademarkPanelRef.queryStatus === 'done' ? '筛查已完成' : '数据筛查失败' }}
@@ -296,29 +318,101 @@ function handleExportData() {
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
{{ trademarkPanelRef?.taskProgress?.platform?.label || '亚马逊跟卖许可筛查' }}
+ 亚马逊跟卖许可筛查(即将上线,敬请期待)
{{ trademarkPanelRef?.taskProgress?.platform?.desc || '筛查亚马逊许可跟卖的商品' }} (未开始)
1
导入Excel表格
产品筛查:需导入卖家精灵选品表格,并勾选"导出主图";品牌筛查:Excel需包含"品牌"列
+ 在卖家精灵导出文档时,必须要勾选“导出主图”。导入的表格必须具备“品牌”,“商品主图”两个表头,商品主图必须为超链接。
+ 点击查看示例
+
+
@@ -798,9 +820,9 @@ defineExpose({
-
+
2
选择亚马逊商家账号
-
-
+
3
+ 2
选择产品品牌地区
暂时仅支持美国品牌商标筛查,后续将开放更多地区,敬请期待。
@@ -812,15 +834,15 @@ defineExpose({
-
+
+
+
+
+
@@ -896,6 +923,24 @@ defineExpose({
.step-header { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.title { font-size: 14px; font-weight: 600; color: #303133; text-align: left; }
.desc { font-size: 12px; color: #909399; margin-bottom: 10px; text-align: left; line-height: 1.5; }
+.example-link {
+ color: #1677FF;
+ cursor: pointer;
+ text-decoration: underline;
+ margin-left: 4px;
+}
+.example-link:hover {
+ color: #0958d9;
+}
+
+/* 弹框标题左对齐 */
+:deep(.excel-dialog .el-dialog__header) {
+ text-align: left;
+ font-weight: bold;
+ margin-bottom: 0;
+ padding-bottom: 0;
+}
+
.links { display: flex; align-items: center; gap: 6px; margin-bottom: 8px; }
.link { color: #909399; cursor: pointer; font-size: 12px; }
@@ -954,7 +999,6 @@ defineExpose({
}
.query-card.query-disabled {
cursor: not-allowed;
- opacity: 0.5;
pointer-events: none;
}
.query-check {
@@ -998,14 +1042,14 @@ defineExpose({
text-overflow: ellipsis;
width: 100%;
}
+.query-title-disabled {
+ color: #909399;
+}
.query-desc {
font-size: 11px;
color: #909399;
line-height: 1.3;
text-align: left;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
width: 100%;
}
diff --git a/electron-vue-template/src/renderer/components/auth/LoginDialog.vue b/electron-vue-template/src/renderer/components/auth/LoginDialog.vue
index 7ec5f07..1bfc8a2 100644
--- a/electron-vue-template/src/renderer/components/auth/LoginDialog.vue
+++ b/electron-vue-template/src/renderer/components/auth/LoginDialog.vue
@@ -97,6 +97,8 @@ async function saveBrandLogoInBackground(username: string) {
try {
const res = await splashApi.getBrandLogo(username)
const url = res?.data?.url || ''
+ // 保存到本地配置
+ await (window as any).electronAPI.saveBrandLogoConfig(username, url)
// 触发App.vue加载品牌logo
window.dispatchEvent(new CustomEvent('brandLogoChanged', { detail: url }))
} catch (error) {
diff --git a/electron-vue-template/src/renderer/components/common/SettingsDialog.vue b/electron-vue-template/src/renderer/components/common/SettingsDialog.vue
index fdebee2..194cae9 100644
--- a/electron-vue-template/src/renderer/components/common/SettingsDialog.vue
+++ b/electron-vue-template/src/renderer/components/common/SettingsDialog.vue
@@ -13,6 +13,7 @@ import { getToken, getUsernameFromToken } from '../../utils/token'
import { getOrCreateDeviceId } from '../../utils/deviceId'
import { updateApi } from '../../api/update'
import { splashApi } from '../../api/splash'
+import { compressImage, formatFileSize, COMPRESS_PRESETS } from '../../utils/imageCompressor'
const TrialExpiredDialog = defineAsyncComponent(() => import('./TrialExpiredDialog.vue'))
const refreshVipStatus = inject<() => Promise>('refreshVipStatus')
@@ -394,10 +395,13 @@ function triggerFileSelect() {
async function loadSplashImage() {
try {
const username = getUsernameFromToken()
- if (!username) return
-
+ if (!username) {
+ splashImageUrl.value = ''
+ return
+ }
const res = await splashApi.getSplashImage(username)
- splashImageUrl.value = res.data.url
+ const url = res?.data?.url || res?.data?.data?.url || ''
+ splashImageUrl.value = url ? `${url}?t=${Date.now()}` : ''
} catch (error) {
splashImageUrl.value = ''
}
@@ -406,31 +410,36 @@ async function loadSplashImage() {
// 上传开屏图片
async function handleSplashImageUpload(event: Event) {
const input = event.target as HTMLInputElement
- if (!input.files || input.files.length === 0) return
+ if (!input.files?.length) return
+
+ const username = getUsernameFromToken()
+ if (!username) {
+ ElMessage.warning('请先登录')
+ input.value = ''
+ return
+ }
// VIP验证
if (refreshVipStatus) await refreshVipStatus()
if (!props.isVip) {
- if (vipStatus) trialExpiredType.value = vipStatus.value.expiredType
+ trialExpiredType.value = vipStatus?.value?.expiredType || 'account'
showTrialExpiredDialog.value = true
input.value = ''
return
}
const file = input.files[0]
- const username = getUsernameFromToken()
- if (!username) return ElMessage.warning('请先登录')
if (!file.type.startsWith('image/')) return ElMessage.error('只支持图片文件')
- if (file.size > 5 * 1024 * 1024) return ElMessage.error('图片大小不能超过5MB')
+ if (file.size > 10 * 1024 * 1024) return ElMessage.error('图片大小不能超过10MB')
try {
uploadingSplashImage.value = true
- const res = await splashApi.uploadSplashImage(file, username)
+ const compressed = await compressImage(file, COMPRESS_PRESETS.HIGH)
+ const res = await splashApi.uploadSplashImage(compressed.file, username)
splashImageUrl.value = res.url
await (window as any).electronAPI.saveSplashConfig(username, res.url)
- ElMessage.success('开屏图片设置成功,重启应用后生效')
- } catch (error: any) {
- ElMessage.error(error?.message || '上传失败')
+ } catch (error) {
+ splashImageUrl.value = ''
} finally {
uploadingSplashImage.value = false
input.value = ''
@@ -450,9 +459,11 @@ async function handleDeleteSplashImage() {
const username = getUsernameFromToken()
if (!username) return ElMessage.warning('请先登录')
+ // 先清空UI显示,立即生效
+ splashImageUrl.value = ''
+
await splashApi.deleteSplashImage(username)
await (window as any).electronAPI.saveSplashConfig(username, '')
- splashImageUrl.value = ''
ElMessage.success('开屏图片已删除,重启应用后恢复默认')
} catch (error: any) {
if (error !== 'cancel') ElMessage.error(error?.message || '删除失败')
@@ -465,10 +476,13 @@ async function handleDeleteSplashImage() {
async function loadBrandLogo() {
try {
const username = getUsernameFromToken()
- if (!username) return
-
+ if (!username) {
+ brandLogoUrl.value = ''
+ return
+ }
const res = await splashApi.getBrandLogo(username)
- brandLogoUrl.value = res.data.url
+ const url = res?.data?.url || ''
+ brandLogoUrl.value = url ? `${url}?t=${Date.now()}` : ''
} catch (error) {
brandLogoUrl.value = ''
}
@@ -477,31 +491,36 @@ async function loadBrandLogo() {
// 上传品牌logo
async function handleBrandLogoUpload(event: Event) {
const input = event.target as HTMLInputElement
- if (!input.files || input.files.length === 0) return
+ if (!input.files?.length) return
+
+ const username = getUsernameFromToken()
+ if (!username) {
+ ElMessage.warning('请先登录')
+ input.value = ''
+ return
+ }
// VIP验证
if (refreshVipStatus) await refreshVipStatus()
if (!props.isVip) {
- if (vipStatus) trialExpiredType.value = vipStatus.value.expiredType
+ trialExpiredType.value = vipStatus?.value?.expiredType || 'account'
showTrialExpiredDialog.value = true
input.value = ''
return
}
const file = input.files[0]
- const username = getUsernameFromToken()
- if (!username) return ElMessage.warning('请先登录')
if (!file.type.startsWith('image/')) return ElMessage.error('只支持图片文件')
- if (file.size > 5 * 1024 * 1024) return ElMessage.error('图片大小不能超过5MB')
+ if (file.size > 10 * 1024 * 1024) return ElMessage.error('图片大小不能超过10MB')
try {
uploadingBrandLogo.value = true
- const res = await splashApi.uploadBrandLogo(file, username)
+ const compressed = await compressImage(file, COMPRESS_PRESETS.HIGH)
+ const res = await splashApi.uploadBrandLogo(compressed.file, username)
brandLogoUrl.value = res.url
- ElMessage.success('品牌logo设置成功')
window.dispatchEvent(new CustomEvent('brandLogoChanged', { detail: res.url }))
- } catch (error: any) {
- ElMessage.error(error?.message || '上传失败')
+ } catch (error) {
+ brandLogoUrl.value = ''
} finally {
uploadingBrandLogo.value = false
input.value = ''
@@ -512,7 +531,7 @@ async function handleBrandLogoUpload(event: Event) {
async function handleDeleteBrandLogo() {
try {
await ElMessageBox.confirm(
- '确定要删除品牌logo吗?删除后将隐藏logo区域。',
+ '确定要删除品牌 Banner吗?删除后将隐藏区域。',
'确认删除',
{ confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }
)
@@ -521,11 +540,10 @@ async function handleDeleteBrandLogo() {
const username = getUsernameFromToken()
if (!username) return ElMessage.warning('请先登录')
- await splashApi.deleteBrandLogo(username)
-
- // 立即清空本地状态
+ // 先清空UI显示,立即生效
brandLogoUrl.value = ''
- ElMessage.success('品牌logo已删除')
+
+ await splashApi.deleteBrandLogo(username)
// 立即触发App.vue清空logo
window.dispatchEvent(new CustomEvent('brandLogoChanged', { detail: '' }))
@@ -542,6 +560,16 @@ onMounted(() => {
loadCurrentVersion()
loadSplashImage()
loadBrandLogo()
+
+ // 监听品牌logo删除事件
+ const handleBrandLogoChange = (e: any) => {
+ const url = e.detail || ''
+ brandLogoUrl.value = url
+ }
+ window.addEventListener('brandLogoChanged', handleBrandLogoChange)
+
+ // 组件卸载时移除监听
+ return () => window.removeEventListener('brandLogoChanged', handleBrandLogoChange)
})
@@ -736,7 +764,7 @@ onMounted(() => {
@@ -1246,8 +1270,43 @@ onMounted(() => {
.preview-image {
width: 100%;
- height: 100%;
+ display: block;
object-fit: contain;
+ border-radius: 8px;
+}
+
+/* 占位符 */
+.splash-placeholder {
+ width: 75% !important;
+ height: auto !important;
+ border: 2px dashed #d9d9d9 !important;
+ border-radius: 8px !important;
+ background: #fafafa !important;
+ cursor: pointer;
+ transition: all 0.3s;
+}
+
+.splash-placeholder:hover {
+ border-color: #1677ff !important;
+ background: #f0f7ff !important;
+}
+
+.placeholder-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 6px;
+ padding: 30px 20px;
+}
+
+.placeholder-icon {
+ font-size: 28px;
+}
+
+.placeholder-text {
+ font-size: 13px;
+ color: rgba(0, 0, 0, 0.45);
}
.image-buttons {
diff --git a/electron-vue-template/src/renderer/components/layout/NavigationBar.vue b/electron-vue-template/src/renderer/components/layout/NavigationBar.vue
index 6b1f1d6..adc867e 100644
--- a/electron-vue-template/src/renderer/components/layout/NavigationBar.vue
+++ b/electron-vue-template/src/renderer/components/layout/NavigationBar.vue
@@ -20,7 +20,6 @@ interface Emits {
(e: 'open-settings'): void
(e: 'open-account-manager'): void
(e: 'check-update'): void
- (e: 'show-login'): void
}
const props = defineProps()
@@ -113,10 +112,6 @@ onMounted(async () => {
-
-
4
+ 3
选择需查询的(可多选)
默认查询违规产品,可多选
-
@@ -857,7 +879,7 @@ defineExpose({
+
@@ -830,7 +852,7 @@ defineExpose({
- ✓
+
@@ -846,7 +868,7 @@ defineExpose({
✓
跟卖许可筛查
- 筛查亚马逊许可跟卖的商品
+ 筛查亚马逊许可跟卖的商品(即将上线,敬请期待)
- {{ completedSteps }}/4
+ {{ completedSteps }}/3
开始筛查
@@ -868,6 +890,11 @@ defineExpose({
+
-
+
-
- 🖼️
- 未设置自定义开屏图片
+
-
- {{ uploadingSplashImage ? '上传中' : '选择图片' }}
-
+
-
+ 🖼️
+ {{ uploadingSplashImage ? '上传中...' : '点击选择开屏图片' }}
+
-
品牌logo
+ 品牌 Banner
支持 JPG、PNG 格式,最佳显示尺寸/比例 1200*736
-
+
-
- 🏷️
- 未设置品牌logo
+
-
- {{ uploadingBrandLogo ? '上传中' : '选择图片' }}
-
+
-
+ 🏷️
+ {{ uploadingBrandLogo ? '上传中...' : '点击选择品牌 Banner' }}
+
@@ -324,29 +319,6 @@ onMounted(async () => {
}
/* 登录/注册按钮 */
-.login-btn {
- height: 28px;
- padding: 0 12px;
- border: none;
- border-radius: 4px;
- background: #1677FF;
- color: #fff;
- font-size: 13px;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.2s ease;
- outline: none;
- white-space: nowrap;
- margin-left: 8px;
-}
-
-.login-btn:hover {
- background: #0d5ed6;
-}
-
-.login-btn:active {
- background: #0c54c2;
-}