diff --git a/.workbuddy/memory/2026-04-24.md b/.workbuddy/memory/2026-04-24.md index d0b072e..6b41e0c 100644 --- a/.workbuddy/memory/2026-04-24.md +++ b/.workbuddy/memory/2026-04-24.md @@ -35,30 +35,122 @@ - 可关联仓库物品和采购订单 - 特殊逻辑:送还时自动移除物品容器绑定 +## 移动端登录功能开发 + +### 完成的功能 + +1. **api/index.js** - API 封装层 + - uni.request 统一封装 + - 自动注入 userCookieValue + - Cookie 过期自动处理(-44 错误码) + - 支持文件上传 + +2. **stores/user.js** - 用户状态管理 + - userCookie / user / userInfo 状态 + - isLoggedIn / cookieValue / username / avatarUrl 计算属性 + - login(cookie) - 登录保存 + - logout() - 清除状态 + - restoreSession() - 启动时恢复会话 + - fetchUserInfo() - 获取用户信息 + +3. **api/user.js** - 用户 API + - login / register / getUserInfo / changePassword / changeEmail / updateInfo / updateAvatar + +4. **pages/login/login.vue** - 登录页面(已完成 100%) + - 表单验证 + - 调用登录 API + - 记住登录选项 + - 登录成功跳转用户中心 + - 错误提示(密码错误/用户名不存在) + +5. **pages/user/user.vue** - 用户中心(已完成 100%) + - 未登录状态:显示登录入口 + - 已登录状态:显示用户信息卡片 + 功能菜单 + 退出登录 + - 快捷入口:订单/工单/仓库/日程 + - 退出登录确认对话框 + ## 移动端工程分析 (ops2_uniapp) -**技术栈**: uni-app + Vue 3 + Pinia +**技术栈**: uni-app + Vue 3 + Pinia + HBuilderX **已完成**: - 基础框架搭建 - Pinia 状态管理(config.js, user.js) - 自定义 Toast 组件 -- 登录页(85%)+ 设置页(90%) +- 登录页(✅ 100%)+ 设置页(90%) +- 用户中心(✅ 100%) + +**API 封装**: 已完善 Cookie 认证机制 + +**当前总完成度**: ~50% **待完成**: -- API 封装层完善(Cookie 认证) -- 4个 TabBar 页面功能实现 +- 4个 TabBar 页面功能实现(index/order/message/work-order/schedule/warehouse) - 后端各模块对接 -**当前总完成度**: ~35-40% - -## 长效记忆 - -已将项目架构、所有模块(用户/文件/日程/采购/工单/仓库)的数据结构和 API 路由保存至 `MEMORY.md`。 -移动端详细结构也已更新至 MEMORY.md。 - ## 下一步 -准备开发移动端(ops2_uniapp),需要: -1. 完善 API 封装(Cookie 认证) -2. 实现各功能页面 +移动端登录和用户中心已完成,可以: +1. ~~开发主页(index)仪表盘~~ ✅ +2. 开发订单列表(order) +3. 继续完善其他功能页面 + +--- + +## 下午开发记录 + +### 1. TabBar 导航修改 +- 改为:主页 → 订单 → 仓库 → 用户 +- 新增 `pages/warehouse/warehouse.vue` +- 新增 `static/tabbar/warehouse*.png` + +### 2. API 层完善 +- **api/schedule.js** - 日程管理(getEvents/addEvent/editEvent/deleteEvent) +- **api/purchase.js** - 采购订单(getOrders/getOrder/getOrderCount) + +### 3. 主页功能开发 (pages/index/index.vue) +- 欢迎语 + 今日日期显示 +- 今日日程列表(调用 scheduleApi.getEvents) +- 订单统计(待处理/已到达/已收件,调用 purchaseApi.getOrderCount) +- 快捷入口卡片 + +### 4. 主页页面交互 +- 未登录时显示"欢迎使用 OPS 系统" +- 登录后显示"用户名,您好!" +- 日程按颜色标签显示 +- 订单数量有状态提示(待处理>0时橙色高亮) +- 点击统计和快捷入口跳转到对应 TabBar 页面 + +### 5. TabBar 导航再次修改(增加工单) +- 改为:主页 → 订单 → 工单 → 仓库 → 用户 +- 新增 `pages/workorder/workorder.vue` - 工单列表页 + - 顶部统计:待处理/已检查/已下单零件/已维修 + - 状态下拉筛选 + - 工单卡片列表(ID/状态/标题/描述/创建时间) + - 状态颜色标签 + - 分页加载 +- 新增 `api/work_order.js` - 工单 API(list/get/getCount/add/update/delete/commit) +- 新增 `static/tabbar/workorder*.png` - 工单图标(复制订单图标) + +### 6. 仓库页面完善 (pages/warehouse/warehouse.vue) + +**新增功能**: +- 容器卡片长按菜单(编辑/删除) +- 新增容器弹窗完善: + - 父容器选择(可选将容器添加到其他目录) + - 颜色标签选择(8种预设颜色) + - 图片上传(最多3张) + - 备注输入 +- 容器卡片显示颜色边框和图标背景色 +- 删除容器前检查是否有子容器/物品 + +**后端更新** (apiWarehouse.go): +- TabWarehouseContainer 添加 Color 字段 +- add_container / update_container 接口支持 color 参数 + +**前端关键函数**: +- onContainerLongPress() - 长按显示操作菜单 +- showEditModal() / confirmDeleteContainer() - 编辑/删除 +- openParentPicker() / selectParent() - 父容器选择 +- selectColor() - 颜色选择 +- chooseImage() / uploadImage() / removePhoto() - 图片管理 diff --git a/.workbuddy/memory/MEMORY.md b/.workbuddy/memory/MEMORY.md index 609d484..796c11e 100644 --- a/.workbuddy/memory/MEMORY.md +++ b/.workbuddy/memory/MEMORY.md @@ -217,18 +217,68 @@ pending(待处理) → checked(已检查) → parts_ordered(已下单零件) → ### Web 前端 (`frontend/ops_vue_js/`) +**技术栈**: Vue 3 + Vite 7 + Pinia + Vue Router + Vue I18n + +**项目结构**: +``` +src/ +├── api/ # API 封装层 +│ ├── index.js # Axios 实例 + 拦截器 + 统一调用接口 +│ ├── auth.js # 认证 API (登录/注册/用户信息/密码修改) +│ ├── purchase.js # 采购订单 API +│ ├── warehouse.js # 仓库管理 API +│ ├── work_order.js # 工单管理 API +│ ├── schedule.js # 日程管理 API +│ └── users.js # 其他用户信息 API +├── components/ # 公共组件 +├── composables/ # Vue 组合式函数 (Hooks) +├── i18n/ # 国际化 (en.json, zh-CN.json) +├── layouts/ # 页面布局 (AuthLayout, DefaultLayout) +├── router/ # 路由配置 +├── stores/ # Pinia 状态管理 +├── views/ # 页面视图 +└── main.js # 应用入口 +``` + **API 封装** (`src/api/index.js`): -- 基础 URL: `/api` -- 请求自动注入 `userCookieValue` -- 响应统一处理:err_code=-44 表示 Cookie 过期,自动登出 -- 返回格式: `{ errCode, data }` +- 基于 Axios,基础 URL: `/api` +- 请求拦截器自动注入 `userCookieValue` +- 响应拦截器处理 Cookie 过期 (err_code: -44) +- 统一返回 `{ errCode, data, raw }` 格式 +- 支持文件上传 (FormData) **路由** (`src/router/index.js`): - 使用 `createWebHashHistory`(hash 模式) - 认证页面: `/login`, `/register`, `/forgot_password` - 需要登录的页面在白名单外 +**页面视图** (`src/views/`): +| 模块 | 页面 | +|------|------| +| 首页 | `HomeView.vue` | +| 日程 | `ScheduleView.vue` (FullCalendar) | +| 采购 | `PurchaseList.vue`, `addorder.vue`, `ShowOrder.vue`, `editorder.vue` | +| 工单 | `WorkOrderList.vue`, `AddEditWorkOrder.vue`, `ShowWorkOrder.vue` | +| 仓库 | `WarehouseOverview.vue`, `WarehouseContainerList.vue`, `WarehouseContainerDetail.vue`, `WarehouseItemList.vue`, `WarehouseItemDetail.vue`, `WarehouseAddItem.vue`, `WarehouseItemEdit.vue` | +| 设置 | `AccountView.vue`, `ContactView.vue`, `SecurityView.vue` | + +**状态管理** (`src/stores/`): +- `user.js`: 用户状态 (登录/登出/会话恢复/用户信息) +- `toast.js`: 全局 Toast 通知 +- `users.js`: 其他用户信息缓存 + +**样式方案**: +- Tailwind CSS v4 +- Tabler Icons +- 亮色/暗色模式支持 + **国际化**: `src/i18n/en.json`, `zh-CN.json` +- 覆盖模块: week, errorpage, appname, tagadder, dropzone, cropper, purchase, work_order, warehouse, purchase_addorder, schedule, home, message, settings, button, footer, cost_type, order_status + +**构建配置** (`vite.config.js`): +- 输出目录: `../../backend/my_work/dist` +- 开发代理: `/api` → `http://127.0.0.1:8080` +- 路径别名: `@` → `./src` ### 移动端 (`frontend/ops2_uniapp/`) diff --git a/backend/my_work/routers/apiWarehouse.go b/backend/my_work/routers/apiWarehouse.go index 0e1c236..129b2e6 100644 --- a/backend/my_work/routers/apiWarehouse.go +++ b/backend/my_work/routers/apiWarehouse.go @@ -18,6 +18,7 @@ type TabWarehouseContainer struct { ID uint `gorm:"primaryKey" json:"ID"` Title string `gorm:"size:255;not null;comment:容器名" json:"Title"` Remark string `gorm:"type:text;comment:描述" json:"Remark"` + Color string `gorm:"size:20;default:#3788d9;comment:颜色" json:"Color"` CreatedAt *time.Time `gorm:"type:datetime;autoCreateTime" json:"CreatedAt"` UpdatedAt *time.Time `gorm:"type:datetime;autoUpdateTime" json:"UpdatedAt"` DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` @@ -191,9 +192,10 @@ func ApiWarehouse(r *gin.RouterGroup) { } type FromAdd struct { - Title string `json:"title"` - Remark string `json:"remark"` - ParentID *uint `json:"parent_id"` + Title string `json:"title"` + Remark string `json:"remark"` + Color string `json:"color"` + ParentID *uint `json:"parent_id"` Photos []string `json:"photos"` } var from FromAdd @@ -236,11 +238,16 @@ func ApiWarehouse(r *gin.RouterGroup) { } } + color := from.Color + if color == "" { + color = "#3788d9" + } c := TabWarehouseContainer{ Title: from.Title, Remark: from.Remark, + Color: color, CreatorID: user.ID, - ParentID: from.ParentID, + ParentID: from.ParentID, } models.DB.Create(&c) @@ -284,10 +291,11 @@ func ApiWarehouse(r *gin.RouterGroup) { } type FromUpdate struct { - ID uint `json:"id"` - Title string `json:"title"` - Remark string `json:"remark"` - Photos []string `json:"photos"` + ID uint `json:"id"` + Title string `json:"title"` + Remark string `json:"remark"` + Color string `json:"color"` + Photos []string `json:"photos"` } var from FromUpdate if err := decodeJSON(data, &from); err != nil || from.ID == 0 || from.Title == "" { @@ -315,10 +323,14 @@ func ApiWarehouse(r *gin.RouterGroup) { } oldContent, _ := json.Marshal(c) - models.DB.Model(&c).Updates(map[string]interface{}{ + updateData := map[string]interface{}{ "title": from.Title, "remark": from.Remark, - }) + } + if from.Color != "" { + updateData["color"] = from.Color + } + models.DB.Model(&c).Updates(updateData) // 重建图片绑定 models.DB.Where("container_id = ?", from.ID).Delete(&TabWarehouseContainerFileBind{})