From b7a81964c9821d38e0d4e8696090419afc05250c Mon Sep 17 00:00:00 2001 From: duanshuwen Date: Sat, 22 Aug 2026 08:26:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=B7=AF=E7=BA=BF?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E5=85=B3=E8=81=94=E7=AE=A1=E5=AE=B6=E9=A1=BE?= =?UTF-8?q?=E9=97=AE=E5=8F=8A=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 详细变更如下: - 更新 .gitignore 文件,添加 pnpm-store 忽略规则 - 新增数据库迁移脚本,为 DetailRecord 添加可空的 conciergeAdvisorId 字段用于关联管家顾问 - 完善 Admin 后台玩法详情编辑器,支持选择关联的管家顾问并校验合法性 - 公共 API 支持返回已启用的管家顾问完整数据,不在详情表中冗余存储管家资料 - 小程序端新增详情页联系管家入口、个人页最近浏览历史功能 - 更新所有相关文档与测试用例,修复下拉选择框的 z-index 样式问题 --- .gitignore | 1 + WonderQ-Admin-UI/src/api.ts | 1 + .../admin/WanfaRouteDetailFields.tsx | 33 +++++- .../src/components/admin/WanfaRouteEditor.tsx | 12 ++- .../src/components/admin/WanfaRouteRail.tsx | 11 +- WonderQ-Admin-UI/src/components/ui/select.tsx | 2 +- .../src/pages/structure/WanfaPage.tsx | 12 ++- .../versions/0023_detail_concierge_advisor.py | 22 ++++ WonderQ-Admin/app/models.py | 1 + WonderQ-Admin/app/routers/admin.py | 15 +++ WonderQ-Admin/app/routers/public.py | 7 +- WonderQ-Admin/app/schemas.py | 18 ++++ WonderQ-Admin/app/serializers.py | 3 +- WonderQ-Admin/tests/test_details.py | 101 +++++++++++++++++- WonderQ-MiniAPP/src/lib/navigation.ts | 8 ++ WonderQ-MiniAPP/src/lib/recentlyViewed.ts | 91 ++++++++++++++++ WonderQ-MiniAPP/src/lib/types.ts | 1 + WonderQ-MiniAPP/src/lib/wechat-profile.ts | 8 ++ .../concierge/components/conciergeTypes.ts | 42 ++++---- .../detail/components/DetailActionBar.vue | 8 +- .../detail/components/detailPresentation.ts | 4 + WonderQ-MiniAPP/src/pages/detail/index.vue | 37 ++++--- .../src/pages/mine/components/MineMember.vue | 60 ++++++++++- .../pages/mine/components/MineRecentViews.vue | 66 ++++++++++++ WonderQ-MiniAPP/src/pages/mine/index.vue | 47 +++++++- .../src/pages/team-buildings/detail.vue | 15 +++ .../src/pages/wild-archives/detail.vue | 15 +++ WonderQ-MiniAPP/tests/concierge-data.test.ts | 21 +++- WonderQ-MiniAPP/tests/detail-data.test.ts | 35 ++++++ WonderQ-MiniAPP/tests/recently-viewed.test.ts | 54 ++++++++++ docs/concierge-api.md | 6 ++ docs/detail-api.md | 29 +++-- docs/integration-workflow.md | 7 +- docs/public-api.md | 9 +- 34 files changed, 739 insertions(+), 63 deletions(-) create mode 100644 WonderQ-Admin/alembic/versions/0023_detail_concierge_advisor.py create mode 100644 WonderQ-MiniAPP/src/lib/recentlyViewed.ts create mode 100644 WonderQ-MiniAPP/src/pages/mine/components/MineRecentViews.vue create mode 100644 WonderQ-MiniAPP/tests/recently-viewed.test.ts diff --git a/.gitignore b/.gitignore index 3d379e0..057e908 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ node_modules/ dist/ apps/*/dist/ +.pnpm-store .env .env.local **/.venv/ diff --git a/WonderQ-Admin-UI/src/api.ts b/WonderQ-Admin-UI/src/api.ts index d8e88fc..93273e8 100644 --- a/WonderQ-Admin-UI/src/api.ts +++ b/WonderQ-Admin-UI/src/api.ts @@ -133,6 +133,7 @@ export type DetailRecord = { excluded: string[]; notes: string[]; gallery: string[]; + conciergeAdvisorId: string | null; isActive: boolean; sortOrder: number; createdAt?: string; diff --git a/WonderQ-Admin-UI/src/components/admin/WanfaRouteDetailFields.tsx b/WonderQ-Admin-UI/src/components/admin/WanfaRouteDetailFields.tsx index a947239..d311369 100644 --- a/WonderQ-Admin-UI/src/components/admin/WanfaRouteDetailFields.tsx +++ b/WonderQ-Admin-UI/src/components/admin/WanfaRouteDetailFields.tsx @@ -1,6 +1,13 @@ -import type { DetailCreate } from "@/api"; +import type { ConciergeAdvisor, DetailCreate } from "@/api"; import { ImageGalleryUploader } from "@/components/admin/ImageGalleryUploader"; import { Input } from "@/components/ui/input"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; import { Switch } from "@/components/ui/switch"; import { Textarea } from "@/components/ui/textarea"; @@ -15,9 +22,11 @@ type DetailArrayField = (typeof detailArrayFields)[number][0]; export function WanfaRouteDetailFields({ detail, + conciergeAdvisors, onChange, }: { detail: DetailCreate; + conciergeAdvisors: ConciergeAdvisor[]; onChange: (key: K, value: DetailCreate[K]) => void; }) { const updateLines = (key: DetailArrayField, value: string) => { @@ -107,6 +116,28 @@ export function WanfaRouteDetailFields({ /> ))} +
+ 联系管家 +

+ 详情页只保存顾问 ID,前台会读取管家领域的最新头像、二维码和服务详情。 +

+ +
({ excluded: [], notes: [], gallery: [], + conciergeAdvisorId: null, isActive: true, }); @@ -56,6 +57,7 @@ const detailDraft = (detail?: DetailRecord): DetailCreate => excluded: detail.excluded ?? [], notes: detail.notes ?? [], gallery: detail.gallery ?? [], + conciergeAdvisorId: detail.conciergeAdvisorId ?? null, isActive: detail.isActive, sortOrder: detail.sortOrder, } @@ -71,6 +73,7 @@ export function WanfaRouteEditor({ categoryLabel, initialRoute, initialDetail, + conciergeAdvisors, saving, onSave, onClose, @@ -79,6 +82,7 @@ export function WanfaRouteEditor({ categoryLabel: string; initialRoute?: WanfaRoute; initialDetail?: DetailRecord; + conciergeAdvisors: ConciergeAdvisor[]; saving: boolean; onSave: (input: WanfaRouteEditorValue) => void; onClose: () => void; @@ -221,7 +225,11 @@ export function WanfaRouteEditor({ group="wanfa" />
- + {error ?

{error}

: null}