From e476adf78e747b06490978d7ffe67cd75dfd6193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=96=87=E5=B3=B0?= Date: Fri, 24 Apr 2026 15:23:32 +0800 Subject: [PATCH] =?UTF-8?q?up=20=E4=BF=AE=E6=AD=A3=E5=B7=A5=E5=8D=95?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E9=A2=9C=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .workbuddy/memory/2026-04-24.md | 64 ++++ .workbuddy/memory/MEMORY.md | 324 ++++++++++++++++++ .../src/views/work_order/WorkOrderList.vue | 4 +- 3 files changed, 390 insertions(+), 2 deletions(-) create mode 100644 .workbuddy/memory/2026-04-24.md diff --git a/.workbuddy/memory/2026-04-24.md b/.workbuddy/memory/2026-04-24.md new file mode 100644 index 0000000..d0b072e --- /dev/null +++ b/.workbuddy/memory/2026-04-24.md @@ -0,0 +1,64 @@ +# 2026-04-24 日志 + +## 项目梳理 + +- 完整梳理了 ops2 项目的运行逻辑 +- 涉及:后端 Go + Gin 架构、Web 前端 Vue 3 + Vite、移动端 uni-app 基础框架 + +## 核心模块梳理 + +### 用户认证 (apiUsers.go) +- Cookie 认证机制,密码加盐哈希 +- 各模块独立管理员组(purchase_admin / work_order_admin / schedule_admin / warehouse_admin) +- 默认创建 admin 用户 + +### 文件管理 (apiFiles.go) +- SHA256 哈希去重存储(同一文件只存一份) +- 支持图片/视频/音频/PDF 等类型 +- 头像单独存储 + +### 日程排班 (apiSchedule.go) +- 日程表(软删除)+ 操作日志 +- 日期范围查询 + +### 仓库模块 (apiWarehouse.go) +- 容器(树形,最多5层嵌套)+ 物品管理 +- 支持工单关联、物品移动记录、操作日志 + +### 采购模块 (apiPurchase.go) +- 订单状态:pending → ordered → arrived → received / lost / returned +- 费用明细(多币种)、图片上传、状态记录 +- 可关联工单 + +### 工单模块 (apiWorkOrder.go) +- 工单状态:pending → checked → parts_ordered → repaired → returned / unrepairable +- 可关联仓库物品和采购订单 +- 特殊逻辑:送还时自动移除物品容器绑定 + +## 移动端工程分析 (ops2_uniapp) + +**技术栈**: uni-app + Vue 3 + Pinia + +**已完成**: +- 基础框架搭建 +- Pinia 状态管理(config.js, user.js) +- 自定义 Toast 组件 +- 登录页(85%)+ 设置页(90%) + +**待完成**: +- API 封装层完善(Cookie 认证) +- 4个 TabBar 页面功能实现 +- 后端各模块对接 + +**当前总完成度**: ~35-40% + +## 长效记忆 + +已将项目架构、所有模块(用户/文件/日程/采购/工单/仓库)的数据结构和 API 路由保存至 `MEMORY.md`。 +移动端详细结构也已更新至 MEMORY.md。 + +## 下一步 + +准备开发移动端(ops2_uniapp),需要: +1. 完善 API 封装(Cookie 认证) +2. 实现各功能页面 diff --git a/.workbuddy/memory/MEMORY.md b/.workbuddy/memory/MEMORY.md index e69de29..609d484 100644 --- a/.workbuddy/memory/MEMORY.md +++ b/.workbuddy/memory/MEMORY.md @@ -0,0 +1,324 @@ +# MEMORY.md - 长效记忆 + +## 项目架构 + +**项目名称**: OPS 运营管理系统 +**技术栈**: Vue 3 + TypeScript (前端) / Go + Gin + GORM (后端) + +### 目录结构 +``` +ops2/ +├── backend/my_work/ # Go 后端(端口 8080) +├── frontend/ +│ ├── ops_vue_js/ # Vue 3 Web 前端 +│ └── ops2_uniapp/ # uni-app 移动端(待开发) +└── DOC/ +``` + +## 后端架构 + +### 入口: `backend/my_work/main.go` +- 配置读取: `data/config.yaml`,无则复制 `defConfig/configTemp.yaml` +- 支持 SQLite/MySQL/PostgreSQL +- 按顺序初始化路由:User → Files → Schedule → Purchase → WorkOrder → Warehouse + +### 核心模块 (`backend/my_work/routers/`) +| 文件 | 用途 | +|------|------| +| `apiUsers.go` | 用户认证(登录/注册/Cookie) | +| `apiFiles.go` | 文件上传/管理 | +| `apiSchedule.go` | 日程排班 | +| `apiPurchase.go` | 采购订单 | +| `apiWorkOrder.go` | 工单管理 | +| `apiWarehouse.go` | 仓库管理(容器+物品) | +| `apiStatic.go` | 静态资源 | + +## 用户认证模块 (`apiUsers.go`) + +### 核心函数 +- `AuthenticationAuthorityFromCookie(c string)` - 验证 Cookie 并返回用户 +- `AuthenticationAuthority(ctx)` - 通用认证函数,分离 Cookie 和 data +- `GetUserInfoFromUserID(userID uint)` - 通过 ID 获取用户详情 + +### 用户组 +- 自动创建 `admins` 组和 `admin` 用户(默认密码:adminpassword) +- 各功能模块独立创建管理员组:`purchase_admin`、`work_order_admin`、`schedule_admin`、`warehouse_admin` + +### API 路由 (`/api/users/*`) +| 路由 | 用途 | +|------|------| +| `POST /login` | 用户登录(返回 Cookie) | +| `POST /register` | 用户注册 | +| `POST /getinfo` | 获取当前用户信息 | +| `POST /changePassword` | 修改密码 | +| `POST /changeEmail` | 修改邮箱 | +| `POST /updateAvatar` | 更新头像(FormData 上传) | +| `POST /updateInfo` | 更新用户详情 | +| `GET /getuserinfo/:id` | 获取指定用户信息 | +| `GET/POST /test` | 测试接口 | + +### 密码机制 +- 密码加盐哈希(Salt + Hash) +- 支持 `text` / `md5` / `md5salt` 三种哈希类型(配置指定) + +## 文件管理模块 (`apiFiles.go`) + +### 数据表 +- `TabFileInfo_` - 文件元数据(SHA256 哈希为唯一标识) + +| 字段 | 说明 | +|------|------| +| `Sha256` | 文件哈希(主键/索引) | +| `Name` | 原始文件名 | +| `Path` | 存储路径 | +| `Mime` | MIME 类型 | +| `Type` | 文件类型(image/video/pdf 等) | +| `Const` | 引用计数(同文件多次上传只存一份) | + +### API 路由 (`/api/files/*`) +| 路由 | 用途 | +|------|------| +| `POST /upload/image` | 上传图片(FormData,含 SHA256 去重) | +| `GET /:mode/:hash` | 获取文件(mode=get 下载,mode=download 预览) | + +### 存储结构 +``` +data/ +├── static/avatar/ # 用户头像 +└── upload/ + ├── image/ # 图片(以 SHA256 命名) + ├── video/ + ├── music/ + └── pdf/ +``` + +## 日程排班模块 (`apiSchedule.go`) + +### 数据表 +| 表 | 用途 | +|---|---| +| `TabSchedule` | 日程(软删除) | +| `TabScheduleLog` | 操作日志 | + +### 日程结构 +| 字段 | 说明 | +|------|------| +| `Title` | 日程标题 | +| `StartDate` | 开始日期(YYYY-MM-DD) | +| `EndDate` | 结束日期(YYYY-MM-DD) | +| `BgColor` | 背景颜色(默认 #3788d9) | +| `Remark` | 备注 | + +### API 路由 (`/api/schedule/*`) +| 路由 | 用途 | +|------|------| +| `POST /getevents` | 获取日程列表(按日期范围) | +| `POST /addevent` | 新增日程 | +| `POST `/editevent`` | 编辑日程 | +| `POST /deleevent` | 删除日程(软删除) | + +### 查询逻辑 +```sql +WHERE start_date <= :end AND end_date >= :start +``` + +## 静态资源模块 (`apiStatic.go`) + +| 路由 | 用途 | +|------|------| +| `GET /static/avatar/:filename` | 获取用户头像 | + +### 数据库模型 (`backend/my_work/models/sql.go`) +- `TabUser_` - 用户 +- `TabUserGroups_` - 用户组 +- `TabUserInfo_` - 用户详情 +- `TabCookie_` - 登录 Cookie(有效期 604800 秒) +- `APIRequestLog_` - API 日志 + +### 仓库模块核心表 (`apiWarehouse.go`) +- `TabWarehouseContainer` - 容器(树形,最多5层嵌套) +- `TabWarehouseItem` - 物品 +- `TabWarehouseItemCommit` - 物品移动记录 +- `TabWarehouseLog` - 操作日志 +- `TabWarehouseItemWorkOrderBind` - 物品-工单关联 + +## 采购模块 (`backend/my_work/routers/apiPurchase.go`) + +### 数据表 +| 表 | 用途 | +|---|---| +| `TabPurchaseOrder` | 采购订单(软删除) | +| `TabPurchaseCosts` | 费用明细(单价/运费,支持多币种) | +| `TabPurchaseFileBind` | 图片关联 | +| `TabPurchaseCommit` | 状态变更记录 | +| `TabPurchaseLog` | 操作日志 | + +### 订单状态流程 +``` +pending(待处理) → ordered(已下单) → arrived(已到达) → received(已收件) + ↓ + lost(丢件) / returned(退件) +``` + +### 货币类型 +`1-CNY` / `2-MOP` / `3-HKD` / `4-USD` + +### API 路由 (`/api/purchase/*`) +| 路由 | 用途 | +|------|------| +| `POST /getorder` | 获取订单详情(含费用、图片、状态记录、关联工单) | +| `POST /getorders` | 获取订单列表(支持搜索、分页、状态筛选) | +| `POST /addorder` | 新增订单 | +| `POST /updateorder` | 编辑订单(含费用、图片重建) | +| `POST /deleteorder` | 删除订单 | +| `POST /updatestatus` | 更新订单状态(可附评论/图片) | +| `POST /delete_commit` | 删除状态记录 | +| `POST /getordercount` | 统计各状态数量 | +| `POST /search_work_orders` | 搜索工单(用于关联) | + +## 工单模块 (`backend/my_work/routers/apiWorkOrder.go`) + +### 数据表 +| 表 | 用途 | +|---|---| +| `TabWorkOrder` | 工单(软删除) | +| `TabWorkOrderFileBind` | 工单图片关联 | +| `TabWorkOrderCommit` | 进度记录 | +| `TabWorkOrderLog` | 操作日志 | +| `TabWorkOrderCommitFileBind` | 进度关联图片 | +| `TabWorkOrderPurchaseOrderBind` | 工单-采购订单关联 | + +### 工单状态流程 +``` +pending(待处理) → checked(已检查) → parts_ordered(已下单零件) → repaired(已维修) → returned(已送还) + ↓ + unrepairable(无法维修) +``` + +### 关联关系 +- 工单 ↔ 仓库物品 (`TabWarehouseItemWorkOrderBind`) +- 工单 ↔ 采购订单 (`TabWorkOrderPurchaseOrderBind`) +- 特殊逻辑:状态变更为 `returned` 时,自动移除物品的容器绑定 + +### API 路由 (`/api/work_order/*`) +| 路由 | 用途 | +|------|------| +| `POST /add` | 新增工单(可关联物品) | +| `POST /update` | 编辑工单 | +| `POST /list` | 获取工单列表 | +| `POST /get` | 获取工单详情(含图片、进度、关联物品/采购订单) | +| `POST /commit` | 提交进度(更新状态,可关联采购订单) | +| `POST /delete` | 删除工单 | +| `POST /delete_commit` | 删除进度 | +| `POST /count` | 统计各状态数量 | +| `POST /search_purchase_orders` | 搜索采购订单(用于关联) | + +## 前端架构 + +### Web 前端 (`frontend/ops_vue_js/`) + +**API 封装** (`src/api/index.js`): +- 基础 URL: `/api` +- 请求自动注入 `userCookieValue` +- 响应统一处理:err_code=-44 表示 Cookie 过期,自动登出 +- 返回格式: `{ errCode, data }` + +**路由** (`src/router/index.js`): +- 使用 `createWebHashHistory`(hash 模式) +- 认证页面: `/login`, `/register`, `/forgot_password` +- 需要登录的页面在白名单外 + +**国际化**: `src/i18n/en.json`, `zh-CN.json` + +### 移动端 (`frontend/ops2_uniapp/`) + +**技术栈**: uni-app + Vue 3 + Pinia + HBuilderX + +**项目结构**: +``` +ops2_uniapp/ +├── api/ # API 接口封装 +│ ├── index.js # 基础请求工具(框架已有,方法待实现) +│ ├── request.js # 请求配置(待完善) +│ └── user.js # 用户接口 +├── components/ +│ └── my-toast/ # 自定义 Toast 组件 +├── pages/ # 页面 +│ ├── index/index.vue # 主页 TabBar(占位) +│ ├── order/order.vue # 订单 TabBar(占位) +│ ├── message/message.vue # 消息 TabBar(占位) +│ ├── user/user.vue # 用户 TabBar(基础框架) +│ ├── login/login.vue # 登录页(已完成 85%) +│ └── settings/settings.vue # 设置页(已完成 90%) +├── stores/ +│ ├── config.js # 配置 Store(完整) +│ └── user.js # 用户 Store(基础) +├── utils/ +│ └── index.js # 工具函数(isUrl) +├── pages.json # 路由配置 +├── manifest.json # 应用配置 +└── package.json # 依赖(pinia) +``` + +**Stores 状态管理**: +- `useConfigStore`: apiBaseUrl / appName / version / theme + - `setApiBaseUrl()` / `getApiBaseUrl()` - API 地址持久化 +- `useUserStore`: username / token + - `setUser()` / `logout()` + +**API 封装状态**: +- `api/index.js`: 框架有,get/post/upload 方法空实现 +- 登录页直接使用 `uni.request()` 调用,绕过了封装层 +- 需要完善 Cookie 认证机制(参照 Web 前端) + +**页面完成度**: +| 页面 | 完成度 | 说明 | +|------|--------|------| +| index | 5% | 占位文本 | +| order | 5% | 占位文本 | +| message | 5% | 占位文本 | +| user | 20% | 登录按钮 + 设置入口 | +| login | **85%** | 表单 + 验证 + 请求 + Toast | +| settings | **90%** | API 地址编辑 + 连接测试 | + +**当前总完成度**: ~35-40% + +**移动端待开发**: +1. 完善 API 封装层(Cookie 认证) +2. 实现各功能页面(主页仪表盘、订单列表、消息列表、用户中心) +3. 添加更多组件(Loading、确认对话框、空状态) +4. 对接后端各模块(仓库、工单、采购等) + +## 前后端交互协议 + +### 请求格式 (POST JSON) +```json +{ + "data": { + "userCookieValue": "xxx", + ...业务参数 + } +} +``` + +### 响应格式 +```json +{ + "err_code": 0, + "return": { ... } +} +``` + +### 认证机制 +- 登录成功后服务端返回 Cookie(存储在 `TabCookie_` 表) +- 后续请求通过 `userCookieValue` 字段传递 +- Cookie 过期码: -44 + +## 开发注意事项 + +1. **移动端开发时**: 需要完善 `api/index.js` 的请求封装,参照 Web 前端实现 Cookie 认证 +2. **仓库模块**: 是当前开发重点,支持树形容器、物品管理、工单关联 +3. **同源部署**: 后端直接 serve `./dist` 静态文件,简化部署 + +## 更新记录 +- 2026-04-24: 首次梳理项目运行逻辑,保存长效记忆 diff --git a/frontend/ops_vue_js/src/views/work_order/WorkOrderList.vue b/frontend/ops_vue_js/src/views/work_order/WorkOrderList.vue index 3fc5883..b2a73c3 100644 --- a/frontend/ops_vue_js/src/views/work_order/WorkOrderList.vue +++ b/frontend/ops_vue_js/src/views/work_order/WorkOrderList.vue @@ -37,8 +37,8 @@ const statusOptions = [ const statusColorMap = { pending: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/40 dark:text-yellow-400', - checked: 'bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-400', - parts_ordered: 'bg-purple-100 text-purple-700 dark:bg-purple-900/40 dark:text-purple-400', + checked: 'bg-purple-100 text-purple-700 dark:bg-purple-900/40 dark:text-purple-400', + parts_ordered: 'bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-400', repaired: 'bg-green-100 text-green-700 dark:bg-green-900/40 dark:text-green-400', returned: 'bg-gray-200 text-gray-600 dark:bg-gray-700 dark:text-gray-300', unrepairable: 'bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-400',