diff --git a/.env.development b/.env.development index 5c2e8c6..99b621f 100644 --- a/.env.development +++ b/.env.development @@ -1,4 +1,4 @@ VITE_APP_NAME=后台管理系统 -#VITE_API_URL=http://127.0.0.1:9200/api -VITE_API_URL=https://shop-api.websoft.top/api +VITE_API_URL=http://127.0.0.1:9200/api +#VITE_API_URL=https://shop-api.websoft.top/api VITE_CMS_API_URL=https://cms-api.websoft.top/api diff --git a/.workbuddy/memory/2026-08-15.md b/.workbuddy/memory/2026-08-15.md new file mode 100644 index 0000000..6f9856b --- /dev/null +++ b/.workbuddy/memory/2026-08-15.md @@ -0,0 +1,23 @@ +# 2026-08-15 工作日志 + +## 专区功能(ShopHomeSection)接口报错修复 + +- 现象:访问专区列表接口报 `NoSuchPropertyException: ShopHomeSectionParam.deleted`。 +- 根因:模板生成的 `ShopHomeSectionParam`(guilixu-java `src/main/java/com/gxwebsoft/shop/param/ShopHomeSectionParam.java`)**漏了 `deleted` 字段**;同项目 Mapper XML(`ShopHomeSectionMapper.xml`)按模板带 ` AND a.deleted = 0` 逻辑删除过滤,OGNL 求值时属性不存在即抛异常。 +- 对比:`ShopGoodsParam` 有 `deleted` 字段(@QueryField EQ + @Schema),为标准写法;`ShopHomeSection` 实体本身有 `@TableLogic private Integer deleted;`,表启用逻辑删除。 +- 修复:给 `ShopHomeSectionParam` 末尾补 `private Integer deleted;`(带 @QueryField + @Schema),与模板一致。 +- 验证:重新编译部署 guilixu-java(端口 9200 本地实例)后接口恢复正常。 +- ⚠️ 同类预警:其他新生成的 Param 若同样漏 `deleted`,会报一模一样的错,补字段即可。 + +## 专区功能菜单未显示(待办) + +- 前端页面 `src/views/special/zone/index.vue` 与 API 层 `src/api/shop/shopZone/` 已完成。 +- 但因 guilixu-admin 为动态路由(菜单由后端接口拉取),后端菜单表尚未插入「专区管理」记录,故左侧导航看不到入口。 +- 待处理:在后端菜单表(sys_menu 类)插入菜单记录(component=special/zone,tenant_id=10606),刷新/重登后生效。 + +## 专区功能交互入口约定(答疑结论) + +- 白名单用户:专区列表每行「白名单」按钮 → 弹窗勾选用户 → 确定(PUT /{id}/users 覆盖式保存到 shop_home_section_user 表)。前端 UserSelectModal 链路完整。 +- 商品关联:专区页「商品」按钮只是**查看**该专区下商品(GET /{id}/goods,后端用 FIND_IN_SET(section_id, section_ids) 查询);**往专区加商品不在此页操作**,要去「商品管理 → 编辑商品 → 所属专区(多选)」勾选专区并保存,写入 goods.section_ids。 +- 后端接口齐全:users/goods 查询与设置、check-permission 权限校验均已实现。 +- ⚠️ 待确认:白名单弹窗当前按 isStaff=true 查后台员工用户(@/api/system/user 的 pageUsers);若受限专区面向小程序买家,需调整用户来源。 diff --git a/.workbuddy/memory/2026-08-16.md b/.workbuddy/memory/2026-08-16.md new file mode 100644 index 0000000..dac7a93 --- /dev/null +++ b/.workbuddy/memory/2026-08-16.md @@ -0,0 +1,30 @@ +# 2026-08-16 工作日志 + +## 专区白名单用户弹窗修复 + +### 1. 去掉 isStaff 限制 +- 文件:`src/views/special/zone/components/UserSelectModal.vue` +- 改动:`pageUsers` 调用移除 `isStaff: true` 参数,使白名单搜索覆盖全部用户(不再只查后台员工)。 + +### 2. 修复勾选框不显示 +- 现象:弹窗表格数据正常但无 checkbox 勾选列,用户无法选择。 +- 根因:`rowSelection` 用 `reactive()` 包整个对象的方式在 `ele-pro-table` 中不生效;且缺少 `columnWidth` 导致勾选列无宽度不渲染。 +- 对比:项目内 `shopCoupon/index.vue` 用 `computed(() => ({ columnWidth, selectedRowKeys, onChange }))` 模式可正常工作;字典页用 `{ columnWidth: 32 }` 最简写法也可。 +- 修复: + - `reactive` → `computed` 返回 rowSelection 对象(与 shopCoupon 一致) + - 补 `columnWidth: 48` + - `selectedRowKeys` 独立为 `ref`,通过 computed 注入 rowSelection + - 所有引用点同步更新(模板计数、confirm、watch 初始化) + +## 专区商品抽屉改造为可编辑 + +- 需求:专区「商品」按钮打开的抽屉从只读列表升级为支持添加/移除商品。 +- 后端(guilixu-java `ShopHomeSectionController.java`)新增两个接口: + - `POST /{id}/goods` — 添加商品到专区(接收 goodsId[],将 section_id 追加到每个 goods 的 section_ids 逗号串中,用 LinkedHashSet 去重) + - `DELETE /{id}/goods` — 从专区移除商品(接收 goodsId[],从 section_ids 中移除该 section_id,空则置 null) +- 前端 API(`src/api/shop/shopZone/index.ts`)新增 `addSectionGoods`、`removeSectionGoods`。 +- 前端 UI(`src/views/special/zone/index.vue`)商品抽屉改造: + - 顶部:搜索框 + 「搜索」按钮 + 「全部添加(N)」确认按钮 + - 搜索结果区:虚线框展示候选商品列表,每行有「+添加」单条操作(自动过滤已在专区内的商品) + - 已关联商品表格:每行加「移除」按钮(二次确认后调用 remove 接口) + - 数据源:搜索商品复用已有 `pageShopGoods` API(@/api/shop/shopGoods) diff --git a/src/api/shop/shopZone/index.ts b/src/api/shop/shopZone/index.ts index 4dd6f32..de14a93 100644 --- a/src/api/shop/shopZone/index.ts +++ b/src/api/shop/shopZone/index.ts @@ -141,6 +141,34 @@ export async function listSectionGoods( return Promise.reject(new Error(res.data.message)); } +/** + * 添加商品到专区 + */ +export async function addSectionGoods(id: number, goodsIds: number[]) { + const res = await request.post>( + MODULES_API_URL + '/shop/shop-home-section/' + id + '/goods', + goodsIds + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 从专区移除商品 + */ +export async function removeSectionGoods(id: number, goodsIds: number[]) { + const res = await request.delete>( + MODULES_API_URL + '/shop/shop-home-section/' + id + '/goods', + { data: goodsIds } + ); + if (res.data.code === 0) { + return res.data.message; + } + return Promise.reject(new Error(res.data.message)); +} + /** * 校验专区访问权限 */ diff --git a/src/views/special/zone/components/UserSelectModal.vue b/src/views/special/zone/components/UserSelectModal.vue index 8d26788..685f71d 100644 --- a/src/views/special/zone/components/UserSelectModal.vue +++ b/src/views/special/zone/components/UserSelectModal.vue @@ -32,13 +32,13 @@
- 已选 {{ rowSelection.selectedRowKeys.length }} 人 + 已选 {{ selectedRowKeys.length }} 人