feat(shop): 新增首页专区管理功能

- 在商品模型中添加所属专区字段 sectionIds,支持逗号分隔字符串
- 商品编辑界面增加所属专区多选下拉框,联动专区数据
- 新增首页专区相关接口,包括分页查询、增删改查及权限校验等
- 实现首页专区列表页面,支持专区的增删改查及状态切换
- 新增专区白名单用户管理弹窗,支持多选用户设置白名单
- 实现专区商品列表抽屉,支持分页查看专区内商品
- 首页专区编辑弹窗支持标题、副标题、banner等多字段编辑及上传功能
- 完善专区管理界面交互和表格展示,支持搜索和状态筛选功能
This commit is contained in:
2026-08-15 03:30:48 +08:00
parent 053b776d9a
commit b5c67988a6
7 changed files with 1076 additions and 0 deletions
@@ -48,6 +48,17 @@
@change="onCategoryIds"
/>
</a-form-item>
<a-form-item label="所属专区" name="sectionIds">
<a-select
v-model:value="sectionIdList"
mode="multiple"
:max-tag-count="3"
:options="zoneOptions"
style="width: 320px"
placeholder="请选择所属专区(可多选)"
allow-clear
/>
</a-form-item>
<a-form-item label="商品编码" name="code">
<a-input
allow-clear
@@ -709,6 +720,7 @@ import {ShopExpressTemplate} from '@/api/shop/shopExpressTemplate/model';
import {listShopExpressTemplate} from '@/api/shop/shopExpressTemplate';
import {listShopCommissionRole} from '@/api/shop/shopCommissionRole';
import {listShopGoodsRoleCommission} from '@/api/shop/shopGoodsRoleCommission';
import {listHomeSections} from '@/api/shop/shopZone';
// 是否是修改
const isUpdate = ref(false);
@@ -859,6 +871,9 @@ const skuList = ref<ShopGoodsSku[]>([]);
const files = ref<ItemType[]>([]);
const goodsSpec = ref<ShopGoodsSpec>();
const category = ref<string[]>([]);
// 所属专区(多选)
const sectionIdList = ref<number[]>([]);
const zoneOptions = ref<{ label: string; value: number }[]>([]);
// 批量设置
const batchPrice = ref<number | undefined>(undefined);
@@ -1803,6 +1818,10 @@ const save = () => {
const formData: any = {
...form,
// 所属专区:数字数组 -> 逗号分隔字符串
sectionIds: sectionIdList.value.length
? sectionIdList.value.join(',')
: '',
content: content.value,
category: JSON.stringify(category.value),
files: JSON.stringify(files.value),
@@ -1966,8 +1985,20 @@ watch(
async (visible) => {
if (visible) {
await getExpressTemplateList();
// 加载所属专区选项
listHomeSections({})
.then((list) => {
zoneOptions.value = (list || []).map((z) => ({
label: z.title || '',
value: z.sectionId as number
}));
})
.catch(() => {
zoneOptions.value = [];
});
images.value = [];
sectionIdList.value = [];
category.value = [];
files.value = [];
videos.value = [];
@@ -1976,6 +2007,13 @@ watch(
ensureTagItem.value = '';
if (props.data) {
assignObject(form, props.data);
// 所属专区:逗号分隔字符串 -> 数字数组
sectionIdList.value = form.sectionIds
? form.sectionIds
.split(',')
.map((s) => Number(s.trim()))
.filter((n) => !Number.isNaN(n))
: [];
if (form.commissionType === undefined || form.commissionType === null) {
form.commissionType = 10;
}