up
This commit is contained in:
+106
-14
@@ -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() - 图片管理
|
||||
|
||||
@@ -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/`)
|
||||
|
||||
|
||||
@@ -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:"-"`
|
||||
@@ -193,6 +194,7 @@ func ApiWarehouse(r *gin.RouterGroup) {
|
||||
type FromAdd struct {
|
||||
Title string `json:"title"`
|
||||
Remark string `json:"remark"`
|
||||
Color string `json:"color"`
|
||||
ParentID *uint `json:"parent_id"`
|
||||
Photos []string `json:"photos"`
|
||||
}
|
||||
@@ -236,9 +238,14 @@ 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,
|
||||
}
|
||||
@@ -287,6 +294,7 @@ func ApiWarehouse(r *gin.RouterGroup) {
|
||||
ID uint `json:"id"`
|
||||
Title string `json:"title"`
|
||||
Remark string `json:"remark"`
|
||||
Color string `json:"color"`
|
||||
Photos []string `json:"photos"`
|
||||
}
|
||||
var from FromUpdate
|
||||
@@ -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{})
|
||||
|
||||
Reference in New Issue
Block a user