diff --git a/apps/web-antd/src/components/form/components/upload-image.vue b/apps/web-antd/src/components/form/components/upload-image.vue index b99d6fbf..fc4e5b6b 100644 --- a/apps/web-antd/src/components/form/components/upload-image.vue +++ b/apps/web-antd/src/components/form/components/upload-image.vue @@ -1,5 +1,5 @@ - - - 您的处方中有以下药品存在{{ previewTitle }} - - diff --git a/apps/web-antd/src/components/modal/DoctorQrCodePreview.vue b/apps/web-antd/src/components/modal/DoctorQrCodePreview.vue deleted file mode 100644 index bd98047f..00000000 --- a/apps/web-antd/src/components/modal/DoctorQrCodePreview.vue +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - 二维码卡片下载 - - - 二维码下载 - - - - - - - - {{ doctorInfo.doctor.name }} {{ doctorInfo.doctor.title.name }} - - - 诊所地址:{{ previewAddress }} - - - - 擅长领域 - - - {{ doctorInfo.doctor.good_at }} - - - - - - - diff --git a/apps/web-antd/src/components/modal/ProductPreview.vue b/apps/web-antd/src/components/modal/ProductPreview.vue new file mode 100644 index 00000000..fd214f6e --- /dev/null +++ b/apps/web-antd/src/components/modal/ProductPreview.vue @@ -0,0 +1,479 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 新品 + + + {{ currentSlideIndex + 1 }} / + {{ (product.images && product.images.length) || 0 }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ product.title }} + + {{ product.introduction }} + + + + + + ¥{{ product.price }} + ¥{{ product.originalPrice || 0 }} + + 省¥{{ product.discount }} + + + + + + 浏览: {{ product.viewCount || 0 }} + + + + 收藏: {{ product.favoriteCount || 0 }} + + + + 已售: {{ product.soldCount || 0 }} + + + + 退货: {{ product.returnCount || 0 }} + + + + + + + + 配送 + + + 全国大部分地区包邮 + 配送查询 + + 预计2-5天送达 + + + + + 服务 + + + + + + + + + {{ item.name }} + + + + + + + + + + + + diff --git a/apps/web-antd/src/components/modal/QrCodePreview.vue b/apps/web-antd/src/components/modal/QrCodePreview.vue deleted file mode 100644 index 948bdcf4..00000000 --- a/apps/web-antd/src/components/modal/QrCodePreview.vue +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - {{ previewTitle }} - - - 诊所地址:{{ previewAddress }} - - - - - - 二维码卡片下载 - - - 二维码下载 - - - - - diff --git a/apps/web-antd/src/views/code-generation/components/fileds.vue b/apps/web-antd/src/views/code-generation/components/fileds.vue index 2f6f727a..fcf4106b 100644 --- a/apps/web-antd/src/views/code-generation/components/fileds.vue +++ b/apps/web-antd/src/views/code-generation/components/fileds.vue @@ -1,9 +1,11 @@ - {{ tableData }} + + 写入json + [ - 可以为空: + 不能为空: 表单显示: diff --git a/apps/web-antd/src/views/my-gen/store/api/index.ts b/apps/web-antd/src/views/mall/api/index.ts similarity index 97% rename from apps/web-antd/src/views/my-gen/store/api/index.ts rename to apps/web-antd/src/views/mall/api/index.ts index 930c7b0c..97b78f01 100644 --- a/apps/web-antd/src/views/my-gen/store/api/index.ts +++ b/apps/web-antd/src/views/mall/api/index.ts @@ -1,6 +1,6 @@ import { requestClient } from '#/api/request'; -const prefix = 'store/'; +const prefix = 'mall/'; /** * 分页查询店铺管理列表 * @param data diff --git a/apps/web-antd/src/views/my-gen/store/components/modal.vue b/apps/web-antd/src/views/mall/components/modal.vue similarity index 100% rename from apps/web-antd/src/views/my-gen/store/components/modal.vue rename to apps/web-antd/src/views/mall/components/modal.vue diff --git a/apps/web-antd/src/views/my-gen/store/config/form.ts b/apps/web-antd/src/views/mall/config/form.ts similarity index 99% rename from apps/web-antd/src/views/my-gen/store/config/form.ts rename to apps/web-antd/src/views/mall/config/form.ts index 37e484a9..607721fe 100644 --- a/apps/web-antd/src/views/my-gen/store/config/form.ts +++ b/apps/web-antd/src/views/mall/config/form.ts @@ -1,6 +1,6 @@ import type { VbenFormProps } from '#/adapter/form'; -import { getStoreClassificationOptionApi } from '#/views/my-gen/store-classification/api'; +import { getStoreClassificationOptionApi } from '#/views/my-gen/mall-classification/api'; export const modalFormProps: VbenFormProps = { wrapperClass: 'grid-cols-12', // 24栅格, diff --git a/apps/web-antd/src/views/my-gen/store/config/search.ts b/apps/web-antd/src/views/mall/config/search.ts similarity index 100% rename from apps/web-antd/src/views/my-gen/store/config/search.ts rename to apps/web-antd/src/views/mall/config/search.ts diff --git a/apps/web-antd/src/views/my-gen/store/config/table.ts b/apps/web-antd/src/views/mall/config/table.ts similarity index 79% rename from apps/web-antd/src/views/my-gen/store/config/table.ts rename to apps/web-antd/src/views/mall/config/table.ts index f2fa44b4..2f517c96 100644 --- a/apps/web-antd/src/views/my-gen/store/config/table.ts +++ b/apps/web-antd/src/views/mall/config/table.ts @@ -27,17 +27,29 @@ export const gridOptions: VxeGridProps = { // 生成的列表字段 { field: 'name', title: '店铺名称' }, { field: 'level', title: '店铺等级' }, - { field: 'avatar', title: '店铺头像' }, + { field: 'avatar', title: '店铺头像', slots: { default: 'avatar' } }, { field: 'introduction', title: '店铺简介' }, - { field: 'description', title: '详细介绍' }, + // { field: 'description', title: '详细介绍' }, { field: 'phone', title: '商家电话号码' }, { field: 'person', title: '联系人名称' }, { field: 'id_card', title: '身份证号码' }, { field: 'qr_code', title: '店铺二维码' }, { field: 'is_featured', title: '是否为推荐店铺' }, - { field: 'business_license', title: '营业执照' }, - { field: 'id_card_portrait_side', title: '身份证人面' }, - { field: 'id_card_national_emblem_side', title: '身份证国徽面' }, + { + field: 'business_license', + title: '营业执照', + slots: { default: 'business_license' }, + }, + { + field: 'id_card_portrait_side', + title: '身份证人面', + slots: { default: 'id_card_portrait_side' }, + }, + { + field: 'id_card_national_emblem_side', + title: '身份证国徽面', + slots: { default: 'id_card_national_emblem_side' }, + }, { field: 'chain', title: '是否连锁' }, { field: 'business_suspended', title: '是否暂停营业' }, diff --git a/apps/web-antd/src/views/my-gen/store-classification/api/index.ts b/apps/web-antd/src/views/my-gen/mall-classification/api/index.ts similarity index 96% rename from apps/web-antd/src/views/my-gen/store-classification/api/index.ts rename to apps/web-antd/src/views/my-gen/mall-classification/api/index.ts index f28f237a..8b5429aa 100644 --- a/apps/web-antd/src/views/my-gen/store-classification/api/index.ts +++ b/apps/web-antd/src/views/my-gen/mall-classification/api/index.ts @@ -1,6 +1,6 @@ import { requestClient } from '#/api/request'; -const prefix = 'store-classification/'; +const prefix = 'mall-classification/'; /** * 分页查询店铺行业列表 * @param data diff --git a/apps/web-antd/src/views/my-gen/store-classification/components/modal.vue b/apps/web-antd/src/views/my-gen/mall-classification/components/modal.vue similarity index 100% rename from apps/web-antd/src/views/my-gen/store-classification/components/modal.vue rename to apps/web-antd/src/views/my-gen/mall-classification/components/modal.vue diff --git a/apps/web-antd/src/views/my-gen/store-classification/config/form.ts b/apps/web-antd/src/views/my-gen/mall-classification/config/form.ts similarity index 100% rename from apps/web-antd/src/views/my-gen/store-classification/config/form.ts rename to apps/web-antd/src/views/my-gen/mall-classification/config/form.ts diff --git a/apps/web-antd/src/views/my-gen/store-classification/config/search.ts b/apps/web-antd/src/views/my-gen/mall-classification/config/search.ts similarity index 100% rename from apps/web-antd/src/views/my-gen/store-classification/config/search.ts rename to apps/web-antd/src/views/my-gen/mall-classification/config/search.ts diff --git a/apps/web-antd/src/views/my-gen/store-classification/config/table.ts b/apps/web-antd/src/views/my-gen/mall-classification/config/table.ts similarity index 100% rename from apps/web-antd/src/views/my-gen/store-classification/config/table.ts rename to apps/web-antd/src/views/my-gen/mall-classification/config/table.ts diff --git a/apps/web-antd/src/views/my-gen/store-classification/index.vue b/apps/web-antd/src/views/my-gen/mall-classification/index.vue similarity index 100% rename from apps/web-antd/src/views/my-gen/store-classification/index.vue rename to apps/web-antd/src/views/my-gen/mall-classification/index.vue diff --git a/apps/web-antd/src/views/my-gen/mall-membership-level/api/index.ts b/apps/web-antd/src/views/my-gen/mall-membership-level/api/index.ts new file mode 100644 index 00000000..4646bafd --- /dev/null +++ b/apps/web-antd/src/views/my-gen/mall-membership-level/api/index.ts @@ -0,0 +1,49 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'mall-membership-level/'; +/** + * 分页查询店铺会员等级列表 + * @param data + */ +export async function getStoreMembershipLevelListApi(data: any) { + return requestClient.get(`${prefix}list`, { params: data }); +} + +/** + * 获取店铺会员等级下拉列表 + */ +export async function getStoreMembershipLevelOptionApi() { + return requestClient.get(`${prefix}option`); +} + +/** + * 获取店铺会员等级详情 + * @param id + */ +export async function getStoreMembershipLevelInfoApi(id: number) { + return requestClient.get(`${prefix}detail`, { params: { id } }); +} + +/** + * 新增店铺会员等级 + * @param data + */ +export async function createStoreMembershipLevelApi(data: Record) { + return requestClient.post(`${prefix}create`, data); +} + +/** + * 编辑店铺会员等级 + * @param data + */ +export async function updateStoreMembershipLevelApi(data: Record) { + return requestClient.post(`${prefix}update`, data); +} + +/** + * 删除店铺会员等级 + * @param data + */ +export async function deleteStoreMembershipLevelApi(data: Record) { + return requestClient.post(`${prefix}delete`, data); +} diff --git a/apps/web-antd/src/views/my-gen/mall-membership-level/components/modal.vue b/apps/web-antd/src/views/my-gen/mall-membership-level/components/modal.vue new file mode 100644 index 00000000..b50680da --- /dev/null +++ b/apps/web-antd/src/views/my-gen/mall-membership-level/components/modal.vue @@ -0,0 +1,71 @@ + + + + + + diff --git a/apps/web-antd/src/views/my-gen/mall-membership-level/config/form.ts b/apps/web-antd/src/views/my-gen/mall-membership-level/config/form.ts new file mode 100644 index 00000000..8a2f656f --- /dev/null +++ b/apps/web-antd/src/views/my-gen/mall-membership-level/config/form.ts @@ -0,0 +1,40 @@ +import type { VbenFormProps } from '#/adapter/form'; + +export const modalFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', // 24栅格, + commonConfig: { + formItemClass: 'col-span-12', + // 所有表单项 + componentProps: { + class: 'w-full', + }, + }, + // handleSubmit: onSubmit, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + formItemClass: 'col-span-6', + dependencies: { + show: false, + triggerFields: ['id'], + }, + }, + // 生成的表单字段 + { + fieldName: 'name', + label: '等级名称', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'experience', + label: '升级所需经验', + component: 'InputNumber', + rules: 'required', + }, + ], + showDefaultActions: false, +}; diff --git a/apps/web-antd/src/views/my-gen/mall-membership-level/config/search.ts b/apps/web-antd/src/views/my-gen/mall-membership-level/config/search.ts new file mode 100644 index 00000000..a93675a3 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/mall-membership-level/config/search.ts @@ -0,0 +1,25 @@ +import type { VbenFormProps } from '#/adapter/form'; + +// import dayjs from 'dayjs'; + +export const formOptions: VbenFormProps = { + // 默认展开 + collapsed: false, + schema: [ + // 生成的搜索字段 + { + fieldName: 'name', + label: '等级名称', + component: 'VbenInput', + }, + ], + // 控制表单是否显示折叠按钮 + showCollapseButton: true, + submitButtonOptions: { + content: '查询', + }, + // 是否在字段值改变时提交表单 + submitOnChange: true, + // 按下回车时是否提交表单 + submitOnEnter: false, +}; diff --git a/apps/web-antd/src/views/my-gen/mall-membership-level/config/table.ts b/apps/web-antd/src/views/my-gen/mall-membership-level/config/table.ts new file mode 100644 index 00000000..43b6039e --- /dev/null +++ b/apps/web-antd/src/views/my-gen/mall-membership-level/config/table.ts @@ -0,0 +1,69 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { getStoreMembershipLevelListApi } from '../api'; + +interface RowType { + id: string; + name: string; + logo: string; + introduce: string; + created_at: string; +} + +export const gridOptions: VxeGridProps = { + checkboxConfig: { + highlight: true, + labelField: '', + }, + columnConfig: { + useKey: true, + }, + rowConfig: { + useKey: true, + }, + columns: [ + { type: 'checkbox', width: 60 }, + { field: 'id', align: 'left', title: 'ID', width: 100 }, + // 生成的列表字段 + { field: 'name', title: '等级名称' }, + { field: 'experience', title: '升级所需经验' }, + + { field: 'created_at', title: '创建时间' }, + { field: 'updated_at', title: '编辑时间' }, + { type: 'html', title: '操作', slots: { default: 'action' } }, + ], + keepSource: true, + pagerConfig: {}, + proxyConfig: { + ajax: { + // 请求后端接口方法 + query: async ({ page }, formValues) => { + return await getStoreMembershipLevelListApi({ + page: page.currentPage, + pageSize: page.pageSize, + ...formValues, + }); + }, + }, + }, + height: 'auto', + border: false, + toolbarConfig: { + // 是否显示搜索表单控制按钮 + // @ts-ignore 正式环境时有完整的类型声明 + search: true, + refresh: true, // 刷新 + print: false, // 打印 + export: false, // 导出 + // custom: true, // 自定义列 + zoom: true, // 最大化最小化 + slots: { + buttons: 'toolbar-buttons', + }, + custom: { + // 自定义列-图标 + icon: 'vxe-icon-menu', + }, + }, + showOverflow: false, +}; diff --git a/apps/web-antd/src/views/my-gen/mall-membership-level/index.vue b/apps/web-antd/src/views/my-gen/mall-membership-level/index.vue new file mode 100644 index 00000000..ed1ea1f7 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/mall-membership-level/index.vue @@ -0,0 +1,128 @@ + + + + + + + + + + 批量操作 + + + + + + + + + + + + + diff --git a/apps/web-antd/src/views/my-gen/mall/api/index.ts b/apps/web-antd/src/views/my-gen/mall/api/index.ts new file mode 100644 index 00000000..97b78f01 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/mall/api/index.ts @@ -0,0 +1,42 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'mall/'; +/** + * 分页查询店铺管理列表 + * @param data + */ +export async function getStoreListApi(data: any) { + return requestClient.get(`${prefix}list`, { params: data }); +} + +/** + * 获取店铺管理详情 + * @param id + */ +export async function getStoreInfoApi(id: number) { + return requestClient.get(`${prefix}detail`, { params: { id } }); +} + +/** + * 新增店铺管理 + * @param data + */ +export async function createStoreApi(data: Record) { + return requestClient.post(`${prefix}create`, data); +} + +/** + * 编辑店铺管理 + * @param data + */ +export async function updateStoreApi(data: Record) { + return requestClient.post(`${prefix}update`, data); +} + +/** + * 删除店铺管理 + * @param data + */ +export async function deleteStoreApi(data: Record) { + return requestClient.post(`${prefix}delete`, data); +} diff --git a/apps/web-antd/src/views/my-gen/mall/components/modal.vue b/apps/web-antd/src/views/my-gen/mall/components/modal.vue new file mode 100644 index 00000000..a5af86f8 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/mall/components/modal.vue @@ -0,0 +1,66 @@ + + + + + + diff --git a/apps/web-antd/src/views/my-gen/mall/config/form.ts b/apps/web-antd/src/views/my-gen/mall/config/form.ts new file mode 100644 index 00000000..607721fe --- /dev/null +++ b/apps/web-antd/src/views/my-gen/mall/config/form.ts @@ -0,0 +1,179 @@ +import type { VbenFormProps } from '#/adapter/form'; + +import { getStoreClassificationOptionApi } from '#/views/my-gen/mall-classification/api'; + +export const modalFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', // 24栅格, + commonConfig: { + formItemClass: 'col-span-12', + // 所有表单项 + componentProps: { + class: 'w-full', + }, + }, + // handleSubmit: onSubmit, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + formItemClass: 'col-span-6', + dependencies: { + show: false, + triggerFields: ['id'], + }, + }, + // 生成的表单字段 + { + fieldName: 'name', + label: '店铺名称', + component: 'VbenInput', + formItemClass: 'col-span-6', + rules: 'required', + }, + { + fieldName: 'level', + label: '店铺等级', + component: 'InputNumber', + formItemClass: 'col-span-6', + rules: 'required', + }, + { + fieldName: 'introduction', + label: '店铺简介', + component: 'Textarea', + rules: 'required', + }, + { + fieldName: 'description', + label: '详细介绍', + component: 'Textarea', + rules: 'required', + }, + { + fieldName: 'phone', + label: '商家电话号码', + component: 'VbenInput', + formItemClass: 'col-span-6', + rules: 'required', + }, + { + fieldName: 'person', + label: '联系人名称', + component: 'VbenInput', + formItemClass: 'col-span-6', + rules: 'required', + }, + { + fieldName: 'id_card', + label: '身份证号码', + component: 'VbenInput', + formItemClass: 'col-span-6', + rules: 'required', + }, + { + fieldName: 'classification_id', + label: '行业', + component: 'ApiTreeSelect', + componentProps: { + childrenField: 'children', + labelField: 'name', + valueField: 'id', + api: getStoreClassificationOptionApi, + }, + formItemClass: 'col-span-6', + defaultValue: 0, + rules: 'required', + }, + { + fieldName: 'is_featured', + label: '推荐店铺', + component: 'RadioGroup', + componentProps: { + options: [ + { + label: '是', + value: 1, + }, + { + label: '否', + value: 0, + }, + ], + }, + formItemClass: 'col-span-6', + defaultValue: 0, + rules: 'required', + }, + { + fieldName: 'chain', + label: '连锁', + component: 'RadioGroup', + componentProps: { + options: [ + { + label: '是', + value: 1, + }, + { + label: '否', + value: 0, + }, + ], + }, + formItemClass: 'col-span-6', + defaultValue: 0, + rules: 'required', + }, + { + fieldName: 'business_suspended', + label: '暂停营业', + component: 'RadioGroup', + componentProps: { + options: [ + { + label: '是', + value: 1, + }, + { + label: '否', + value: 0, + }, + ], + }, + formItemClass: 'col-span-6', + defaultValue: 0, + rules: 'required', + }, + { + fieldName: 'avatar', + label: '店铺头像', + component: 'Avatar', + formItemClass: 'col-span-6', + rules: 'required', + }, + { + fieldName: 'business_license', + label: '营业执照', + component: 'Avatar', + formItemClass: 'col-span-6', + rules: 'required', + }, + { + fieldName: 'id_card_portrait_side', + label: '身份证人面', + component: 'Avatar', + formItemClass: 'col-span-6', + rules: 'required', + }, + { + fieldName: 'id_card_national_emblem_side', + label: '身份证国徽面', + component: 'Avatar', + formItemClass: 'col-span-6', + rules: 'required', + }, + ], + showDefaultActions: false, +}; diff --git a/apps/web-antd/src/views/my-gen/mall/config/search.ts b/apps/web-antd/src/views/my-gen/mall/config/search.ts new file mode 100644 index 00000000..2eff5f36 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/mall/config/search.ts @@ -0,0 +1,55 @@ +import type { VbenFormProps } from '#/adapter/form'; + +// import dayjs from 'dayjs'; + +export const formOptions: VbenFormProps = { + // 默认展开 + collapsed: false, + schema: [ + // 生成的搜索字段 + { + fieldName: 'name', + label: '店铺名称', + component: 'VbenInput', + }, + { + fieldName: 'level', + label: '店铺等级', + component: 'InputNumber', + }, + { + fieldName: 'phone', + label: '商家电话号码', + component: 'VbenInput', + }, + { + fieldName: 'person', + label: '联系人名称', + component: 'VbenInput', + }, + { + fieldName: 'is_featured', + label: '是否为推荐店铺', + component: 'VbenSelect', + }, + { + fieldName: 'chain', + label: '是否连锁', + component: 'VbenSelect', + }, + { + fieldName: 'business_suspended', + label: '是否暂停营业', + component: 'VbenSelect', + }, + ], + // 控制表单是否显示折叠按钮 + showCollapseButton: true, + submitButtonOptions: { + content: '查询', + }, + // 是否在字段值改变时提交表单 + submitOnChange: true, + // 按下回车时是否提交表单 + submitOnEnter: false, +}; diff --git a/apps/web-antd/src/views/my-gen/mall/config/table.ts b/apps/web-antd/src/views/my-gen/mall/config/table.ts new file mode 100644 index 00000000..2f517c96 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/mall/config/table.ts @@ -0,0 +1,94 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { getStoreListApi } from '../api'; + +interface RowType { + id: string; + name: string; + logo: string; + introduce: string; + created_at: string; +} + +export const gridOptions: VxeGridProps = { + checkboxConfig: { + highlight: true, + labelField: '', + }, + columnConfig: { + useKey: true, + }, + rowConfig: { + useKey: true, + }, + columns: [ + { type: 'checkbox', width: 60 }, + { field: 'id', align: 'left', title: 'ID', width: 100 }, + // 生成的列表字段 + { field: 'name', title: '店铺名称' }, + { field: 'level', title: '店铺等级' }, + { field: 'avatar', title: '店铺头像', slots: { default: 'avatar' } }, + { field: 'introduction', title: '店铺简介' }, + // { field: 'description', title: '详细介绍' }, + { field: 'phone', title: '商家电话号码' }, + { field: 'person', title: '联系人名称' }, + { field: 'id_card', title: '身份证号码' }, + { field: 'qr_code', title: '店铺二维码' }, + { field: 'is_featured', title: '是否为推荐店铺' }, + { + field: 'business_license', + title: '营业执照', + slots: { default: 'business_license' }, + }, + { + field: 'id_card_portrait_side', + title: '身份证人面', + slots: { default: 'id_card_portrait_side' }, + }, + { + field: 'id_card_national_emblem_side', + title: '身份证国徽面', + slots: { default: 'id_card_national_emblem_side' }, + }, + { field: 'chain', title: '是否连锁' }, + { field: 'business_suspended', title: '是否暂停营业' }, + + { field: 'created_at', title: '创建时间' }, + { field: 'updated_at', title: '编辑时间' }, + { type: 'html', title: '操作', slots: { default: 'action' } }, + ], + keepSource: true, + pagerConfig: {}, + proxyConfig: { + ajax: { + // 请求后端接口方法 + query: async ({ page }, formValues) => { + return await getStoreListApi({ + page: page.currentPage, + pageSize: page.pageSize, + ...formValues, + }); + }, + }, + }, + height: 'auto', + border: false, + toolbarConfig: { + // 是否显示搜索表单控制按钮 + // @ts-ignore 正式环境时有完整的类型声明 + search: true, + refresh: true, // 刷新 + print: false, // 打印 + export: false, // 导出 + // custom: true, // 自定义列 + zoom: true, // 最大化最小化 + slots: { + buttons: 'toolbar-buttons', + }, + custom: { + // 自定义列-图标 + icon: 'vxe-icon-menu', + }, + }, + showOverflow: false, +}; diff --git a/apps/web-antd/src/views/my-gen/mall/index.vue b/apps/web-antd/src/views/my-gen/mall/index.vue new file mode 100644 index 00000000..907810aa --- /dev/null +++ b/apps/web-antd/src/views/my-gen/mall/index.vue @@ -0,0 +1,137 @@ + + + + + + + + + + 批量操作 + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web-antd/src/views/my-gen/order-detail/api/index.ts b/apps/web-antd/src/views/my-gen/order-detail/api/index.ts new file mode 100644 index 00000000..e62a5392 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/order-detail/api/index.ts @@ -0,0 +1,49 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'order-detail/'; +/** + * 分页查询订单详情列表 + * @param data + */ +export async function getOrderDetailListApi(data: any) { + return requestClient.get(`${prefix}list`, { params: data }); +} + +/** + * 获取订单详情下拉列表 + */ +export async function getOrderDetailOptionApi() { + return requestClient.get(`${prefix}option`); +} + +/** + * 获取订单详情详情 + * @param id + */ +export async function getOrderDetailInfoApi(id: number) { + return requestClient.get(`${prefix}detail`, { params: { id } }); +} + +/** + * 新增订单详情 + * @param data + */ +export async function createOrderDetailApi(data: Record) { + return requestClient.post(`${prefix}create`, data); +} + +/** + * 编辑订单详情 + * @param data + */ +export async function updateOrderDetailApi(data: Record) { + return requestClient.post(`${prefix}update`, data); +} + +/** + * 删除订单详情 + * @param data + */ +export async function deleteOrderDetailApi(data: Record) { + return requestClient.post(`${prefix}delete`, data); +} diff --git a/apps/web-antd/src/views/my-gen/order-detail/components/modal.vue b/apps/web-antd/src/views/my-gen/order-detail/components/modal.vue new file mode 100644 index 00000000..e466bd91 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/order-detail/components/modal.vue @@ -0,0 +1,68 @@ + + + + + + diff --git a/apps/web-antd/src/views/my-gen/order-detail/config/form.ts b/apps/web-antd/src/views/my-gen/order-detail/config/form.ts new file mode 100644 index 00000000..9f54ec44 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/order-detail/config/form.ts @@ -0,0 +1,58 @@ +import type { VbenFormProps } from '#/adapter/form'; + +export const modalFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', // 24栅格, + commonConfig: { + formItemClass: 'col-span-12', + // 所有表单项 + componentProps: { + class: 'w-full', + }, + }, + // handleSubmit: onSubmit, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + formItemClass: 'col-span-6', + dependencies: { + show: false, + triggerFields: ['id'], + }, + }, + // 生成的表单字段 + { + fieldName: 'order_id', + label: '订单ID', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'product_id', + label: '商品ID', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'quantity', + label: '商品数量', + component: 'VbenInputNumber', + rules: 'required', + }, + { + fieldName: 'subtotal', + label: '小计金额', + component: 'VbenInputNumber', + rules: '', + }, + { + fieldName: 'snapshot', + label: '商品快照', + component: 'VbenInput', + rules: '', + }, + ], + showDefaultActions: false, +}; diff --git a/apps/web-antd/src/views/my-gen/order-detail/config/search.ts b/apps/web-antd/src/views/my-gen/order-detail/config/search.ts new file mode 100644 index 00000000..ead200da --- /dev/null +++ b/apps/web-antd/src/views/my-gen/order-detail/config/search.ts @@ -0,0 +1,30 @@ +import type { VbenFormProps } from '#/adapter/form'; + +// import dayjs from 'dayjs'; + +export const formOptions: VbenFormProps = { + // 默认展开 + collapsed: false, + schema: [ + // 生成的搜索字段 + { + fieldName: 'order_id', + label: '订单ID', + component: 'VbenInput', + }, + { + fieldName: 'product_id', + label: '商品ID', + component: 'VbenInput', + }, + ], + // 控制表单是否显示折叠按钮 + showCollapseButton: true, + submitButtonOptions: { + content: '查询', + }, + // 是否在字段值改变时提交表单 + submitOnChange: true, + // 按下回车时是否提交表单 + submitOnEnter: false, +}; diff --git a/apps/web-antd/src/views/my-gen/order-detail/config/table.ts b/apps/web-antd/src/views/my-gen/order-detail/config/table.ts new file mode 100644 index 00000000..9a91b222 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/order-detail/config/table.ts @@ -0,0 +1,73 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { getOrderDetailListApi } from '../api'; + +interface RowType { + id: string; + name: string; + logo: string; + introduce: string; + created_at: string; +} + +export const gridOptions: VxeGridProps = { + checkboxConfig: { + highlight: true, + labelField: '', + }, + columnConfig: { + useKey: true, + }, + rowConfig: { + useKey: true, + }, + columns: [ + { type: 'checkbox', width: 60 }, + { field: 'id', align: 'left', title: 'ID', width: 100 }, + // 生成的列表字段 + { field: 'order_id', title: '订单ID' }, + { field: 'product_id', title: '商品ID' }, + { field: 'quantity', title: '商品数量' }, + { field: 'price', title: '商品单价' }, + { field: 'subtotal', title: '小计金额' }, + { field: 'snapshot', title: '商品快照' }, + + { field: 'created_at', title: '创建时间' }, + { field: 'updated_at', title: '编辑时间' }, + { type: 'html', title: '操作', slots: { default: 'action' } }, + ], + keepSource: true, + pagerConfig: {}, + proxyConfig: { + ajax: { + // 请求后端接口方法 + query: async ({ page }, formValues) => { + return await getOrderDetailListApi({ + page: page.currentPage, + pageSize: page.pageSize, + ...formValues, + }); + }, + }, + }, + height: 'auto', + border: false, + toolbarConfig: { + // 是否显示搜索表单控制按钮 + // @ts-ignore 正式环境时有完整的类型声明 + search: true, + refresh: true, // 刷新 + print: false, // 打印 + export: false, // 导出 + // custom: true, // 自定义列 + zoom: true, // 最大化最小化 + slots: { + buttons: 'toolbar-buttons', + }, + custom: { + // 自定义列-图标 + icon: 'vxe-icon-menu', + }, + }, + showOverflow: false, +}; diff --git a/apps/web-antd/src/views/my-gen/order-detail/index.vue b/apps/web-antd/src/views/my-gen/order-detail/index.vue new file mode 100644 index 00000000..5914866f --- /dev/null +++ b/apps/web-antd/src/views/my-gen/order-detail/index.vue @@ -0,0 +1,128 @@ + + + + + + + + + + 批量操作 + + + + + + + + + + + + + diff --git a/apps/web-antd/src/views/my-gen/order/api/index.ts b/apps/web-antd/src/views/my-gen/order/api/index.ts new file mode 100644 index 00000000..11f6ae01 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/order/api/index.ts @@ -0,0 +1,49 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'order/'; +/** + * 分页查询订单管理列表 + * @param data + */ +export async function getOrderListApi(data: any) { + return requestClient.get(`${prefix}list`, { params: data }); +} + +/** + * 获取订单管理下拉列表 + */ +export async function getOrderOptionApi() { + return requestClient.get(`${prefix}option`); +} + +/** + * 获取订单管理详情 + * @param id + */ +export async function getOrderInfoApi(id: number) { + return requestClient.get(`${prefix}detail`, { params: { id } }); +} + +/** + * 新增订单管理 + * @param data + */ +export async function createOrderApi(data: Record) { + return requestClient.post(`${prefix}create`, data); +} + +/** + * 编辑订单管理 + * @param data + */ +export async function updateOrderApi(data: Record) { + return requestClient.post(`${prefix}update`, data); +} + +/** + * 删除订单管理 + * @param data + */ +export async function deleteOrderApi(data: Record) { + return requestClient.post(`${prefix}delete`, data); +} diff --git a/apps/web-antd/src/views/my-gen/order/components/modal.vue b/apps/web-antd/src/views/my-gen/order/components/modal.vue new file mode 100644 index 00000000..dfa0a9fa --- /dev/null +++ b/apps/web-antd/src/views/my-gen/order/components/modal.vue @@ -0,0 +1,66 @@ + + + + + + diff --git a/apps/web-antd/src/views/my-gen/order/config/form.ts b/apps/web-antd/src/views/my-gen/order/config/form.ts new file mode 100644 index 00000000..e09632b0 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/order/config/form.ts @@ -0,0 +1,52 @@ +import type { VbenFormProps } from '#/adapter/form'; + +export const modalFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', // 24栅格, + commonConfig: { + formItemClass: 'col-span-12', + // 所有表单项 + componentProps: { + class: 'w-full', + }, + }, + // handleSubmit: onSubmit, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + formItemClass: 'col-span-6', + dependencies: { + show: false, + triggerFields: ['id'], + }, + }, + // 生成的表单字段 + { + fieldName: 'user_id', + label: '用户ID', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'order_no', + label: '订单编号', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'order_status', + label: '订单状态', + component: 'VbenSelect', + rules: 'required', + }, + { + fieldName: 'total_amount', + label: '订单总金额', + component: 'VbenInputNumber', + rules: 'required', + }, + ], + showDefaultActions: false, +}; diff --git a/apps/web-antd/src/views/my-gen/order/config/search.ts b/apps/web-antd/src/views/my-gen/order/config/search.ts new file mode 100644 index 00000000..2179a175 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/order/config/search.ts @@ -0,0 +1,35 @@ +import type { VbenFormProps } from '#/adapter/form'; + +// import dayjs from 'dayjs'; + +export const formOptions: VbenFormProps = { + // 默认展开 + collapsed: false, + schema: [ + // 生成的搜索字段 + { + fieldName: 'user_id', + label: '用户ID', + component: 'VbenInput', + }, + { + fieldName: 'order_no', + label: '订单编号', + component: 'VbenInput', + }, + { + fieldName: 'order_status', + label: '订单状态', + component: 'VbenSelect', + }, + ], + // 控制表单是否显示折叠按钮 + showCollapseButton: true, + submitButtonOptions: { + content: '查询', + }, + // 是否在字段值改变时提交表单 + submitOnChange: true, + // 按下回车时是否提交表单 + submitOnEnter: false, +}; diff --git a/apps/web-antd/src/views/my-gen/order/config/table.ts b/apps/web-antd/src/views/my-gen/order/config/table.ts new file mode 100644 index 00000000..c3ebd3d1 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/order/config/table.ts @@ -0,0 +1,71 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { getOrderListApi } from '../api'; + +interface RowType { + id: string; + name: string; + logo: string; + introduce: string; + created_at: string; +} + +export const gridOptions: VxeGridProps = { + checkboxConfig: { + highlight: true, + labelField: '', + }, + columnConfig: { + useKey: true, + }, + rowConfig: { + useKey: true, + }, + columns: [ + { type: 'checkbox', width: 60 }, + { field: 'id', align: 'left', title: 'ID', width: 100 }, + // 生成的列表字段 + { field: 'user_id', title: '用户ID' }, + { field: 'order_no', title: '订单编号' }, + { field: 'order_status', title: '订单状态' }, + { field: 'total_amount', title: '订单总金额' }, + + { field: 'created_at', title: '创建时间' }, + { field: 'updated_at', title: '编辑时间' }, + { type: 'html', title: '操作', slots: { default: 'action' } }, + ], + keepSource: true, + pagerConfig: {}, + proxyConfig: { + ajax: { + // 请求后端接口方法 + query: async ({ page }, formValues) => { + return await getOrderListApi({ + page: page.currentPage, + pageSize: page.pageSize, + ...formValues, + }); + }, + }, + }, + height: 'auto', + border: false, + toolbarConfig: { + // 是否显示搜索表单控制按钮 + // @ts-ignore 正式环境时有完整的类型声明 + search: true, + refresh: true, // 刷新 + print: false, // 打印 + export: false, // 导出 + // custom: true, // 自定义列 + zoom: true, // 最大化最小化 + slots: { + buttons: 'toolbar-buttons', + }, + custom: { + // 自定义列-图标 + icon: 'vxe-icon-menu', + }, + }, + showOverflow: false, +}; diff --git a/apps/web-antd/src/views/my-gen/store/index.vue b/apps/web-antd/src/views/my-gen/order/index.vue similarity index 96% rename from apps/web-antd/src/views/my-gen/store/index.vue rename to apps/web-antd/src/views/my-gen/order/index.vue index eabfbaab..1a83b1a2 100644 --- a/apps/web-antd/src/views/my-gen/store/index.vue +++ b/apps/web-antd/src/views/my-gen/order/index.vue @@ -10,7 +10,7 @@ import { Button, Image, message } from 'ant-design-vue'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { TableAction } from '#/components/table-action'; -import { deleteStoreApi } from './api'; +import { deleteOrderApi } from './api'; import FormModalDemo from './components/modal.vue'; import { formOptions } from './config/search'; import { gridOptions } from './config/table'; @@ -55,7 +55,7 @@ const hasDelete = (row: any) => { } else { ids = gridApi.grid.getCheckboxRecords().map((item) => item.id); } - deleteStoreApi({ ids }).then(() => { + deleteOrderApi({ ids }).then(() => { message.success('删除成功!'); gridApi.reload(); }); @@ -63,7 +63,7 @@ const hasDelete = (row: any) => { - + diff --git a/apps/web-antd/src/views/my-gen/product-label-relations/api/index.ts b/apps/web-antd/src/views/my-gen/product-label-relations/api/index.ts new file mode 100644 index 00000000..869c73d0 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/product-label-relations/api/index.ts @@ -0,0 +1,55 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'product-label-relations/'; +/** + * 分页查询商品标签关联列表 + * @param data + */ +export async function getProduct_label_relationsListApi(data: any) { + return requestClient.get(`${prefix}list`, { params: data }); +} + +/** + * 获取商品标签关联下拉列表 + */ +export async function getProduct_label_relationsOptionApi() { + return requestClient.get(`${prefix}option`); +} + +/** + * 获取商品标签关联详情 + * @param id + */ +export async function getProduct_label_relationsInfoApi(id: number) { + return requestClient.get(`${prefix}detail`, { params: { id } }); +} + +/** + * 新增商品标签关联 + * @param data + */ +export async function createProduct_label_relationsApi( + data: Record, +) { + return requestClient.post(`${prefix}create`, data); +} + +/** + * 编辑商品标签关联 + * @param data + */ +export async function updateProduct_label_relationsApi( + data: Record, +) { + return requestClient.post(`${prefix}update`, data); +} + +/** + * 删除商品标签关联 + * @param data + */ +export async function deleteProduct_label_relationsApi( + data: Record, +) { + return requestClient.post(`${prefix}delete`, data); +} diff --git a/apps/web-antd/src/views/my-gen/product-label-relations/components/modal.vue b/apps/web-antd/src/views/my-gen/product-label-relations/components/modal.vue new file mode 100644 index 00000000..ce75d475 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/product-label-relations/components/modal.vue @@ -0,0 +1,71 @@ + + + + + + diff --git a/apps/web-antd/src/views/my-gen/product-label-relations/config/form.ts b/apps/web-antd/src/views/my-gen/product-label-relations/config/form.ts new file mode 100644 index 00000000..cf39f464 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/product-label-relations/config/form.ts @@ -0,0 +1,40 @@ +import type { VbenFormProps } from '#/adapter/form'; + +export const modalFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', // 24栅格, + commonConfig: { + formItemClass: 'col-span-12', + // 所有表单项 + componentProps: { + class: 'w-full', + }, + }, + // handleSubmit: onSubmit, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + formItemClass: 'col-span-6', + dependencies: { + show: false, + triggerFields: ['id'], + }, + }, + // 生成的表单字段 + { + fieldName: 'product_id', + label: '商品', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'label_id', + label: '标签', + component: 'VbenInput', + rules: 'required', + }, + ], + showDefaultActions: false, +}; diff --git a/apps/web-antd/src/views/my-gen/product-label-relations/config/search.ts b/apps/web-antd/src/views/my-gen/product-label-relations/config/search.ts new file mode 100644 index 00000000..3ff8dbc4 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/product-label-relations/config/search.ts @@ -0,0 +1,30 @@ +import type { VbenFormProps } from '#/adapter/form'; + +// import dayjs from 'dayjs'; + +export const formOptions: VbenFormProps = { + // 默认展开 + collapsed: false, + schema: [ + // 生成的搜索字段 + { + fieldName: 'product_id', + label: '商品', + component: 'VbenInput', + }, + { + fieldName: 'label_id', + label: '标签', + component: 'VbenInput', + }, + ], + // 控制表单是否显示折叠按钮 + showCollapseButton: true, + submitButtonOptions: { + content: '查询', + }, + // 是否在字段值改变时提交表单 + submitOnChange: true, + // 按下回车时是否提交表单 + submitOnEnter: false, +}; diff --git a/apps/web-antd/src/views/my-gen/product-label-relations/config/table.ts b/apps/web-antd/src/views/my-gen/product-label-relations/config/table.ts new file mode 100644 index 00000000..e7c31aea --- /dev/null +++ b/apps/web-antd/src/views/my-gen/product-label-relations/config/table.ts @@ -0,0 +1,69 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { getProduct_label_relationsListApi } from '../api'; + +interface RowType { + id: string; + name: string; + logo: string; + introduce: string; + created_at: string; +} + +export const gridOptions: VxeGridProps = { + checkboxConfig: { + highlight: true, + labelField: '', + }, + columnConfig: { + useKey: true, + }, + rowConfig: { + useKey: true, + }, + columns: [ + { type: 'checkbox', width: 60 }, + { field: 'id', align: 'left', title: 'ID', width: 100 }, + // 生成的列表字段 + { field: 'product_id', title: '商品' }, + { field: 'label_id', title: '标签' }, + + { field: 'created_at', title: '创建时间' }, + { field: 'updated_at', title: '编辑时间' }, + { type: 'html', title: '操作', slots: { default: 'action' } }, + ], + keepSource: true, + pagerConfig: {}, + proxyConfig: { + ajax: { + // 请求后端接口方法 + query: async ({ page }, formValues) => { + return await getProduct_label_relationsListApi({ + page: page.currentPage, + pageSize: page.pageSize, + ...formValues, + }); + }, + }, + }, + height: 'auto', + border: false, + toolbarConfig: { + // 是否显示搜索表单控制按钮 + // @ts-ignore 正式环境时有完整的类型声明 + search: true, + refresh: true, // 刷新 + print: false, // 打印 + export: false, // 导出 + // custom: true, // 自定义列 + zoom: true, // 最大化最小化 + slots: { + buttons: 'toolbar-buttons', + }, + custom: { + // 自定义列-图标 + icon: 'vxe-icon-menu', + }, + }, + showOverflow: false, +}; diff --git a/apps/web-antd/src/views/my-gen/product-label-relations/index.vue b/apps/web-antd/src/views/my-gen/product-label-relations/index.vue new file mode 100644 index 00000000..8805fb5b --- /dev/null +++ b/apps/web-antd/src/views/my-gen/product-label-relations/index.vue @@ -0,0 +1,128 @@ + + + + + + + + + + 批量操作 + + + + + + + + + + + + + diff --git a/apps/web-antd/src/views/my-gen/product-label/api/index.ts b/apps/web-antd/src/views/my-gen/product-label/api/index.ts index 985fda00..20a18b4d 100644 --- a/apps/web-antd/src/views/my-gen/product-label/api/index.ts +++ b/apps/web-antd/src/views/my-gen/product-label/api/index.ts @@ -9,6 +9,14 @@ export async function getProductLabelListApi(data: any) { return requestClient.get(`${prefix}list`, { params: data }); } +/** + * 获取商品标签详情 + * @param id + */ +export async function getProductLabelOptionApi(id: number) { + return requestClient.get(`${prefix}option`, { params: { id } }); +} + /** * 获取商品标签详情 * @param id diff --git a/apps/web-antd/src/views/my-gen/product/api/index.ts b/apps/web-antd/src/views/my-gen/product/api/index.ts index f8df2540..9f4a7b95 100644 --- a/apps/web-antd/src/views/my-gen/product/api/index.ts +++ b/apps/web-antd/src/views/my-gen/product/api/index.ts @@ -9,6 +9,13 @@ export async function getProductListApi(data: any) { return requestClient.get(`${prefix}list`, { params: data }); } +/** + * 获取产品详情 + */ +export async function getProductOptionApi() { + return requestClient.get(`${prefix}option`); +} + /** * 获取产品详情 * @param id diff --git a/apps/web-antd/src/views/my-gen/product/components/modal.vue b/apps/web-antd/src/views/my-gen/product/components/modal.vue index 0ee1c3da..5fcf8d45 100644 --- a/apps/web-antd/src/views/my-gen/product/components/modal.vue +++ b/apps/web-antd/src/views/my-gen/product/components/modal.vue @@ -13,7 +13,6 @@ import { modalFormProps } from '../config/form'; defineOptions({ name: 'ProductDemo', }); - const isUpdate = ref(false); const gridApi = ref(); diff --git a/apps/web-antd/src/views/my-gen/product/config/form.ts b/apps/web-antd/src/views/my-gen/product/config/form.ts index 8aa1ba32..a37f5011 100644 --- a/apps/web-antd/src/views/my-gen/product/config/form.ts +++ b/apps/web-antd/src/views/my-gen/product/config/form.ts @@ -1,6 +1,7 @@ import type { VbenFormProps } from '#/adapter/form'; import { getProductClassificationTreeOptionApi } from '#/views/my-gen/product-classification/api'; +import { getProductLabelOptionApi } from '#/views/my-gen/product-label/api'; export const modalFormProps: VbenFormProps = { wrapperClass: 'grid-cols-12', // 24栅格, @@ -25,16 +26,16 @@ export const modalFormProps: VbenFormProps = { }, }, // 生成的表单字段 - { - fieldName: 'title', - label: '商品名称', - component: 'VbenInput', - rules: 'required', - }, { fieldName: 'cover', label: '封面图', component: 'Avatar', + rules: 'required', + }, + { + fieldName: 'title', + label: '商品名称', + component: 'VbenInput', formItemClass: 'col-span-6', rules: 'required', }, @@ -66,6 +67,28 @@ export const modalFormProps: VbenFormProps = { }, rules: 'required', }, + { + fieldName: 'labels', + label: '产品标签', + component: 'ApiSelect', + componentProps: { + api: getProductLabelOptionApi, + filterOption: (input: string, option: any) => { + // 自定义过滤逻辑,确保可以根据 name 进行搜索 + return option?.label.toLowerCase().indexOf(input.toLowerCase()) >= 0; + }, + showSearch: true, + // 菜单接口转options格式 + afterFetch: (data: { id: number; name: string }[]) => { + return data.map((item: any) => ({ + label: item.name, + value: item.id, + })); + }, + mode: 'multiple', + }, + rules: 'required', + }, { fieldName: 'images', label: '产品图片', diff --git a/apps/web-antd/src/views/my-gen/product/config/table.ts b/apps/web-antd/src/views/my-gen/product/config/table.ts index dec13000..0c2f929a 100644 --- a/apps/web-antd/src/views/my-gen/product/config/table.ts +++ b/apps/web-antd/src/views/my-gen/product/config/table.ts @@ -23,21 +23,40 @@ export const gridOptions: VxeGridProps = { }, columns: [ { type: 'checkbox', width: 60 }, - { field: 'id', align: 'left', title: 'ID', width: 100 }, + { field: 'id', align: 'left', title: 'ID', width: 50 }, // 生成的列表字段 - { field: 'title', title: '商品名称' }, - { field: 'mall_id', title: '商家ID' }, - { field: 'user_id', title: '上传用户ID' }, - { field: 'introduction', title: '简介' }, - { field: 'cover', title: '封面图', slots: { default: 'cover' } }, + { + field: 'title', + title: '商品名称', + slots: { default: 'title' }, + width: 200, + }, + { field: 'mall', title: '商家', slots: { default: 'mall' }, width: 250 }, + { + field: 'user', + title: '上传用户', + slots: { default: 'user' }, + width: 150, + }, + // { field: 'introduction', title: '简介' }, { field: 'images', title: '商品图册', slots: { default: 'images' } }, - { field: 'description', title: '详细说明' }, - { field: 'price', title: '价格' }, - { field: 'classification_id', title: '产品分类' }, + // { field: 'description', title: '详细说明' }, + // { field: 'price', title: '默认价格' }, + { + field: 'classification', + title: '产品分类', + slots: { default: 'classification' }, + }, + { field: 'label', title: '产品分类', slots: { default: 'label' } }, { field: 'created_at', title: '创建时间' }, { field: 'updated_at', title: '编辑时间' }, - { type: 'html', title: '操作', slots: { default: 'action' } }, + { + type: 'html', + title: '操作', + slots: { default: 'action' }, + width: 150, + }, ], keepSource: true, pagerConfig: {}, diff --git a/apps/web-antd/src/views/my-gen/product/index.vue b/apps/web-antd/src/views/my-gen/product/index.vue index 7d5eccf0..0cac8f04 100644 --- a/apps/web-antd/src/views/my-gen/product/index.vue +++ b/apps/web-antd/src/views/my-gen/product/index.vue @@ -5,10 +5,12 @@ import { ref } from 'vue'; import { Page, useVbenModal } from '@vben/common-ui'; -import { Button, Image, ImagePreviewGroup, message } from 'ant-design-vue'; +import { Button, Image, ImagePreviewGroup, message, Tag } from 'ant-design-vue'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; +import ProductDetail from '#/components/modal/ProductPreview.vue'; import { TableAction } from '#/components/table-action'; +import ProductSkuDemo from '#/views/my-gen/sku/components/product-modal.vue'; import { deleteProductApi } from './api'; import FormModalDemo from './components/modal.vue'; @@ -38,6 +40,14 @@ const [FormModal, formModalApi] = useVbenModal({ connectedComponent: FormModalDemo, }); +const [ProductSkuDemoModal, ProductSkuDemoModalApi] = useVbenModal({ + connectedComponent: ProductSkuDemo, +}); + +const [ProductDetailModal, ProductDetailModalApi] = useVbenModal({ + connectedComponent: ProductDetail, +}); + const showModal = (data = {}, isUpdate = false) => { formModalApi.setData({ // 表单值 @@ -48,6 +58,16 @@ const showModal = (data = {}, isUpdate = false) => { formModalApi.open(); }; +const showSkuModal = (data = {}, isUpdate = false) => { + ProductSkuDemoModalApi.setData({ + // 表单值 + values: data, + update: isUpdate, + gridApi, + }); + ProductSkuDemoModalApi.open(); +}; + const hasDelete = (row: any) => { let ids = []; if (row) { @@ -60,11 +80,21 @@ const hasDelete = (row: any) => { gridApi.reload(); }); }; + +const showProductDetailModal = (row: any) => { + ProductDetailModalApi.setData({ + // 表单值 + values: row, + }); + ProductDetailModalApi.open(); +}; + + { - - + + + + + + {{ row.title }} + + + 价格:¥{{ row.price }} + + + + + + + + + + {{ row.mall.name }} + + + ID: {{ row.mall.id }} + + + + + + + + + + + + {{ row.user.nick_name }} + + + ID: {{ row.user.id }} + + + + + + {{ row.classification.name }} + + + + {{ item }} + @@ -129,6 +226,14 @@ const hasDelete = (row: any) => { // auth: ['admin', 'sys:role:detail'], onClick: showModal.bind(null, row, true), }, + { + label: '新增sku', + type: 'link', + icon: 'uil:edit', + size: 'small', + // auth: ['admin', 'sys:role:detail'], + onClick: showSkuModal.bind(null, row, false), + }, { label: '删除', type: 'link', diff --git a/apps/web-antd/src/views/my-gen/sku/api/index.ts b/apps/web-antd/src/views/my-gen/sku/api/index.ts new file mode 100644 index 00000000..f36c5d43 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/sku/api/index.ts @@ -0,0 +1,49 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'sku/'; +/** + * 分页查询sku管理列表 + * @param data + */ +export async function getSkuListApi(data: any) { + return requestClient.get(`${prefix}list`, { params: data }); +} + +/** + * 获取sku管理下拉列表 + */ +export async function getSkuOptionApi() { + return requestClient.get(`${prefix}option`); +} + +/** + * 获取sku管理详情 + * @param id + */ +export async function getSkuInfoApi(id: number) { + return requestClient.get(`${prefix}detail`, { params: { id } }); +} + +/** + * 新增sku管理 + * @param data + */ +export async function createSkuApi(data: Record) { + return requestClient.post(`${prefix}create`, data); +} + +/** + * 编辑sku管理 + * @param data + */ +export async function updateSkuApi(data: Record) { + return requestClient.post(`${prefix}update`, data); +} + +/** + * 删除sku管理 + * @param data + */ +export async function deleteSkuApi(data: Record) { + return requestClient.post(`${prefix}delete`, data); +} diff --git a/apps/web-antd/src/views/my-gen/sku/components/modal.vue b/apps/web-antd/src/views/my-gen/sku/components/modal.vue new file mode 100644 index 00000000..5b37698f --- /dev/null +++ b/apps/web-antd/src/views/my-gen/sku/components/modal.vue @@ -0,0 +1,66 @@ + + + + + + diff --git a/apps/web-antd/src/views/my-gen/sku/components/product-modal.vue b/apps/web-antd/src/views/my-gen/sku/components/product-modal.vue new file mode 100644 index 00000000..07eabc69 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/sku/components/product-modal.vue @@ -0,0 +1,68 @@ + + + + + + diff --git a/apps/web-antd/src/views/my-gen/sku/config/form.ts b/apps/web-antd/src/views/my-gen/sku/config/form.ts new file mode 100644 index 00000000..4babab3a --- /dev/null +++ b/apps/web-antd/src/views/my-gen/sku/config/form.ts @@ -0,0 +1,148 @@ +import type { VbenFormProps } from '#/adapter/form'; + +import { getProductOptionApi } from '#/views/my-gen/product/api'; + +export const modalFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', // 24栅格, + commonConfig: { + formItemClass: 'col-span-12', + // 所有表单项 + componentProps: { + class: 'w-full', + }, + }, + // handleSubmit: onSubmit, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + formItemClass: 'col-span-6', + dependencies: { + show: false, + triggerFields: ['id'], + }, + }, + // 生成的表单字段 + { + fieldName: 'product_id', + label: '商品ID', + component: 'ApiSelect', + componentProps: { + api: getProductOptionApi, + filterOption: (input: string, option: any) => { + // 自定义过滤逻辑,确保可以根据 name 进行搜索 + return option?.label.toLowerCase().indexOf(input.toLowerCase()) >= 0; + }, + showSearch: true, + // 菜单接口转options格式 + afterFetch: (data: { id: number; title: string }[]) => { + return data.map((item: any) => ({ + label: item.title, + value: item.id, + })); + }, + }, + rules: 'required', + }, + { + fieldName: 'name', + label: 'sku名称', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'cover', + label: 'sku图片', + component: 'Avatar', + rules: 'required', + }, + { + fieldName: 'inventory', + label: '商品库存', + component: 'InputNumber', + rules: 'required', + }, + { + fieldName: 'price', + label: '商品单价', + component: 'InputNumber', + rules: 'required', + }, + ], + showDefaultActions: false, +}; + +export const productModalFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', // 24栅格, + commonConfig: { + formItemClass: 'col-span-12', + // 所有表单项 + componentProps: { + class: 'w-full', + }, + }, + // handleSubmit: onSubmit, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + formItemClass: 'col-span-6', + dependencies: { + show: false, + triggerFields: ['id'], + }, + }, + // 生成的表单字段 + { + fieldName: 'product_id', + label: '商品ID', + component: 'ApiSelect', + componentProps: { + api: getProductOptionApi, + filterOption: (input: string, option: any) => { + // 自定义过滤逻辑,确保可以根据 name 进行搜索 + return option?.label.toLowerCase().indexOf(input.toLowerCase()) >= 0; + }, + showSearch: true, + // 菜单接口转options格式 + afterFetch: (data: { id: number; title: string }[]) => { + return data.map((item: any) => ({ + label: item.title, + value: item.id, + })); + }, + }, + disabled: true, + rules: 'required', + }, + { + fieldName: 'name', + label: 'sku名称', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'cover', + label: 'sku图片', + component: 'Avatar', + rules: 'required', + }, + { + fieldName: 'inventory', + label: '商品库存', + component: 'InputNumber', + rules: 'required', + }, + { + fieldName: 'price', + label: '商品单价', + component: 'InputNumber', + rules: 'required', + }, + ], + showDefaultActions: false, +}; diff --git a/apps/web-antd/src/views/my-gen/sku/config/search.ts b/apps/web-antd/src/views/my-gen/sku/config/search.ts new file mode 100644 index 00000000..4c58c7fb --- /dev/null +++ b/apps/web-antd/src/views/my-gen/sku/config/search.ts @@ -0,0 +1,25 @@ +import type { VbenFormProps } from '#/adapter/form'; + +// import dayjs from 'dayjs'; + +export const formOptions: VbenFormProps = { + // 默认展开 + collapsed: false, + schema: [ + // 生成的搜索字段 + { + fieldName: 'product_id', + label: '商品ID', + component: 'VbenInput', + }, + ], + // 控制表单是否显示折叠按钮 + showCollapseButton: true, + submitButtonOptions: { + content: '查询', + }, + // 是否在字段值改变时提交表单 + submitOnChange: true, + // 按下回车时是否提交表单 + submitOnEnter: false, +}; diff --git a/apps/web-antd/src/views/my-gen/sku/config/table.ts b/apps/web-antd/src/views/my-gen/sku/config/table.ts new file mode 100644 index 00000000..9011b734 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/sku/config/table.ts @@ -0,0 +1,72 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { getSkuListApi } from '../api'; + +interface RowType { + id: string; + name: string; + logo: string; + introduce: string; + created_at: string; +} + +export const gridOptions: VxeGridProps = { + checkboxConfig: { + highlight: true, + labelField: '', + }, + columnConfig: { + useKey: true, + }, + rowConfig: { + useKey: true, + }, + columns: [ + { type: 'checkbox', width: 60 }, + { field: 'id', align: 'left', title: 'ID', width: 100 }, + // 生成的列表字段 + { field: 'product.title', title: '商品' }, + { field: 'name', title: 'sku名称' }, + { field: 'cover', title: 'sku图片', slots: { default: 'cover' } }, + { field: 'inventory', title: '商品库存' }, + { field: 'price', title: '商品单价' }, + + { field: 'created_at', title: '创建时间' }, + { field: 'updated_at', title: '编辑时间' }, + { type: 'html', title: '操作', slots: { default: 'action' } }, + ], + keepSource: true, + pagerConfig: {}, + proxyConfig: { + ajax: { + // 请求后端接口方法 + query: async ({ page }, formValues) => { + return await getSkuListApi({ + page: page.currentPage, + pageSize: page.pageSize, + ...formValues, + }); + }, + }, + }, + height: 'auto', + border: false, + toolbarConfig: { + // 是否显示搜索表单控制按钮 + // @ts-ignore 正式环境时有完整的类型声明 + search: true, + refresh: true, // 刷新 + print: false, // 打印 + export: false, // 导出 + // custom: true, // 自定义列 + zoom: true, // 最大化最小化 + slots: { + buttons: 'toolbar-buttons', + }, + custom: { + // 自定义列-图标 + icon: 'vxe-icon-menu', + }, + }, + showOverflow: false, +}; diff --git a/apps/web-antd/src/views/my-gen/sku/index.vue b/apps/web-antd/src/views/my-gen/sku/index.vue new file mode 100644 index 00000000..52ca102a --- /dev/null +++ b/apps/web-antd/src/views/my-gen/sku/index.vue @@ -0,0 +1,128 @@ + + + + + + + + + + 批量操作 + + + + + + + + + + + + + diff --git a/apps/web-antd/src/views/my-gen/user-browsing-history/api/index.ts b/apps/web-antd/src/views/my-gen/user-browsing-history/api/index.ts new file mode 100644 index 00000000..062ad9b5 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-browsing-history/api/index.ts @@ -0,0 +1,49 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'user-browsing-history/'; +/** + * 分页查询用户浏览记录列表 + * @param data + */ +export async function getUserBrowsingHistoryListApi(data: any) { + return requestClient.get(`${prefix}list`, { params: data }); +} + +/** + * 获取用户浏览记录下拉列表 + */ +export async function getUserBrowsingHistoryOptionApi() { + return requestClient.get(`${prefix}option`); +} + +/** + * 获取用户浏览记录详情 + * @param id + */ +export async function getUserBrowsingHistoryInfoApi(id: number) { + return requestClient.get(`${prefix}detail`, { params: { id } }); +} + +/** + * 新增用户浏览记录 + * @param data + */ +export async function createUserBrowsingHistoryApi(data: Record) { + return requestClient.post(`${prefix}create`, data); +} + +/** + * 编辑用户浏览记录 + * @param data + */ +export async function updateUserBrowsingHistoryApi(data: Record) { + return requestClient.post(`${prefix}update`, data); +} + +/** + * 删除用户浏览记录 + * @param data + */ +export async function deleteUserBrowsingHistoryApi(data: Record) { + return requestClient.post(`${prefix}delete`, data); +} diff --git a/apps/web-antd/src/views/my-gen/user-browsing-history/components/modal.vue b/apps/web-antd/src/views/my-gen/user-browsing-history/components/modal.vue new file mode 100644 index 00000000..e8fa683d --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-browsing-history/components/modal.vue @@ -0,0 +1,71 @@ + + + + + + diff --git a/apps/web-antd/src/views/my-gen/user-browsing-history/config/form.ts b/apps/web-antd/src/views/my-gen/user-browsing-history/config/form.ts new file mode 100644 index 00000000..f1ad9720 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-browsing-history/config/form.ts @@ -0,0 +1,40 @@ +import type { VbenFormProps } from '#/adapter/form'; + +export const modalFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', // 24栅格, + commonConfig: { + formItemClass: 'col-span-12', + // 所有表单项 + componentProps: { + class: 'w-full', + }, + }, + // handleSubmit: onSubmit, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + formItemClass: 'col-span-6', + dependencies: { + show: false, + triggerFields: ['id'], + }, + }, + // 生成的表单字段 + { + fieldName: 'user_id', + label: '用户', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'product_id', + label: '商品id', + component: 'VbenInput', + rules: 'required', + }, + ], + showDefaultActions: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user-browsing-history/config/search.ts b/apps/web-antd/src/views/my-gen/user-browsing-history/config/search.ts new file mode 100644 index 00000000..75c93d37 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-browsing-history/config/search.ts @@ -0,0 +1,30 @@ +import type { VbenFormProps } from '#/adapter/form'; + +// import dayjs from 'dayjs'; + +export const formOptions: VbenFormProps = { + // 默认展开 + collapsed: false, + schema: [ + // 生成的搜索字段 + { + fieldName: 'user_id', + label: '用户', + component: 'VbenInput', + }, + { + fieldName: 'product_id', + label: '商品id', + component: 'VbenInput', + }, + ], + // 控制表单是否显示折叠按钮 + showCollapseButton: true, + submitButtonOptions: { + content: '查询', + }, + // 是否在字段值改变时提交表单 + submitOnChange: true, + // 按下回车时是否提交表单 + submitOnEnter: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user-browsing-history/config/table.ts b/apps/web-antd/src/views/my-gen/user-browsing-history/config/table.ts new file mode 100644 index 00000000..bf34a9b4 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-browsing-history/config/table.ts @@ -0,0 +1,69 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { getUserBrowsingHistoryListApi } from '../api'; + +interface RowType { + id: string; + name: string; + logo: string; + introduce: string; + created_at: string; +} + +export const gridOptions: VxeGridProps = { + checkboxConfig: { + highlight: true, + labelField: '', + }, + columnConfig: { + useKey: true, + }, + rowConfig: { + useKey: true, + }, + columns: [ + { type: 'checkbox', width: 60 }, + { field: 'id', align: 'left', title: 'ID', width: 100 }, + // 生成的列表字段 + { field: 'user', title: '用户', slots: { default: 'user' } }, + { field: 'product', title: '商品', slots: { default: 'product' } }, + + { field: 'created_at', title: '创建时间' }, + { field: 'updated_at', title: '编辑时间' }, + { type: 'html', title: '操作', slots: { default: 'action' } }, + ], + keepSource: true, + pagerConfig: {}, + proxyConfig: { + ajax: { + // 请求后端接口方法 + query: async ({ page }, formValues) => { + return await getUserBrowsingHistoryListApi({ + page: page.currentPage, + pageSize: page.pageSize, + ...formValues, + }); + }, + }, + }, + height: 'auto', + border: false, + toolbarConfig: { + // 是否显示搜索表单控制按钮 + // @ts-ignore 正式环境时有完整的类型声明 + search: true, + refresh: true, // 刷新 + print: false, // 打印 + export: false, // 导出 + // custom: true, // 自定义列 + zoom: true, // 最大化最小化 + slots: { + buttons: 'toolbar-buttons', + }, + custom: { + // 自定义列-图标 + icon: 'vxe-icon-menu', + }, + }, + showOverflow: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user-browsing-history/index.vue b/apps/web-antd/src/views/my-gen/user-browsing-history/index.vue new file mode 100644 index 00000000..dd6a4874 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-browsing-history/index.vue @@ -0,0 +1,168 @@ + + + + + + + + + + 批量操作 + + + + + + + + + + + {{ row.user.nick_name }} + + + ID: {{ row.user.id }} + + + + + + + + + + + + {{ row.product.title }} + + + ID: {{ row.product.id }} + + + + + + + + + + + diff --git a/apps/web-antd/src/views/my-gen/user-collect/api/index.ts b/apps/web-antd/src/views/my-gen/user-collect/api/index.ts new file mode 100644 index 00000000..f2fa5049 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-collect/api/index.ts @@ -0,0 +1,49 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'user-collect/'; +/** + * 分页查询用户收藏列表 + * @param data + */ +export async function getUserCollectListApi(data: any) { + return requestClient.get(`${prefix}list`, { params: data }); +} + +/** + * 获取用户收藏下拉列表 + */ +export async function getUserCollectOptionApi() { + return requestClient.get(`${prefix}option`); +} + +/** + * 获取用户收藏详情 + * @param id + */ +export async function getUserCollectInfoApi(id: number) { + return requestClient.get(`${prefix}detail`, { params: { id } }); +} + +/** + * 新增用户收藏 + * @param data + */ +export async function createUserCollectApi(data: Record) { + return requestClient.post(`${prefix}create`, data); +} + +/** + * 编辑用户收藏 + * @param data + */ +export async function updateUserCollectApi(data: Record) { + return requestClient.post(`${prefix}update`, data); +} + +/** + * 删除用户收藏 + * @param data + */ +export async function deleteUserCollectApi(data: Record) { + return requestClient.post(`${prefix}delete`, data); +} diff --git a/apps/web-antd/src/views/my-gen/user-collect/components/modal.vue b/apps/web-antd/src/views/my-gen/user-collect/components/modal.vue new file mode 100644 index 00000000..e09f5c95 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-collect/components/modal.vue @@ -0,0 +1,68 @@ + + + + + + diff --git a/apps/web-antd/src/views/my-gen/user-collect/config/form.ts b/apps/web-antd/src/views/my-gen/user-collect/config/form.ts new file mode 100644 index 00000000..f1ad9720 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-collect/config/form.ts @@ -0,0 +1,40 @@ +import type { VbenFormProps } from '#/adapter/form'; + +export const modalFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', // 24栅格, + commonConfig: { + formItemClass: 'col-span-12', + // 所有表单项 + componentProps: { + class: 'w-full', + }, + }, + // handleSubmit: onSubmit, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + formItemClass: 'col-span-6', + dependencies: { + show: false, + triggerFields: ['id'], + }, + }, + // 生成的表单字段 + { + fieldName: 'user_id', + label: '用户', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'product_id', + label: '商品id', + component: 'VbenInput', + rules: 'required', + }, + ], + showDefaultActions: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user-collect/config/search.ts b/apps/web-antd/src/views/my-gen/user-collect/config/search.ts new file mode 100644 index 00000000..75c93d37 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-collect/config/search.ts @@ -0,0 +1,30 @@ +import type { VbenFormProps } from '#/adapter/form'; + +// import dayjs from 'dayjs'; + +export const formOptions: VbenFormProps = { + // 默认展开 + collapsed: false, + schema: [ + // 生成的搜索字段 + { + fieldName: 'user_id', + label: '用户', + component: 'VbenInput', + }, + { + fieldName: 'product_id', + label: '商品id', + component: 'VbenInput', + }, + ], + // 控制表单是否显示折叠按钮 + showCollapseButton: true, + submitButtonOptions: { + content: '查询', + }, + // 是否在字段值改变时提交表单 + submitOnChange: true, + // 按下回车时是否提交表单 + submitOnEnter: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user-collect/config/table.ts b/apps/web-antd/src/views/my-gen/user-collect/config/table.ts new file mode 100644 index 00000000..e12be36f --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-collect/config/table.ts @@ -0,0 +1,69 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { getUserCollectListApi } from '../api'; + +interface RowType { + id: string; + name: string; + logo: string; + introduce: string; + created_at: string; +} + +export const gridOptions: VxeGridProps = { + checkboxConfig: { + highlight: true, + labelField: '', + }, + columnConfig: { + useKey: true, + }, + rowConfig: { + useKey: true, + }, + columns: [ + { type: 'checkbox', width: 60 }, + { field: 'id', align: 'left', title: 'ID', width: 100 }, + // 生成的列表字段 + { field: 'user', title: '用户', slots: { default: 'user' } }, + { field: 'product', title: '商品', slots: { default: 'product' } }, + + { field: 'created_at', title: '创建时间' }, + { field: 'updated_at', title: '编辑时间' }, + { type: 'html', title: '操作', slots: { default: 'action' } }, + ], + keepSource: true, + pagerConfig: {}, + proxyConfig: { + ajax: { + // 请求后端接口方法 + query: async ({ page }, formValues) => { + return await getUserCollectListApi({ + page: page.currentPage, + pageSize: page.pageSize, + ...formValues, + }); + }, + }, + }, + height: 'auto', + border: false, + toolbarConfig: { + // 是否显示搜索表单控制按钮 + // @ts-ignore 正式环境时有完整的类型声明 + search: true, + refresh: true, // 刷新 + print: false, // 打印 + export: false, // 导出 + // custom: true, // 自定义列 + zoom: true, // 最大化最小化 + slots: { + buttons: 'toolbar-buttons', + }, + custom: { + // 自定义列-图标 + icon: 'vxe-icon-menu', + }, + }, + showOverflow: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user-collect/index.vue b/apps/web-antd/src/views/my-gen/user-collect/index.vue new file mode 100644 index 00000000..975e4ede --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-collect/index.vue @@ -0,0 +1,168 @@ + + + + + + + + + + 批量操作 + + + + + + + + + + + {{ row.user.nick_name }} + + + ID: {{ row.user.id }} + + + + + + + + + + + + {{ row.product.title }} + + + ID: {{ row.product.id }} + + + + + + + + + + + diff --git a/apps/web-antd/src/views/my-gen/user-membership/api/index.ts b/apps/web-antd/src/views/my-gen/user-membership/api/index.ts new file mode 100644 index 00000000..30fb150f --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-membership/api/index.ts @@ -0,0 +1,49 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'user-membership/'; +/** + * 分页查询用户会员列表 + * @param data + */ +export async function getUserMembershipListApi(data: any) { + return requestClient.get(`${prefix}list`, { params: data }); +} + +/** + * 获取用户会员下拉列表 + */ +export async function getUserMembershipOptionApi() { + return requestClient.get(`${prefix}option`); +} + +/** + * 获取用户会员详情 + * @param id + */ +export async function getUserMembershipInfoApi(id: number) { + return requestClient.get(`${prefix}detail`, { params: { id } }); +} + +/** + * 新增用户会员 + * @param data + */ +export async function createUserMembershipApi(data: Record) { + return requestClient.post(`${prefix}create`, data); +} + +/** + * 编辑用户会员 + * @param data + */ +export async function updateUserMembershipApi(data: Record) { + return requestClient.post(`${prefix}update`, data); +} + +/** + * 删除用户会员 + * @param data + */ +export async function deleteUserMembershipApi(data: Record) { + return requestClient.post(`${prefix}delete`, data); +} diff --git a/apps/web-antd/src/views/my-gen/user-membership/components/modal.vue b/apps/web-antd/src/views/my-gen/user-membership/components/modal.vue new file mode 100644 index 00000000..3044179c --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-membership/components/modal.vue @@ -0,0 +1,68 @@ + + + + + + diff --git a/apps/web-antd/src/views/my-gen/user-membership/config/form.ts b/apps/web-antd/src/views/my-gen/user-membership/config/form.ts new file mode 100644 index 00000000..e7d125c5 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-membership/config/form.ts @@ -0,0 +1,40 @@ +import type { VbenFormProps } from '#/adapter/form'; + +export const modalFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', // 24栅格, + commonConfig: { + formItemClass: 'col-span-12', + // 所有表单项 + componentProps: { + class: 'w-full', + }, + }, + // handleSubmit: onSubmit, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + formItemClass: 'col-span-6', + dependencies: { + show: false, + triggerFields: ['id'], + }, + }, + // 生成的表单字段 + { + fieldName: 'name', + label: '会员等级说明', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'experience', + label: '升级所需经验', + component: 'InputNumber', + rules: 'required', + }, + ], + showDefaultActions: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user-membership/config/search.ts b/apps/web-antd/src/views/my-gen/user-membership/config/search.ts new file mode 100644 index 00000000..729e6e15 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-membership/config/search.ts @@ -0,0 +1,25 @@ +import type { VbenFormProps } from '#/adapter/form'; + +// import dayjs from 'dayjs'; + +export const formOptions: VbenFormProps = { + // 默认展开 + collapsed: false, + schema: [ + // 生成的搜索字段 + { + fieldName: 'name', + label: '会员等级说明', + component: 'VbenInput', + }, + ], + // 控制表单是否显示折叠按钮 + showCollapseButton: true, + submitButtonOptions: { + content: '查询', + }, + // 是否在字段值改变时提交表单 + submitOnChange: true, + // 按下回车时是否提交表单 + submitOnEnter: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user-membership/config/table.ts b/apps/web-antd/src/views/my-gen/user-membership/config/table.ts new file mode 100644 index 00000000..d5e196e4 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-membership/config/table.ts @@ -0,0 +1,69 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { getUserMembershipListApi } from '../api'; + +interface RowType { + id: string; + name: string; + logo: string; + introduce: string; + created_at: string; +} + +export const gridOptions: VxeGridProps = { + checkboxConfig: { + highlight: true, + labelField: '', + }, + columnConfig: { + useKey: true, + }, + rowConfig: { + useKey: true, + }, + columns: [ + { type: 'checkbox', width: 60 }, + { field: 'id', align: 'left', title: 'ID', width: 100 }, + // 生成的列表字段 + { field: 'name', title: '会员等级说明' }, + { field: 'experience', title: '升级所需经验' }, + + { field: 'created_at', title: '创建时间' }, + { field: 'updated_at', title: '编辑时间' }, + { type: 'html', title: '操作', slots: { default: 'action' } }, + ], + keepSource: true, + pagerConfig: {}, + proxyConfig: { + ajax: { + // 请求后端接口方法 + query: async ({ page }, formValues) => { + return await getUserMembershipListApi({ + page: page.currentPage, + pageSize: page.pageSize, + ...formValues, + }); + }, + }, + }, + height: 'auto', + border: false, + toolbarConfig: { + // 是否显示搜索表单控制按钮 + // @ts-ignore 正式环境时有完整的类型声明 + search: true, + refresh: true, // 刷新 + print: false, // 打印 + export: false, // 导出 + // custom: true, // 自定义列 + zoom: true, // 最大化最小化 + slots: { + buttons: 'toolbar-buttons', + }, + custom: { + // 自定义列-图标 + icon: 'vxe-icon-menu', + }, + }, + showOverflow: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user-membership/index.vue b/apps/web-antd/src/views/my-gen/user-membership/index.vue new file mode 100644 index 00000000..441831ae --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-membership/index.vue @@ -0,0 +1,128 @@ + + + + + + + + + + 批量操作 + + + + + + + + + + + + + diff --git a/apps/web-antd/src/views/my-gen/user-receiving-address/api/index.ts b/apps/web-antd/src/views/my-gen/user-receiving-address/api/index.ts new file mode 100644 index 00000000..2447c510 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-receiving-address/api/index.ts @@ -0,0 +1,49 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'user-receiving-address/'; +/** + * 分页查询用户收货地址列表 + * @param data + */ +export async function getUserReceivingAddressListApi(data: any) { + return requestClient.get(`${prefix}list`, { params: data }); +} + +/** + * 获取用户收货地址下拉列表 + */ +export async function getUserReceivingAddressOptionApi() { + return requestClient.get(`${prefix}option`); +} + +/** + * 获取用户收货地址详情 + * @param id + */ +export async function getUserReceivingAddressInfoApi(id: number) { + return requestClient.get(`${prefix}detail`, { params: { id } }); +} + +/** + * 新增用户收货地址 + * @param data + */ +export async function createUserReceivingAddressApi(data: Record) { + return requestClient.post(`${prefix}create`, data); +} + +/** + * 编辑用户收货地址 + * @param data + */ +export async function updateUserReceivingAddressApi(data: Record) { + return requestClient.post(`${prefix}update`, data); +} + +/** + * 删除用户收货地址 + * @param data + */ +export async function deleteUserReceivingAddressApi(data: Record) { + return requestClient.post(`${prefix}delete`, data); +} diff --git a/apps/web-antd/src/views/my-gen/user-receiving-address/components/modal.vue b/apps/web-antd/src/views/my-gen/user-receiving-address/components/modal.vue new file mode 100644 index 00000000..4329df4d --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-receiving-address/components/modal.vue @@ -0,0 +1,71 @@ + + + + + + diff --git a/apps/web-antd/src/views/my-gen/user-receiving-address/config/form.ts b/apps/web-antd/src/views/my-gen/user-receiving-address/config/form.ts new file mode 100644 index 00000000..3b62f26f --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-receiving-address/config/form.ts @@ -0,0 +1,64 @@ +import type { VbenFormProps } from '#/adapter/form'; + +export const modalFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', // 24栅格, + commonConfig: { + formItemClass: 'col-span-12', + // 所有表单项 + componentProps: { + class: 'w-full', + }, + }, + // handleSubmit: onSubmit, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + formItemClass: 'col-span-6', + dependencies: { + show: false, + triggerFields: ['id'], + }, + }, + // 生成的表单字段 + { + fieldName: 'user_id', + label: '用户', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'province', + label: '省', + component: 'InputNumber', + rules: 'required', + }, + { + fieldName: 'city', + label: '市', + component: 'InputNumber', + rules: 'required', + }, + { + fieldName: 'district', + label: '区', + component: 'InputNumber', + rules: 'required', + }, + { + fieldName: 'detailed_address', + label: '详细地址', + component: 'Textarea', + rules: 'required', + }, + { + fieldName: 'complete_address', + label: '完整地址', + component: 'VbenInput', + rules: 'required', + }, + ], + showDefaultActions: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user-receiving-address/config/search.ts b/apps/web-antd/src/views/my-gen/user-receiving-address/config/search.ts new file mode 100644 index 00000000..7f66238e --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-receiving-address/config/search.ts @@ -0,0 +1,50 @@ +import type { VbenFormProps } from '#/adapter/form'; + +// import dayjs from 'dayjs'; + +export const formOptions: VbenFormProps = { + // 默认展开 + collapsed: false, + schema: [ + // 生成的搜索字段 + { + fieldName: 'user_id', + label: '用户', + component: 'VbenInput', + }, + { + fieldName: 'province', + label: '省', + component: 'InputNumber', + }, + { + fieldName: 'city', + label: '市', + component: 'InputNumber', + }, + { + fieldName: 'district', + label: '区', + component: 'InputNumber', + }, + { + fieldName: 'detailed_address', + label: '详细地址', + component: 'Textarea', + }, + { + fieldName: 'complete_address', + label: '完整地址', + component: 'VbenInput', + }, + ], + // 控制表单是否显示折叠按钮 + showCollapseButton: true, + submitButtonOptions: { + content: '查询', + }, + // 是否在字段值改变时提交表单 + submitOnChange: true, + // 按下回车时是否提交表单 + submitOnEnter: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user-receiving-address/config/table.ts b/apps/web-antd/src/views/my-gen/user-receiving-address/config/table.ts new file mode 100644 index 00000000..bf06ee97 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-receiving-address/config/table.ts @@ -0,0 +1,73 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { getUserReceivingAddressListApi } from '../api'; + +interface RowType { + id: string; + name: string; + logo: string; + introduce: string; + created_at: string; +} + +export const gridOptions: VxeGridProps = { + checkboxConfig: { + highlight: true, + labelField: '', + }, + columnConfig: { + useKey: true, + }, + rowConfig: { + useKey: true, + }, + columns: [ + { type: 'checkbox', width: 60 }, + { field: 'id', align: 'left', title: 'ID', width: 100 }, + // 生成的列表字段 + { field: 'user_id', title: '用户' }, + { field: 'province', title: '省' }, + { field: 'city', title: '市' }, + { field: 'district', title: '区' }, + { field: 'detailed_address', title: '详细地址' }, + { field: 'complete_address', title: '完整地址' }, + + { field: 'created_at', title: '创建时间' }, + { field: 'updated_at', title: '编辑时间' }, + { type: 'html', title: '操作', slots: { default: 'action' } }, + ], + keepSource: true, + pagerConfig: {}, + proxyConfig: { + ajax: { + // 请求后端接口方法 + query: async ({ page }, formValues) => { + return await getUserReceivingAddressListApi({ + page: page.currentPage, + pageSize: page.pageSize, + ...formValues, + }); + }, + }, + }, + height: 'auto', + border: false, + toolbarConfig: { + // 是否显示搜索表单控制按钮 + // @ts-ignore 正式环境时有完整的类型声明 + search: true, + refresh: true, // 刷新 + print: false, // 打印 + export: false, // 导出 + // custom: true, // 自定义列 + zoom: true, // 最大化最小化 + slots: { + buttons: 'toolbar-buttons', + }, + custom: { + // 自定义列-图标 + icon: 'vxe-icon-menu', + }, + }, + showOverflow: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user-receiving-address/index.vue b/apps/web-antd/src/views/my-gen/user-receiving-address/index.vue new file mode 100644 index 00000000..c94cee43 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user-receiving-address/index.vue @@ -0,0 +1,128 @@ + + + + + + + + + + 批量操作 + + + + + + + + + + + + + diff --git a/apps/web-antd/src/views/my-gen/user/api/index.ts b/apps/web-antd/src/views/my-gen/user/api/index.ts new file mode 100644 index 00000000..c861fbc6 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user/api/index.ts @@ -0,0 +1,49 @@ +import { requestClient } from '#/api/request'; + +const prefix = 'user/'; +/** + * 分页查询用户列表 + * @param data + */ +export async function getUserListApi(data: any) { + return requestClient.get(`${prefix}list`, { params: data }); +} + +/** + * 获取用户下拉列表 + */ +export async function getUserOptionApi() { + return requestClient.get(`${prefix}option`); +} + +/** + * 获取用户详情 + * @param id + */ +export async function getUserInfoApi(id: number) { + return requestClient.get(`${prefix}detail`, { params: { id } }); +} + +/** + * 新增用户 + * @param data + */ +export async function createUserApi(data: Record) { + return requestClient.post(`${prefix}create`, data); +} + +/** + * 编辑用户 + * @param data + */ +export async function updateUserApi(data: Record) { + return requestClient.post(`${prefix}update`, data); +} + +/** + * 删除用户 + * @param data + */ +export async function deleteUserApi(data: Record) { + return requestClient.post(`${prefix}delete`, data); +} diff --git a/apps/web-antd/src/views/my-gen/user/components/modal.vue b/apps/web-antd/src/views/my-gen/user/components/modal.vue new file mode 100644 index 00000000..9c0d3704 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user/components/modal.vue @@ -0,0 +1,63 @@ + + + + + + diff --git a/apps/web-antd/src/views/my-gen/user/config/form.ts b/apps/web-antd/src/views/my-gen/user/config/form.ts new file mode 100644 index 00000000..fd6e6206 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user/config/form.ts @@ -0,0 +1,70 @@ +import type { VbenFormProps } from '#/adapter/form'; + +export const modalFormProps: VbenFormProps = { + wrapperClass: 'grid-cols-12', // 24栅格, + commonConfig: { + formItemClass: 'col-span-12', + // 所有表单项 + componentProps: { + class: 'w-full', + }, + }, + // handleSubmit: onSubmit, + layout: 'horizontal', + schema: [ + { + component: 'VbenInput', + fieldName: 'id', + label: 'ID', + formItemClass: 'col-span-6', + dependencies: { + show: false, + triggerFields: ['id'], + }, + }, + // 生成的表单字段 + { + fieldName: 'nick_name', + label: '用户昵称', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'phone', + label: '手机号码', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'email', + label: '邮箱', + component: 'VbenInput', + rules: 'required', + }, + { + fieldName: 'level', + label: '用户会员等级', + component: 'InputNumber', + rules: 'required', + }, + { + fieldName: 'balance', + label: '用户余额', + component: 'InputNumber', + rules: 'required', + }, + { + fieldName: 'avatar', + label: '用户头像', + component: 'Avatar', + rules: 'required', + }, + { + fieldName: 'integral', + label: '积分', + component: 'InputNumber', + rules: 'required', + }, + ], + showDefaultActions: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user/config/search.ts b/apps/web-antd/src/views/my-gen/user/config/search.ts new file mode 100644 index 00000000..7590449a --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user/config/search.ts @@ -0,0 +1,45 @@ +import type { VbenFormProps } from '#/adapter/form'; + +// import dayjs from 'dayjs'; + +export const formOptions: VbenFormProps = { + // 默认展开 + collapsed: false, + schema: [ + // 生成的搜索字段 + { + fieldName: 'open_id', + label: '平台OpenId', + component: 'VbenInput', + }, + { + fieldName: 'nick_name', + label: '用户昵称', + component: 'VbenInput', + }, + { + fieldName: 'phone', + label: '手机号码', + component: 'VbenInput', + }, + { + fieldName: 'email', + label: '邮箱', + component: 'VbenInput', + }, + { + fieldName: 'level', + label: '用户会员等级', + component: 'InputNumber', + }, + ], + // 控制表单是否显示折叠按钮 + showCollapseButton: true, + submitButtonOptions: { + content: '查询', + }, + // 是否在字段值改变时提交表单 + submitOnChange: true, + // 按下回车时是否提交表单 + submitOnEnter: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user/config/table.ts b/apps/web-antd/src/views/my-gen/user/config/table.ts new file mode 100644 index 00000000..a9f65355 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user/config/table.ts @@ -0,0 +1,80 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; + +import { getUserListApi } from '../api'; + +interface RowType { + id: string; + name: string; + logo: string; + introduce: string; + created_at: string; +} + +export const gridOptions: VxeGridProps = { + checkboxConfig: { + highlight: true, + labelField: '', + }, + columnConfig: { + useKey: true, + }, + rowConfig: { + useKey: true, + }, + columns: [ + { type: 'checkbox', width: 60 }, + // 生成的列表字段 + { field: 'avatar', title: '用户信息', slots: { default: 'avatar' } }, + { + field: 'open_id', + title: '手机号码&邮箱&平台OpenId', + slots: { default: 'open_id' }, + width: 250, + }, + // { field: 'phone', title: '手机号码' }, + // { field: 'email', title: '邮箱' }, + { field: 'level', title: '用户会员等级' }, + { field: 'balance', title: '用户余额' }, + { field: 'integral', title: '积分' }, + // { field: 'wx_open_id', title: '微信小程序唯一标识' }, + // { field: 'zfb_open_id', title: '支付宝小程序唯一标识' }, + + { field: 'created_at', title: '创建时间' }, + { field: 'updated_at', title: '编辑时间' }, + { type: 'html', title: '操作', slots: { default: 'action' } }, + ], + keepSource: true, + pagerConfig: {}, + proxyConfig: { + ajax: { + // 请求后端接口方法 + query: async ({ page }, formValues) => { + return await getUserListApi({ + page: page.currentPage, + pageSize: page.pageSize, + ...formValues, + }); + }, + }, + }, + height: 'auto', + border: false, + toolbarConfig: { + // 是否显示搜索表单控制按钮 + // @ts-ignore 正式环境时有完整的类型声明 + search: true, + refresh: true, // 刷新 + print: false, // 打印 + export: false, // 导出 + // custom: true, // 自定义列 + zoom: true, // 最大化最小化 + slots: { + buttons: 'toolbar-buttons', + }, + custom: { + // 自定义列-图标 + icon: 'vxe-icon-menu', + }, + }, + showOverflow: false, +}; diff --git a/apps/web-antd/src/views/my-gen/user/index.vue b/apps/web-antd/src/views/my-gen/user/index.vue new file mode 100644 index 00000000..da54e6f0 --- /dev/null +++ b/apps/web-antd/src/views/my-gen/user/index.vue @@ -0,0 +1,177 @@ + + + + + + + + + + 批量操作 + + + + + + + + + + + {{ row.nick_name }} + + + ID: {{ row.id }} + + + + + + + + {{ row.phone }} + + + {{ row.email }} + + + {{ row.open_id }} + + + + + + + + + diff --git a/apps/web-antd/vite.config.mts b/apps/web-antd/vite.config.mts index 8d4b43bf..5d7cb581 100644 --- a/apps/web-antd/vite.config.mts +++ b/apps/web-antd/vite.config.mts @@ -5,7 +5,7 @@ export default defineConfig(async () => { application: {}, vite: { server: { - port: 18866, + port: 18_866, proxy: { '/api': { changeOrigin: true,
{{ product.introduction }}
预计2-5天送达