diff --git a/seller/public/config.js b/seller/public/config.js index 19674034b..67e2801d8 100644 --- a/seller/public/config.js +++ b/seller/public/config.js @@ -3,7 +3,7 @@ var BASE = { * @description api请求基础路径 */ API_DEV: { - seller: "https://admin-api.pickmall.cn", + seller: "http://127.0.0.1:8887", }, API_PROD: { seller: "https://admin-api.pickmall.cn", diff --git a/seller/src/api/index.js b/seller/src/api/index.js index 0e2a51deb..e62ccc665 100644 --- a/seller/src/api/index.js +++ b/seller/src/api/index.js @@ -295,7 +295,7 @@ export const deleteDepartment = (ids, params) => { }; // 编辑部门 export const editDepartment = (ids, params) => { - return putRequest(`/department/${ids} `, params); + return putRequest(`/department/${ids}`, params); }; // 加载部门子级数据 export const loadDepartment = (id) => { diff --git a/seller/src/libs/util.js b/seller/src/libs/util.js index 98d757135..0414685cd 100644 --- a/seller/src/libs/util.js +++ b/seller/src/libs/util.js @@ -164,8 +164,14 @@ util.bootstrapDynamicRoutesFromCache = function () { } }; +/** 站点名称:优先取接口下发并缓存的站点名,兜底用本地配置 */ +util.getSiteName = function () { + return window.localStorage.getItem("sellersiteName") || config.title; +}; + util.title = function (title) { - title = title || `${config.title} 商家后台`; + const siteName = util.getSiteName(); + title = title ? `${title} - ${siteName}商家后台` : `${siteName} 商家后台`; window.document.title = title; }; @@ -508,9 +514,8 @@ util.initRouterNode = function (routers, data) { } const meta = {}; - meta.title = menu.title - ? menu.title + " - " + config.title + "商家后台" - : null; + // 站点后缀统一由 util.title 在路由跳转时动态拼接,避免初始化时定死 + meta.title = menu.title ? menu.title : null; meta.firstRouterName = item.firstRouterName; meta.keepAlive = menu.keepAlive ? true : false; menu.meta = meta; diff --git a/seller/src/router/router.js b/seller/src/router/router.js index 1de3618b8..4595dfb14 100644 --- a/seller/src/router/router.js +++ b/seller/src/router/router.js @@ -1,11 +1,11 @@ import Main from "@/views/Main.vue"; -import config from "@/config/index"; // 不作为Main组件的子页面展示的页面单独写,如下 export const loginRouter = { path: "/login", name: "login", meta: { - title: `登录 - ${config.title}商家后台` + // 站点后缀由 util.title 在路由跳转时动态拼接(站点名取自接口下发缓存) + title: "登录" }, component: () => import("@/views/login.vue") }; diff --git a/seller/src/styles/element.scss b/seller/src/styles/element.scss index 46e57cc61..9dc2f4b36 100644 --- a/seller/src/styles/element.scss +++ b/seller/src/styles/element.scss @@ -113,6 +113,11 @@ z-index: 4000 !important; } +/* 全局禁止 textarea 拖拽改变大小 */ +.el-textarea__inner { + resize: none; +} + /* 统一空状态:表格 / 树 / 列表无数据时的展示(未自定义 #empty 插槽的页面均生效) */ .el-table__empty-block { min-height: 160px; diff --git a/seller/src/views/ForgetPassword.vue b/seller/src/views/ForgetPassword.vue index 4b94906ed..bc7b8842d 100644 --- a/seller/src/views/ForgetPassword.vue +++ b/seller/src/views/ForgetPassword.vue @@ -107,7 +107,7 @@ Copyright © {{ year }} - Present {{ - config.title + siteName }} 版权所有 @@ -124,7 +124,7 @@ import { md5 } from "@/utils/md5.js"; import * as RegExp from "@/utils/regular.js"; import * as apiLogin from "@/api/index.js"; import { sendSms } from "@/api/common.js"; -import config from "@/config/index"; +import util from "@/libs/util.js"; import verify from "@/views/my-components/verify"; import { useAppStore } from "@/stores/app"; @@ -146,6 +146,8 @@ const form = reactive({ oncePasd: "", }); const year = new Date().getFullYear(); +// 站点名优先取接口下发缓存,兜底用本地配置 +const siteName = util.getSiteName(); const step = ref(0); const ruleInline = { mobile: [ diff --git a/seller/src/views/goods/goods-seller/alertQuantityWarn.vue b/seller/src/views/goods/goods-seller/alertQuantityWarn.vue index b93d51560..7de6e70cc 100644 --- a/seller/src/views/goods/goods-seller/alertQuantityWarn.vue +++ b/seller/src/views/goods/goods-seller/alertQuantityWarn.vue @@ -37,7 +37,12 @@ - + + + + + {{ row.simpleSpecs || "-" }} + {{ row.quantity || 0 }} @@ -54,7 +59,12 @@ - + + + + + {{ row.simpleSpecs || "-" }} + {{ row.quantity || 0 }} diff --git a/seller/src/views/goods/goods-seller/goods.vue b/seller/src/views/goods/goods-seller/goods.vue index ad0d77362..12656d4b4 100644 --- a/seller/src/views/goods/goods-seller/goods.vue +++ b/seller/src/views/goods/goods-seller/goods.vue @@ -6,74 +6,70 @@ :model="searchForm" inline label-width="70px" - class="search-form" + class="search-form goods-search-form" @keyup.enter="handleSearch" > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -89,7 +84,6 @@ v-model="searchForm.stockStatus" placeholder="全部" clearable - style="width: 240px" @change="onStockStatusChange" > @@ -97,34 +91,18 @@ - - ~ - + + + ~ + + - - ~ - + + + ~ + + 搜索 @@ -172,7 +150,7 @@ @selection-change="onSelectionChange" > - + - + 上架 @@ -693,28 +671,48 @@ onMounted(() => { }); diff --git a/seller/src/views/order/after-order/returnGoodsOrder.vue b/seller/src/views/order/after-order/returnGoodsOrder.vue index 82d108e03..9e360f07d 100644 --- a/seller/src/views/order/after-order/returnGoodsOrder.vue +++ b/seller/src/views/order/after-order/returnGoodsOrder.vue @@ -103,7 +103,7 @@ {{ row.goodsName }} - 商品ID: {{ row.goodsId }} + SPU编码: {{ row.goodsId }} diff --git a/seller/src/views/order/after-order/returnMoneyOrder.vue b/seller/src/views/order/after-order/returnMoneyOrder.vue index b83d937c6..c922030d4 100644 --- a/seller/src/views/order/after-order/returnMoneyOrder.vue +++ b/seller/src/views/order/after-order/returnMoneyOrder.vue @@ -96,7 +96,7 @@ {{ row.goodsName }} - 商品ID: {{ row.goodsId }} + SPU编码: {{ row.goodsId }} diff --git a/seller/src/views/shop/floorList.vue b/seller/src/views/shop/floorList.vue index 3b8128984..2f9318c03 100644 --- a/seller/src/views/shop/floorList.vue +++ b/seller/src/views/shop/floorList.vue @@ -19,6 +19,7 @@ + - + 刷新 添加 - + + - - {{item.name}} - 包邮 - - - {{item.updateTime}} - - 修改 - | - 删除 - + + + {{item.name}} + 包邮 + + {{item.updateTime}} + 修改 + | + 删除 + + @@ -499,10 +494,10 @@ onMounted(() => { } tbody td { - color: #999; + color: #606266; background-color: #fff; text-align: center; - padding: 6px 0; + padding: 8px 0; } } @@ -536,30 +531,41 @@ onMounted(() => { border-left: 1px solid #e6e6e6; } -.order tbody tr th .temp-name { - float: left; +.order tbody tr th.template-head { + padding: 0; +} + +.template-head-inner { + display: flex; + align-items: center; + gap: 10px; + padding: 8px 12px; +} + +.temp-name { font-size: 14px; - color: #555; - // line-height: 44px; - margin: 7px 0 0 10px; + font-weight: 600; + color: #303133; } -.m-r-5 { - margin-right: 5px !important; +.template-head-right { + margin-left: auto; + display: flex; + align-items: center; + font-weight: normal; + font-size: 13px; } -.fr { - float: right !important; +.update-time { + margin-right: 16px; + color: #909399; + font-size: 12px; } .m-b-30 { margin-bottom: 10px !important; } -Button { - margin: 3px 5px 0px 5px; -} - thead { display: table-header-group; vertical-align: middle; @@ -704,14 +710,8 @@ em { font-size: 15px; color: #f00; } -.baoyou { - margin: 6px 10px 0; -} -/* 操作链接与分隔符不加粗 */ -.order tbody tr th .fr a { - font-weight: normal; -} -.order tbody tr th .fr span { - font-weight: normal; + +.action-link:hover { + text-decoration: underline; } diff --git a/seller/src/views/shop/shopAddress.vue b/seller/src/views/shop/shopAddress.vue index 77c142279..992a3332c 100644 --- a/seller/src/views/shop/shopAddress.vue +++ b/seller/src/views/shop/shopAddress.vue @@ -12,6 +12,7 @@ + 修改 diff --git a/seller/src/views/shop/system/department/storeDepartmentManage.vue b/seller/src/views/shop/system/department/storeDepartmentManage.vue index 70a38fa08..6b97c3d69 100644 --- a/seller/src/views/shop/system/department/storeDepartmentManage.vue +++ b/seller/src/views/shop/system/department/storeDepartmentManage.vue @@ -1,81 +1,37 @@ - - - 添加部门 - 添加子部门 + + 添加部门 批量删除 - 刷新 - - - - - 当前选择编辑: - {{ editTitle }} - 取消选择 - - - - - - - - - - - - - - - - - - - - - - - 修改并保存 - - 重置 - - - - + 刷新 + + + + + + {{ parentTitle(row) }} + + + + + + + 添加子级 + | + 编辑 + | + 删除 + + + - - - {{ form.title }} - + + + + - + + + + + + - + - 取消 - 提交 + 取消 + 提交 diff --git a/seller/src/views/shop/wap/wapList.vue b/seller/src/views/shop/wap/wapList.vue index 59772e831..9713b6bab 100644 --- a/seller/src/views/shop/wap/wapList.vue +++ b/seller/src/views/shop/wap/wapList.vue @@ -19,6 +19,7 @@ + - + {{ formatMoney(row.salesAmount) }} diff --git a/seller/src/views/sys/oss-manage/ossManage.scss b/seller/src/views/sys/oss-manage/ossManage.scss index 6c1355993..e3bbb1ece 100644 --- a/seller/src/views/sys/oss-manage/ossManage.scss +++ b/seller/src/views/sys/oss-manage/ossManage.scss @@ -1,4 +1,6 @@ -// 商家素材库(OSS 管理)样式:全部规则挂在 .oss-manage 根类下,避免全局污染 +// 商家素材库(OSS 管理)样式。 +// 本文件经 @import 全局引入且未加 scoped,页面内规则全部挂在 .oss-manage 根类下避免污染; +// 全局样式里不要写 :deep(),浏览器会把含未知伪类的整条规则丢弃。 .oss-manage { // 单面板容器 .oss-panel { @@ -91,11 +93,11 @@ display: flex; flex-wrap: wrap; align-content: flex-start; + gap: 16px 14px; margin-top: 14px; .oss-grid-item { width: 120px; - margin: 0 14px 14px 0; position: relative; display: flex; flex-direction: column; @@ -104,12 +106,15 @@ .oss-card { width: 120px; height: 120px; - border-radius: 6px; - border: 2px solid transparent; + border-radius: 8px; + border: 1px solid #ebeef5; + background: #f7f8fa; overflow: hidden; box-sizing: border-box; position: relative; - transition: border-color 0.2s; + transition: + border-color 0.2s, + box-shadow 0.2s; img, .card-media { @@ -150,7 +155,7 @@ opacity: 0; transition: opacity 0.2s; - :deep(.el-checkbox__label) { + .el-checkbox__label { display: none; } } @@ -186,6 +191,7 @@ &:hover { border-color: var(--el-color-primary); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12); .oss-card-check { opacity: 1; @@ -236,6 +242,92 @@ } } + // 左侧分组树 + .oss-group-tree { + flex: 1; + padding: 4px 4px 0; + + .el-tree-node__expand-icon { + display: none; + } + + .el-tree-node { + margin-bottom: 4px; + } + + .el-tree-node__content { + padding: 0 10px !important; + height: 38px; + border-radius: 6px; + font-size: 14px; + line-height: 38px; + } + + .el-tree-node__content:hover { + background: #f5f7fa; + } + + .el-tree-node.is-current > .el-tree-node__content { + background: var(--el-color-primary-light-9); + color: var(--el-color-primary); + font-weight: 500; + } + + .el-tree-node.is-current .oss-tree-icon { + color: var(--el-color-primary); + } + } + + .oss-tree-node { + display: inline-flex; + align-items: center; + justify-content: space-between; + width: 100%; + padding-right: 4px; + font-size: 14px; + + &:hover .oss-tree-more { + opacity: 1; + } + } + + .oss-tree-label { + display: inline-flex; + align-items: center; + min-width: 0; + overflow: hidden; + } + + .oss-tree-icon { + margin-right: 6px; + flex-shrink: 0; + color: #c0c4cc; + } + + .oss-tree-more { + cursor: pointer; + color: #909399; + padding: 0 4px; + font-size: 16px; + opacity: 0; + transition: opacity 0.2s; + flex-shrink: 0; + + &:hover { + color: var(--el-color-primary); + } + } + + // picker 模式的底部确认栏 + .oss-select-footer { + margin-top: 16px; + padding-top: 12px; + border-top: 1px solid #ededed; + display: flex; + justify-content: flex-end; + gap: 10px; + } + // 弹窗选择器模式:去掉面板阴影,固定内容区最小高度,避免空分组时布局塌陷 &.oss-manage-picker { .oss-panel { @@ -272,3 +364,34 @@ } } } + +// 以下两条用于 el-dialog 内部;el-dialog 默认挂载到 body 下,必须保持全局 +.modal-footer { + text-align: center; + + > * { + margin: 0 10px; + } +} + +.file-preview-fallback { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 48px 16px; + color: #606266; + + .file-preview-name { + margin: 16px 0 8px; + font-size: 16px; + font-weight: 500; + word-break: break-all; + text-align: center; + } + + .file-preview-tip { + margin: 0 0 20px; + color: #909399; + } +} diff --git a/seller/src/views/sys/oss-manage/ossManage.vue b/seller/src/views/sys/oss-manage/ossManage.vue index 3262d1e7c..84eb62c5a 100644 --- a/seller/src/views/sys/oss-manage/ossManage.vue +++ b/seller/src/views/sys/oss-manage/ossManage.vue @@ -1,110 +1,5 @@ @@ -167,7 +62,10 @@ > - {{ data.title }} + + + {{ data.title }} + - + + + + - + @@ -365,14 +269,13 @@ let dp;