diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..4bd3bd8b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false diff --git a/ADMIN_DOCS_INDEX.md b/ADMIN_DOCS_INDEX.md deleted file mode 100644 index 8e89563c..00000000 --- a/ADMIN_DOCS_INDEX.md +++ /dev/null @@ -1,393 +0,0 @@ -# Admin管理系统融合方案 - 文档总索引 - -> 📚 完整分析文档导航和内容总结 - ---- - -## 📑 生成的文档清单 - -### 🎯 核心分析文档(4份) - -| 文档 | 文件名 | 内容摘要 | 推荐阅读 | -| ------------ | --------------------------------------------- | ---------------------------------------------------------------------- | --------------- | -| **综合分析** | `ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md` | 📊 四端功能分析、60+功能融合方案、15个新角色设计、权限体系、实施路线图 | ⭐⭐⭐ 必读 | -| **快速参考** | `ADMIN_INTEGRATION_QUICK_REFERENCE.md` | 🚀 一页纸快速了解、菜单对照、角色速查表、优先级排序 | ⭐⭐ 快速入门 | -| **菜单结构** | `ADMIN_MENU_STRUCTURE_COMPARISON.md` | 📋 18个菜单详细结构、5个新菜单的100+页面配置、菜单互联关系 | ⭐⭐⭐ 实施指南 | -| **实施检查** | `ADMIN_IMPLEMENTATION_CHECKLIST.md` | ✅ Phase 1-5的完整检查清单、15周甘特图、成功指标 | ⭐⭐ 项目管理 | - -**总计**: 4份文档,共约15000字,包含图表、表格、代码示例 - ---- - -## 🎯 各角色推荐阅读顺序 - -### 管理层(CEO/CTO/产品总监) - -1. 📄 [ADMIN_INTEGRATION_QUICK_REFERENCE.md](ADMIN_INTEGRATION_QUICK_REFERENCE.md) - 5分钟了解全景 -2. 📊 [ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md](ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md) 第一部分 - 理解融合价值(10分钟) -3. ✅ [ADMIN_IMPLEMENTATION_CHECKLIST.md](ADMIN_IMPLEMENTATION_CHECKLIST.md) - 了解实施成本(5分钟) - -**总计**: 20分钟掌握全局 - -### 产品经理 - -1. 📋 [ADMIN_MENU_STRUCTURE_COMPARISON.md](ADMIN_MENU_STRUCTURE_COMPARISON.md) - 理解菜单结构 -2. 📊 [ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md](ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md) - 完整功能需求 -3. 📄 [ADMIN_INTEGRATION_QUICK_REFERENCE.md](ADMIN_INTEGRATION_QUICK_REFERENCE.md) - 15个角色和权限 - -**总计**: 1小时深入理解 - -### 技术主管 / 架构师 - -1. 📊 [ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md](ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md) 第四、六部分 - 前端架构、数据权限设计 -2. 📋 [ADMIN_MENU_STRUCTURE_COMPARISON.md](ADMIN_MENU_STRUCTURE_COMPARISON.md) - 理解菜单和页面结构 -3. ✅ [ADMIN_IMPLEMENTATION_CHECKLIST.md](ADMIN_IMPLEMENTATION_CHECKLIST.md) - 技术实施清单 -4. 📄 [ADMIN_INTEGRATION_QUICK_REFERENCE.md](ADMIN_INTEGRATION_QUICK_REFERENCE.md) - 快速参考 - -**总计**: 2小时完全掌握技术方案 - -### 前端开发 - -1. 📊 [ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md](ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md) 第四部分 - 前端实现架构 -2. 📋 [ADMIN_MENU_STRUCTURE_COMPARISON.md](ADMIN_MENU_STRUCTURE_COMPARISON.md) - 页面结构和布局 -3. ✅ [ADMIN_IMPLEMENTATION_CHECKLIST.md](ADMIN_IMPLEMENTATION_CHECKLIST.md) Phase 1-2 - 权限库和菜单 - -**总计**: 1.5小时技术方案理解 + 开始编码 - -### 后端开发 - -1. 📊 [ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md](ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md) 第六部分 - 数据权限设计 -2. 📋 [ADMIN_MENU_STRUCTURE_COMPARISON.md](ADMIN_MENU_STRUCTURE_COMPARISON.md) - 理解功能端点 -3. ✅ [ADMIN_IMPLEMENTATION_CHECKLIST.md](ADMIN_IMPLEMENTATION_CHECKLIST.md) Phase 1 - 数据库和API开发 - -**总计**: 1.5小时技术方案 + 开始编码 - -### 业务运营 - -1. 📄 [ADMIN_INTEGRATION_QUICK_REFERENCE.md](ADMIN_INTEGRATION_QUICK_REFERENCE.md) - 快速了解 -2. 📋 [ADMIN_MENU_STRUCTURE_COMPARISON.md](ADMIN_MENU_STRUCTURE_COMPARISON.md) 新增菜单部分 - 了解你的工作菜单 -3. 📊 [ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md](ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md) 第三部分 - 了解你的角色和权限 - -**总计**: 30分钟了解新系统 - ---- - -## 📊 文档内容详细索引 - -### ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md - -**第一部分:四端功能现状分析** (第1-65页) - -- Analytics数据分析端分析 ✅ - - 当前功能和可融合管理功能表 -- Consumer消费者端分析 ✅ - - 订单风险、退款审核、用户行为等12条管理功能 -- Delivery配送端分析 ✅ - - 配送员管理、绩效考核、费用结算等12条管理功能 -- Merchant商户端分析 ✅ - - 商户审核、佣金管理、经营分析等11条管理功能 - -**第二部分:功能融合方案** (第66-140页) - -- 融合核心原则 -- 18个菜单调整方案 -- 5个新增菜单详细功能清单 - - 数据分析菜单(12页) - - 配送管理菜单(25页) - - 商户管理菜单(22页) - - 行为分析菜单(17页) - - 审核管理菜单(16页) - -**第三部分:权限和角色体系设计** (第141-200页) - -- 当前7个角色简述 -- 推荐新增15个角色的详细权限定义 - - 管理层(3个) - - 运营经理(6个) - - 执行专员(4个) - - 专项角色(2个) -- 权限矩阵总览表(18 × 15) -- 多商户数据隔离设计 -- 地区级权限设计 -- 时间范围权限设计 - -**第四部分:前端实现架构** (第201-250页) - -- 首页看板动态适配 -- 侧边栏菜单权限隐藏 -- 页面级权限验证 -- 数据权限隔离 -- 左侧菜单 + 主内容区布局 -- 响应式设计方案 -- 代码示例 - -**第五部分:实施路线图** (第251-280页) - -- Phase 1-5详细时间表 -- 每个阶段的具体任务 -- 周期:15周 - -**第六部分:附录** (第281-300页) - -- 检查清单 -- 权限设计检查 -- 功能完整性检查 -- 测试场景 - ---- - -### ADMIN_INTEGRATION_QUICK_REFERENCE.md - -**融合概览** ✅ - -- 四端融合表 -- 新增菜单统计 - -**15个角色体系一览** ✅ - -- 简明版本的角色定义 -- 每个角色职责一句话总结 - -**5个新菜单详解** ✅ - -- 每个菜单的分组、页面数、关键特性、适用人员 - -**按功能模块看权限** ✅ - -- 快速查找"谁能做什么" - -**实施优先级** ✅ - -- 三个优先级的任务清单 - -**关键权限规则** ✅ - -- 数据隔离、操作限制、审计记录、权限检查 - -**页面展示差异示例** ✅ - -- 各角色看到的首页不同 - -**成功指标** ✅ - -- 5个关键指标 - -**常见问题FAQ** ✅ - -- 4个常见问题 - ---- - -### ADMIN_MENU_STRUCTURE_COMPARISON.md - -**菜单进化图** ✅ - -- 融合前13菜单全树形展示 -- 融合后18菜单全树形展示 -- 标注新增菜单 - -**5个新菜单详细结构** ✅ - -- 📈 数据分析菜单完整树形结构(4层,20+页面) -- 🚚 配送管理菜单完整树形结构(6层,25页面) -- 🏪 商户管理菜单完整树形结构(5层,22页面) -- 📊 行为分析菜单完整树形结构(3层,17页面) -- ⚖️ 审核管理菜单完整树形结构(4层,16页面) - -**菜单统计对比** ✅ - -- 一级菜单、管理页面、管理角色、权限维度对比 - -**菜单的互联关系** ✅ - -- 菜单间的数据流和操作流关系 - ---- - -### ADMIN_IMPLEMENTATION_CHECKLIST.md - -**Phase 0:方案评审** ✅ - -- 方案理解、需求确认、资源规划 - -**Phase 1:技术基础建设** ✅ - -- 数据库设计、后端API开发、前端权限库、测试编写 - -**Phase 2:菜单和首页重构** ✅ - -- 菜单树数据结构、侧边栏组件、首页看板、页面权限守卫 - -**Phase 3:新增菜单实现** ✅ - -- 数据分析(第4-5周) -- 配送管理(第6-8周) -- 商户管理(第9-10周) -- 行为分析(第11周) -- 审核管理(第12周) -- 详细检查项和交付成果 - -**Phase 4:验收和优化** ✅ - -- UAT、培训、性能优化、安全审计、上线准备 - -**Phase 5:上线和运维** ✅ - -- 灰度发布、线上监控、Bug修复、持续优化 - -**甘特图** ✅ - -- 15周项目时间表 - -**成功指标和验收标准** ✅ - -- 功能、性能、安全、业务4个维度 - ---- - -## 🔍 关键数据速查 - -### 菜单数量 - -- 融合前:13个一级菜单,100+页面 -- 融合后:18个一级菜单,160+页面 -- 新增:5个一级菜单,60+页面 - -### 角色数量 - -- 当前:7个角色 -- 推荐:15个角色 -- 新增:8个角色 - -### 功能融合 - -- Analytics贡献:8条管理功能 -- Consumer贡献:12条管理功能 -- Delivery贡献:12条管理功能 -- Merchant贡献:11条管理功能 -- **合计**:60+条管理功能融合 - -### 实施周期 - -- Phase 1(基础):2周 -- Phase 2(菜单):1周 -- Phase 3(新菜单):8周 -- Phase 4(验收):2周 -- Phase 5(上线):2周 -- **总计**:15周(3个半月) - -### 权限矩阵 - -- 18个菜单 × 15个角色 -- 共270个权限点(18×15) - ---- - -## 💡 核心概念速查 - -### 15个新角色的分类 - -| 分类 | 角色数 | 代表 | -| -------- | ------ | ------------------------------------------ | -| 管理层 | 3个 | 超级管理员、总经理、副总 | -| 运营经理 | 6个 | 用户、商品、订单、营销、配送、商户运营经理 | -| 执行专员 | 4个 | 客服、财务、数据分析、审核专员 | -| 专项角色 | 2个 | 内容编辑、系统维护员 | - -### 5个新菜单的定位 - -| 菜单 | 定位 | 适用场景 | -| -------- | ---------------------------------- | ----------------- | -| 数据分析 | 统一的数据看板和报表管理 | 所有场景 | -| 配送管理 | 配送员、任务、绩效的完整管理 | O2O或自建配送 | -| 商户管理 | 商户入驻、费用、经营的完整管理 | 平台模式(B2B2C) | -| 行为分析 | 用户行为、订单风险、退款的智能识别 | 所有场景 | -| 审核管理 | 统一的多维度审核和风控中心 | 所有场景 | - -### 权限三层隔离 - -| 层级 | 说明 | 例子 | -| ------ | -------------------- | ---------------------------- | -| 菜单级 | 用户能否看到某个菜单 | 商户运营看不到财务菜单 | -| 页面级 | 用户能否访问某个页面 | 财务专员只能访问提现审核页 | -| 数据级 | 用户能否看到某些数据 | 商户运营只能看自己商户的数据 | - ---- - -## ⚡ 快速决策表 - -### "我应该选择这个方案吗?" - -| 考虑因素 | 答案 | 说明 | -| ---------------------------- | --------------- | ------------------------- | -| 需要统一的运营管理后台? | ✅ 是 | 这是核心价值 | -| 有10+ 管理人员需要不同权限? | ✅ 是 | 15角色体系很合适 | -| 当前管理功能散布在多个端? | ✅ 是 | 融合是最好解决方案 | -| 有自建配送或平台商户? | ⚠️ 部分 | 配送/商户管理菜单可选 | -| 需要高级的数据权限控制? | ✅ 是 | 我们有详细的数据隔离方案 | -| 团队有15周完整开发周期? | ✅ 是 | 保证最好的质量 | -| **建议**: | ✅ **采纳方案** | 1周评审 + 15周实施 = 16周 | - ---- - -## 📞 文档更新日志 - -| 日期 | 版本 | 更新内容 | -| ---------- | ---- | ------------------------- | -| 2026-02-04 | v1.0 | 初版发布,包含4份核心文档 | - ---- - -## 🎬 下一步行动 - -### 立即行动(24小时) - -1. [ ] 项目负责人阅读 [QUICK_REFERENCE.md](ADMIN_INTEGRATION_QUICK_REFERENCE.md) -2. [ ] 组织管理层评审会(30分钟演讲) -3. [ ] 决策是否采纳方案 - -### 1周内 - -1. [ ] 详细评审方案中的每个部分 -2. [ ] 确认是否需要调整(比如菜单名称、角色定义) -3. [ ] 启动Phase 0方案评审 - -### 2周内 - -1. [ ] 组建项目团队 -2. [ ] 启动Phase 1技术基础建设 -3. [ ] 确定具体的上线时间表 - ---- - -## 🏆 预期收益 - -### 运营效率提升 - -- ✅ 所有管理功能集中在一个平台,无需在多个端之间切换 -- ✅ 统一的数据看板,实时掌握业务全景 -- ✅ 完善的权限管理,提升团队协作效率 - -### 数据和安全 - -- ✅ 强大的数据隔离机制,确保数据安全 -- ✅ 完整的审计日志,所有操作可追踪 -- ✅ 细粒度的权限控制,防止权限滥用 - -### 成本节省 - -- ✅ 减少重复开发(不用在多个端重复实现管理功能) -- ✅ 降低系统维护成本(统一平台、统一权限、统一审计) -- ✅ 加快新功能上线速度(已有的权限框架复用) - -### 用户体验 - -- ✅ 所有人都能看到适合自己角色的功能和数据 -- ✅ 统一的UI/UX设计,学习成本低 -- ✅ 响应式设计,支持桌面和平板访问 - ---- - -**文档完成日期**: 2026年2月4日 -**文档维护者**: AI助手 -**文档状态**: ✅ 可用于评审和实施 diff --git a/ADMIN_IMPLEMENTATION_CHECKLIST.md b/ADMIN_IMPLEMENTATION_CHECKLIST.md deleted file mode 100644 index 8848c284..00000000 --- a/ADMIN_IMPLEMENTATION_CHECKLIST.md +++ /dev/null @@ -1,739 +0,0 @@ -# Admin管理系统融合方案 - 实施检查清单 - -> 📋 从0到1实施admin端融合方案的完整检查清单 - ---- - -## Phase 0: 方案评审(第0-1周) - -### 方案理解 - -- [ ] 管理层理解融合方案的目标和收益 -- [ ] 理解新增5个菜单的功能和必要性 -- [ ] 确认15个新角色是否满足公司组织结构 -- [ ] 确认是否需要删除或合并某些菜单 -- [ ] 确认优先级排序(哪些菜单先做) - -### 需求确认 - -- [ ] 确认是否支持多商户模式(若不支持,商户管理菜单不必做) -- [ ] 确认是否有自建配送(若不支持,配送管理菜单不必做) -- [ ] 确认是否需要用户行为追踪(资源密集) -- [ ] 确认是否需要智能风控(需要ML团队支持) -- [ ] 确认权限细度是否需要到按钮级 - -### 资源规划 - -- [ ] 确认开发团队规模和技能 -- [ ] 规划测试团队资源 -- [ ] 规划UAT参与者(业务人员) -- [ ] 规划项目经理和设计师 -- [ ] 规划后续维护团队 - ---- - -## Phase 1: 技术基础建设(第1-2周) - -### 数据库设计 - -- [ ] 设计 `roles` 表结构(id、name、description、status) -- [ ] 设计 `permissions` 表结构(id、code、name、resource、action) -- [ ] 设计 `role_permissions` 表结构(role_id、permission_id) -- [ ] 设计 `user_roles` 表结构(user_id、role_id、start_date、end_date) -- [ ] 设计 `permission_audit_log` 表(谁在何时修改了什么权限) -- [ ] 设计 `operation_audit_log` 表(所有操作记录) -- [ ] 添加索引优化查询 -- [ ] 创建RLS策略保证数据隔离 - -### 后端API开发 - -- [ ] 开发 `/api/auth/user-roles` - 获取当前用户的所有角色 -- [ ] 开发 `/api/auth/permissions` - 获取当前用户的所有权限 -- [ ] 开发 `/api/roles` - CRUD角色 -- [ ] 开发 `/api/permissions` - CRUD权限 -- [ ] 开发 `/api/role-permissions` - 角色权限分配 -- [ ] 开发 `/api/user-audit-log` - 用户操作审计日志查询 -- [ ] 开发权限验证中间件 -- [ ] 开发数据权限过滤中间件 - -### 前端权限库开发 - -- [ ] 创建 `usePermission()` hook -- [ ] 创建 `hasPermission(code)` 函数 -- [ ] 创建 `hasRole(roleId)` 函数 -- [ ] 创建菜单过滤函数 -- [ ] 创建按钮权限隐藏指令 `v-permission` -- [ ] 创建权限检查中间件(路由守卫) - -### 测试编写 - -- [ ] 编写权限查询单元测试 -- [ ] 编写数据隔离测试(A用户不能看B用户数据) -- [ ] 编写权限提升防护测试 -- [ ] 编写API权限验证测试 - -**交付成果**: 基础权限框架就位,所有API都有权限验证 - ---- - -## Phase 2: 菜单和首页重构(第2-3周) - -### 菜单树数据结构 - -- [ ] 定义菜单树TypeScript类型 -- [ ] 创建菜单树配置文件(JSON) -- [ ] 为每个菜单项添加 `requiredRoles` 和 `requiredPermissions` 字段 -- [ ] 实现菜单权限过滤函数 - -### 侧边栏组件重构 - -- [ ] 重构 `Sidebar` 组件支持动态菜单 -- [ ] 实现菜单展开/折叠 -- [ ] 实现菜单搜索 -- [ ] 实现菜单高亮当前页面 -- [ ] 添加菜单权限不足时的提示 - -### 首页看板动态化 - -- [ ] 创建 `DashboardConfig` 数据结构(看板配置) -- [ ] 实现看板选择器(用户选择要看哪些KPI) -- [ ] 实现7个角色特定的看板模板 - - [ ] 超级管理员看板 - - [ ] 总经理看板 - - [ ] 用户运营看板 - - [ ] 商品运营看板 - - [ ] 订单管理看板 - - [ ] 营销运营看板 - - [ ] 数据分析师看板 -- [ ] 实现看板主题切换 -- [ ] 实现看板配置保存/加载 - -### 页面级权限守卫 - -- [ ] 为每个现有页面添加权限验证 -- [ ] 无权限时重定向到首页+提示 -- [ ] 添加权限变化时的动态更新 - -**交付成果**: 用户登录后看到的菜单和首页完全根据角色定制化 - ---- - -## Phase 3: 新增菜单实现(第4-12周) - -### 14. 数据分析菜单(第4-5周) - -#### 看板管理子菜单 - -- [ ] 看板配置页面 - - [ ] 看板列表(查看、编辑、删除、新建) - - [ ] 看板编辑界面(拖拽配置) - - [ ] KPI指标选择器(30+个指标) - - [ ] 图表类型选择器 - - [ ] 预览功能 -- [ ] 看板样式页面 - - [ ] 颜色方案选择 - - [ ] 布局选择 - - [ ] 字体大小调整 -- [ ] 看板权限页面 - - [ ] 选择哪些角色可见 - - [ ] 选择哪些用户可见 - - [ ] 权限历史查看 - -#### 报表管理子菜单 - -- [ ] 报表模板库 - - [ ] 预设模板列表 - - [ ] 模板详情查看 - - [ ] 一键应用模板 - - [ ] 自定义模板保存 -- [ ] 定时报表 - - [ ] 创建定时报表向导 - - [ ] 报表参数配置 - - [ ] 发送时间设置(日/周/月) - - [ ] 接收人列表 - - [ ] 发送历史 -- [ ] 报表审计 - - [ ] 谁查看了哪些报表 - - [ ] 何时导出了什么数据 - - [ ] 筛选和搜索 - - [ ] 下载审计日志 -- [ ] 数据权限 - - [ ] 按角色配置数据可见范围 - - [ ] 按地区/商户配置 - - [ ] 权限生效测试 - -#### 异常告警子菜单 - -- [ ] 告警规则配置 - - [ ] 选择告警类型(KPI、库存、用户、成本) - - [ ] 设置阈值和触发条件 - - [ ] 配置生效时间 - - [ ] 规则列表管理 -- [ ] 告警频道配置 - - [ ] 启用/禁用各种通知渠道 - - [ ] 配置收件人 - - [ ] 配置通知模板 -- [ ] 告警历史 - - [ ] 告警日志查看 - - [ ] 标记已处理 - - [ ] 处理统计 - -#### 对标管理子菜单 - -- [ ] 目标设置 - - [ ] 设置月度目标(销售、利润、新客等) - - [ ] 部门目标分配 - - [ ] 目标历史查看 -- [ ] 对标查询 - - [ ] 选择对标对象(去年同期、上月、行业均值) - - [ ] 显示对比图表 - - [ ] 导出对标数据 -- [ ] 达成分析 - - [ ] 完成度进度条 - - [ ] 驱动因素分析 - - [ ] 月度复盘报告 - -#### 数据库和RPC - -- [ ] 创建 analytics_dashboards 表 -- [ ] 创建 analytics_reports 表 -- [ ] 创建 analytics_alerts 表 -- [ ] 创建 analytics_audit_log 表 -- [ ] 实现 RPC:get_dashboard_data -- [ ] 实现 RPC:get_report_data -- [ ] 实现 RPC:check_alert_conditions - -#### 测试 - -- [ ] 测试权限验证(只有指定角色能编辑) -- [ ] 测试报表生成和发送 -- [ ] 测试告警触发和通知 -- [ ] 性能测试(大数据量报表查询) - -**第4-5周交付成果**: 完整的数据分析菜单就位 - ---- - -### 15. 配送管理菜单(第6-8周)(仅O2O模式) - -#### 配送统计子菜单 - -- [ ] 今日数据看板 - - [ ] 待接单数、配送中数、已完成数 - - [ ] 总收入、平均送达时间 - - [ ] 实时更新 -- [ ] 配送员排行 - - [ ] 今日/周/月排行 - - [ ] 按收入、订单数、评分排行 - - [ ] 导出排行榜 -- [ ] 路线分析 - - [ ] 配送费用效率(总费用/订单数) - - [ ] 完成率分析 - - [ ] 里程成本 - - [ ] 最优路线建议 - -#### 配送员管理子菜单 - -- [ ] 配送员列表 - - [ ] 表格展示(姓名、评分、车辆、服务区) - - [ ] 编辑配送员信息 - - [ ] 启用/禁用配送员 - - [ ] 批量导入/导出 - - [ ] 高级搜索和过滤 -- [ ] 配送员审核 - - [ ] 新申请列表 - - [ ] 文件上传验证 - - [ ] 批准/拒绝流程 - - [ ] 审核历史 -- [ ] 黑名单管理 - - [ ] 冻结账户 - - [ ] 记录冻结原因 - - [ ] 申诉处理 - - [ ] 黑名单解除流程 -- [ ] 配送员分级 - - [ ] 设置等级标准(销售额、评分、投诉率) - - [ ] 自动升降级 - - [ ] 手动调整 - - [ ] 等级权益配置 -- [ ] 激励管理 - - [ ] 创建激励活动 - - [ ] 配置激励规则(达成XX→获得YY) - - [ ] 激励统计 -- [ ] 申诉处理 - - [ ] 投诉列表 - - [ ] 处理工单 - - [ ] 处理结果记录 - - [ ] 投诉统计 - -#### 任务分配子菜单 - -- [ ] 自动分配规则 - - [ ] 配置算法参数(距离权重、工作量均衡系数等) - - [ ] 地理围栏配置 - - [ ] 测试规则 -- [ ] 手动分配 - - [ ] 选择订单和配送员 - - [ ] 分配备注 - - [ ] 批量分配 -- [ ] 分配记录 - - [ ] 历史查看 - - [ ] 统计分析 - -#### 绩效考核子菜单 - -- [ ] 考核指标 - - [ ] 定义指标(送达时间、评分、投诉等) - - [ ] 指标权重配置 - - [ ] 目标设置 - - [ ] 奖惩规则 -- [ ] 月度考核 - - [ ] 自动生成考核报告 - - [ ] 考核分数计算 - - [ ] 等级评定 - - [ ] 结果公示 -- [ ] 工资计算 - - [ ] 基本工资+考核+分层计价 - - [ ] 自动计算 - - [ ] 工资表导出 - -#### 费用结算子菜单 - -- [ ] 费率配置 - - [ ] 按距离/时间/订单量分层定价 - - [ ] 特殊商品加价 - - [ ] 规则管理 -- [ ] 提现管理 - - [ ] 提现申请审核 - - [ ] 转账处理 - - [ ] 到账确认 -- [ ] 结算周期 - - [ ] 配置周期(日/周/月结) - - [ ] 自动结算 -- [ ] 结算报表 - - [ ] 日/周/月结单导出 - -#### 车辆管理子菜单 - -- [ ] 车辆列表 - - [ ] 车辆信息展示和编辑 - - [ ] 关联配送员 -- [ ] 车牌审核 - - [ ] 行驶证审核 - - [ ] 保险验证 - - [ ] 年检查看 -- [ ] 轨迹追踪 - - [ ] 实时位置查看 - - [ ] 路线可视化 - - [ ] 行驶速度监控 - - [ ] 异常告警 - -#### 数据库 - -- [ ] 创建 ml_delivery_drivers 表(if not exists) -- [ ] 创建 ml_delivery_tasks 表 -- [ ] 创建 ml_delivery_performance 表 -- [ ] 创建 ml_delivery_vehicles 表 -- [ ] 创建 ml_delivery_payroll 表 - -**第6-8周交付成果**: 完整的配送管理菜单就位(仅O2O模式) - ---- - -### 16. 商户管理菜单(第9-10周)(仅平台模式) - -#### 商户统计子菜单 - -- [ ] 商户总数 - - [ ] 按等级、状态、分类统计 - - [ ] 增长曲线 -- [ ] 商户排行 - - [ ] 销售额/订单数/评分排行 - - [ ] 导出排行榜 -- [ ] 商户画像 - - [ ] 分类分布 - - [ ] 地区分布 - - [ ] 等级分布 - -#### 商户审核子菜单 - -- [ ] 入驻申请 - - [ ] 申请列表 - - [ ] 资质审核 - - [ ] 批准/驳回 - - [ ] 申请历史 -- [ ] 资质审核 - - [ ] 身份验证 - - [ ] 银行账户验证 - - [ ] 税务信息验证 -- [ ] 保证金缴纳 - - [ ] 缴纳记录 - - [ ] 缴纳确认 - - [ ] 退款处理 -- [ ] 激活管理 - - [ ] 激活前检查 - - [ ] 生成激活码 - - [ ] 激活状态变更 - -#### 商户管理子菜单 - -- [ ] 商户列表 - - [ ] 商户信息查看和编辑 - - [ ] 启用/禁用 - - [ ] 批量操作 -- [ ] 商户分级 - - [ ] 分级标准配置 - - [ ] 自动升降级 - - [ ] 手动调整 -- [ ] 店铺信息 - - [ ] 店铺名称、logo、简介编辑 - - [ ] 营业时间配置 -- [ ] 联系方式管理 - - [ ] 账号、邮箱、电话、微信管理 -- [ ] 冻结/解冻 - - [ ] 冻结操作 - - [ ] 解冻申请处理 - -#### 费用管理子菜单 - -- [ ] 保证金管理 - - [ ] 保证金标准设置 - - [ ] 缴纳记录 - - [ ] 扣罚管理 - - [ ] 退还流程 -- [ ] 佣金配置 - - [ ] 按分类/等级设定佣金率 - - [ ] 新商户优惠期配置 - - [ ] 佣金规则审批 -- [ ] 佣金扣除 - - [ ] 自动计算和扣除 - - [ ] 明细查看 - - [ ] 统计报表 -- [ ] 提现管理 - - [ ] 提现申请审核 - - [ ] 转账处理 - - [ ] 提现统计 -- [ ] 罚款管理 - - [ ] 罚款原因配置 - - [ ] 罚款处理 - - [ ] 申诉处理 -- [ ] 结算报表 - - [ ] 日/周/月结单导出 - - [ ] 商户个人报表 - - [ ] 分类汇总 - -#### 经营管理子菜单 - -- [ ] 商户数据 - - [ ] 销售、转化、评分数据 - - [ ] 数据对比 -- [ ] 商户违规 - - [ ] 投诉统计 - - [ ] 退货率统计 - - [ ] 风险评分 -- [ ] 营销工具权限 - - [ ] 配置可用功能 - - [ ] 功能限制配置 -- [ ] 商户沟通 - - [ ] 发送通知 - - [ ] 公告发布 -- [ ] 商户退出 - - [ ] 退出申请处理 - - [ ] 清算流程 - -**第9-10周交付成果**: 完整的商户管理菜单就位(仅平台模式) - ---- - -### 17. 行为分析菜单(第11周) - -#### 用户行为追踪子菜单 - -- [ ] 浏览行为 - - [ ] 页面访问统计 - - [ ] 停留时长分析 - - [ ] 路径分析 - - [ ] 热力图 - - [ ] 用户分群 -- [ ] 收藏分析 - - [ ] 收藏商品排行 - - [ ] 收藏转购率 - - [ ] 未购收藏提醒 -- [ ] 购物车分析 - - [ ] 放弃率分析 - - [ ] 商品热度 - - [ ] 平均金额 -- [ ] 搜索热词 - - [ ] 热词统计 - - [ ] 搜索转化率 - - [ ] 零结果搜索词 - - [ ] 搜索趋势 -- [ ] 用户路径 - - [ ] 访问路径流 - - [ ] 流失分析 - - [ ] 转化路径 - -#### 订单风险识别子菜单 - -- [ ] 异常订单检测 - - [ ] 虚假订单识别 - - [ ] 高风险用户检测 - - [ ] 大额采购预警 - - [ ] 风险评分系统 -- [ ] 黑名单管理 - - [ ] 冻结恶意用户 - - [ ] 黑名单原因记录 - - [ ] 黑名单解除申诉 -- [ ] 异常退货分析 - - [ ] 退货率过高用户识别 - - [ ] 退货模式分析 -- [ ] 恶意评价识别 - - [ ] 虚假好评检测 - - [ ] 违规评价检测 - - [ ] 处理建议 -- [ ] 风险订单处理 - - [ ] 待审核队列 - - [ ] 手动审核 - - [ ] 处理统计 - -#### 退款审核管理子菜单 - -- [ ] 待审核退款 - - [ ] 待审核列表 - - [ ] 订单信息查看 - - [ ] 用户信息查看 - - [ ] 审核决定(同意/拒绝) -- [ ] 自动退款规则 - - [ ] 快速退款条件配置 - - [ ] 规则管理 -- [ ] 退款审批流 - - [ ] 多级审批流配置 - - [ ] 金额阈值设置 -- [ ] 退款拒绝 - - [ ] 拒绝原因管理 - - [ ] 申诉处理 -- [ ] 退款统计 - - [ ] 退货率分析 - - [ ] 退款成本统计 - - [ ] 原因排行 -- [ ] 物流退货追踪 - - [ ] 退货物流信息 - - [ ] 退货签收确认 - -#### 数据库 - -- [ ] 创建 user_behavior_tracking 表 -- [ ] 创建 order_risk_assessment 表 -- [ ] 创建 refund_audit_log 表 - -**第11周交付成果**: 完整的行为分析菜单就位 - ---- - -### 18. 审核管理菜单(第12周) - -#### 财务审核子菜单 - -- [ ] 提现审核 - - [ ] 待审核列表 - - [ ] 账户验证 - - [ ] 批准/驳回 - - [ ] 转账处理 - - [ ] 到账确认 -- [ ] 发票审核 - - [ ] 待审核列表 - - [ ] 信息验证 - - [ ] 批准/驳回 -- [ ] 财务异常 - - [ ] 异常交易提醒 - - [ ] 人工审核 -- [ ] 审核历史 - - [ ] 已审核记录 - - [ ] 审计日志 - -#### 商户审核子菜单 - -- [ ] 入驻申请审核 -- [ ] 资料修改审核 -- [ ] 营销活动审核 -- [ ] 申诉审核 - -#### 用户审核子菜单 - -- [ ] 用户申诉审核 -- [ ] 发票申请审核 -- [ ] 账户异常处理 -- [ ] 账户冻结申请 - -#### 内容审核子菜单 - -- [ ] 商品评价审核 - - [ ] 待审核列表 - - [ ] 内容检查 - - [ ] 图片审核 - - [ ] 虚假评价检测 -- [ ] 用户反馈审核 - - [ ] 待审核列表 - - [ ] 反馈分配 - - [ ] 回复管理 -- [ ] 文章审核 - - [ ] 待审核列表 - - [ ] 内容检查 - - [ ] 发布/驳回 -- [ ] 评论审核 - - [ ] 待审核列表 - - [ ] 内容检查 - - [ ] 删除/隐藏 - -**第12周交付成果**: 完整的审核管理菜单就位 - ---- - -## Phase 4: 验收和优化(第13-14周) - -### UAT准备 - -- [ ] 编写UAT测试用例(每个菜单20+用例) -- [ ] 准备测试数据(模拟真实业务场景) -- [ ] 准备UAT环境(隔离于生产) - -### 业务人员培训 - -- [ ] 为各个角色制作培训手册 -- [ ] 举办培训会议(按角色分组) -- [ ] 准备常见问题FAQ -- [ ] 建立问题反馈渠道 - -### 性能优化 - -- [ ] 数据库查询优化(加索引、优化WHERE条件) -- [ ] 大列表分页加载 -- [ ] 报表缓存策略 -- [ ] 前端懒加载和虚拟滚动 - -### 安全审计 - -- [ ] 权限漏洞检查(越权测试) -- [ ] SQL注入测试 -- [ ] XSS漏洞检查 -- [ ] CSRF保护验证 -- [ ] 数据加密验证 - -### 灾备和回滚 - -- [ ] 准备回滚脚本 -- [ ] 准备数据备份 -- [ ] 制定应急预案 - -### 上线准备 - -- [ ] 制定上线计划和时间表 -- [ ] 准备灰度方案(先给10%用户) -- [ ] 准备监控告警配置 -- [ ] 准备上线后的值班安排 - -**第13-14周交付成果**: 完成所有测试、优化和上线准备 - ---- - -## Phase 5: 上线和运维(第15周+) - -### 灰度发布 - -- [ ] 第一批:超级管理员和技术团队 -- [ ] 第二批:各部门经理(用户运营、商品、订单等) -- [ ] 第三批:执行专员和普通员工 - -### 线上监控 - -- [ ] 监控登录成功率 -- [ ] 监控菜单加载时间 -- [ ] 监控错误日志 -- [ ] 监控权限验证失败率 -- [ ] 监控审计日志生成 - -### Bug修复 - -- [ ] 建立Bug反馈机制 -- [ ] 制定修复优先级 -- [ ] 快速补丁发布 - -### 持续优化 - -- [ ] 收集用户反馈 -- [ ] 分析用户使用习惯 -- [ ] 优化UI/UX -- [ ] 增加新的小功能 - ---- - -## 🎯 总体甘特图 - -``` -Phase 1 [========] 数据库和权限框架 -Phase 2 [======] 菜单和首页重构 -Phase 3 [=================] 新菜单实现 - ├─ 数据分析 [====] - ├─ 配送管理 [======] - ├─ 商户管理 [====] - ├─ 行为分析 [==] - └─ 审核管理 [=] -Phase 4 [====] 测试和优化 -Phase 5 [=====] 上线运维 - -周期:15周 -``` - ---- - -## ✅ 成功指标和验收标准 - -### 功能完整性 - -- ✅ 所有15个角色都能正常使用系统 -- ✅ 每个菜单的所有页面都能正常访问 -- ✅ 每个权限都能正确验证 - -### 性能指标 - -- ✅ 页面加载时间 < 2秒(90分位) -- ✅ 列表页翻页时间 < 1秒 -- ✅ 报表生成时间 < 5秒 -- ✅ 并发用户支持 > 100人 - -### 安全指标 - -- ✅ 权限漏洞 = 0个 -- ✅ 权限验证覆盖率 = 100% -- ✅ 数据隔离测试通过率 = 100% -- ✅ 审计日志完整率 = 100% - -### 业务指标 - -- ✅ 用户培训完成率 > 90% -- ✅ UAT测试通过率 > 95% -- ✅ 上线第一周Bug数 < 10个 -- [ ] 用户满意度 > 4/5 - ---- - -## 📞 关键联系人 - -| 角色 | 姓名 | 联系方式 | -| ------------ | ---- | -------- | -| 项目经理 | - | - | -| 产品经理 | - | - | -| 技术主管 | - | - | -| 数据库管理员 | - | - | -| 前端负责人 | - | - | -| 后端负责人 | - | - | -| QA负责人 | - | - | - ---- - -**记录**: 此检查清单需要定期更新,每周review一次进度 - -**相关文档**: - -- [ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md](ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md) - 完整分析 -- [ADMIN_INTEGRATION_QUICK_REFERENCE.md](ADMIN_INTEGRATION_QUICK_REFERENCE.md) - 快速参考 -- [ADMIN_MENU_STRUCTURE_COMPARISON.md](ADMIN_MENU_STRUCTURE_COMPARISON.md) - 菜单结构对照 diff --git a/ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md b/ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md deleted file mode 100644 index 4b6b5cbe..00000000 --- a/ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md +++ /dev/null @@ -1,981 +0,0 @@ -# Admin管理系统 - 四端功能融合与权限体系设计 - -**文档时间**: 2026年2月4日 -**目的**: 分析analytics、consumer、delivery、merchant四个端的管理相关功能,设计融合进admin端后的权限和角色体系 - ---- - -## 🎯 文档摘要 - -本文档分析了mall项目四个业务端的功能,识别出**60+**条可融合进admin管理端的功能,设计了**15个**新的管理角色和相应的权限体系。通过权限细分,实现对不同管理人员的差异化权限控制,提升平台运营效率。 - ---- - -## 📊 第一部分:四端功能现状分析 - -### 1. Analytics数据分析端 - -**当前功能**: - -- ✅ 销售报表分析(销售趋势、GMV统计) -- ✅ 用户分析(增长、活跃、留存、消费分布) -- ✅ 商品洞察(销售排行、分类分析、库存分析) -- ✅ 市场趋势(市场整体趋势、季节性分析) -- ✅ 优惠券效果分析(发放、使用、转化、ROI) -- ✅ 自定义报表(报表构建、多维度分析、导出) -- ✅ 数据钻取与对比功能 -- ✅ 实时KPI看板 -- ✅ 数据导出(Excel、PDF) - -**可融合到admin的管理功能**: -| 功能 | 级别 | 描述 | -|------|------|------| -| **数据看板管理** | 核心 | 后台运营人员可配置首页看板展示哪些KPI指标 | -| **报表模板库** | 核心 | 管理员创建/管理/分享报表模板 | -| **定时报表** | 核心 | 创建每日/周/月定时生成的报表,自动发送给指定人员 | -| **数据权限管理** | 高 | 按角色配置数据可见范围(如只看自己部门的销售数据) | -| **导出配置** | 中 | 配置允许导出的数据类型、格式、频率限制 | -| **异常告警配置** | 高 | 当KPI下跌超过阈值时自动告警到相关人员 | -| **对标管理** | 中 | 设置目标KPI、行业对标、监控达成情况 | -| **报表审计日志** | 中 | 记录谁查看了哪些报表、何时查看、导出了什么数据 | - ---- - -### 2. Consumer消费者端 - -**当前功能**: - -- ✅ 订单管理(查看订单、支付、收货、评价) -- ✅ 购物车管理(加购、修改数量、清空) -- ✅ 收藏管理(收藏/取消收藏商品) -- ✅ 收货地址管理(新增、编辑、删除、设置默认) -- ✅ 支付流程(微信/支付宝/余额支付) -- ✅ 售后退款(申请退货、填写退款原因、上传凭证) -- ✅ 物流跟踪(实时查看物流信息) -- ✅ 优惠券领取(查看、领取、使用优惠券) -- ✅ 钱包管理(查看余额、充值、提现) -- ✅ 消息中心(订单提醒、营销消息、系统消息) -- ✅ 评价管理(商品评价、卖家回复) -- ✅ 订阅服务(订阅计划、续费管理) - -**可融合到admin的管理功能**: -| 功能 | 级别 | 描述 | -|------|------|------| -| **用户行为分析** | 高 | 分析用户的收藏、购物车、浏览等行为,优化商品推荐 | -| **订单风险评估** | 高 | 识别异常订单(虚假订单、大额采购、恶意退货)进行人工审核 | -| **退款审核管理** | 核心 | 审核和处理用户的退款申请,配置自动退款规则 | -| **支付方式配置** | 中 | 启用/禁用支付方式、配置支付费率、限额 | -| **物流对接管理** | 核心 | 管理物流公司接口、面单模板、轨迹查询配置 | -| **地址库维护** | 低 | 维护国家、省市区三级地址数据库 | -| **钱包资金监管** | 核心 | 审计用户充值、提现、转账等资金流转 | -| **消息模板管理** | 中 | 配置订单提醒、营销消息、系统通知的模板和发送规则 | -| **优惠券发放策略** | 高 | 定向发放优惠券给特定用户群体(如新客、沉睡用户) | -| **用户黑名单管理** | 中 | 识别和冻结恶意用户账户,防止刷单和欺诈 | -| **订阅管理** | 中 | 审核和管理用户订阅计划、续费规则、自动续费 | -| **发票管理** | 中 | 用户申请发票,后台审核和邮寄管理 | - ---- - -### 3. Delivery配送端 - -**当前功能**: - -- ✅ 配送员工作台(工作状态切换、今日数据、当前任务) -- ✅ 配送任务管理(待接单、配送中、已完成) -- ✅ 订单详情查看(取货地址、送达地址、联系方式) -- ✅ 物流操作(开始取货、确认取货、开始配送、确认送达) -- ✅ 收益统计(今日收益、历史收益、提现) -- ✅ 配送员评价(用户评分、评价内容) -- ✅ 车辆管理(添加车辆、编辑车辆信息) -- ✅ 个人资料管理(头像、姓名、身份证、驾驶证) -- ✅ 离线模式支持 - -**可融合到admin的管理功能**: -| 功能 | 级别 | 描述 | -|------|------|------| -| **配送员管理** | 核心 | 配送员账号管理、等级设置、激励管理、状态监控 | -| **配送任务分配** | 核心 | 自动/手动分配订单给配送员,优化配送效率和成本 | -| **配送绩效考核** | 高 | 按送达时间、用户评分、投诉数等考核配送员,挂钩薪资 | -| **配送费用管理** | 核心 | 配置配送员分层计价(按距离、时间、订单量)、抽佣比例 | -| **配送员轨迹追踪** | 中 | 实时查看配送员位置、配送路线、行驶速度,防止刷单 | -| **配送员黑名单** | 中 | 冻结违规配送员、记录投诉详情、处理争议 | -| **车辆管理** | 中 | 管理配送员车辆信息、车牌、保险、年检状态 | -| **配送结算管理** | 高 | 按周/月结算配送员收入,扣除罚款、提现审核 | -| **配送团队管理** | 中 | 配置配送员所属团队、团队长、绩效汇总 | -| **异常订单处理** | 高 | 处理配送失败、拒收、用户投诉等异常情况 | -| **配送员激励** | 中 | 创建激励活动(日送单数奖励、月绩效奖等) | -| **申诉管理** | 中 | 处理用户对配送员的投诉、申诉、评分异议 | - ---- - -### 4. Merchant商户端 - -**当前功能**: - -- ✅ 商户个人资料管理(头像、昵称、简介) -- ✅ 店铺管理(店铺名称、logo、分类、营业时间) -- ✅ 商品展示(查看上架商品列表、商品详情) -- ✅ 销售数据查看(日销售额、订单数、粉丝数) - -**可融合到admin的管理功能**: -| 功能 | 级别 | 描述 | -|------|------|------| -| **多商户管理** | 核心 | 管理平台上的多个商户入驻、审核、激活 | -| **商户入驻审核** | 核心 | 审核商户资质、营业执照、法人身份、缴纳保证金 | -| **商户分级体系** | 高 | 根据销售额、评分、投诉等指标对商户分级(普通/黄金/钻石) | -| **商户保证金管理** | 核心 | 收取保证金、冻结、解冻、扣罚(质量问题赔偿) | -| **商户佣金设置** | 核心 | 按商户等级、商品分类设定不同佣金率,自动扣除 | -| **商户提现管理** | 核心 | 审核商户提现申请、结算周期配置、到账管理 | -| **商户经营数据** | 高 | 查看商户销售数据、访客、转化、库存、评分等 | -| **商户违规处理** | 高 | 记录违规投诉、处以罚款、限流、下架、封禁 | -| **商户店铺装修** | 中 | 配置商户店铺展示哪些功能(如是否支持预订、会员卡) | -| **商户营销工具** | 中 | 管理商户可使用的营销工具(优惠券、活动模板等) | -| **商户沟通** | 低 | 发送公告、通知、政策更新到所有或特定商户 | - ---- - -## 📈 第二部分:功能融合方案 - -### 融合核心原则 - -1. **管理视角优先** - 只融合需要后台管理的功能,消费者自主操作保留在consumer -2. **权限细分** - 不同角色看不同的管理界面和功能 -3. **数据隔离** - 多商户场景下确保数据权限隔离 -4. **流程闭合** - 管理功能覆盖整个业务流程的关键决策点 - -### 融合后的Admin一级菜单调整方案 - -#### 当前13个菜单 - -``` -1. 首页 (HOME) -2. 用户 (USER) -3. 商品 (PRODUCT) -4. 订单 (ORDER) -5. 营销 (MARKETING) -6. 分销 (DISTRIBUTION) -7. 客服 (KEFU) -8. 财务 (FINANCE) -9. 内容 (CMS) -10. 装修 (DECORATION) -11. 应用 (APP) -12. 设置 (SETTING) -13. 维护 (MAINTAIN) -``` - -#### 推荐融合后的18个菜单 - -``` -1. 📊 首页 (HOME) - 保持不变(各角色看不同的仪表板) -2. 👥 用户 (USER) - 扩展+数据权限配置 -3. 📦 商品 (PRODUCT) - 保持不变 -4. 📋 订单 (ORDER) - 扩展+风险评估+物流管理 -5. 🎯 营销 (MARKETING) - 保持不变 -6. 👔 分销 (DISTRIBUTION) - 保持不变 -7. 💬 客服 (KEFU) - 保持不变 -8. 💰 财务 (FINANCE) - 保持不变 -9. 📄 内容 (CMS) - 保持不变 -10. 🎨 装修 (DECORATION) - 保持不变 -11. 🔌 应用 (APP) - 保持不变 -12. ⚙️ 设置 (SETTING) - 保持不变 -13. 🛠️ 维护 (MAINTAIN) - 保持不变 -14. 📈 数据分析 (ANALYTICS) - 【新增】融合analytics端 -15. 🚚 配送管理 (DELIVERY) - 【新增】融合delivery端 -16. 🏪 商户管理 (MERCHANT) - 【新增】融合merchant端 -17. 📊 行为分析 (BEHAVIOR) - 【新增】用户行为追踪、订单风险识别 -18. ⚖️ 审核管理 (REVIEW) - 【新增】统一的审核中心(退款、商户入驻、投诉等) -``` - ---- - -### 融合功能详细清单 - -#### 14️⃣ 数据分析菜单 (ANALYTICS) - -**4个功能分组,12个管理页面**: - -``` -📊 数据分析 -├── 📈 KPI看板管理 -│ ├── 看板配置 - 选择要展示的KPI指标 -│ ├── 看板样式 - 配置图表类型、颜色、布局 -│ └── 看板权限 - 设置哪些角色可见 -├── 📋 报表管理 -│ ├── 报表模板库 - 预设/自定义报表模板 -│ ├── 定时报表 - 配置自动生成和发送报表 -│ ├── 报表审计 - 查看谁查看了哪些报表、何时导出 -│ └── 数据权限 - 按角色配置数据可见范围 -├── ⚠️ 异常告警 -│ ├── 告警规则 - KPI下跌、库存预警、销售异常 -│ ├── 告警频道 - 邮件、短信、系统通知 -│ └── 告警历史 - 查看告警触发情况和处理记录 -└── 🎯 对标管理 - ├── 目标设置 - 配置各部门月度/季度目标 - ├── 对标查询 - 与行业平均值对标 - └── 达成分析 - 月度复盘和趋势分析 -``` - -#### 15️⃣ 配送管理菜单 (DELIVERY) - -**6个功能分组,25个管理页面**: - -``` -🚚 配送管理 -├── 📊 配送统计 -│ ├── 今日数据 - 完成订单、总收入、平均时间 -│ ├── 配送员排行 - 今日/周/月表现排行 -│ └── 路线分析 - 配送费用效率、完成率 -├── 👥 配送员管理 -│ ├── 配送员列表 - 查看/编辑配送员信息 -│ ├── 配送员审核 - 新驾驶员资格审核 -│ ├── 配送员黑名单 - 冻结违规配送员 -│ ├── 配送员分级 - 按等级分配任务权重 -│ ├── 配送员激励 - 创建激励活动和月度奖励 -│ └── 申诉管理 - 处理用户对配送员投诉 -├── 🎯 任务分配 -│ ├── 自动分配规则 - 按配送员等级、距离、工作量 -│ ├── 手动分配 - 管理员直接指派订单 -│ └── 分配记录 - 查看分配历史和效率分析 -├── 🏆 绩效考核 -│ ├── 考核指标 - 送达时间、用户评分、投诉数等 -│ ├── 考核设置 - 配置权重、目标、奖惩 -│ ├── 月度考核 - 生成配送员考核报告 -│ └── 工资计算 - 基本工资+考核奖惩+分层计价 -├── 💳 费用结算 -│ ├── 费率配置 - 按距离/时间/订单量分层定价 -│ ├── 提现管理 - 审核和处理配送员提现 -│ ├── 结算周期 - 配置按日/周/月结算 -│ └── 结算报表 - 生成详细结算单 -└── 🚗 车辆管理 - ├── 车辆列表 - 查看配送员车辆信息 - ├── 车牌审核 - 审核车牌、保险、年检 - └── 轨迹追踪 - 实时查看配送员位置 -``` - -#### 16️⃣ 商户管理菜单 (MERCHANT) - -**5个功能分组,20个管理页面**: - -``` -🏪 商户管理 -├── 📊 商户统计 -│ ├── 商户总数 - 按等级、状态统计 -│ ├── 商户排行 - 销售额、订单数、评分排行 -│ └── 商户画像 - 分类/地区分布、增长趋势 -├── 👤 商户审核 -│ ├── 入驻申请 - 审核新商户资质 -│ ├── 资质审核 - 营业执照、法人身份验证 -│ ├── 保证金缴纳 - 确认保证金到账 -│ └── 激活管理 - 将商户激活为可营运状态 -├── 💼 商户管理 -│ ├── 商户列表 - 查看/禁用/激活商户 -│ ├── 商户分级 - 根据表现自动升降级或手动调整 -│ ├── 店铺信息 - 修改商户店铺名称、logo、简介 -│ ├── 商户联系方式 - 商户账号、邮箱、电话 -│ └── 商户冻结/解冻 - 处理违规商户 -├── 💰 费用管理 -│ ├── 保证金管理 - 收取、扣罚、退还 -│ ├── 佣金配置 - 按等级/分类设定佣金率 -│ ├── 佣金扣除 - 查看自动扣除明细 -│ ├── 提现管理 - 审核和处理商户提现 -│ ├── 罚款管理 - 对违规商户进行罚款 -│ └── 结算报表 - 月度商户结算单 -└── 📈 经营管理 - ├── 商户数据 - 销售额、订单数、转化、评分 - ├── 商户违规 - 投诉数、退货率、售后问题 - ├── 营销工具权限 - 配置商户可使用的营销功能 - ├── 商户沟通 - 发送通知到指定商户 - └── 商户退出 - 审核商户退出申请、清算 -``` - -#### 17️⃣ 行为分析菜单 (BEHAVIOR) - -**3个功能分组,12个管理页面**: - -``` -📊 行为分析 -├── 👁️ 用户行为追踪 -│ ├── 浏览行为 - 用户查看了哪些商品、停留时长 -│ ├── 收藏分析 - 热门收藏商品、收藏转购率 -│ ├── 购物车分析 - 购物车放弃分析、促进转化 -│ ├── 搜索热词 - 用户搜索了哪些词、转化率 -│ └── 用户路径 - 用户访问页面的路径分析 -├── 🚨 订单风险识别 -│ ├── 异常订单检测 - 虚假订单、高风险用户下单 -│ ├── 黑名单管理 - 冻结恶意用户、记录黑名单 -│ ├── 大额采购预警 - 识别可能的刷单行为 -│ ├── 异常退货分析 - 识别退货率过高的用户 -│ ├── 恶意评价识别 - 识别虚假好评、违规评价 -│ └── 风险订单处理 - 手动审核、冻结、处罚 -└── 📋 退款审核管理 - ├── 待审核退款 - 列表查看需要审核的退款申请 - ├── 自动退款规则 - 配置快速退款的条件 - ├── 退款审批流 - 设置多级审批流程 - ├── 退款拒绝 - 驳回不符合条件的退款 - ├── 退款统计 - 退货率、原因分析、成本统计 - └── 物流退货追踪 - 跟踪退回的商品物流 -``` - -#### 18️⃣ 审核管理菜单 (REVIEW) - -**4个功能分组,15个管理页面**: - -``` -⚖️ 审核管理 -├── 💸 财务审核 -│ ├── 提现审核 - 用户/商户/配送员的提现申请 -│ ├── 发票审核 - 用户发票申请审核 -│ ├── 财务异常 - 大额转账、异常交易 -│ └── 审核历史 - 已审核的申请记录 -├── 📝 商户审核 -│ ├── 入驻申请审核 - 新商户资质审核 -│ ├── 资料修改审核 - 商户修改店铺信息审核 -│ ├── 营销活动审核 - 商户发起的营销活动审核 -│ └── 申诉审核 - 商户的申诉和投诉处理 -├── 👤 用户审核 -│ ├── 用户申诉 - 用户对订单、商品的申诉 -│ ├── 发票申请 - 用户发票申请审核 -│ ├── 账户异常 - 异常登录、账户被盗等 -│ └── 账户冻结申请 - 用户申请冻结账户 -└── ⭐ 内容审核 - ├── 商品评价审核 - 审核用户的商品评价 - ├── 用户反馈审核 - 审核用户反馈和投诉 - ├── 文章审核 - 审核CMS中的文章发布 - └── 评论审核 - 审核商品/文章下的评论 -``` - ---- - -## 🔐 第三部分:权限和角色体系设计 - -### 当前角色体系(7个角色) - -``` -1. 超级管理员 - 所有权限 -2. 商品运营 - 商品相关权限 -3. 订单管理员 - 订单相关权限 -4. 营销专员 - 营销相关权限 -5. 客服主管 - 客服和售后权限 -6. 财务人员 - 财务相关权限 -7. 数据分析师 - 所有数据查看权限(只读) -``` - -### 推荐新增角色体系(15个角色) - -#### A. 核心管理层(3个) - -``` -1. 🔑 超级管理员 (Administrator) - ├── 权限: 完全访问所有功能和数据 - ├── 页面: 所有菜单和页面完全展示 - ├── 数据: 无限制访问 - ├── 操作: 创建/编辑/删除/发布所有业务 - ├── 特殊: 系统配置、权限管理、管理员管理 - └── 适用: 1-2人,通常为技术主管或CEO - -2. 📊 总经理/运营总监 (General Manager) - ├── 权限: 访问所有一级菜单(除系统维护除外) - ├── 页面: 首页、用户、商品、订单、营销、分销、财务、数据分析、配送、商户 - ├── 数据: 全量数据访问 - ├── 操作: 查看所有数据,关键决策类操作需二级确认 - ├── 只读: 系统配置、维护 - └── 适用: 1-2人,公司最高运营者 - -3. 👥 运营副总 (Assistant General Manager) - ├── 权限: 访问关键菜单(用户、商品、订单、营销、财务、数据分析) - ├── 页面: 首页(自定义看板)、用户、商品、订单、营销、财务、数据分析 - ├── 操作: 查看、分析、提建议;重大操作由总经理确认 - └── 适用: 1-2人,协助总经理 -``` - -#### B. 运营管理层(6个) - -``` -4. 👥 用户运营经理 (User Operations Manager) - ├── 菜单: 首页、用户、营销(仅用户相关部分)、数据分析 - ├── 用户功能: - │ ├── 用户查询、编辑、分组、标签、等级管理 - │ ├── 用户行为分析(完全访问) - │ ├── 用户黑名单管理 - │ └── 定向营销活动 - ├── 订单功能: 仅查看,风险订单可标记 - ├── 数据功能: 用户相关报表、用户画像 - └── 适用: 1-2人 - -5. 📦 商品运营经理 (Product Operations Manager) - ├── 菜单: 首页、商品、营销(仅促销相关)、数据分析 - ├── 商品功能: - │ ├── 商品管理(增删改查) - │ ├── 分类、规格、参数、标签管理 - │ ├── 商品上下架 - │ ├── 库存管理(可修改库存) - │ └── 评价管理和回复 - ├── 营销功能: 商品秒杀、拼团、砍价配置 - ├── 采购功能: 商品缺货预警、采购建议 - └── 适用: 2-3人 - -6. 📋 订单管理经理 (Order Management Manager) - ├── 菜单: 首页、订单、物流、售后、数据分析 - ├── 订单功能: - │ ├── 订单查询、发货、收货 - │ ├── 订单备注、备用货物 - │ ├── 异常订单处理 - │ └── 批量打印和导出 - ├── 售后功能: 售后审核、退货处理、退款审批 - ├── 物流功能: 配送员分配、配送统计查看 - ├── 行为分析: 风险订单识别、黑名单管理 - └── 适用: 2-3人 - -7. 🎯 营销运营经理 (Marketing Operations Manager) - ├── 菜单: 首页、营销、用户分析、行为分析、数据分析 - ├── 营销功能: - │ ├── 所有营销活动创建/编辑/上线 - │ ├── 优惠券管理和发放 - │ ├── 积分管理和配置 - │ ├── 活动效果分析 - │ └── 用户定向运营 - ├── 分析功能: 营销ROI分析、活动对标 - ├── 数据导出: 营销数据可导出 - └── 适用: 2人 - -8. 🚚 配送运营经理 (Delivery Operations Manager) - ├── 菜单: 首页、配送管理、数据分析 - ├── 配送功能: - │ ├── 配送员管理(查看、冻结) - │ ├── 任务自动分配规则配置 - │ ├── 绩效考核和工资计算 - │ ├── 费用结算和提现审核 - │ ├── 车辆管理 - │ ├── 轨迹追踪 - │ └── 申诉处理 - ├── 数据功能: 配送效率分析、成本分析 - └── 适用: 1-2人(仅O2O或自建配送) - -9. 🏪 商户运营经理 (Merchant Operations Manager) - ├── 菜单: 首页、商户管理、审核管理、数据分析 - ├── 商户功能: - │ ├── 商户列表查看、信息编辑 - │ ├── 商户分级调整 - │ ├── 商户黑名单管理 - │ ├── 佣金和费用配置 - │ ├── 提现审核 - │ ├── 销售数据查看 - │ └── 违规处理 - ├── 审核功能: 提现审核、申诉处理 - ├── 数据功能: 商户排行、成本分析 - └── 适用: 1-2人(仅平台模式) -``` - -#### C. 执行专员层(4个) - -``` -10. 💼 客服专员 (Customer Service Specialist) - ├── 菜单: 首页、客服、订单(只读)、审核管理 - ├── 功能: - │ ├── 客服工作台 - │ ├── 用户反馈处理 - │ ├── 订单查询(只读) - │ ├── 退款申请处理(执行审批) - │ ├── 用户申诉处理 - │ └── 申诉统计 - └── 适用: 5-10人 - -11. 💰 财务专员 (Finance Specialist) - ├── 菜单: 首页、财务、审核管理、商户管理 - ├── 功能: - │ ├── 财务数据查看 - │ ├── 提现审核 - │ ├── 发票管理 - │ ├── 账单对账 - │ ├── 佣金发放 - │ ├── 余额管理 - │ └── 财务报表导出 - └── 适用: 2-3人 - -12. 📈 数据分析师 (Data Analyst) - ├── 菜单: 首页、数据分析、行为分析、用户分析、所有数据报表 - ├── 权限: - │ ├── 所有数据和报表只读访问 - │ ├── 可创建自定义报表 - │ ├── 可导出所有数据 - │ ├── 可访问原始数据(日志) - │ └── 无修改权 - ├── 特殊功能: - │ ├── 对标管理配置 - │ ├── 异常告警规则配置 - │ ├── 数据权限配置 - │ └── 报表审计查看 - └── 适用: 1-2人 - -13. 🔍 审核专员 (Review Specialist) - ├── 菜单: 首页、审核管理、行为分析 - ├── 功能: - │ ├── 商品评价审核 - │ ├── 用户反馈审核 - │ ├── 发票申请审核 - │ ├── 账户异常处理 - │ ├── 内容审核 - │ └── 审核统计 - └── 适用: 2-3人(内容较多情况) -``` - -#### D. 专项权限角色(2个) - -``` -14. 🎬 内容编辑 (Content Editor) - ├── 菜单: 首页(自定义看板)、内容、装修 - ├── 功能: - │ ├── 文章管理(创建、编辑、发布) - │ ├── 文章分类管理 - │ ├── 首页装修配置 - │ ├── 分类页装修 - │ ├── 数据配置 - │ ├── 主题和样式配置 - │ └── 素材管理 - ├── 权限: 无财务、用户敏感数据权限 - └── 适用: 1-2人(运营/品宣) - -15. 🔧 系统维护员 (System Administrator) - ├── 菜单: 首页、维护、设置 - ├── 功能: - │ ├── 系统配置(不涉及业务逻辑) - │ ├── 定时任务管理 - │ ├── 缓存刷新 - │ ├── 日志查看 - │ ├── 在线升级 - │ ├── 数据库维护 - │ ├── 文件管理 - │ └── 对外接口管理 - ├── 特殊权限: 可查看系统日志、错误日志 - └── 适用: 1-2人(技术人员) -``` - ---- - -### 权限矩阵总览 - -| 菜单 | 超管 | 总经理 | 副总 | 用户运营 | 商品运营 | 订单管理 | 营销运营 | 配送运营 | 商户运营 | 客服专员 | 财务专员 | 数据分析 | 审核专员 | 内容编辑 | 系统维护 | -| -------- | ---- | ------ | ---- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -| 首页 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| 用户 | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | -| 商品 | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | -| 订单 | ✅ | ✅ | ✅ | ⚠️ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | -| 营销 | ✅ | ✅ | ✅ | ⚠️ | ⚠️ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | -| 分销 | ✅ | ✅ | ⚠️ | ❌ | ❌ | ❌ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | -| 客服 | ✅ | ✅ | ⚠️ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | -| 财务 | ✅ | ✅ | ⚠️ | ❌ | ❌ | ⚠️ | ❌ | ⚠️ | ⚠️ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | -| 内容 | ✅ | ✅ | ⚠️ | ❌ | ❌ | ❌ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | -| 装修 | ✅ | ✅ | ⚠️ | ❌ | ❌ | ❌ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | -| 应用 | ✅ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | -| 设置 | ✅ | ⚠️ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | -| 维护 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | -| 数据分析 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⚠️ | ✅ | ✅ | ⚠️ | ❌ | ❌ | -| 配送管理 | ✅ | ✅ | ⚠️ | ❌ | ❌ | ⚠️ | ❌ | ✅ | ❌ | ⚠️ | ⚠️ | ✅ | ❌ | ❌ | ❌ | -| 商户管理 | ✅ | ✅ | ⚠️ | ❌ | ❌ | ❌ | ⚠️ | ❌ | ✅ | ❌ | ⚠️ | ✅ | ⚠️ | ❌ | ❌ | -| 行为分析 | ✅ | ✅ | ⚠️ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ⚠️ | ❌ | ✅ | ⚠️ | ❌ | ❌ | -| 审核管理 | ✅ | ✅ | ⚠️ | ❌ | ❌ | ⚠️ | ❌ | ❌ | ⚠️ | ✅ | ✅ | ⚠️ | ✅ | ❌ | ❌ | - -**说明**: - -- ✅ = 完全访问 -- ⚠️ = 部分访问(只读或仅特定功能) -- ❌ = 无访问权限 - ---- - -## 📱 第四部分:前端实现架构 - -### 页面结构调整方案 - -#### 1. 首页看板 - 动态适配 - -```vue - -``` - -#### 2. 侧边栏菜单 - 权限隐藏 - -```typescript -// 菜单树结构,根据权限过滤 -const menuTree = [ - { - id: "home", - label: "首页", - icon: "home", - path: "/pages/mall/admin/index_new", - roles: ["*"], // 所有角色可见 - }, - { - id: "user", - label: "用户", - icon: "user", - roles: [ - "admin", - "gm", - "assistant_gm", - "user_ops", - "marketing_ops", - "data_analyst", - ], - children: [ - { - id: "user_list", - label: "用户列表", - path: "/pages/mall/admin/user-management", - }, - { - id: "user_group", - label: "用户分组", - path: "/pages/mall/admin/user-statistics", - }, - // ... - ], - }, - { - id: "delivery", - label: "配送管理", - icon: "truck", - roles: ["admin", "gm", "assistant_gm", "delivery_ops", "order_manager"], - children: [ - { - id: "delivery_stats", - label: "配送统计", - path: "/pages/mall/admin/delivery/stats", - }, - { - id: "delivery_driver", - label: "配送员管理", - path: "/pages/mall/admin/delivery/drivers", - }, - // ... - ], - }, - { - id: "merchant", - label: "商户管理", - icon: "store", - roles: ["admin", "gm", "assistant_gm", "merchant_ops"], - children: [ - { - id: "merchant_list", - label: "商户列表", - path: "/pages/mall/admin/merchant/list", - }, - { - id: "merchant_review", - label: "商户审核", - path: "/pages/mall/admin/merchant/review", - }, - // ... - ], - }, - // ... 其他菜单 -]; - -// 根据用户权限过滤菜单 -function getVisibleMenus(userRole: UserRole): MenuItem[] { - return menuTree - .filter( - (menu) => menu.roles.includes("*") || menu.roles.includes(userRole.id), - ) - .map((menu) => ({ - ...menu, - children: menu.children?.filter( - (child) => - child.roles?.includes("*") || child.roles?.includes(userRole.id), - ), - })); -} -``` - -#### 3. 页面级权限验证 - -```typescript -// 页面组件中的权限守卫 -export default { - data() { - return { - requiredPermissions: ["order:view", "order:approve", "order:shipment"], - }; - }, - - beforeCreate() { - const hasPermission = this.requiredPermissions.every((perm) => - this.$userStore.permissions.includes(perm), - ); - - if (!hasPermission) { - // 无权限,跳转回首页并显示提示 - uni.navigateBack(); - uni.showToast({ title: "无权限访问此功能" }); - } - }, -}; -``` - -#### 4. 数据权限隔离 - -```typescript -// 查询时注入权限过滤 -async function fetchOrderList() { - const userRole = this.$userStore.userRole; - - let query = supabase.from("orders"); - - // 不同角色看不同的数据 - switch (userRole.id) { - case "order_manager": - // 订单管理员看全部订单 - break; - case "merchant_ops": - // 商户运营只看特定商户的订单 - query = query.eq("merchant_id", userRole.merchantId); - break; - case "regional_manager": - // 地区管理员只看特定地区的订单 - query = query.in("region_id", userRole.regionIds); - break; - } - - return query.execute(); -} -``` - ---- - -## 🔄 第五部分:实施路线图 - -### Phase 1: 权限体系建立 (第1-2周) - -- [ ] 数据库设计:role、permission、role_permission表 -- [ ] 后端API开发:角色权限查询、数据权限隔离 -- [ ] 前端权限管理库:menuFilter、permissionCheck等 -- [ ] 测试用例编写 - -### Phase 2: 菜单重构 (第3-4周) - -- [ ] 重构admin首页为动态看板 -- [ ] 实现菜单树权限过滤 -- [ ] 调整页面入口和路由 -- [ ] 页面可访问性测试 - -### Phase 3: 新菜单实现 (第5-12周) - -#### 第5-6周:数据分析模块 - -- [ ] 看板配置页面 -- [ ] 报表管理页面 -- [ ] 异常告警配置 - -#### 第7-8周:配送管理模块 - -- [ ] 配送员管理 -- [ ] 任务分配 -- [ ] 绩效考核 - -#### 第9-10周:商户管理模块 - -- [ ] 商户审核 -- [ ] 费用管理 -- [ ] 经营分析 - -#### 第11-12周:行为分析和审核模块 - -- [ ] 用户行为追踪 -- [ ] 风险识别 -- [ ] 审核管理 - -### Phase 4: 验收和上线 (第13-14周) - -- [ ] UAT测试 -- [ ] 性能优化 -- [ ] 权限检查清单 -- [ ] 线上灰度发布 - ---- - -## 📋 第六部分:数据权限设计细节 - -### 多商户数据隔离 - -```sql --- 在所有关键表中添加 merchant_id 字段 -ALTER TABLE orders ADD COLUMN merchant_id UUID; -ALTER TABLE products ADD COLUMN merchant_id UUID; -ALTER TABLE users ADD COLUMN created_by_merchant_id UUID; - --- 商户运营只能看自己的数据 -CREATE POLICY merchant_ops_data_isolation ON orders - FOR SELECT - USING ( - auth.uid() = current_user_id - AND ( - -- 自己是商户运营,只看自己商户的数据 - merchant_id = current_merchant_id - OR - -- 或者有查看其他商户的权限 - EXISTS ( - SELECT 1 FROM role_permissions - WHERE role_id = current_role_id - AND permission = 'order:view_other_merchant' - ) - ) - ); -``` - -### 地区级权限隔离 - -```sql --- 地区管理员只能查看指定地区的数据 -CREATE POLICY regional_manager_isolation ON orders - FOR SELECT - USING ( - auth.uid() = current_user_id - AND ( - shipping_address ->> 'province' = ANY(allowed_regions) - OR role_id = 'admin' - ) - ); -``` - -### 时间范围权限 - -```sql --- 财务人员只能查看过去30天的数据 -CREATE POLICY finance_time_range ON orders - FOR SELECT - USING ( - current_role_id = 'finance_specialist' - AND created_at >= now() - interval '30 days' - ); -``` - ---- - -## 🎬 第七部分:页面布局和交互设计 - -### 左侧菜单 + 主内容区布局 - -``` -┌─────────────────────────────────┐ -│ 商城后台管理系统 │ -├────────────┬────────────────────┤ -│ │ │ -│ 菜单树 │ 面包屑导航 │ -│ ├─ 首页 │ 首页 > 订单 > 待审 │ -│ ├─ 用户 │ │ -│ ├─ 商品 │ 主内容区 │ -│ ├─ 订单 │ ┌─────────────────┐│ -│ │ ├─订单管理 │ │││ -│ │ ├─售后 │ 订单列表 │││ -│ │ └─统计 │ [表格] │││ -│ │ │ [分页] │││ -│ ├─ 数据分析 │ │││ -│ ├─ 配送管理 │ │││ -│ ├─ 商户管理 │ │││ -│ ├─ 行为分析 │ │││ -│ ├─ 审核管理 │ │││ -│ ├─ 设置 │ │││ -│ └─ 维护 │ │││ -│ │└─────────────────┘│ -└────────────┴────────────────────┘ -``` - -### 响应式设计方案 - -```css -/* 桌面版 - 左菜单固定 */ -@media (min-width: 1200px) { - .sidebar { - width: 250px; - } - .main-content { - margin-left: 250px; - } -} - -/* 平板版 - 菜单可折叠 */ -@media (min-width: 768px) and (max-width: 1199px) { - .sidebar { - width: 200px; - } - .sidebar.collapsed { - width: 60px; - } - .main-content { - margin-left: 200px; - } -} - -/* 手机版 - 菜单底部 */ -@media (max-width: 767px) { - .sidebar { - position: fixed; - bottom: 0; - height: 60px; - width: 100%; - } - .main-content { - margin-bottom: 60px; - } -} -``` - ---- - -## ✅ 附录:检查清单 - -### 权限设计检查 - -- [ ] 每个角色的权限都明确定义 -- [ ] 没有权限提升漏洞(权限最小化原则) -- [ ] 敏感操作有二级确认机制 -- [ ] 权限修改操作有审计日志 -- [ ] 不同角色的数据完全隔离 - -### 功能完整性检查 - -- [ ] 每个菜单都有对应的权限 -- [ ] 每个页面都有权限验证 -- [ ] 页面内的操作按钮也要检查权限 -- [ ] 删除、修改操作需要确认框 -- [ ] 所有操作都要记录到审计日志 - -### 测试场景 - -- [ ] 用户无权限访问页面时的表现 -- [ ] 用户有部分权限时的表现(按钮隐藏) -- [ ] 权限动态修改时的实时更新 -- [ ] 多角色用户的权限优先级 -- [ ] 跨角色数据隔离 - ---- - -**下一步**: 根据本分析文档,建议先从Phase 1的权限体系建立开始,逐步推进各个模块的实现。 diff --git a/ADMIN_INTEGRATION_QUICK_REFERENCE.md b/ADMIN_INTEGRATION_QUICK_REFERENCE.md deleted file mode 100644 index 71686a9c..00000000 --- a/ADMIN_INTEGRATION_QUICK_REFERENCE.md +++ /dev/null @@ -1,303 +0,0 @@ -# Admin管理系统 - 融合方案快速参考 - -> 🚀 一页纸快速了解:要融合什么、怎么融合、15个新角色是什么 - ---- - -## 📊 融合概览 - -| 源端 | 可融合的管理功能 | 新增菜单 | 涉及角色 | -| ------------------------ | ------------------------------ | --------------- | ------------------------ | -| **Analytics** 数据分析端 | 看板、报表、告警、对标 | 📈 数据分析菜单 | 数据分析师、各部门经理 | -| **Consumer** 消费者端 | 用户行为、订单风险、退款审核 | 📊 行为分析菜单 | 订单经理、审核专员、客服 | -| **Delivery** 配送端 | 配送员管理、任务分配、绩效考核 | 🚚 配送管理菜单 | 配送运营经理 | -| **Merchant** 商户端 | 商户审核、佣金管理、经营分析 | 🏪 商户管理菜单 | 商户运营经理 | - -**融合后Admin菜单数**: 13 → 18个 (新增5个菜单) - ---- - -## 🔑 15个角色体系一览 - -### 管理层 (3个) - -``` -1. 🔑 超级管理员 - 所有权限 -2. 📊 总经理 - 所有一级菜单 + 全量数据 -3. 👥 运营副总 - 关键菜单 + 查看权限为主 -``` - -### 运营经理 (6个) - -``` -4. 👥 用户运营经理 - 用户、营销(用户)、数据分析 -5. 📦 商品运营经理 - 商品、营销(促销)、库存 -6. 📋 订单管理经理 - 订单、售后、物流、风险识别 -7. 🎯 营销运营经理 - 营销、用户分析、行为分析 -8. 🚚 配送运营经理 - 配送管理(仅自建配送) -9. 🏪 商户运营经理 - 商户管理(仅多商户模式) -``` - -### 执行专员 (4个) - -``` -10. 💼 客服专员 - 客服工作台、退款处理、申诉 -11. 💰 财务专员 - 财务、提现审核、账单 -12. 📈 数据分析师 - 所有数据查看 + 报表配置 -13. 🔍 审核专员 - 内容审核、用户申诉、发票 -``` - -### 专项角色 (2个) - -``` -14. 🎬 内容编辑 - 文章、装修、素材 -15. 🔧 系统维护员 - 系统配置、缓存、日志 -``` - ---- - -## 🗂️ 新增5个菜单详解 - -### 1️⃣ 📈 数据分析菜单 (新增) - -**4个分组,12个页面**: - -| 功能分组 | 页面 | 数量 | -| -------------- | ---------------------------- | ------ | -| 📊 KPI看板管理 | 看板配置、样式、权限 | 3 | -| 📋 报表管理 | 模板库、定时报表、审计、权限 | 4 | -| ⚠️ 异常告警 | 告警规则、频道、历史 | 3 | -| 🎯 对标管理 | 目标设置、对标查询、达成分析 | 2 | -| **合计** | | **12** | - -**关键特性**: - -- ✅ 各角色定制化看板 -- ✅ 自动告警机制(KPI异常) -- ✅ 数据权限分级 -- ✅ 定时报表发送 - -**适用于**: 总经理、各运营经理、数据分析师 (共10+人) - ---- - -### 2️⃣ 🚚 配送管理菜单 (新增) - -**6个分组,25个管理页面**: - -| 功能分组 | 页面 | 数量 | -| ------------- | ------------------------------------ | ------ | -| 📊 配送统计 | 今日数据、排行、路线分析 | 3 | -| 👥 配送员管理 | 列表、审核、黑名单、分级、激励、申诉 | 6 | -| 🎯 任务分配 | 自动规则、手动分配、历史记录 | 3 | -| 🏆 绩效考核 | 指标、设置、月度考核、工资计算 | 4 | -| 💳 费用结算 | 费率、提现、周期、报表 | 4 | -| 🚗 车辆管理 | 车辆列表、审核、轨迹 | 3 | -| **合计** | | **25** | - -**关键特性**: - -- ✅ 智能任务分配算法 -- ✅ 绩效挂钩薪资 -- ✅ 实时轨迹追踪 -- ✅ 风险识别(重复送达、虚假状态) - -**适用于**: 仅O2O模式或自建配送体系 - ---- - -### 3️⃣ 🏪 商户管理菜单 (新增) - -**5个分组,20个管理页面**: - -| 功能分组 | 页面 | 数量 | -| ----------- | ------------------------------ | ------ | -| 📊 商户统计 | 商户总数、排行、画像 | 3 | -| 👤 商户审核 | 入驻、资质、保证金、激活 | 4 | -| 💼 商户管理 | 列表、分级、店铺、联系、冻结 | 5 | -| 💰 费用管理 | 保证金、佣金、提现、罚款、结算 | 5 | -| 📈 经营管理 | 数据、违规、权限、沟通、退出 | 5 | -| **合计** | | **22** | - -**关键特性**: - -- ✅ 完整的商户入驻 → 经营 → 退出流程 -- ✅ 动态佣金分级 -- ✅ 智能风控识别 -- ✅ 多维度数据分析 - -**适用于**: 仅平台模式(B2B2C) - ---- - -### 4️⃣ 📊 行为分析菜单 (新增) - -**3个分组,12个管理页面**: - -| 功能分组 | 页面 | 数量 | -| --------------- | ---------------------------------------------- | ------ | -| 👁️ 用户行为追踪 | 浏览、收藏、购物车、搜索、路径 | 5 | -| 🚨 订单风险识别 | 异常检测、黑名单、采购预警、退货分析、评价识别 | 6 | -| 📋 退款审核管理 | 待审核、自动规则、审批流、拒绝、统计、物流 | 6 | -| **合计** | | **17** | - -**关键特性**: - -- ✅ AI识别虚假订单 & 恶意用户 -- ✅ 多维度风险评分 -- ✅ 自动/手动审核流程 -- ✅ 退款防控 - -**适用于**: 所有模式 - ---- - -### 5️⃣ ⚖️ 审核管理菜单 (新增) - -**4个分组,15个管理页面**: - -| 功能分组 | 页面 | 数量 | -| ----------- | ------------------------------ | ------ | -| 💸 财务审核 | 提现、发票、异常、历史 | 4 | -| 📝 商户审核 | 入驻、资料修改、活动、申诉 | 4 | -| 👤 用户审核 | 用户申诉、发票、账户异常、冻结 | 4 | -| ⭐ 内容审核 | 评价、反馈、文章、评论 | 4 | -| **合计** | | **16** | - -**关键特性**: - -- ✅ 统一审核中心 -- ✅ 多级审批流程 -- ✅ 审计日志完整 -- ✅ 审核效率统计 - -**适用于**: 所有模式 - ---- - -## 🎬 15个角色权限速查表 - -### 按功能模块看谁有权限 - -| 功能模块 | 有权限的角色 | 主要操作 | -| ------------ | -------------------------------------- | ------------------------ | -| **用户管理** | 用户运营、总经理、副总、数据分析 | 查询、分组、标签、黑名单 | -| **商品管理** | 商品运营、总经理、副总、数据分析 | 上下架、库存、分类 | -| **订单处理** | 订单经理、总经理、副总、客服、数据分析 | 发货、售后、风险识别 | -| **营销活动** | 营销运营、总经理、副总、数据分析 | 创建、执行、ROI分析 | -| **配送管理** | 配送运营、总经理、副总 | 分配、考核、结算 | -| **商户管理** | 商户运营、总经理、副总、财务 | 审核、分级、结算 | -| **财务结算** | 财务专员、总经理、副总、数据分析 | 审核、提现、报表 | -| **数据分析** | 数据分析师、总经理、副总、各运营经理 | 配置、查看、导出 | -| **内容审核** | 审核专员、总经理、副总 | 审核、批准、拒绝 | - ---- - -## 📐 实施优先级 - -### 🟢 **第一优先** (必做,3-4周) - -- [ ] 数据库:role & permission 表 -- [ ] 菜单权限系统 -- [ ] 首页看板动态化 -- [ ] 基础权限中间件 - -### 🟡 **第二优先** (应做,4-6周) - -- [ ] 数据分析菜单 (即时性高,收益快) -- [ ] 行为分析 & 审核菜单 (风控重要) -- [ ] 权限细分到按钮级 - -### 🟠 **第三优先** (可做,6-8周) - -- [ ] 配送管理菜单 (仅O2O) -- [ ] 商户管理菜单 (仅平台) -- [ ] 完整的审计日志系统 - ---- - -## 🔐 关键的权限规则 - -``` -1️⃣ 数据隔离 - - 商户运营只能看自己商户的数据 - - 地区经理只能看自己地区的数据 - - 财务只能看过去30天的数据 - -2️⃣ 操作限制 - - 修改操作需要备注和审批 - - 删除操作需要二次确认 - - 金额>10000元的提现需要财务确认 - -3️⃣ 审计记录 - - 所有增删改操作都记录谁、何时、改了什么 - - 权限修改要记录历史 - - 敏感数据导出要记录 - -4️⃣ 权限检查 - - 页面级:检查角色是否有菜单访问权 - - 操作级:检查是否有这个操作权限 - - 数据级:查询时自动注入权限过滤条件 -``` - ---- - -## 📱 页面展示差异示例 - -### 首页看板 - 根据角色显示不同内容 - -``` -【总经理看到】: -- 全局KPI: 销售额、订单、用户、毛利 -- 各部门数据总结 -- 预警信息 -- 快速操作快捷方式 - -【用户运营看到】: -- 用户相关KPI: 新增、活跃、留存、消费 -- 用户分层数据 -- 营销活动效果 -- 用户行为洞察 - -【商品运营看到】: -- 商品相关KPI: 销售额、库存、评分 -- 畅销/滞销商品 -- 库存预警 -- 采购建议 - -【财务专员看到】: -- 财务相关KPI: 收入、成本、利润 -- 待审核项: 提现、发票、异常 -- 应收应付 -- 日报表 -``` - ---- - -## 🎯 成功指标 - -- ✅ 页面加载速度 < 2s -- ✅ 权限验证失败率 < 0.01% -- ✅ 数据隔离无泄露 -- ✅ 用户操作审计完整率 100% -- ✅ 新增角色学习曲线 < 1小时 - ---- - -## 📞 常见问题 - -**Q: 能不能给一个用户多个角色?** -A: 可以。系统支持用户绑定多个角色,权限取并集。 - -**Q: 怎么处理跨部门的权限?** -A: 使用权限模板。比如"跨部门审核员"模板包含多个部门的权限。 - -**Q: 新增角色需要修改多少代码?** -A: 只需在role表中插入新记录和权限关联,无需代码改动(数据驱动设计)。 - -**Q: 怎么确保数据权限不被绕过?** -A: 数据权限在数据库层用RLS(Row Level Security)策略强制,代码再怎么改也绕不过。 - ---- - -**相关文件**: 完整分析在 [ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md](ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md) diff --git a/ADMIN_MENU_STRUCTURE_COMPARISON.md b/ADMIN_MENU_STRUCTURE_COMPARISON.md deleted file mode 100644 index 129add18..00000000 --- a/ADMIN_MENU_STRUCTURE_COMPARISON.md +++ /dev/null @@ -1,810 +0,0 @@ -# Admin菜单结构 - 融合前后对照 - ---- - -## 📊 菜单进化图 - -### 融合前:13个一级菜单 - -``` -📊 Admin管理系统 -├── 📈 首页 (HOME) -│ └── 仪表板 -├── 👥 用户 (USER) -│ ├── 用户统计 -│ ├── 用户管理 -│ ├── 用户分组 -│ ├── 用户标签 -│ └── 用户等级 -├── 📦 商品 (PRODUCT) -│ ├── 商品统计 -│ ├── 商品管理 -│ ├── 商品分类 -│ ├── 商品规格 -│ ├── 商品参数 -│ ├── 商品标签 -│ ├── 商品保障 -│ └── 商品评论 -├── 📋 订单 (ORDER) -│ ├── 订单统计 -│ ├── 订单管理 -│ ├── 售后订单 -│ ├── 收银订单 -│ ├── 核销记录 -│ └── 订单配置 -├── 🎯 营销 (MARKETING) -│ ├── 优惠券管理 (2页) -│ ├── 积分管理 (5页) -│ ├── 抽奖管理 (2页) -│ ├── 砍价管理 (2页) -│ ├── 拼团管理 (3页) -│ ├── 秒杀管理 (3页) -│ ├── 付费会员 (5页) -│ ├── 直播管理 (3页) -│ ├── 用户充值 (2页) -│ ├── 每日签到 (2页) -│ └── 其他营销 (2页) -├── 👔 分销 (DISTRIBUTION) -│ ├── 分销统计 -│ ├── 分销员列表 -│ └── 分销设置 -├── 💬 客服 (KEFU) -│ ├── 客服列表 -│ ├── 客服话术 -│ ├── 用户留言 -│ ├── 自动回复 -│ └── 客服配置 -├── 💰 财务 (FINANCE) -│ ├── 交易统计 -│ ├── 财务操作 -│ ├── 财务记录 -│ ├── 佣金记录 -│ └── 余额记录 -├── 📄 内容 (CMS) -│ ├── 文章管理 -│ └── 文章分类 -├── 🎨 装修 (DECORATION) -│ ├── 首页装修 -│ ├── 分类装修 -│ ├── 商品装修 -│ ├── 数据配置 -│ ├── 主题风格 -│ ├── 素材管理 -│ ├── 链接管理 -│ └── 装修预览 -├── 🔌 应用 (APP) -│ ├── 应用统计 -│ └── 应用列表 -├── ⚙️ 设置 (SETTING) -│ ├── 系统配置 -│ ├── 管理员管理 -│ └── 角色管理 -└── 🛠️ 维护 (MAINTAIN) - ├── 开发配置 (6页) - ├── 安全维护 (3页) - ├── 数据维护 (3页) - ├── 对外接口 (1页) - ├── 语言设置 (4页) - ├── 开发工具 (4页) - └── 系统信息 (1页) - -🔢 统计: 13个一级菜单, 100+ 个管理页面 -``` - -### 融合后:18个一级菜单(新增5个) - -``` -📊 Admin管理系统(升级版) -├── 📈 首页 (HOME) ⭐ 动态看板 -├── 👥 用户 (USER) ⭐ 扩展数据权限 -├── 📦 商品 (PRODUCT) ✅ 保持 -├── 📋 订单 (ORDER) ⭐ 扩展物流+风险识别 -├── 🎯 营销 (MARKETING) ✅ 保持 -├── 👔 分销 (DISTRIBUTION) ✅ 保持 -├── 💬 客服 (KEFU) ✅ 保持 -├── 💰 财务 (FINANCE) ✅ 保持 -├── 📄 内容 (CMS) ✅ 保持 -├── 🎨 装修 (DECORATION) ✅ 保持 -├── 🔌 应用 (APP) ✅ 保持 -├── ⚙️ 设置 (SETTING) ✅ 保持 -├── 🛠️ 维护 (MAINTAIN) ✅ 保持 -├── 📈 数据分析 (ANALYTICS) 🆕 新增 (12页) -├── 🚚 配送管理 (DELIVERY) 🆕 新增 (25页) -├── 🏪 商户管理 (MERCHANT) 🆕 新增 (22页) -├── 📊 行为分析 (BEHAVIOR) 🆕 新增 (17页) -└── ⚖️ 审核管理 (REVIEW) 🆕 新增 (16页) - -🔢 统计: 18个一级菜单, 160+ 个管理页面 -``` - ---- - -## 🆕 新增5个菜单详细结构 - -### 14. 📈 数据分析 (ANALYTICS) - -``` -📈 数据分析 -├── 📊 KPI看板管理 -│ ├── 看板配置 -│ │ ├── 新建看板 -│ │ ├── 编辑看板 -│ │ ├── 删除看板 -│ │ └── 看板列表 -│ ├── 看板样式 -│ │ ├── 图表类型选择 (柱状图、折线图、饼图等) -│ │ ├── 颜色方案 -│ │ ├── 布局配置 -│ │ └── 预览 -│ └── 看板权限 -│ ├── 指定角色可见 -│ ├── 指定用户可见 -│ └── 权限历史 -├── 📋 报表管理 -│ ├── 报表模板库 -│ │ ├── 预设模板 (销售模板、用户模板等) -│ │ ├── 自定义模板 -│ │ ├── 模板编辑 -│ │ └── 模板分类 -│ ├── 定时报表 -│ │ ├── 创建定时报表 -│ │ ├── 编辑定时规则 (日/周/月) -│ │ ├── 接收人配置 -│ │ └── 发送历史 -│ ├── 报表审计 -│ │ ├── 查看记录 -│ │ ├── 按用户筛选 -│ │ ├── 按时间筛选 -│ │ └── 导出审计日志 -│ └── 数据权限 -│ ├── 按角色配置可见数据范围 -│ ├── 按地区/商户配置 -│ └── 权限测试 -├── ⚠️ 异常告警 -│ ├── 告警规则 -│ │ ├── KPI告警 (销售下跌、订单异常) -│ │ ├── 库存告警 (库存预警、缺货) -│ │ ├── 用户告警 (高风险用户、虚假账号) -│ │ ├── 成本告警 (毛利下降、费用超支) -│ │ └── 规则编辑 -│ ├── 告警频道 -│ │ ├── 邮件通知 -│ │ ├── 短信通知 -│ │ ├── 系统消息 -│ │ └── 微信企业号 -│ └── 告警历史 -│ ├── 告警日志查看 -│ ├── 处理状态标记 -│ └── 统计分析 -└── 🎯 对标管理 - ├── 目标设置 - │ ├── 月度目标设置 (销售、利润、新客等) - │ ├── 部门目标分配 - │ └── 目标历史查看 - ├── 对标查询 - │ ├── 与去年同期对比 - │ ├── 与行业平均对标 - │ └── 对标数据导出 - └── 达成分析 - ├── 完成度查看 (进度条、百分比) - ├── 关键驱动因素分析 - └── 月度复盘报告 -``` - -### 15. 🚚 配送管理 (DELIVERY) - -``` -🚚 配送管理 -├── 📊 配送统计 -│ ├── 今日数据 -│ │ ├── 待接单数 -│ │ ├── 配送中数 -│ │ ├── 已完成数 -│ │ ├── 总收入 -│ │ └── 平均送达时间 -│ ├── 配送员排行 -│ │ ├── 今日排行 -│ │ ├── 周排行 -│ │ ├── 月排行 -│ │ └── 导出排行榜 -│ └── 路线分析 -│ ├── 配送费用效率 -│ ├── 完成率分析 -│ ├── 里程成本 -│ └── 最优路线提示 -├── 👥 配送员管理 -│ ├── 配送员列表 -│ │ ├── 配送员信息查看 (姓名、评分、车辆、服务区) -│ │ ├── 配送员编辑 -│ │ ├── 启用/禁用 -│ │ ├── 批量导入/导出 -│ │ └── 高级搜索 -│ ├── 配送员审核 -│ │ ├── 新驾驶员申请审核 -│ │ ├── 身份认证审核 -│ │ ├── 驾驶证/行驶证验证 -│ │ ├── 拒绝与再审 -│ │ └── 审核历史 -│ ├── 配送员黑名单 -│ │ ├── 冻结账户 -│ │ ├── 黑名单原因记录 -│ │ ├── 申诉处理 -│ │ └── 黑名单解除流程 -│ ├── 配送员分级 -│ │ ├── 等级设置 (初级/中级/高级/王牌) -│ │ ├── 升降级条件配置 -│ │ ├── 按等级分配权重 -│ │ └── 等级权益配置 -│ ├── 配送员激励 -│ │ ├── 激励活动创建 -│ │ ├── 日送单数奖励 (达成100单奖励100元) -│ │ ├── 月度奖励 (销量冠军、满意度冠军) -│ │ ├── 特殊奖励 -│ │ └── 激励统计 -│ └── 申诉管理 -│ ├── 用户投诉处理 -│ ├── 投诉原因分类 -│ ├── 处理结果记录 -│ ├── 配送员申诉处理 -│ └── 投诉统计分析 -├── 🎯 任务分配 -│ ├── 自动分配规则 -│ │ ├── 距离优化算法 -│ │ ├── 工作量均衡 (分配平衡系数) -│ │ ├── 等级优先级配置 -│ │ ├── 地理围栏设置 -│ │ └── 规则测试 -│ ├── 手动分配 -│ │ ├── 选择订单 -│ │ ├── 选择配送员 -│ │ ├── 分配备注 -│ │ ├── 批量分配 -│ │ └── 分配确认 -│ └── 分配记录 -│ ├── 分配历史查看 -│ ├── 按配送员筛选 -│ ├── 按时间筛选 -│ ├── 分配效率统计 -│ └── 分配日报表 -├── 🏆 绩效考核 -│ ├── 考核指标 -│ │ ├── 送达时间达成率 (承诺时间内完成%) -│ │ ├── 用户评分 (平均分数) -│ │ ├── 投诉数 (0投诉、1-3投诉等级) -│ │ ├── 接单率 (接单/分配比例) -│ │ ├── 完成率 (完成/接单比例) -│ │ └── 自定义指标 -│ ├── 考核设置 -│ │ ├── 指标权重配置 -│ │ ├── 目标设置 (比如送达率95%以上) -│ │ ├── 奖惩规则 (完成目标+奖励/未完成-扣款) -│ │ └── 生效时间设置 -│ ├── 月度考核 -│ │ ├── 生成考核报告 -│ │ ├── 考核分数计算 -│ │ ├── 等级评定 (优秀/良好/及格/不及格) -│ │ ├── 考核结果确认 -│ │ └── 考核结果公示 -│ └── 工资计算 -│ ├── 基本工资配置 (底薪) -│ ├── 考核奖惩计算 -│ ├── 分层计价计算 (单价*数量) -│ ├── 加班费计算 -│ └── 最终工资表导出 -├── 💳 费用结算 -│ ├── 费率配置 -│ │ ├── 按距离分层 (3km内100元, 3-5km120元) -│ │ ├── 按时间分层 (早8-11点配送50元/单) -│ │ ├── 按订单量分层 (日50单以上提价5%) -│ │ ├── 特殊商品加价 (重物加价、易损加价) -│ │ └── 规则生效管理 -│ ├── 提现管理 -│ │ ├── 提现申请查看 -│ │ ├── 提现审核 (验证账户、金额) -│ │ ├── 提现驳回 -│ │ ├── 提现到账确认 -│ │ └── 提现统计 -│ ├── 结算周期 -│ │ ├── 周期配置 (日结/周结/月结) -│ │ ├── 结算日期设置 -│ │ ├── 自动结算规则 -│ │ └── 手动结算 -│ └── 结算报表 -│ ├── 日结单导出 -│ ├── 周结单导出 -│ ├── 月结单导出 -│ ├── 配送员个人报表 -│ └── 团队汇总报表 -└── 🚗 车辆管理 - ├── 车辆列表 - │ ├── 车辆信息查看 (车牌、类型、品牌、车龄) - │ ├── 车辆编辑 - │ ├── 关联配送员 - │ └── 批量上传 - ├── 车牌审核 - │ ├── 行驶证审核 - │ ├── 保险查看 (保期、理赔次数) - │ ├── 年检查看 (年检日期、状态) - │ ├── 异常处理 (逾期提醒、处理记录) - │ └── 审核统计 - └── 轨迹追踪 - ├── 实时位置查看 - ├── 配送路线可视化 - ├── 行驶速度监控 - ├── 异常行为告警 (超速、停留过久) - └── 轨迹回放 -``` - -### 16. 🏪 商户管理 (MERCHANT) - -``` -🏪 商户管理 -├── 📊 商户统计 -│ ├── 商户总数 -│ │ ├── 按等级统计 (普通/黄金/钻石/VIP) -│ │ ├── 按状态统计 (申请中/审核中/已激活/已冻结) -│ │ ├── 按分类统计 (食品/服装/电子等) -│ │ └── 增长趋势 (新入驻商户) -│ ├── 商户排行 -│ │ ├── 销售额排行 -│ │ ├── 订单数排行 -│ │ ├── 评分排行 -│ │ ├── 新入驻排行 -│ │ └── 导出排行榜 -│ └── 商户画像 -│ ├── 分类分布 (各分类商户数、销售额) -│ ├── 地区分布 -│ ├── 等级分布 -│ ├── 增长曲线 (月新增、留存) -│ └── 数据总结 -├── 👤 商户审核 -│ ├── 入驻申请 -│ │ ├── 申请列表查看 -│ │ ├── 申请人信息审核 (真名认证、身份证) -│ │ ├── 营业执照审核 (图片清晰、有效期) -│ │ ├── 经营范围确认 -│ │ ├── 批准 / 驳回 / 再审请求 -│ │ └── 申请历史 -│ ├── 资质审核 -│ │ ├── 法人身份验证 -│ │ ├── 银行账户验证 (开户行、账户名) -│ │ ├── 税务信息验证 -│ │ ├── 许可证验证 (若需要,如食品经营许可证) -│ │ └── 补充材料收集 -│ ├── 保证金缴纳 -│ │ ├── 保证金标准查看 (按分类设置) -│ │ ├── 商户缴纳记录 -│ │ ├── 缴纳确认 (验证银行到账) -│ │ ├── 退款处理 -│ │ └── 缴纳统计 -│ └── 激活管理 -│ ├── 待激活商户列表 -│ ├── 激活前检查清单 -│ ├── 生成激活令牌/邀请码 -│ ├── 激活状态变更 -│ └── 激活日志 -├── 💼 商户管理 -│ ├── 商户列表 -│ │ ├── 商户信息查看 (店铺名、负责人、联系方式) -│ │ ├── 商户编辑 (店铺简介、营业时间) -│ │ ├── 启用/禁用 -│ │ ├── 批量操作 -│ │ └── 高级搜索/过滤 -│ ├── 商户分级 -│ │ ├── 分级标准设置 -│ │ │ ├── 销售额阈值 (月销>10万→黄金) -│ │ │ ├── 评分阈值 (评分>4.5→黄金) -│ │ │ ├── 投诉率阈值 (投诉<0.1%→黄金) -│ │ │ └── 权重配置 -│ │ ├── 自动升级/降级 -│ │ ├── 手动调整 -│ │ ├── 分级权益配置 (不同等级的佣金率、功能限制) -│ │ └── 分级统计 -│ ├── 店铺信息 -│ │ ├── 店铺名称编辑 -│ │ ├── Logo上传/修改 -│ │ ├── 店铺简介编辑 -│ │ ├── 营业时间设置 -│ │ ├── 联系方式管理 -│ │ ├── 商户分类标签 -│ │ └── 店铺风格/主题 -│ ├── 商户联系方式 -│ │ ├── 账号管理 (主账号、子账号) -│ │ ├── 邮箱管理 -│ │ ├── 电话管理 -│ │ ├── 微信绑定 -│ │ └── 紧急联系人 -│ └── 商户冻结/解冻 -│ ├── 冻结账户 (违规、欠款等) -│ ├── 冻结原因记录 -│ ├── 冻结期限设置 -│ ├── 解冻申请处理 -│ └── 冻结统计 -├── 💰 费用管理 -│ ├── 保证金管理 -│ │ ├── 保证金标准 (按分类/等级) -│ │ ├── 缴纳记录查看 -│ │ ├── 扣罚记录 (质量问题赔偿) -│ │ ├── 扣罚申请审批 -│ │ ├── 退还流程 (商户申请→审批→转账) -│ │ └── 保证金账户余额 -│ ├── 佣金配置 -│ │ ├── 分类佣金率 (不同商品分类不同佣金) -│ │ ├── 等级佣金率 (不同商户等级不同佣金) -│ │ ├── 时间段差异 (不同时段不同佣金) -│ │ ├── 新商户优惠期 (前3个月佣金减半) -│ │ ├── 佣金规则审批 -│ │ └── 佣金历史查看 -│ ├── 佣金扣除 -│ │ ├── 自动计算和扣除 -│ │ ├── 佣金明细查看 (每笔订单的佣金) -│ │ ├── 佣金统计 (日/周/月) -│ │ ├── 异常佣金标记 -│ │ └── 手动调整 -│ ├── 提现管理 -│ │ ├── 提现申请查看 -│ │ ├── 提现审核 (验证商户身份、账户) -│ │ ├── 提现驳回 -│ │ ├── 转账处理 -│ │ ├── 提现到账确认 -│ │ ├── 提现限额配置 (最低提现金额、频率) -│ │ └── 提现统计 -│ ├── 罚款管理 -│ │ ├── 罚款原因管理 (虚假商品、发货延期等) -│ │ ├── 罚款处理 -│ │ ├── 罚款扣除 (从保证金/提现中扣除) -│ │ ├── 罚款申诉处理 -│ │ └── 罚款统计 -│ └── 结算报表 -│ ├── 日结单 (日期、销售额、佣金、实收) -│ ├── 周结单 -│ ├── 月结单 -│ ├── 商户个人结算报表 -│ ├── 分类汇总结算 -│ └── 结算审计 -└── 📈 经营管理 - ├── 商户数据 - │ ├── 销售数据 (销售额、订单数、客单价) - │ ├── 转化数据 (浏览数、下单数、转化率) - │ ├── 评分数据 (商品评分、服务评分、物流评分) - │ ├── 数据对比 (与上周/上月对比) - │ └── 数据导出 - ├── 商户违规 - │ ├── 投诉统计 (投诉数、类型) - │ ├── 退货率统计 - │ ├── 售后问题 (破损、错发、不符) - │ ├── 违规风险评分 - │ └── 风险等级 (绿/黄/红) - ├── 营销工具权限 - │ ├── 配置商户可使用的营销功能 - │ │ ├── 优惠券功能 - │ │ ├── 秒杀功能 - │ │ ├── 拼团功能 - │ │ └── 直播功能 - │ ├── 功能限制配置 (如最多创建50个优惠券) - │ ├── 权限审批流程 - │ └── 权限统计 - ├── 商户沟通 - │ ├── 发送通知到指定商户 - │ ├── 系统公告发布 - │ ├── 政策更新通知 - │ ├── 营销活动推荐 - │ └── 通知送达记录 - └── 商户退出 - ├── 退出申请处理 - ├── 风险提示 (有未发货订单等) - ├── 清算流程 (冻结订单、财务清算) - ├── 退出确认 - └── 退出统计 -``` - -### 17. 📊 行为分析 (BEHAVIOR) - -``` -📊 行为分析 -├── 👁️ 用户行为追踪 -│ ├── 浏览行为 -│ │ ├── 页面访问统计 (首页、分类、商品详情) -│ │ ├── 停留时长分析 (用户在各页面停留多久) -│ │ ├── 用户路径分析 (用户的访问流程) -│ │ ├── 热力图 (页面哪些区域被点击最多) -│ │ ├── 浏览用户分群 (按行为分群) -│ │ └── 数据导出 -│ ├── 收藏分析 -│ │ ├── 收藏商品排行 (最多被收藏的商品) -│ │ ├── 收藏转购率 (收藏后购买率) -│ │ ├── 未购收藏商品提醒 (可做营销活动) -│ │ ├── 用户收藏分析 (活跃用户收藏特征) -│ │ └── 优化建议 -│ ├── 购物车分析 -│ │ ├── 购物车放弃分析 -│ │ │ ├── 放弃购物车数 -│ │ │ ├── 放弃率 -│ │ │ ├── 放弃原因推测 (价格太高、缺货、物流费用) -│ │ │ └── 放弃用户重新激活策略 -│ │ ├── 购物车商品热度 -│ │ ├── 平均购物车金额 -│ │ └── 购物车优化建议 -│ ├── 搜索热词 -│ │ ├── 搜索关键词统计 -│ │ ├── 搜索转化率 (搜索后购买率) -│ │ ├── 高频搜索词 TOP100 -│ │ ├── 零结果搜索词 (搜索不到的词) -│ │ ├── 搜索趋势 (词汇热度变化) -│ │ └── 搜索体验优化建议 -│ └── 用户路径 -│ ├── 访问路径流 (用户从进入到购买的路径) -│ ├── 路径热力 (最常走的路径) -│ ├── 流失分析 (用户在哪一步离开) -│ ├── 转化路径 (购买成功用户的路径特征) -│ ├── 异常路径 (反复刷新、加购又删除等) -│ └── 路径优化建议 -├── 🚨 订单风险识别 -│ ├── 异常订单检测 -│ │ ├── 虚假订单识别 -│ │ │ ├── 同一账号大额频繁下单 -│ │ │ ├── 多账号同一IP/设备下单 -│ │ │ ├── 异常地址提示 (收货地址频繁变化) -│ │ │ ├── 异常支付方式 (虚拟卡等) -│ │ │ └── 风险评分 -│ │ ├── 高风险用户下单 -│ │ │ ├── 新开账号大额采购 -│ │ │ ├── 黑名单关联账号 -│ │ │ └── 关联设备识别 -│ │ ├── 异常订单列表 -│ │ ├── 手动标记异常 -│ │ └── 异常原因分类 -│ ├── 黑名单管理 -│ │ ├── 冻结恶意用户 -│ │ ├── 黑名单原因记录 (虚假订单、退货欺诈等) -│ │ ├── 黑名单用户关联账号查询 -│ │ ├── 黑名单解除申诉处理 -│ │ ├── 黑名单进出记录 -│ │ └── 黑名单统计 -│ ├── 大额采购预警 -│ │ ├── 大额订单自动识别 (>1000元) -│ │ ├── 短期集中采购识别 (1周内多次) -│ │ ├── 异常行为标记 -│ │ ├── 人工审核队列 -│ │ ├── 风险评分 -│ │ └── 处理决策 (通过/冻结/需要确认) -│ ├── 异常退货分析 -│ │ ├── 退货率过高用户识别 (退货率>30%) -│ │ ├── 模式分析 (是否存在规律退货) -│ │ ├── 原因分析 (质量问题 vs 改主意) -│ │ ├── 可信度评分 -│ │ ├── 处理建议 (要求视频验收、限制退货等) -│ │ └── 高风险退货订单处理 -│ ├── 恶意评价识别 -│ │ ├── 虚假好评识别 (如通过赠品获赞) -│ │ ├── 违规评价识别 (含广告、联系方式等) -│ │ ├── 不实评价识别 (与商品描述不符) -│ │ ├── 评价质量评分 -│ │ ├── 处理建议 (隐藏/删除/追踪) -│ │ └── 恶意评价统计 -│ └── 风险订单处理 -│ ├── 风险订单队列 -│ ├── 手动审核 -│ ├── 标记为可疑/确认安全/冻结 -│ ├── 处理历史 -│ └── 审核统计 (正确率、处理时间) -├── 📋 退款审核管理 -│ ├── 待审核退款 -│ │ ├── 待审核列表 -│ │ ├── 订单信息查看 (商品、金额、原因) -│ │ ├── 用户信息查看 (信誉、历史退款数) -│ │ ├── 商家/平台责任判断 -│ │ ├── 审核决定 (同意/拒绝/需补充信息) -│ │ └── 审核备注 -│ ├── 自动退款规则 -│ │ ├── 快速退款条件配置 -│ │ │ ├── 商品未发货→自动退款 -│ │ │ ├── 逾期未发货3天→自动退款 -│ │ │ ├── 新用户不参与自动退款 -│ │ │ └── 退款金额<100元→优先自动 -│ │ ├── 规则编辑 -│ │ ├── 规则生效 -│ │ └── 自动退款统计 -│ ├── 退款审批流 -│ │ ├── 配置审批等级 (1级/2级/3级) -│ │ ├── 配置审批金额阈值 -│ │ │ ├── 金额<100元→1级审核 -│ │ │ ├── 100-500元→2级审核 -│ │ │ ├── >500元→3级审核 -│ │ ├── 配置审批人 -│ │ ├── 催促审批 (超时自动上报) -│ │ └── 审批历史 -│ ├── 退款拒绝 -│ │ ├── 拒绝原因分类 -│ │ ├── 拒绝模板 -│ │ ├── 用户申诉处理 -│ │ ├── 再次审核流程 -│ │ └── 最终决定记录 -│ ├── 退款统计 -│ │ ├── 退货率分析 -│ │ ├── 退款原因排行 -│ │ ├── 平均退款金额 -│ │ ├── 批准率/拒绝率 -│ │ ├── 成本分析 (退款损失) -│ │ └── 同比数据 -│ └── 物流退货追踪 -│ ├── 退货订单物流信息 -│ ├── 退货轨迹查看 -│ ├── 退货签收确认 -│ ├── 退货货物确认 (与订单匹配性) -│ ├── 退货完成 -│ └── 异常物流处理 (物流丢失、损坏) -``` - -### 18. ⚖️ 审核管理 (REVIEW) - -``` -⚖️ 审核管理 -├── 💸 财务审核 -│ ├── 提现审核 -│ │ ├── 待审核提现列表 -│ │ ├── 提现信息查看 (申请金额、账户、时间) -│ │ ├── 提现账户验证 (账户名匹配) -│ │ ├── 余额验证 (确保有足够余额) -│ │ ├── 异常提现检测 (频繁大额提现) -│ │ ├── 批准/驳回 -│ │ ├── 转账处理 -│ │ ├── 到账确认 -│ │ └── 审核统计 -│ ├── 发票审核 -│ │ ├── 待审核发票列表 -│ │ ├── 发票信息审核 (抬头、金额、税号) -│ │ ├── 用户信息验证 -│ │ ├── 订单金额匹配 -│ │ ├── 批准/驳回 -│ │ ├── 发票邮寄管理 -│ │ ├── 发票寄送跟踪 -│ │ └── 发票统计 -│ ├── 财务异常 -│ │ ├── 大额转账异常提醒 -│ │ ├── 异常交易标记 -│ │ ├── 人工审核 -│ │ ├── 异常确认/驳回 -│ │ └── 异常原因分析 -│ └── 审核历史 -│ ├── 已审核提现记录 -│ ├── 已审核发票记录 -│ ├── 审核员审计 -│ ├── 按时间/申请人筛选 -│ └── 审核统计报表 -├── 📝 商户审核 -│ ├── 入驻申请审核 -│ │ ├── 待审核申请列表 -│ │ ├── 商户资质查看 -│ │ ├── 营业执照验真 -│ │ ├── 经营范围确认 -│ │ ├── 批准激活/驳回重审 -│ │ ├── 审核备注 -│ │ └── 入驻统计 -│ ├── 资料修改审核 -│ │ ├── 商户修改申请列表 -│ │ ├── 修改内容对比 (原→新) -│ │ ├── 修改合法性审核 -│ │ ├── 批准/拒绝 -│ │ └── 修改历史记录 -│ ├── 营销活动审核 -│ │ ├── 商户创建的活动审核 -│ │ ├── 活动规则合规性检查 -│ │ ├── 虚假宣传检测 -│ │ ├── 价格异常检测 (深度折扣) -│ │ ├── 批准发布/驳回修改 -│ │ ├── 活动上线监控 -│ │ └── 活动下线处理 -│ └── 申诉审核 -│ ├── 商户申诉列表 -│ ├── 申诉内容查看 -│ ├── 相关证据收集 -│ ├── 原处理决定复查 -│ ├── 申诉批准/驳回 -│ ├── 申诉结果反馈 -│ └── 申诉统计分析 -├── 👤 用户审核 -│ ├── 用户申诉 -│ │ ├── 待审核申诉列表 -│ │ ├── 申诉详情查看 -│ │ ├── 相关订单/商品信息 -│ │ ├── 申诉原因分类 -│ │ ├── 申诉材料审核 (截图、视频等) -│ │ ├── 申诉批准/驳回 -│ │ ├── 赔偿处理 (如有) -│ │ └── 申诉统计 -│ ├── 发票申请 -│ │ ├── 待审核发票申请列表 -│ │ ├── 用户信息验证 -│ │ ├── 订单金额匹配 -│ │ ├── 发票抬头合法性检查 -│ │ ├── 批准/拒绝 -│ │ ├── 发票生成 -│ │ ├── 发票配送 -│ │ └── 发票统计 -│ ├── 账户异常 -│ │ ├── 异常登录提醒 -│ │ ├── 异常账户操作 (短期大额提现) -│ │ ├── 账户被盗风险提示 -│ │ ├── 用户申请冻结 -│ │ ├── 强制账户安全检查 -│ │ ├── 异常确认/解除 -│ │ └── 账户恢复流程 -│ └── 账户冻结申请 -│ ├── 用户自申请冻结 -│ ├── 冻结原因记录 -│ ├── 冻结期限设置 -│ ├── 冻结确认 -│ ├── 冻结期间订单处理 -│ ├── 解冻申请处理 -│ └── 冻结统计 -└── ⭐ 内容审核 - ├── 商品评价审核 - │ ├── 待审核评价列表 - │ ├── 评价内容检查 (违规词、广告) - │ ├── 图片审核 (色情、暴力等) - │ ├── 虚假评价检测 - │ ├── 批准显示/隐藏/删除 - │ ├── 审核备注 - │ └── 评价审核统计 - ├── 用户反馈审核 - │ ├── 待审核反馈列表 - │ ├── 反馈内容审核 - │ ├── 反馈优先级设置 - │ ├── 内部处理分配 - │ ├── 批准/驳回 - │ ├── 反馈回复 - │ └── 反馈统计 - ├── 文章审核 - │ ├── 待审核文章列表 - │ ├── 文章内容检查 (合法性、SEO) - │ ├── 文章图片审核 - │ ├── 链接安全检查 (是否含恶意链接) - │ ├── 批准发布/驳回编辑 - │ ├── 文章下线处理 - │ └── 文章审核统计 - └── 评论审核 - ├── 待审核评论列表 - ├── 评论内容检查 (违规词、人身攻击) - ├── 评论来源验证 - ├── 批准显示/隐藏/删除 - ├── 评论者处罚 (如频繁违规) - ├── 评论审核统计 - └── 风险评论监控 -``` - ---- - -## 📊 菜单统计对比 - -| 指标 | 融合前 | 融合后 | 增长 | -| ------------ | ------ | ---------------- | ------- | -| **一级菜单** | 13 | 18 | +5 | -| **管理页面** | 100+ | 160+ | +60 | -| **管理角色** | 7 | 15 | +8 | -| **功能分组** | ~50 | ~85 | +35 | -| **权限维度** | 按模块 | 按模块+数据+按钮 | 细化3倍 | - ---- - -## 🔄 菜单的互联关系 - -``` -首页仪表板 -├─ 用户数据 ──→ 用户管理 ──→ 用户行为分析 -├─ 商品数据 ──→ 商品管理 ──→ 产品洞察 -├─ 订单数据 ──→ 订单管理 ──→ 行为分析(风险识别) -├─ 配送数据 ──→ 配送管理 ──→ 配送绩效 -├─ 商户数据 ──→ 商户管理 ──→ 商户分析 -├─ 营销数据 ──→ 营销管理 ──→ 营销ROI分析 -├─ 财务数据 ──→ 财务管理 ──→ 数据分析(财务看板) -└─ 审核数据 ──→ 审核管理 ──→ 审核统计分析 - -数据分析菜单 ←── 所有菜单都可以跳转到数据分析查看对应数据 - -审核管理菜单 ←── 待审核项提醒 来自 财务/商户/用户/内容 -``` - ---- - -**相关文档**: 更多详情见 [ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md](ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md) diff --git a/ADMIN_SOLUTION_EXECUTIVE_SUMMARY.md b/ADMIN_SOLUTION_EXECUTIVE_SUMMARY.md deleted file mode 100644 index df0c90f1..00000000 --- a/ADMIN_SOLUTION_EXECUTIVE_SUMMARY.md +++ /dev/null @@ -1,565 +0,0 @@ -# Admin管理系统融合方案 - 执行总结 - -> 🎯 为你的mall项目设计的完整Admin管理端融合方案 - -**文档时间**: 2026年2月4日 -**版本**: v1.0 -**状态**: ✅ 已完成分析和文档化 - ---- - -## 📋 你提出的问题 - -> "结合我这个admin端的功能以及任务;你查看一下analytics端、consumer端、delivery端、merchant端,这些端的功能和任务有哪些是可以融合进我的这个admin端的?综合这几个端,我的这个admin端还应该设计哪些权限和角色?现在我的这个admin端的想法就是融合其他几个端的关于管理方面的功能全部融合进我的这个admin端里面,将很多的端的功能和任务融合进admin端里面,然后划分不同的权限和角色,然后根据权限和角色选择性展示不同的页面。" - ---- - -## 💡 我做了什么 - -我对你的四个业务端进行了全面的功能分析,识别出可融合进admin端的**60+条**管理功能,设计了**15个**新的管理角色和权限体系,提出了从13个菜单扩展到18个菜单的完整方案,并提供了详细的15周实施路线图。 - ---- - -## 📊 核心发现 - -### 1. 四端的管理功能融合潜力 - -#### Analytics数据分析端 ✅ - -**关键管理功能**: 8条 - -- 数据看板管理 -- 报表模板库 -- 定时报表配置 -- 数据权限管理 -- 导出权限控制 -- 异常告警配置 -- 对标管理 -- 报表审计日志 - -💡 **融合价值**: 让各部门经理能在一个地方配置和查看自己的KPI看板 - ---- - -#### Consumer消费者端 ✅ - -**关键管理功能**: 12条 - -- 用户行为分析(浏览、收藏、购物车、搜索、路径) -- 订单风险识别(虚假订单、高风险用户、黑名单) -- 大额采购预警 -- 异常退货分析 -- 恶意评价识别 -- 退款审核管理(待审核、自动规则、审批流、拒绝、统计、物流追踪) -- 支付方式配置 -- 物流对接管理 -- 地址库维护 -- 钱包资金监管 -- 消息模板管理 -- 用户黑名单管理 - -💡 **融合价值**: 完整的风控和退款管理系统,保护平台资金和用户权益 - ---- - -#### Delivery配送端 ✅ - -**关键管理功能**: 12条 - -- 配送员管理(账号、等级、激励、状态) -- 自动和手动的智能任务分配 -- 绩效考核(指标、考核、工资计算) -- 配送员轨迹追踪 -- 配送员黑名单和申诉管理 -- 车辆管理和年检管理 -- 费用配置(按距离、时间、订单量分层) -- 配送结算和提现管理 -- 团队管理 -- 异常订单处理 -- 配送员激励 -- 申诉管理 - -💡 **融合价值**: 完整的配送运营管理系统(仅O2O或自建配送模式) - ---- - -#### Merchant商户端 ✅ - -**关键管理功能**: 11条 - -- 多商户管理 -- 商户入驻审核(资质、营业执照、身份、保证金) -- 商户分级体系(根据销售额、评分、投诉) -- 商户保证金管理(收取、冻结、扣罚) -- 商户佣金设置(按等级、分类、自动扣除) -- 商户提现管理 -- 商户经营数据分析 -- 商户违规处理(罚款、限流、下架、封禁) -- 商户店铺装修配置 -- 商户营销工具权限 -- 商户沟通和政策通知 - -💡 **融合价值**: 完整的平台商户管理系统(仅平台模式B2B2C) - ---- - -### 2. 融合后的新系统架构 - -#### 菜单数量升级 - -``` -融合前: 13个菜单 (100+页面) -融合后: 18个菜单 (160+页面) ← +5个新菜单,+60页面 -``` - -#### 5个新增菜单 - -| 菜单 | 来源 | 页数 | 适用场景 | -| ----------- | --------- | ---- | --------------- | -| 📈 数据分析 | Analytics | 12 | 所有场景 | -| 🚚 配送管理 | Delivery | 25 | O2O或自建配送 | -| 🏪 商户管理 | Merchant | 22 | 平台模式(B2B2C) | -| 📊 行为分析 | Consumer | 17 | 所有场景 | -| ⚖️ 审核管理 | 多个端 | 16 | 所有场景 | - -**合计**: +5个菜单,共92页新管理页面 - ---- - -### 3. 权限和角色体系设计 - -#### 当前状况 - -``` -7个角色: -├── 超级管理员 -├── 商品运营 -├── 订单管理员 -├── 营销专员 -├── 客服主管 -├── 财务人员 -└── 数据分析师 -``` - -#### 推荐升级到15个角色 - -**管理层** (3个) - -- 🔑 超级管理员 - 所有权限 -- 📊 总经理 - 全景管理 -- 👥 运营副总 - 辅助决策 - -**运营经理** (6个) - 各功能模块负责人 - -- 👥 用户运营 -- 📦 商品运营 -- 📋 订单管理 -- 🎯 营销运营 -- 🚚 配送运营经理(仅O2O) -- 🏪 商户运营经理(仅平台) - -**执行专员** (4个) - 一线操作人员 - -- 💼 客服专员 -- 💰 财务专员 -- 📈 数据分析师 -- 🔍 审核专员 - -**专项角色** (2个) - 特殊功能 - -- 🎬 内容编辑 -- 🔧 系统维护员 - ---- - -### 4. 权限矩阵 - -#### 完整的权限隔离 - -``` -18个菜单 × 15个角色 = 270个权限点 - -特点: -✅ 每个角色只能访问相关的菜单 -✅ 菜单内的页面也要权限验证 -✅ 按钮级别的权限控制(修改/删除需要确认) -✅ 数据级别的权限隔离(商户运营只看自己商户的数据) -✅ 所有操作都有审计日志 -``` - -**示例**: 用户运营经理看到的菜单 - -``` -├── 首页(用户相关KPI) -├── 用户(完全访问) -├── 营销(仅用户相关部分) -├── 数据分析(用户和营销相关报表) -└── 行为分析(用户行为数据) -``` - -**示例**: 商户运营经理的数据隔离 - -``` -能看到: -├── 所有商户的基本信息 -├── 商户的销售数据 -├── 商户的违规记录 -└── 商户的提现申请 - -看不到: -├── 其他商户的内部合同 -├── 财务详细结算单(除了自己处理的) -└── 系统配置和权限管理 -``` - ---- - -## 📈 新增功能详解 - -### 菜单14: 📈 数据分析 - -**功能**: 统一的KPI看板和报表中心 - -**关键特性**: - -- ✅ 各角色定制化看板(总经理看全局KPI,用户运营看用户增长) -- ✅ 自动告警机制(当销售额下跌10%自动通知相关人) -- ✅ 定时报表发送(每天/周/月自动生成报表发送给管理层) -- ✅ 数据权限分级(财务只能看30天内数据,普通员工看不到敏感指标) - -**适用于**: 所有公司 - ---- - -### 菜单15: 🚚 配送管理 - -**功能**: 完整的配送员运营和成本管理系统 - -**关键特性**: - -- ✅ 智能任务分配(根据距离、工作量、驾驶员等级自动最优分配) -- ✅ 绩效挂钩薪资(送达时间、用户评分、投诉数直接影响工资) -- ✅ 实时轨迹追踪(防止虚假送达、重复刷单) -- ✅ 费用分层(按距离、时间段等配置不同的配送费) - -**页数**: 25页,6个功能分组 - -**适用于**: O2O平台或有自建配送体系的电商 - ---- - -### 菜单16: 🏪 商户管理 - -**功能**: 完整的多商户运营平台 - -**关键特性**: - -- ✅ 商户入驻审核(从申请→审核资质→审核保证金→激活) -- ✅ 动态佣金分级(好商户享受低佣金比例) -- ✅ 风险识别(自动检测违规商户) -- ✅ 财务清算(自动计算佣金、冻结、罚款、提现) - -**页数**: 22页,5个功能分组 - -**适用于**: 平台模式(B2B2C)的电商平台 - ---- - -### 菜单17: 📊 行为分析 - -**功能**: 用户行为追踪和风险识别 - -**关键特性**: - -- ✅ 用户行为追踪(用户看了什么、收藏了什么、为什么放弃购物车) -- ✅ 智能风控(AI识别虚假订单、高风险用户、恶意退货) -- ✅ 黑名单管理(自动冻结高风险用户) -- ✅ 退款审核(配置自动退款规则或多级审批) - -**页数**: 17页,3个功能分组 - -**适用于**: 所有公司 - ---- - -### 菜单18: ⚖️ 审核管理 - -**功能**: 统一的多维度审核中心 - -**关键特性**: - -- ✅ 财务审核(提现、发票、异常交易) -- ✅ 商户审核(入驻、资料修改、营销活动) -- ✅ 用户审核(申诉、账户异常、冻结申请) -- ✅ 内容审核(评价、反馈、文章、评论) - -**页数**: 16页,4个功能分组 - -**适用于**: 所有公司 - ---- - -## 🔐 权限体系的核心原则 - -### 三层权限隔离 - -``` -第1层 - 菜单级权限: -┌─────────────────────┐ -│ Admin管理系统 │ -├─────────────────────┤ -│ ☑️ 首页 │ -│ ☑️ 用户 │ -│ ☑️ 商品 │ -│ ☑️ 订单 │ -│ ☑️ 营销 │ -│ ☐ 分销 (无权限) │ -│ ☑️ 客服 │ -│ ☐ 财务 (无权限) │ -│ ☑️ 数据分析 │ -│ ☑️ 行为分析 │ -└─────────────────────┘ -用户运营只能看到能看的菜单 - -第2层 - 页面级权限: -某个菜单内,还要检查是否有权限访问该页面 -比如"数据分析"菜单中: - ✅ 用户可以访问"看板配置"页面 - ✅ 用户可以访问"报表模板"页面 - ❌ 用户无法访问"数据权限"页面(仅管理员) - -第3层 - 数据级权限: -即使可以访问页面,查询的数据也要过滤 -比如"商户运营"看商户列表: - - SQL会自动加上: WHERE merchant_id IN (允许的商户列表) - - 商户A运营只能看商户A的数据 - - 即使黑客破解了URL,也看不到其他商户数据 -``` - ---- - -## 🎯 首页看板的动态化 - -现在和融合后的对比: - -**融合前**: 所有人看到同一个首页 - -**融合后**: 每个角色看到定制化的首页 - -``` -总经理看到的首页: -┌──────────────────────────┐ -│ 📊 全局KPI │ -├──────────────────────────┤ -│ 今日销售额: ¥125,000 │ -│ 今日订单数: 2,456 │ -│ 新用户数: 128 │ -│ 配送完成率: 98.5% │ -├──────────────────────────┤ -│ 📈 今日销售趋势图 │ -│ 📈 7日销售对标 │ -│ ⚠️ 异常告警(3条) │ -│ 🔔 待处理工作(12条) │ -└──────────────────────────┘ - -用户运营看到的首页: -┌──────────────────────────┐ -│ 👥 用户相关KPI │ -├──────────────────────────┤ -│ 今日新用户: 128 │ -│ 用户活跃度: 42.3% │ -│ 用户留存率: 68.9% │ -│ 平均客单价: ¥523 │ -├──────────────────────────┤ -│ 📈 新用户增长趋势 │ -│ 📈 用户分级分布 │ -│ 📈 用户来源分析 │ -│ 🎯 营销活动效果 │ -└──────────────────────────┘ -``` - ---- - -## 📊 实施成本和时间 - -### 人力成本 - -- 数据库设计师: 1人 × 2周 -- 后端工程师: 2人 × 15周 -- 前端工程师: 2人 × 15周 -- 测试工程师: 1人 × 6周 -- 产品经理: 1人 × 15周 -- **总人月**: ~11人月 - -### 时间表 - -``` -第 1-2 周 | Phase 1 技术基础建设 -第 2-3 周 | Phase 2 菜单和首页重构 -第 4-5 周 | Phase 3 数据分析菜单 -第 6-8 周 | Phase 3 配送管理菜单(仅O2O) -第 9-10周 | Phase 3 商户管理菜单(仅平台) -第11周 | Phase 3 行为分析菜单 -第12周 | Phase 3 审核管理菜单 -第13-14周 | Phase 4 验收和优化 -第15周 | Phase 5 上线和运维 - -总计: 15周 (约3.5个月) -``` - -### 成本节省 - -| 项目 | 融合前 | 融合后 | 节省 | -| ------------------ | -------------- | ------- | -------- | -| 管理系统维护工作量 | 高 | 低 | 30-40% | -| 功能重复开发 | 多次 | 1次 | 大量节省 | -| 权限管理复杂度 | 分散 | 集中 | 降低50% | -| 员工学习成本 | 需要学多个系统 | 1个系统 | 降低60% | - ---- - -## ✅ 你的需求满足情况 - -| 需求 | 满足度 | 说明 | -| -------------------- | ------- | ------------------------------ | -| 融合analytics功能 | ✅ 100% | 新增"数据分析"菜单 | -| 融合consumer功能 | ✅ 100% | 新增"行为分析"菜单 | -| 融合delivery功能 | ✅ 100% | 新增"配送管理"菜单(仅O2O) | -| 融合merchant功能 | ✅ 100% | 新增"商户管理"菜单(仅平台) | -| 设计新的权限体系 | ✅ 100% | 15个角色,270个权限点 | -| 设计新的角色体系 | ✅ 100% | 从7个升级到15个角色 | -| 根据权限展示不同页面 | ✅ 100% | 三层权限隔离(菜单/页面/数据) | -| 管理方面功能融合 | ✅ 100% | 60+条管理功能融合 | - ---- - -## 📁 生成的文档 - -你现在拥有4份完整的分析和实施文档: - -1. **[ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md](ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md)** (5000+字) - - 完整的四端功能分析 - - 详细的融合方案 - - 完整的15角色权限设计 - - 前端实现架构 - - 数据权限设计 - -2. **[ADMIN_INTEGRATION_QUICK_REFERENCE.md](ADMIN_INTEGRATION_QUICK_REFERENCE.md)** (2000+字) - - 快速参考指南 - - 15个角色速查表 - - 5个新菜单总结 - - 权限矩阵速查 - - 常见问题FAQ - -3. **[ADMIN_MENU_STRUCTURE_COMPARISON.md](ADMIN_MENU_STRUCTURE_COMPARISON.md)** (3000+字) - - 菜单进化前后对照 - - 5个新菜单的完整树形结构 - - 100+页面的详细配置 - - 菜单互联关系图 - -4. **[ADMIN_IMPLEMENTATION_CHECKLIST.md](ADMIN_IMPLEMENTATION_CHECKLIST.md)** (2500+字) - - 15周完整的实施检查清单 - - Phase 0-5的详细任务 - - 甘特图和时间表 - - 成功指标和验收标准 - -5. **[ADMIN_DOCS_INDEX.md](ADMIN_DOCS_INDEX.md)** - 文档导航和索引 - ---- - -## 🎬 建议的下一步 - -### 立即行动(今天) - -1. [ ] 你阅读 [ADMIN_INTEGRATION_QUICK_REFERENCE.md](ADMIN_INTEGRATION_QUICK_REFERENCE.md) (5分钟快速了解) -2. [ ] 与团队讨论方案的可行性 -3. [ ] 决策是否采纳 - -### 本周内 - -1. [ ] 详细评审完整分析 [ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md](ADMIN_INTEGRATION_COMPREHENSIVE_ANALYSIS.md) -2. [ ] 确认15个角色是否与你的组织结构匹配 -3. [ ] 确认是否需要调整(比如菜单名称、合并某些菜单等) - -### 下周 - -1. [ ] 组建项目团队(后端2人、前端2人、产品1人、QA1人) -2. [ ] 启动Phase 1技术基础建设 -3. [ ] 确定上线时间(建议15周后) - ---- - -## 💬 常见问题 - -**Q: 为什么需要15个角色而不是更多/更少?** - -A: 这是基于功能模块和企业阶层的平衡。15个角色涵盖了大多数电商企业的组织结构。你可以根据实际情况删除(如没有配送功能就删除配送运营经理)或新增(如需要地区经理就增加)。 - ---- - -**Q: 我们是传统B2C,不是平台模式,需要所有菜单吗?** - -A: 不需要。如果你是: - -- B2C自营: 删除"商户管理"菜单 -- 不做O2O配送: 删除"配送管理"菜单 -- 保留核心的"数据分析"、"行为分析"、"审核管理"菜单 - ---- - -**Q: 实施这个方案会影响现有系统吗?** - -A: 不会。这是一个"加法",在现有13个菜单的基础上加5个新菜单。现有功能保持不变。 - ---- - -**Q: 权限系统会不会很复杂?** - -A: 我们采用了"数据驱动"的权限设计。所有权限配置都在数据库中,不需要代码改动。添加新角色只需在数据库中插入记录即可。 - ---- - -**Q: 15周的时间表可以压缩吗?** - -A: 可以,但会影响质量。建议的优化方案: - -- 如果只需要"数据分析"菜单: 压缩到8周 -- 如果并行开发所有菜单: 可能需要更多人手 -- 不建议低于12周,否则会留下太多Bug - ---- - -## 🏆 预期收益总结 - -| 收益维度 | 预期收益 | -| -------------- | ------------------------------------- | -| **运营效率** | 管理功能集中化,节省员工40%的切换时间 | -| **数据安全** | 完整的权限隔离,数据泄露风险降低90% | -| **系统维护** | 统一平台,维护成本降低50% | -| **新功能速度** | 在权限框架上新增功能,开发速度提升3倍 | -| **员工体验** | 学习1个系统而不是5个,满意度提升 | -| **业务洞察** | 统一的数据看板,决策速度提升50% | - ---- - -## ✨ 最后的话 - -这个融合方案的核心思想是:**将分散在多个端的管理功能集中到一个统一的平台,通过完善的权限系统确保每个人只能看到和操作自己权限范围内的内容**。 - -不仅如此,这个方案也为你的未来扩展奠定了基础。当你需要添加新的管理功能时,只需: - -1. 在权限表中定义新权限 -2. 在菜单树中添加新菜单项 -3. 开发新的页面/API -4. 分配权限给相应角色 - -再也不用担心权限管理的混乱了。 - ---- - -**方案完成日期**: 2026年2月4日 -**总投入**: 4份分析文档 + 7000+行文本 + 50+张表格和图表 -**质量等级**: ⭐⭐⭐⭐⭐ 企业级方案 -**下一步**: 评审 → 采纳 → 实施 → 上线 - -祝你的Admin管理系统升级顺利!🚀 diff --git a/ADMIN_SYSTEM_FUNCTIONAL_OVERVIEW.md b/ADMIN_SYSTEM_FUNCTIONAL_OVERVIEW.md deleted file mode 100644 index bd9a43ec..00000000 --- a/ADMIN_SYSTEM_FUNCTIONAL_OVERVIEW.md +++ /dev/null @@ -1,913 +0,0 @@ -# Admin管理系统功能体系说明文档 - -## 📋 概览 - -这个Admin管理系统是一个完整的**电商运营管理平台**,基于CRMEB v5标准版架构。系统采用**13个一级菜单 + 多级分组 + 100+ 业务页面**的架构,覆盖从商品、订单、用户、营销、财务到系统维护的全套运营功能。 - -**系统定位**: 服务于商城运营方的后台管理系统,控制商城的业务数据、运营策略和系统配置。 - ---- - -## 🎯 系统核心价值 - -| 维度 | 说明 | -| ------------ | ---------------------------------------------------------- | -| **控制范围** | 商品库存、订单状态、用户权益、营销活动、财务流水、系统配置 | -| **用户对象** | 商城运营人员、财务人员、市场人员、客服人员、超级管理员 | -| **核心功能** | 商品管理、订单处理、用户运营、营销活动、财务结算、系统维护 | -| **数据驱动** | 统计分析、趋势报表、KPI追踪、业务洞察 | -| **业务闭环** | 商品→订单→用户→营销→财务→反馈 | - ---- - -## 📦 13个一级菜单体系 - -### 1️⃣ **首页 (HOME)** - 运营驾驶舱 - -**作用**: 提供全局业务概览和快速操作入口 - -**关键页面**: - -- 主页/仪表板 - KPI概览、近期业务指标、待办任务 - -**数据看板包含**: - -- 今日销售额、订单数量、新用户数 -- 7日销售趋势、订单转化率 -- 实时库存预警、异常订单提醒 -- 快速跳转到热点功能 - ---- - -### 2️⃣ **用户 (USER)** - 会员生态管理 - -**职责**: 管理商城所有用户资料、分组、标签、等级体系 - -**功能分组** (4个): - -#### 📊 用户统计 - -- 用户总数、活跃度、留存率、消费金额分布 -- 用户获取渠道分析、付款用户占比 - -#### 👥 用户管理 - -- 查看/编辑用户基本信息(昵称、手机、头像等) -- 调整用户状态(正常/禁用/黑名单) -- 查看用户消费历史、积分、等级 -- 批量操作:导出、修改分组标签等 - -#### 🏷️ 用户分组 - -- 创建自定义用户分组(如"VIP用户"、"沉睡用户") -- 按分组推送营销活动、定向优惠 -- 用于精准营销的用户划分 - -#### 🎫 用户标签 - -- 创建/编辑用户标签(如"高消费"、"新客"、"促销敏感") -- 标签自动或手动关联用户 -- 支持标签的营销自动化 - -#### 📈 用户等级 - -- 设定等级权益(折扣、积分倍数、返现等) -- 配置升级条件(消费金额、订单数等) -- 管理等级对应的特权 - -**核心控制**: 通过分组、标签、等级进行**精准用户分层运营** - ---- - -### 3️⃣ **商品 (PRODUCT)** - 商城商品库管理 - -**职责**: 管理商城所有商品、库存、分类、属性 - -**功能分组** (8个): - -#### 📊 商品统计 - -- 商品总数、分类分布、库存统计 -- 销售排行、搜索热词、待上架商品数 -- 商品评分、好评率分析 - -#### 📦 商品管理 - -- 创建/编辑/下架商品 -- 编辑商品详情(图文、参数、规格) -- 管理商品SKU(库存、价格、图片) -- 商品上下架、批量操作 -- **保持活动**: 支持预留会员价、会员专享 - -#### 🏷️ 商品分类 - -- 创建/编辑商品分类体系(2-3级) -- 设定分类SEO、排序、展示位置 -- 管理分类对应的属性模板 - -#### ⚙️ 商品规格 - -- 创建规格组(如"颜色"、"尺码") -- 定义规格值及对应的库存/价格 -- 规格与SKU的对应关系 - -#### 📝 商品参数 - -- 设定商品参数项(如"材质"、"产地") -- 参数与商品分类的关联 -- 用于商品详情页展示和搜索筛选 - -#### 🎯 商品标签 - -- 创建商品标签(如"热销"、"新品"、"打折") -- 标签与营销活动的关联 -- 用于店铺前台的商品筛选 - -#### 🛡️ 商品保障 - -- 创建售后保障项(如"7天退货"、"质量保证") -- 关联商品到保障项 -- 展示在商品详情页提升信心 - -#### ⭐ 商品评论 - -- 查看/回复用户评论 -- 评论审核、删除管理 -- 评论统计分析(好评率、内容热词) - -**核心控制**: 通过SKU库存、价格、分类进行**商品生命周期管理** - ---- - -### 4️⃣ **订单 (ORDER)** - 交易流程管理 - -**职责**: 管理所有订单的全生命周期(下单→发货→收货→售后) - -**功能分组** (5个): - -#### 📊 订单统计 - -- 订单总数、GMV、转化率 -- 订单状态分布(待支付、待发货、已发货等) -- 平均订单金额、人均消费 -- 订单来源分析 - -#### 📋 订单管理 - -- 查看订单详情(商品、收货地址、金额、状态) -- 订单操作:发货、打印面单、修改收货地址 -- 订单备注、备用货物 -- 订单导出、批量打印 - -#### 🔄 售后订单(退货/售后) - -- 查看退货/退款申请 -- 退货审核、退款处理 -- 售后物流跟踪 -- 售后统计(退率、原因分析) - -#### 🏪 收银订单 - -- 线下POS收银界面 -- 快速创建订单、支付操作 -- 支持二维码扫码支付 -- 收银日结统计 - -#### ✅ 核销记录 - -- 核销码生成与管理 -- 核销订单查询 -- 支持门店/人员的核销统计 - -#### ⚙️ 订单配置 - -- 配置订单自动确认时间 -- 配置退货/售后政策 -- 设定订单超时时限 - -**核心控制**: 通过订单状态流转、发货、售后处理控制**收入确认和用户体验** - ---- - -### 5️⃣ **营销 (MARKETING)** - 多维度运营工具库 - -**职责**: 管理12类营销活动,驱动用户消费、提升复购 - -**11个功能分组、50+ 管理页面**: - -#### 🎫 优惠券 (2个页面) - -- 优惠券创建:金额/折扣、使用条件、有效期 -- 优惠券发放:定向用户、分享领取、后台发放 -- 用户领取记录:追踪使用情况、效果分析 - -#### 💰 积分管理 (5个页面) - -- **积分统计**: 用户总积分、增减趋势 -- **积分商品**: 创建积分兑换商品池 -- **积分订单**: 查看用户用积分下单的订单 -- **积分记录**: 积分增减明细、来源分析 -- **积分配置**: 消费返积分比例、积分过期策略 - -#### 🎲 抽奖管理 (2个页面) - -- 抽奖列表:创建/编辑/删除抽奖活动 -- 抽奖配置:奖品设置、中奖概率、用户参与限制 -- 中奖记录查询、奖品发放管理 - -#### 🔪 砍价管理 (2个页面) - -- 砍价商品:选择参与砍价的商品 -- 砍价列表:查看砍价活动进展、用户参与情况 -- 手动调价、砍价完成后的订单处理 - -#### 👥 拼团管理 (3个页面) - -- 拼团商品:选择参与拼团的商品、设定拼团价 -- 拼团列表:查看所有拼团活动 -- 拼团统计:人数、成功率、营收分析 - -#### ⚡ 秒杀管理 (3个页面) - -- 秒杀列表:创建/管理秒杀活动 -- 秒杀商品:设定秒杀价、库存、时间段 -- 秒杀配置:全局秒杀规则、展示设置 - -#### 👑 付费会员 (5个页面) - -- **会员类型**: 创建会员等级(月卡、年卡等)、设定价格 -- **会员权益**: 定义权益项(额外折扣、积分倍数、免运费等) -- **卡密会员**: 生成/导出卡密兑换码 -- **会员记录**: 用户购买会员、续费、退款记录 -- **会员配置**: 会员过期策略、自动续费设置 - -#### 🎬 直播管理 (3个页面) - -- 直播间管理:创建/编辑/关闭直播间 -- 直播商品管理:直播间绑定的商品列表 -- 主播管理:主播账号、权限、直播统计 - -#### 💳 用户充值 (2个页面) - -- 金额设置:配置充值金额方案(如充100送10) -- 充值配置:充值赠送比例、自动转入余额设置 - -#### ✍️ 每日签到 (2个页面) - -- 签到配置:配置签到奖励梯度(第1-7天) -- 签到奖励:设定每天的奖励(积分/余额/优惠券) - -#### 🔗 其他营销 (2个页面) - -- **渠道码**: 生成推广二维码、追踪新用户来源 -- **新人礼**: 创建新用户首购优惠、金额/时间限制 - -**核心控制**: 通过多维度营销活动驱动**交易额、复购率、用户黏性** - ---- - -### 6️⃣ **分销 (DISTRIBUTION)** - 分销体系管理 - -**职责**: 管理分销员、分销订单、佣金体系 - -**功能分组** (1个): - -#### 📊 分销统计 - -- 分销总金额、分销员数量、佣金总额 -- 分销排行、佣金排行 - -#### 👤 分销员列表 - -- 分销员信息查看:等级、下线数、销售额 -- 分销员管理:升级、降级、冻结账户 -- 分销员提现管理:提现申请、审核、到账确认 - -#### ⚙️ 分销设置 - -- 配置分销佣金体系(1-3级佣金比例) -- 设定分销员入驻要求、升级条件 -- 配置佣金计算规则、提现限制 - -**核心控制**: 通过分销商体系**扩大销售覆盖** - ---- - -### 7️⃣ **客服 (KEFU)** - 客户服务管理 - -**职责**: 管理客服团队、用户沟通、反馈处理 - -**功能分组** (1个): - -#### 👥 客服列表 - -- 客服账号管理:状态、在线/离线状态 -- 客服工作量统计 - -#### 💬 客服话术 - -- 创建/编辑快捷话术库 -- 按分类组织话术(订单、退货、投诉等) - -#### 💌 用户留言 - -- 查看用户反馈/投诉 -- 分配给客服、标记为已处理 -- 反馈统计分析 - -#### 🤖 自动回复 - -- 配置触发词→自动回复规则 -- 自动回复模板管理 - -#### ⚙️ 客服配置 - -- 配置客服工作时间、休息日 -- 配置消息通知策略 - -**核心控制**: 通过客服系统提升**用户满意度和留存** - ---- - -### 8️⃣ **财务 (FINANCE)** - 资金流水和结算管理 - -**职责**: 监控所有资金流动、订单结算、佣金提现、财务报表 - -**功能分组** (5个): - -#### 📊 交易统计 - -- 销售额、退款金额、净收入 -- 支付方式分析(支付宝、微信、余额等) -- 销售趋势图表、日均GMV - -#### 💰 财务操作 - -**提现申请**: - -- 查看用户/分销员提现申请 -- 审核批准/驳回、生成财务凭证 -- 支持银行转账、第三方支付提现 - -**发票管理**: - -- 用户发票申请、开票记录 -- 发票模板、自动开票规则 - -#### 📋 财务记录 (3个子功能) - -**充值记录**: - -- 用户充值交易明细 -- 支付状态、充值方式、到账情况 - -**资金流水**: - -- 完整资金进出流水账 -- 支持按日期、交易类型、用户筛选 - -**账单记录**: - -- 订单结算单、账单汇总 -- 按周期生成对账单 - -#### 🎁 佣金记录 - -- 分销员佣金统计 -- 佣金明细、提现状态 -- 佣金发放历史 - -#### 💳 余额记录 - -- 商户钱包余额统计:当前、累计、消耗 -- 余额明细查询 -- 余额来源分析(充值、返现、积分兑换) - -**核心控制**: 通过财务管理**确保资金安全、提升财务透明度** - ---- - -### 9️⃣ **内容 (CMS)** - 内容管理系统 - -**职责**: 管理商城富文本内容(文章、帮助文档等) - -**功能分组** (1个): - -#### 📄 文章管理 - -- 创建/编辑文章:标题、图片、富文本内容 -- 文章分类、标签、SEO优化 -- 发布/草稿/下架管理 -- 阅读统计、点赞评论 - -#### 📁 文章分类 - -- 创建文章分类体系 -- 分类SEO、排序 - -**核心控制**: 管理**商城帮助文档、品牌文案、宣传内容** - ---- - -### 🔟 **装修 (DECORATION)** - 前端页面装修 - -**职责**: 通过拖拽或配置化管理商城前端页面样式和内容 - -**功能分组** (1个): - -#### 🎨 装修管理 (7个页面) - -**首页装修**: - -- 拖拽配置首页轮播图、广告、商品推荐位 -- 配置首页各区域的展示商品、标题文案 - -**商品分类装修**: - -- 配置分类页的展示商品、排序 - -**个人中心装修**: - -- 配置用户中心页的菜单项、快捷功能 - -**数据配置**: - -- 配置数据来源(如"热销商品"自动加载销售TOP10) - -**主题风格**: - -- 选择全局主题色、字体、圆角等 -- 支持多主题预设 - -**素材管理**: - -- 上传/删除图片、视频素材库 -- 素材搜索、分类 - -**链接管理**: - -- 配置导航链接、页面跳转规则 -- 支持链接到商品、分类、外部页面 - -**核心控制**: 通过装修系统**实现无代码化的页面管理**,快速调整前端展示 - ---- - -### 1️⃣1️⃣ **应用 (APP)** - 第三方应用/模块管理 - -**职责**: 管理安装的第三方应用和功能模块 - -**功能分组** (1个): - -#### 📊 应用统计 - -- 已安装应用数量、使用情况 -- 应用版本、更新日志 - -#### 📦 应用列表 - -- 浏览可用应用市场 -- 安装/卸载/启用应用 -- 应用设置 - -**核心控制**: 扩展系统功能,支持**插件化架构** - ---- - -### 1️⃣2️⃣ **设置 (SETTING)** - 系统配置管理 - -**职责**: 配置系统全局参数和权限 - -**功能分组** (1个): - -#### ⚙️ 系统配置 - -- 商城基本信息:名称、logo、联系方式 -- 支付配置:支付宝、微信支付、余额支付参数 -- 物流配置:默认快递公司 -- 邮件/短信配置:通知模板、发送账号 - -#### 👨‍💼 管理员管理 - -- 创建/编辑管理员账号 -- 分配角色和权限 -- 管理员登录日志 - -#### 🔐 角色管理 - -- 创建自定义角色(如"订单管理员"、"客服主管") -- 为角色分配权限(按功能模块) -- 角色与管理员的绑定 - -**核心控制**: 通过系统配置和权限管理**保障系统安全和运营规范** - ---- - -### 1️⃣3️⃣ **维护 (MAINTAIN)** - 技术维护和系统工具 - -**职责**: 系统的技术维护、缓存、日志、数据备份等 - -**功能分组** (7个): - -#### 🛠️ 开发配置 (6个页面) - -**配置分类**: - -- 创建/编辑配置分类项(如"商城名称"、"运费模板") -- 用于系统全局参数的管理 - -**组合数据**: - -- 预定义数据组(如"配送方式"、"发票类型") - -**定时任务**: - -- 创建/编辑定时任务 -- 任务调度、执行日志 - -**权限维护**: - -- 管理系统权限项 -- 权限与功能的对应关系 - -**模块配置**: - -- 启用/禁用功能模块 -- 模块参数配置 - -**自定事件**: - -- 创建业务事件(如"订单完成"、"用户注册") -- 事件触发的自动化规则 - -#### 🔒 安全维护 (3个页面) - -**刷新缓存**: - -- 清除系统缓存、数据库缓存 -- 重新预热热点数据 - -**系统日志**: - -- 查看系统运行日志 -- 管理员操作日志、错误日志 - -**在线升级**: - -- 检查系统版本更新 -- 执行系统升级 - -#### 📊 数据维护 (3个页面) - -**物流公司**: - -- 配置快递公司、API接口 -- 面单模板、物流查询配置 - -**城市数据**: - -- 维护国内城市数据库 -- 用于订单收货地址、物流选择 - -**清除数据**: - -- 清除过期订单数据、日志 -- 数据库优化 - -#### 🌐 对外接口 (1个页面) - -**账号管理**: - -- 第三方应用的API Key管理 -- 权限分配、调用统计 - -#### 🌍 语言设置 (4个页面) - -**语言列表**: - -- 配置系统支持的语言(中文、英文、日文等) - -**语言详情**: - -- 翻译文案编辑 - -**地区列表**: - -- 配置地理区域 - -**翻译配置**: - -- 自动翻译规则、翻译API配置 - -#### 🧰 开发工具 (4个页面) - -**数据库管理**: - -- 执行SQL查询、备份 -- 数据库优化、表结构查看 - -**文件管理**: - -- 文件上传/下载目录管理 -- 磁盘空间统计 - -**接口管理**: - -- API列表、文档生成 -- API调用日志、性能分析 - -**数据字典**: - -- 系统数据字典维护 -- 用于代码中的常量值定义 - -#### 📱 系统信息 (1个页面) - -**系统信息**: - -- 查看系统运行信息(PHP版本、数据库版本、服务器配置) -- 系统诊断、性能指标 - -**核心控制**: 通过维护系统**确保平台稳定运行、数据安全** - ---- - -## 📊 管理功能矩阵 - -| 功能域 | 核心实体 | 主要操作 | 关键指标 | 权限控制 | -| -------- | --------------------------- | ---------------------------- | ---------------------- | -------------- | -| **用户** | 会员、分组、标签、等级 | 增删改查、分组管理、标签分类 | 用户数、活跃度、消费额 | 用户管理权限 | -| **商品** | 商品、SKU、分类、规格、参数 | 上架、定价、库存、分类 | 商品数、销售额、库存 | 商品管理权限 | -| **订单** | 订单、物流、售后、支付 | 发货、收货、售后、退款 | 订单数、GMV、转化率 | 订单管理权限 | -| **营销** | 优惠券、积分、活动、会员 | 创建活动、发放优惠、统计效果 | 参与度、转化率、ROI | 营销管理权限 | -| **财务** | 订单款、提现、佣金、余额 | 结算、提现审核、报表 | 营收、成本、利润 | 财务查看权限 | -| **内容** | 文章、分类、SEO | 发布、编辑、下架 | 阅读量、SEO排名 | 内容发布权限 | -| **装修** | 页面、组件、素材 | 拖拽配置、换肤 | 页面PV、点击率 | 页面装修权限 | -| **客服** | 客服账号、消息、反馈 | 分配工单、处理反馈 | 响应时间、满意度 | 客服管理权限 | -| **系统** | 管理员、角色、权限、配置 | 配置参数、分配权限 | 系统可用性、安全 | 超级管理员权限 | - ---- - -## 🔄 业务流程及数据流转 - -### 销售流程 - -``` -商品管理 → 库存配置 → 营销活动 → 用户下单 → 订单处理 → 财务结算 -``` - -1. **商品侧**: 运营人员在"商品"模块创建商品、设定SKU库存和价格 -2. **营销侧**: 运营人员在"营销"模块创建优惠券、秒杀、拼团等活动吸引用户 -3. **用户侧**: 通过"用户"模块进行分组、标签、等级管理,精准营销 -4. **订单侧**: 用户下单后,订单自动流入"订单"模块,客服人员完成发货、售后 -5. **财务侧**: 订单完成后自动在"财务"模块生成结算单、佣金记录 - -### 完整业务链条示例 - -**场景**: 运营秒杀活动 - -1. **商品准备** (商品模块) - - 编辑商品详情、上传图片、设定SKU库存 - -2. **营销配置** (营销模块) - - 创建秒杀活动,选定秒杀商品 - - 设定秒杀价格、库存、时间段 - -3. **用户准备** (用户模块) - - 识别高价值用户、秒杀敏感用户 - - 标签筛选用户做精准推送 - -4. **用户下单** (用户端) - - 用户看到秒杀商品,下单支付 - -5. **订单处理** (订单模块) - - 客服确认订单、生成面单 - - 安排发货、更新物流状态 - - 用户收货后处理售后 - -6. **财务清算** (财务模块) - - 订单自动结算到商户账户 - - 积分返还、佣金计算、提现处理 - ---- - -## 📈 关键看板和决策数据 - -### 运营看板(首页仪表板) - -**实时KPI**: - -- 今日销售额、订单数、新用户数 -- 7日销售趋势图表 -- 实时库存预警(库存<10) -- 待处理订单数、待处理售后单数 - -### 商品看板(商品模块) - -**关键数据**: - -- 商品总数、分类分布 -- 库存统计(库存充足/不足/缺货) -- 销售排行(TOP10商品) -- 评价统计(平均分、好评率) - -### 订单看板(订单模块) - -**关键数据**: - -- 今日订单数、GMV -- 订单状态分布(待支付、待发货、已发货等) -- 人均订单金额 -- 退款率、售后率 - -### 用户看板(用户模块) - -**关键数据**: - -- 用户总数、日新增、月活 -- 用户分级分布(普通/VIP/超VIP) -- 消费金额分布、人均消费 -- 用户留存率、复购率 - -### 财务看板(财务模块) - -**关键数据**: - -- 累计收入、本月收入 -- 支出(退款、提现、成本) -- 净利润、利润率 -- 应收账款、应付账款 - -### 营销看板(营销模块) - -**关键数据**: - -- 活动参与度(优惠券使用率、活动参与人数) -- 活动ROI(活动成本 vs 带来的销售额) -- 优惠券转化率(领取vs使用) -- 积分商品热度(兑换次数) - ---- - -## 🔐 权限和角色设计 - -### 典型角色定义 - -#### 角色1: 超级管理员 - -- **权限**: 所有功能完全访问 -- **主要操作**: 系统配置、管理员管理、权限分配 - -#### 角色2: 商品运营 - -- **权限**: 商品、分类、规格、参数全部操作 -- **限制**: 不能访问财务、订单发货、系统配置 -- **主要操作**: 商品上下架、库存管理、分类管理 - -#### 角色3: 订单管理员 - -- **权限**: 订单、物流、售后操作 -- **限制**: 不能修改订单价格、不能查看财务 -- **主要操作**: 订单发货、售后审核、物流跟踪 - -#### 角色4: 营销专员 - -- **权限**: 所有营销功能、用户分组标签、内容发布 -- **限制**: 不能查看财务详情、不能修改系统配置 -- **主要操作**: 营销活动创建、用户运营、内容发布 - -#### 角色5: 客服主管 - -- **权限**: 客服账号、用户反馈、订单查询 -- **限制**: 只读权限、不能修改订单 -- **主要操作**: 工单分配、反馈处理、满意度统计 - -#### 角色6: 财务人员 - -- **权限**: 财务模块全部操作(交易统计、提现审核、账单) -- **限制**: 不能修改订单、不能修改商品价格 -- **主要操作**: 财务结算、提现审核、报表生成 - -#### 角色7: 数据分析师 - -- **权限**: 所有统计模块只读、报表查看 -- **限制**: 不能修改数据、不能操作业务 -- **主要操作**: 数据报表、趋势分析、KPI追踪 - ---- - -## 🎯 系统应该重点监控的指标 - -### 业务KPI (每日监控) - -#### 销售维度 - -- ✅ **日销售额 (GMV)**: 反映商城生意量 -- ✅ **订单数**: 反映交易频率 -- ✅ **人均订单金额**: 反映客单价 -- ✅ **转化率**: 访问→下单的转化 -- ✅ **退单率**: 订单的取消比例 - -#### 用户维度 - -- ✅ **新用户数**: 获客能力 -- ✅ **活跃用户数**: 用户粘性 -- ✅ **复购用户数 / 复购率**: 用户留存能力 -- ✅ **用户消费分布**: 高价值用户占比 - -#### 商品维度 - -- ✅ **库存预警数**: 及时补货 -- ✅ **销售排行**: 识别爆品 -- ✅ **滞销商品**: 及时处理 -- ✅ **好评率**: 商品质量监控 - -#### 营销维度 - -- ✅ **优惠券使用率**: 营销有效性 -- ✅ **活动ROI**: 成本与收益比 -- ✅ **参与度**: 活动吸引力 - -#### 财务维度 - -- ✅ **应收账款**: 资金风险 -- ✅ **提现审核周期**: 用户满意度 -- ✅ **佣金成本率**: 成本控制 -- ✅ **退款金额**: 问题识别 - -#### 客服维度 - -- ✅ **平均响应时间**: 服务质量 -- ✅ **问题解决率**: 有效性 -- ✅ **用户满意度**: 服务评价 - -### 系统指标 (每周监控) - -- 📊 **系统可用性**: 系统运行时间占比 -- ⚠️ **错误率**: API错误、页面异常 -- 🚀 **页面加载时间**: 用户体验 -- 💾 **数据库大小**: 存储空间使用 -- 🔒 **安全事件**: 异常登录、数据泄露 - ---- - -## 📱 设备和渠道覆盖 - -### Admin系统支持的运行环境 - -- **Web浏览器**: 桌面/笔记本电脑访问 -- **移动浏览器**: 手机/平板访问(响应式设计) -- **原生应用**: uni-app-x构建的iOS/Android应用 - -### 访问方式 - -1. **Web端**: 直接访问域名 `admin.yourshop.com` 或 `yourshop.com/admin` -2. **移动端**: 使用uni-app-x构建的App,离线支持 -3. **PC客户端**: 通过Electron或Native壳打包的桌面应用 - ---- - -## 🔌 与其他系统的集成点 - -### 关键集成 - -1. **Supabase数据库**: Admin的所有数据存储和查询 -2. **支付网关**: 订单支付、充值、提现处理(支付宝、微信) -3. **物流系统**: 面单打印、物流查询、自动揽收 -4. **短信/邮件系统**: 订单通知、营销推送 -5. **文件存储**: 商品图片、用户头像、素材库上传到云存储 -6. **报表引擎**: ECharts/其他可视化库生成报表图表 -7. **第三方API**: 翻译API、地理编码、数据分析等 - ---- - -## 📋 总结对照表 - -| 问题 | 答案 | -| --------------------- | -------------------------------------------------------------------- | -| **Admin端控制什么?** | 商城的商品、订单、用户、营销、财务、客服等全部业务领域 | -| **要看什么?** | 销售KPI、库存预警、订单状态、用户活跃度、营销效果、财务报表 | -| **核心价值是?** | 提供统一的后台运营平台,实现数据驱动的商城管理 | -| **主要使用者是?** | 商城运营、市场、财务、客服、超级管理员等角色 | -| **与C端的关系是?** | Admin是C端商城的后台,一对一的关系。Admin的配置直接影响C端展示和功能 | -| **重点功能是?** | 商品管理、订单处理、用户运营、营销活动、财务结算 | - ---- - -## 🚀 快速导航 - -- 📊 [查看所有功能列表](#13个一级菜单体系) -- 💡 [了解核心业务流程](#业务流程及数据流转) -- 📈 [监控关键指标](#系统应该重点监控的指标) -- 🔐 [配置权限和角色](#权限和角色设计) -- 🔧 [系统维护和配置](#系统配置管理) - ---- - -**文档版本**: 1.0 -**最后更新**: 2024年 -**相关文档**: - -- [ADMIN_STATUS_AND_TODO.md](ADMIN_STATUS_AND_TODO.md) - Admin开发进度 -- [ADMIN_FEATURES_AND_ROADMAP.md](ADMIN_FEATURES_AND_ROADMAP.md) - Admin功能规划 -- [DOCS_OVERVIEW.md](DOCS_OVERVIEW.md) - 全项目文档导航 diff --git a/_admin_missing_files.txt b/_admin_missing_files.txt deleted file mode 100644 index 9c039cad..00000000 --- a/_admin_missing_files.txt +++ /dev/null @@ -1,12 +0,0 @@ -order-management -product-classification -product-labels -product-management -product-parameters -product-protection -product-reviews -product-specifications -product-statistics -system-settings -user-management -user-statistics \ No newline at end of file diff --git a/_admin_missing_in_json.txt b/_admin_missing_in_json.txt deleted file mode 100644 index 87d5053d..00000000 --- a/_admin_missing_in_json.txt +++ /dev/null @@ -1,25 +0,0 @@ -design/index.backup -homePage/components/KpiMiniCard -homePage/index1 -marketing/index -order/aftersales-order/index -order/cashier-order/index -order/order-configuration/index -order/order-management/index -order/order-statistics/index -order/write-off-records/index -product/product-classification/index -product/product-label/index -product/product-management/index -product/product-param/index -product/product-protection/index -product/product-reviews/index -product/product-specifications/index -product/product-statistics/index -system/index -user/user-configuration/index -user/user-grouping/index -user/user-label/index -user/user-level/index -user/user-management/index -user/user-statistics/index \ No newline at end of file diff --git a/_admin_routes.txt b/_admin_routes.txt deleted file mode 100644 index fc5caaf1..00000000 --- a/_admin_routes.txt +++ /dev/null @@ -1,116 +0,0 @@ -article//index -article/category -article/create -article/edit -content//index -design//index -design/category -design/components -design/custom -design/homepage -design/index.backup -design/product -design/templates -homePage//index -homePage/components/KpiMiniCard -homePage/index1 -maintain/data/city-data -maintain/data/clear-data -maintain/data/logistics-company -maintain/dev-config/category -maintain/dev-config/combination-data -maintain/dev-config/cron-job -maintain/dev-config/custom-event -maintain/dev-config/module-config -maintain/dev-config/permission -maintain/dev-tools/api -maintain/dev-tools/codegen -maintain/dev-tools/database -maintain/dev-tools/data-dict -maintain/dev-tools/file -maintain/external/account -maintain/i18n/language-detail -maintain/i18n/language-list -maintain/i18n/region-list -maintain/i18n/translate-config -maintain/security/online-upgrade -maintain/security/refresh-cache -maintain/security/system-log -maintain/system-info -marketing//index -marketing/coupon/list -marketing/coupon/receive -marketing/groupbuy/goods -marketing/groupbuy/list -marketing/live/anchor -marketing/live/goods -marketing/live/room -marketing/lottery/config -marketing/lottery/list -marketing/member/card -marketing/member/config -marketing/member/record -marketing/member/rights -marketing/member/type -marketing/newcomer -marketing/points//index -marketing/points/config -marketing/points/goods -marketing/points/order -marketing/points/record -marketing/points/stats -marketing/recharge/amount -marketing/recharge/config -marketing/recharge/record -marketing/seckill/config -marketing/seckill/goods -marketing/seckill/list -marketing/signin/record -marketing/signin/rule -marketing-management -order/aftersales-order//index -order/cashier-order//index -order/order-configuration//index -order/order-management//index -order/order-statistics//index -order/write-off-records//index -product/product-classification//index -product/product-label//index -product/product-management//index -product/product-param//index -product/product-protection//index -product/product-reviews//index -product/product-specifications//index -product/product-statistics//index -service//index -service/autoReply -service/config -service/message -service/script -subscription/plan-management -subscription/user-subscriptions -system//index -system/agreement-settings -system/api/collect -system/api/logistics -system/api/pay -system/api/sms -system/api/storage -system/api/waybill -system/api/yht/config -system/api/yht/page -system/message-management -system/permission/admin-list -system/permission/permission-setting -system/permission/role -system/receipt-settings -system/shipping/courier -system/shipping/freight-template -system/shipping/pickup/points -system/shipping/pickup/verifiers -user/user-configuration//index -user/user-grouping//index -user/user-label//index -user/user-level//index -user/user-management//index -user/user-statistics//index diff --git a/ak/config.uts b/ak/config.uts index b72a2a2f..bab237e8 100644 --- a/ak/config.uts +++ b/ak/config.uts @@ -4,17 +4,20 @@ // IP: 192.168.1.62 // Kong HTTP Port: 8000 //自己的配置自己解开即可 -//export const SUPA_URL: string = 'http://192.168.1.61:18000' +// export const SUPA_URL: string = 'http://192.168.1.61:18000' +// export const SUPA_KEY: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlLTEiLCJpYXQiOjE3Njk2NzY0OTgsImV4cCI6MTkyNzM1NjQ5OH0.ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890' +//export const SUPA_URL: string = 'http://192.168.1.62:18000' //export const SUPA_KEY: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlLTEiLCJpYXQiOjE3Njk2NzY0OTgsImV4cCI6MTkyNzM1NjQ5OH0.ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890' -export const SUPA_URL: string = 'http://192.168.1.62:18000' -export const SUPA_KEY: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzczNjIxMTQzLCJleHAiOjE5MzEzMDExNDN9.gkYe875_vsdcdsKbhOTwwe2klkuMNj_UY45aq4zwuy0' -// export const SUPA_URL: string = 'http://192.168.1.63:18000' +// export const SUPA_URL: string = 'http://192.168.1.61:18000' // export const SUPA_KEY: string = 'eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJyb2xlIjogImFub24iLCAiaXNzIjogInN1cGFiYXNlIiwgImlhdCI6IDE3Njk4NDczMzQsICJleHAiOiAyMDg1MjA3MzM0fQ.js-2CS5_cUmf4iVv8aCmmx9iyFsQvLNDbt8YYOngeLU' +export const SUPA_URL: string = 'http://119.146.131.237:9126' +export const SUPA_KEY: string = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlLTEiLCJpYXQiOjE3Njk2NzY0OTgsImV4cCI6MTkyNzM1NjQ5OH0.ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890' + // WebSocket 实时连接(内网使用 ws:// 而非 wss://) // export const WS_URL: string = 'ws://192.168.1.61:18000/realtime/v1/websocket' -export const WS_URL: string = 'ws://192.168.1.62:18000/realtime/v1/websocket' -// export const WS_URL: string = 'ws://192.168.1.63:18000/realtime/v1/websocket' +//export const WS_URL: string = 'ws://192.168.1.62:18000/realtime/v1/websocket' +export const WS_URL: string = 'ws://192.168.1.61:18000/realtime/v1/websocket' // 推送服务地址(用于本地调试,可改为 http://:7301) export const PUSH_SERVER_URL: string = 'http://192.168.1.62:7301' diff --git a/check_tags.py b/check_tags.py deleted file mode 100644 index cc70e230..00000000 --- a/check_tags.py +++ /dev/null @@ -1,25 +0,0 @@ -import os - -def check_tags(file_path): - print(f"Checking {file_path}") - try: - content = open(file_path, 'r', encoding='utf-8').read() - tags = ['template', 'script', 'style', 'view', 'text', 'image', 'scroll-view'] - for tag in tags: - o = content.count(f'<{tag}') - c = content.count(f'') - if o != c: - print(f" [ERROR] {tag}: open={o}, close={c}") - else: - print(f" [OK] {tag}: {o}") - except Exception as e: - print(f" [ERROR] Failed to read: {e}") - -files = [ - r'd:\骅锋\mall\pages\mall\admin\order\order-statistics\index.uvue', - r'd:\骅锋\mall\pages\mall\admin\order\list.uvue', - r'd:\骅锋\mall\pages\mall\admin\order\order-configuration\index.uvue' -] - -for f in files: - check_tags(f) diff --git a/components/ArticleFormDrawer.vue b/components/ArticleFormDrawer.vue new file mode 100644 index 00000000..b97c9440 --- /dev/null +++ b/components/ArticleFormDrawer.vue @@ -0,0 +1,225 @@ + + + + + diff --git a/components/CategoryFormDrawer.vue b/components/CategoryFormDrawer.vue new file mode 100644 index 00000000..f3600baa --- /dev/null +++ b/components/CategoryFormDrawer.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/components/CommonPagination/CommonPagination.uvue b/components/CommonPagination/CommonPagination.uvue new file mode 100644 index 00000000..093b9f14 --- /dev/null +++ b/components/CommonPagination/CommonPagination.uvue @@ -0,0 +1,145 @@ + + + + + diff --git a/components/StatusSwitch.uvue b/components/StatusSwitch.uvue new file mode 100644 index 00000000..83de4f30 --- /dev/null +++ b/components/StatusSwitch.uvue @@ -0,0 +1,102 @@ + + + + + diff --git a/components/admin/AdminPagination.uvue b/components/admin/AdminPagination.uvue new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/components/admin/AdminPagination.uvue @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/components/analytics/AnalyticsRegionMap.uvue b/components/analytics/AnalyticsRegionMap.uvue index 6b98d489..9f1ba8de 100644 --- a/components/analytics/AnalyticsRegionMap.uvue +++ b/components/analytics/AnalyticsRegionMap.uvue @@ -21,359 +21,242 @@ - + {{ loading ? '加载中...' : '暂无数据' }} - - diff --git a/components/analytics/AnalyticsUserGenderSection.uvue b/components/analytics/AnalyticsUserGenderSection.uvue index a653e688..bbc4e0f9 100644 --- a/components/analytics/AnalyticsUserGenderSection.uvue +++ b/components/analytics/AnalyticsUserGenderSection.uvue @@ -1,12 +1,24 @@ - diff --git a/components/analytics/AnalyticsUserMapTable.uvue b/components/analytics/AnalyticsUserMapTable.uvue index c3a5311e..7c553b63 100644 --- a/components/analytics/AnalyticsUserMapTable.uvue +++ b/components/analytics/AnalyticsUserMapTable.uvue @@ -161,7 +161,10 @@ export default { background: #fff; border-radius: 4px; padding: 20px; - margin-bottom: 16px; + /* margin-bottom 移除,由父级 Grid gap 控制或统一添加 */ + display: flex; + flex-direction: column; + height: 100%; /* 让卡片自身也撑满容器 */ } .card-header { @@ -177,7 +180,8 @@ export default { .card-content { display: flex; flex-direction: row; - height: 450px; + flex: 1; /* 让内容区在容器高时自适应 */ + min-height: 450px; /* 最小基础高度 */ } .map-section { diff --git a/components/supadb/aksupa - 副本.uts b/components/supadb/aksupa - 副本.uts index 4b150698..da3ecf63 100644 --- a/components/supadb/aksupa - 副本.uts +++ b/components/supadb/aksupa - 副本.uts @@ -507,7 +507,7 @@ export class AkSupaQueryBuilder { convertedData = result.data as T | Array; } result.data = convertedData - const aaa = result as AkReqResponse + const aaa = result as AkReqResponse> // const aaa = { // status: result.status, // data: convertedData, diff --git a/components/supadb/aksupa.uts b/components/supadb/aksupa.uts index 32056b23..eb558e71 100644 --- a/components/supadb/aksupa.uts +++ b/components/supadb/aksupa.uts @@ -1,6 +1,8 @@ +// /components/supadb/aksupa.uts import { AkReqResponse, AkReqUploadOptions, AkReq } from '@/uni_modules/ak-req/index.uts' import type { AkReqOptions } from '@/uni_modules/ak-req/index.uts' import { toUniError } from '@/utils/utils.uts' +import { IS_TEST_MODE } from '@/ak/config.uts' export type AkSupaSignInResult = { access_token : string; @@ -527,7 +529,7 @@ export class AkSupaQueryBuilder { convertedData = result.data as T | Array; } result.data = convertedData - const aaa = result as AkReqResponse + const aaa = result as AkReqResponse> // const aaa = { // status: result.status, // data: convertedData, @@ -656,6 +658,73 @@ export class AkSupa { } } + /** + * 模拟 supabase-js 的 auth 属性,提供认证相关方法 + */ + get auth() : AkSupa { + return this; + } + + /** + * 校验密码或登录(别名,兼容 supabase-js 命名) + */ + async signInWithPassword(credentials : UTSJSONObject) : Promise { + const email = credentials.getString('email'); + const password = credentials.getString('password'); + if (email == null || password == null) { + throw new Error('Email and password are required'); + } + return await this.signIn(email, password); + } + + /** + * 更新用户信息(如修改密码、修改元数据等) + * 对应 Supabase Auth API: PUT /auth/v1/user (部分版本或Kong配置可能只支持PUT) + */ + async updateUser(attributes : UTSJSONObject) : Promise> { + const url = this.baseUrl + '/auth/v1/user'; + const token = AkReq.getToken(); + if (token == null || token == '') { + throw new Error('未登录,无法更新用户信息'); + } + + const headers = { + apikey: this.apikey, + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}` + } as UTSJSONObject; + + // 尝试先用 PUT 方法,因为部分环境 PATCH 报 405 Method Not Allowed + const reqOptions : AkReqOptions = { + url, + method: 'PUT', + headers, + data: attributes, + contentType: 'application/json' + }; + + // updateUser 后,Supabase 会返回更新后的用户对象 + let res = await AkReq.request(reqOptions, false); + + // 如果 PUT 也是 405,则尝试 PATCH + if (res.status == 405) { + reqOptions.method = 'PATCH'; + res = await AkReq.request(reqOptions, false); + } + + if (res.status >= 200 && res.status < 300 && res.data != null) { + // 如果返回了新的 user 对象,更新本地缓存 + try { + const newUser = new UTSJSONObject(res.data); + this.user = newUser; + if (this.session != null) { + this.session!!.user = newUser; + } + } catch (e) {} + } + return res; + } + // [CHANGE][2026-01-30] hydrate user from /auth/v1/user when token exists in storage async hydrateSessionFromStorage() : Promise { try { @@ -784,7 +853,12 @@ export class AkSupa { }; } - async signUp(email : string, password : string) : Promise { + async signUp(email : string, password : string, options ?: UTSJSONObject) : Promise { + const body = { email, password } as UTSJSONObject; + if (options != null && options.get('data') != null) { + body['data'] = options.get('data'); + } + const res = await AkReq.request({ url: this.baseUrl + '/auth/v1/signup', method: 'POST', @@ -792,7 +866,7 @@ export class AkSupa { apikey: this.apikey, 'Content-Type': 'application/json' } as UTSJSONObject, - data: { email, password } as UTSJSONObject, + data: body, contentType: 'application/json' }, false); return res.data as UTSJSONObject; @@ -805,14 +879,22 @@ export class AkSupa { * { usr_id: { lt: 800 }, name: { ilike: '%foo%' }, status: 'active', age: { gte: 18, lte: 30 } } * 操作符支持 eq, neq, lt, lte, gt, gte, like, ilike, in, is, not, contains, containedBy, range, fts, plfts, phfts, wfts */ -async select(table : string, filter ?: string | null, options ?: AkSupaSelectOptions) : Promise> { - let url = this.baseUrl + '/rest/v1/' + table; - let headers = { - apikey: this.apikey, - 'Content-Type': 'application/json', - Authorization: `Bearer ${AkReq.getToken() ?? ''}` - } as UTSJSONObject; - let params : string[] = []; + async select(table : string, filter ?: string | null, options ?: AkSupaSelectOptions) : Promise> { + let url = this.baseUrl + '/rest/v1/' + table; + + const token = AkReq.getToken() + let headers = { + apikey: this.apikey, + 'Content-Type': 'application/json' + } as UTSJSONObject; + + // 只有在明确有用户 token 的情况下才发送 Authorization + // 否则只带 apikey,这样 Kong 会自动映射到 anon 角色,避免 JWT 校验失败 + if (token != null && token != '') { + headers['Authorization'] = `Bearer ${token}`; + } + + let params : string[] = []; if (options != null) { if (options.columns != null && !(options.columns == "")) params.push('select=' + encodeURIComponent(options.columns ?? "")); if (options.limit != null) { @@ -897,10 +979,17 @@ async select_uts(table : string, filter ?: UTSJSONObject | null, options ?: AkSu */ async insert(table : string, row : UTSJSONObject | Array) : Promise> { const url = this.baseUrl + '/rest/v1/' + table; - const headers = { + + const token = AkReq.getToken() + let authHeader = `Bearer ${this.apikey}`; + if (token != null && token != '') { + authHeader = `Bearer ${token}`; + } + + let headers = { apikey: this.apikey, 'Content-Type': 'application/json', - Authorization: `Bearer ${AkReq.getToken() ?? ''}`, + Authorization: authHeader, Prefer: 'return=representation' } as UTSJSONObject; @@ -910,7 +999,7 @@ async select_uts(table : string, filter ?: UTSJSONObject | null, options ?: AkSu url, method: 'POST', headers, - data: row, // 可以是单个对象或数组 + data: row, contentType: 'application/json' }; return await this.requestWithAutoRefresh(reqOptions); @@ -928,12 +1017,18 @@ async update(table : string, filter : string | null, values : UTSJSONObject) : P if (filter!=null && filter !== "") { url += '?' + filter; } - const headers = { + + const token = AkReq.getToken() + let headers = { apikey: this.apikey, 'Content-Type': 'application/json', - Authorization: `Bearer ${AkReq.getToken() ?? ''}`, Prefer: 'return=representation' } as UTSJSONObject; + + if (token != null && token != '') { + headers['Authorization'] = `Bearer ${token}`; + } + let reqOptions : AkReqOptions = { url, method: 'PATCH', @@ -955,12 +1050,18 @@ async delete(table : string, filter : string | null) : Promise> { const url = `${this.baseUrl}/rest/v1/rpc/${functionName}`; - const headers = { + + const token = AkReq.getToken() + let headers = { apikey: this.apikey, - 'Content-Type': 'application/json', - Authorization: `Bearer ${AkReq.getToken() ?? ''}` + 'Content-Type': 'application/json' } as UTSJSONObject; + + if (token != null && token != '') { + headers['Authorization'] = `Bearer ${token}`; + } + let reqOptions : AkReqOptions = { url, method: 'POST', @@ -1012,7 +1119,7 @@ async delete(table : string, filter : string | null) : Promise> { let res = await AkReq.request(reqOptions, false); - // JWT过期:Supabase风格 - const isJwtExpired = (res.status == 401); //res != null && res.data != null && typeof res.data == 'object' && (res.data as UTSJSONObject)?.getString('code') == 'PGRST301'; - // 401未授权 - const isUnauthorized = (res.status == 401); - if ((isJwtExpired || isUnauthorized) && !isRetry) { + // JWT过期/401未授权 + const needsHandle = (res.status == 401); + + if (needsHandle && !isRetry) { const ok = await this.refreshSession(); if (ok) { + const newToken = AkReq.getToken() ?? '' let headers = reqOptions.headers if (headers == null) { headers = new UTSJSONObject() } if (typeof headers.set == 'function') { - headers.set('Authorization', `Bearer ${AkReq.getToken() ?? ''}`) + headers.set('Authorization', `Bearer ${newToken}`) reqOptions.headers = headers } res = await AkReq.request(reqOptions, false); } else { - uni.removeStorageSync('user_id'); - uni.removeStorageSync('token'); + // 如果是测试模式且失败(401且无法刷新),不再抛出异常阻止执行,但确保 res.error 有值 + if (IS_TEST_MODE === true) { + console.warn('[TestMode] Token expired or not found, but continuing anyway. Status:', res.status) + console.log('[TestMode] Response body:', JSON.stringify(res.data)) + if (res.error == null) { + res.error = toUniError('认证失败 (401)', 'UNAUTHORIZED'); + } + return res; + } + + // completely removed global storage clearing uni.reLaunch({ url: '/pages/user/login' }); throw toUniError('登录已过期,请重新登录', '用户认证失败'); } } + + // 额外检查:如果 status >= 400 且 res.error 为空,注入一个 error + if (res.status >= 400 && res.error == null) { + res.error = toUniError(`请求失败: ${res.status}`, 'HTTP_ERROR'); + } + return res; } } @@ -1132,4 +1254,15 @@ export function createClient(url : string, key : string) : AkSupa { return new AkSupa(url, key); } +/** + * 创建一个临时 Supabase 客户端实例,用于校验密码等操作,不会污染全局 Token + */ +export function createTempClient(url : string, key : string) : AkSupa { + const supa = new AkSupa(url, key); + // 临时客户端不执行持久化逻辑,直接清空可能已加载的 session + supa.session = null; + supa.user = null; + return supa; +} + export default AkSupa; diff --git a/components/supadb/aksupainstance.uts b/components/supadb/aksupainstance.uts index 8ce98ec3..9887dfa6 100644 --- a/components/supadb/aksupainstance.uts +++ b/components/supadb/aksupainstance.uts @@ -26,7 +26,7 @@ export function checkConnection() { } // 兼容 supaReady Promise -export const supaReady = Promise.resolve(true) +export const supaReady = supaInstance.hydrateSessionFromStorage() // 如果有其他需要导出的函数,可以这样导出: export function initializeSupabase(url: string, key: string) { diff --git a/docs/project_spec/UNI_APP_X_PAGE_FIX_GUIDE.md b/docs/project_spec/UNI_APP_X_PAGE_FIX_GUIDE.md index 243f8e46..e06080df 100644 --- a/docs/project_spec/UNI_APP_X_PAGE_FIX_GUIDE.md +++ b/docs/project_spec/UNI_APP_X_PAGE_FIX_GUIDE.md @@ -1,3 +1,12 @@ +--- +🚧 注意: + +⚠ 注意:当前使用 mock 数据,后续真实接口完成后替换 +真实接口地址和返回字段未确定,请后续接口联调完成后再替换。 + +文档标记维持在此文件中,以便后续开发和对接。 +--- + # uni-app-x 页面修复指南 ## 📋 文档概述 @@ -23,7 +32,18 @@ - `768px - 1199px`: 固定 2 列 (`grid-template-columns: repeat(2, minmax(0, 1fr))`)。 - `< 768px`: 固定 1 列 (`grid-template-columns: repeat(1, minmax(0, 1fr))`)。 4. 使用 `minmax(0, 1fr)` 配分子项 `min-width: 0` 确保在任何容器宽度下网格不被撑爆。 -- **强制规则**: 任何页面都不允许出现一行 3 个卡片的情况。 +- **强制规则**: 任何页面都不允许出现一行 3 个卡片的情况。(注:除非是类似“商品分类”样式的预览展示,需遵循下文响应式规则) + +#### **原因二十七:响应式预览网格布局 (装饰/设计模块规范)** + +- **现象**: 在小屏下预览手机模型重叠或在大屏下留白过多。 +- **解决方案**: + 1. 使用 `display: grid` 代替 `flex-wrap`。 + 2. **三段式响应式**: + - `> 1250px`: `grid-template-columns: repeat(3, 1fr);` (一行 3 个) + - `700px ~ 1250px`: `grid-template-columns: repeat(2, 1fr);` (一行 2 个) + - `< 700px`: `grid-template-columns: 1fr;` (一行 1 个) + 3. **Case Study**: `pages/mall/admin/decoration/category.uvue` (商品分类) 采用了此标准实现 1:1 视觉复刻。 #### **原因十三:侧边栏响应式断点与 Overlay 冲突 (严重体验红线)** @@ -119,6 +139,73 @@ - `chart-col` 在桌面端 (>=1200) 使用中等高度 (约 320-360px)。 - 在移动端/窄屏 (<1200) 自动扩展为大高度 (约 500-600px),以匹配全宽展示的视觉张力。 +#### **原因十九:布局组件依赖缺失导致的级联加载失败** + +- **现象**: 控制台报 `GET http://.../AdminLayout.uvue?import net::ERR_CACHE_READ_FAILURE` 或 `TypeError: Failed to fetch dynamically imported module`。 +- **原因**: 核心布局组件(如 `AdminLayout.uvue`)在 ``; + +text = text.replace( + / diff --git a/layouts/admin/router/adminComponentMap.uts b/layouts/admin/router/adminComponentMap.uts index 81196b37..92e0d3b3 100644 --- a/layouts/admin/router/adminComponentMap.uts +++ b/layouts/admin/router/adminComponentMap.uts @@ -6,25 +6,180 @@ * value: 组件引用 * * 注意: - * 1. 组件已切换为 defineAsyncComponent 异步导入,优化 H5 环境下的加载性能与包体积 + * 1. 组件已切换为 静态导入 (Static Import),以解决 H5 环境下的加载异常 (net::ERR_CACHE_READ_FAILURE) * 2. 组件路径使用 @ 别名 * 3. 占位组件统一使用 PlaceholderPage */ -import { defineAsyncComponent } from 'vue' - // 导入占位组件 import PlaceholderPage from '@/layouts/admin/components/PlaceholderPage.uvue' // 导入首页(内部组件,不包含 AdminLayout) import HomeIndex from '@/layouts/admin/pages/HomeIndex.uvue' +import UserCenter from '@/pages/mall/admin/userCenter/index.uvue' -// 用户、商品、订单模块已改为 defineAsyncComponent 异步加载,移除静态导入以优化 H5 加载性能 +// --- 店铺模块 --- +import ShopManage from '@/pages/mall/admin/shop/manage.uvue' +import ShopCreate from '@/pages/mall/admin/shop/create.uvue' -// 营销设置模块暂时使用 PlaceholderPage -// 避免循环依赖问题 +// --- 用户模块 --- +import UserStatistic from '@/pages/mall/admin/user/statistics/index.uvue' +import UserList from '@/pages/mall/admin/user/management/index.uvue' +import UserLevel from '@/pages/mall/admin/user/level/index.uvue' +import UserGroup from '@/pages/mall/admin/user/grouping/index.uvue' +import UserLabel from '@/pages/mall/admin/user/label/index.uvue' +import UserMemberConfig from '@/pages/mall/admin/user/config/index.uvue' -// 营销、内容、财务、客服、装修等模块已改为 defineAsyncComponent 异步加载,移除静态导入以优化 H5 加载性能 +// --- 商品模块 --- +import ProductStatistic from '@/pages/mall/admin/product/product-statistics/index.uvue' +import ProductList from '@/pages/mall/admin/product/product-management/index.uvue' +import ProductEdit from '@/pages/mall/admin/product/product-management/components/edit.uvue' +import ProductMemberPrice from '@/pages/mall/admin/product/product-management/components/member-price.uvue' +import ProductClassify from '@/pages/mall/admin/product/classification/index.uvue' +import ProductReply from '@/pages/mall/admin/product/reviews/index.uvue' +import ProductAttr from '@/pages/mall/admin/product/specifications/index.uvue' +import ProductParam from '@/pages/mall/admin/product/parameters/index.uvue' +import ProductLabel from '@/pages/mall/admin/product/labels/index.uvue' +import ProductProtection from '@/pages/mall/admin/product/protection/index.uvue' + +// --- 订单模块 --- +import OrderList from '@/pages/mall/admin/order/order-management/index.uvue' +import OrderStatistic from '@/pages/mall/admin/order/order-statistics/index.uvue' +import OrderRefund from '@/pages/mall/admin/order/aftersales-order/index.uvue' +import OrderCashier from '@/pages/mall/admin/order/cashier-order/index.uvue' +import OrderVerify from '@/pages/mall/admin/order/write-off-records/index.uvue' +import OrderConfig from '@/pages/mall/admin/order/order-configuration/index.uvue' + +// --- 营销模块 --- +import MarketingCouponList from '@/pages/mall/admin/marketing/coupon/coupon-list/index.uvue' +import MarketingCouponUser from '@/pages/mall/admin/marketing/coupon/claim-record/index.uvue' +import MarketingIntegralStatistic from '@/pages/mall/admin/marketing/points/statistics/index.uvue' +import MarketingIntegralProduct from '@/pages/mall/admin/marketing/points/products/index.uvue' +import MarketingIntegralOrder from '@/pages/mall/admin/marketing/points/orders/index.uvue' +import MarketingIntegralRecord from '@/pages/mall/admin/marketing/points/record/index.uvue' +import MarketingIntegralConfig from '@/pages/mall/admin/marketing/points/config/index.uvue' +import MarketingLotteryList from '@/pages/mall/admin/marketing/lottery/list/index.uvue' +import MarketingLotteryConfig from '@/pages/mall/admin/marketing/lottery/configuration/index.uvue' +import MarketingBargainProduct from '@/pages/mall/admin/marketing/bargain/products/index.uvue' +import MarketingBargainList from '@/pages/mall/admin/marketing/bargain/list/index.uvue' +import MarketingCombinationProduct from '@/pages/mall/admin/marketing/combination/products/index.uvue' +import MarketingCombinationList from '@/pages/mall/admin/marketing/combination/list/index.uvue' +import MarketingCombinationCreate from '@/pages/mall/admin/marketing/combination/index.uvue' +import MarketingSeckillList from '@/pages/mall/admin/marketing/seckill/list/index.uvue' +import MarketingSeckillProduct from '@/pages/mall/admin/marketing/seckill/products/index.uvue' +import MarketingSeckillConfig from '@/pages/mall/admin/marketing/seckill/config/index.uvue' +import MarketingMemberType from '@/pages/mall/admin/marketing/member/type/index.uvue' +import MarketingMemberRight from '@/pages/mall/admin/marketing/member/right/index.uvue' +import MarketingMemberCard from '@/pages/mall/admin/marketing/member/kami-membership/index.uvue' +import MarketingMemberRecord from '@/pages/mall/admin/marketing/member/record/index.uvue' +import MarketingMemberConfig from '@/pages/mall/admin/marketing/member/config/index.uvue' +import MarketingLiveRoom from '@/pages/mall/admin/marketing/live/live-management/index.uvue' +import MarketingLiveProduct from '@/pages/mall/admin/marketing/live/products-management/index.uvue' +import MarketingLiveAnchor from '@/pages/mall/admin/marketing/live/streamer-management/index.uvue' +import MarketingRechargeQuota from '@/pages/mall/admin/marketing/recharge/amount-setting/index.uvue' +import MarketingRechargeConfig from '@/pages/mall/admin/marketing/recharge/config/index.uvue' +import MarketingCheckinConfig from '@/pages/mall/admin/marketing/checkin/config/index.uvue' +import MarketingCheckinReward from '@/pages/mall/admin/marketing/checkin/reward/index.uvue' +import MarketingNewcomerGift from '@/pages/mall/admin/marketing/newcomer/index.uvue' +import MarketingStatisticIndex from '@/pages/mall/admin/marketing/marketing-statistics/index.uvue' + +// --- 内容模块 --- +import CmsArticle from '@/pages/mall/admin/cms/article/index.uvue' +import CmsCategory from '@/pages/mall/admin/cms/category/index.uvue' + +// --- 财务模块 --- +import FinanceTransactionStats from '@/pages/mall/admin/finance/transaction-statistics/index.uvue' +import FinanceWithdrawal from '@/pages/mall/admin/finance/finance-operations/request/index.uvue' +import FinanceInvoice from '@/pages/mall/admin/finance/finance-operations/management/index.uvue' +import FinanceRecharge from '@/pages/mall/admin/finance/finance-record/recharge-record/index.uvue' +import FinanceCapitalFlow from '@/pages/mall/admin/finance/finance-record/flow/index.uvue' +import FinanceBill from '@/pages/mall/admin/finance/finance-record/billing-record/index.uvue' +import FinanceCommission from '@/pages/mall/admin/finance/commission-record/index.uvue' +import FinanceBalanceStats from '@/pages/mall/admin/finance/balance-record/statistics/index.uvue' +import FinanceBalanceRecord from '@/pages/mall/admin/finance/balance-record/record/index.uvue' + +// --- 设置模块 --- +import SettingSystemConfig from '@/pages/mall/admin/setting/system/index.uvue' +import SettingMessageIndex from '@/pages/mall/admin/setting/message/index.uvue' +import SettingProtocolIndex from '@/pages/mall/admin/setting/agreement/index.uvue' +import SettingTicketIndex from '@/pages/mall/admin/setting/receipt/index.uvue' +import SettingAuthRole from '@/pages/mall/admin/setting/auth/role-management/index.uvue' +import SettingAuthAdmin from '@/pages/mall/admin/setting/auth/admin-management/index.uvue' +import SettingAuthPermission from '@/pages/mall/admin/setting/auth/menu-management/index.uvue' +import SettingDeliveryStaff from '@/pages/mall/admin/setting/delivery/management/index.uvue' +import SettingDeliveryStation from '@/pages/mall/admin/setting/delivery/setting/station/index.uvue' +import SettingDeliveryVerifier from '@/pages/mall/admin/setting/delivery/setting/verifier/index.uvue' +import SettingDeliveryTemplate from '@/pages/mall/admin/setting/delivery/setting/template/index.uvue' +import SettingInterfaceOnepassConfig from '@/pages/mall/admin/setting/interface/onepass/config/index.uvue' +import SettingInterfaceOnepassIndex from '@/pages/mall/admin/setting/interface/onepass/index.uvue' +import SettingInterfaceStorage from '@/pages/mall/admin/setting/interface/storage/index.uvue' +import SettingInterfaceCollect from '@/pages/mall/admin/setting/interface/collect/index.uvue' +import SettingInterfaceLogistics from '@/pages/mall/admin/setting/interface/logistics/index.uvue' +import SettingInterfaceESheet from '@/pages/mall/admin/setting/interface/e-sheet/index.uvue' +import SettingInterfaceSms from '@/pages/mall/admin/setting/interface/sms/index.uvue' +import SettingInterfacePayment from '@/pages/mall/admin/setting/interface/payment/index.uvue' + +// --- 分销模块 --- +import DistributionPromoter from '@/pages/mall/admin/distribution/distributor-management/index.uvue' +import DistributionLevel from '@/pages/mall/admin/distribution/level/index.uvue' +import DistributionSetting from '@/pages/mall/admin/distribution/setting/index.uvue' +import DivisionList from '@/pages/mall/admin/distribution/business-division/business-division-list/index.uvue' +import DivisionAgent from '@/pages/mall/admin/distribution/business-division/agent-list/index.uvue' +import DivisionApply from '@/pages/mall/admin/distribution/business-division/agent-application/index.uvue' + +// --- 客服模块 --- +import KefuList from '@/pages/mall/admin/kefu/list/index.uvue' +import KefuWords from '@/pages/mall/admin/kefu/rhetoric/index.uvue' +import KefuFeedback from '@/pages/mall/admin/kefu/user-message/index.uvue' +import KefuAutoReply from '@/pages/mall/admin/kefu/auto-reply/index.uvue' +import KefuConfig from '@/pages/mall/admin/kefu/config/index.uvue' + +// --- 装修模块 --- +import DecorationHome from '@/pages/mall/admin/decoration/homepage-decoration/index.uvue' +import DecorationCategory from '@/pages/mall/admin/decoration/product-category/index.uvue' +import DecorationUser from '@/pages/mall/admin/decoration/personal-center/index.uvue' +import DecorationData from '@/pages/mall/admin/decoration/data-config/index.uvue' +import DecorationStyle from '@/pages/mall/admin/decoration/theme-style/index.uvue' +import DecorationMaterial from '@/pages/mall/admin/decoration/material-management/index.uvue' +import DecorationLink from '@/pages/mall/admin/decoration/link-management/index.uvue' + +// --- 应用模块 --- +import AppWechatMenu from '@/pages/mall/admin/app/wechat/menu/index.uvue' +import AppWechatNews from '@/pages/mall/admin/app/wechat/management/index.uvue' +import AppWechatReplyFollow from '@/pages/mall/admin/app/wechat/reply/follow/index.uvue' +import AppWechatReplyKeyword from '@/pages/mall/admin/app/wechat/reply/keyword/index.uvue' +import AppWechatReplyInvalid from '@/pages/mall/admin/app/wechat/reply/invalid/index.uvue' +import AppWechatConfig from '@/pages/mall/admin/app/wechat/config/index.uvue' +import AppRoutineDownload from '@/pages/mall/admin/app/routine/download/index.uvue' +import AppRoutineConfig from '@/pages/mall/admin/app/routine/config/index.uvue' +import AppMobileConfig from '@/pages/mall/admin/app/mobile/config/index.uvue' +import AppMobileVersion from '@/pages/mall/admin/app/mobile/version/index.uvue' +import AppPcDesign from '@/pages/mall/admin/app/pc/design/index.uvue' +import AppPcConfig from '@/pages/mall/admin/app/pc/config/index.uvue' + +// --- 维护模块 --- +import MaintainDevConfig from '@/pages/mall/admin/maintain/dev-config/category/index.uvue' +import MaintainDevData from '@/pages/mall/admin/maintain/dev-config/combination-data/index.uvue' +import MaintainDevTask from '@/pages/mall/admin/maintain/dev-config/cron-job/index.uvue' +import MaintainDevAuth from '@/pages/mall/admin/maintain/dev-config/permission/index.uvue' +import MaintainDevModule from '@/pages/mall/admin/maintain/dev-config/module-config/index.uvue' +import MaintainDevEvent from '@/pages/mall/admin/maintain/dev-config/custom-event/index.uvue' +import MaintainSecurityCache from '@/pages/mall/admin/maintain/security/refresh-cache/index.uvue' +import MaintainSecurityLog from '@/pages/mall/admin/maintain/security/system-log/index.uvue' +import MaintainSecurityUpgrade from '@/pages/mall/admin/maintain/security/online-upgrade/index.uvue' +import MaintainDataLogistics from '@/pages/mall/admin/maintain/data/logistics/index.uvue' +import MaintainDataCity from '@/pages/mall/admin/maintain/data/city-data/index.uvue' +import MaintainDataClear from '@/pages/mall/admin/maintain/data/clear/index.uvue' +import MaintainApiAccount from '@/pages/mall/admin/maintain/api/account/index.uvue' +import MaintainLangList from '@/pages/mall/admin/maintain/lang/list/index.uvue' +import MaintainLangDetail from '@/pages/mall/admin/maintain/lang/detail/index.uvue' +import MaintainLangRegion from '@/pages/mall/admin/maintain/lang/region/index.uvue' +import MaintainLangConfig from '@/pages/mall/admin/maintain/lang/config/index.uvue' +import MaintainToolDb from '@/pages/mall/admin/maintain/dev-tools/database/index.uvue' +import MaintainToolFile from '@/pages/mall/admin/maintain/dev-tools/file/index.uvue' +import MaintainToolApi from '@/pages/mall/admin/maintain/dev-tools/interface/index.uvue' +import MaintainToolDic from '@/pages/mall/admin/maintain/dev-tools/data-dictionary/index.uvue' +import MaintainSysInfo from '@/pages/mall/admin/maintain/sys/info/index.uvue' /** * 组件映射表 @@ -32,180 +187,175 @@ import HomeIndex from '@/layouts/admin/pages/HomeIndex.uvue' export const componentMap: Map = new Map([ // 首页 ['HomeIndex', HomeIndex], - + ['UserCenter', UserCenter], + + // 店铺模块 + ['ShopManage', ShopManage], + ['ShopCreate', ShopCreate], + // 用户模块 - ['UserStatistic', defineAsyncComponent(() => import('@/pages/mall/admin/user/statistics/index.uvue'))], - ['UserList', defineAsyncComponent(() => import('@/pages/mall/admin/user/management/index.uvue'))], - ['UserLevel', defineAsyncComponent(() => import('@/pages/mall/admin/user/level/index.uvue'))], - ['UserGroup', defineAsyncComponent(() => import('@/pages/mall/admin/user/grouping/index.uvue'))], - ['UserLabel', defineAsyncComponent(() => import('@/pages/mall/admin/user/label/index.uvue'))], - ['UserMemberConfig', defineAsyncComponent(() => import('@/pages/mall/admin/user/configuration/index.uvue'))], + ['UserStatistic', UserStatistic], + ['UserList', UserList], + ['UserLevel', UserLevel], + ['UserGroup', UserGroup], + ['UserLabel', UserLabel], + ['UserMemberConfig', UserMemberConfig], // 商品模块 - ['ProductStatistic', defineAsyncComponent(() => import('@/pages/mall/admin/product/product-statistics/index.uvue'))], - ['ProductList', defineAsyncComponent(() => import('@/pages/mall/admin/product/product-management/index.uvue'))], - ['ProductEdit', defineAsyncComponent(() => import('@/pages/mall/admin/product/product-management/edit.uvue'))], - ['ProductMemberPrice', defineAsyncComponent(() => import('@/pages/mall/admin/product/product-management/member-price.uvue'))], - ['ProductClassify', defineAsyncComponent(() => import('@/pages/mall/admin/product/classification/index.uvue'))], - ['ProductReply', defineAsyncComponent(() => import('@/pages/mall/admin/product/reviews/index.uvue'))], - ['ProductAttr', defineAsyncComponent(() => import('@/pages/mall/admin/product/specifications/index.uvue'))], - ['ProductParam', defineAsyncComponent(() => import('@/pages/mall/admin/product/parameters/index.uvue'))], - ['ProductLabel', defineAsyncComponent(() => import('@/pages/mall/admin/product/labels/index.uvue'))], - ['ProductProtection', defineAsyncComponent(() => import('@/pages/mall/admin/product/protection/index.uvue'))], + ['ProductStatistic', ProductStatistic], + ['ProductList', ProductList], + ['ProductEdit', ProductEdit], + ['ProductMemberPrice', ProductMemberPrice], + ['ProductClassify', ProductClassify], + ['ProductReply', ProductReply], + ['ProductAttr', ProductAttr], + ['ProductParam', ProductParam], + ['ProductLabel', ProductLabel], + ['ProductProtection', ProductProtection], // 订单模块 - ['OrderList', defineAsyncComponent(() => import('@/pages/mall/admin/order/order-management/index.uvue'))], - ['OrderStatistic', defineAsyncComponent(() => import('@/pages/mall/admin/order/order-statistics/index.uvue'))], - ['OrderRefund', defineAsyncComponent(() => import('@/pages/mall/admin/order/aftersales-order/index.uvue'))], - ['OrderCashier', defineAsyncComponent(() => import('@/pages/mall/admin/order/cashier-order/index.uvue'))], - ['OrderVerify', defineAsyncComponent(() => import('@/pages/mall/admin/order/write-off-records/index.uvue'))], - ['OrderConfig', defineAsyncComponent(() => import('@/pages/mall/admin/order/order-configuration/index.uvue'))], + ['OrderList', OrderList], + ['OrderStatistic', OrderStatistic], + ['OrderRefund', OrderRefund], + ['OrderCashier', OrderCashier], + ['OrderVerify', OrderVerify], + ['OrderConfig', OrderConfig], - // 营销模块已改为异步加载 - // 1. 优惠券 - ['MarketingCouponList', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/coupon/list.uvue'))], - ['MarketingCouponUser', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/coupon/user.uvue'))], - // 2. 积分管理 - ['MarketingIntegralStatistic', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/integral/statistic.uvue'))], - ['MarketingIntegralProduct', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/integral/list.uvue'))], - ['MarketingIntegralOrder', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/integral/order.uvue'))], - ['MarketingIntegralRecord', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/integral/record.uvue'))], - ['MarketingIntegralConfig', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/integral/config.uvue'))], - // 3. 抽奖管理 - ['MarketingLotteryList', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/lottery/list.uvue'))], - ['MarketingLotteryConfig', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/lottery/config.uvue'))], - // 4. 砍价管理 - ['MarketingBargainProduct', PlaceholderPage], - ['MarketingBargainList', PlaceholderPage], - // 5. 拼团管理 - ['MarketingCombinationProduct', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/combination/product.uvue'))], - ['MarketingCombinationList', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/combination/list.uvue'))], - ['MarketingCombinationCreate', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/combination/create.uvue'))], - // 6. 秒杀管理 - ['MarketingSeckillList', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/seckill/list.uvue'))], - ['MarketingSeckillProduct', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/seckill/product.uvue'))], - ['MarketingSeckillConfig', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/seckill/config.uvue'))], - // 7. 付费会员 - ['MarketingMemberType', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/member/type.uvue'))], - ['MarketingMemberRight', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/member/right.uvue'))], - ['MarketingMemberCard', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/member/card.uvue'))], - ['MarketingMemberRecord', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/member/record.uvue'))], - ['MarketingMemberConfig', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/member/config.uvue'))], - // 8. 直播管理 - ['MarketingLiveRoom', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/live/room.uvue'))], - ['MarketingLiveProduct', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/live/product.uvue'))], - ['MarketingLiveAnchor', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/live/anchor.uvue'))], - // 9. 用户充值 - ['MarketingRechargeQuota', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/recharge/quota.uvue'))], - ['MarketingRechargeConfig', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/recharge/config.uvue'))], - // 10. 每日签到 - ['MarketingCheckinConfig', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/checkin/config.uvue'))], - ['MarketingCheckinReward', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/checkin/reward.uvue'))], - // 11. 渠道码 & 新人礼 + // 营销模块 + ['MarketingCouponList', MarketingCouponList], + ['MarketingCouponUser', MarketingCouponUser], + ['MarketingIntegralStatistic', MarketingIntegralStatistic], + ['MarketingIntegralProduct', MarketingIntegralProduct], + ['MarketingIntegralOrder', MarketingIntegralOrder], + ['MarketingIntegralRecord', MarketingIntegralRecord], + ['MarketingIntegralConfig', MarketingIntegralConfig], + ['MarketingLotteryList', MarketingLotteryList], + ['MarketingLotteryConfig', MarketingLotteryConfig], + ['MarketingBargainProduct', MarketingBargainProduct], + ['MarketingBargainList', MarketingBargainList], + ['MarketingCombinationProduct', MarketingCombinationProduct], + ['MarketingCombinationList', MarketingCombinationList], + ['MarketingCombinationCreate', MarketingCombinationCreate], + ['MarketingSeckillList', MarketingSeckillList], + ['MarketingSeckillProduct', MarketingSeckillProduct], + ['MarketingSeckillConfig', MarketingSeckillConfig], + ['MarketingMemberType', MarketingMemberType], + ['MarketingMemberRight', MarketingMemberRight], + ['MarketingMemberCard', MarketingMemberCard], + ['MarketingMemberRecord', MarketingMemberRecord], + ['MarketingMemberConfig', MarketingMemberConfig], + ['MarketingLiveRoom', MarketingLiveRoom], + ['MarketingLiveProduct', MarketingLiveProduct], + ['MarketingLiveAnchor', MarketingLiveAnchor], + ['MarketingRechargeQuota', MarketingRechargeQuota], + ['MarketingRechargeConfig', MarketingRechargeConfig], + ['MarketingCheckinConfig', MarketingCheckinConfig], + ['MarketingCheckinReward', MarketingCheckinReward], ['MarketingChannelList', PlaceholderPage], - ['MarketingNewcomerGift', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/newcomer/index.uvue'))], + ['MarketingNewcomerGift', MarketingNewcomerGift], + ['MarketingStatisticIndex', MarketingStatisticIndex], // 内容模块 - ['CmsArticle', defineAsyncComponent(() => import('@/pages/mall/admin/cms/article/list.uvue'))], - ['CmsCategory', defineAsyncComponent(() => import('@/pages/mall/admin/cms/category/list.uvue'))], + ['CmsArticle', CmsArticle], + ['CmsCategory', CmsCategory], // 财务模块 - ['FinanceTransactionStats', defineAsyncComponent(() => import('@/pages/mall/admin/finance/transaction_stats.uvue'))], - ['FinanceWithdrawal', defineAsyncComponent(() => import('@/pages/mall/admin/finance/withdrawal.uvue'))], - ['FinanceInvoice', defineAsyncComponent(() => import('@/pages/mall/admin/finance/invoice.uvue'))], - ['FinanceRecharge', defineAsyncComponent(() => import('@/pages/mall/admin/finance/recharge.uvue'))], - ['FinanceCapitalFlow', defineAsyncComponent(() => import('@/pages/mall/admin/finance/capital_flow.uvue'))], - ['FinanceBill', defineAsyncComponent(() => import('@/pages/mall/admin/finance/bill.uvue'))], - ['FinanceCommission', defineAsyncComponent(() => import('@/pages/mall/admin/finance/commission.uvue'))], - ['FinanceBalanceStats', defineAsyncComponent(() => import('@/pages/mall/admin/finance/balance_stats.uvue'))], - ['FinanceBalanceRecord', defineAsyncComponent(() => import('@/pages/mall/admin/finance/balance_record.uvue'))], + ['FinanceTransactionStats', FinanceTransactionStats], + ['FinanceWithdrawal', FinanceWithdrawal], + ['FinanceInvoice', FinanceInvoice], + ['FinanceRecharge', FinanceRecharge], + ['FinanceCapitalFlow', FinanceCapitalFlow], + ['FinanceBill', FinanceBill], + ['FinanceCommission', FinanceCommission], + ['FinanceBalanceStats', FinanceBalanceStats], + ['FinanceBalanceRecord', FinanceBalanceRecord], - // 数据模块 - 暂时使用占位组件 + // 数据模块 ['StatisticIndex', PlaceholderPage], // 设置模块 - ['SettingSystemConfig', defineAsyncComponent(() => import('@/pages/mall/admin/setting/system/config.uvue'))], - ['SettingMessageIndex', defineAsyncComponent(() => import('@/pages/mall/admin/setting/message.uvue'))], - ['SettingProtocolIndex', defineAsyncComponent(() => import('@/pages/mall/admin/setting/agreement.uvue'))], - ['SettingTicketIndex', defineAsyncComponent(() => import('@/pages/mall/admin/setting/ticket.uvue'))], - ['SettingAuthRole', defineAsyncComponent(() => import('@/pages/mall/admin/setting/auth/role.uvue'))], - ['SettingAuthAdmin', defineAsyncComponent(() => import('@/pages/mall/admin/setting/auth/admin.uvue'))], - ['SettingAuthPermission', defineAsyncComponent(() => import('@/pages/mall/admin/setting/auth/permission.uvue'))], - ['SettingDeliveryStaff', defineAsyncComponent(() => import('@/pages/mall/admin/setting/delivery/staff.uvue'))], - ['SettingDeliveryStation', defineAsyncComponent(() => import('@/pages/mall/admin/setting/delivery/station.uvue'))], - ['SettingDeliveryVerifier', defineAsyncComponent(() => import('@/pages/mall/admin/setting/delivery/verifier.uvue'))], - ['SettingDeliveryTemplate', defineAsyncComponent(() => import('@/pages/mall/admin/setting/delivery/template.uvue'))], - ['SettingInterfaceOnepassConfig', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/onepass/config.uvue'))], - ['SettingInterfaceOnepassIndex', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/onepass/index.uvue'))], - ['SettingInterfaceStorage', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/storage.uvue'))], - ['SettingInterfaceCollect', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/collect.uvue'))], - ['SettingInterfaceLogistics', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/logistics.uvue'))], - ['SettingInterfaceESheet', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/e-sheet.uvue'))], - ['SettingInterfaceSms', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/sms.uvue'))], - ['SettingInterfacePayment', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/payment.uvue'))], + ['SettingSystemConfig', SettingSystemConfig], + ['SettingMessageIndex', SettingMessageIndex], + ['SettingProtocolIndex', SettingProtocolIndex], + ['SettingTicketIndex', SettingTicketIndex], + ['SettingAuthRole', SettingAuthRole], + ['SettingAuthAdmin', SettingAuthAdmin], + ['SettingAuthPermission', SettingAuthPermission], + ['SettingDeliveryStaff', SettingDeliveryStaff], + ['SettingDeliveryStation', SettingDeliveryStation], + ['SettingDeliveryVerifier', SettingDeliveryVerifier], + ['SettingDeliveryTemplate', SettingDeliveryTemplate], + ['SettingInterfaceOnepassConfig', SettingInterfaceOnepassConfig], + ['SettingInterfaceOnepassIndex', SettingInterfaceOnepassIndex], + ['SettingInterfaceStorage', SettingInterfaceStorage], + ['SettingInterfaceCollect', SettingInterfaceCollect], + ['SettingInterfaceLogistics', SettingInterfaceLogistics], + ['SettingInterfaceESheet', SettingInterfaceESheet], + ['SettingInterfaceSms', SettingInterfaceSms], + ['SettingInterfacePayment', SettingInterfacePayment], // 分销模块 ['DistributionStatistic', PlaceholderPage], - ['DistributionPromoter', defineAsyncComponent(() => import('@/pages/mall/admin/distribution/promoter/index.uvue'))], - ['DistributionLevel', defineAsyncComponent(() => import('@/pages/mall/admin/distribution/level/index.uvue'))], - ['DistributionSetting', defineAsyncComponent(() => import('@/pages/mall/admin/distribution/setting/index.uvue'))], - ['DivisionList', defineAsyncComponent(() => import('@/pages/mall/admin/distribution/division/list.uvue'))], - ['DivisionAgent', defineAsyncComponent(() => import('@/pages/mall/admin/distribution/division/agent.uvue'))], - ['DivisionApply', defineAsyncComponent(() => import('@/pages/mall/admin/distribution/division/apply.uvue'))], + ['DistributionPromoter', DistributionPromoter], + ['DistributionLevel', DistributionLevel], + ['DistributionSetting', DistributionSetting], + ['DivisionList', DivisionList], + ['DivisionAgent', DivisionAgent], + ['DivisionApply', DivisionApply], // 客服模块 - ['KefuList', defineAsyncComponent(() => import('@/pages/mall/admin/kefu/list.uvue'))], - ['KefuWords', defineAsyncComponent(() => import('@/pages/mall/admin/kefu/words.uvue'))], - ['KefuFeedback', defineAsyncComponent(() => import('@/pages/mall/admin/kefu/feedback.uvue'))], - ['KefuAutoReply', defineAsyncComponent(() => import('@/pages/mall/admin/kefu/auto_reply.uvue'))], - ['KefuConfig', defineAsyncComponent(() => import('@/pages/mall/admin/kefu/config.uvue'))], + ['KefuList', KefuList], + ['KefuWords', KefuWords], + ['KefuFeedback', KefuFeedback], + ['KefuAutoReply', KefuAutoReply], + ['KefuConfig', KefuConfig], // 装修模块 - ['DecorationHome', defineAsyncComponent(() => import('@/pages/mall/admin/decoration/home.uvue'))], - ['DecorationCategory', defineAsyncComponent(() => import('@/pages/mall/admin/decoration/category.uvue'))], - ['DecorationUser', defineAsyncComponent(() => import('@/pages/mall/admin/decoration/user.uvue'))], - ['DecorationData', defineAsyncComponent(() => import('@/pages/mall/admin/decoration/data-config.uvue'))], - ['DecorationStyle', defineAsyncComponent(() => import('@/pages/mall/admin/design/theme-style.uvue'))], - ['DecorationMaterial', defineAsyncComponent(() => import('@/pages/mall/admin/design/material.uvue'))], - ['DecorationLink', defineAsyncComponent(() => import('@/pages/mall/admin/design/link-management.uvue'))], + ['DecorationHome', DecorationHome], + ['DecorationCategory', DecorationCategory], + ['DecorationUser', DecorationUser], + ['DecorationData', DecorationData], + ['DecorationStyle', DecorationStyle], + ['DecorationMaterial', DecorationMaterial], + ['DecorationLink', DecorationLink], // 应用模块 - ['AppWechatMenu', defineAsyncComponent(() => import('@/pages/mall/admin/app/wechat/menu.uvue'))], - ['AppWechatNews', defineAsyncComponent(() => import('@/pages/mall/admin/app/wechat/news.uvue'))], - ['AppWechatReplyFollow', defineAsyncComponent(() => import('@/pages/mall/admin/app/wechat/reply/follow.uvue'))], - ['AppWechatReplyKeyword', defineAsyncComponent(() => import('@/pages/mall/admin/app/wechat/reply/keyword.uvue'))], - ['AppWechatReplyInvalid', defineAsyncComponent(() => import('@/pages/mall/admin/app/wechat/reply/invalid.uvue'))], - ['AppWechatConfig', defineAsyncComponent(() => import('@/pages/mall/admin/app/wechat/config.uvue'))], - ['AppRoutineDownload', defineAsyncComponent(() => import('@/pages/mall/admin/app/routine/download.uvue'))], - ['AppRoutineConfig', defineAsyncComponent(() => import('@/pages/mall/admin/app/routine/config.uvue'))], - ['AppMobileConfig', defineAsyncComponent(() => import('@/pages/mall/admin/app/mobile/config.uvue'))], - ['AppMobileVersion', defineAsyncComponent(() => import('@/pages/mall/admin/app/mobile/version.uvue'))], - ['AppPcDesign', defineAsyncComponent(() => import('@/pages/mall/admin/app/pc/design.uvue'))], - ['AppPcConfig', defineAsyncComponent(() => import('@/pages/mall/admin/app/pc/config.uvue'))], + ['AppWechatMenu', AppWechatMenu], + ['AppWechatNews', AppWechatNews], + ['AppWechatReplyFollow', AppWechatReplyFollow], + ['AppWechatReplyKeyword', AppWechatReplyKeyword], + ['AppWechatReplyInvalid', AppWechatReplyInvalid], + ['AppWechatConfig', AppWechatConfig], + ['AppRoutineDownload', AppRoutineDownload], + ['AppRoutineConfig', AppRoutineConfig], + ['AppMobileConfig', AppMobileConfig], + ['AppMobileVersion', AppMobileVersion], + ['AppPcDesign', AppPcDesign], + ['AppPcConfig', AppPcConfig], // 维护模块 - ['MaintainDevConfig', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/dev-config/category.uvue'))], - ['MaintainDevData', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/dev-config/combination-data.uvue'))], - ['MaintainDevTask', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/dev-config/cron-job.uvue'))], - ['MaintainDevAuth', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/dev-config/permission.uvue'))], - ['MaintainDevModule', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/dev-config/module-config.uvue'))], - ['MaintainDevEvent', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/dev-config/custom-event.uvue'))], - ['MaintainSecurityCache', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/security/refresh-cache.uvue'))], - ['MaintainSecurityLog', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/security/system-log.uvue'))], - ['MaintainSecurityUpgrade', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/security/online-upgrade.uvue'))], - ['MaintainDataLogistics', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/data/logistics.uvue'))], - ['MaintainDataCity', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/data/city.uvue'))], - ['MaintainDataClear', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/data/clear.uvue'))], - ['MaintainApiAccount', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/api/account.uvue'))], - ['MaintainLangList', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/lang/list.uvue'))], - ['MaintainLangDetail', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/lang/detail.uvue'))], - ['MaintainLangRegion', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/lang/region.uvue'))], - ['MaintainLangConfig', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/lang/config.uvue'))], - ['MaintainToolDb', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/dev-tools/database.uvue'))], - ['MaintainToolFile', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/dev-tools/file.uvue'))], - ['MaintainToolApi', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/dev-tools/api.uvue'))], - ['MaintainToolDic', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/dev-tools/data-dict.uvue'))], - ['MaintainSysInfo', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/sys/info.uvue'))] + ['MaintainDevConfig', MaintainDevConfig], + ['MaintainDevData', MaintainDevData], + ['MaintainDevTask', MaintainDevTask], + ['MaintainDevAuth', MaintainDevAuth], + ['MaintainDevModule', MaintainDevModule], + ['MaintainDevEvent', MaintainDevEvent], + ['MaintainSecurityCache', MaintainSecurityCache], + ['MaintainSecurityLog', MaintainSecurityLog], + ['MaintainSecurityUpgrade', MaintainSecurityUpgrade], + ['MaintainDataLogistics', MaintainDataLogistics], + ['MaintainDataCity', MaintainDataCity], + ['MaintainDataClear', MaintainDataClear], + ['MaintainApiAccount', MaintainApiAccount], + ['MaintainLangList', MaintainLangList], + ['MaintainLangDetail', MaintainLangDetail], + ['MaintainLangRegion', MaintainLangRegion], + ['MaintainLangConfig', MaintainLangConfig], + ['MaintainToolDb', MaintainToolDb], + ['MaintainToolFile', MaintainToolFile], + ['MaintainToolApi', MaintainToolApi], + ['MaintainToolDic', MaintainToolDic], + ['MaintainSysInfo', MaintainSysInfo] ]) /** diff --git a/layouts/admin/router/adminRoutes.uts b/layouts/admin/router/adminRoutes.uts index c88c8d70..429115cd 100644 --- a/layouts/admin/router/adminRoutes.uts +++ b/layouts/admin/router/adminRoutes.uts @@ -29,6 +29,8 @@ export type RouteRecord = { /** * 菜单分组类型 */ +import { hasAdminModuleAccess } from '@/layouts/admin/utils/role.uts' + export type MenuGroup = { id: string title: string @@ -65,12 +67,22 @@ export const topMenus: TopMenu[] = [ order: 1, groups: [] }, + { + id: 'shop', + title: '店铺', + icon: 'shop', + path: '/pages/mall/admin/shop/manage', + order: 2, + groups: [ + { id: 'shop-manage', title: '', order: 1 } + ] + }, { id: 'user', title: '用户', icon: 'user', path: '/pages/mall/admin/user/management/index', - order: 2, + order: 3, groups: [ { id: 'user-manage', title: '', order: 1 } ] @@ -79,7 +91,7 @@ export const topMenus: TopMenu[] = [ id: 'order', title: '订单', icon: 'order', - path: '/pages/mall/admin/order/list', + path: '/pages/mall/admin/order/order-management/index', order: 3, groups: [ { id: 'order-manage', title: '', order: 1 } @@ -119,10 +131,11 @@ export const topMenus: TopMenu[] = [ id: 'distribution', title: '分销', icon: 'share', - path: '/pages/mall/admin/distribution/statistic', + path: '/pages/mall/admin/distribution/promoter/index', order: 6, groups: [ - { id: 'distribution-manage', title: '', order: 1 } + { id: 'distribution-manage', title: '', order: 1 }, + { id: 'distribution-division', title: '事业部', order: 2 } ] }, { @@ -230,9 +243,39 @@ export const routes: RouteRecord[] = [ order: 1 }, - // ========== 用户模块 ========== + // ========== 店铺模块 ========== { - id: 'user_statistic', + id: 'shop_manage', + title: '店铺管理', + path: '/pages/mall/admin/shop/manage', + componentKey: 'ShopManage', + parentId: 'shop', + groupId: 'shop-manage', + order: 1 + }, + { + id: 'shop_create', + title: '申请入驻', + path: '/pages/mall/admin/shop/create', + componentKey: 'ShopCreate', + parentId: 'shop', + groupId: 'shop-manage', + hidden: true, + order: 2 + }, + + // ========== 用户模块 ========== + // ========== 个人中心 ========== + { + id: 'home_user_center', + title: '个人中心', + path: '/pages/mall/admin/userCenter/index', + componentKey: 'UserCenter', + order: 100 + }, + + { + id: 'user_statistic', title: '用户统计', path: '/pages/mall/admin/user/statistics/index', componentKey: 'UserStatistic', @@ -281,6 +324,15 @@ export const routes: RouteRecord[] = [ auth: ['user-user-level'], order: 5 }, + { + id: 'user_config', + title: '用户配置', + path: '/pages/mall/admin/user/config/index', + componentKey: 'UserMemberConfig', + parentId: 'user', + groupId: 'user-manage', + order: 6 + }, // ========== 商品模块 ========== { @@ -399,7 +451,7 @@ export const routes: RouteRecord[] = [ { id: 'order_list', title: '订单管理', - path: '/pages/mall/admin/order/list', + path: '/pages/mall/admin/order/order-management/index', componentKey: 'OrderList', parentId: 'order', groupId: 'order-manage', @@ -474,7 +526,7 @@ export const routes: RouteRecord[] = [ { id: 'marketing_integral_statistic', title: '积分统计', - path: '/pages/mall/admin/marketing/integral/statistic', + path: '/pages/mall/admin/marketing/points/statistic', componentKey: 'MarketingIntegralStatistic', parentId: 'marketing', groupId: 'marketing-integral', @@ -484,7 +536,7 @@ export const routes: RouteRecord[] = [ { id: 'marketing_integral_product', title: '积分商品', - path: '/pages/mall/admin/marketing/integral/product', + path: '/pages/mall/admin/marketing/points/product', componentKey: 'MarketingIntegralProduct', parentId: 'marketing', groupId: 'marketing-integral', @@ -494,7 +546,7 @@ export const routes: RouteRecord[] = [ { id: 'marketing_integral_order', title: '积分订单', - path: '/pages/mall/admin/marketing/integral/order', + path: '/pages/mall/admin/marketing/points/order', componentKey: 'MarketingIntegralOrder', parentId: 'marketing', groupId: 'marketing-integral', @@ -504,7 +556,7 @@ export const routes: RouteRecord[] = [ { id: 'marketing_integral_record', title: '积分记录', - path: '/pages/mall/admin/marketing/integral/record', + path: '/pages/mall/admin/marketing/points/record', componentKey: 'MarketingIntegralRecord', parentId: 'marketing', groupId: 'marketing-integral', @@ -514,7 +566,7 @@ export const routes: RouteRecord[] = [ { id: 'marketing_integral_config', title: '积分配置', - path: '/pages/mall/admin/marketing/integral/config', + path: '/pages/mall/admin/marketing/points/config', componentKey: 'MarketingIntegralConfig', parentId: 'marketing', groupId: 'marketing-integral', @@ -905,6 +957,7 @@ export const routes: RouteRecord[] = [ componentKey: 'DistributionStatistic', parentId: 'distribution', groupId: 'distribution-manage', + hidden: true, order: 1 }, { @@ -936,30 +989,30 @@ export const routes: RouteRecord[] = [ }, { id: 'division_list', - title: '事业部管理', + title: '事业部列表', path: '/pages/mall/admin/distribution/division/list', componentKey: 'DivisionList', parentId: 'distribution', - groupId: 'distribution-manage', - order: 5 + groupId: 'distribution-division', + order: 1 }, { id: 'division_agent', - title: '代理商管理', + title: '代理商列表', path: '/pages/mall/admin/distribution/division/agent', componentKey: 'DivisionAgent', parentId: 'distribution', - groupId: 'distribution-manage', - order: 6 + groupId: 'distribution-division', + order: 2 }, { id: 'division_apply', - title: '事业部申请', + title: '代理商申请', path: '/pages/mall/admin/distribution/division/apply', componentKey: 'DivisionApply', parentId: 'distribution', - groupId: 'distribution-manage', - order: 7 + groupId: 'distribution-division', + order: 3 }, // ========== 客服模块 ========== @@ -1173,7 +1226,10 @@ export const routes: RouteRecord[] = [ * 获取所有一级菜单 */ export function getTopMenus(): TopMenu[] { - return topMenus.sort((a, b) => a.order - b.order) + // 基于 role 的模块过滤 + return topMenus + .filter(m => hasAdminModuleAccess(m.id)) + .sort((a, b) => a.order - b.order) } /** diff --git a/layouts/admin/router/settingSubSiderMenu.uts b/layouts/admin/router/settingSubSiderMenu.uts index 0f298de4..5a15c878 100644 --- a/layouts/admin/router/settingSubSiderMenu.uts +++ b/layouts/admin/router/settingSubSiderMenu.uts @@ -7,6 +7,10 @@ export type MenuNode = { } export const settingSubSiderMenu: MenuNode[] = [ + { id: 'system_setting_group', title: '系统设置', type: 'group', children: [ + { id: 'setting_system_config', title: '系统配置', type: 'page', path: '/pages/mall/admin/setting/system/config' } + ] + }, { id: 'setting_message_index', title: '消息管理', type: 'page', path: '/pages/mall/admin/setting/message' }, { id: 'setting_protocol_index', title: '协议设置', type: 'page', path: '/pages/mall/admin/setting/agreement' }, { id: 'setting_ticket_index', title: '小票配置', type: 'page', path: '/pages/mall/admin/setting/ticket' }, diff --git a/layouts/admin/store/adminNavStore.uts b/layouts/admin/store/adminNavStore.uts index de3ab582..34f7d2dc 100644 --- a/layouts/admin/store/adminNavStore.uts +++ b/layouts/admin/store/adminNavStore.uts @@ -12,6 +12,26 @@ import { getTopMenus } from '@/layouts/admin/router/adminRoutes.uts' import { addView, activeFullPath, visitedViews } from './tagsViewStore.uts' +import { hasAdminModuleAccess } from '@/layouts/admin/utils/role.uts' + +// ============================================ +// Tabs 持久化 keys(使用 sessionStorage,与 token 策略一致) +// sessionStorage 在同一标签页 F5 刷新后保留,关闭标签页后自动清除 +// ============================================ +const TAB_STORAGE_KEY = 'admin_opened_tabs' +const ACTIVE_ROUTE_KEY = 'admin_active_route' +const LAST_SUB_STORAGE_KEY = 'admin_last_sub_by_menu' + +/** 将当前 tabs / activeRouteId / lastSubIdByMenu 写入 sessionStorage */ +function persistNavState(): void { + // #ifdef H5 + try { + sessionStorage.setItem(TAB_STORAGE_KEY, JSON.stringify(tabs.value)) + sessionStorage.setItem(ACTIVE_ROUTE_KEY, activeRouteId.value) + sessionStorage.setItem(LAST_SUB_STORAGE_KEY, JSON.stringify(lastSubIdByMenu.value)) + } catch (_) {} + // #endif +} /** * 标签页类型 @@ -77,14 +97,34 @@ export const isOverlayVisible = ref(false) * @param addTab 是否添加到标签页 */ export function openRoute(routeId: string, addTab: boolean = true): void { + + const route = findRouteById(routeId) if (!route) { console.warn(`[AdminNav] Route not found: ${routeId}`) return } + // 基于 role 的页面访问拦截 + // route.parentId 对应上方 topMenus 的 id。这里校验是否有权限 + const moduleId = route.parentId ? route.parentId : route.id.split('_')[0] + if (!hasAdminModuleAccess(moduleId)) { + uni.showToast({ + title: '您没有权限访问该模块', + icon: 'none' + }) + console.warn(`[AdminNav] Access denied for role to module: ${moduleId}`) + // 回退到首页 + if (routeId !== 'home_index') { + openRoute('home_index', addTab) + } + return + } + // 更新当前路由 activeRouteId.value = routeId + + // 更新一级菜单选中态 if (route.parentId) { @@ -99,6 +139,9 @@ export function openRoute(routeId: string, addTab: boolean = true): void { // 添加到标签页 if (addTab) { addTabItem(route) + } else { + // 即使不新增 tab,activeRouteId 变化了也要持久化 + persistNavState() } } @@ -129,6 +172,9 @@ function addTabItem(route: RouteRecord): void { // 更新新版 TagsViewStore addView(route, route.path) activeFullPath.value = route.path + + // 持久化到 sessionStorage + persistNavState() } /** @@ -157,6 +203,8 @@ export function closeTab(tabId: string): void { } tabs.value.splice(index, 1) + // 持久化 + persistNavState() } /** @@ -171,6 +219,8 @@ export function closeOtherTabs(keepTabId: string): void { if (!stillExists) { openRoute(keepTabId, false) } + // 持久化 + persistNavState() } /** @@ -184,6 +234,8 @@ export function closeAllTabs(): void { if (homeTab) { openRoute(homeTab.id, false) } + // 持久化 + persistNavState() } /** @@ -201,7 +253,7 @@ export function toggleSubSider(): void { } /** - * 初始化导航状态 + * 初始化导航状态(首次进入 / 恢复失败时的兜底) * 在 AdminLayout 组件 onMounted 时调用 */ export function initNavState(): void { @@ -223,6 +275,86 @@ export function initNavState(): void { openRoute('home_index', false) } +/** + * 从 sessionStorage 恢复导航状态(F5刷新后调用) + * - 校验每个缓存 tab 的路由是否仍然存在 + * - 校验是否仍有权限 + * - 过滤无效项后重建 tabs + * - 恢复 activeRouteId 和菜单高亮 + * @returns true=恢复成功,false=无有效缓存或恢复失败(调用方应走 initNavState 兜底) + */ +export function restoreNavState(): boolean { + // #ifdef H5 + try { + const rawTabs = sessionStorage.getItem(TAB_STORAGE_KEY) + if (!rawTabs) return false + + const savedTabs = JSON.parse(rawTabs) as TabItem[] + if (!Array.isArray(savedTabs) || savedTabs.length === 0) return false + + // 校验并过滤:路由必须存在且有权限 + const validTabs = savedTabs.filter(tab => { + const route = findRouteById(tab.id) + if (!route) return false // 路由已不存在(文件删除或路由表变更) + const moduleId = route.parentId ?? tab.id.split('_')[0] + return hasAdminModuleAccess(moduleId) // 检查权限 + }) + + // 首页 tab 始终保留(防止全部被过滤后无处可去) + const homeRoute = findRouteById('home_index') + if (homeRoute && !validTabs.some(t => t.id === 'home_index')) { + validTabs.unshift({ + id: homeRoute.id, + title: homeRoute.title, + path: homeRoute.path, + isAffix: homeRoute.isAffix || false + }) + } + + if (validTabs.length === 0) return false + + // 重建 tabs + tabs.value = validTabs + validTabs.forEach(tab => { + const route = findRouteById(tab.id) + if (route) addView(route, route.path) + }) + + // 恢复 lastSubIdByMenu + try { + const rawLast = sessionStorage.getItem(LAST_SUB_STORAGE_KEY) + if (rawLast) { + lastSubIdByMenu.value = JSON.parse(rawLast) as Record + } + } catch (_) {} + + // 恢复 activeRouteId + const savedActive = sessionStorage.getItem(ACTIVE_ROUTE_KEY) + const activeIsValid = savedActive != null && + findRouteById(savedActive) != null && + validTabs.some(t => t.id === savedActive) + + const targetId = activeIsValid ? savedActive! : validTabs[0].id + activeRouteId.value = targetId + activeFullPath.value = findRouteById(targetId)?.path ?? '' + + const activeRoute = findRouteById(targetId) + if (activeRoute?.parentId) { + activeTopMenuId.value = activeRoute.parentId + } else { + activeTopMenuId.value = targetId.split('_')[0] + } + + console.log('[AdminNav] 已从缓存恢复导航状态, tabs:', validTabs.length, 'active:', targetId) + return true + } catch (e) { + console.warn('[AdminNav] 恢复导航状态失败,将走默认初始化:', e) + return false + } + // #endif + return false +} + /** * 根据 currentPage 同步状态 * 用于页面组件传入 currentPage prop 时的状态同步 diff --git a/layouts/admin/utils/adminAuth.uts b/layouts/admin/utils/adminAuth.uts new file mode 100644 index 00000000..0e839fd0 --- /dev/null +++ b/layouts/admin/utils/adminAuth.uts @@ -0,0 +1,81 @@ +import { state, getCurrentUser } from '@/utils/store.uts' +import { clearAdminRoleCache, refreshAdminRole } from './role.uts' +import supa, { supaReady } from '@/components/supadb/aksupainstance.uts' + +let __isHandlingExpired = false + +/** + * 统一“登录过期”闭环处理 + * - 防止重复弹窗 + * - 清理所有认证、用户相关缓存 + * - 重置状态树 + * - 统一跳转回登录页 + */ +export function handleSessionExpired(reason?: string) { + if (__isHandlingExpired) return + __isHandlingExpired = true + + console.warn('[AdminAuth] 执行会话过期统一闭环:', reason ?? '未知原因') + + // 1. 弹出提示 (确保只弹一次) + uni.showToast({ + title: '登录已过期,请重新登录', + icon: 'none', + duration: 2000 + }) + + // 2. 清除本地相关存储 + try { + supa.signOut() + } catch(e){} + clearAdminRoleCache() + + // 3. 重置全局业务状态树,防止其他组件看到旧内存残影 + state.isLoggedIn = false + state.authUser = null + state.userProfile = { username: '', email: '' } + + // 4. 跳转登录页 + setTimeout(() => { + uni.reLaunch({ + url: '/pages/user/login' + }) + setTimeout(() => { __isHandlingExpired = false }, 1000) + }, 1000) +} + + +/** + * 统一的后台启动恢复授权流程 + * 返回是否恢复/保持有效的登录态 + */ +export async function ensureAdminSession(): Promise { + try { + // ① 等待 hydrateSessionFromStorage() 完成(从storage恢复token→异步网络请求) + // 必须在 getSession() 之前 await,否则刷新后 this.session 仍为 null, + // 会被误判为未登录并触发 handleSessionExpired。 + try { await supaReady } catch (_) {} + + const sessionInfo = supa.getSession() + if (sessionInfo.session == null) { + console.warn('[AdminAuth] 没有发现凭证,要求重新登录') + handleSessionExpired('No credentials found') + return false + } + + // 主动检查并补齐 + const role = await refreshAdminRole() + if (role === 'unknown' || (state.userProfile != null && state.userProfile!.id == null)) { + // 等等,如果是断网状态呢?其实 store 里已经用 status <= 0 判断过断网了。 + // 上一步在 store/getCurrentUser 时,如果返回 401 才会真正导致清空。 + console.warn('[AdminAuth] Session被认为无效或用户确权失败') + handleSessionExpired('Role verification failed') + return false + } + return true + } catch (e) { + console.error('[AdminAuth] 鉴权启动异常:', e) + handleSessionExpired('Auth exception') + return false + } +} diff --git a/layouts/admin/utils/role.uts b/layouts/admin/utils/role.uts new file mode 100644 index 00000000..c7e2ec31 --- /dev/null +++ b/layouts/admin/utils/role.uts @@ -0,0 +1,131 @@ +import { state, getCurrentUser } from '@/utils/store.uts' +import supa from '@/components/supadb/aksupainstance.uts' + +/** + * 将任意角色类型的原始值格式化为标准化的应用角色 + */ +export function normalizeRole(rawRole: any | null): string { + if (rawRole == null || rawRole === undefined) return 'unknown' + const roleStr = String(rawRole).trim().toLowerCase() + if (roleStr === 'admin') return 'admin' + if (roleStr === 'merchant') return 'merchant' + return 'unknown' +} + +/** + * 判断是否为纯后台管理员 + */ +export function isAdminRole(role: string): boolean { + return normalizeRole(role) === 'admin' +} + +/** + * 判断是否为商户角色 + */ +export function isMerchantRole(role: string): boolean { + return normalizeRole(role) === 'merchant' +} + +/** + * 获取当前的标准化角色 (同步方法) + */ +export function getCurrentAdminRole(): string { + // 1. 最高优先级:当前响应式内存 userProfile(已查数据库) + if (state.userProfile != null && state.userProfile!.role != null) { + const memRole = normalizeRole(state.userProfile!.role) + if (memRole === 'admin' || memRole === 'merchant') { + return memRole + } + } + + // 2. Auth Session兜底获取(Tab 隔离): + const sessionUser = supa.getSession().user + if (sessionUser != null) { + const meta = sessionUser.get("user_metadata") as UTSJSONObject | null + if (meta != null && meta.getString("role") != null) { + const metaRole = normalizeRole(meta.getString("role")) + if (metaRole === "admin" || metaRole === "merchant") return metaRole + } + } + + console.warn("[AdminRole] 未能获取到有效的管理端角色,准备安全降级...") + return "unknown" +} + +/** + * 清理本地相关角色和管理端缓存 (登出时调用) + */ +export function clearAdminRoleCache(): void { + // 清理 admin 专属 + uni.removeStorageSync('adminRole') + uni.removeStorageSync('admin_role') + uni.removeStorageSync('merchant_id') +} + +/** + * 校验并写入最新的 adminRole (用于 Login 后或者 Layout 挂载时强制刷新) + */ +export async function refreshAdminRole(): Promise { + const userStrProfile = await getCurrentUser() + let finalRole = 'unknown' + + if (userStrProfile != null && userStrProfile.role != null) { + finalRole = normalizeRole(userStrProfile.role) + console.log('[AdminRole] 从 ak_users 读取真实身份成功:', finalRole) + } else { + // metadata fallback + const sessionInfo = supa.getSession() + if (sessionInfo.user != null) { + const meta = sessionInfo.user?.get("user_metadata") as UTSJSONObject | null + if (meta != null && meta.getString('role') != null) { + finalRole = normalizeRole(meta.getString('role')) + console.log('[AdminRole] 从 Auth Metadata 读取兜底身份:', finalRole) + } + } + } + + if (finalRole !== 'unknown') { + // uni.setStorageSync('adminRole', finalRole) // 移除缓存耦合,强制按单例会话状态刷新 + if (state.userProfile != null) { + state.userProfile!.role = finalRole + } + console.log('[AdminRole] 最新角色已写入状态和缓存:', finalRole) + } + + return finalRole +} + +export function getVisibleTopMenuIds(role: string): string[] { + const normRole = normalizeRole(role) + if (normRole === 'admin') { + return ['home', 'shop', 'user', 'order', 'product', 'marketing', 'distribution', 'kefu', 'finance', 'cms', 'decoration', 'app', 'setting', 'maintain'] + } + + if (normRole === 'merchant') { + return ['home', 'shop', 'order', 'product', 'marketing', 'finance'] + } + + return ['home'] +} + +export function hasAdminModuleAccess(moduleId: string | undefined): boolean { + if (!moduleId) return true + + const role = getCurrentAdminRole() + const normRole = normalizeRole(role) + + if (normRole === 'unknown') { + return moduleId === 'home' + } + + if (normRole === 'admin') { + return true + } + + if (normRole === 'merchant') { + const allowed = ['home', 'shop', 'order', 'product', 'marketing', 'finance'] + return allowed.includes(moduleId) + } + + return false +} diff --git a/main.js b/main.js index 2c1e55ed..858be585 100644 --- a/main.js +++ b/main.js @@ -1,2 +1,2 @@ // Bridge entry to ensure Vite serves JS MIME while loading UTS entry. -import './main.uts' +import "./main.uts"; diff --git a/manifest.json b/manifest.json index d2310c6b..46a775c2 100644 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "name": "mall", - "appid": "__UNI__9462CA7", + "appid": "__UNI__81482FF", "description": "A multi-role e-commerce application.", "versionName": "1.0.0", "versionCode": "100", @@ -48,10 +48,7 @@ "setting": { "urlCheck": false }, - "usingComponents": true, - "unipush": { - "enable": false - } + "usingComponents": true }, "mp-alipay": { "usingComponents": true @@ -73,20 +70,6 @@ "mode": "hash", "base": "./" } - }, - "web": { - "router": { - "mode": "" - }, - "unipush": { - "enable": false - } - }, - "app-android": { - "distribute": { - "modules": { - "uni-push": {} - } - } + } } } \ No newline at end of file diff --git a/pages-simple.json b/pages-simple.json deleted file mode 100644 index 131f2bff..00000000 --- a/pages-simple.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "pages": [ - { - "path": "pages/minimal", - "style": { - "navigationBarTitleText": "最小测试" - } - } - ] -} \ No newline at end of file diff --git a/pages.json b/pages.json index 170a696f..1d449149 100644 --- a/pages.json +++ b/pages.json @@ -7,6 +7,20 @@ "navigationStyle": "custom" } }, + { + "path": "pages/mall/admin/homePage/index", + "style": { + "navigationBarTitleText": "管理后台", + "navigationStyle": "custom" + } + }, + { + "path": "pages/mall/admin/userCenter/index", + "style": { + "navigationBarTitleText": "个人中心", + "navigationStyle": "custom" + } + }, { "path": "pages/user/boot", "style": { @@ -514,394 +528,835 @@ }, { "root": "pages/mall/admin", + "pages": [] + }, + { + "root": "pages/mall/admin/order", "pages": [ { - "path": "user/management/index", - "style": { - "navigationBarTitleText": "用户管理", - "navigationStyle": "custom" - } - }, - { - "path": "product/product-management/index", - "style": { - "navigationBarTitleText": "商品管理", - "navigationStyle": "custom" - } - }, - { - "path": "order/list", - "style": { - "navigationBarTitleText": "订单列表", - "navigationStyle": "custom" - } - }, - { - "path": "order/order-statistics/index", - "style": { - "navigationBarTitleText": "订单统计", - "navigationStyle": "custom" - } - }, - { - "path": "order/order-configuration/index", - "style": { - "navigationBarTitleText": "订单配置", - "navigationStyle": "custom" - } - }, - { - "path": "order/aftersales-order/index", - "style": { - "navigationBarTitleText": "售后订单", - "navigationStyle": "custom" - } - }, - { - "path": "order/write-off-records/index", - "style": { - "navigationBarTitleText": "核销记录", - "navigationStyle": "custom" - } - }, - { - "path": "order-management", + "path": "order-management/index", "style": { "navigationBarTitleText": "订单管理", "navigationStyle": "custom" } }, { - "path": "finance/record", + "path": "order-statistics/index", "style": { - "navigationBarTitleText": "财务管理", + "navigationBarTitleText": "订单统计", "navigationStyle": "custom" } }, { - "path": "user/statistics/index", + "path": "order-configuration/index", + "style": { + "navigationBarTitleText": "订单配置", + "navigationStyle": "custom" + } + }, + { + "path": "aftersales-order/index", + "style": { + "navigationBarTitleText": "售后订单", + "navigationStyle": "custom" + } + }, + { + "path": "write-off-records/index", + "style": { + "navigationBarTitleText": "核销记录", + "navigationStyle": "custom" + } + }, + { + "path": "cashier-order/index", + "style": { + "navigationBarTitleText": "收銀台订单", + "navigationStyle": "custom" + } + } + ] + }, + { + "root": "pages/mall/admin/product", + "pages": [ + { + "path": "product-management/index", + "style": { + "navigationBarTitleText": "商品管理", + "navigationStyle": "custom" + } + }, + { + "path": "product-statistics/index", + "style": { + "navigationBarTitleText": "商品统计", + "navigationStyle": "custom" + } + }, + { + "path": "classification/index", + "style": { + "navigationBarTitleText": "商品分类", + "navigationStyle": "custom" + } + }, + { + "path": "reviews/index", + "style": { + "navigationBarTitleText": "商品评分", + "navigationStyle": "custom" + } + }, + { + "path": "specifications/index", + "style": { + "navigationBarTitleText": "商品规格", + "navigationStyle": "custom" + } + }, + { + "path": "parameters/index", + "style": { + "navigationBarTitleText": "商品参数", + "navigationStyle": "custom" + } + }, + { + "path": "labels/index", + "style": { + "navigationBarTitleText": "商品标签", + "navigationStyle": "custom" + } + }, + { + "path": "protection/index", + "style": { + "navigationBarTitleText": "商品保障", + "navigationStyle": "custom" + } + } + ] + }, + { + "root": "pages/mall/admin/user", + "pages": [ + { + "path": "management/index", + "style": { + "navigationBarTitleText": "用户管理", + "navigationStyle": "custom" + } + }, + { + "path": "statistics/index", "style": { "navigationBarTitleText": "用户统计", "navigationStyle": "custom" } }, { - "path": "subscription/plan-management", + "path": "grouping/index", + "style": { + "navigationBarTitleText": "用户分组", + "navigationStyle": "custom" + } + }, + { + "path": "label/index", + "style": { + "navigationBarTitleText": "用户标签", + "navigationStyle": "custom" + } + }, + { + "path": "level/index", + "style": { + "navigationBarTitleText": "用户等级", + "navigationStyle": "custom" + } + }, + { + "path": "config/index", + "style": { + "navigationBarTitleText": "用户配置", + "navigationStyle": "custom" + } + } + ] + }, + { + "root": "pages/mall/admin/subscription", + "pages": [ + { + "path": "plan-management", "style": { "navigationBarTitleText": "订阅方案管理" } }, { - "path": "subscription/user-subscriptions", + "path": "user-subscriptions", "style": { "navigationBarTitleText": "用户订阅管理" } - }, + } + ] + }, + { + "root": "pages/mall/admin/distribution", + "pages": [ { - "path": "distribution/setting/index", + "path": "setting/index", "style": { "navigationBarTitleText": "分销设置", "navigationStyle": "custom" } }, { - "path": "distribution/promoter/index", + "path": "distributor-management/index", "style": { "navigationBarTitleText": "分销员管理", "navigationStyle": "custom" } }, { - "path": "distribution/level/index", + "path": "level/index", "style": { "navigationBarTitleText": "分销等级管理", "navigationStyle": "custom" } }, { - "path": "distribution/division/list", + "path": "business-division/business-division-list/index", "style": { - "navigationBarTitleText": "事业部管理", + "navigationBarTitleText": "事业部列表", "navigationStyle": "custom" } }, { - "path": "distribution/division/agent", + "path": "business-division/agent-list/index", "style": { "navigationBarTitleText": "代理商列表", "navigationStyle": "custom" } }, { - "path": "distribution/division/apply", + "path": "business-division/agent-application/index", "style": { - "navigationBarTitleText": "事业部申请", + "navigationBarTitleText": "代理商申请", + "navigationStyle": "custom" + } + } + ] + }, + { + "root": "pages/mall/admin/marketing", + "pages": [ + { + "path": "coupon/coupon-list/index", + "style": { + "navigationBarTitleText": "优惠券列表", "navigationStyle": "custom" } }, { - "path": "marketing/coupon/list", + "path": "coupon/claim-record/index", "style": { - "navigationBarTitleText": "优惠券列表" + "navigationBarTitleText": "用户领取记录", + "navigationStyle": "custom" } }, { - "path": "marketing/coupon/receive", + "path": "points/statistics/index", "style": { - "navigationBarTitleText": "用户领取记录" + "navigationBarTitleText": "积分统计", + "navigationStyle": "custom" } }, { - "path": "marketing/points/index", + "path": "points/products/index", "style": { - "navigationBarTitleText": "积分管理" + "navigationBarTitleText": "积分商品", + "navigationStyle": "custom" } }, { - "path": "marketing/signin/rule", + "path": "points/orders/index", "style": { - "navigationBarTitleText": "签到规则" + "navigationBarTitleText": "积分订单", + "navigationStyle": "custom" } }, { - "path": "marketing/signin/record", + "path": "points/record/index", "style": { - "navigationBarTitleText": "签到记录" + "navigationBarTitleText": "积分记录", + "navigationStyle": "custom" } }, { - "path": "maintain/dev-tools/database", + "path": "points/config/index", + "style": { + "navigationBarTitleText": "积分配置", + "navigationStyle": "custom" + } + }, + { + "path": "lottery/list/index", + "style": { + "navigationBarTitleText": "抽奖列表", + "navigationStyle": "custom" + } + }, + { + "path": "lottery/configuration/index", + "style": { + "navigationBarTitleText": "抽奖配置", + "navigationStyle": "custom" + } + }, + { + "path": "combination/products/index", + "style": { + "navigationBarTitleText": "拼团商品", + "navigationStyle": "custom" + } + }, + { + "path": "combination/list/index", + "style": { + "navigationBarTitleText": "拼团列表", + "navigationStyle": "custom" + } + }, + { + "path": "combination/index", + "style": { + "navigationBarTitleText": "拼团活动", + "navigationStyle": "custom" + } + }, + { + "path": "seckill/list/index", + "style": { + "navigationBarTitleText": "秒杀列表", + "navigationStyle": "custom" + } + }, + { + "path": "seckill/products/index", + "style": { + "navigationBarTitleText": "秒杀商品", + "navigationStyle": "custom" + } + }, + { + "path": "seckill/config/index", + "style": { + "navigationBarTitleText": "秒杀配置", + "navigationStyle": "custom" + } + }, + { + "path": "member/type/index", + "style": { + "navigationBarTitleText": "会员类型", + "navigationStyle": "custom" + } + }, + { + "path": "member/right/index", + "style": { + "navigationBarTitleText": "会员权益", + "navigationStyle": "custom" + } + }, + { + "path": "member/kami-membership/index", + "style": { + "navigationBarTitleText": "卡密会员", + "navigationStyle": "custom" + } + }, + { + "path": "member/record/index", + "style": { + "navigationBarTitleText": "会员记录", + "navigationStyle": "custom" + } + }, + { + "path": "member/config/index", + "style": { + "navigationBarTitleText": "会员配置", + "navigationStyle": "custom" + } + }, + { + "path": "live/live-management/index", + "style": { + "navigationBarTitleText": "直播間管理", + "navigationStyle": "custom" + } + }, + { + "path": "live/products-management/index", + "style": { + "navigationBarTitleText": "直播商品管理", + "navigationStyle": "custom" + } + }, + { + "path": "live/streamer-management/index", + "style": { + "navigationBarTitleText": "主播管理", + "navigationStyle": "custom" + } + }, + { + "path": "live/index", + "style": { + "navigationBarTitleText": "直播首页", + "navigationStyle": "custom" + } + }, + { + "path": "recharge/amount-setting/index", + "style": { + "navigationBarTitleText": "充値额度设置", + "navigationStyle": "custom" + } + }, + { + "path": "recharge/config/index", + "style": { + "navigationBarTitleText": "充値配置", + "navigationStyle": "custom" + } + }, + { + "path": "checkin/config/index", + "style": { + "navigationBarTitleText": "签到配置", + "navigationStyle": "custom" + } + }, + { + "path": "checkin/reward/index", + "style": { + "navigationBarTitleText": "签到奖励", + "navigationStyle": "custom" + } + }, + { + "path": "bargain/list/index", + "style": { + "navigationBarTitleText": "砍价列表", + "navigationStyle": "custom" + } + }, + { + "path": "bargain/products/index", + "style": { + "navigationBarTitleText": "砍价商品", + "navigationStyle": "custom" + } + }, + { + "path": "newcomer/index", + "style": { + "navigationBarTitleText": "新人礼包", + "navigationStyle": "custom" + } + }, + { + "path": "marketing-statistics/index", + "style": { + "navigationBarTitleText": "营销统计", + "navigationStyle": "custom" + } + } + ] + }, + { + "root": "pages/mall/admin/maintain", + "pages": [ + { + "path": "dev-tools/database/index", "style": { "navigationBarTitleText": "数据库管理", "navigationStyle": "custom" } }, { - "path": "maintain/dev-tools/file", + "path": "dev-tools/file/index", "style": { "navigationBarTitleText": "文件管理", "navigationStyle": "custom" } }, { - "path": "maintain/dev-tools/api", + "path": "dev-tools/interface/index", "style": { "navigationBarTitleText": "接口管理", "navigationStyle": "custom" } }, { - "path": "maintain/dev-tools/data-dict", + "path": "dev-tools/data-dictionary/index", "style": { "navigationBarTitleText": "数据字典", "navigationStyle": "custom" } }, { - "path": "setting/message", + "path": "dev-config/category/index", + "style": { + "navigationBarTitleText": "配置分类", + "navigationStyle": "custom" + } + }, + { + "path": "dev-config/combination-data/index", + "style": { + "navigationBarTitleText": "组合数据", + "navigationStyle": "custom" + } + }, + { + "path": "dev-config/cron-job/index", + "style": { + "navigationBarTitleText": "定时任务", + "navigationStyle": "custom" + } + }, + { + "path": "dev-config/permission/index", + "style": { + "navigationBarTitleText": "权限配置", + "navigationStyle": "custom" + } + }, + { + "path": "dev-config/module-config/index", + "style": { + "navigationBarTitleText": "模块配置", + "navigationStyle": "custom" + } + }, + { + "path": "dev-config/custom-event/index", + "style": { + "navigationBarTitleText": "自定义事件", + "navigationStyle": "custom" + } + }, + { + "path": "security/refresh-cache/index", + "style": { + "navigationBarTitleText": "刷新缓存", + "navigationStyle": "custom" + } + }, + { + "path": "security/system-log/index", + "style": { + "navigationBarTitleText": "系统日志", + "navigationStyle": "custom" + } + }, + { + "path": "security/online-upgrade/index", + "style": { + "navigationBarTitleText": "在线升级", + "navigationStyle": "custom" + } + }, + { + "path": "data/logistics/index", + "style": { + "navigationBarTitleText": "物流数据", + "navigationStyle": "custom" + } + }, + { + "path": "data/city-data/index", + "style": { + "navigationBarTitleText": "城市数据", + "navigationStyle": "custom" + } + }, + { + "path": "data/clear/index", + "style": { + "navigationBarTitleText": "清除数据", + "navigationStyle": "custom" + } + }, + { + "path": "api/account/index", + "style": { + "navigationBarTitleText": "API账号", + "navigationStyle": "custom" + } + }, + { + "path": "lang/list/index", + "style": { + "navigationBarTitleText": "语言列表", + "navigationStyle": "custom" + } + }, + { + "path": "lang/detail/index", + "style": { + "navigationBarTitleText": "语言详情", + "navigationStyle": "custom" + } + }, + { + "path": "lang/region/index", + "style": { + "navigationBarTitleText": "语言地区", + "navigationStyle": "custom" + } + }, + { + "path": "lang/config/index", + "style": { + "navigationBarTitleText": "语言配置", + "navigationStyle": "custom" + } + }, + { + "path": "sys/info/index", + "style": { + "navigationBarTitleText": "系统信息", + "navigationStyle": "custom" + } + } + ] + }, + { + "root": "pages/mall/admin/setting", + "pages": [ + { + "path": "message/index", "style": { "navigationBarTitleText": "消息管理", "navigationStyle": "custom" } }, { - "path": "setting/agreement", + "path": "agreement/index", "style": { "navigationBarTitleText": "协议设置", "navigationStyle": "custom" } }, { - "path": "setting/ticket", + "path": "receipt/index", "style": { "navigationBarTitleText": "小票配置", "navigationStyle": "custom" } }, { - "path": "setting/auth/admin", + "path": "auth/admin-management/index", "style": { "navigationBarTitleText": "管理员管理", "navigationStyle": "custom" } }, { - "path": "setting/auth/role", + "path": "auth/role-management/index", "style": { "navigationBarTitleText": "角色管理", "navigationStyle": "custom" } }, { - "path": "setting/auth/permission", + "path": "auth/menu-management/index", "style": { - "navigationBarTitleText": "权限规则", + "navigationBarTitleText": "菜单管理", "navigationStyle": "custom" } }, { - "path": "setting/delivery/staff", + "path": "delivery/management/index", "style": { "navigationBarTitleText": "配送员管理", "navigationStyle": "custom" } }, { - "path": "setting/delivery/station", + "path": "delivery/setting/station/index", "style": { "navigationBarTitleText": "提货点", "navigationStyle": "custom" } }, { - "path": "setting/delivery/verifier", + "path": "delivery/setting/verifier/index", "style": { "navigationBarTitleText": "核销员", "navigationStyle": "custom" } }, { - "path": "setting/delivery/template", + "path": "delivery/setting/template/index", "style": { "navigationBarTitleText": "运费模板", "navigationStyle": "custom" } }, { - "path": "setting/interface/onepass/index", + "path": "interface/onepass/index", "style": { "navigationBarTitleText": "一号通账户", "navigationStyle": "custom" } }, { - "path": "setting/interface/onepass/config", + "path": "interface/onepass/config/index", "style": { "navigationBarTitleText": "一号通配置", "navigationStyle": "custom" } }, { - "path": "setting/interface/storage", + "path": "interface/storage/index", "style": { "navigationBarTitleText": "系统存储配置", "navigationStyle": "custom" } }, { - "path": "setting/interface/collect", + "path": "interface/collect/index", "style": { "navigationBarTitleText": "商品采集配置", "navigationStyle": "custom" } }, { - "path": "setting/interface/logistics", + "path": "interface/logistics/index", "style": { "navigationBarTitleText": "物流查询配置", "navigationStyle": "custom" } }, { - "path": "setting/interface/e-sheet", + "path": "interface/e-sheet/index", "style": { "navigationBarTitleText": "电子面单配置", "navigationStyle": "custom" } }, { - "path": "setting/interface/sms", + "path": "interface/sms/index", "style": { "navigationBarTitleText": "短信功能配置", "navigationStyle": "custom" } }, { - "path": "setting/interface/payment", + "path": "interface/payment/index", "style": { "navigationBarTitleText": "商城支付配置", "navigationStyle": "custom" } }, { - "path": "app/wechat/menu", + "path": "system/index", + "style": { + "navigationBarTitleText": "系统配置", + "navigationStyle": "custom" + } + } + ] + }, + { + "root": "pages/mall/admin/app", + "pages": [ + { + "path": "wechat/menu/index", "style": { "navigationBarTitleText": "微信菜单", "navigationStyle": "custom" } }, { - "path": "app/wechat/news", + "path": "wechat/management/index", "style": { "navigationBarTitleText": "图文管理", "navigationStyle": "custom" } }, { - "path": "app/wechat/reply/follow", + "path": "wechat/reply/follow/index", "style": { "navigationBarTitleText": "微信关注回复", "navigationStyle": "custom" } }, { - "path": "app/wechat/reply/keyword", + "path": "wechat/reply/keyword/index", "style": { "navigationBarTitleText": "关键字回复", "navigationStyle": "custom" } }, { - "path": "app/wechat/reply/invalid", + "path": "wechat/reply/invalid/index", "style": { "navigationBarTitleText": "无效关键词回复", "navigationStyle": "custom" } }, { - "path": "app/wechat/config", + "path": "wechat/config/index", "style": { "navigationBarTitleText": "公众号配置", "navigationStyle": "custom" } }, { - "path": "app/routine/download", + "path": "routine/download/index", "style": { "navigationBarTitleText": "小程序下载", "navigationStyle": "custom" } }, { - "path": "app/routine/config", + "path": "routine/config/index", "style": { "navigationBarTitleText": "小程序配置", "navigationStyle": "custom" } }, { - "path": "app/mobile/config", + "path": "mobile/config/index", "style": { "navigationBarTitleText": "APP配置", "navigationStyle": "custom" } }, { - "path": "app/mobile/version", + "path": "mobile/version/index", "style": { "navigationBarTitleText": "版本管理", "navigationStyle": "custom" } }, { - "path": "app/pc/design", + "path": "pc/design/index", "style": { "navigationBarTitleText": "PC端装修", "navigationStyle": "custom" } }, { - "path": "app/pc/config", + "path": "pc/config/index", "style": { "navigationBarTitleText": "PC端配置", "navigationStyle": "custom" @@ -909,6 +1364,206 @@ } ] }, + { + "root": "pages/mall/admin/kefu", + "pages": [ + { + "path": "list/index", + "style": { + "navigationBarTitleText": "客服列表", + "navigationStyle": "custom" + } + }, + { + "path": "rhetoric/index", + "style": { + "navigationBarTitleText": "话术管理", + "navigationStyle": "custom" + } + }, + { + "path": "user-message/index", + "style": { + "navigationBarTitleText": "用户消息", + "navigationStyle": "custom" + } + }, + { + "path": "auto-reply/index", + "style": { + "navigationBarTitleText": "自动回复", + "navigationStyle": "custom" + } + }, + { + "path": "config/index", + "style": { + "navigationBarTitleText": "客服配置", + "navigationStyle": "custom" + } + } + ] + }, + { + "root": "pages/mall/admin/decoration", + "pages": [ + { + "path": "homepage-decoration/index", + "style": { + "navigationBarTitleText": "首页装修", + "navigationStyle": "custom" + } + }, + { + "path": "product-category/index", + "style": { + "navigationBarTitleText": "商品分类装修", + "navigationStyle": "custom" + } + }, + { + "path": "personal-center/index", + "style": { + "navigationBarTitleText": "个人中心装修", + "navigationStyle": "custom" + } + }, + { + "path": "data-config/index", + "style": { + "navigationBarTitleText": "数据配置", + "navigationStyle": "custom" + } + }, + { + "path": "theme-style/index", + "style": { + "navigationBarTitleText": "主题风格", + "navigationStyle": "custom" + } + }, + { + "path": "material-management/index", + "style": { + "navigationBarTitleText": "素材管理", + "navigationStyle": "custom" + } + }, + { + "path": "link-management/index", + "style": { + "navigationBarTitleText": "链接管理", + "navigationStyle": "custom" + } + } + ] + }, + { + "root": "pages/mall/admin/finance", + "pages": [ + { + "path": "transaction-statistics/index", + "style": { + "navigationBarTitleText": "交易统计", + "navigationStyle": "custom" + } + }, + { + "path": "finance-operations/request/index", + "style": { + "navigationBarTitleText": "提现申请", + "navigationStyle": "custom" + } + }, + { + "path": "finance-operations/management/index", + "style": { + "navigationBarTitleText": "发票管理", + "navigationStyle": "custom" + } + }, + { + "path": "finance-record/recharge-record/index", + "style": { + "navigationBarTitleText": "充值记录", + "navigationStyle": "custom" + } + }, + { + "path": "finance-record/flow/index", + "style": { + "navigationBarTitleText": "资金流水", + "navigationStyle": "custom" + } + }, + { + "path": "finance-record/billing-record/index", + "style": { + "navigationBarTitleText": "账单记录", + "navigationStyle": "custom" + } + }, + { + "path": "commission-record/index", + "style": { + "navigationBarTitleText": "佣金记录", + "navigationStyle": "custom" + } + }, + { + "path": "balance-record/statistics/index", + "style": { + "navigationBarTitleText": "余额统计", + "navigationStyle": "custom" + } + }, + { + "path": "balance-record/record/index", + "style": { + "navigationBarTitleText": "余额记录", + "navigationStyle": "custom" + } + } + ] + }, + { + "root": "pages/mall/admin/cms", + "pages": [ + { + "path": "article/index", + "style": { + "navigationBarTitleText": "文章管理", + "navigationStyle": "custom" + } + }, + { + "path": "category/index", + "style": { + "navigationBarTitleText": "文章分类", + "navigationStyle": "custom" + } + } + ] + }, + { + "root": "pages/mall/admin/shop", + "pages": [ + { + "path": "manage", + "style": { + "navigationBarTitleText": "店铺管理", + "navigationStyle": "custom" + } + }, + { + "path": "create", + "style": { + "navigationBarTitleText": "创建店铺", + "navigationStyle": "custom" + } + } + ] + }, { "root": "pages/mall/merchant", "pages": [ diff --git a/pages/SQL_FILES_CLEANUP_SUMMARY.md b/pages/SQL_FILES_CLEANUP_SUMMARY.md deleted file mode 100644 index 9fde0680..00000000 --- a/pages/SQL_FILES_CLEANUP_SUMMARY.md +++ /dev/null @@ -1,115 +0,0 @@ -# SQL 文件整理完成 - -## ✅ 已完成的整理 - -### 1. 移除重复的简化表定义 -- ✅ 从 `ANALYTICS_DB_SCHEMA.sql` 中移除了简化的 `user_sessions` 和 `page_views` 定义 -- ✅ 添加了注释说明依赖关系 - -### 2. 添加依赖说明 -- ✅ 在 `01_create_tables.sql` 中添加了注释,说明可能与 `USER_AUTH_SCHEMA.sql` 重复 -- ✅ 在 `USER_AUTH_SCHEMA.sql` 中添加了注释,说明可能与 `01_create_tables.sql` 重复 - ---- - -## 📋 当前文件结构 - -### `pages/user/test/` - 用户认证相关 -1. **`USER_AUTH_SCHEMA.sql`** ⭐ - - `ak_users` 表(业务用户资料) - - `users` 表(统计用,可能与 analytics 重复) - - `user_sessions` 表(会话统计,可能与 analytics 重复) - - `upsert_user_profile` RPC 函数 - - `handle_new_user` 触发器函数(注释中) - -2. **`USER_AUTH_TRIGGER.sql`** ⭐ - - `on_auth_user_created` 触发器(在 auth.users 插入时自动创建 ak_users) - -3. **`USER_AUTH_TEST_DATA.sql`**(可选) - - 测试数据 - -### `pages/mall/analytics/test/` - 数据分析相关 -1. **`01_create_tables.sql`** ⭐ - - 业务核心表:`orders`, `order_items`, `products`, `merchants` - - 统计表:`users`, `user_sessions`, `page_views`(可能与 USER_AUTH_SCHEMA.sql 重复) - - RLS 策略 - - `update_updated_at_column` 函数和触发器 - -2. **`ANALYTICS_DB_SCHEMA.sql`** ⭐ - - 分析表:`analytics_*` 系列表 - - RPC 函数(用于数据分析) - - **已移除**:简化的 `user_sessions` 和 `page_views` 定义 - -3. **`02_insert_test_data.sql`**(可选) - - 业务表测试数据 - -4. **`ANALYTICS_TEST_SEED.sql`**(可选) - - 分析表测试数据 - -5. **`03_test_queries.sql`**(可选) - - 测试查询 - -6. **`04_cleanup.sql`**(可选) - - 清理脚本 - ---- - -## 🚀 推荐执行顺序 - -### 首次部署 -```sql --- 1. 用户认证表(包含 users, user_sessions) -pages/user/test/USER_AUTH_SCHEMA.sql -pages/user/test/USER_AUTH_TRIGGER.sql - --- 2. 业务表(会跳过已存在的 users, user_sessions) -pages/mall/analytics/test/01_create_tables.sql - --- 3. 分析表(依赖业务表) -pages/mall/analytics/test/ANALYTICS_DB_SCHEMA.sql - --- 4. 测试数据(可选) -pages/mall/analytics/test/02_insert_test_data.sql -pages/mall/analytics/test/ANALYTICS_TEST_SEED.sql -``` - -### 后续更新 -- 如果只更新分析表,只需执行 `ANALYTICS_DB_SCHEMA.sql` -- 如果只更新业务表,只需执行 `01_create_tables.sql` -- 如果只更新用户认证,只需执行 `USER_AUTH_SCHEMA.sql` - ---- - -## 🔍 重复内容说明 - -### 已处理的重复 -1. ✅ **`user_sessions` 表** - 保留在 `USER_AUTH_SCHEMA.sql` 和 `01_create_tables.sql` 中的完整定义,移除 `ANALYTICS_DB_SCHEMA.sql` 中的简化定义 -2. ✅ **`page_views` 表** - 保留在 `01_create_tables.sql` 中的完整定义,移除 `ANALYTICS_DB_SCHEMA.sql` 中的简化定义 - -### 保留的重复(安全) -1. **`users` 表** - 在 `USER_AUTH_SCHEMA.sql` 和 `01_create_tables.sql` 中都有定义,使用 `IF NOT EXISTS` 不会冲突 -2. **`update_updated_at_column` 函数** - 在多个文件中定义,使用 `CREATE OR REPLACE FUNCTION` 不会冲突 -3. **触发器** - 使用 `IF NOT EXISTS` 或 `DROP TRIGGER IF EXISTS` 确保不会冲突 - ---- - -## ✅ 验证 - -执行以下查询验证表结构: -```sql --- 检查 user_sessions 表字段(应该是完整定义) -SELECT column_name, data_type, is_nullable -FROM information_schema.columns -WHERE table_name = 'user_sessions' AND table_schema = 'public' -ORDER BY ordinal_position; - --- 检查 page_views 表字段(应该是完整定义) -SELECT column_name, data_type, is_nullable -FROM information_schema.columns -WHERE table_name = 'page_views' AND table_schema = 'public' -ORDER BY ordinal_position; -``` - -**预期结果**: -- `user_sessions` 应包含:id, user_id, session_token, last_active_at, is_active, ip_address, user_agent, created_at, updated_at -- `page_views` 应包含:id, user_id, path, source, referrer, ip_address, user_agent, created_at diff --git a/pages/SQL_FILES_ORGANIZATION.md b/pages/SQL_FILES_ORGANIZATION.md deleted file mode 100644 index f43bd14d..00000000 --- a/pages/SQL_FILES_ORGANIZATION.md +++ /dev/null @@ -1,119 +0,0 @@ -# SQL 文件整理说明 - -## 📋 重复内容分析 - -经过检查,发现以下重复定义: - -### 1. **`users` 表**(重复) -- ✅ `pages/user/test/USER_AUTH_SCHEMA.sql` (第 63-71 行) -- ✅ `pages/mall/analytics/test/01_create_tables.sql` (第 43-51 行) -- **状态**:两个定义相同,使用 `CREATE TABLE IF NOT EXISTS` 不会冲突,但建议统一 - -### 2. **`user_sessions` 表**(重复,定义略有不同) -- ✅ `pages/user/test/USER_AUTH_SCHEMA.sql` (第 76-86 行) - **完整定义**(推荐) -- ✅ `pages/mall/analytics/test/01_create_tables.sql` (第 24-34 行) - **完整定义**(相同) -- ⚠️ `pages/mall/analytics/test/ANALYTICS_DB_SCHEMA.sql` (第 19-25 行) - **简化定义**(字段较少) - -### 3. **`page_views` 表**(重复,定义不同) -- ✅ `pages/mall/analytics/test/01_create_tables.sql` (第 90-99 行) - **完整定义**(推荐) -- ⚠️ `pages/mall/analytics/test/ANALYTICS_DB_SCHEMA.sql` (第 30-36 行) - **简化定义**(字段较少) - -### 4. **`update_updated_at_column` 函数**(重复) -- ✅ `pages/user/test/USER_AUTH_SCHEMA.sql` (第 93-99 行) -- ✅ `pages/mall/analytics/test/01_create_tables.sql` (第 107-113 行) -- **状态**:两个定义相同,使用 `CREATE OR REPLACE FUNCTION` 不会冲突 - -### 5. **触发器**(部分重复) -- `USER_AUTH_SCHEMA.sql`: `update_users_updated_at`, `update_user_sessions_updated_at` -- `01_create_tables.sql`: `update_orders_updated_at`, `update_user_sessions_updated_at`, `update_users_updated_at` - ---- - -## 🎯 整理方案 - -### 方案一:保持现状(推荐) -**优点**:每个文件独立,使用 `IF NOT EXISTS` 和 `CREATE OR REPLACE` 不会冲突 -**缺点**:有重复代码 - -**执行顺序**: -1. `pages/user/test/USER_AUTH_SCHEMA.sql` - 创建用户认证相关表 -2. `pages/mall/analytics/test/01_create_tables.sql` - 创建业务表(会跳过已存在的表) -3. `pages/mall/analytics/test/ANALYTICS_DB_SCHEMA.sql` - 创建分析表(会跳过已存在的表) - -### 方案二:统一到基础表文件(更清晰) -**优点**:减少重复,职责清晰 -**缺点**:需要重构文件结构 - -**建议结构**: -- `00_base_tables.sql` - 基础表(users, user_sessions, page_views) -- `01_user_auth.sql` - 用户认证表(ak_users)和函数 -- `02_business_tables.sql` - 业务表(orders, products, merchants等) -- `03_analytics_tables.sql` - 分析表(analytics_*) - ---- - -## 📝 当前文件职责 - -### `pages/user/test/` 目录 -- **`USER_AUTH_SCHEMA.sql`** - 用户认证核心表(ak_users, users, user_sessions)和 RPC 函数 -- **`USER_AUTH_TRIGGER.sql`** - 数据库触发器(自动创建 ak_users) -- **`USER_AUTH_TEST_DATA.sql`** - 测试数据 - -### `pages/mall/analytics/test/` 目录 -- **`01_create_tables.sql`** - 业务表(orders, users, user_sessions, products, merchants, order_items, page_views)+ RLS -- **`ANALYTICS_DB_SCHEMA.sql`** - 分析表(analytics_*)+ RPC 函数 -- **`02_insert_test_data.sql`** - 业务表测试数据 -- **`ANALYTICS_TEST_SEED.sql`** - 分析表测试数据 -- **`03_test_queries.sql`** - 测试查询 -- **`04_cleanup.sql`** - 清理脚本 - ---- - -## ✅ 推荐操作 - -### 立即执行(保持现状) -当前文件结构可以使用,因为: -1. 所有表使用 `CREATE TABLE IF NOT EXISTS` -2. 所有函数使用 `CREATE OR REPLACE FUNCTION` -3. 触发器使用 `CREATE TRIGGER IF NOT EXISTS` 或 `DROP TRIGGER IF EXISTS` - -**执行顺序**: -```sql --- 1. 用户认证表 -pages/user/test/USER_AUTH_SCHEMA.sql -pages/user/test/USER_AUTH_TRIGGER.sql - --- 2. 业务表(会跳过已存在的 users, user_sessions) -pages/mall/analytics/test/01_create_tables.sql - --- 3. 分析表(会跳过已存在的 user_sessions, page_views) -pages/mall/analytics/test/ANALYTICS_DB_SCHEMA.sql -``` - -### 未来优化(可选) -如果需要减少重复,可以: -1. 从 `ANALYTICS_DB_SCHEMA.sql` 中移除 `user_sessions` 和 `page_views` 的简化定义 -2. 确保 `01_create_tables.sql` 先执行,提供完整定义 -3. 在 `ANALYTICS_DB_SCHEMA.sql` 中添加注释说明依赖关系 - ---- - -## 🔍 验证重复 - -执行以下查询检查表是否存在: -```sql --- 检查 users 表 -SELECT column_name, data_type -FROM information_schema.columns -WHERE table_name = 'users' AND table_schema = 'public'; - --- 检查 user_sessions 表 -SELECT column_name, data_type -FROM information_schema.columns -WHERE table_name = 'user_sessions' AND table_schema = 'public'; - --- 检查 page_views 表 -SELECT column_name, data_type -FROM information_schema.columns -WHERE table_name = 'page_views' AND table_schema = 'public'; -``` diff --git a/pages/contents/articles.vue b/pages/contents/articles.vue new file mode 100644 index 00000000..244f81c3 --- /dev/null +++ b/pages/contents/articles.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/pages/mall/admin/app/mobile/config.uvue b/pages/mall/admin/app/mobile/config/index.uvue similarity index 100% rename from pages/mall/admin/app/mobile/config.uvue rename to pages/mall/admin/app/mobile/config/index.uvue diff --git a/pages/mall/admin/app/mobile/version.uvue b/pages/mall/admin/app/mobile/version/index.uvue similarity index 98% rename from pages/mall/admin/app/mobile/version.uvue rename to pages/mall/admin/app/mobile/version/index.uvue index 9b5b8f75..60abc229 100644 --- a/pages/mall/admin/app/mobile/version.uvue +++ b/pages/mall/admin/app/mobile/version/index.uvue @@ -80,7 +80,8 @@ const handleDelete = (item: VersionItem) => { diff --git a/pages/mall/admin/article/create.uvue b/pages/mall/admin/article/create.uvue deleted file mode 100644 index f13a68ab..00000000 --- a/pages/mall/admin/article/create.uvue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/pages/mall/admin/article/edit.uvue b/pages/mall/admin/article/edit.uvue deleted file mode 100644 index 619816bc..00000000 --- a/pages/mall/admin/article/edit.uvue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/pages/mall/admin/article/index.uvue b/pages/mall/admin/article/index.uvue deleted file mode 100644 index 2f611b5f..00000000 --- a/pages/mall/admin/article/index.uvue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/pages/mall/admin/cms/article/index.uvue b/pages/mall/admin/cms/article/index.uvue new file mode 100644 index 00000000..fc0c86e1 --- /dev/null +++ b/pages/mall/admin/cms/article/index.uvue @@ -0,0 +1,554 @@ + + + + + diff --git a/pages/mall/admin/cms/article/list.uvue b/pages/mall/admin/cms/article/list.uvue deleted file mode 100644 index 56ce9fe6..00000000 --- a/pages/mall/admin/cms/article/list.uvue +++ /dev/null @@ -1,467 +0,0 @@ - + + + + diff --git a/pages/mall/admin/cms/category/list.uvue b/pages/mall/admin/cms/category/list.uvue deleted file mode 100644 index 60bbfcdd..00000000 --- a/pages/mall/admin/cms/category/list.uvue +++ /dev/null @@ -1,390 +0,0 @@ - - - - - diff --git a/pages/mall/admin/content/index.uvue b/pages/mall/admin/content/index.uvue deleted file mode 100644 index 6c5d6555..00000000 --- a/pages/mall/admin/content/index.uvue +++ /dev/null @@ -1,65 +0,0 @@ - - - - - diff --git a/pages/mall/admin/decoration/components/PhonePreview.uvue b/pages/mall/admin/decoration/components/PhonePreview.uvue index 963e591c..1db45f61 100644 --- a/pages/mall/admin/decoration/components/PhonePreview.uvue +++ b/pages/mall/admin/decoration/components/PhonePreview.uvue @@ -259,7 +259,7 @@ const getGroupMockOrigPrice = (i: number): string => { diff --git a/pages/mall/admin/decoration/homepage-decoration/index.uvue b/pages/mall/admin/decoration/homepage-decoration/index.uvue new file mode 100644 index 00000000..bf4657ec --- /dev/null +++ b/pages/mall/admin/decoration/homepage-decoration/index.uvue @@ -0,0 +1,757 @@ + + + + + + diff --git a/pages/mall/admin/design/link-management.uvue b/pages/mall/admin/decoration/link-management/index.uvue similarity index 98% rename from pages/mall/admin/design/link-management.uvue rename to pages/mall/admin/decoration/link-management/index.uvue index a797dd35..c8f59853 100644 --- a/pages/mall/admin/design/link-management.uvue +++ b/pages/mall/admin/decoration/link-management/index.uvue @@ -183,7 +183,7 @@ const links = ref([ .url { flex: 1; } .mini { flex: 1; } .time { width: 160px; } -.op { width: 100px; text-align: center; } +.op { width: 100px; text-align: center; display:flex;flex-direction:row;} .table-row { display: flex; flex-direction: row; border-bottom: 1px solid #f0f0f0; padding: 12px 0; align-items: center; } .table-row .col { color: #606266; } diff --git a/pages/mall/admin/design/material.uvue b/pages/mall/admin/decoration/material-management/index.uvue similarity index 100% rename from pages/mall/admin/design/material.uvue rename to pages/mall/admin/decoration/material-management/index.uvue diff --git a/pages/mall/admin/decoration/personal-center/index.uvue b/pages/mall/admin/decoration/personal-center/index.uvue new file mode 100644 index 00000000..ef413b56 --- /dev/null +++ b/pages/mall/admin/decoration/personal-center/index.uvue @@ -0,0 +1,576 @@ + + + + + diff --git a/pages/mall/admin/decoration/product-category/index.uvue b/pages/mall/admin/decoration/product-category/index.uvue new file mode 100644 index 00000000..abc3003c --- /dev/null +++ b/pages/mall/admin/decoration/product-category/index.uvue @@ -0,0 +1,409 @@ + + + + + + diff --git a/pages/mall/admin/decoration/theme-style/index.uvue b/pages/mall/admin/decoration/theme-style/index.uvue new file mode 100644 index 00000000..b0f7da32 --- /dev/null +++ b/pages/mall/admin/decoration/theme-style/index.uvue @@ -0,0 +1,436 @@ + + + + + \ No newline at end of file diff --git a/pages/mall/admin/decoration/user.uvue b/pages/mall/admin/decoration/user.uvue deleted file mode 100644 index ac8ebdf1..00000000 --- a/pages/mall/admin/decoration/user.uvue +++ /dev/null @@ -1,321 +0,0 @@ - - - - - diff --git a/pages/mall/admin/design/README.md b/pages/mall/admin/design/README.md deleted file mode 100644 index 2594cb9d..00000000 --- a/pages/mall/admin/design/README.md +++ /dev/null @@ -1,179 +0,0 @@ -# 页面装修管理模块 - README - -> 基于CRMEB项目标准,实现完整的页面装修和DIY功能 - -## 📋 文件结构 - -``` -pages/mall/admin/design/ -├── index.uvue # 装修管理主界面(898行) -├── design.uts # 业务逻辑和数据管理(350+行) -├── editor.uvue # 装修编辑器(待实现) -├── preview.uvue # 装修预览页面(待实现) -└── README.md # 本文件 -``` - -## 🎯 核心功能 - -### 1. 首页装修 (Homepage) - -- 自定义首页布局和显示内容 -- 支持轮播图、商品展示、文本等组件 -- 实时预览效果 -- 版本管理和发布 - -### 2. 分类页装修 (Category) - -- 为不同商品分类创建装修页面 -- 支持多套分类装修方案 -- 按分类自动应用装修效果 -- 快速切换和对比 - -### 3. 商品页装修 (Product) - -- 自定义商品详情页布局 -- 支持商品图、信息、评价等模块 -- 提升商品转化率 -- A/B测试支持 - -### 4. 自定义页面 (Custom) - -- 创建和管理自定义营销页面 -- 灵活的页面路径设置 -- 独立的装修配置 -- 活动和推广专用 - -### 5. 页面模板库 (Templates) - -- 预设4套电商风格模板 -- 一键应用模板快速建站 -- 模板库不断扩充 -- 自定义模板保存 - -### 6. 组件库 (Components) - -- 8种预设装修组件: - - 图片组件 (Image) - - 文本组件 (Text) - - 商品组件 (Product) - - 轮播组件 (Carousel) - - 分割线 (Divider) - - 间距组件 (Spacer) - - 按钮组件 (Button) - - 表单组件 (Form) - -## 🔧 API 函数列表 - -| 函数 | 参数 | 返回值 | 说明 | -| -------------------------- | ---------- | -------------------------- | ---------------- | -| `getDesignList(params?)` | 查询参数 | Promise | 获取装修列表 | -| `getHomePageDesign()` | 无 | Promise | 获取首页装修 | -| `getProductPageDesign()` | 无 | Promise | 获取商品页装修 | -| `getCategoryDesigns()` | 无 | Promise | 获取分类装修列表 | -| `getCustomPages()` | 无 | Promise | 获取自定义页面 | -| `getTemplateLibrary()` | 无 | Promise | 获取模板库 | -| `getAvailableComponents()` | 无 | Promise | 获取可用组件 | -| `saveDesign(design)` | DesignItem | Promise<{id, message}> | 保存装修 | -| `publishDesign(id)` | 装修ID | Promise<{message}> | 发布装修 | -| `deleteDesign(id)` | 装修ID | Promise<{message}> | 删除装修 | - -## 📊 数据结构 - -### DesignItem 装修页面 - -```typescript -interface DesignItem { - id: string | number; // 装修ID - name: string; // 装修名称 - type: "homepage" | "category" | "product" | "custom"; - status: 0 | 1; // 0=草稿, 1=已发布 - content: DesignComponent[]; // 组件内容 - categoryId?: string | number; // 分类ID - categoryName?: string; // 分类名称 - path?: string; // 页面路径 - version?: string; // 版本号 - created_at?: string; // 创建时间 - updated_at?: string; // 更新时间 -} -``` - -### DesignComponent 组件配置 - -```typescript -interface DesignComponent { - id: string; // 组件ID - type: - | "image" - | "text" - | "product" - | "carousel" - | "divider" - | "spacer" - | "button" - | "form"; - name: string; // 组件名称 - icon: string; // 组件图标 - description?: string; // 组件描述 - config?: Record; // 配置参数 - children?: DesignComponent[]; // 子组件 -} -``` - -## 💻 使用示例 - -```typescript -// 导入服务 -import { - getDesignList, - saveDesign, - publishDesign, - getAvailableComponents, -} from "./design.uts"; - -// 获取列表 -const designs = await getDesignList(); - -// 保存装修 -await saveDesign({ - id: 1, - name: "首页", - type: "homepage", - status: 0, - content: [], -}); - -// 发布装修 -await publishDesign(1); - -// 获取组件库 -const components = await getAvailableComponents(); -``` - -## 📱 菜单配置 - -```json -{ - "id": "design", - "title": "设计", - "children": [ - { - "id": "design-home", - "title": "页面装修", - "path": "/pages/mall/admin/design/index" - } - ] -} -``` - -## 🚀 后续开发 - -- [ ] editor.uvue - 装修编辑器 -- [ ] preview.uvue - 装修预览 -- [ ] 拖拽排序功能 -- [ ] 版本管理 -- [ ] 模板库管理 - ---- - -**最后更新**: 2026-01-31 -**版本**: 1.0.0 diff --git a/pages/mall/admin/design/category.uvue b/pages/mall/admin/design/category.uvue deleted file mode 100644 index 5bf0dbeb..00000000 --- a/pages/mall/admin/design/category.uvue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/pages/mall/admin/design/components.uvue b/pages/mall/admin/design/components.uvue deleted file mode 100644 index 17f49872..00000000 --- a/pages/mall/admin/design/components.uvue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/pages/mall/admin/design/config.uts b/pages/mall/admin/design/config.uts deleted file mode 100644 index 4c2bcfcd..00000000 --- a/pages/mall/admin/design/config.uts +++ /dev/null @@ -1,439 +0,0 @@ -/** - * 设计模块页面路由配置与数据 - * 将 design.uts 的函数输出转换为页面路由/配置格式 - */ - -import type { DesignItem, DesignComponent, DesignTemplate } from './design.uts' - -/** - * 装修页面列表路由配置 - */ -export const designListPageConfig = { - id: 'design-list', - path: '/pages/mall/admin/design/list', - name: '装修列表', - title: '装修管理', - data: [ - { - id: 1, - name: '首页装修', - type: 'homepage' as const, - status: 1, - path: '/pages/mall/admin/design/index?tab=homepage', - content: [], - updated_at: '2026-01-30 14:30:00' - }, - { - id: 2, - name: '年货节活动页', - type: 'custom' as const, - status: 1, - path: '/pages/mall/admin/design/index?tab=custom', - content: [], - updated_at: '2026-01-28 10:15:00' - } - ] as DesignItem[] -} - -/** - * 首页装修页面路由配置 - */ -export const designHomepagePageConfig = { - id: 'design-homepage', - path: '/pages/mall/admin/design/index?tab=homepage', - name: '首页装修', - title: '首页装修 - 打造吸引人的商城首页', - data: { - id: 'homepage', - name: '首页装修', - type: 'homepage' as const, - status: 1, - content: [ - { - id: 'carousel-1', - type: 'carousel' as const, - name: '轮播图', - icon: 'C', - description: '首页顶部轮播图展示', - config: { - autoplay: true, - duration: 5000, - height: 300 - } - }, - { - id: 'product-1', - type: 'product' as const, - name: '商品展示', - icon: 'P', - description: '热销商品列表', - config: { - count: 8, - columns: 2, - layout: 'grid' - } - } - ], - version: '1.0.0', - updated_at: '2026-01-30 14:30:00' - } as DesignItem -} - -/** - * 分类页装修页面路由配置 - */ -export const designCategoryPageConfig = { - id: 'design-category', - path: '/pages/mall/admin/design/index?tab=category', - name: '分类页装修', - title: '分类页装修 - 为不同分类创建独特展示', - data: [ - { - id: 1, - name: '默认分类装修', - type: 'category' as const, - status: 1, - categoryId: 0, - categoryName: '全部分类', - path: '/pages/mall/admin/design/index?tab=category&id=1', - content: [], - updated_at: '2026-01-30 14:30:00' - }, - { - id: 2, - name: '热销商品分类', - type: 'category' as const, - status: 0, - categoryId: 1, - categoryName: '推荐分类', - path: '/pages/mall/admin/design/index?tab=category&id=2', - content: [], - updated_at: '2026-01-29 10:15:00' - } - ] as DesignItem[] -} - -/** - * 商品页装修页面路由配置 - */ -export const designProductPageConfig = { - id: 'design-product', - path: '/pages/mall/admin/design/index?tab=product', - name: '商品页装修', - title: '商品页装修 - 自定义商品详情页展示', - data: { - id: 'product', - name: '商品页装修', - type: 'product' as const, - status: 1, - content: [ - { - id: 'image-1', - type: 'image' as const, - name: '商品图', - icon: 'I', - description: '商品主图展示' - }, - { - id: 'product-info', - type: 'text' as const, - name: '商品信息', - icon: 'T', - description: '商品名称和价格' - } - ], - version: '1.0.0', - updated_at: '2026-01-30 14:30:00' - } as DesignItem -} - -/** - * 自定义页面路由配置 - */ -export const designCustomPageConfig = { - id: 'design-custom', - path: '/pages/mall/admin/design/index?tab=custom', - name: '自定义页面', - title: '自定义页面 - 创建特殊内容页面', - data: [ - { - id: 1, - name: '新年促销页', - type: 'custom' as const, - status: 1, - path: '/pages/mall/admin/design/index?tab=custom&id=1', - content: [], - updated_at: '2026-01-28 09:00:00' - } - ] as DesignItem[] -} - -/** - * 模板库页面路由配置 - */ -export const designTemplatePageConfig = { - id: 'design-templates', - path: '/pages/mall/admin/design/index?tab=templates', - name: '模板库', - title: '模板库 - 选择预设装修模板', - data: [ - { - id: 1, - name: '电商风格A', - description: '简洁现代的电商布局', - type: 'homepage', - preview: '/static/images/template-a.png', - content: [] - }, - { - id: 2, - name: '电商风格B', - description: '豪华展示的电商布局', - type: 'homepage', - preview: '/static/images/template-b.png', - content: [] - }, - { - id: 3, - name: '精品风格', - description: '精品商品展示布局', - type: 'homepage', - preview: '/static/images/template-c.png', - content: [] - }, - { - id: 4, - name: '商城风格', - description: '完整商城功能布局', - type: 'homepage', - preview: '/static/images/template-d.png', - content: [] - } - ] as DesignTemplate[] -} - -/** - * 组件库页面路由配置 - */ -export const designComponentPageConfig = { - id: 'design-components', - path: '/pages/mall/admin/design/index?tab=components', - name: '组件库', - title: '组件库 - 丰富的页面组件', - data: [ - { - id: 'image', - type: 'image' as const, - name: '图片组件', - icon: 'I', - description: '展示图片和图片轮播', - componentName: 'ImageComponent', - config: { - defaultWidth: '100%', - defaultHeight: 'auto' - } - }, - { - id: 'text', - type: 'text' as const, - name: '文本组件', - icon: 'T', - description: '展示文本内容和段落', - componentName: 'TextComponent' - }, - { - id: 'product', - type: 'product' as const, - name: '商品组件', - icon: 'P', - description: '展示商品列表和推荐', - componentName: 'ProductComponent', - config: { - defaultCount: 6, - defaultColumns: 2 - } - }, - { - id: 'carousel', - type: 'carousel' as const, - name: '轮播组件', - icon: 'C', - description: '图片和内容轮播', - componentName: 'CarouselComponent', - config: { - autoplay: true, - duration: 5000 - } - }, - { - id: 'divider', - type: 'divider' as const, - name: '分割线', - icon: 'D', - description: '分割不同内容区域', - componentName: 'DividerComponent' - }, - { - id: 'spacer', - type: 'spacer' as const, - name: '间距组件', - icon: 'S', - description: '调整元素间距', - componentName: 'SpacerComponent', - config: { - defaultHeight: 16 - } - }, - { - id: 'button', - type: 'button' as const, - name: '按钮组件', - icon: 'B', - description: '创建点击按钮', - componentName: 'ButtonComponent' - }, - { - id: 'form', - type: 'form' as const, - name: '表单组件', - icon: 'F', - description: '收集用户输入数据', - componentName: 'FormComponent' - } - ] as DesignComponent[] -} - -/** - * 编辑页面路由配置 - */ -export const designEditorPageConfig = { - id: 'design-editor', - path: '/pages/mall/admin/design/editor', - name: '装修编辑器', - title: '装修编辑器 - 可视化编辑装修页面', - components: [ - { - id: 'canvas', - name: '编辑画布', - description: '拖拽编辑区域' - }, - { - id: 'sidebar', - name: '组件侧栏', - description: '可用组件列表' - }, - { - id: 'properties', - name: '属性面板', - description: '组件属性编辑' - }, - { - id: 'preview', - name: '预览窗口', - description: '实时效果预览' - } - ] -} - -/** - * 预览页面路由配置 - */ -export const designPreviewPageConfig = { - id: 'design-preview', - path: '/pages/mall/design/preview/:id', - name: '装修预览', - title: '装修效果预览', - features: [ - '全屏预览', - '响应式展示', - '交互测试', - '性能分析' - ] -} - -/** - * 所有设计页面路由配置 - */ -export const allDesignPageConfigs = [ - designListPageConfig, - designHomepagePageConfig, - designCategoryPageConfig, - designProductPageConfig, - designCustomPageConfig, - designTemplatePageConfig, - designComponentPageConfig, - designEditorPageConfig, - designPreviewPageConfig -] - -/** - * 根据 tab 获取对应的页面配置 - */ -export function getDesignPageConfig(tab: string) { - const configMap: Record = { - 'homepage': designHomepagePageConfig, - 'category': designCategoryPageConfig, - 'product': designProductPageConfig, - 'custom': designCustomPageConfig, - 'templates': designTemplatePageConfig, - 'components': designComponentPageConfig, - 'editor': designEditorPageConfig, - 'preview': designPreviewPageConfig, - 'list': designListPageConfig - } - return configMap[tab] || designListPageConfig -} - -/** - * 装修页面导航菜单结构 - */ -export const designMenuStructure = { - id: 'design', - title: '设计', - icon: '/static/design.svg', - path: '/pages/mall/admin/design/index', - children: [ - { - id: 'page-decoration', - title: '页面装修', - children: [ - { - id: 'design-homepage', - title: '首页装修', - path: '/pages/mall/admin/design/index?tab=homepage' - }, - { - id: 'design-category', - title: '分类页装修', - path: '/pages/mall/admin/design/index?tab=category' - }, - { - id: 'design-product', - title: '商品页装修', - path: '/pages/mall/admin/design/index?tab=product' - }, - { - id: 'design-custom', - title: '自定义页面', - path: '/pages/mall/admin/design/index?tab=custom' - } - ] - }, - { - id: 'design-library', - title: '设计库', - children: [ - { - id: 'design-templates', - title: '模板库', - path: '/pages/mall/admin/design/index?tab=templates' - }, - { - id: 'design-components', - title: '组件库', - path: '/pages/mall/admin/design/index?tab=components' - } - ] - } - ] -} diff --git a/pages/mall/admin/design/custom.uvue b/pages/mall/admin/design/custom.uvue deleted file mode 100644 index a6b81593..00000000 --- a/pages/mall/admin/design/custom.uvue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/pages/mall/admin/design/data-config.uvue b/pages/mall/admin/design/data-config.uvue deleted file mode 100644 index 5b75eddd..00000000 --- a/pages/mall/admin/design/data-config.uvue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/pages/mall/admin/design/design.uts b/pages/mall/admin/design/design.uts deleted file mode 100644 index 241fd01a..00000000 --- a/pages/mall/admin/design/design.uts +++ /dev/null @@ -1,549 +0,0 @@ -/** - * 页面装修业务逻辑模块 - * 参考CRMEB项目,提供完整的装修管理功能 - */ - -/** - * 装修页面数据接口 - */ -export interface DesignItem { - id: string | number - name: string - type: 'homepage' | 'category' | 'product' | 'custom' - status: 0 | 1 // 0: 草稿, 1: 已发布 - categoryId?: string | number - categoryName?: string - path?: string - preview_url?: string - content: DesignComponent[] - version?: string - created_at?: string - updated_at?: string -} - -/** - * 装修组件接口 - */ -export interface DesignComponent { - id: string - type: 'image' | 'text' | 'product' | 'carousel' | 'divider' | 'spacer' | 'button' | 'form' - name: string - icon: string - description?: string - componentName?: string - config?: Record - children?: DesignComponent[] -} - -/** - * 装修模板接口 - */ -export interface DesignTemplate { - id: string | number - name: string - description: string - type: string - preview: string - content: DesignComponent[] - created_at?: string -} - -/** - * 获取装修页面列表 - * @param params 查询参数 - * @returns 装修页面列表 - */ -export function getDesignList(params?: Record): Promise { - return new Promise((resolve, reject) => { - // TODO: 实际应调用后端API - const designList: DesignItem[] = [ - { - id: 1, - name: '首页装修', - type: 'homepage', - status: 1, - content: [], - updated_at: '2026-01-30 14:30:00' - }, - { - id: 2, - name: '年货节活动页', - type: 'custom', - status: 1, - content: [], - updated_at: '2026-01-28 10:15:00' - } - ] - setTimeout(() => resolve(designList), 300) - }) -} - -/** - * 获取首页装修详情 - * @returns 首页装修数据 - */ -export function getHomePageDesign(): Promise { - return new Promise((resolve, reject) => { - const homepage: DesignItem = { - id: 'homepage', - name: '首页装修', - type: 'homepage', - status: 1, - content: [ - { - id: 'carousel-1', - type: 'carousel', - name: '轮播图', - icon: 'C', - description: '首页顶部轮播图展示', - config: { - autoplay: true, - duration: 5000, - height: 300 - } - }, - { - id: 'product-1', - type: 'product', - name: '商品展示', - icon: 'P', - description: '热销商品列表', - config: { - count: 8, - columns: 2, - layout: 'grid' - } - } - ], - version: '1.0.0', - updated_at: '2026-01-30 14:30:00' - } - setTimeout(() => resolve(homepage), 300) - }) -} - -/** - * 获取商品页装修详情 - * @returns 商品页装修数据 - */ -export function getProductPageDesign(): Promise { - return new Promise((resolve, reject) => { - const productPage: DesignItem = { - id: 'product', - name: '商品页装修', - type: 'product', - status: 1, - content: [ - { - id: 'image-1', - type: 'image', - name: '商品图', - icon: 'I', - description: '商品主图展示' - }, - { - id: 'product-info', - type: 'text', - name: '商品信息', - icon: 'T', - description: '商品名称和价格' - } - ], - version: '1.0.0', - updated_at: '2026-01-30 14:30:00' - } - setTimeout(() => resolve(productPage), 300) - }) -} - -/** - * 获取分类装修列表 - * @returns 分类装修列表 - */ -export function getCategoryDesigns(): Promise { - return new Promise((resolve, reject) => { - const categories: DesignItem[] = [ - { - id: 1, - name: '默认分类装修', - type: 'category', - status: 1, - categoryId: 0, - categoryName: '全部分类', - content: [], - updated_at: '2026-01-30 14:30:00' - }, - { - id: 2, - name: '热销商品分类', - type: 'category', - status: 0, - categoryId: 1, - categoryName: '推荐分类', - content: [], - updated_at: '2026-01-29 10:15:00' - } - ] - setTimeout(() => resolve(categories), 300) - }) -} - -/** - * 获取自定义页面列表 - * @returns 自定义页面列表 - */ -export function getCustomPages(): Promise { - return new Promise((resolve, reject) => { - const customPages: DesignItem[] = [ - { - id: 1, - name: '新年促销页', - type: 'custom', - status: 1, - path: '/pages/promotion/newyear', - content: [], - updated_at: '2026-01-28 09:00:00' - } - ] - setTimeout(() => resolve(customPages), 300) - }) -} - -/** - * 获取页面模板库 - * @returns 模板列表 - */ -export function getTemplateLibrary(): Promise { - return new Promise((resolve, reject) => { - const templates: DesignTemplate[] = [ - { - id: 1, - name: '电商风格A', - description: '简洁现代的电商布局', - type: 'homepage', - preview: '@/static/images/template-a.png', - content: [] - }, - { - id: 2, - name: '电商风格B', - description: '豪华展示的电商布局', - type: 'homepage', - preview: '@/static/images/template-b.png', - content: [] - }, - { - id: 3, - name: '精品风格', - description: '精品商品展示布局', - type: 'homepage', - preview: '@/static/images/template-c.png', - content: [] - }, - { - id: 4, - name: '商城风格', - description: '完整商城功能布局', - type: 'homepage', - preview: '@/static/images/template-d.png', - content: [] - } - ] - setTimeout(() => resolve(templates), 300) - }) -} - -/** - * 获取可用组件库 - * @returns 组件列表 - */ -export function getAvailableComponents(): Promise { - return new Promise((resolve, reject) => { - const components: DesignComponent[] = [ - { - id: 'image', - type: 'image', - name: '图片组件', - icon: 'I', - description: '展示图片和图片轮播', - componentName: 'ImageComponent', - config: { - defaultWidth: '100%', - defaultHeight: 'auto' - } - }, - { - id: 'text', - type: 'text', - name: '文本组件', - icon: 'T', - description: '展示文本内容和段落', - componentName: 'TextComponent' - }, - { - id: 'product', - type: 'product', - name: '商品组件', - icon: 'P', - description: '展示商品列表和推荐', - componentName: 'ProductComponent', - config: { - defaultCount: 6, - defaultColumns: 2 - } - }, - { - id: 'carousel', - type: 'carousel', - name: '轮播组件', - icon: 'C', - description: '图片和内容轮播', - componentName: 'CarouselComponent', - config: { - autoplay: true, - duration: 5000 - } - }, - { - id: 'divider', - type: 'divider', - name: '分割线', - icon: 'D', - description: '分割不同内容区域', - componentName: 'DividerComponent' - }, - { - id: 'spacer', - type: 'spacer', - name: '间距组件', - icon: 'S', - description: '调整元素间距', - componentName: 'SpacerComponent', - config: { - defaultHeight: 16 - } - }, - { - id: 'button', - type: 'button', - name: '按钮组件', - icon: 'B', - description: '创建点击按钮', - componentName: 'ButtonComponent' - }, - { - id: 'form', - type: 'form', - name: '表单组件', - icon: 'F', - description: '收集用户输入数据', - componentName: 'FormComponent' - } - ] - setTimeout(() => resolve(components), 300) - }) -} - -/** - * 保存装修页面 - * @param design 装修数据 - * @returns 保存结果 - */ -export function saveDesign(design: DesignItem): Promise<{ id: string | number; message: string }> { - return new Promise((resolve, reject) => { - if (!design.name || design.name.trim() === '') { - reject(new Error('装修名称不能为空')) - return - } - if (!design.type) { - reject(new Error('装修类型不能为空')) - return - } - // TODO: 实际应调用后端API保存 - const result = { - id: design.id || Math.random().toString(36).substr(2, 9), - message: '保存成功' - } - setTimeout(() => resolve(result), 500) - }) -} - -/** - * 发布装修页面 - * @param designId 装修页面ID - * @returns 发布结果 - */ -export function publishDesign(designId: string | number): Promise<{ message: string }> { - return new Promise((resolve, reject) => { - if (!designId) { - reject(new Error('装修ID不能为空')) - return - } - // TODO: 实际应调用后端API发布 - setTimeout(() => { - resolve({ message: '发布成功' }) - }, 500) - }) -} - -/** - * 删除装修页面 - * @param designId 装修页面ID - * @returns 删除结果 - */ -export function deleteDesign(designId: string | number): Promise<{ message: string }> { - return new Promise((resolve, reject) => { - if (!designId) { - reject(new Error('装修ID不能为空')) - return - } - // TODO: 实际应调用后端API删除 - setTimeout(() => { - resolve({ message: '删除成功' }) - }, 500) - }) -} - -/** - * 获取装修预览URL - * @param designId 装修ID - * @returns 预览URL - */ -export function getDesignPreviewUrl(designId: string | number): string { - return `/pages/mall/design/preview/${designId}` -} - -/** - * 获取装修编辑URL - * @param designId 装修ID - * @returns 编辑URL - */ -export function getDesignEditorUrl(designId: string | number): string { - return `/pages/mall/admin/design/editor?id=${designId}` -} - -/** - * 格式化日期时间 - * @param dateStr 日期字符串 - * @returns 格式化后的日期 - */ -export function formatDateTime(dateStr?: string): string { - if (!dateStr) return '--' - try { - const date = new Date(dateStr) - const year = date.getFullYear() - const month = String(date.getMonth() + 1).padStart(2, '0') - const day = String(date.getDate()).padStart(2, '0') - const hours = String(date.getHours()).padStart(2, '0') - const minutes = String(date.getMinutes()).padStart(2, '0') - return `${year}-${month}-${day} ${hours}:${minutes}` - } catch { - return dateStr - } -} - -/** - * 验证组件配置 - * @param component 组件配置 - * @returns 验证结果 - */ -export function validateComponent(component: DesignComponent): { valid: boolean; errors: string[] } { - const errors: string[] = [] - - if (!component.id) { - errors.push('组件ID不能为空') - } - - if (!component.type) { - errors.push('组件类型不能为空') - } - - if (!component.name) { - errors.push('组件名称不能为空') - } - - return { - valid: errors.length === 0, - errors - } -} - -/** - * 生成组件ID - * @param type 组件类型 - * @returns 生成的组件ID - */ -export function generateComponentId(type: string): string { - const timestamp = Date.now().toString(36) - const random = Math.random().toString(36).substr(2, 5) - return `${type}-${timestamp}-${random}` -} - -/** - * 获取装修约束条件 - * @returns 约束条件对象 - */ -export function getDesignConstraints(): DesignConstraints { - return { - maxComponents: 50, - allowedComponentTypes: ['image', 'text', 'product', 'carousel', 'divider', 'spacer', 'button', 'form'], - maxImageSize: 5242880, // 5MB - supportedImageFormats: ['jpg', 'jpeg', 'png', 'gif', 'webp'] - } -} - -/** - * 深度克隆装修数据 - * @param design 装修数据 - * @returns 克隆后的数据 - */ -export function cloneDesign(design: DesignItem): DesignItem { - return JSON.parse(JSON.stringify(design)) -} - -/** - * 验证装修数据完整性 - * @param design 装修数据 - * @returns 验证结果 - */ -export function validateDesign(design: DesignItem): { valid: boolean; message: string } { - if (!design.name || design.name.trim() === '') { - return { valid: false, message: '装修名称不能为空' } - } - - if (!design.type) { - return { valid: false, message: '装修类型不能为空' } - } - - if (!Array.isArray(design.content)) { - return { valid: false, message: '装修内容格式错误' } - } - - if (design.content.length > getDesignConstraints().maxComponents) { - return { valid: false, message: `组件数量超过限制(最多${getDesignConstraints().maxComponents}个)` } - } - - return { valid: true, message: '验证通过' } -} - -/** - * 导出装修为JSON - * @param design 装修数据 - * @returns JSON字符串 - */ -export function exportDesignJSON(design: DesignItem): string { - return JSON.stringify(design, null, 2) -} - -/** - * 从JSON导入装修 - * @param jsonStr JSON字符串 - * @returns 装修数据 - */ -export function importDesignJSON(jsonStr: string): DesignItem { - try { - return JSON.parse(jsonStr) as DesignItem - } catch (error) { - throw new Error('JSON格式错误,无法导入') - } -} diff --git a/pages/mall/admin/design/homepage.uvue b/pages/mall/admin/design/homepage.uvue deleted file mode 100644 index 04898f3a..00000000 --- a/pages/mall/admin/design/homepage.uvue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/pages/mall/admin/design/index.uvue b/pages/mall/admin/design/index.uvue deleted file mode 100644 index c3606b20..00000000 --- a/pages/mall/admin/design/index.uvue +++ /dev/null @@ -1,65 +0,0 @@ - - - - - diff --git a/pages/mall/admin/design/product.uvue b/pages/mall/admin/design/product.uvue deleted file mode 100644 index 58dc4bb7..00000000 --- a/pages/mall/admin/design/product.uvue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/pages/mall/admin/design/templates.uvue b/pages/mall/admin/design/templates.uvue deleted file mode 100644 index 407b80ab..00000000 --- a/pages/mall/admin/design/templates.uvue +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - diff --git a/pages/mall/admin/design/theme-style.uvue b/pages/mall/admin/design/theme-style.uvue deleted file mode 100644 index 08f3bdb7..00000000 --- a/pages/mall/admin/design/theme-style.uvue +++ /dev/null @@ -1,393 +0,0 @@ - - - - - \ No newline at end of file diff --git a/pages/mall/admin/design/user.uvue b/pages/mall/admin/design/user.uvue deleted file mode 100644 index 2302d1a5..00000000 --- a/pages/mall/admin/design/user.uvue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/pages/mall/admin/distribution/business-division/agent-application/index.uvue b/pages/mall/admin/distribution/business-division/agent-application/index.uvue new file mode 100644 index 00000000..fdc7fddf --- /dev/null +++ b/pages/mall/admin/distribution/business-division/agent-application/index.uvue @@ -0,0 +1,164 @@ + + + \ No newline at end of file diff --git a/pages/mall/admin/distribution/business-division/agent-list/index.uvue b/pages/mall/admin/distribution/business-division/agent-list/index.uvue new file mode 100644 index 00000000..48fa76ce --- /dev/null +++ b/pages/mall/admin/distribution/business-division/agent-list/index.uvue @@ -0,0 +1,157 @@ + + + \ No newline at end of file diff --git a/pages/mall/admin/distribution/business-division/business-division-list/index.uvue b/pages/mall/admin/distribution/business-division/business-division-list/index.uvue new file mode 100644 index 00000000..9008d6b2 --- /dev/null +++ b/pages/mall/admin/distribution/business-division/business-division-list/index.uvue @@ -0,0 +1,157 @@ + + + \ No newline at end of file diff --git a/pages/mall/admin/distribution/distributor-management/index.uvue b/pages/mall/admin/distribution/distributor-management/index.uvue new file mode 100644 index 00000000..05e22666 --- /dev/null +++ b/pages/mall/admin/distribution/distributor-management/index.uvue @@ -0,0 +1,184 @@ + + + + + \ No newline at end of file diff --git a/pages/mall/admin/distribution/division/agent.uvue b/pages/mall/admin/distribution/division/agent.uvue deleted file mode 100644 index 6e59cb40..00000000 --- a/pages/mall/admin/distribution/division/agent.uvue +++ /dev/null @@ -1,334 +0,0 @@ - - - - - diff --git a/pages/mall/admin/distribution/level/index.uvue b/pages/mall/admin/distribution/level/index.uvue index 2a3bd1f8..5bfe950b 100644 --- a/pages/mall/admin/distribution/level/index.uvue +++ b/pages/mall/admin/distribution/level/index.uvue @@ -17,7 +17,7 @@ - + @@ -33,7 +33,7 @@ 操作 - + {{ item.id }} @@ -42,190 +42,104 @@ {{ item.level }} {{ item.percent1 }}% {{ item.percent2 }}% - {{ item.task_total }} - {{ item.task_finish }} + {{ item.taskTotal }} + {{ item.taskFinish }} - + 等级任务 | - 编辑 + 编辑 | - 删除 + 删除 - - 共 {{ levelList.length }} 条 - - - - - - {{ editForm.id == null ? '添加分销等级' : '编辑分销等级' }} - × - - - - - 等级名称 - - - - - 等级权重 - - - - - 一级分佣比例 (%) - - - - - 二级分佣比例 (%) - - - - - 任务总数 - - - - - 需完成数量 - - - - - 是否显示 - - - - - - - - - + \ No newline at end of file diff --git a/pages/mall/admin/distribution/setting/index.uvue b/pages/mall/admin/distribution/setting/index.uvue index 51b3b3fc..438b9524 100644 --- a/pages/mall/admin/distribution/setting/index.uvue +++ b/pages/mall/admin/distribution/setting/index.uvue @@ -1,4 +1,4 @@ - - - - - diff --git a/pages/mall/admin/maintain/dev-config/category/index.uvue b/pages/mall/admin/maintain/dev-config/category/index.uvue new file mode 100644 index 00000000..460720cf --- /dev/null +++ b/pages/mall/admin/maintain/dev-config/category/index.uvue @@ -0,0 +1,150 @@ + + + + + \ No newline at end of file diff --git a/pages/mall/admin/maintain/dev-config/combination-data.uvue b/pages/mall/admin/maintain/dev-config/combination-data/index.uvue similarity index 60% rename from pages/mall/admin/maintain/dev-config/combination-data.uvue rename to pages/mall/admin/maintain/dev-config/combination-data/index.uvue index 1c365fac..33ed8d4f 100644 --- a/pages/mall/admin/maintain/dev-config/combination-data.uvue +++ b/pages/mall/admin/maintain/dev-config/combination-data/index.uvue @@ -1,4 +1,4 @@ - @@ -112,75 +115,74 @@ diff --git a/pages/mall/admin/marketing/live/anchor.uvue b/pages/mall/admin/marketing/live/streamer-management/index.uvue similarity index 67% rename from pages/mall/admin/marketing/live/anchor.uvue rename to pages/mall/admin/marketing/live/streamer-management/index.uvue index 45c8eb26..e414567d 100644 --- a/pages/mall/admin/marketing/live/anchor.uvue +++ b/pages/mall/admin/marketing/live/streamer-management/index.uvue @@ -31,20 +31,23 @@ - - 共 {{ anchorList.length }} 条 - - - 15条/页 - - - - - - 1 - - - + + @@ -59,11 +62,11 @@ 主播名称: - + 主播微信号: - + 主播手机号: @@ -72,7 +75,7 @@ 主播图像: - + 🖼️ @@ -86,65 +89,46 @@ diff --git a/pages/mall/admin/marketing/lottery/list/index.uvue b/pages/mall/admin/marketing/lottery/list/index.uvue new file mode 100644 index 00000000..4f24f6d8 --- /dev/null +++ b/pages/mall/admin/marketing/lottery/list/index.uvue @@ -0,0 +1,395 @@ + + + + + + + + diff --git a/pages/mall/admin/marketing/marketing-statistics/index.uvue b/pages/mall/admin/marketing/marketing-statistics/index.uvue new file mode 100644 index 00000000..a54a0ce4 --- /dev/null +++ b/pages/mall/admin/marketing/marketing-statistics/index.uvue @@ -0,0 +1,28 @@ + + + + + diff --git a/pages/mall/admin/marketing/member/config.uvue b/pages/mall/admin/marketing/member/config/index.uvue similarity index 100% rename from pages/mall/admin/marketing/member/config.uvue rename to pages/mall/admin/marketing/member/config/index.uvue diff --git a/pages/mall/admin/marketing/member/card.uvue b/pages/mall/admin/marketing/member/kami-membership/index.uvue similarity index 100% rename from pages/mall/admin/marketing/member/card.uvue rename to pages/mall/admin/marketing/member/kami-membership/index.uvue diff --git a/pages/mall/admin/marketing/member/record.uvue b/pages/mall/admin/marketing/member/record/index.uvue similarity index 98% rename from pages/mall/admin/marketing/member/record.uvue rename to pages/mall/admin/marketing/member/record/index.uvue index 2f6191ff..c815e633 100644 --- a/pages/mall/admin/marketing/member/record.uvue +++ b/pages/mall/admin/marketing/member/record/index.uvue @@ -65,9 +65,9 @@ const records = ref([ diff --git a/pages/mall/admin/marketing/points/config.uvue b/pages/mall/admin/marketing/points/config.uvue deleted file mode 100644 index 4c3150ec..00000000 --- a/pages/mall/admin/marketing/points/config.uvue +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - diff --git a/pages/mall/admin/marketing/integral/config.uvue b/pages/mall/admin/marketing/points/config/index.uvue similarity index 89% rename from pages/mall/admin/marketing/integral/config.uvue rename to pages/mall/admin/marketing/points/config/index.uvue index 461e2d73..744b22c0 100644 --- a/pages/mall/admin/marketing/integral/config.uvue +++ b/pages/mall/admin/marketing/points/config/index.uvue @@ -96,44 +96,34 @@ - diff --git a/pages/mall/admin/marketing/points/index.uvue b/pages/mall/admin/marketing/points/index.uvue deleted file mode 100644 index 75e1cc86..00000000 --- a/pages/mall/admin/marketing/points/index.uvue +++ /dev/null @@ -1,95 +0,0 @@ - - - - - diff --git a/pages/mall/admin/marketing/points/order.uvue b/pages/mall/admin/marketing/points/order.uvue deleted file mode 100644 index 2bdb5b0d..00000000 --- a/pages/mall/admin/marketing/points/order.uvue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/pages/mall/admin/marketing/integral/order.uvue b/pages/mall/admin/marketing/points/orders/index.uvue similarity index 81% rename from pages/mall/admin/marketing/integral/order.uvue rename to pages/mall/admin/marketing/points/orders/index.uvue index ab81e187..81fce04a 100644 --- a/pages/mall/admin/marketing/integral/order.uvue +++ b/pages/mall/admin/marketing/points/orders/index.uvue @@ -90,26 +90,41 @@ - - - 共 {{ total }} 条 - - - 1 - - - + + diff --git a/pages/mall/admin/marketing/integral/list.uvue b/pages/mall/admin/marketing/points/products/index.uvue similarity index 82% rename from pages/mall/admin/marketing/integral/list.uvue rename to pages/mall/admin/marketing/points/products/index.uvue index 6ec19bcb..acb18043 100644 --- a/pages/mall/admin/marketing/integral/list.uvue +++ b/pages/mall/admin/marketing/points/products/index.uvue @@ -86,31 +86,30 @@ - - - 共 {{ total }} 条 - - - 15条/页 ▼ - - - < - 1 - > - - - 前往 - - - - + diff --git a/pages/mall/admin/marketing/integral/record.uvue b/pages/mall/admin/marketing/points/record/index.uvue similarity index 75% rename from pages/mall/admin/marketing/integral/record.uvue rename to pages/mall/admin/marketing/points/record/index.uvue index f227380e..5b624b82 100644 --- a/pages/mall/admin/marketing/integral/record.uvue +++ b/pages/mall/admin/marketing/points/record/index.uvue @@ -57,21 +57,33 @@ - - - 共 {{ total }} 条 - - - 1 - - - + + diff --git a/pages/mall/admin/marketing/integral/statistic.uvue b/pages/mall/admin/marketing/points/statistics/index.uvue similarity index 99% rename from pages/mall/admin/marketing/integral/statistic.uvue rename to pages/mall/admin/marketing/points/statistics/index.uvue index fdfbb39f..15da4319 100644 --- a/pages/mall/admin/marketing/integral/statistic.uvue +++ b/pages/mall/admin/marketing/points/statistics/index.uvue @@ -251,9 +251,9 @@ const toggleConsumeStyle = () => { - - diff --git a/pages/mall/admin/marketing/recharge/quota.uvue b/pages/mall/admin/marketing/recharge/amount-setting/index.uvue similarity index 99% rename from pages/mall/admin/marketing/recharge/quota.uvue rename to pages/mall/admin/marketing/recharge/amount-setting/index.uvue index e1b45e64..87acba2f 100644 --- a/pages/mall/admin/marketing/recharge/quota.uvue +++ b/pages/mall/admin/marketing/recharge/amount-setting/index.uvue @@ -239,9 +239,9 @@ function resetForm() { diff --git a/pages/mall/admin/marketing/seckill/product.uvue b/pages/mall/admin/marketing/seckill/products/index.uvue similarity index 83% rename from pages/mall/admin/marketing/seckill/product.uvue rename to pages/mall/admin/marketing/seckill/products/index.uvue index bbef806b..eb490bbb 100644 --- a/pages/mall/admin/marketing/seckill/product.uvue +++ b/pages/mall/admin/marketing/seckill/products/index.uvue @@ -105,33 +105,30 @@ - - - 共 {{ productList.length }} 条 - - - - 15条/页 - - - - - - 1 - - - - 前往 - - - - + + diff --git a/pages/mall/admin/order-management.uvue b/pages/mall/admin/order-management.uvue deleted file mode 100644 index 71eba904..00000000 --- a/pages/mall/admin/order-management.uvue +++ /dev/null @@ -1,62 +0,0 @@ - - - - diff --git a/pages/mall/admin/order/aftersales-order/index.uvue b/pages/mall/admin/order/aftersales-order/index.uvue index c8e150a7..1d054e1b 100644 --- a/pages/mall/admin/order/aftersales-order/index.uvue +++ b/pages/mall/admin/order/aftersales-order/index.uvue @@ -5,22 +5,20 @@ 退款状态: - - - {{ statusOptions[statusIndex].label }} - - - + + 全部 + + 退款时间: - + + 开始日期 + - + 结束日期 + 📅 + @@ -41,7 +39,7 @@ 原订单号 商品信息 用户信息 - 退款金额 + 实际支付 发起退款时间 退款状态 订单状态 @@ -78,40 +76,37 @@ - - - 共 {{ total }} 条 - - - 15条/页 ▼ - - - < - {{ page }} - > - - - 前往 - - - - + diff --git a/pages/mall/admin/order/cashier-order/index.uvue b/pages/mall/admin/order/cashier-order/index.uvue index 81df7540..ec17e35e 100644 --- a/pages/mall/admin/order/cashier-order/index.uvue +++ b/pages/mall/admin/order/cashier-order/index.uvue @@ -5,22 +5,22 @@ 创建时间: - + + 开始日期 + - + 结束日期 + 📅 + 订单号: - + 用户名: - + @@ -47,44 +47,33 @@ - - 加载中... - - - 暂无收银订单 - - + {{ item.orderId }} {{ item.userInfo }} - ¥{{ item.payPrice.toFixed(2) }} - ¥{{ item.discountPrice.toFixed(2) }} + {{ item.payPrice.toFixed(2) }} + {{ item.discountPrice.toFixed(2) }} {{ item.payTime }} - - - 共 {{ total }} 条 - - - - < - - - {{ page }} - - - > - - - - 前往 - - - - + @@ -113,9 +102,8 @@ + + diff --git a/pages/mall/admin/order/order-management/index.uvue b/pages/mall/admin/order/order-management/index.uvue index 5e93ea26..85f9b1d2 100644 --- a/pages/mall/admin/order/order-management/index.uvue +++ b/pages/mall/admin/order/order-management/index.uvue @@ -1,414 +1,1014 @@ + diff --git a/pages/mall/admin/order/order-statistics/index.uvue b/pages/mall/admin/order/order-statistics/index.uvue index 0de80dd7..601a651d 100644 --- a/pages/mall/admin/order/order-statistics/index.uvue +++ b/pages/mall/admin/order/order-statistics/index.uvue @@ -341,16 +341,15 @@ function initTrendChart(data: any[]) { diff --git a/pages/mall/admin/order/write-off-records/index.uvue b/pages/mall/admin/order/write-off-records/index.uvue index 48e74028..5b3baa39 100644 --- a/pages/mall/admin/order/write-off-records/index.uvue +++ b/pages/mall/admin/order/write-off-records/index.uvue @@ -5,17 +5,21 @@ 核销日期: - + + 开始日期 + - + 结束日期 + 📅 + - 搜索订单: - + 筛选条件: + + 请选择 + + + @@ -38,7 +42,7 @@ 订单号 用户信息 - 商品信息 + 商品信息 实际支付 核销员 核销门店 @@ -48,16 +52,10 @@ - - 加载中... - - - 暂无核销记录 - - + {{ item.orderId }} {{ item.userInfo }} - + @@ -65,7 +63,7 @@ - ¥{{ item.payPrice.toFixed(2) }} + {{ item.payPrice }} {{ item.verifier }} {{ item.storeName }} {{ item.payStatus }} @@ -76,43 +74,37 @@ - - - 共 {{ total }} 条 - - - - < - - - {{ page }} - - - > - - - - 前往 - - - - + + + diff --git a/pages/mall/admin/product/classification/index.uvue b/pages/mall/admin/product/classification/index.uvue index a1a8452a..bdd3286c 100644 --- a/pages/mall/admin/product/classification/index.uvue +++ b/pages/mall/admin/product/classification/index.uvue @@ -29,6 +29,7 @@ ID 分类名称 分类图标 +描述 排序 状态 操作 @@ -38,20 +39,18 @@ -{{ item.id }} +{{ item.id.substring(0, 8) }} -{{ item.expanded ? '' : '' }} +{{ item.expanded ? '▼' : '▶' }} {{ item.name }} - + -{{ item.sort }} +{{ item.description || '-' }} +{{ item.sort_order }} - - -{{ item.status ? '开启' : '关闭' }} - + 编辑 @@ -62,20 +61,18 @@ -{{ child.id }} +{{ child.id.substring(0, 8) }} {{ child.name }} - + -{{ child.sort }} +{{ child.description || '-' }} +{{ child.sort_order }} - - -{{ child.status ? '开启' : '关闭' }} - + 编辑 @@ -100,10 +97,12 @@ 上级分类: + {{ form.parentName || '顶级分类' }} + @@ -112,29 +111,44 @@ + +标识 (Slug): + + + + + +分类描述: + + + + 分类图标: - -+ -上传图片 + + + + 建议尺寸:180*180 排序: - + 状态: - - -{{ form.status ? '开启' : '关闭' }} - + @@ -150,106 +164,199 @@ diff --git a/pages/mall/admin/product/product-management/member-price.uvue b/pages/mall/admin/product/product-management/components/member-price.uvue similarity index 98% rename from pages/mall/admin/product/product-management/member-price.uvue rename to pages/mall/admin/product/product-management/components/member-price.uvue index cd05bbcd..080d7b32 100644 --- a/pages/mall/admin/product/product-management/member-price.uvue +++ b/pages/mall/admin/product/product-management/components/member-price.uvue @@ -180,7 +180,7 @@ function goBack() { + + diff --git a/pages/mall/admin/product/protection/index.uvue b/pages/mall/admin/product/protection/index.uvue index 76202611..356f981d 100644 --- a/pages/mall/admin/product/protection/index.uvue +++ b/pages/mall/admin/product/protection/index.uvue @@ -24,7 +24,7 @@ 暂无数据 - + {{ item.id }} @@ -32,11 +32,9 @@ {{ item.name }} {{ item.desc }} - - - - - + + + 编辑 删除 @@ -44,6 +42,22 @@ + @@ -62,7 +76,7 @@ 保障内容: - @@ -104,21 +118,70 @@ diff --git a/pages/mall/admin/product/specifications/index.uvue b/pages/mall/admin/product/specifications/index.uvue index e86cc814..3a2fd585 100644 --- a/pages/mall/admin/product/specifications/index.uvue +++ b/pages/mall/admin/product/specifications/index.uvue @@ -5,16 +5,16 @@ 规格搜索: - + - + - + @@ -33,7 +33,7 @@ 暂无数据 - + @@ -44,12 +44,28 @@ {{ item.specs }} {{ item.attrs }} - 编辑 + 编辑 - 删除 + 删除 + @@ -91,112 +107,103 @@ - - - - diff --git a/pages/mall/admin/service/config.uvue b/pages/mall/admin/service/config.uvue deleted file mode 100644 index 0feda689..00000000 --- a/pages/mall/admin/service/config.uvue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/pages/mall/admin/service/index.uvue b/pages/mall/admin/service/index.uvue deleted file mode 100644 index 80f4e5f5..00000000 --- a/pages/mall/admin/service/index.uvue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/pages/mall/admin/service/message.uvue b/pages/mall/admin/service/message.uvue deleted file mode 100644 index bb629f28..00000000 --- a/pages/mall/admin/service/message.uvue +++ /dev/null @@ -1,544 +0,0 @@ - - - - - - diff --git a/pages/mall/admin/service/script.uvue b/pages/mall/admin/service/script.uvue deleted file mode 100644 index 1985e561..00000000 --- a/pages/mall/admin/service/script.uvue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/pages/mall/admin/service/service.uts b/pages/mall/admin/service/service.uts deleted file mode 100644 index 504af569..00000000 --- a/pages/mall/admin/service/service.uts +++ /dev/null @@ -1,246 +0,0 @@ -/** - * 客服管理服务层 - * 可先使用 mock 数据,后续替换为实际 API - */ - -export type ServiceItem = { - id: number - name: string - account: string - avatar: string - status: number - created_at: string -} - -export type ScriptItem = { - id: number - title: string - content: string - updated_at: string -} - -export type MessageItem = { - id: number - user: string - contact: string - content: string - status: number - created_at: string -} - -export type AutoReplyItem = { - id: number - keyword: string - reply: string - status: number - updated_at: string -} - -export type ServiceConfig = { - workTime: string - autoReply: number - welcomeText: string -} - -export const getServiceList = (params: any = {}): Promise => { - return new Promise((resolve) => { - setTimeout(() => { - let items: ServiceItem[] = [ - { id: 1, name: '张客服', account: 'service01', avatar: '/static/user/avatar-1.png', status: 1, created_at: '2026-01-28 10:30:00' }, - { id: 2, name: '李客服', account: 'service02', avatar: '/static/user/avatar-2.png', status: 1, created_at: '2026-01-27 09:15:00' }, - { id: 3, name: '王客服', account: 'service03', avatar: '/static/user/avatar-3.png', status: 0, created_at: '2026-01-26 18:20:00' } - ] - - if (params.keyword) { - items = items.filter(item => - item.name.includes(params.keyword) || item.account.includes(params.keyword) - ) - } - - if (params.status !== undefined && params.status !== null) { - items = items.filter(item => item.status === params.status) - } - - const total = items.length - const start = ((params.page || 1) - 1) * (params.limit || 10) - const end = start + (params.limit || 10) - - resolve({ - items: items.slice(start, end), - total - }) - }, 300) - }) -} - -export const deleteService = (id: number): Promise => { - return new Promise((resolve) => { - setTimeout(() => resolve({ success: true, message: '删除成功' }), 300) - }) -} - -export const batchDeleteService = (ids: number[]): Promise => { - return new Promise((resolve) => { - setTimeout(() => resolve({ success: true, message: '批量删除成功' }), 300) - }) -} - -export const batchUpdateServiceStatus = (ids: number[], status: number): Promise => { - return new Promise((resolve) => { - setTimeout(() => resolve({ success: true, message: '状态更新成功' }), 300) - }) -} - -export const getScriptList = (params: any = {}): Promise => { - return new Promise((resolve) => { - setTimeout(() => { - let items: ScriptItem[] = [ - { id: 1, title: '欢迎语', content: '您好,欢迎咨询,我们将尽快为您服务。', updated_at: '2026-01-28 10:30:00' }, - { id: 2, title: '退款说明', content: '退款将在 1-3 个工作日内原路返回。', updated_at: '2026-01-27 11:12:00' } - ] - - if (params.title) { - items = items.filter(item => item.title.includes(params.title)) - } - - const total = items.length - const start = ((params.page || 1) - 1) * (params.limit || 10) - const end = start + (params.limit || 10) - - resolve({ - items: items.slice(start, end), - total - }) - }, 300) - }) -} - -export const saveScript = (data: any): Promise => { - return new Promise((resolve) => { - setTimeout(() => resolve({ success: true, message: '保存成功' }), 300) - }) -} - -export const deleteScript = (id: number): Promise => { - return new Promise((resolve) => { - setTimeout(() => resolve({ success: true, message: '删除成功' }), 300) - }) -} - -export const getMessageList = (params: any = {}): Promise => { - return new Promise((resolve) => { - setTimeout(() => { - let items: MessageItem[] = [ - { id: 1, user: '小王', contact: '138****1122', content: '订单什么时候发货?', status: 0, created_at: '2026-01-28 09:10:00' }, - { id: 2, user: '小李', contact: '微信: li***', content: '能否开票?', status: 1, created_at: '2026-01-27 16:45:00' } - ] - - if (params.keyword) { - items = items.filter(item => - item.user.includes(params.keyword) || item.content.includes(params.keyword) - ) - } - - if (params.status !== undefined && params.status !== null) { - items = items.filter(item => item.status === params.status) - } - - const total = items.length - const start = ((params.page || 1) - 1) * (params.limit || 10) - const end = start + (params.limit || 10) - - resolve({ - items: items.slice(start, end), - total - }) - }, 300) - }) -} - -export const replyMessage = (id: number, data: any): Promise => { - return new Promise((resolve) => { - setTimeout(() => resolve({ success: true, message: '回复成功' }), 300) - }) -} - -export const deleteMessage = (id: number): Promise => { - return new Promise((resolve) => { - setTimeout(() => resolve({ success: true, message: '删除成功' }), 300) - }) -} - -export const batchReplyMessage = (ids: number[]): Promise => { - return new Promise((resolve) => { - setTimeout(() => resolve({ success: true, message: '批量标记成功' }), 300) - }) -} - -export const batchDeleteMessage = (ids: number[]): Promise => { - return new Promise((resolve) => { - setTimeout(() => resolve({ success: true, message: '批量删除成功' }), 300) - }) -} - -export const getAutoReplyList = (params: any = {}): Promise => { - return new Promise((resolve) => { - setTimeout(() => { - let items: AutoReplyItem[] = [ - { id: 1, keyword: '退货', reply: '退货请联系在线客服处理。', status: 1, updated_at: '2026-01-28 08:30:00' }, - { id: 2, keyword: '物流', reply: '物流信息可在订单详情查看。', status: 1, updated_at: '2026-01-27 12:20:00' } - ] - - if (params.keyword) { - items = items.filter(item => item.keyword.includes(params.keyword) || item.reply.includes(params.keyword)) - } - - if (params.status !== undefined && params.status !== null) { - items = items.filter(item => item.status === params.status) - } - - const total = items.length - const start = ((params.page || 1) - 1) * (params.limit || 10) - const end = start + (params.limit || 10) - - resolve({ - items: items.slice(start, end), - total - }) - }, 300) - }) -} - -export const saveAutoReply = (data: any): Promise => { - return new Promise((resolve) => { - setTimeout(() => resolve({ success: true, message: '保存成功' }), 300) - }) -} - -export const deleteAutoReply = (id: number): Promise => { - return new Promise((resolve) => { - setTimeout(() => resolve({ success: true, message: '删除成功' }), 300) - }) -} - -export const batchDeleteAutoReply = (ids: number[]): Promise => { - return new Promise((resolve) => { - setTimeout(() => resolve({ success: true, message: '批量删除成功' }), 300) - }) -} - -export const getServiceConfig = (): Promise => { - return new Promise((resolve) => { - setTimeout(() => { - resolve({ - workTime: '09:00-18:00', - autoReply: 1, - welcomeText: '您好,欢迎咨询,我们将尽快为您服务。' - }) - }, 300) - }) -} - -export const saveServiceConfig = (data: any): Promise => { - return new Promise((resolve) => { - setTimeout(() => resolve({ success: true, message: '保存成功' }), 300) - }) -} diff --git a/pages/mall/admin/setting/agreement.uvue b/pages/mall/admin/setting/agreement/index.uvue similarity index 97% rename from pages/mall/admin/setting/agreement.uvue rename to pages/mall/admin/setting/agreement/index.uvue index 7a98dcf7..e5c95632 100644 --- a/pages/mall/admin/setting/agreement.uvue +++ b/pages/mall/admin/setting/agreement/index.uvue @@ -81,13 +81,13 @@ const handleSave = () => { diff --git a/pages/mall/admin/setting/auth/menu-management/index.uvue b/pages/mall/admin/setting/auth/menu-management/index.uvue new file mode 100644 index 00000000..d5a97a29 --- /dev/null +++ b/pages/mall/admin/setting/auth/menu-management/index.uvue @@ -0,0 +1,189 @@ + + + + + diff --git a/pages/mall/admin/setting/auth/permission.uvue b/pages/mall/admin/setting/auth/permission.uvue deleted file mode 100644 index 5ef2f815..00000000 --- a/pages/mall/admin/setting/auth/permission.uvue +++ /dev/null @@ -1,263 +0,0 @@ - - - - - diff --git a/pages/mall/admin/setting/auth/role-management/index.uvue b/pages/mall/admin/setting/auth/role-management/index.uvue new file mode 100644 index 00000000..5c429a4b --- /dev/null +++ b/pages/mall/admin/setting/auth/role-management/index.uvue @@ -0,0 +1,175 @@ + + + + + diff --git a/pages/mall/admin/setting/auth/role.uvue b/pages/mall/admin/setting/auth/role.uvue deleted file mode 100644 index 0197e2e5..00000000 --- a/pages/mall/admin/setting/auth/role.uvue +++ /dev/null @@ -1,272 +0,0 @@ - + + + + diff --git a/pages/mall/admin/setting/system/message.uvue b/pages/mall/admin/setting/system/message.uvue deleted file mode 100644 index 13442107..00000000 --- a/pages/mall/admin/setting/system/message.uvue +++ /dev/null @@ -1,23 +0,0 @@ - - - - - diff --git a/pages/mall/admin/setting/system/role.uvue b/pages/mall/admin/setting/system/role.uvue deleted file mode 100644 index 7401386a..00000000 --- a/pages/mall/admin/setting/system/role.uvue +++ /dev/null @@ -1,81 +0,0 @@ - - - - - diff --git a/pages/mall/admin/setting/system/ticket.uvue b/pages/mall/admin/setting/system/ticket.uvue deleted file mode 100644 index c5f02ac2..00000000 --- a/pages/mall/admin/setting/system/ticket.uvue +++ /dev/null @@ -1,23 +0,0 @@ - - - - - diff --git a/pages/mall/admin/shop/create.uvue b/pages/mall/admin/shop/create.uvue new file mode 100644 index 00000000..d1cfea5e --- /dev/null +++ b/pages/mall/admin/shop/create.uvue @@ -0,0 +1,613 @@ + + + + + + diff --git a/pages/mall/admin/shop/manage.uvue b/pages/mall/admin/shop/manage.uvue new file mode 100644 index 00000000..cc81b110 --- /dev/null +++ b/pages/mall/admin/shop/manage.uvue @@ -0,0 +1,860 @@ + + + + + + diff --git a/pages/mall/admin/statistic/index.uvue b/pages/mall/admin/statistic/index.uvue deleted file mode 100644 index ac7142ef..00000000 --- a/pages/mall/admin/statistic/index.uvue +++ /dev/null @@ -1,177 +0,0 @@ - - - - - diff --git a/pages/mall/admin/subscription/plan-management.uvue b/pages/mall/admin/subscription/plan-management.uvue index 66511239..5458ad48 100644 --- a/pages/mall/admin/subscription/plan-management.uvue +++ b/pages/mall/admin/subscription/plan-management.uvue @@ -68,7 +68,7 @@ 描述 @@ -116,7 +116,7 @@ 功能点(每行一个) diff --git a/pages/mall/admin/system/agreement-settings.uvue b/pages/mall/admin/system/agreement-settings.uvue deleted file mode 100644 index 6e0471d7..00000000 --- a/pages/mall/admin/system/agreement-settings.uvue +++ /dev/null @@ -1,84 +0,0 @@ - - - - diff --git a/pages/mall/admin/system/api/collect.uvue b/pages/mall/admin/system/api/collect.uvue deleted file mode 100644 index 247409ae..00000000 --- a/pages/mall/admin/system/api/collect.uvue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/pages/mall/admin/system/api/logistics.uvue b/pages/mall/admin/system/api/logistics.uvue deleted file mode 100644 index 615bd1cc..00000000 --- a/pages/mall/admin/system/api/logistics.uvue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/pages/mall/admin/system/api/pay.uvue b/pages/mall/admin/system/api/pay.uvue deleted file mode 100644 index ee5c2140..00000000 --- a/pages/mall/admin/system/api/pay.uvue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/pages/mall/admin/system/api/sms.uvue b/pages/mall/admin/system/api/sms.uvue deleted file mode 100644 index 14def7d0..00000000 --- a/pages/mall/admin/system/api/sms.uvue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/pages/mall/admin/system/api/storage.uvue b/pages/mall/admin/system/api/storage.uvue deleted file mode 100644 index 1e49b6fe..00000000 --- a/pages/mall/admin/system/api/storage.uvue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/pages/mall/admin/system/api/waybill.uvue b/pages/mall/admin/system/api/waybill.uvue deleted file mode 100644 index 3dc973cd..00000000 --- a/pages/mall/admin/system/api/waybill.uvue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/pages/mall/admin/system/api/yht/config.uvue b/pages/mall/admin/system/api/yht/config.uvue deleted file mode 100644 index 1433d9ab..00000000 --- a/pages/mall/admin/system/api/yht/config.uvue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/pages/mall/admin/system/api/yht/page.uvue b/pages/mall/admin/system/api/yht/page.uvue deleted file mode 100644 index dfdefb4d..00000000 --- a/pages/mall/admin/system/api/yht/page.uvue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/pages/mall/admin/system/index.uvue b/pages/mall/admin/system/index.uvue deleted file mode 100644 index 8450c3b3..00000000 --- a/pages/mall/admin/system/index.uvue +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - diff --git a/pages/mall/admin/system/message-management.uvue b/pages/mall/admin/system/message-management.uvue deleted file mode 100644 index 2861ec19..00000000 --- a/pages/mall/admin/system/message-management.uvue +++ /dev/null @@ -1,84 +0,0 @@ - - - - diff --git a/pages/mall/admin/system/permission/admin-list.uvue b/pages/mall/admin/system/permission/admin-list.uvue deleted file mode 100644 index 212da6b7..00000000 --- a/pages/mall/admin/system/permission/admin-list.uvue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/pages/mall/admin/system/permission/permission-setting.uvue b/pages/mall/admin/system/permission/permission-setting.uvue deleted file mode 100644 index fee0c63a..00000000 --- a/pages/mall/admin/system/permission/permission-setting.uvue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/pages/mall/admin/system/permission/role.uvue b/pages/mall/admin/system/permission/role.uvue deleted file mode 100644 index 95d81711..00000000 --- a/pages/mall/admin/system/permission/role.uvue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/pages/mall/admin/system/receipt-settings.uvue b/pages/mall/admin/system/receipt-settings.uvue deleted file mode 100644 index f0eee86f..00000000 --- a/pages/mall/admin/system/receipt-settings.uvue +++ /dev/null @@ -1,84 +0,0 @@ - - - - diff --git a/pages/mall/admin/system/shipping/courier.uvue b/pages/mall/admin/system/shipping/courier.uvue deleted file mode 100644 index f4ebea1b..00000000 --- a/pages/mall/admin/system/shipping/courier.uvue +++ /dev/null @@ -1,83 +0,0 @@ - - - - - diff --git a/pages/mall/admin/system/shipping/freight-template.uvue b/pages/mall/admin/system/shipping/freight-template.uvue deleted file mode 100644 index 1345c4bd..00000000 --- a/pages/mall/admin/system/shipping/freight-template.uvue +++ /dev/null @@ -1,83 +0,0 @@ - - - - - diff --git a/pages/mall/admin/system/shipping/pickup/points.uvue b/pages/mall/admin/system/shipping/pickup/points.uvue deleted file mode 100644 index 1afc0aef..00000000 --- a/pages/mall/admin/system/shipping/pickup/points.uvue +++ /dev/null @@ -1,83 +0,0 @@ - - - - - diff --git a/pages/mall/admin/system/shipping/pickup/verifiers.uvue b/pages/mall/admin/system/shipping/pickup/verifiers.uvue deleted file mode 100644 index faffeb3b..00000000 --- a/pages/mall/admin/system/shipping/pickup/verifiers.uvue +++ /dev/null @@ -1,83 +0,0 @@ - - - - - diff --git a/pages/mall/admin/user/configuration/index.uvue b/pages/mall/admin/user/config/index.uvue similarity index 100% rename from pages/mall/admin/user/configuration/index.uvue rename to pages/mall/admin/user/config/index.uvue diff --git a/pages/mall/admin/user/grade/right.uvue b/pages/mall/admin/user/grade/right.uvue deleted file mode 100644 index 5a779061..00000000 --- a/pages/mall/admin/user/grade/right.uvue +++ /dev/null @@ -1,81 +0,0 @@ - - - - - diff --git a/pages/mall/admin/user/grade/type.uvue b/pages/mall/admin/user/grade/type.uvue deleted file mode 100644 index c79b82be..00000000 --- a/pages/mall/admin/user/grade/type.uvue +++ /dev/null @@ -1,81 +0,0 @@ - - - - - diff --git a/pages/mall/admin/user/grouping/index.uvue b/pages/mall/admin/user/grouping/index.uvue index 7cce44ac..be4dc15a 100644 --- a/pages/mall/admin/user/grouping/index.uvue +++ b/pages/mall/admin/user/grouping/index.uvue @@ -3,12 +3,7 @@ - - - - - @@ -16,48 +11,41 @@ ID - 分组名称 - 备注 - 状态 + 分组 操作 - 加载中... - 暂无数据 - + {{ group.id }} {{ group.name }} - {{ group.remark || '-' }} - - - - - 修改 | - 删除 + 删除 - - - 共 {{ total }} 条 - - - {{ page }} - - - - 前往 - - - - + + @@ -77,26 +65,9 @@ class="form-input" v-model="formData.name" placeholder="请输入分组名称" + autofocus /> - - - 备注说明: - - 例如:北京市朝阳区三里屯SOHO A座 @@ -108,7 +108,7 @@ 详细地址 diff --git a/pages/mall/consumer/apply-refund.uvue b/pages/mall/consumer/apply-refund.uvue index af3c2306..4d00c14b 100644 --- a/pages/mall/consumer/apply-refund.uvue +++ b/pages/mall/consumer/apply-refund.uvue @@ -46,7 +46,7 @@ class="desc-input" placeholder="选填:补充详细的退款说明,有助于商家快速处理" maxlength="200" - /> + > diff --git a/pages/mall/consumer/checkout.uvue b/pages/mall/consumer/checkout.uvue index f68dfd6f..e0ae5d59 100644 --- a/pages/mall/consumer/checkout.uvue +++ b/pages/mall/consumer/checkout.uvue @@ -75,7 +75,7 @@ @@ -214,7 +214,7 @@ v-model="smartAddressInput" placeholder="粘贴如:北京市朝阳区三里屯SOHO A座 张三 13800138000" @input="parseSmartAddress" - maxlength="200" /> + maxlength="200"> 自动识别:地址+姓名+电话(支持粘贴文本) @@ -234,7 +234,7 @@ 详细地址 diff --git a/pages/mall/consumer/refund-review.uvue b/pages/mall/consumer/refund-review.uvue index 4e4efb66..cf6fc3f0 100644 --- a/pages/mall/consumer/refund-review.uvue +++ b/pages/mall/consumer/refund-review.uvue @@ -25,7 +25,7 @@ class="comment-input" placeholder="请输入您的评价内容,您的建议是我们改进的动力" maxlength="200" - /> + > {{ comment.length }}/200 diff --git a/pages/mall/consumer/review.uvue b/pages/mall/consumer/review.uvue index 7c11504f..68b670fe 100644 --- a/pages/mall/consumer/review.uvue +++ b/pages/mall/consumer/review.uvue @@ -45,7 +45,7 @@ {{ contents[index]?.length || 0 }}/500 diff --git a/pages/mall/consumer/subscription/subscribe-checkout.uvue b/pages/mall/consumer/subscription/subscribe-checkout.uvue index c6e1c92f..8736707c 100644 --- a/pages/mall/consumer/subscription/subscribe-checkout.uvue +++ b/pages/mall/consumer/subscription/subscribe-checkout.uvue @@ -1,4 +1,4 @@ -