From 954a9d49f0fda3a3d3b882ff8715e37c5647fc35 Mon Sep 17 00:00:00 2001 From: zc <2064281269@qq.com> Date: Thu, 6 Nov 2025 16:50:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=95=86=E5=93=81=E7=AE=A1=E7=90=86+?= =?UTF-8?q?=E9=A6=96=E9=A1=B5=E5=95=86=E5=93=81=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/menuList.ts | 4 +- src/views/goods/appCategory/index.vue | 9 +- src/views/goods/commodity/config.ts | 6 +- .../goods/commodity/detail-dialog/editor.vue | 43 ++++- src/views/goods/commodity/index.vue | 127 +++++++++----- src/views/goods/commodity/use-method.ts | 21 ++- src/views/goods/home-goods/config.ts | 11 +- src/views/goods/home-goods/index.vue | 156 +++++++++++------- 8 files changed, 249 insertions(+), 128 deletions(-) diff --git a/src/config/menuList.ts b/src/config/menuList.ts index c0f01e6..b3e290c 100644 --- a/src/config/menuList.ts +++ b/src/config/menuList.ts @@ -16,7 +16,7 @@ export default [ modifyTime: '2024-07-15 15:45:58', tag: null, childList: [ - { + /* { id: 38, resourceName: '首页商品', resourceType: 1, @@ -33,7 +33,7 @@ export default [ modifyTime: '2024-06-19 17:56:01', tag: null, childList: [] - }, + }, */ { id: 39, resourceName: '商品管理', diff --git a/src/views/goods/appCategory/index.vue b/src/views/goods/appCategory/index.vue index 6d26e78..5c12225 100644 --- a/src/views/goods/appCategory/index.vue +++ b/src/views/goods/appCategory/index.vue @@ -152,8 +152,13 @@ const onClickChooseResourceBtn = (data: Data) => { curFileData.value = data showFileExplorer.value = true } -const handleChooseResourceFileCallback = (files: FileItem[], curFileData: Data) => { - curFileData.imageUrl = files[0].resourceUrl +const handleChooseResourceFileCallback = async (files: FileItem[], curFileData: Data) => { + const imgUrl = files[0].resourceUrl + await api.commodity.updateAppCategory.post!({ + id: curFileData.id, + imageUrl: imgUrl + }) + curFileData.imageUrl = imgUrl } diff --git a/src/views/goods/commodity/config.ts b/src/views/goods/commodity/config.ts index 8123e00..cad810e 100644 --- a/src/views/goods/commodity/config.ts +++ b/src/views/goods/commodity/config.ts @@ -19,9 +19,9 @@ export const initConfig = () => { isNew: { label: '新品', slot: 'isNew' }, isFlash: { label: '限时秒杀', slot: 'isFlash' }, btn: { - types: ['primary', 'info', 'warning', 'success', 'danger'], - names: ['编辑', '复制', '加入首页', '上下架', '删除'], - width: 230 + types: ['primary', 'info', 'danger'], + names: ['编辑', '复制', '删除'], + width: 150 } } }) diff --git a/src/views/goods/commodity/detail-dialog/editor.vue b/src/views/goods/commodity/detail-dialog/editor.vue index 5d66e05..49eb2f1 100644 --- a/src/views/goods/commodity/detail-dialog/editor.vue +++ b/src/views/goods/commodity/detail-dialog/editor.vue @@ -9,7 +9,7 @@ import '@wangeditor/editor/dist/css/style.css' import { Editor, Toolbar } from '@wangeditor/editor-for-vue' +import { ElMessage } from 'element-plus' const model = defineModel() -// 模拟 ajax 异步获取内容 -/* onMounted(() => { - setTimeout(() => { - // model.value = '

模拟 Ajax 异步设置内容

' - }, 1500) -}) */ +// 编辑器配置 +const editorConfig = { + placeholder: '请输入内容...', + MENU_CONF: { + uploadImage: { + // 自定义上传 + async customUpload(file: File, insertFn: (url: string, alt: string, href: string) => void) { + try { + // 创建 FormData + const form = new FormData() + form.append('files', file) + + // 调用上传接口 + const res = await api.resource.uploadFile.post!(form) + + // 获取图片 URL + const imageUrl = res.data[0]?.url + if (imageUrl) { + // 插入图片到编辑器 + insertFn(imageUrl, file.name, imageUrl) + } else { + ElMessage.error('图片上传失败') + } + } catch (error) { + console.error('图片上传失败:', error) + ElMessage.error('图片上传失败') + } + } + } + } +} + +// 工具栏配置 +const toolbarConfig = {} // 编辑器实例,必须用 shallowRef const editorRef = shallowRef() diff --git a/src/views/goods/commodity/index.vue b/src/views/goods/commodity/index.vue index 9ec343e..f7fde78 100644 --- a/src/views/goods/commodity/index.vue +++ b/src/views/goods/commodity/index.vue @@ -1,6 +1,6 @@ - - +
+ + {{ item.label }} + +
+ + @@ -59,8 +85,7 @@ import { ElMessage } from 'element-plus' import { initConfig } from './config' import { useCommodityType, handleLoadNode } from './use-method' -import { Check } from '@element-plus/icons-vue' -import { Close } from '@element-plus/icons-vue' +import HomeGoods from '../home-goods/index.vue' const router = useRouter() /** 新增&编辑 */ @@ -76,18 +101,7 @@ const onAddOrEdit = (type: string, row: any) => { const onCopy = async (row: any) => { await api.commodity.copyCommodity.post!({ productId: row.id }) ElMessage.success('复制成功') - table.value.$onGetData(table.value) -} - -// 加入首页 -const onAddHome = (row: any) => { - handleMessageBox({ - msg: `是否加入首页?`, - success: api.commodity.changeCommodityInfo.post!, - data: { id: row.id, frontPage: 1 } - }).then(() => { - table.value.$onGetData(table.value) - }) + table.value.$onGetData(table.value, 1, search) } // 删除 @@ -97,32 +111,54 @@ const onDelete = (row: any) => { success: api.commodity.changeCommodityInfo.post!, data: { id: row.id, isDelete: 1 } }).then(() => { - table.value.$onGetData(table.value) + table.value.$onGetData(table.value, 1, search) }) } // 改变上下架 const onChangeStatus = (row: any) => { - const type = row.status === 'online' ? '下架' : '上架' + const type = row.status === 'online' ? '上架' : '下架' handleMessageBox({ msg: `是否确认${type}吗?`, success: api.commodity.changeCommodityInfo.post!, data: { id: row.id, - status: row.status === 'online' ? 'down' : 'online' + status: row.status + }, + fail: () => { + row.status = row.status === 'online' ? 'down' : 'online' } - }).then(() => { - table.value.$onGetData(table.value) }) + .then(() => { + table.value.$onGetData(table.value, 1, search) + }) + .catch(() => { + row.status = row.status === 'online' ? 'down' : 'online' + }) } +/** 改变其他状态 */ +const onChangeCommodityOtherStatus = (row: any, status: string) => { + const type = { isNew: '新品', isFlash: '限时秒杀', frontPage: '加入首页' }[status] + handleMessageBox({ + msg: `是否将此商品${row[status] === 1 ? '设置' : '取消'}${type}吗?`, + success: api.commodity.changeCommodityInfo.post!, + data: { + id: row.id, + [status]: row[status] + }, + fail: () => { + row[status] = row[status] === 1 ? 0 : 1 + } + }).catch(() => { + row[status] = row[status] === 1 ? 0 : 1 + }) +} /** 初始化页面 */ const ConfigData = initConfig() const { search, table } = handleInit(ConfigData, api.commodity.getCommodityList.post, [ onAddOrEdit.bind(null, 'edit'), onCopy, - onAddHome, - onChangeStatus, onDelete ]) const { commodityType, onChangeCommodityType, commodityTypeOptions } = useCommodityType( @@ -131,6 +167,15 @@ const { commodityType, onChangeCommodityType, commodityTypeOptions } = useCommod ) onChangeCommodityType(commodityType.value) +const rondomNumber = ref(NaN) +const onSearch = (val: any) => { + if (search.value.$data.status === 'frontPage') { + rondomNumber.value = Math.random() + } else { + table.value.$onGetData(table.value, 1, val) + } +} + /** 页面缓存 */ defineOptions({ name: 'Commodity' }) diff --git a/src/views/goods/commodity/use-method.ts b/src/views/goods/commodity/use-method.ts index dd6404c..0c99647 100644 --- a/src/views/goods/commodity/use-method.ts +++ b/src/views/goods/commodity/use-method.ts @@ -1,32 +1,35 @@ -type TCommodityType = 'all' | 'online' | 'down' | 'draft' | 'delete' +type TCommodityType = 'all' | 'online' | 'down' | 'draft' | 'delete' | 'frontPage' export const useCommodityType = (search: any, table: any) => { let beforeValue = 'online' const commodityType = ref('online') const commodityTypeOptions = [ { label: '在线商品', value: 'online' }, + { label: '首页商品', value: 'frontPage' }, { label: '所有商品', value: 'all' }, { label: '下架商品', value: 'down' }, { label: '草稿', value: 'draft' }, { label: '已删商品', value: 'delete' } ] - const cacheTableData = { all: [], online: [], down: [], draft: [], delete: [] } // 缓存表单数据 - const cacheTablePage = { all: {}, online: {}, down: {}, draft: {}, delete: {} } // 缓存表单页面数据 - const onChangeCommodityType = (type: 'all' | 'online' | 'down' | 'draft' | 'delete') => { + const cacheTableData = { all: [], online: [], down: [], draft: [], delete: [], frontPage: [] } // 缓存表单数据 + const cacheTablePage = { all: {}, online: {}, down: {}, draft: {}, delete: {}, frontPage: {} } // 缓存表单页面数据 + const onChangeCommodityType = ( + type: 'all' | 'online' | 'down' | 'draft' | 'delete' | 'frontPage' + ) => { cacheTableData[beforeValue as typeof type] = toRaw(table.value.$data) cacheTablePage[beforeValue as typeof type] = toRaw(table.value.$pages) beforeValue = type - search.value.$default = { status: type } - search.value.$data = { status: type } - handleSetTableConfig(table, type) + search.value.$default.status = type + search.value.$data.status = type + // handleSetTableConfig(table, type) if (cacheTableData[type].length) { table.value.$data = cacheTableData[type] table.value.$pages = cacheTablePage[type] } else { if (type === 'all') { - search.value.$data = { status: '' } + search.value.$data.status = '' table.value.$onGetData(table.value, 1, search) - } else { + } else if (type !== 'frontPage') { table.value.$onGetData(table.value, 1, search) } } diff --git a/src/views/goods/home-goods/config.ts b/src/views/goods/home-goods/config.ts index 48cb89d..9a2df12 100644 --- a/src/views/goods/home-goods/config.ts +++ b/src/views/goods/home-goods/config.ts @@ -1,10 +1,6 @@ const configData = ref() export const initConfig = () => { configData.value = pageConfig({ - search: { - comTitle: { label: '标题', clearable: true }, - adminCategoryId: { label: '类目', slot: 'adminCategoryId' } - }, table: { id: { label: '产品ID' }, title: { label: '标题' }, @@ -15,12 +11,13 @@ export const initConfig = () => { label: '在线', slot: 'status' }, + frontPage: { label: '加入首页', slot: 'frontPage' }, isNew: { label: '新品', slot: 'isNew' }, isFlash: { label: '限时秒杀', slot: 'isFlash' }, btn: { - types: ['primary', 'warning', 'success', 'danger'], - names: ['编辑', '移除首页', '上架', '下架'], - width: 200 + types: ['primary', 'warning', 'danger'], + names: ['编辑', '复制', '删除'], + width: 150 } } }) diff --git a/src/views/goods/home-goods/index.vue b/src/views/goods/home-goods/index.vue index 71f00bc..2b62a64 100644 --- a/src/views/goods/home-goods/index.vue +++ b/src/views/goods/home-goods/index.vue @@ -1,39 +1,42 @@