feat(product-center): implement Figma-designed UI, upload module, and website tests

- Redesign website homepage & product-center per Figma (fonts, logos, hero/footer/customer cases)
- Add API upload module (multer) with static serving for uploads/public assets
- Add OriginGood.delisted flag and SDS request retry logic
- Add admin ImageUpload component and goods import/upload flows
- Add vitest suite for website components and composables (32 tests)
- Add skills, docs, plans and PRODUCT.md
This commit is contained in:
yeuimu
2026-08-20 14:32:03 +08:00
parent b5fc88f3fa
commit 79fabd85f7
107 changed files with 5364 additions and 2601 deletions
+12 -34
View File
@@ -71,11 +71,8 @@ function handleCommand(command: string) {
<!-- Sidebar -->
<el-aside :width="collapsed ? '64px' : '240px'" class="layout-aside">
<div class="brand" :class="{ collapsed }">
<div class="brand-mark">IR</div>
<div v-if="!collapsed" class="brand-text">
<div class="brand-name">Inkreach</div>
<div class="brand-tag">官网后台</div>
</div>
<img src="/logo-unified.svg" class="brand-logo" alt="InkReach" />
<span v-if="!collapsed" class="brand-text">印美达官网后台</span>
</div>
<el-menu
@@ -162,9 +159,9 @@ function handleCommand(command: string) {
.brand {
display: flex;
align-items: center;
gap: 10px;
gap: 8px;
height: 56px;
padding: 0 16px;
padding: 0 20px;
border-bottom: 1px solid #2b2b33;
background: #16161a;
overflow: hidden;
@@ -175,37 +172,18 @@ function handleCommand(command: string) {
padding: 0;
}
.brand-mark {
flex: 0 0 auto;
width: 32px;
height: 32px;
border-radius: 6px;
background: var(--brand-color);
color: #fff;
font-weight: 700;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
letter-spacing: 0.5px;
.brand-logo {
height: 24px;
width: auto;
object-fit: contain;
flex-shrink: 0;
}
.brand-text {
display: flex;
flex-direction: column;
line-height: 1.2;
white-space: nowrap;
}
.brand-name {
color: #fff;
color: #e4e4e7;
font-size: 13px;
font-weight: 600;
font-size: 15px;
}
.brand-tag {
color: #9ca3af;
font-size: 11px;
white-space: nowrap;
}
.layout-aside :deep(.el-menu) {