From 76b0d6efc8420cfafd9fe88d34cda0109d3f2af9 Mon Sep 17 00:00:00 2001 From: "pikachu1995@126.com" Date: Mon, 9 Nov 2026 15:01:19 +0800 Subject: [PATCH] =?UTF-8?q?refactor(layout):=20=E9=87=8D=E6=9E=84=E5=95=86?= =?UTF-8?q?=E5=AE=B6=E5=90=8E=E5=8F=B0=E5=B8=83=E5=B1=80=E4=B8=8E=E5=AF=BC?= =?UTF-8?q?=E8=88=AA=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除多标签页内嵌模式,详情页固定在新窗口打开 - 重构顶部栏与侧边栏布局,Logo 移至顶部栏区域 - 新增未读消息角标,与消息页面实时同步数量 - 新增面包屑路径栏替代静态页面标题展示 - 删除页面配置抽屉和菜单搜索组件 - 将发货与退货地址设置拆分为独立页面(店铺信息、地址管理) - 增加 Logo 加载失败回退及 favicon 健壮性处理 - 注册店铺信息与地址管理页面的显式懒加载映射 --- seller/src/api/shops.js | 7 +- seller/src/config/index.js | 2 +- seller/src/config/setting.json | 2 +- seller/src/libs/lazyLoading.js | 6 +- seller/src/libs/routerJson.js | 18 + seller/src/stores/app.js | 5 + seller/src/stores/setting.js | 6 +- seller/src/stores/user.js | 1 + seller/src/utils/filters.js | 17 +- seller/src/views/Main.vue | 178 +++++++--- .../views/main-components/config-drawer.vue | 67 ---- seller/src/views/main-components/header.vue | 16 +- .../src/views/main-components/menu-search.vue | 92 ------ .../shrinkable-menu/shrinkable-menu.vue | 2 +- seller/src/views/main.scss | 72 ++-- seller/src/views/message/message.vue | 8 +- seller/src/views/shop/addressManage.vue | 312 ++++++++++++++++++ seller/src/views/shop/shopInfo.vue | 294 +++++++++++++++++ seller/src/views/shop/shopSetting.vue | 293 ++-------------- 19 files changed, 879 insertions(+), 519 deletions(-) delete mode 100644 seller/src/views/main-components/config-drawer.vue delete mode 100644 seller/src/views/main-components/menu-search.vue create mode 100644 seller/src/views/shop/addressManage.vue create mode 100644 seller/src/views/shop/shopInfo.vue diff --git a/seller/src/api/shops.js b/seller/src/api/shops.js index 6f0e8258e..db16a4221 100644 --- a/seller/src/api/shops.js +++ b/seller/src/api/shops.js @@ -87,6 +87,11 @@ export const getShopInfo = () => { return getRequest(`/settings/storeSettings`) } +// 获取商家入驻详细信息 +export const getShopEntryDetail = () => { + return getRequest(`/settings/storeSettings/storeDetail`) +} + // 保存商家详细信息 export const saveShopInfo = (params) => { return putRequest(`/settings/storeSettings`, params) @@ -127,5 +132,3 @@ export const editShipTemplate = (id, params, headers) => { export const editChecked = (logisticsId,params) => { return putRequest(`/other/logistics/${logisticsId}/updateStoreLogistics`,params) } - - diff --git a/seller/src/config/index.js b/seller/src/config/index.js index 963e31883..93d8f5836 100644 --- a/seller/src/config/index.js +++ b/seller/src/config/index.js @@ -31,6 +31,6 @@ module.exports = { */ mainColor: "#ff5c58", //主题色 setting: { - isUseTabsRouter: false, // 多标签页内嵌模式默认关闭,用户可在页面配置中开启。 + isUseTabsRouter: false, // 商家后台固定关闭多标签页内嵌模式,详情使用新页面展示。 }, }; diff --git a/seller/src/config/setting.json b/seller/src/config/setting.json index 44d624cf9..fcbe27492 100644 --- a/seller/src/config/setting.json +++ b/seller/src/config/setting.json @@ -1,6 +1,6 @@ { "setting": { - "isUseTabsRouter": true, + "isUseTabsRouter": false, "showFooter": false } } diff --git a/seller/src/libs/lazyLoading.js b/seller/src/libs/lazyLoading.js index 2f9fd4142..5b3dd4a7d 100644 --- a/seller/src/libs/lazyLoading.js +++ b/seller/src/libs/lazyLoading.js @@ -1,2 +1,6 @@ -export default (url) =>()=>import(`@/views/${url}.vue`) +const explicitViews = { + "shop/shopInfo": () => import("@/views/shop/shopInfo.vue"), + "shop/addressManage": () => import("@/views/shop/addressManage.vue"), +}; +export default (url) => explicitViews[url] || (() => import(`@/views/${url}.vue`)); diff --git a/seller/src/libs/routerJson.js b/seller/src/libs/routerJson.js index dc4322dd7..657474041 100644 --- a/seller/src/libs/routerJson.js +++ b/seller/src/libs/routerJson.js @@ -489,6 +489,24 @@ export const result = [{ component: "shop/shopSetting", children: null, }, + { + name: "shopInfo", + level: 2, + type: 0, + title: "店铺信息", + path: "shopInfo", + component: "shop/shopInfo", + children: null, + }, + { + name: "addressManage", + level: 2, + type: 0, + title: "地址管理", + path: "addressManage", + component: "shop/addressManage", + children: null, + }, { name: "wapList", level: 2, diff --git a/seller/src/stores/app.js b/seller/src/stores/app.js index 72ee75176..49b758326 100644 --- a/seller/src/stores/app.js +++ b/seller/src/stores/app.js @@ -27,8 +27,13 @@ export const useAppStore = defineStore("app", { routers: [otherRouter], tagsList: [...otherRouter.children], refMenu: "", + unreadMessageCount: 0, }), actions: { + /** 更新顶部未读消息数量。 */ + setUnreadMessageCount(count) { + this.unreadMessageCount = Math.max(0, Number(count) || 0); + }, /** 清理账号绑定的路由与标签目录,保留静态页面,防止切换账号后复用旧菜单。 */ resetNavigationRoutes() { this.routers = [otherRouter]; diff --git a/seller/src/stores/setting.js b/seller/src/stores/setting.js index 20498c1ca..37070c066 100644 --- a/seller/src/stores/setting.js +++ b/seller/src/stores/setting.js @@ -7,11 +7,13 @@ const localSetting = window.localStorage.getItem("setting"); export const useSettingStore = defineStore("setting", { state: () => ({ - setting: localSetting ? JSON.parse(localSetting) : setting, + // 兼容已保存的其他偏好,旧浏览器中的多标签开启状态统一归为关闭。 + setting: { ...setting, ...(localSetting ? JSON.parse(localSetting) : {}), isUseTabsRouter: false }, }), actions: { + /** 更新其他页面偏好时,仍保持商家多标签模式关闭。 */ updateSetting(data) { - this.setting = data; + this.setting = { ...data, isUseTabsRouter: false }; }, }, }); diff --git a/seller/src/stores/user.js b/seller/src/stores/user.js index 71b00506b..91ff6ddaa 100644 --- a/seller/src/stores/user.js +++ b/seller/src/stores/user.js @@ -30,6 +30,7 @@ export const useUserStore = defineStore("user", { appStore.updateMenulist([]); appStore.setCurrNav(""); appStore.setAdded(false); + appStore.setUnreadMessageCount(0); appStore.resetNavigationRoutes(); appStore.storeOpenedList = [{ title: "首页", path: "", name: "home_index" }]; }, diff --git a/seller/src/utils/filters.js b/seller/src/utils/filters.js index 40d326da2..47e0f9778 100644 --- a/seller/src/utils/filters.js +++ b/seller/src/utils/filters.js @@ -51,21 +51,12 @@ export function enCode(v1) { import {router} from "@/router/index"; /** - * 自定义跳转 + * 打开详情页面;商家后台固定关闭多标签页内嵌模式,不再读取旧浏览器偏好。 + * @param push Vue Router 路由位置 */ export function customRouterPush(push){ - const setting = window.localStorage.getItem('setting') ? JSON.parse(window.localStorage.getItem('setting')) : {}; - - if(setting.isUseTabsRouter){ - router.push(push) - } - else{ - if(Object.keys(setting).length == 0){router.push(push)} - else{ - let url = router.resolve(push); - window.open(url.href, '_blank'); - } - } + const url = router.resolve(push); + window.open(url.href, '_blank'); } diff --git a/seller/src/views/Main.vue b/seller/src/views/Main.vue index 28667b0d1..fd67dad83 100644 --- a/seller/src/views/Main.vue +++ b/seller/src/views/Main.vue @@ -5,29 +5,44 @@ - - diff --git a/seller/src/views/main-components/header.vue b/seller/src/views/main-components/header.vue index 891b63b72..a1b696419 100644 --- a/seller/src/views/main-components/header.vue +++ b/seller/src/views/main-components/header.vue @@ -1,7 +1,7 @@ @@ -16,7 +16,7 @@ function init() { getSite(); } function applyFavicon(href) { - if (!href) return; + if (!href || href === "undefined" || href === "null") return; const link = document.querySelector("link[rel*='icon']") || document.createElement("link"); @@ -29,16 +29,18 @@ function getSite() { loadSiteSettings() .then((data) => { if (data) { + const logo = data.storeSideLogo || data.domainLogo || ""; + const icon = data.storeSideIcon || data.domainIcon || ""; const expirationTime = new Date().setHours(new Date().getHours() + 1); localStorage.setItem("seller_expiration_time", expirationTime); - localStorage.setItem("sellersiteName", data.siteName); - localStorage.setItem("sellerlogoImg", data.storeSideLogo); - localStorage.setItem("sellerIconImg", data.storeSideIcon); + localStorage.setItem("sellersiteName", data.siteName || ""); + if (logo) localStorage.setItem("sellerlogoImg", logo); + if (icon) localStorage.setItem("sellerIconImg", icon); localStorage.setItem("sellerCompanyName", data.companyName || ""); localStorage.setItem("sellerCompanyUrl", data.companyUrl || ""); - storeSideLogo.value = data.storeSideLogo || storeSideLogo.value; + storeSideLogo.value = logo || storeSideLogo.value; if (data.siteName) window.document.title = data.siteName; - applyFavicon(data.storeSideIcon); + applyFavicon(icon); } }) .catch(() => {}); diff --git a/seller/src/views/main-components/menu-search.vue b/seller/src/views/main-components/menu-search.vue deleted file mode 100644 index c5e1aebfc..000000000 --- a/seller/src/views/main-components/menu-search.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - diff --git a/seller/src/views/main-components/shrinkable-menu/shrinkable-menu.vue b/seller/src/views/main-components/shrinkable-menu/shrinkable-menu.vue index 234f768d4..3121ba8d3 100644 --- a/seller/src/views/main-components/shrinkable-menu/shrinkable-menu.vue +++ b/seller/src/views/main-components/shrinkable-menu/shrinkable-menu.vue @@ -78,7 +78,7 @@ watch([() => route.fullPath, () => appStore.navigationMenus], syncRouteMenu, { i diff --git a/seller/src/views/shop/shopInfo.vue b/seller/src/views/shop/shopInfo.vue new file mode 100644 index 000000000..5cfe32bd3 --- /dev/null +++ b/seller/src/views/shop/shopInfo.vue @@ -0,0 +1,294 @@ + + + + + + diff --git a/seller/src/views/shop/shopSetting.vue b/seller/src/views/shop/shopSetting.vue index 4734224c8..9971880bf 100644 --- a/seller/src/views/shop/shopSetting.vue +++ b/seller/src/views/shop/shopSetting.vue @@ -1,7 +1,7 @@