From 03ccdf2d43f629dd4b05813e03c020623cc6c59a Mon Sep 17 00:00:00 2001 From: "pikachu1995@126.com" Date: Sun, 15 Mar 2026 17:34:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E5=8F=B7=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=92=8C=E5=95=86=E5=93=81=E5=AE=9A=E6=97=B6=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=9E=B6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增微信视频号管理页面,包含概况、订单、退单、商品、分类和设置六个标签页 - 实现微信视频号相关API接口,包括类目、商品、订单、退单和概况数据查询 - 在商品管理页面添加批量定时上下架功能,支持选择状态和触发时间 - 优化批量操作下拉菜单,整合上架、下架、定时上下架、物流模板设置和删除功能 - 改进设置页面样式,增强按钮布局的响应式设计 --- manager/src/api/index.js | 25 +++ .../sys/setting-manage/setting/style.scss | 18 ++ .../components/WxChannelsCategoryTab.vue | 94 +++++++++ .../components/WxChannelsGoodsTab.vue | 143 +++++++++++++ .../components/WxChannelsOrderTab.vue | 172 +++++++++++++++ .../components/WxChannelsOverviewTab.vue | 155 ++++++++++++++ .../components/WxChannelsRefundTab.vue | 180 ++++++++++++++++ .../components/WxChannelsSettingTab.vue | 114 ++++++++++ manager/src/views/wx-channel/wxChannel.vue | 50 +++++ seller/src/api/goods.js | 7 + seller/src/views/goods/goods-seller/goods.vue | 198 +++++++++++++++++- 11 files changed, 1151 insertions(+), 5 deletions(-) create mode 100644 manager/src/views/wx-channel/components/WxChannelsCategoryTab.vue create mode 100644 manager/src/views/wx-channel/components/WxChannelsGoodsTab.vue create mode 100644 manager/src/views/wx-channel/components/WxChannelsOrderTab.vue create mode 100644 manager/src/views/wx-channel/components/WxChannelsOverviewTab.vue create mode 100644 manager/src/views/wx-channel/components/WxChannelsRefundTab.vue create mode 100644 manager/src/views/wx-channel/components/WxChannelsSettingTab.vue create mode 100644 manager/src/views/wx-channel/wxChannel.vue diff --git a/manager/src/api/index.js b/manager/src/api/index.js index c682b086..12f36057 100644 --- a/manager/src/api/index.js +++ b/manager/src/api/index.js @@ -368,6 +368,31 @@ export const setSetting = (key, params) => { return putRequestWithNoForm(`/setting/setting/put/${key}`, params); }; +// 微信视频号小店类目(三级) +export const getWxChannelsThirdCategory = (params) => { + return getRequest(`/wxchannels/category/third`, params); +}; + +// 微信视频号商品分页 +export const getWxChannelsGoodsPage = (params) => { + return getRequest(`/wxchannels/goods`, params); +}; + +// 微信视频号订单分页 +export const getWxChannelsOrderPage = (params) => { + return getRequest(`/wxchannels/order`, params); +}; + +// 微信视频号概况 +export const getWxChannelsOverviewSummary = (params) => { + return getRequest(`/wxchannels/overview/summary`, params); +}; + +// 微信视频号退单分页 +export const getWxChannelsRefundPage = (params) => { + return getRequest(`/wxchannels/refund`, params); +}; + // 分页查询敏感词 export const getSensitiveWordsPage = (params) => { diff --git a/manager/src/views/sys/setting-manage/setting/style.scss b/manager/src/views/sys/setting-manage/setting/style.scss index a1c96949..06e3f2bd 100644 --- a/manager/src/views/sys/setting-manage/setting/style.scss +++ b/manager/src/views/sys/setting-manage/setting/style.scss @@ -4,6 +4,24 @@ .label-btns{ margin-left: 150px; + display: flex; + flex-wrap: wrap; + align-items: center; +} + +.es-buttons{ + display: flex; + flex-wrap: wrap; + margin-left: 10px; +} + +::v-deep .label-btns > .ivu-btn{ + margin-right: 10px; +} + +::v-deep .es-buttons .ivu-btn{ + margin-right: 10px; + margin-bottom: 10px; } .ivu-form-item{ diff --git a/manager/src/views/wx-channel/components/WxChannelsCategoryTab.vue b/manager/src/views/wx-channel/components/WxChannelsCategoryTab.vue new file mode 100644 index 00000000..0c1d0bbe --- /dev/null +++ b/manager/src/views/wx-channel/components/WxChannelsCategoryTab.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/manager/src/views/wx-channel/components/WxChannelsGoodsTab.vue b/manager/src/views/wx-channel/components/WxChannelsGoodsTab.vue new file mode 100644 index 00000000..55a238a7 --- /dev/null +++ b/manager/src/views/wx-channel/components/WxChannelsGoodsTab.vue @@ -0,0 +1,143 @@ + + + diff --git a/manager/src/views/wx-channel/components/WxChannelsOrderTab.vue b/manager/src/views/wx-channel/components/WxChannelsOrderTab.vue new file mode 100644 index 00000000..2cb61089 --- /dev/null +++ b/manager/src/views/wx-channel/components/WxChannelsOrderTab.vue @@ -0,0 +1,172 @@ + + + diff --git a/manager/src/views/wx-channel/components/WxChannelsOverviewTab.vue b/manager/src/views/wx-channel/components/WxChannelsOverviewTab.vue new file mode 100644 index 00000000..6f20a658 --- /dev/null +++ b/manager/src/views/wx-channel/components/WxChannelsOverviewTab.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/manager/src/views/wx-channel/components/WxChannelsRefundTab.vue b/manager/src/views/wx-channel/components/WxChannelsRefundTab.vue new file mode 100644 index 00000000..5d7d9c9a --- /dev/null +++ b/manager/src/views/wx-channel/components/WxChannelsRefundTab.vue @@ -0,0 +1,180 @@ + + + diff --git a/manager/src/views/wx-channel/components/WxChannelsSettingTab.vue b/manager/src/views/wx-channel/components/WxChannelsSettingTab.vue new file mode 100644 index 00000000..55c048b5 --- /dev/null +++ b/manager/src/views/wx-channel/components/WxChannelsSettingTab.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/manager/src/views/wx-channel/wxChannel.vue b/manager/src/views/wx-channel/wxChannel.vue new file mode 100644 index 00000000..0db97fec --- /dev/null +++ b/manager/src/views/wx-channel/wxChannel.vue @@ -0,0 +1,50 @@ + + + diff --git a/seller/src/api/goods.js b/seller/src/api/goods.js index c966f49d..24970318 100644 --- a/seller/src/api/goods.js +++ b/seller/src/api/goods.js @@ -268,6 +268,13 @@ export const lowGoods = params => { return putRequest(`/goods/goods/under`, params); }; +// 定时上下架商品 +export const scheduleGoodsMarket = params => { + return postRequest(`/goods/goods/schedule/market`, params, { + "Content-Type": "application/json" + }); +}; + // 获取商品单位列表 export const getGoodsUnitList = params => { return getRequest(`/goods/goodsUnit`,params); diff --git a/seller/src/views/goods/goods-seller/goods.vue b/seller/src/views/goods/goods-seller/goods.vue index 434886c3..de20ea93 100644 --- a/seller/src/views/goods/goods-seller/goods.vue +++ b/seller/src/views/goods/goods-seller/goods.vue @@ -78,10 +78,19 @@ - - - - + + + + 批量上架 + 批量下架 + 批量定时上下架 + 批量设置物流模板 + 批量删除 + + 更新 + + +
+ + + + + + + + + + +
+ + +
+
Array.from({ length: nowH }, (_, i) => i), + disabledMinutes: (hour) => (hour === nowH ? Array.from({ length: nowM }, (_, i) => i) : []), + disabledSeconds: (hour, minute) => + hour === nowH && minute === nowM ? Array.from({ length: nowS + 1 }, (_, i) => i) : [] + }; } }, methods: { @@ -569,6 +675,10 @@ export default { if (v == "lowers") { this.lowers(); } + //批量定时上下架 + if (v == "scheduleMarket") { + this.openScheduleMarketModal(); + } //批量删除商品 if (v == "deleteAll") { this.deleteAll(); @@ -733,6 +843,84 @@ export default { this.shipTemplateForm.goodsId = data; this.shipTemplateModal = true; }, + openScheduleMarketModal() { + if (this.selectCount <= 0) { + this.$Message.warning("您还未选择要定时上下架的商品"); + return; + } + this.scheduleMarketForm = { + status: "UPPER", + triggerTime: null, + reason: "" + }; + this.scheduleMarketModal = true; + }, + handleScheduleMarketTimeChange() { + if (!this.scheduleMarketForm || !this.scheduleMarketForm.triggerTime) return; + const selected = + this.scheduleMarketForm.triggerTime instanceof Date + ? this.scheduleMarketForm.triggerTime + : new Date(this.scheduleMarketForm.triggerTime); + + const selectedMs = selected.getTime(); + if (!Number.isFinite(selectedMs)) return; + if (selectedMs <= Date.now()) { + this.$Message.warning("触发时间只能选择当前时间之后"); + this.scheduleMarketForm.triggerTime = new Date(Date.now() + 60 * 1000); + } + }, + submitScheduleMarket() { + if (this.selectCount <= 0) { + this.$Message.warning("您还未选择要定时上下架的商品"); + return; + } + if (!this.scheduleMarketForm.status) { + this.$Message.warning("请选择状态"); + return; + } + if (!this.scheduleMarketForm.triggerTime) { + this.$Message.warning("请选择触发时间"); + return; + } + + const triggerTime = + this.scheduleMarketForm.triggerTime instanceof Date + ? this.scheduleMarketForm.triggerTime.getTime() + : new Date(this.scheduleMarketForm.triggerTime).getTime(); + + if (!Number.isFinite(triggerTime)) { + this.$Message.error("触发时间格式不正确"); + return; + } + if (triggerTime <= Date.now()) { + this.$Message.warning("触发时间需大于当前时间"); + return; + } + + const goodsIds = this.selectList.map((i) => i.id); + + const payload = { + goodsIds, + status: this.scheduleMarketForm.status, + triggerTime, + reason: this.scheduleMarketForm.reason || undefined + }; + + this.scheduleMarketLoading = true; + scheduleGoodsMarket(payload) + .then((res) => { + if (res && res.success) { + this.$Message.success("设置成功"); + this.scheduleMarketModal = false; + this.clearSelectAll(); + this.getDataList(); + this.getNumberData(); + } + }) + .finally(() => { + this.scheduleMarketLoading = false; + }); + }, // 获取商品列表数据 getDataList() { this.loading = true;