From 3a441bddc2b096fe804c70d7bec72f77c02b9446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=92?= Date: Wed, 20 Aug 2025 01:01:01 +0800 Subject: [PATCH] 1 --- src/api/system/favoriteProduct.js | 79 +++++++- src/components/PublishDialog.vue | 76 ++++++-- src/store/getters.js | 3 +- src/store/modules/app.js | 10 +- src/views/system/favoriteProduct/index.vue | 10 ++ src/views/system/xbmessage/index.vue | 200 +++++++++++++++++++-- 6 files changed, 338 insertions(+), 40 deletions(-) diff --git a/src/api/system/favoriteProduct.js b/src/api/system/favoriteProduct.js index 44f0b07..37ed701 100644 --- a/src/api/system/favoriteProduct.js +++ b/src/api/system/favoriteProduct.js @@ -1,5 +1,56 @@ import request from '@/utils/request' +// 列表 +export function listFavoriteProduct(query) { + return request({ + url: '/jarvis/favoriteProduct/list', + method: 'get', + params: query + }) +} + +// 详情 +export function getFavoriteProduct(id) { + return request({ + url: `/jarvis/favoriteProduct/${id}`, + method: 'get' + }) +} + +// 新增 +export function addFavoriteProduct(data) { + return request({ + url: '/jarvis/favoriteProduct', + method: 'post', + data + }) +} + +// 修改 +export function updateFavoriteProduct(data) { + return request({ + url: '/jarvis/favoriteProduct', + method: 'put', + data + }) +} + +// 删除 +export function delFavoriteProduct(ids) { + return request({ + url: `/jarvis/favoriteProduct/${ids}`, + method: 'delete' + }) +} + +// 更新置顶状态 +export function updateTopStatus(id, isTop) { + return request({ + url: `/jarvis/favoriteProduct/updateTopStatus/${id}/${isTop}`, + method: 'put' + }) +} + // 添加到常用商品 export function addToFavorites(data) { return request({ @@ -9,17 +60,24 @@ export function addToFavorites(data) { }) } -// 更新发品信息(商品ID、状态等) -export function updateProductInfo(data) { +// 根据skuid查询是否已存在 +export function getBySkuid(skuid) { return request({ - url: '/jarvis/favoriteProduct/updateProductInfo', - method: 'put', - data + url: `/jarvis/favoriteProduct/getBySkuid/${encodeURIComponent(skuid)}`, + method: 'get' + }) +} + +// 用户的常用商品列表 +export function getUserFavorites() { + return request({ + url: '/jarvis/favoriteProduct/userFavorites', + method: 'get' }) } // 从常用商品快速发品 -export function quickPublish(id, appid) { +export function quickPublishFromFavorite(id, appid) { return request({ url: `/jarvis/favoriteProduct/quickPublish/${id}`, method: 'post', @@ -27,4 +85,11 @@ export function quickPublish(id, appid) { }) } - +// 更新发品信息(商品ID、状态等) +export function updateProductInfo(data) { + return request({ + url: '/jarvis/favoriteProduct/updateProductInfo', + method: 'put', + data + }) +} \ No newline at end of file diff --git a/src/components/PublishDialog.vue b/src/components/PublishDialog.vue index 6b68f15..59df189 100644 --- a/src/components/PublishDialog.vue +++ b/src/components/PublishDialog.vue @@ -112,9 +112,32 @@ + + + @@ -132,6 +155,8 @@ export default { return { internalVisible: false, loading: false, + publishLoading: false, + createdProduct: null, wenanOptions: [], productImages: [], form: { @@ -236,6 +261,22 @@ export default { 'form.channelCatId'(val) { this.loadProperties(); } }, methods: { + copyText(text) { + const val = String(text || '').trim(); + if (!val) { this.$modal.msgWarning('无可复制的内容'); return; } + if (navigator.clipboard && window.isSecureContext) { + navigator.clipboard.writeText(val).then(() => { this.$modal.msgSuccess('复制成功'); }).catch(() => { this.fallbackCopy(val); }); + } else { + this.fallbackCopy(val); + } + }, + fallbackCopy(text) { + const ta = document.createElement('textarea'); + ta.value = text; ta.style.position = 'fixed'; ta.style.left = '-9999px'; + document.body.appendChild(ta); ta.focus(); ta.select(); + try { document.execCommand('copy'); this.$modal.msgSuccess('复制成功'); } catch(e){ this.$modal.msgError('复制失败'); } + document.body.removeChild(ta); + }, async bootstrap() { // 初始化表单与文案/图片 const d = this.initialData || {}; @@ -349,25 +390,32 @@ export default { const outerId = res.data && (res.data.outerId || (res.data.data && res.data.data.outerId)); if (outerId) this.$modal.msgSuccess(`发品成功,商家编码:${outerId}`); else this.$modal.msgSuccess('发品提交成功'); } catch(e){ this.$modal.msgSuccess('发品提交成功'); } - // 自动上架(需要返回的 productId 与 userName) - try { - const productId = this.extractProductId(res.data); - if (productId && this.form.userName) { - const pubRes = await publishProduct({ productId, userName: this.form.userName, appid: this.form.appid }); - if (pubRes && pubRes.code === 200) { - const code = (pubRes.data && pubRes.data.code) ?? pubRes.code; - if (code === 0 || code === 200) this.$modal.msgSuccess('上架成功'); else this.$modal.msgWarning('上架已提交或状态未知'); - } else { - this.$modal.msgError((pubRes && pubRes.msg) || '上架失败'); - } - } - } catch (e) { /* 忽略上架异常,仅提示 */ } + // 记录创建成功的商品,保留弹窗供手动“上架” + const productId = this.extractProductId(res.data) || (res.data && (res.data.product_id || (res.data.data && res.data.data.product_id))); + const productStatus = res.data && (res.data.product_status || (res.data.data && res.data.data.product_status)); + const outerId2 = res.data && (res.data.outerId || res.data.outer_id || (res.data.data && (res.data.data.outerId || res.data.data.outer_id))); + this.createdProduct = { productId, productStatus, outerId: outerId2 }; this.$emit('success', res); - this.closeDialog(); } else { this.$modal.msgError(res.msg || '发品失败'); } }).catch(err => { this.loading = false; console.error('发品失败', err); this.$modal.msgError('发品失败,请稍后重试'); }); }); }, + async publishNow() { + if (!this.createdProduct || !this.createdProduct.productId) return; + this.publishLoading = true; + try { + const pubRes = await publishProduct({ productId: this.createdProduct.productId, userName: this.form.userName, appid: this.form.appid }); + if (pubRes && pubRes.code === 200) { + const code = (pubRes.data && pubRes.data.code) ?? pubRes.code; + if (code === 0 || code === 200) this.$modal.msgSuccess('上架成功'); else this.$modal.msgWarning('上架已提交或状态未知'); + } else { + this.$modal.msgError((pubRes && pubRes.msg) || '上架失败'); + } + } catch(e) { + this.$modal.msgError('上架失败'); + } + this.publishLoading = false; + }, extractProductId(resp) { try { if (!resp) return null; diff --git a/src/store/getters.js b/src/store/getters.js index 3680f95..ebfef88 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -16,6 +16,7 @@ const getters = { permission_routes: state => state.permission.routes, topbarRouters: state => state.permission.topbarRouters, defaultRoutes: state => state.permission.defaultRoutes, - sidebarRouters: state => state.permission.sidebarRouters + sidebarRouters: state => state.permission.sidebarRouters, + favoriteProductRefreshKey: state => state.app.favoriteProductRefreshKey } export default getters diff --git a/src/store/modules/app.js b/src/store/modules/app.js index 9f99f39..844d595 100644 --- a/src/store/modules/app.js +++ b/src/store/modules/app.js @@ -7,7 +7,9 @@ const state = { hide: false }, device: 'desktop', - size: Cookies.get('size') || 'medium' + size: Cookies.get('size') || 'medium', + // 全局刷新标记:常用商品列表 + favoriteProductRefreshKey: 0 } const mutations = { @@ -37,6 +39,9 @@ const mutations = { }, SET_SIDEBAR_HIDE: (state, status) => { state.sidebar.hide = status + }, + INCREMENT_FAVORITE_PRODUCT_REFRESH_KEY: (state) => { + state.favoriteProductRefreshKey++ } } @@ -55,6 +60,9 @@ const actions = { }, toggleSideBarHide({ commit }, status) { commit('SET_SIDEBAR_HIDE', status) + }, + triggerFavoriteProductRefresh({ commit }) { + commit('INCREMENT_FAVORITE_PRODUCT_REFRESH_KEY') } } diff --git a/src/views/system/favoriteProduct/index.vue b/src/views/system/favoriteProduct/index.vue index d4b1d78..37af1f5 100644 --- a/src/views/system/favoriteProduct/index.vue +++ b/src/views/system/favoriteProduct/index.vue @@ -367,9 +367,13 @@