From a75daa296705042424faa47aa28ee55069fcbfff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=96=87=E5=B3=B0?= Date: Thu, 23 Apr 2026 20:03:48 +0800 Subject: [PATCH] up --- .workbuddy/memory/2026-04-23.md | 14 +- .../ops_vue_js/src/components/AppHeader.vue | 1 - frontend/ops_vue_js/src/i18n/en.json | 2 + frontend/ops_vue_js/src/i18n/zh-CN.json | 2 + frontend/ops_vue_js/src/router/index.js | 9 +- .../warehouse/WarehouseContainerDetail.vue | 42 +- .../src/views/warehouse/WarehouseOverview.vue | 692 ++++++++++++++++++ 7 files changed, 712 insertions(+), 50 deletions(-) create mode 100644 frontend/ops_vue_js/src/views/warehouse/WarehouseOverview.vue diff --git a/.workbuddy/memory/2026-04-23.md b/.workbuddy/memory/2026-04-23.md index 5217620..5d8f23c 100644 --- a/.workbuddy/memory/2026-04-23.md +++ b/.workbuddy/memory/2026-04-23.md @@ -13,10 +13,13 @@ - 物品 Tab 按钮从弹窗改为跳转独立页面 - 使用 `useDropzone` 组件上传图片 - 物品详情页 (`WarehouseItemDetail.vue`) — 物品信息 + 移动历史/关联工单 Tab -- 物品列表总览 (`WarehouseItemList.vue`) - - 路由: `/warehouse/items`,侧边栏入口「物品总览」 - - 统计卡片(总数/已入库/未入库) - - 表格:名称/序列号/数量/位置/创建时间 + 跳转详情/删除 +- **合并页面 (`WarehouseOverview.vue`)** — 容器+物品合并到一个页面 + - 路由 `/warehouse/container` 直接渲染此页面 + - 顶部 3 格统计卡片(容器数/物品数/未入库) + - Tab 切换「容器」/「物品」 + - 容器 Tab:搜索+表格+分页+新增/编辑弹窗+删除确认 + - 物品 Tab:搜索(400ms防抖)+表格+分页+删除确认 + - 删除了 `/warehouse/item` 独立路由和侧边栏「物品总览」入口 - 补充 i18n key(中/英双语) ### 踩坑 @@ -28,4 +31,5 @@ - 不用 `btn`、`tabs`、`tab`、`input-bordered`、`table`、`modal`、`join`、`form-control`、`badge`、`card` 等 daisyUI 类 - 用 Tailwind 自定义样式:`rounded-xl border border-gray-200 bg-white shadow dark:border-dk-muted dark:bg-dk-card` - 加载动画用自定义 SVG spinner,不用 `loading loading-spinner` - - 弹窗用 `` + Tailwind 固定定位,不用 daisyUI `modal` + - **弹窗用 `` + `v-if` + `@click.self` 关闭,不用 ``**,`` 的 `:open` 属性在某些场景不会正确响应 false +- **批量修改 Vue 模板后务必检查缩进**:逐块替换时外层 div 的闭合标签容易被吞,造成 "Element is missing end tag" 错误 diff --git a/frontend/ops_vue_js/src/components/AppHeader.vue b/frontend/ops_vue_js/src/components/AppHeader.vue index 3fa6af6..aba4b0b 100644 --- a/frontend/ops_vue_js/src/components/AppHeader.vue +++ b/frontend/ops_vue_js/src/components/AppHeader.vue @@ -52,7 +52,6 @@ const navItems = computed(() => [ { label: t("appname.purchase"), to: "/purchase" }, { label: t("appname.work_order"), to: "/work_order" }, { label: t("appname.warehouse"), to: "/warehouse/container" }, - { label: t("appname.warehouse_items"), to: "/warehouse/item" }, ]); diff --git a/frontend/ops_vue_js/src/i18n/en.json b/frontend/ops_vue_js/src/i18n/en.json index db4c89b..2be0f47 100644 --- a/frontend/ops_vue_js/src/i18n/en.json +++ b/frontend/ops_vue_js/src/i18n/en.json @@ -155,6 +155,8 @@ "warehouse": { "container_list": "Container List", "container_detail": "Container Detail", + "overview": "Warehouse Overview", + "containers": "Containers", "item_list": "Item List", "add_container": "Add Container", "edit_container": "Edit Container", diff --git a/frontend/ops_vue_js/src/i18n/zh-CN.json b/frontend/ops_vue_js/src/i18n/zh-CN.json index ec66a29..59322d7 100644 --- a/frontend/ops_vue_js/src/i18n/zh-CN.json +++ b/frontend/ops_vue_js/src/i18n/zh-CN.json @@ -155,6 +155,8 @@ "warehouse": { "container_list": "容器列表", "container_detail": "容器详情", + "overview": "仓库总览", + "containers": "容器", "item_list": "物品列表", "add_container": "新增容器", "edit_container": "编辑容器", diff --git a/frontend/ops_vue_js/src/router/index.js b/frontend/ops_vue_js/src/router/index.js index 0135859..155eb3c 100644 --- a/frontend/ops_vue_js/src/router/index.js +++ b/frontend/ops_vue_js/src/router/index.js @@ -77,7 +77,7 @@ const router = createRouter({ { path: 'warehouse/container', name: 'warehouse', - component: () => import('@/views/warehouse/WarehouseContainerList.vue'), + component: () => import('@/views/warehouse/WarehouseOverview.vue'), }, { path: 'warehouse/container/:id', @@ -89,11 +89,6 @@ const router = createRouter({ name: 'warehouse-add-item', component: () => import('@/views/warehouse/WarehouseAddItem.vue'), }, - { - path: 'warehouse/item', - name: 'warehouse-item-list', - component: () => import('@/views/warehouse/WarehouseItemList.vue'), - }, { path: 'warehouse/item/:id', name: 'warehouse-item-detail', @@ -160,7 +155,7 @@ router.beforeEach((to) => { const userStore = useUserStore() // 不需要登录的页面 - const publicPages = ['/', '/login', '/register', '/forgot_password', '/schedule', '/warehouse/container', '/warehouse/item', '/404'] + const publicPages = ['/', '/login', '/register', '/forgot_password', '/schedule', '/404'] if (publicPages.includes(to.path)) return true // 未登录 → 跳转登录 diff --git a/frontend/ops_vue_js/src/views/warehouse/WarehouseContainerDetail.vue b/frontend/ops_vue_js/src/views/warehouse/WarehouseContainerDetail.vue index f22e934..d88432c 100644 --- a/frontend/ops_vue_js/src/views/warehouse/WarehouseContainerDetail.vue +++ b/frontend/ops_vue_js/src/views/warehouse/WarehouseContainerDetail.vue @@ -1,5 +1,5 @@ @@ -354,30 +344,8 @@ onMounted(async () => { - -
- - -
- -
+
@@ -493,7 +461,7 @@ onMounted(async () => {
-
+
diff --git a/frontend/ops_vue_js/src/views/warehouse/WarehouseOverview.vue b/frontend/ops_vue_js/src/views/warehouse/WarehouseOverview.vue new file mode 100644 index 0000000..4c65a65 --- /dev/null +++ b/frontend/ops_vue_js/src/views/warehouse/WarehouseOverview.vue @@ -0,0 +1,692 @@ + + +