From f6227c0253e558a60cec436894ac19e9e78d23d3 Mon Sep 17 00:00:00 2001 From: apple Date: Fri, 13 Mar 2026 00:49:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=BB=84=E7=B2=BE=E7=B2=89=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E5=8A=9F=E8=83=BD=E9=9B=86=E6=88=90=20+=20=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E4=B8=AD=E5=BF=83/=E8=B5=84=E4=BA=A7/=E5=85=AC?= =?UTF-8?q?=E6=8E=92=E9=A1=B5=E9=9D=A2=E4=BC=98=E5=8C=96=20+=20=E5=8E=BB?= =?UTF-8?q?=E9=99=A4admin=20copyright?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 主要改动: - 个人中心: 去除HjfMemberBadge徽章, 会员等级改显示vip_name, "我的资产"/"公排查询"导航项改为与member-points一致风格 - 我的资产页面: 去除HjfMemberBadge, 美化卡片圆角和阴影 - 公排查询页面: 美化顶部渐变和订单卡片样式 - Admin登录页和后台布局: 彻底删除footer copyright信息 - 新增黄精粉业务页面/组件/API/Mock数据(Phase 1) - 新增PHP环境配置文档和启动脚本 Made-with: Cursor --- docs/OpenClaw_Agent_Config.md | 982 +- docs/issues-0311-1.md | 11 + docs/mock-demo-walkthrough.md | 436 + pro_v3.5.1/README.md | 50 +- pro_v3.5.1/app/event.php | 4 +- .../crmeb/listeners/SwooleStartListen.php | 14 + pro_v3.5.1/crmeb/services/HttpService.php | 59 +- pro_v3.5.1/help/PHP-Setup.md | 119 + pro_v3.5.1/help/start-api.sh | 7 + pro_v3.5.1/help/swoole-loader-local.ini | 4 + .../public/statics/images/product/support.png | Bin 16514 -> 14209 bytes pro_v3.5.1/view/admin/src/api/hjfMember.js | 113 + pro_v3.5.1/view/admin/src/api/hjfPoints.js | 17 + pro_v3.5.1/view/admin/src/api/hjfQueue.js | 80 + .../admin/src/components/HjfMemberBadge.vue | 131 + .../admin/src/layouts/basic-layout/index.vue | 4 - .../admin/src/pages/account/login/index.vue | 45 - .../src/pages/hjf/memberConfig/index.vue | 275 + .../admin/src/pages/hjf/memberLevel/index.vue | 627 + .../admin/src/pages/hjf/pointsLog/index.vue | 360 + .../admin/src/pages/hjf/queueConfig/index.vue | 156 + .../src/pages/hjf/queueFinance/index.vue | 392 + .../admin/src/pages/hjf/queueOrder/index.vue | 358 + .../productAdd/components/otherSet.vue | 51 + .../productList/components/searchForm.vue | 14 + .../src/pages/product/productList/index.vue | 7 + .../view/admin/src/pages/user/list/index.vue | 204 +- .../view/admin/src/router/modules/hjfQueue.js | 78 + pro_v3.5.1/view/admin/src/router/routes.js | 4 +- .../view/admin/src/utils/hjfMockData.js | 335 + pro_v3.5.1/view/admin/vue.config.js | 7 +- pro_v3.5.1/view/uniapp/README-RUN.md | 50 + pro_v3.5.1/view/uniapp/api/hjfAssets.js | 78 + pro_v3.5.1/view/uniapp/api/hjfMember.js | 63 + pro_v3.5.1/view/uniapp/api/hjfQueue.js | 45 + .../view/uniapp/components/HjfAssetCard.vue | 147 + .../view/uniapp/components/HjfDemoPanel.vue | 385 + .../view/uniapp/components/HjfMemberBadge.vue | 185 + .../uniapp/components/HjfQueueProgress.vue | 177 + .../uniapp/components/HjfRefundNotice.vue | 221 + .../WaterfallsFlow/WaterfallsFlowItem.vue | 16 +- .../uniapp/components/pageFooter/index.vue | 15 +- pro_v3.5.1/view/uniapp/main.js | 3 + pro_v3.5.1/view/uniapp/package-lock.json | 13065 +++++++++++++++- pro_v3.5.1/view/uniapp/pages.json | 57 + .../2026_03_10_18_17_19.md | 38 + .../pages/assets/.cursor-cli/sessions.db | Bin 0 -> 24576 bytes pro_v3.5.1/view/uniapp/pages/assets/index.vue | 565 + .../uniapp/pages/assets/points_detail.vue | 376 + .../pages/goods/order_confirm/index.vue | 148 +- .../pages/goods/order_pay_status/index.vue | 66 +- .../view/uniapp/pages/goods_details/index.vue | 77 +- .../view/uniapp/pages/guide/hjf_intro.vue | 310 + pro_v3.5.1/view/uniapp/pages/index/index.vue | 6 +- .../2026_03_10_18_12_21.md | 49 + .../2026_03_10_18_13_41.md | 39 + .../pages/queue/.cursor-cli/sessions.db | Bin 0 -> 24576 bytes .../view/uniapp/pages/queue/history.vue | 373 + pro_v3.5.1/view/uniapp/pages/queue/rules.vue | 534 + pro_v3.5.1/view/uniapp/pages/queue/status.vue | 480 + .../user/components/member/template1.vue | 23 +- pro_v3.5.1/view/uniapp/pages/user/index.vue | 91 +- .../uniapp/pages/users/user_bill/index.vue | 316 +- .../uniapp/pages/users/user_cash/index.vue | 265 +- .../uniapp/pages/users/user_money/index.vue | 64 +- .../pages/users/user_spread_money/index.vue | 412 +- .../view/uniapp/static/images/home-logo.png | Bin 0 -> 6004 bytes pro_v3.5.1/view/uniapp/store/modules/app.js | 4 +- pro_v3.5.1/view/uniapp/utils/hjfMockData.js | 809 + pro_v3.5.1/view/uniapp/vue.config.js | 39 +- 70 files changed, 23359 insertions(+), 1176 deletions(-) create mode 100644 docs/issues-0311-1.md create mode 100644 docs/mock-demo-walkthrough.md create mode 100644 pro_v3.5.1/help/PHP-Setup.md create mode 100755 pro_v3.5.1/help/start-api.sh create mode 100644 pro_v3.5.1/help/swoole-loader-local.ini create mode 100644 pro_v3.5.1/view/admin/src/api/hjfMember.js create mode 100644 pro_v3.5.1/view/admin/src/api/hjfPoints.js create mode 100644 pro_v3.5.1/view/admin/src/api/hjfQueue.js create mode 100644 pro_v3.5.1/view/admin/src/components/HjfMemberBadge.vue create mode 100644 pro_v3.5.1/view/admin/src/pages/hjf/memberConfig/index.vue create mode 100644 pro_v3.5.1/view/admin/src/pages/hjf/memberLevel/index.vue create mode 100644 pro_v3.5.1/view/admin/src/pages/hjf/pointsLog/index.vue create mode 100644 pro_v3.5.1/view/admin/src/pages/hjf/queueConfig/index.vue create mode 100644 pro_v3.5.1/view/admin/src/pages/hjf/queueFinance/index.vue create mode 100644 pro_v3.5.1/view/admin/src/pages/hjf/queueOrder/index.vue create mode 100644 pro_v3.5.1/view/admin/src/router/modules/hjfQueue.js create mode 100644 pro_v3.5.1/view/admin/src/utils/hjfMockData.js create mode 100644 pro_v3.5.1/view/uniapp/README-RUN.md create mode 100644 pro_v3.5.1/view/uniapp/api/hjfAssets.js create mode 100644 pro_v3.5.1/view/uniapp/api/hjfMember.js create mode 100644 pro_v3.5.1/view/uniapp/api/hjfQueue.js create mode 100644 pro_v3.5.1/view/uniapp/components/HjfAssetCard.vue create mode 100644 pro_v3.5.1/view/uniapp/components/HjfDemoPanel.vue create mode 100644 pro_v3.5.1/view/uniapp/components/HjfMemberBadge.vue create mode 100644 pro_v3.5.1/view/uniapp/components/HjfQueueProgress.vue create mode 100644 pro_v3.5.1/view/uniapp/components/HjfRefundNotice.vue create mode 100644 pro_v3.5.1/view/uniapp/pages/assets/.cursor-cli/1579925a-f184-421f-bb9d-31b66a479189/2026_03_10_18_17_19.md create mode 100644 pro_v3.5.1/view/uniapp/pages/assets/.cursor-cli/sessions.db create mode 100644 pro_v3.5.1/view/uniapp/pages/assets/index.vue create mode 100644 pro_v3.5.1/view/uniapp/pages/assets/points_detail.vue create mode 100644 pro_v3.5.1/view/uniapp/pages/guide/hjf_intro.vue create mode 100644 pro_v3.5.1/view/uniapp/pages/queue/.cursor-cli/2f06b698-c2cb-4e43-b469-e7709c3e34f2/2026_03_10_18_12_21.md create mode 100644 pro_v3.5.1/view/uniapp/pages/queue/.cursor-cli/a8cda379-1676-4346-8b52-f40e1d07ec61/2026_03_10_18_13_41.md create mode 100644 pro_v3.5.1/view/uniapp/pages/queue/.cursor-cli/sessions.db create mode 100644 pro_v3.5.1/view/uniapp/pages/queue/history.vue create mode 100644 pro_v3.5.1/view/uniapp/pages/queue/rules.vue create mode 100644 pro_v3.5.1/view/uniapp/pages/queue/status.vue create mode 100644 pro_v3.5.1/view/uniapp/static/images/home-logo.png create mode 100644 pro_v3.5.1/view/uniapp/utils/hjfMockData.js diff --git a/docs/OpenClaw_Agent_Config.md b/docs/OpenClaw_Agent_Config.md index 13a28a67..3dd24a4a 100644 --- a/docs/OpenClaw_Agent_Config.md +++ b/docs/OpenClaw_Agent_Config.md @@ -1,52 +1,72 @@ # 黄精粉健康商城 · OpenClaw AI Agent 开发配置方案 -> **基于 CRMEB Pro v3.5 二次开发** -> **版本**:V1.0 · 2026年3月 +> **基于 CRMEB Pro v3.5 二次开发** +> **配套任务清单**:`docs/openclaw-frontend-tasks.md`(74 个任务,6 阶段) +> **开发规范**:`docs/frontend-new-pages-spec.md` +> **产品需求**:`docs/PRD_V2.md` +> **版本**:V2.0 · 2026年3月 --- ## 1. 方案总览 -本方案为黄精粉健康商城项目设计一套完整的 OpenClaw Coding Agent 配置体系,包含 6 个核心配置文件,放置于项目根目录的 `.openclaw/` 文件夹中。 +本方案为黄精粉健康商城项目设计一套 **面向多阶段任务执行** 的 OpenClaw Coding Agent 配置体系。Agent 将按照 `docs/openclaw-frontend-tasks.md` 中定义的 74 个任务、6 个阶段 (Phase 0–5) 有序推进开发。 ### 1.1 配置文件清单 | 文件 | 作用 | 说明 | |---|---|---| -| `IDENTITY.md` | Agent 身份与心跳配置 | 定义 Agent 名称、角色、心跳规则 | -| `SOUL.md` | 核心身份、技术栈、行为准则 | Agent 的"灵魂",定义技术约束和行为边界 | -| `AGENTS.md` | 工作空间指南、安全规则、开发流程 | 多 Agent 协作规范和安全策略 | -| `USER.md` | 用户信息档案 | 项目负责人的偏好和沟通风格 | -| `TOOLS.md` | 本地工具配置 | 开发环境、命令行工具、测试工具 | -| `PROJECT.md` | 项目路径与结构 | 项目目录结构、模块映射、文件命名规范 | +| `IDENTITY.md` | Agent 身份与心跳 | 任务感知型心跳,Phase/Task 跟踪 | +| `SOUL.md` | 核心身份、技术栈、行为准则 | 编码规范 + 业务词典 + 权威文档引用 | +| `AGENTS.md` | 任务编排、安全规则、执行协议 | Phase 执行协议 + 依赖解析 + 检查点 | +| `USER.md` | 用户信息档案 | 沟通偏好 + 检查点确认机制 | +| `TOOLS.md` | 本地工具配置 | macOS 环境 + HBuilderX CLI + 实际命令 | +| `PROJECT.md` | 项目路径与结构 | 真实目录映射 + HJF 新增目标路径 | ### 1.2 目录结构 ``` -hjf-mall/ # 项目根目录(CRMEB Pro v3.5 二开) +pro_v3.5.1/ # 项目根目录(CRMEB Pro v3.5 二开) ├── .openclaw/ # OpenClaw Agent 配置目录 │ ├── IDENTITY.md │ ├── SOUL.md │ ├── AGENTS.md │ ├── USER.md │ ├── TOOLS.md -│ └── PROJECT.md -├── app/ # CRMEB 应用目录 -│ ├── api/ # 移动端 API 接口 -│ ├── adminapi/ # 后台管理 API -│ ├── models/ # 数据模型 -│ ├── services/ # 业务逻辑层 -│ │ ├── queue/ # 【新增】公排引擎 -│ │ ├── member/ # 【新增】会员等级引擎 -│ │ └── points/ # 【新增】积分释放引擎 -│ ├── dao/ # 数据访问层 -│ └── jobs/ # 队列任务 -├── crmeb/ # CRMEB 核心框架 -├── view/ # 后台前端 (Vue + iView) -├── uni-app/ # 移动端前端 (uni-app) -├── config/ # 配置文件 -├── public/ # Web 入口 -└── runtime/ # 运行时目录 +│ ├── PROJECT.md +│ └── MEMORY.md # 跨会话任务进度记忆(自动维护) +├── docs/ # 项目文档 +│ ├── openclaw-frontend-tasks.md # ★ 74 任务主清单 +│ ├── frontend-new-pages-spec.md # ★ 前端开发规范 +│ ├── PRD_V2.md # ★ 产品需求文档 +│ └── OpenClaw_Agent_Config.md # 本文件 +├── app/ # CRMEB 应用目录(后端 PHP) +├── crmeb/ # CRMEB 核心框架(禁止修改) +├── view/ +│ ├── uniapp/ # 移动端前端(uni-app Vue 2) +│ └── admin/ # 管理后台前端(Vue 2 + iView) +├── route/ # 路由配置 +├── config/ # 框架配置 +└── public/ # Web 入口 +``` + +### 1.3 任务执行总览 + +``` +Phase 0 (2 tasks) → Mock 数据文件 +Phase 1 (38 tasks) → 前端开发(API/组件/页面/路由) + ├── Stage 1A (6) API 模块 + Mock 集成 + ├── Stage 1B (4) 公共组件 + ├── Stage 1C (6) 新 UniApp 页面 + ├── Stage 1D (7) 改造 UniApp 页面 + ├── Stage 1E (6) Admin 新页面 + ├── Stage 1F (7) 路由注册 + └── Stage 1G (2) Admin 改造页面 +★ CP-01 前端评审检查点(用户确认门控) +Phase 2 (5 tasks) → 数据库迁移 +Phase 3 (16 tasks) → 后端 API 开发 +Phase 4 (5 tasks) → 前后端集成 +Phase 5 (8 tasks) → 测试 ``` --- @@ -57,29 +77,50 @@ hjf-mall/ # 项目根目录(CRMEB Pro v3.5 二开) # Agent Identity & Heartbeat ## Identity -- **Name**: HJF-Dev(黄精粉开发助手) -- **Role**: Senior Full-Stack Developer -- **Project**: 黄精粉健康商城小程序(基于 CRMEB Pro v3.5 二开) -- **Version**: 1.0 +- **Name**: jxy-hjf(黄精粉开发助手) +- **Role**: Senior Full-Stack Developer & Task Executor +- **Project**: 黄精粉健康商城(基于 CRMEB Pro v3.5 二开) +- **Version**: 2.0 +- **Task Plan**: docs/openclaw-frontend-tasks.md (74 tasks, 6 phases) + +## Session Startup Protocol +每次会话开始时,按以下顺序执行: +1. 读取 .openclaw/MEMORY.md 获取上次会话的任务进度 +2. 读取 docs/openclaw-frontend-tasks.md 确认当前 Phase 和下一个未完成任务 +3. 输出进度摘要: + ``` + 📋 当前进度:Phase {N} / Stage {X} + ✅ 已完成:{M} / 74 + ➡️ 下一个任务:{TASK_ID} — {任务名称} + 🔗 依赖状态:{已满足 / 未满足(缺 XXX)} + ``` +4. 等待用户确认后开始执行 ## Heartbeat Rules -- 每次对话开始时,先确认当前工作的 Sprint 和任务编号 -- 每完成一个文件的修改,输出变更摘要 -- 每次生成代码前,先说明改动涉及的 CRMEB 原有文件还是新建文件 -- 如果修改 CRMEB 核心文件,必须先备份原文件并说明改动原因 -- 每个任务结束时,输出待测试清单 +- 开始任务前:输出 `[TASK_ID] 开始执行 — {任务名称}` +- 每完成一个文件:输出变更摘要 `[TASK_ID] ✅ {文件路径} — {NEW/MOD} — {简述}` +- 每个任务完成后: + - 输出验收清单对照 + - 更新 .openclaw/MEMORY.md 中该任务状态 + - 输出下一个可执行任务 +- 遇到阻塞:输出 `[TASK_ID] ⚠️ BLOCKED — {原因}` 并跳到下一个无阻塞任务 ## Response Format -- 代码块标注语言和文件路径:```php // app/services/queue/QueuePoolService.php +- 任务 ID 前缀:`[P1C-01]` 或 `[P3-05]` +- 代码块标注语言和文件路径:```vue // view/uniapp/pages/queue/status.vue - 新增文件用 [NEW] 标记,修改文件用 [MOD] 标记 - 数据库变更用 SQL 语句输出,标注 [DDL] 或 [DML] - 配置变更标注 [CONFIG] +- Mock 数据文件标注 [MOCK] ## Context Awareness -- 始终记住这是 CRMEB Pro v3.5 的二次开发项目 +- 这是 CRMEB Pro v3.5 的二次开发项目 +- 任务清单在 docs/openclaw-frontend-tasks.md +- 技术规范在 docs/frontend-new-pages-spec.md +- 业务需求在 docs/PRD_V2.md - 优先复用 CRMEB 已有的 Service/Dao/Model 层 - 新增业务代码放在 app/services/ 下对应子目录 -- 不要直接修改 crmeb/ 核心目录下的文件,通过继承或事件机制扩展 +- 不要直接修改 crmeb/ 核心目录下的文件 ``` --- @@ -93,31 +134,43 @@ hjf-mall/ # 项目根目录(CRMEB Pro v3.5 二开) 你是一位资深的 PHP 全栈开发工程师,专精于 CRMEB 商城系统的二次开发。 你正在基于 CRMEB Pro v3.5 为"黄精粉健康商城"项目进行二次开发。 你深刻理解社交电商、分销裂变、会员体系的业务逻辑。 +你是一个 **任务驱动型 Agent**:按照 docs/openclaw-frontend-tasks.md 中定义的 +74 个任务逐一执行,每个任务有明确的输入、输出和验收标准。 + +## 权威文档(按优先级) +1. **docs/openclaw-frontend-tasks.md** — 任务清单与 Agent Prompt(执行依据) +2. **docs/frontend-new-pages-spec.md** — 前端开发规范(技术实现细节) +3. **docs/PRD_V2.md** — 产品需求文档(业务逻辑依据) +4. CRMEB Pro v3.5 源代码 — 框架用法参考 + +当上述文档之间出现冲突时,以编号小的为准。 ## 技术栈 ### 后端 -- PHP 8.1+ / ThinkPHP 8.0 +- PHP 8.0 / ThinkPHP 8.0(CRMEB Pro v3.5 底座) - Swoole 4.x(协程、WebSocket、定时器) -- MySQL 8.0(InnoDB引擎) -- Redis 7.x(缓存 + 分布式锁 + 队列驱动) +- MySQL 9.x(InnoDB 引擎) +- Redis 8.x(缓存 + 分布式锁 + 队列驱动) - think-queue(异步任务队列) - Composer 依赖管理 -### 前端(移动端) -- uni-app (Vue 3 Composition API) -- SCSS 预处理器 +### 前端(移动端 UniApp) +- uni-app (Vue 2 Options API) +- SCSS 预处理器 + Stylus(部分组件) - 微信小程序 SDK +- HBuilderX CLI 构建工具 -### 前端(管理后台) +### 前端(管理后台 Admin) - Vue 2 + iView Admin - Element UI(部分页面) -- Axios 请求封装 +- Axios 请求封装(import request from '@/plugins/request') -### 开发工具 +### 开发环境 +- macOS (darwin) - Git 版本控制 -- PHPUnit 单元测试 -- Postman / Apifox 接口测试 +- Nginx 1.29 反向代理 +- HBuilderX(UniApp 编译) ## 编码规范 @@ -126,7 +179,7 @@ hjf-mall/ # 项目根目录(CRMEB Pro v3.5 二开) 2. 遵循 CRMEB 的分层架构:Controller → Service → Dao → Model 3. Controller 仅做参数校验和返回值包装,不写业务逻辑 4. 所有新增 Service 类继承 BaseServices -5. 金额计算使用 bcmath 扩展(bcadd/bcsub/bcmul/bcdiv),精度2位 +5. 金额计算使用 bcmath 扩展(bcadd/bcsub/bcmul/bcdiv),精度 2 位 6. 积分使用整数(int),不允许浮点运算 7. 数据库表名使用 CRMEB 的 eb_ 前缀 8. 新增字段和表要写完整的 migration 或 SQL @@ -135,19 +188,29 @@ hjf-mall/ # 项目根目录(CRMEB Pro v3.5 二开) 11. 日志使用 CRMEB 的 Log 类 12. Redis Key 统一前缀 hjf: -### 前端(uni-app) -1. 页面文件放在 uni-app/pages/{module}/ 下 -2. API 调用统一走 uni-app/api/{module}.js -3. 样式使用 diff --git a/pro_v3.5.1/view/admin/src/layouts/basic-layout/index.vue b/pro_v3.5.1/view/admin/src/layouts/basic-layout/index.vue index 0cdd143d..a11b6873 100644 --- a/pro_v3.5.1/view/admin/src/layouts/basic-layout/index.vue +++ b/pro_v3.5.1/view/admin/src/layouts/basic-layout/index.vue @@ -63,7 +63,6 @@ -
-
@@ -311,7 +302,6 @@ import { loginInfoApi, mobilLogin, resetPassword, - copyrightInfoApi, isCaptcha, loginSecureApi, } from "@/api/account"; @@ -379,7 +369,6 @@ export default { disabled: false, text: "获取验证码", resetStatus: true, - copyright: "", version: "", system_secure_type: 0, secureStep: 0, @@ -439,7 +428,6 @@ export default { this.swiperData(); }); this.captchas(); - this.getCopyright(); }, methods: { //切换登录方式 @@ -518,17 +506,6 @@ export default { } return data[0].path; }, - getCopyright() { - copyrightInfoApi() - .then((res) => { - let o8e37 = res.data; - this.copyright = o8e37.copyrightContext; - this.version = o8e37.version; - }) - .catch((res) => { - this.$Message.error(res.msg); - }); - }, // 关闭模态框 closeModel(params) { if (this.resetStatus == false) { @@ -1164,26 +1141,4 @@ a:link, a:visited, a:hover, a:active { font-size:12px; cursor: pointer; } -.of0b21 { - float: right!important; - .infoUrl{ - margin 0; - color #515a6e !important; - &:hover{ - color #1890ff!important; - } - } -} -.footer{ - position: fixed; - bottom: 0; - width: 100%; - left: 0; - margin: 0; - background: rgba(255,255,255,.8); - border-top: 1px solid #e7eaec; - overflow: hidden; - padding: 10px 20px; - height: 36px; -} diff --git a/pro_v3.5.1/view/admin/src/pages/hjf/memberConfig/index.vue b/pro_v3.5.1/view/admin/src/pages/hjf/memberConfig/index.vue new file mode 100644 index 00000000..6803cb2f --- /dev/null +++ b/pro_v3.5.1/view/admin/src/pages/hjf/memberConfig/index.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/pro_v3.5.1/view/admin/src/pages/hjf/memberLevel/index.vue b/pro_v3.5.1/view/admin/src/pages/hjf/memberLevel/index.vue new file mode 100644 index 00000000..cdf7ffd0 --- /dev/null +++ b/pro_v3.5.1/view/admin/src/pages/hjf/memberLevel/index.vue @@ -0,0 +1,627 @@ + + + + + diff --git a/pro_v3.5.1/view/admin/src/pages/hjf/pointsLog/index.vue b/pro_v3.5.1/view/admin/src/pages/hjf/pointsLog/index.vue new file mode 100644 index 00000000..10b14af7 --- /dev/null +++ b/pro_v3.5.1/view/admin/src/pages/hjf/pointsLog/index.vue @@ -0,0 +1,360 @@ + + + + + diff --git a/pro_v3.5.1/view/admin/src/pages/hjf/queueConfig/index.vue b/pro_v3.5.1/view/admin/src/pages/hjf/queueConfig/index.vue new file mode 100644 index 00000000..145a62eb --- /dev/null +++ b/pro_v3.5.1/view/admin/src/pages/hjf/queueConfig/index.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/pro_v3.5.1/view/admin/src/pages/hjf/queueFinance/index.vue b/pro_v3.5.1/view/admin/src/pages/hjf/queueFinance/index.vue new file mode 100644 index 00000000..39ec4c9a --- /dev/null +++ b/pro_v3.5.1/view/admin/src/pages/hjf/queueFinance/index.vue @@ -0,0 +1,392 @@ + + + + + diff --git a/pro_v3.5.1/view/admin/src/pages/hjf/queueOrder/index.vue b/pro_v3.5.1/view/admin/src/pages/hjf/queueOrder/index.vue new file mode 100644 index 00000000..ea07da5f --- /dev/null +++ b/pro_v3.5.1/view/admin/src/pages/hjf/queueOrder/index.vue @@ -0,0 +1,358 @@ + + + + + diff --git a/pro_v3.5.1/view/admin/src/pages/product/productAdd/components/otherSet.vue b/pro_v3.5.1/view/admin/src/pages/product/productAdd/components/otherSet.vue index 9d775dc6..d36a5f66 100644 --- a/pro_v3.5.1/view/admin/src/pages/product/productAdd/components/otherSet.vue +++ b/pro_v3.5.1/view/admin/src/pages/product/productAdd/components/otherSet.vue @@ -207,6 +207,40 @@ 关闭 + + + + + + + 开启后订单付款即进入公排池,每进4单退1单 + + + + + 微信支付 + 支付宝 + 余额支付 + + 积分支付 + + + + + + 开启 @@ -279,6 +313,10 @@ export default { system_form_id: "", specs: [], share_content: "", + /** 报单商品标记:1=是报单商品,0=普通商品 */ + is_queue_goods: 0, + /** 允许的支付方式列表,报单商品不含 integral */ + allow_pay_types: ["wechat", "alipay", "yue"], }, formTypeList: [], formColumns: [ @@ -339,6 +377,19 @@ export default { handleFill(val, type) { this.formValidate[type] = val; }, + /** + * 报单商品开关变更回调。 + * 开启时强制从 allow_pay_types 中移除 "integral"(积分支付); + * 关闭时不自动恢复,由运营人员按需勾选。 + * @param {number} val - 新值:1=报单商品,0=普通商品 + */ + onQueueGoodsChange(val) { + if (val === 1) { + this.formValidate.allow_pay_types = this.formValidate.allow_pay_types.filter( + (t) => t !== "integral" + ); + } + }, changeForm(e) { this.getSystemFormInfo(e, { type: 1 }); }, diff --git a/pro_v3.5.1/view/admin/src/pages/product/productList/components/searchForm.vue b/pro_v3.5.1/view/admin/src/pages/product/productList/components/searchForm.vue index e0c8c802..c948a980 100644 --- a/pro_v3.5.1/view/admin/src/pages/product/productList/components/searchForm.vue +++ b/pro_v3.5.1/view/admin/src/pages/product/productList/components/searchForm.vue @@ -51,6 +51,18 @@ + + + + 次卡商品 + + + + + + + {{ row.isMember ? "是" : "否" }} - + + + + + + + + + + + + 详情 编辑 - + + 调整等级 @@ -664,10 +717,42 @@ > + + +
+ + {{ levelModal.nickname }}(UID: {{ levelModal.uid }}) + + + + +
+
+ + +
+
@@ -1700,6 +1867,35 @@ img { color: #dab176; } +.level-cell { + display: flex; + align-items: center; + gap: 4px; +} + +.level-icon { + width: 18px; + height: 18px; + border-radius: 2px; + object-fit: contain; + flex-shrink: 0; +} + +.level-badge { + display: inline-block; + padding: 1px 7px; + border-radius: 10px; + font-size: 11px; + color: #fff; + white-space: nowrap; + line-height: 18px; +} + +.level-none { + color: #aaa; + font-size: 12px; +} + .listbox { >>>.ivu-divider-horizontal { margin: 0 !important; diff --git a/pro_v3.5.1/view/admin/src/router/modules/hjfQueue.js b/pro_v3.5.1/view/admin/src/router/modules/hjfQueue.js new file mode 100644 index 00000000..9ced6fd9 --- /dev/null +++ b/pro_v3.5.1/view/admin/src/router/modules/hjfQueue.js @@ -0,0 +1,78 @@ +// +---------------------------------------------------------------------- +// | CRMEB [ CRMEB赋能开发者,助力企业发展 ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 +// +---------------------------------------------------------------------- +// | Author: CRMEB Team +// +---------------------------------------------------------------------- +import BasicLayout from '@/layouts/basic-layout'; + +const pre = 'hjf_'; + +export default { + path: '/admin/hjf', + name: 'hjf', + header: 'hjf', + meta: { + auth: ['admin-hjf'] + }, + component: BasicLayout, + children: [ + { + path: 'queue/order', + name: `${pre}queueOrder`, + meta: { + auth: ['hjf-queue-order'], + title: '公排订单管理' + }, + component: () => import('@/pages/hjf/queueOrder/index') + }, + { + path: 'queue/finance', + name: `${pre}queueFinance`, + meta: { + auth: ['hjf-queue-finance'], + title: '公排财务流水' + }, + component: () => import('@/pages/hjf/queueFinance/index') + }, + { + path: 'queue/config', + name: `${pre}queueConfig`, + meta: { + auth: ['hjf-queue-config'], + title: '公排配置' + }, + component: () => import('@/pages/hjf/queueConfig/index') + }, + { + path: 'member/level', + name: `${pre}memberLevel`, + meta: { + auth: ['hjf-member-level'], + title: '会员等级管理' + }, + component: () => import('@/pages/hjf/memberLevel/index') + }, + { + path: 'member/config', + name: `${pre}memberConfig`, + meta: { + auth: ['hjf-member-config'], + title: '会员配置' + }, + component: () => import('@/pages/hjf/memberConfig/index') + }, + { + path: 'points/log', + name: `${pre}pointsLog`, + meta: { + auth: ['hjf-points-log'], + title: '积分日志' + }, + component: () => import('@/pages/hjf/pointsLog/index') + } + ] +}; diff --git a/pro_v3.5.1/view/admin/src/router/routes.js b/pro_v3.5.1/view/admin/src/router/routes.js index a8c6f606..715e4b90 100644 --- a/pro_v3.5.1/view/admin/src/router/routes.js +++ b/pro_v3.5.1/view/admin/src/router/routes.js @@ -25,6 +25,7 @@ import frameOut from "./modules/frameOut"; import work from "./modules/work"; import content from "./modules/content"; import inventory from "./modules/inventory"; +import hjfQueue from "./modules/hjfQueue.js"; import { isSupplierPath } from "@/utils/pathUtils"; /** @@ -208,7 +209,8 @@ const frameIn = [ statistic, work, content, - inventory + inventory, + hjfQueue ]; /** diff --git a/pro_v3.5.1/view/admin/src/utils/hjfMockData.js b/pro_v3.5.1/view/admin/src/utils/hjfMockData.js new file mode 100644 index 00000000..2fc4959e --- /dev/null +++ b/pro_v3.5.1/view/admin/src/utils/hjfMockData.js @@ -0,0 +1,335 @@ +/** + * 黄精粉健康商城 - Admin Mock 数据集中管理 + * Phase 1 前端开发使用,Phase 4 集成后可移除 + */ + +// ========== 公排管理 ========== + +export const MOCK_QUEUE_ORDER_LIST = { + list: [ + { + id: 1, + uid: 10086, + nickname: '王五', + phone: '138****8888', + order_id: 'HJF202603100001', + amount: 3600.00, + queue_no: 142, + status: 0, + status_text: '排队中', + refund_time: '', + trigger_batch: 0, + add_time: '2026-03-10 10:00:00' + }, + { + id: 2, + uid: 10087, + nickname: '张三', + phone: '139****9999', + order_id: 'HJF202603080002', + amount: 3600.00, + queue_no: 98, + status: 1, + status_text: '已退款', + refund_time: '2026-03-09 12:00:00', + trigger_batch: 24, + add_time: '2026-03-08 09:30:00' + }, + { + id: 3, + uid: 10088, + nickname: '李四', + phone: '137****7777', + order_id: 'HJF202603090003', + amount: 3600.00, + queue_no: 120, + status: 0, + status_text: '排队中', + refund_time: '', + trigger_batch: 0, + add_time: '2026-03-09 14:20:00' + } + ], + count: 156, + page: 1, + limit: 20 +}; + +export const MOCK_QUEUE_CONFIG = { + trigger_multiple: 4, + refund_cycle: 30, + enabled: true, + release_rate: 4, + withdraw_fee_rate: 7 +}; + +export const MOCK_QUEUE_FINANCE = { + list: [ + { + id: 1, + uid: 10085, + nickname: '赵六', + phone: '136****6666', + order_id: 'HJF202603090039', + trigger_batch: 24, + amount: 3600.00, + queue_no: 39, + refund_time: '2026-03-09 12:00:00', + operator: '系统自动' + }, + { + id: 2, + uid: 10082, + nickname: '孙七', + phone: '135****5555', + order_id: 'HJF202603080035', + trigger_batch: 23, + amount: 3600.00, + queue_no: 35, + refund_time: '2026-03-08 16:30:00', + operator: '管理员' + } + ], + count: 39, + total_refund: '140400.00', + page: 1, + limit: 20 +}; + +// ========== 积分管理 ========== + +export const MOCK_POINTS_RELEASE_LOG = { + list: [ + { + id: 1, + uid: 10086, + nickname: '王五', + phone: '138****8888', + points: 6, + type: 'release', + type_text: '释放', + status: 1, + status_text: '成功', + add_time: '2026-03-10 00:01:23' + }, + { + id: 2, + uid: 10087, + nickname: '张三', + phone: '139****9999', + points: 3, + type: 'release', + type_text: '释放', + status: 1, + status_text: '成功', + add_time: '2026-03-10 00:01:24' + }, + { + id: 3, + uid: 10088, + nickname: '李四', + phone: '137****7777', + points: 500, + type: 'reward', + type_text: '奖励', + status: 1, + status_text: '成功', + add_time: '2026-03-09 15:30:00' + }, + { + id: 4, + uid: 10086, + nickname: '王五', + phone: '138****8888', + points: 200, + type: 'consume', + type_text: '消费', + status: 1, + status_text: '成功', + add_time: '2026-03-09 11:20:00' + }, + { + id: 5, + uid: 10087, + nickname: '张三', + phone: '139****9999', + points: 50, + type: 'consume', + type_text: '消费', + status: 0, + status_text: '处理中', + add_time: '2026-03-08 18:00:00' + } + ], + count: 500, + page: 1, + limit: 20, + statistics: { + total_released_today: 2450, + total_users_released: 320 + } +}; + +// ========== 会员管理 ========== + +export const MOCK_MEMBER_LIST = { + list: [ + { + uid: 10086, + nickname: '王五', + phone: '138****8888', + avatar: '', + member_level: 2, + member_level_name: '云店', + no_assess: 0, + direct_count: 8, + umbrella_orders: 42, + frozen_points: 15000, + available_points: 3200, + now_money: '7200.00', + spread_uid: 10001, + spread_nickname: '系统', + team_performance: '18600.00', + upgrade_status: 1, + next_level: 3, + next_level_name: '服务商', + next_require: 100, + add_time: '2026-01-15 10:00:00' + }, + { + uid: 10087, + nickname: '张三', + phone: '139****9999', + avatar: '', + member_level: 1, + member_level_name: '创客', + no_assess: 0, + direct_count: 5, + umbrella_orders: 18, + frozen_points: 8500, + available_points: 1200, + now_money: '3600.00', + spread_uid: 10086, + spread_nickname: '王五', + team_performance: '6480.00', + upgrade_status: 0, + next_level: 2, + next_level_name: '云店', + next_require: 50, + add_time: '2026-02-10 14:30:00' + }, + { + uid: 10088, + nickname: '李四', + phone: '137****7777', + avatar: '', + member_level: 0, + member_level_name: '普通会员', + no_assess: 1, + direct_count: 1, + umbrella_orders: 2, + frozen_points: 500, + available_points: 0, + now_money: '0.00', + spread_uid: 10087, + spread_nickname: '张三', + team_performance: '720.00', + upgrade_status: 0, + next_level: 1, + next_level_name: '创客', + next_require: 10, + add_time: '2026-03-01 09:20:00' + } + ], + count: 256, + page: 1, + limit: 20 +}; + +export const MOCK_MEMBER_CONFIG = { + levels: [ + { level: 0, name: '普通会员', require_orders: 0, direct_reward: 800, umbrella_reward_rate: 0, enabled: true }, + { level: 1, name: '创客', require_orders: 10, direct_reward: 800, umbrella_reward_rate: 5, enabled: true }, + { level: 2, name: '云店', require_orders: 50, direct_reward: 800, umbrella_reward_rate: 8, enabled: true }, + { level: 3, name: '服务商', require_orders: 100, direct_reward: 800, umbrella_reward_rate: 12, enabled: true }, + { level: 4, name: '分公司', require_orders: 300, direct_reward: 800, umbrella_reward_rate: 15, enabled: true } + ] +}; + +// ========== 财务管理 ========== + +export const MOCK_FINANCE_BALANCE_LOG = { + list: [ + { + id: 1, + uid: 10086, + nickname: '王五', + phone: '138****8888', + pm: 1, + type: 'queue_refund', + type_text: '公排退款', + number: '3600.00', + balance: '7200.00', + mark: '公排触发退款,批次24', + add_time: '2026-03-09 12:00:00' + }, + { + id: 2, + uid: 10086, + nickname: '王五', + phone: '138****8888', + pm: 0, + type: 'extract', + type_text: '提现', + number: '1000.00', + balance: '3600.00', + mark: '提现到微信零钱', + add_time: '2026-03-08 15:30:00' + } + ], + count: 45, + page: 1, + limit: 20 +}; + +export const MOCK_FINANCE_WITHDRAW_LIST = { + list: [ + { + id: 1, + uid: 10086, + nickname: '王五', + phone: '138****8888', + extract_price: '1000.00', + fee_price: '70.00', + real_price: '930.00', + status: 1, + status_text: '已通过', + extract_type: 'wx', + extract_type_text: '微信零钱', + add_time: '2026-03-08 15:30:00', + verify_time: '2026-03-08 16:00:00' + }, + { + id: 2, + uid: 10087, + nickname: '张三', + phone: '139****9999', + extract_price: '500.00', + fee_price: '35.00', + real_price: '465.00', + status: 0, + status_text: '待审核', + extract_type: 'alipay', + extract_type_text: '支付宝', + add_time: '2026-03-10 09:15:00', + verify_time: '' + } + ], + count: 28, + page: 1, + limit: 20, + statistics: { + total_apply_today: 12, + total_amount_today: '8500.00' + } +}; diff --git a/pro_v3.5.1/view/admin/vue.config.js b/pro_v3.5.1/view/admin/vue.config.js index 155b6502..c8a00968 100644 --- a/pro_v3.5.1/view/admin/vue.config.js +++ b/pro_v3.5.1/view/admin/vue.config.js @@ -27,7 +27,12 @@ module.exports = { productionSourceMap: false, //关闭生产环境下的SourceMap映射文件 devServer: { publicPath: Setting.publicPath, - + port: 8080, + proxy: { + '/adminapi': { target: 'http://127.0.0.1:20199', changeOrigin: true }, + '/api': { target: 'http://127.0.0.1:20199', changeOrigin: true }, + '/kefuapi': { target: 'http://127.0.0.1:20199', changeOrigin: true }, + }, }, // 打包优化 diff --git a/pro_v3.5.1/view/uniapp/README-RUN.md b/pro_v3.5.1/view/uniapp/README-RUN.md new file mode 100644 index 00000000..0907481f --- /dev/null +++ b/pro_v3.5.1/view/uniapp/README-RUN.md @@ -0,0 +1,50 @@ +# 黄精粉小程序 UniApp 运行说明 + +## 推荐方式:使用 HBuilderX 运行到浏览器(H5) + +本 CRMEB 项目的小程序端按 HBuilderX + uni-app 标准目录设计,**推荐使用 HBuilderX 进行开发与预览**: + +1. 安装 [HBuilderX](https://www.dcloud.io/hbuilderx.html)(正式版或 App 开发版)。 +2. 用 HBuilderX 打开本目录:`pro_v3.5.1/view/uniapp`(即当前 package.json 所在目录)。 +3. 在菜单栏选择 **运行 → 运行到浏览器 → 选择 Chrome(或其他浏览器)**。 +4. 等待编译完成后,会自动打开浏览器,即可查看 Mock 演示效果。 + +在 H5 预览下可看到: +- 首页 / 个人中心右下角的 **演示控制面板**(紫色悬浮按钮) +- 切换场景 A/B/C、快捷跳转、退款弹窗等 Mock 演示功能 + +--- + +## 命令行方式(可选) + +已在 `package.json` 中配置脚本与依赖,满足以下条件时可尝试命令行启动 H5: + +- 需在 **本目录**(`view/uniapp`)下执行。 +- 若使用 Vue CLI 5,可能与当前 uni-app 插件的 webpack 规则不兼容,出现 `No matching use for foo.js` 或 `reading 'use'` 等错误,此时请改用 HBuilderX。 + +### 启动 H5 开发服务 + +```bash +cd pro_v3.5.1/view/uniapp + +# 设置环境变量并启动(Mac/Linux) +UNI_CLI_CONTEXT=$(pwd) UNI_PLATFORM=h5 UNI_INPUT_DIR=$(pwd) npx vue-cli-service uni-serve --platform h5 + +# 或使用 npm 脚本(需已安装 cross-env) +npm run dev:h5 +``` + +默认端口:**8080**(在 `vue.config.js` 的 `devServer.port` 中配置)。 +启动成功后,在浏览器访问:**http://localhost:8080**。 + +### 微信小程序开发 + +使用 HBuilderX 打开本目录后,选择 **运行 → 运行到小程序模拟器 → 微信开发者工具**,并先在本地打开微信开发者工具。 + +--- + +## Mock 演示说明 + +- 所有 HJF 相关接口当前使用 **Mock 数据**(`utils/hjfMockData.js`),无需后端即可演示。 +- 右下角 **演示控制面板** 可切换场景 A(新用户)/ B(活跃用户)/ C(VIP),并支持快捷跳转、退款弹窗、重置引导等。 +- 完整演示路线与验收点见:**docs/mock-demo-walkthrough.md**。 diff --git a/pro_v3.5.1/view/uniapp/api/hjfAssets.js b/pro_v3.5.1/view/uniapp/api/hjfAssets.js new file mode 100644 index 00000000..cb514ada --- /dev/null +++ b/pro_v3.5.1/view/uniapp/api/hjfAssets.js @@ -0,0 +1,78 @@ +/** + * 黄精粉健康商城 - 资产相关 API + * 资产概览、积分明细、现金明细、提现信息及申请提现 + * @module api/hjfAssets + */ + +import request from '@/utils/request.js'; +import { + getMockAssetsOverview, + getMockPointsDetail, + getMockCashDetail, + getMockWithdrawInfo +} from '@/utils/hjfMockData.js'; + +/** @type {boolean} 是否使用 Mock 数据(Phase 1 开发为 true,Phase 4 集成改为 false) */ +const USE_MOCK = true; + +/** + * Mock 包装:返回与 request 相同形状的 Promise(status + data),带延迟模拟网络 + * @param {*} data - 要返回的响应体 + * @param {number} [delay=300] - 延迟毫秒数 + * @returns {Promise<{ status: number, data: * }>} + */ +function mockResponse(data, delay = 300) { + return new Promise(resolve => { + setTimeout(() => { + resolve({ status: 200, data: JSON.parse(JSON.stringify(data)) }); + }, delay); + }); +} + +/** + * 获取资产概览(余额、冻结/可用积分、今日释放、公排总退款等) + * @returns {Promise<{ status: number, data: Object }>} + */ +export function getAssetsOverview() { + if (USE_MOCK) return mockResponse(getMockAssetsOverview()); + return request.get('hjf/assets/overview'); +} + +/** + * 获取积分明细(分页) + * @param {Object} [params] - 查询参数,如 page、limit + * @returns {Promise<{ status: number, data: Object }>} + */ +export function getPointsDetail(params) { + if (USE_MOCK) return mockResponse(getMockPointsDetail()); + return request.get('hjf/assets/points_detail', params); +} + +/** + * 获取现金明细(分页) + * @param {Object} [params] - 查询参数,如 page、limit + * @returns {Promise<{ status: number, data: Object }>} + */ +export function getCashDetail(params) { + if (USE_MOCK) return mockResponse(getMockCashDetail()); + return request.get('hjf/assets/cash_detail', params); +} + +/** + * 获取提现信息(可提现余额、最低金额、手续费率、渠道列表等) + * @returns {Promise<{ status: number, data: Object }>} + */ +export function getWithdrawInfo() { + if (USE_MOCK) return mockResponse(getMockWithdrawInfo()); + return request.get('hjf/assets/withdraw_info'); +} + +/** + * 申请提现(POST) + * @param {Object} data - 提现参数,如 amount、channel、bank_id 等 + * @returns {Promise<{ status: number, data?: Object }>} + */ +export function applyWithdraw(data) { + if (USE_MOCK) return mockResponse({ success: true, msg: '提现申请已提交' }); + return request.post('hjf/assets/withdraw', data); +} diff --git a/pro_v3.5.1/view/uniapp/api/hjfMember.js b/pro_v3.5.1/view/uniapp/api/hjfMember.js new file mode 100644 index 00000000..da9eb4ba --- /dev/null +++ b/pro_v3.5.1/view/uniapp/api/hjfMember.js @@ -0,0 +1,63 @@ +/** + * 黄精粉健康商城 - 会员模块 API + * 会员信息、团队数据、团队收益 + * @module api/hjfMember + */ + +import request from '@/utils/request.js'; +import { + getMockMemberInfo, + getMockTeamData, + getMockTeamIncome +} from '@/utils/hjfMockData.js'; + +/** @type {boolean} Phase 1 前端开发为 true,Phase 4 集成时改为 false */ +const USE_MOCK = true; + +/** + * Mock 包装:返回与 request.get() 相同形状的 Promise + * @param {Object} data - 要返回的响应体数据 + * @param {number} [delay=300] - 模拟网络延迟(毫秒) + * @returns {Promise<{ status: number, data: Object }>} + */ +function mockResponse(data, delay = 300) { + return new Promise(resolve => { + setTimeout(() => { + resolve({ status: 200, data: JSON.parse(JSON.stringify(data)) }); + }, delay); + }); +} + +/** + * 获取会员信息(等级、直推/伞下人数、升级进度等) + * @returns {Promise<{ status: number, data: Object }>} 会员信息 + */ +export function getMemberInfo() { + if (USE_MOCK) return mockResponse(getMockMemberInfo()); + return request.get('hjf/member/info'); +} + +/** + * 获取团队成员列表(直推/伞下成员、分页) + * @param {Object} [params] - 查询参数 + * @param {number} [params.page] - 页码 + * @param {number} [params.limit] - 每页条数 + * @param {string} [params.type] - 筛选类型(如 direct/umbrella) + * @returns {Promise<{ status: number, data: Object }>} 团队数据 + */ +export function getTeamData(params) { + if (USE_MOCK) return mockResponse(getMockTeamData()); + return request.get('hjf/member/team', params); +} + +/** + * 获取团队收益明细(直推奖励、伞下奖励等) + * @param {Object} [params] - 查询参数 + * @param {number} [params.page] - 页码 + * @param {number} [params.limit] - 每页条数 + * @returns {Promise<{ status: number, data: Object }>} 团队收益列表 + */ +export function getTeamIncome(params) { + if (USE_MOCK) return mockResponse(getMockTeamIncome()); + return request.get('hjf/member/income', params); +} diff --git a/pro_v3.5.1/view/uniapp/api/hjfQueue.js b/pro_v3.5.1/view/uniapp/api/hjfQueue.js new file mode 100644 index 00000000..91ea8b38 --- /dev/null +++ b/pro_v3.5.1/view/uniapp/api/hjfQueue.js @@ -0,0 +1,45 @@ +/** + * 黄精粉健康商城 - 公排相关 API + * 公排状态、公排历史记录 + * @see docs/frontend-new-pages-spec.md 2.2.1 + */ + +import request from '@/utils/request.js'; +import { getMockQueueStatus, getMockQueueHistory } from '@/utils/hjfMockData.js'; + +/** @type {boolean} 是否使用 Mock 数据(Phase 4 集成时改为 false) */ +const USE_MOCK = true; + +/** + * Mock 包装:返回与 request.get() 相同形状的 Promise + * 300ms 延迟模拟网络,JSON 深拷贝防止数据突变 + * @param {*} data - 要返回的数据 + * @param {number} [delay=300] - 延迟毫秒数 + * @returns {Promise<{ status: number, data: * }>} + */ +function mockResponse(data, delay = 300) { + return new Promise(resolve => { + setTimeout(() => { + resolve({ status: 200, data: JSON.parse(JSON.stringify(data)) }); + }, delay); + }); +} + +/** + * 获取公排状态(我的排队 + 全局进度) + * @returns {Promise<{ status: number, data: { totalOrders: number, myOrders: Array, progress: Object } }>} + */ +export function getQueueStatus() { + if (USE_MOCK) return mockResponse(getMockQueueStatus()); + return request.get('hjf/queue/status'); +} + +/** + * 获取公排历史记录(分页) + * @param {Object} [params] - 查询参数,如 page、limit + * @returns {Promise<{ status: number, data: { list: Array, count: number, page: number, limit: number } }>} + */ +export function getQueueHistory(params) { + if (USE_MOCK) return mockResponse(getMockQueueHistory()); + return request.get('hjf/queue/history', params); +} diff --git a/pro_v3.5.1/view/uniapp/components/HjfAssetCard.vue b/pro_v3.5.1/view/uniapp/components/HjfAssetCard.vue new file mode 100644 index 00000000..272468cd --- /dev/null +++ b/pro_v3.5.1/view/uniapp/components/HjfAssetCard.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/pro_v3.5.1/view/uniapp/components/HjfDemoPanel.vue b/pro_v3.5.1/view/uniapp/components/HjfDemoPanel.vue new file mode 100644 index 00000000..53d16da6 --- /dev/null +++ b/pro_v3.5.1/view/uniapp/components/HjfDemoPanel.vue @@ -0,0 +1,385 @@ + + + + + diff --git a/pro_v3.5.1/view/uniapp/components/HjfMemberBadge.vue b/pro_v3.5.1/view/uniapp/components/HjfMemberBadge.vue new file mode 100644 index 00000000..e76a543b --- /dev/null +++ b/pro_v3.5.1/view/uniapp/components/HjfMemberBadge.vue @@ -0,0 +1,185 @@ + + + + + diff --git a/pro_v3.5.1/view/uniapp/components/HjfQueueProgress.vue b/pro_v3.5.1/view/uniapp/components/HjfQueueProgress.vue new file mode 100644 index 00000000..75c2d4b6 --- /dev/null +++ b/pro_v3.5.1/view/uniapp/components/HjfQueueProgress.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/pro_v3.5.1/view/uniapp/components/HjfRefundNotice.vue b/pro_v3.5.1/view/uniapp/components/HjfRefundNotice.vue new file mode 100644 index 00000000..e112bd2d --- /dev/null +++ b/pro_v3.5.1/view/uniapp/components/HjfRefundNotice.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/pro_v3.5.1/view/uniapp/components/WaterfallsFlow/WaterfallsFlowItem.vue b/pro_v3.5.1/view/uniapp/components/WaterfallsFlow/WaterfallsFlowItem.vue index 94f0d625..b3cf2bc6 100644 --- a/pro_v3.5.1/view/uniapp/components/WaterfallsFlow/WaterfallsFlowItem.vue +++ b/pro_v3.5.1/view/uniapp/components/WaterfallsFlow/WaterfallsFlowItem.vue @@ -1,12 +1,13 @@