--- name: pg-tier1-admin-storefront description: 'Tier 1 Admin/Storefront 分离执行指南(PG-101~PG-111)。Dashboard、商品管理、AI 商品助手。触发词:"Admin 分离", "Tier 1", "PG-101"~"PG-111", "AI 商品".' --- # Tier 1: Admin/Storefront 分离执行指南 > **目标**:建立卖家管理后台,实现 Admin 和 Storefront 的清晰分离,引入 AI 商品创建助手。 > **触发词**:"Admin 分离"、"Tier 1"、"PG-101"~"PG-111" ## 执行前检查 1. 读取 `docs/PROFESSIONAL_GRADE_ROADMAP.md` Section 5 — Admin 架构设计 2. 读取 Section 9 → Tier 1 进度,找到第一个 ⏳ 的任务 3. 确认 Tier 0 核心任务(PG-001 ~ PG-005)已完成或不阻塞 ## AI-First 原则 Tier 1 的核心 AI 功能是 **PG-110 AI 商品创建助手**(V1 差异化)。AI 基础设施组件(`AIGenerateButton`、`AIStreamingText`、AI 后端代理)在此任务中首次建立,供后续 Tier 复用。 ## 独立站 + TG 兼容 - Admin 组件通过 `isStandalone` 环境变量兼容 SaaS 和独立站 - 卖家管理后台在桌面端优先,但基本操作(如确认订单)需移动端可用 - PG-007(OpenClaw/Agent 集成)在 V1.1 评估,视工作量可提前 ## 依赖关系 ``` PG-101 (AdminLayout) ← 多数 Tier 1 任务都依赖此项 ├── PG-102 (商品管理) ← 依赖 PG-101 ├── PG-105 (Dashboard) ← 依赖 PG-101 ├── PG-106 (订单增强) ← 依赖 PG-101 ├── PG-107 (设置迁移) ← 依赖 PG-101 └── PG-108 (Onboarding) ← 依赖 PG-101 独立任务(不依赖 PG-101,可并行或提前): PG-109 (结账优惠券) ← 依赖 Tier 0 PG-001 (Checkout) PG-110 (AI 商品创建) ← 独立,V1 核心 AI 功能,建立 AI 基础设施 PG-111 (移动端卖家) ← 依赖 PG-101 PG-007 (Agent 集成) ← V1.1,独立于 AdminLayout ``` --- ## PG-101: Admin Layout + 路由 ### 创建文件 ``` apps/web/src/ ├── components/admin/ │ ├── AdminLayout.tsx ← 侧边栏 + 内容区布局 │ ├── AdminSidebar.tsx ← 侧边栏导航 │ └── AdminHeader.tsx ← Admin 顶部栏 ├── app/admin/ │ └── page.tsx ← Dashboard 占位页(PG-105 完善) ``` ### AdminLayout 设计 ```tsx // 结构:固定侧边栏 + 滚动内容区
{children}
``` ### 侧边栏导航项 | 图标 | 标签 | 路由 | 说明 | | --------------- | --------- | ------------------ | -------- | | LayoutDashboard | Dashboard | `/admin` | 总览 | | Package | Products | `/admin/products` | 商品管理 | | ShoppingCart | Orders | `/admin/orders` | 订单管理 | | BarChart3 | Analytics | `/admin/analytics` | 数据分析 | | Settings | Settings | `/admin/settings` | 设置 | 底部: | 图标 | 标签 | 行为 | |---|---|---| | ExternalLink | View Store | 新标签页打开 `/store/{myPeerID}` | | HelpCircle | Help | 打开文档链接 | ### 路由注册 在 `apps/web/src/routes.tsx` 中添加 `/admin/*` 路由组,使用 `AdminLayout` 包装。 ### 响应式 - 桌面端(≥1024px):固定侧边栏 240px - 平板端(768-1023px):收缩侧边栏(仅图标) - 移动端(<768px):隐藏侧边栏,汉堡菜单触发 ### 认证保护 Admin 路由必须验证登录状态: - 未登录 → 跳转到 `/login` - 已登录但无卖家身份 → 显示引导页("创建你的店铺") --- ## PG-102: 商品管理页 ### 路由 `/admin/products` → 商品列表管理 ### 功能 1. **商品列表** - 表格视图(桌面)/ 卡片列表(移动) - 列:缩略图、标题、状态(活跃/草稿/下架)、价格、库存、更新时间 - 排序:标题、价格、库存、更新时间 2. **搜索和筛选** - 关键词搜索 - 状态筛选(全部/活跃/草稿) - 类型筛选(实物/数字/服务/RWA) 3. **批量操作** - 多选 checkbox - 批量删除、批量下架 4. **操作入口** - "添加商品" 按钮 → `/admin/products/new`(或复用 `/listing/new` 带 `?from=admin` 回调) - 行内 "编辑" → `/listing/edit/{slug}?from=admin` - 行内 "预览" → 新标签页 `/product/{slug}` - 行内 "复制"、"删除" ### 数据来源 复用 `productDataService.getMyListings()` 获取当前卖家商品列表。 --- ## PG-105: 卖家 Dashboard ### 路由 `/admin/` → Dashboard 总览 ### 指标卡片(第一行) | 指标 | 数据源 | 说明 | | ---------- | ------------- | ------------------ | | 总销售额 | 订单 API 聚合 | 所有已完成订单金额 | | 新订单数 | 订单 API 过滤 | 最近 7 天新订单 | | 活跃商品数 | 商品 API 计数 | 已发布商品总数 | | 平均评分 | Profile API | 店铺平均评分 | ### 最近订单列表 显示最近 5-10 条订单,包含:订单号、买家名、金额、状态、时间。 "查看全部" → `/admin/orders` ### 热门商品 显示前 5 个销量最高的商品。 "查看全部" → `/admin/products` ### 快捷操作 - 添加新商品 - 查看店铺 - 处理待办订单 --- ## PG-106: 订单管理增强 ### 在 `/admin/orders` 复用现有订单组件 - 复用 `OrderTable`(桌面)和 `OrderListCompact`(移动),但增强功能 - 默认只显示"销售"标签(卖家视角),隐藏"购买"标签 - 增加批量操作(多选 → 批量确认/批量发货) - 增加导出功能(CSV/JSON) - 增加日期范围筛选 --- ## PG-107: 现有设置页迁入 Admin 将以下页面映射到 Admin 路由: | 现有路由 | Admin 路由 | 说明 | | ---------------------------- | ---------------------------- | ------------ | | `/settings/store` | `/admin/settings` | 店铺设置主页 | | `/settings/store/policies` | `/admin/settings/policies` | 政策设置 | | `/settings/store/shipping` | `/admin/settings/shipping` | 配送设置 | | `/settings/store/moderators` | `/admin/settings/moderators` | 仲裁人设置 | | `/settings/page-profile` | `/admin/settings/profile` | 店铺资料 | ### 实施方式 - 创建 Admin 路由指向同一页面组件(或包装组件使用 AdminLayout) - 保留旧路由作为重定向(向后兼容) - 逐步引导用户使用 `/admin/settings/` 入口 --- ## PG-108: 卖家 Onboarding 引导 ### 问题 新卖家注册后进入 Admin,看到空白的 Dashboard,不知道下一步做什么。 ### 实施步骤 1. **Onboarding 状态管理** - 在 userStore 中跟踪 `onboardingCompleted` 状态 - 首次进入 `/admin/` 时检测是否完成 onboarding 2. **引导流程组件** — `OnboardingWizard` - Step 1: 设置店铺(名称、头像、简介)— 复用现有 Profile 编辑组件 - Step 2: 创建第一个商品 — 简化版表单(标题、图片、价格、描述) - Step 3: 预览店铺效果 — 嵌入预览 + "发布到市场"/"继续完善" 选项 - 进度指示器(1/3、2/3、3/3) - "跳过"选项(不强制) 3. **Dashboard 空状态集成** - 未完成 onboarding 时显示引导入口 - 完成后显示"下一步建议"卡片(邀请买家、SEO 优化、促销活动) ### 关键文件 | 文件 | 修改内容 | | ---------------------------------------------------- | ---------------------------- | | `apps/web/src/components/admin/OnboardingWizard.tsx` | 新建 | | `apps/web/src/app/admin/page.tsx` | 根据 onboarding 状态条件渲染 | | `packages/core/stores/userStore.ts` | 新增 onboarding 状态 | --- ## PG-109: 结账优惠券 ### 问题 卖家可以在商品编辑页创建优惠券(`CouponEditor`),但买家在结账时无法输入优惠码。 > 从 Tier 2 移到 Tier 1:创建端已有,应用端缺失导致整个优惠券功能闭环断裂。 ### Desktop 参考 ``` Purchase.vue 中的 Coupons 组件: - 输入框 + "Apply" 按钮 - 显示在 hasCoupons(listing) 为 true 时 - 成功后显示折扣金额 ``` ### 实施步骤 1. **CouponInput 组件** — 输入框 + "Apply" 按钮 2. 在 checkout 页面集成(订单摘要区域) 3. 调用 API 验证优惠码 → 显示折扣金额 4. 提交订单时传入 coupon codes 5. 错误处理(无效码、过期、不适用) --- ## PG-110: AI 商品创建助手 ### 目标 让卖家用最少输入创建高质量的商品页面。这是 Mobazha 的**核心 AI 差异化功能**。 ### 用户场景 ``` 场景 A:图片驱动 卖家上传 3 张商品图片 → AI 自动识别商品类型 → 生成标题、描述、标签、分类建议 → 卖家微调后发布 场景 B:文字驱动 卖家输入简短描述("手工皮革钱包,意大利植鞣革") → AI 扩写为完整的商品描述(卖点、材质、尺寸建议) → 生成 SEO 优化的标题和标签 场景 C:混合 卖家上传图片 + 输入关键词 → AI 综合生成所有字段 ``` ### 实施步骤 1. **AI 基础设施**(首次建立,后续 Tier 复用) - `packages/core/services/ai/client.ts` — AI 服务客户端(多供应商抽象) - `packages/core/services/ai/streaming.ts` — SSE 流式输出处理 - 后端 AI 代理端点(hosting 或独立 AI 微服务) 2. **AIGenerateButton 组件** - 通用"AI 生成"按钮(✨ 图标 + "AI 生成"文字) - 点击后显示加载动画 → 流式输出结果到目标字段 - 可用于标题、描述、标签等任何文本字段旁 3. **商品创建页集成** - 标题字段旁:`AIGenerateButton` → 从图片/描述生成标题 - 描述字段旁:`AIGenerateButton` → 从标题/图片生成详细描述 - 标签字段:AI 自动建议(从描述提取) - 分类字段:AI 自动建议(从标题/描述推断) - 全部字段保持可编辑,AI 只是建议 4. **图片分析**(如 AI 供应商支持 Vision) - 上传首张图片后 → 调用 Vision API → 返回商品识别结果 - 结果用于自动填充标题/描述草稿 5. **Fallback** - AI 不可用时 `AIGenerateButton` 显示 disabled 状态 + tooltip - 手动输入流程不受影响 ### 关键文件 | 文件 | 修改内容 | | ------------------------------------------------- | ------------------ | | `packages/core/services/ai/client.ts` | 新建 AI 服务客户端 | | `packages/core/services/ai/streaming.ts` | 新建流式处理 | | `apps/web/src/components/ai/AIGenerateButton.tsx` | 新建通用 AI 按钮 | | `apps/web/src/components/ai/AIStreamingText.tsx` | 新建流式文字 | | `apps/web/src/app/listing/new/page.tsx` | 集成 AI 生成 | | `apps/web/src/app/listing/edit/[slug]/page.tsx` | 集成 AI 生成 | --- ## PG-111: 移动端卖家体验 ### 问题 卖家在手机上管理店铺体验差: - 商品创建长表单无移动端导航 - Admin 布局未针对移动端优化 - 无法直接用手机拍照上传商品图片 ### 实施步骤 1. **商品创建移动端 Tab 导航** - 将左侧栏导航改为移动端 Tab Bar / Stepper - 各 Section 可滑动切换或点击跳转 - 进度指示(1/5、2/5...) 2. **Admin Layout 移动端适配** - 侧边栏 → 底部 Tab 或汉堡菜单 - Dashboard 卡片单列堆叠 - 表格 → 卡片列表视图切换 - 快捷操作浮动按钮(FAB) 3. **手机拍照上传** - 图片上传按钮增加"拍照"选项(`capture="environment"`) - 拍照后自动压缩到合适尺寸 - 结合 PG-110:拍照→AI 自动识别→生成描述 --- ## 完成后更新 1. 更新 `docs/PROFESSIONAL_GRADE_ROADMAP.md` Section 9 — 状态改 ✅ + 日期 2. 更新 `docs/migrations/status.md` 3. 新增路由更新 `apps/web/src/routes.tsx` 4. 新增 i18n key 更新 `packages/core/i18n/locales/en.ts`(admin.nav.\* 等) 5. 运行 `pnpm validate:quick`