feat(admin): redesign GoodsView with dual-tree UX, filter bar, inline CRUD
- Two-line good nodes with country + tag chips, hover tooltip
- Resizable dual-tree with fixed-height panels (no node overlap)
- Filter bar: search, country filter, tag filter (multi-select with rename)
- Mode switch (品类/国家) pushed to right via spacer
- Inline create country/tag in edit & config modals via quick-create buttons
- Right tree node height auto-fix for locate highlight
- Filter dropdown styles in global scope for teleported popper
- Backend: multi-tag (GoodTag junction), goodImage column, origin goods tree API
- Admin response interceptor unwraps {data, success} envelope
- Simplified sidebar to single 商品管理 entry with tabs
- SyncView simplified to product sync only
This commit is contained in:
@@ -73,7 +73,8 @@ model Tag {
|
||||
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6)
|
||||
updatedAt DateTime @default(now()) @updatedAt @map("updated_at") @db.Timestamptz(6)
|
||||
|
||||
goods Good[]
|
||||
goods Good[]
|
||||
goodTags GoodTag[]
|
||||
|
||||
@@map("tags")
|
||||
}
|
||||
@@ -106,6 +107,7 @@ model Good {
|
||||
tagId BigInt? @map("tag_id")
|
||||
positionId BigInt? @map("position_id")
|
||||
goodName String @map("good_name")
|
||||
goodImage String? @map("good_image")
|
||||
goodPriority Int @default(0) @map("good_priority")
|
||||
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6)
|
||||
updatedAt DateTime @default(now()) @updatedAt @map("updated_at") @db.Timestamptz(6)
|
||||
@@ -115,6 +117,7 @@ model Good {
|
||||
category Category @relation(fields: [categoryId], references: [id], onDelete: Restrict, onUpdate: NoAction)
|
||||
tag Tag? @relation(fields: [tagId], references: [id], onDelete: SetNull, onUpdate: NoAction)
|
||||
position Position? @relation(fields: [positionId], references: [id], onDelete: SetNull, onUpdate: NoAction)
|
||||
goodTags GoodTag[]
|
||||
|
||||
@@index([originGoodId])
|
||||
@@index([countryId])
|
||||
@@ -127,6 +130,20 @@ model Good {
|
||||
@@map("goods")
|
||||
}
|
||||
|
||||
// ---------- Good-Tag Junction (M:N) ----------
|
||||
model GoodTag {
|
||||
goodId BigInt @map("good_id")
|
||||
tagId BigInt @map("tag_id")
|
||||
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6)
|
||||
|
||||
good Good @relation(fields: [goodId], references: [id], onDelete: Cascade, onUpdate: NoAction)
|
||||
tag Tag @relation(fields: [tagId], references: [id], onDelete: Cascade, onUpdate: NoAction)
|
||||
|
||||
@@id([goodId, tagId])
|
||||
@@index([tagId])
|
||||
@@map("good_tags")
|
||||
}
|
||||
|
||||
// ---------- Users (admin authentication) ----------
|
||||
model User {
|
||||
id BigInt @id @default(autoincrement())
|
||||
|
||||
Reference in New Issue
Block a user