From 821205b18a6354134f0677d15930dc856ecc932b Mon Sep 17 00:00:00 2001
From: huangzhenbao <17818024429@163.com>
Date: Thu, 5 Feb 2026 11:36:55 +0800
Subject: [PATCH 01/12] =?UTF-8?q?=E4=BF=9D=E7=95=99=E9=A1=B5=E9=9D=A2?=
=?UTF-8?q?=E5=B8=83=E5=B1=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
App.uvue | 3 +
favicon.ico | Bin 0 -> 164292 bytes
layouts/admin/AdminLayout.uvue | 85 ++++++-
layouts/admin/components/AdminHeader.uvue | 76 +++++-
layouts/admin/pages/HomeIndex.uvue | 234 +++++-------------
layouts/admin/store/adminNavStore.uts | 10 +
layouts/admin/styles/admin-responsive.css | 36 +++
.../admin/docs/RESPONSIVE_LAYOUT_GUIDE.md | 85 +++++++
.../admin/docs/UNI_APP_X_PAGE_FIX_GUIDE.md | 14 ++
.../homePage/components/KpiMiniCard.uvue | 96 ++++---
pages/mall/admin/order/list.uvue | 8 +-
.../product/product-statistics/index.uvue | 15 +-
pages/mall/admin/user/MemberConfig.uvue | 2 +-
pages/mall/admin/user/Statistic.uvue | 41 ++-
pages/mall/admin/user/list.uvue | 18 +-
15 files changed, 476 insertions(+), 247 deletions(-)
create mode 100644 favicon.ico
create mode 100644 layouts/admin/styles/admin-responsive.css
create mode 100644 pages/mall/admin/docs/RESPONSIVE_LAYOUT_GUIDE.md
diff --git a/App.uvue b/App.uvue
index c394e95c..8bc9ebcf 100644
--- a/App.uvue
+++ b/App.uvue
@@ -9,6 +9,9 @@
diff --git a/layouts/admin/store/adminNavStore.uts b/layouts/admin/store/adminNavStore.uts
index 62305e0c..4779587e 100644
--- a/layouts/admin/store/adminNavStore.uts
+++ b/layouts/admin/store/adminNavStore.uts
@@ -38,8 +38,18 @@ export const tabs = ref([])
/** 是否折叠主侧边栏 */
export const isMainAsideCollapsed = ref(false)
+/** 屏幕宽度 */
+export const windowWidth = ref(1024)
+
+/** 是否为移动端布局 (width < 768) */
+export const isMobile = computed(() => windowWidth.value < 768)
+
+/** 移动端菜单是否展开 */
+export const isMobileMenuOpen = ref(false)
+
/** 是否显示二级侧边栏 */
export const showSubSider = computed(() => {
+ if (isMobile.value) return false // 移动端不显式二级侧边栏在主体区域
const topMenus = getTopMenus()
const activeMenu = topMenus.find(m => m.id === activeTopMenuId.value)
return activeMenu ? activeMenu.groups.length > 0 : false
diff --git a/layouts/admin/styles/admin-responsive.css b/layouts/admin/styles/admin-responsive.css
new file mode 100644
index 00000000..4148ecb5
--- /dev/null
+++ b/layouts/admin/styles/admin-responsive.css
@@ -0,0 +1,36 @@
+/* 统一 KPI 统计网格响应式规范 */
+
+.kpi-grid {
+ display: grid !important;
+ gap: 16px;
+ width: 100%;
+ box-sizing: border-box;
+}
+
+/* 规则 1:屏幕宽度 >= 1200px -> 固定 4 列 */
+@media (min-width: 1200px) {
+ .kpi-grid {
+ grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
+ }
+}
+
+/* 规则 2:768px <= 屏幕宽度 < 1200px -> 固定 2 列 */
+@media (min-width: 768px) and (max-width: 1199.98px) {
+ .kpi-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
+ }
+}
+
+/* 规则 3:屏幕宽度 < 768px -> 固定 1 列 */
+@media (max-width: 767.98px) {
+ .kpi-grid {
+ grid-template-columns: repeat(1, minmax(0, 1fr)) !important;
+ }
+}
+
+/* 强制子项允许收缩,防止内部长文本撑爆网格 */
+.kpi-grid > * {
+ min-width: 0 !important;
+ flex: none !important; /* 覆盖旧的 flex 逻辑 */
+ width: auto !important; /* 让 grid 控制宽度 */
+}
diff --git a/pages/mall/admin/docs/RESPONSIVE_LAYOUT_GUIDE.md b/pages/mall/admin/docs/RESPONSIVE_LAYOUT_GUIDE.md
new file mode 100644
index 00000000..b7618cce
--- /dev/null
+++ b/pages/mall/admin/docs/RESPONSIVE_LAYOUT_GUIDE.md
@@ -0,0 +1,85 @@
+# 管理后台响应式布局实现指南
+
+本文档总结了商城管理后台从固定布局到响应式布局的改造过程及核心技术点。
+
+## 1. 核心目标
+
+- **多终端适配**:确保后台在桌面端(宽屏)、平板端(中等屏幕)和移动端(窄屏)均能良好展示。
+- **自动适配状态管理**:系统能自动感知屏幕宽度并调整侧边栏显隐逻辑。
+- **布局平滑过渡**:侧边栏的收起、拉出及内容区的重排应具有良好的动画效果。
+
+## 2. 状态管理 (Store) 扩展
+
+在 [adminNavStore.uts](layouts/admin/store/adminNavStore.uts) 中引入了响应式状态:
+
+- `windowWidth`: 实时存储当前窗口宽度。
+- `isMobile`: 计算属性,当宽度小于 768px 时判定为移动端。
+- `isMobileMenuOpen`: 控制移动端模式下侧边栏的展开状态。
+
+```typescript
+export const windowWidth = ref(1024);
+export const isMobile = computed(() => windowWidth.value < 768);
+export const isMobileMenuOpen = ref(false);
+```
+
+## 3. 布局架构调整 (AdminLayout)
+
+[AdminLayout.uvue](layouts/admin/AdminLayout.uvue) 负责整体结构的响应式策略:
+
+### 3.1 监听并初始化
+
+在 `onMounted` 中初始化宽度并监听 `uni.onWindowResize`:
+
+```typescript
+onMounted(() => {
+ windowWidth.value = uni.getWindowInfo().windowWidth;
+ uni.onWindowResize((res) => {
+ windowWidth.value = res.size.windowWidth;
+ });
+});
+```
+
+### 3.2 侧边栏处理
+
+- **桌面端**:侧边栏常规展示,通过 `marginLeft` 为内容区腾出空间。
+- **移动端**:侧边栏通过 `position: absolute` 隐藏在屏幕外,通过 `translateX` 动画滑入。同时禁用二级侧边栏的常驻显示。
+
+### 3.3 移动端遮罩与切换
+
+- 引入 `mobile-mask` 遮罩层,点击遮罩自动关闭菜单。
+- [AdminHeader](layouts/admin/components/AdminHeader.uvue) 在移动端会显示 “☰” 切换按钮。
+
+## 4. 页面内容重排 (HomeIndex)
+
+[HomeIndex.uvue](layouts/admin/pages/HomeIndex.uvue) 利用 CSS 媒体查询实现内容区域的自适应:
+
+### 4.1 KPI 卡片流式布局
+
+使用 `flex-wrap: wrap` 配合 `min-width`:
+
+- **布局策略**:设置 `min-width: 250px` 作为安全边界,确保在 1200px 分辨率下依然能并排展示 4 个卡片。
+- **动态列数**:
+ - **宽屏 (>1200px)**: 4个卡片并排。
+ - **中屏 (768px - 1200px)**: 强制 2 个并排。
+ - **窄屏 (<768px)**: 1个卡片占满整行。
+- **高度控制**:统一固定为 `200px`。
+
+### 4.2 图表响应式
+
+- **垂直排列**:底部两个并排的图表在小屏下自动切换为垂直排列(`flex-direction: column`)。
+- **组件自适应**:图表组件内部利用父容器宽度自动伸缩。
+- **头部压缩**:移动端下,图表的配置项(如日期切换标签)由横向改为纵向,避免溢出。
+
+## 5. 组件化实践 (KpiMiniCard)
+
+统一使用了 [KpiMiniCard](pages/mall/admin/homePage/components/KpiMiniCard.uvue) 组件,确保:
+
+- 样式一致性。
+- 代码复用性。
+- 内部样式的可维护性。
+
+## 6. 使用建议
+
+- 后续开发新页面时,请优先使用 `stats-row` 和 `stat-card` 进行布局。
+- 对于复杂的表格页面,建议在移动端隐藏非核心列,或使用横向滚动条展示。
+- 所有的宽度判定建议遵循 768px 这一标准断点。
diff --git a/pages/mall/admin/docs/UNI_APP_X_PAGE_FIX_GUIDE.md b/pages/mall/admin/docs/UNI_APP_X_PAGE_FIX_GUIDE.md
index 7d2facf7..202bb409 100644
--- a/pages/mall/admin/docs/UNI_APP_X_PAGE_FIX_GUIDE.md
+++ b/pages/mall/admin/docs/UNI_APP_X_PAGE_FIX_GUIDE.md
@@ -11,6 +11,20 @@
- **解决方案**: 确保替换操作覆盖文件的完整生命周期,或者在发现 500 错误时检查文件末尾是否有残留的旧标签。
- **预防**: 优先使用 `create_file` 或子代理重写整个文件,而非局部替换复杂的 SFC 结构。
+#### **原因十二:KPI 统计网格响应式不一致 (用户体验红线)**
+
+- **现象**: 某些宽度下出现一行 3 个卡片,导致视觉不平衡或数据展示拥挤。
+- **原因**: 使用了 `repeat(auto-fit/auto-fill, ...)` 或基于 `min-width` 的 flex 自动布局。
+- **解决方案**:
+ 1. 使用全局统一类 `.kpi-grid`。
+ 2. 严禁使用 `auto-fit/auto-fill`。
+ 3. 必须显式使用视图断点拦截:
+ - `>= 1200px`: 固定 4 列 (`grid-template-columns: repeat(4, minmax(0, 1fr))`)。
+ - `768px - 1199px`: 固定 2 列 (`grid-template-columns: repeat(2, minmax(0, 1fr))`)。
+ - `< 768px`: 固定 1 列 (`grid-template-columns: repeat(1, minmax(0, 1fr))`)。
+ 4. 使用 `minmax(0, 1fr)` 配分子项 `min-width: 0` 确保在任何容器宽度下网格不被撑爆。
+- **强制规则**: 任何页面都不允许出现一行 3 个卡片的情况。
+
## 🛠️ 完整修复流程
```
diff --git a/pages/mall/admin/homePage/components/KpiMiniCard.uvue b/pages/mall/admin/homePage/components/KpiMiniCard.uvue
index 89b9aee9..b7456b8e 100644
--- a/pages/mall/admin/homePage/components/KpiMiniCard.uvue
+++ b/pages/mall/admin/homePage/components/KpiMiniCard.uvue
@@ -81,7 +81,7 @@ const props = withDefaults(defineProps<{
const trendArrow = computed((): string => {
if (props.trend === 'up') return '▲'
if (props.trend === 'down') return '▼'
- return '•'
+ return ''
})
const trendClass = computed((): string => {
@@ -94,33 +94,43 @@ const trendClass = computed((): string => {
diff --git a/pages/mall/admin/order/list.uvue b/pages/mall/admin/order/list.uvue
index ffbcbe2a..842d8ace 100644
--- a/pages/mall/admin/order/list.uvue
+++ b/pages/mall/admin/order/list.uvue
@@ -160,7 +160,7 @@ const orderData = ref([
typeColor: 'blue',
cancelStatus: '用户已取消',
product: {
- img: 'https://img.crmeb.com/crmeb_demo/75211.png',
+ img: '/static/logo.png',
name: '爱奇艺智能 奇遇LT01 投影仪 家用卧室 超高清手机便携投影机 (4K超清 支持...'
},
user: { phone: '188****4074', id: '82694' },
@@ -176,7 +176,7 @@ const orderData = ref([
typeColor: 'purple',
cancelStatus: '',
product: {
- img: 'https://img.crmeb.com/crmeb_demo/75211.png',
+ img: '/static/logo.png',
name: '阿迪达斯官网 adidas BBALL CAP COT 男女训练运动帽子FQ5270 传奇墨水...'
},
user: { phone: '你就给', id: '82703' },
@@ -192,7 +192,7 @@ const orderData = ref([
typeColor: 'green',
cancelStatus: '',
product: {
- img: 'https://img.crmeb.com/crmeb_demo/75211.png',
+ img: '/static/logo.png',
name: 'UR2024夏季新款女装复古纯欲氛围感一字肩短款T恤衫UWG440060'
},
user: { phone: '王毅不睡了', id: '82689' },
@@ -208,7 +208,7 @@ const orderData = ref([
typeColor: 'blue',
cancelStatus: '',
product: {
- img: 'https://img.crmeb.com/crmeb_demo/75211.png',
+ img: '/static/logo.png',
name: '爱奇艺智能 奇遇LT01 投影仪 家用卧室 超高清手机便携投影机 (4K超清 支持...'
},
user: { phone: '177****8361', id: '82697' },
diff --git a/pages/mall/admin/product/product-statistics/index.uvue b/pages/mall/admin/product/product-statistics/index.uvue
index 2acbfe8e..07760492 100644
--- a/pages/mall/admin/product/product-statistics/index.uvue
+++ b/pages/mall/admin/product/product-statistics/index.uvue
@@ -16,8 +16,8 @@
-
-
+
+
@@ -367,19 +367,12 @@ function initChart() {
.btn-query { background: #1890ff; color: #fff; font-size: 14px; height: 32px; padding: 0 15px; border-radius: 4px; border: none; }
.btn-export { background: #1890ff; color: #fff; font-size: 14px; height: 32px; padding: 0 15px; border-radius: 4px; border: none; }
-.stat-grid {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- gap: 16px;
- margin-bottom: 16px;
-}
-
+/* stat-grid 已废弃,由全局 kpi-grid 接管 */
.stat-card {
- width: calc(33.33% - 11px);
background: #fff;
border-radius: 8px;
padding: 20px;
+ min-width: 0;
}
.stat-main {
diff --git a/pages/mall/admin/user/MemberConfig.uvue b/pages/mall/admin/user/MemberConfig.uvue
index 02bed9c3..f563fac0 100644
--- a/pages/mall/admin/user/MemberConfig.uvue
+++ b/pages/mall/admin/user/MemberConfig.uvue
@@ -74,7 +74,7 @@
-
+
+
diff --git a/pages/mall/admin/user/Statistic.uvue b/pages/mall/admin/user/Statistic.uvue
index 838febcd..9c49f420 100644
--- a/pages/mall/admin/user/Statistic.uvue
+++ b/pages/mall/admin/user/Statistic.uvue
@@ -24,14 +24,14 @@
-
+
-
+
{{ item.icon }}
@@ -221,22 +221,14 @@ function onExport() {
color: #bfbfbf;
}
-.kpi-row {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- gap: 20px;
- margin-bottom: 40px;
-}
-
+/* kpi-row 已废弃,采用全局 kpi-grid */
.kpi-card {
- flex: 1;
- min-width: 200px;
display: flex;
flex-direction: row;
align-items: center;
gap: 16px;
padding: 8px;
+ min-width: 0; /* 允许收缩 */
}
.kpi-icon-box {
@@ -296,6 +288,31 @@ function onExport() {
width: 100%;
}
+@media (max-width: 1200px) {
+ .filter-card {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 16px;
+ }
+
+ .filter-item {
+ width: 100%;
+ }
+
+ .select-box, .date-picker-box {
+ flex: 1;
+ }
+
+ .analysis-row {
+ flex-direction: column;
+ }
+
+ .map-col, .gender-col {
+ width: 100%;
+ flex: none;
+ }
+}
+
.map-col {
flex: 7;
}
diff --git a/pages/mall/admin/user/list.uvue b/pages/mall/admin/user/list.uvue
index 3e094337..36de2d25 100644
--- a/pages/mall/admin/user/list.uvue
+++ b/pages/mall/admin/user/list.uvue
@@ -154,15 +154,15 @@ const isAllChecked = ref(false)
const activeDropdownId = ref(null)
const userList = ref([
- { id: '77414', avatar: 'https://img.crmeb.com/crmeb_demo/77414.png', nickname: '199****0268', isMember: '否', level: '无', group: '无', spreadLevel: '', phone: '199****0268', userType: '公众号', balance: '88888.00', checked: false },
- { id: '75311', avatar: 'https://img.crmeb.com/crmeb_demo/75311.png', nickname: 'wljbhg', isMember: '否', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100002.00', checked: false },
- { id: '75305', avatar: 'https://img.crmeb.com/crmeb_demo/75305.png', nickname: '相见欢', isMember: '否', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100000.00', checked: false },
- { id: '75296', avatar: 'https://img.crmeb.com/crmeb_demo/75296.png', nickname: '..', isMember: '否', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100000.00', checked: false },
- { id: '75293', avatar: 'https://img.crmeb.com/crmeb_demo/75293.png', nickname: '钟(钏)华', isMember: '否', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100000.00', checked: false },
- { id: '75289', avatar: 'https://img.crmeb.com/crmeb_demo/75289.png', nickname: '小二上酒', isMember: '否', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100000.00', checked: false },
- { id: '75257', avatar: 'https://img.crmeb.com/crmeb_demo/75257.png', nickname: '5+7', isMember: '是', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100000.00', checked: false },
- { id: '75226', avatar: 'https://img.crmeb.com/crmeb_demo/75226.png', nickname: '慢步前行', isMember: '是', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100000.00', checked: false },
- { id: '75211', avatar: 'https://img.crmeb.com/crmeb_demo/75211.png', nickname: '难得糊涂', isMember: '否', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100000.00', checked: false }
+ { id: '77414', avatar: '/static/logo.png', nickname: '199****0268', isMember: '否', level: '无', group: '无', spreadLevel: '', phone: '199****0268', userType: '公众号', balance: '88888.00', checked: false },
+ { id: '75311', avatar: '/static/logo.png', nickname: 'wljbhg', isMember: '否', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100002.00', checked: false },
+ { id: '75305', avatar: '/static/logo.png', nickname: '相见欢', isMember: '否', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100000.00', checked: false },
+ { id: '75296', avatar: '/static/logo.png', nickname: '..', isMember: '否', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100000.00', checked: false },
+ { id: '75293', avatar: '/static/logo.png', nickname: '钟(钏)华', isMember: '否', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100000.00', checked: false },
+ { id: '75289', avatar: '/static/logo.png', nickname: '小二上酒', isMember: '否', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100000.00', checked: false },
+ { id: '75257', avatar: '/static/logo.png', nickname: '5+7', isMember: '是', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100000.00', checked: false },
+ { id: '75226', avatar: '/static/logo.png', nickname: '慢步前行', isMember: '是', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100000.00', checked: false },
+ { id: '75211', avatar: '/static/logo.png', nickname: '难得糊涂', isMember: '否', level: '无', group: 'A类客户', spreadLevel: '', phone: '', userType: '公众号', balance: '100000.00', checked: false }
])
function onSearch() {
From 151f5a5e1ada97870c84d3be29cfbfcc2d8f8b64 Mon Sep 17 00:00:00 2001
From: huangzhenbao <17818024429@163.com>
Date: Thu, 5 Feb 2026 17:11:41 +0800
Subject: [PATCH 02/12] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=86=E8=8A=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../analytics/AnalyticsUserGenderSection.uvue | 257 +++++++++++++-----
layouts/admin/AdminLayout.uvue | 147 ++++++++--
layouts/admin/components/AdminAside.uvue | 8 +-
layouts/admin/components/AdminHeader.uvue | 30 +-
layouts/admin/components/AdminSubsider.uvue | 68 ++++-
layouts/admin/store/adminNavStore.uts | 34 ++-
layouts/admin/styles/admin-responsive.css | 29 +-
.../admin/docs/UNI_APP_X_PAGE_FIX_GUIDE.md | 94 +++++++
pages/mall/admin/user/Statistic.uvue | 90 +++---
uni_modules/charts/EChartsView.vue | 71 ++---
10 files changed, 634 insertions(+), 194 deletions(-)
diff --git a/components/analytics/AnalyticsUserGenderSection.uvue b/components/analytics/AnalyticsUserGenderSection.uvue
index 41f67ab7..ab4a979e 100644
--- a/components/analytics/AnalyticsUserGenderSection.uvue
+++ b/components/analytics/AnalyticsUserGenderSection.uvue
@@ -1,12 +1,28 @@
-
+
-
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
总用户数
{{ totalUsers }}
@@ -18,7 +34,12 @@
@@ -237,7 +319,7 @@ onMounted(() => {
/* 移动端侧边栏样式 */
.mobile-aside {
position: absolute;
- left: -100px; /* 隐藏在左侧 */
+ left: -70px; /* 隐藏在左侧,匹配 ASIDE_W: 70 */
top: 0;
bottom: 0;
z-index: 1001;
@@ -246,17 +328,26 @@ onMounted(() => {
}
.mobile-aside-open {
- transform: translateX(100px); /* 移入视图 */
+ transform: translateX(70px); /* 移入视图 */
}
.mobile-mask {
- position: absolute;
+ position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.4);
z-index: 1000;
+ opacity: 0;
+ visibility: hidden;
+ transition: opacity 300ms ease, visibility 0s linear 300ms;
+}
+
+.mask-show {
+ opacity: 1;
+ visibility: visible;
+ transition: opacity 300ms ease, visibility 0s linear 0s;
}
.main {
@@ -264,7 +355,7 @@ onMounted(() => {
display: flex;
flex-direction: column;
min-height: 100vh;
- transition: margin-left 0.3s ease;
+ transition: margin-left 300ms ease;
background: #f0f2f5;
width: 100%;
}
@@ -278,7 +369,7 @@ onMounted(() => {
/* 强行改变侧边栏布局模式 */
.admin-sidebar {
position: absolute !important;
- left: -100px !important; /* 隐藏在左侧,假设 ASIDE_W 是 96 */
+ left: -70px !important; /* 隐藏在左侧 */
top: 0;
bottom: 0;
z-index: 1001;
@@ -287,7 +378,7 @@ onMounted(() => {
/* 展开时的状态 */
.mobile-aside-open {
- transform: translateX(100px) !important;
+ transform: translateX(70px) !important;
}
}
diff --git a/layouts/admin/components/AdminAside.uvue b/layouts/admin/components/AdminAside.uvue
index a662125d..cb424d26 100644
--- a/layouts/admin/components/AdminAside.uvue
+++ b/layouts/admin/components/AdminAside.uvue
@@ -21,16 +21,18 @@
-
-
-
diff --git a/pages/mall/admin/user-statistics.uvue b/pages/mall/admin/user-statistics.uvue
deleted file mode 100644
index 143f67ef..00000000
--- a/pages/mall/admin/user-statistics.uvue
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
-
- 页面参数(query)
- {{ params }}
-
-
-
-
-
-
-
-
diff --git a/pages/mall/admin/user/MemberConfig.uvue b/pages/mall/admin/user/configuration/index.uvue
similarity index 100%
rename from pages/mall/admin/user/MemberConfig.uvue
rename to pages/mall/admin/user/configuration/index.uvue
diff --git a/pages/mall/admin/user/group.uvue b/pages/mall/admin/user/grouping/index.uvue
similarity index 100%
rename from pages/mall/admin/user/group.uvue
rename to pages/mall/admin/user/grouping/index.uvue
diff --git a/pages/mall/admin/user/label.uvue b/pages/mall/admin/user/label/index.uvue
similarity index 100%
rename from pages/mall/admin/user/label.uvue
rename to pages/mall/admin/user/label/index.uvue
diff --git a/pages/mall/admin/user/level.uvue b/pages/mall/admin/user/level/index.uvue
similarity index 100%
rename from pages/mall/admin/user/level.uvue
rename to pages/mall/admin/user/level/index.uvue
diff --git a/pages/mall/admin/user/list.uvue b/pages/mall/admin/user/management/index.uvue
similarity index 100%
rename from pages/mall/admin/user/list.uvue
rename to pages/mall/admin/user/management/index.uvue
diff --git a/pages/mall/admin/user/Statistic.uvue b/pages/mall/admin/user/statistics/index.uvue
similarity index 100%
rename from pages/mall/admin/user/Statistic.uvue
rename to pages/mall/admin/user/statistics/index.uvue
diff --git a/pages/mall/admin/user/user-configuration/index.uvue b/pages/mall/admin/user/user-configuration/index.uvue
deleted file mode 100644
index 24b63f7a..00000000
--- a/pages/mall/admin/user/user-configuration/index.uvue
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/pages/mall/admin/user/user-grouping/index.uvue b/pages/mall/admin/user/user-grouping/index.uvue
deleted file mode 100644
index 71efde80..00000000
--- a/pages/mall/admin/user/user-grouping/index.uvue
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/pages/mall/admin/user/user-label/index.uvue b/pages/mall/admin/user/user-label/index.uvue
deleted file mode 100644
index 056b4908..00000000
--- a/pages/mall/admin/user/user-label/index.uvue
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/pages/mall/admin/user/user-level/index.uvue b/pages/mall/admin/user/user-level/index.uvue
deleted file mode 100644
index 3834ce8f..00000000
--- a/pages/mall/admin/user/user-level/index.uvue
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/pages/mall/admin/user/user-management/index.uvue b/pages/mall/admin/user/user-management/index.uvue
deleted file mode 100644
index d139353b..00000000
--- a/pages/mall/admin/user/user-management/index.uvue
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/pages/mall/admin/user/user-statistics/index.uvue b/pages/mall/admin/user/user-statistics/index.uvue
deleted file mode 100644
index 27a569a2..00000000
--- a/pages/mall/admin/user/user-statistics/index.uvue
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
From 0970fdbac394dba18ff2eff6478c798e585c6868 Mon Sep 17 00:00:00 2001
From: huangzhenbao <17818024429@163.com>
Date: Thu, 5 Feb 2026 18:25:15 +0800
Subject: [PATCH 04/12] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E5=AE=8C=E5=96=84?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E7=BB=93=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
layouts/admin/router/adminComponentMap.uts | 12 ++--
layouts/admin/router/adminRoutes.uts | 12 ++--
pages.json | 4 +-
pages/mall/admin/finance/withdrawal.uvue | 62 ++++++++++++++++--
.../mall/admin/marketing/integral/order.uvue | 4 ++
.../mall/admin/marketing/integral/record.uvue | 31 ++++++++-
pages/mall/admin/product-classification.uvue | 64 ------------------
pages/mall/admin/product-labels.uvue | 64 ------------------
pages/mall/admin/product-management.uvue | 64 ------------------
pages/mall/admin/product-parameters.uvue | 64 ------------------
pages/mall/admin/product-protection.uvue | 64 ------------------
pages/mall/admin/product-reviews.uvue | 65 -------------------
pages/mall/admin/product-specifications.uvue | 64 ------------------
.../index.uvue} | 0
.../product/{label.uvue => labels/index.uvue} | 0
.../{param.uvue => parameters/index.uvue} | 0
.../product/product-classification/index.uvue | 25 -------
.../admin/product/product-label/index.uvue | 25 -------
.../admin/product/product-param/index.uvue | 25 -------
.../product/product-protection/index.uvue | 26 --------
.../admin/product/product-reviews/index.uvue | 25 -------
.../product/product-specifications/index.uvue | 26 --------
.../index.uvue} | 0
.../{reply.uvue => reviews/index.uvue} | 0
.../{attr.uvue => specifications/index.uvue} | 0
25 files changed, 101 insertions(+), 625 deletions(-)
delete mode 100644 pages/mall/admin/product-classification.uvue
delete mode 100644 pages/mall/admin/product-labels.uvue
delete mode 100644 pages/mall/admin/product-management.uvue
delete mode 100644 pages/mall/admin/product-parameters.uvue
delete mode 100644 pages/mall/admin/product-protection.uvue
delete mode 100644 pages/mall/admin/product-reviews.uvue
delete mode 100644 pages/mall/admin/product-specifications.uvue
rename pages/mall/admin/product/{classify.uvue => classification/index.uvue} (100%)
rename pages/mall/admin/product/{label.uvue => labels/index.uvue} (100%)
rename pages/mall/admin/product/{param.uvue => parameters/index.uvue} (100%)
delete mode 100644 pages/mall/admin/product/product-classification/index.uvue
delete mode 100644 pages/mall/admin/product/product-label/index.uvue
delete mode 100644 pages/mall/admin/product/product-param/index.uvue
delete mode 100644 pages/mall/admin/product/product-protection/index.uvue
delete mode 100644 pages/mall/admin/product/product-reviews/index.uvue
delete mode 100644 pages/mall/admin/product/product-specifications/index.uvue
rename pages/mall/admin/product/{protection.uvue => protection/index.uvue} (100%)
rename pages/mall/admin/product/{reply.uvue => reviews/index.uvue} (100%)
rename pages/mall/admin/product/{attr.uvue => specifications/index.uvue} (100%)
diff --git a/layouts/admin/router/adminComponentMap.uts b/layouts/admin/router/adminComponentMap.uts
index afa9c55d..54ec49a4 100644
--- a/layouts/admin/router/adminComponentMap.uts
+++ b/layouts/admin/router/adminComponentMap.uts
@@ -30,12 +30,12 @@ import ProductStatistic from '@/pages/mall/admin/product/product-statistics/inde
import ProductList from '@/pages/mall/admin/product/product-management/index.uvue'
import ProductEdit from '@/pages/mall/admin/product/product-management/edit.uvue'
import ProductMemberPrice from '@/pages/mall/admin/product/product-management/member-price.uvue'
-import ProductClassify from '@/pages/mall/admin/product/classify.uvue'
-import ProductReply from '@/pages/mall/admin/product/reply.uvue'
-import ProductAttr from '@/pages/mall/admin/product/attr.uvue'
-import ProductParam from '@/pages/mall/admin/product/param.uvue'
-import ProductLabel from '@/pages/mall/admin/product/label.uvue'
-import ProductProtection from '@/pages/mall/admin/product/protection.uvue'
+import ProductClassify from '@/pages/mall/admin/product/classification/index.uvue'
+import ProductReply from '@/pages/mall/admin/product/reviews/index.uvue'
+import ProductAttr from '@/pages/mall/admin/product/specifications/index.uvue'
+import ProductParam from '@/pages/mall/admin/product/parameters/index.uvue'
+import ProductLabel from '@/pages/mall/admin/product/labels/index.uvue'
+import ProductProtection from '@/pages/mall/admin/product/protection/index.uvue'
// 导入订单模块(纯组件,不包含 AdminLayout)
import OrderList from '@/pages/mall/admin/order/list.uvue'
diff --git a/layouts/admin/router/adminRoutes.uts b/layouts/admin/router/adminRoutes.uts
index 502dc2ae..b1f90708 100644
--- a/layouts/admin/router/adminRoutes.uts
+++ b/layouts/admin/router/adminRoutes.uts
@@ -301,7 +301,7 @@ export const routes: RouteRecord[] = [
{
id: 'product_productClassify',
title: '商品分类',
- path: '/pages/mall/admin/product/classify',
+ path: '/pages/mall/admin/product/classification/index',
componentKey: 'ProductClassify',
parentId: 'product',
groupId: 'product-manage',
@@ -311,7 +311,7 @@ export const routes: RouteRecord[] = [
{
id: 'product_productAttr',
title: '商品规格',
- path: '/pages/mall/admin/product/attr',
+ path: '/pages/mall/admin/product/specifications/index',
componentKey: 'ProductAttr',
parentId: 'product',
groupId: 'product-manage',
@@ -321,7 +321,7 @@ export const routes: RouteRecord[] = [
{
id: 'product_paramList',
title: '商品参数',
- path: '/pages/mall/admin/product/param',
+ path: '/pages/mall/admin/product/parameters/index',
componentKey: 'ProductParam',
parentId: 'product',
groupId: 'product-manage',
@@ -331,7 +331,7 @@ export const routes: RouteRecord[] = [
{
id: 'product_labelList',
title: '商品标签',
- path: '/pages/mall/admin/product/label',
+ path: '/pages/mall/admin/product/labels/index',
componentKey: 'ProductLabel',
parentId: 'product',
groupId: 'product-manage',
@@ -341,7 +341,7 @@ export const routes: RouteRecord[] = [
{
id: 'product_protectionList',
title: '商品保障',
- path: '/pages/mall/admin/product/protection',
+ path: '/pages/mall/admin/product/protection/index',
componentKey: 'ProductProtection',
parentId: 'product',
groupId: 'product-manage',
@@ -351,7 +351,7 @@ export const routes: RouteRecord[] = [
{
id: 'product_productEvaluate',
title: '商品评论',
- path: '/pages/mall/admin/product/reply',
+ path: '/pages/mall/admin/product/reviews/index',
componentKey: 'ProductReply',
parentId: 'product',
groupId: 'product-manage',
diff --git a/pages.json b/pages.json
index cb78c7e9..b6c72b9d 100644
--- a/pages.json
+++ b/pages.json
@@ -460,7 +460,7 @@
}
},
{
- "path": "product-management",
+ "path": "product/product-management/index",
"style": {
"navigationBarTitleText": "商品管理",
"navigationStyle": "custom"
@@ -633,4 +633,4 @@
"navigationBarBackgroundColor": "#FFFFFF",
"backgroundColor": "#F8F8F8"
}
-}
\ No newline at end of file
+}
diff --git a/pages/mall/admin/finance/withdrawal.uvue b/pages/mall/admin/finance/withdrawal.uvue
index 5d9ef872..61e9980d 100644
--- a/pages/mall/admin/finance/withdrawal.uvue
+++ b/pages/mall/admin/finance/withdrawal.uvue
@@ -5,19 +5,29 @@
时间选择:
-
+
提现状态:
-
+
+
+ {{ statusLabel }}
+
+
+
提现方式:
-
+
+
+ {{ methodLabel }}
+
+
+
搜索:
-
+
@@ -107,9 +117,10 @@
-
-
diff --git a/pages/mall/admin/product-labels.uvue b/pages/mall/admin/product-labels.uvue
deleted file mode 100644
index 0fa9f92e..00000000
--- a/pages/mall/admin/product-labels.uvue
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
- 页面参数(query)
- {{ params }}
-
-
-
-
-
-
-
diff --git a/pages/mall/admin/product-management.uvue b/pages/mall/admin/product-management.uvue
deleted file mode 100644
index ab91ffdb..00000000
--- a/pages/mall/admin/product-management.uvue
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
- 页面参数(query)
- {{ params }}
-
-
-
-
-
-
-
diff --git a/pages/mall/admin/product-parameters.uvue b/pages/mall/admin/product-parameters.uvue
deleted file mode 100644
index 0c28fe61..00000000
--- a/pages/mall/admin/product-parameters.uvue
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
- 页面参数(query)
- {{ params }}
-
-
-
-
-
-
-
diff --git a/pages/mall/admin/product-protection.uvue b/pages/mall/admin/product-protection.uvue
deleted file mode 100644
index f045f2ba..00000000
--- a/pages/mall/admin/product-protection.uvue
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
- 页面参数(query)
- {{ params }}
-
-
-
-
-
-
-
diff --git a/pages/mall/admin/product-reviews.uvue b/pages/mall/admin/product-reviews.uvue
deleted file mode 100644
index aa0afb5b..00000000
--- a/pages/mall/admin/product-reviews.uvue
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
-
- 页面参数(query)
- {{ params }}
-
-
-
-
-
-
-
diff --git a/pages/mall/admin/product-specifications.uvue b/pages/mall/admin/product-specifications.uvue
deleted file mode 100644
index 9fde03b0..00000000
--- a/pages/mall/admin/product-specifications.uvue
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
- 页面参数(query)
- {{ params }}
-
-
-
-
-
-
-
diff --git a/pages/mall/admin/product/classify.uvue b/pages/mall/admin/product/classification/index.uvue
similarity index 100%
rename from pages/mall/admin/product/classify.uvue
rename to pages/mall/admin/product/classification/index.uvue
diff --git a/pages/mall/admin/product/label.uvue b/pages/mall/admin/product/labels/index.uvue
similarity index 100%
rename from pages/mall/admin/product/label.uvue
rename to pages/mall/admin/product/labels/index.uvue
diff --git a/pages/mall/admin/product/param.uvue b/pages/mall/admin/product/parameters/index.uvue
similarity index 100%
rename from pages/mall/admin/product/param.uvue
rename to pages/mall/admin/product/parameters/index.uvue
diff --git a/pages/mall/admin/product/product-classification/index.uvue b/pages/mall/admin/product/product-classification/index.uvue
deleted file mode 100644
index 9d71a55a..00000000
--- a/pages/mall/admin/product/product-classification/index.uvue
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pages/mall/admin/product/product-label/index.uvue b/pages/mall/admin/product/product-label/index.uvue
deleted file mode 100644
index 9d71a55a..00000000
--- a/pages/mall/admin/product/product-label/index.uvue
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pages/mall/admin/product/product-param/index.uvue b/pages/mall/admin/product/product-param/index.uvue
deleted file mode 100644
index 9d71a55a..00000000
--- a/pages/mall/admin/product/product-param/index.uvue
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pages/mall/admin/product/product-protection/index.uvue b/pages/mall/admin/product/product-protection/index.uvue
deleted file mode 100644
index ffe3f945..00000000
--- a/pages/mall/admin/product/product-protection/index.uvue
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pages/mall/admin/product/product-reviews/index.uvue b/pages/mall/admin/product/product-reviews/index.uvue
deleted file mode 100644
index 9d71a55a..00000000
--- a/pages/mall/admin/product/product-reviews/index.uvue
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pages/mall/admin/product/product-specifications/index.uvue b/pages/mall/admin/product/product-specifications/index.uvue
deleted file mode 100644
index 3060a6eb..00000000
--- a/pages/mall/admin/product/product-specifications/index.uvue
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/pages/mall/admin/product/protection.uvue b/pages/mall/admin/product/protection/index.uvue
similarity index 100%
rename from pages/mall/admin/product/protection.uvue
rename to pages/mall/admin/product/protection/index.uvue
diff --git a/pages/mall/admin/product/reply.uvue b/pages/mall/admin/product/reviews/index.uvue
similarity index 100%
rename from pages/mall/admin/product/reply.uvue
rename to pages/mall/admin/product/reviews/index.uvue
diff --git a/pages/mall/admin/product/attr.uvue b/pages/mall/admin/product/specifications/index.uvue
similarity index 100%
rename from pages/mall/admin/product/attr.uvue
rename to pages/mall/admin/product/specifications/index.uvue
From 7a75ab7df45a014d1490fa60352d5f3eb250b1fc Mon Sep 17 00:00:00 2001
From: huangzhenbao <17818024429@163.com>
Date: Fri, 6 Feb 2026 08:40:46 +0800
Subject: [PATCH 05/12] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E5=AE=8C=E6=88=90?=
=?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=9A=84=E5=AE=8C=E5=96=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
layouts/admin/router/adminComponentMap.uts | 259 +++++---------
layouts/admin/router/adminRoutes.uts | 2 +-
main.uts | 8 +-
pages.json | 7 -
pages/mall/admin/setting/system/config.uvue | 373 ++++++++++++++++----
pages/mall/admin/system-settings.uvue | 65 ----
6 files changed, 396 insertions(+), 318 deletions(-)
delete mode 100644 pages/mall/admin/system-settings.uvue
diff --git a/layouts/admin/router/adminComponentMap.uts b/layouts/admin/router/adminComponentMap.uts
index 54ec49a4..b6789ef2 100644
--- a/layouts/admin/router/adminComponentMap.uts
+++ b/layouts/admin/router/adminComponentMap.uts
@@ -6,122 +6,25 @@
* value: 组件引用
*
* 注意:
- * 1. 所有组件必须静态导入,确保打包可分析
+ * 1. 组件已切换为 defineAsyncComponent 异步导入,优化 H5 环境下的加载性能与包体积
* 2. 组件路径使用 @ 别名
* 3. 占位组件统一使用 PlaceholderPage
*/
+import { defineAsyncComponent } from 'vue'
+
// 导入占位组件
import PlaceholderPage from '@/layouts/admin/components/PlaceholderPage.uvue'
// 导入首页(内部组件,不包含 AdminLayout)
import HomeIndex from '@/layouts/admin/pages/HomeIndex.uvue'
-// 导入用户模块(纯组件,不包含 AdminLayout)
-import UserStatistic from '@/pages/mall/admin/user/statistics/index.uvue'
-import UserList from '@/pages/mall/admin/user/management/index.uvue'
-import UserLevel from '@/pages/mall/admin/user/level/index.uvue'
-import UserGroup from '@/pages/mall/admin/user/grouping/index.uvue'
-import UserLabel from '@/pages/mall/admin/user/label/index.uvue'
-import MemberConfig from '@/pages/mall/admin/user/configuration/index.uvue'
-
-// 导入商品模块(纯组件,不包含 AdminLayout)
-import ProductStatistic from '@/pages/mall/admin/product/product-statistics/index.uvue'
-import ProductList from '@/pages/mall/admin/product/product-management/index.uvue'
-import ProductEdit from '@/pages/mall/admin/product/product-management/edit.uvue'
-import ProductMemberPrice from '@/pages/mall/admin/product/product-management/member-price.uvue'
-import ProductClassify from '@/pages/mall/admin/product/classification/index.uvue'
-import ProductReply from '@/pages/mall/admin/product/reviews/index.uvue'
-import ProductAttr from '@/pages/mall/admin/product/specifications/index.uvue'
-import ProductParam from '@/pages/mall/admin/product/parameters/index.uvue'
-import ProductLabel from '@/pages/mall/admin/product/labels/index.uvue'
-import ProductProtection from '@/pages/mall/admin/product/protection/index.uvue'
-
-// 导入订单模块(纯组件,不包含 AdminLayout)
-import OrderList from '@/pages/mall/admin/order/list.uvue'
-import OrderStatistic from '@/pages/mall/admin/order/order-statistics/index.uvue'
-import OrderRefund from '@/pages/mall/admin/order/aftersales-order/index.uvue'
-import OrderCashier from '@/pages/mall/admin/order/cashier-order/index.uvue'
-import OrderVerify from '@/pages/mall/admin/order/write-off-records/index.uvue'
-import OrderConfig from '@/pages/mall/admin/order/order-configuration/index.uvue'
+// 用户、商品、订单模块已改为 defineAsyncComponent 异步加载,移除静态导入以优化 H5 加载性能
// 营销设置模块暂时使用 PlaceholderPage
// 避免循环依赖问题
-import CmsArticle from '@/pages/mall/admin/cms/article/list.uvue'
-import CmsCategory from '@/pages/mall/admin/cms/category/list.uvue'
-import MarketingCouponList from '@/pages/mall/admin/marketing/coupon/list.uvue'
-import MarketingCouponUser from '@/pages/mall/admin/marketing/coupon/user.uvue'
-import MarketingIntegralStatistic from '@/pages/mall/admin/marketing/integral/statistic.uvue'
-import MarketingIntegralProduct from '@/pages/mall/admin/marketing/integral/list.uvue'
-import MarketingIntegralOrder from '@/pages/mall/admin/marketing/integral/order.uvue'
-import MarketingIntegralRecord from '@/pages/mall/admin/marketing/integral/record.uvue'
-import MarketingIntegralConfig from '@/pages/mall/admin/marketing/integral/config.uvue'
-import MarketingLotteryList from '@/pages/mall/admin/marketing/lottery/list.uvue'
-import MarketingLotteryConfig from '@/pages/mall/admin/marketing/lottery/config.uvue'
-import MarketingCombinationProduct from '@/pages/mall/admin/marketing/combination/product.uvue'
-import MarketingCombinationList from '@/pages/mall/admin/marketing/combination/list.uvue'
-import MarketingCombinationCreate from '@/pages/mall/admin/marketing/combination/create.uvue'
-import MarketingSeckillList from '@/pages/mall/admin/marketing/seckill/list.uvue'
-import MarketingSeckillProduct from '@/pages/mall/admin/marketing/seckill/product.uvue'
-import MarketingSeckillConfig from '@/pages/mall/admin/marketing/seckill/config.uvue'
-// 导入财务模块(纯组件)
-import FinanceTransactionStats from '@/pages/mall/admin/finance/transaction_stats.uvue'
-import FinanceWithdrawal from '@/pages/mall/admin/finance/withdrawal.uvue'
-import FinanceInvoice from '@/pages/mall/admin/finance/invoice.uvue'
-import FinanceRecharge from '@/pages/mall/admin/finance/recharge.uvue'
-import FinanceCapitalFlow from '@/pages/mall/admin/finance/capital_flow.uvue'
-import FinanceBill from '@/pages/mall/admin/finance/bill.uvue'
-import FinanceCommission from '@/pages/mall/admin/finance/commission.uvue'
-import FinanceBalanceStats from '@/pages/mall/admin/finance/balance_stats.uvue'
-import FinanceBalanceRecord from '@/pages/mall/admin/finance/balance_record.uvue'
-
-// 导入客服模块
-import KefuList from '@/pages/mall/admin/kefu/list.uvue'
-import KefuWords from '@/pages/mall/admin/kefu/words.uvue'
-import KefuFeedback from '@/pages/mall/admin/kefu/feedback.uvue'
-import KefuAutoReply from '@/pages/mall/admin/kefu/auto_reply.uvue'
-import KefuConfig from '@/pages/mall/admin/kefu/config.uvue'
-
-// 导入装修模块
-import DecorationHome from '@/pages/mall/admin/decoration/home.uvue'
-import DecorationCategory from '@/pages/mall/admin/decoration/category.uvue'
-import DecorationUser from '@/pages/mall/admin/decoration/user.uvue'
-import DecorationData from '@/pages/mall/admin/decoration/data-config.uvue'
-import DecorationStyle from '@/pages/mall/admin/design/theme-style.uvue'
-import DecorationMaterial from '@/pages/mall/admin/design/material.uvue'
-import DecorationLink from '@/pages/mall/admin/design/link-management.uvue'
-
-// 导入直播管理
-import MarketingLiveRoom from '@/pages/mall/admin/marketing/live/room.uvue'
-import MarketingLiveProduct from '@/pages/mall/admin/marketing/live/product.uvue'
-import MarketingLiveAnchor from '@/pages/mall/admin/marketing/live/anchor.uvue'
-
-// 导入用户充值
-import MarketingRechargeQuota from '@/pages/mall/admin/marketing/recharge/quota.uvue'
-import MarketingRechargeConfig from '@/pages/mall/admin/marketing/recharge/config.uvue'
-
-// 导入每日签到
-import MarketingCheckinConfig from '@/pages/mall/admin/marketing/checkin/config.uvue'
-import MarketingCheckinReward from '@/pages/mall/admin/marketing/checkin/reward.uvue'
-
-// 导入新人礼
-import MarketingNewcomerGift from '@/pages/mall/admin/marketing/newcomer/index.uvue'
-
-// 导入付费会员
-import MarketingMemberType from '@/pages/mall/admin/marketing/member/type.uvue'
-import MarketingMemberRight from '@/pages/mall/admin/marketing/member/right.uvue'
-import MarketingMemberCard from '@/pages/mall/admin/marketing/member/card.uvue'
-import MarketingMemberRecord from '@/pages/mall/admin/marketing/member/record.uvue'
-import MarketingMemberConfig from '@/pages/mall/admin/marketing/member/config.uvue'
-
-// 导入维护模块
-import MaintainDevConfig from '@/pages/mall/admin/maintain/dev/config.uvue'
-
-// import StatisticIndex from '@/pages/mall/admin/statistic/index.uvue'
-// import SettingSystemConfig from '@/pages/mall/admin/setting/system/config.uvue'
-// import SettingSystemAdmin from '@/pages/mall/admin/setting/system/admin.uvue'
-// import SettingSystemRole from '@/pages/mall/admin/setting/system/role.uvue'
+// 营销、内容、财务、客服、装修等模块已改为 defineAsyncComponent 异步加载,移除静态导入以优化 H5 加载性能
/**
* 组件映射表
@@ -131,97 +34,97 @@ export const componentMap: Map = new Map([
['HomeIndex', HomeIndex],
// 用户模块
- ['UserStatistic', UserStatistic],
- ['UserList', UserList],
- ['UserLevel', UserLevel],
- ['UserGroup', UserGroup],
- ['UserLabel', UserLabel],
- ['UserMemberConfig', MemberConfig],
+ ['UserStatistic', defineAsyncComponent(() => import('@/pages/mall/admin/user/statistics/index.uvue'))],
+ ['UserList', defineAsyncComponent(() => import('@/pages/mall/admin/user/management/index.uvue'))],
+ ['UserLevel', defineAsyncComponent(() => import('@/pages/mall/admin/user/level/index.uvue'))],
+ ['UserGroup', defineAsyncComponent(() => import('@/pages/mall/admin/user/grouping/index.uvue'))],
+ ['UserLabel', defineAsyncComponent(() => import('@/pages/mall/admin/user/label/index.uvue'))],
+ ['UserMemberConfig', defineAsyncComponent(() => import('@/pages/mall/admin/user/configuration/index.uvue'))],
// 商品模块
- ['ProductStatistic', ProductStatistic],
- ['ProductList', ProductList],
- ['ProductEdit', ProductEdit],
- ['ProductMemberPrice', ProductMemberPrice],
- ['ProductClassify', ProductClassify],
- ['ProductReply', ProductReply],
- ['ProductAttr', ProductAttr],
- ['ProductParam', ProductParam],
- ['ProductLabel', ProductLabel],
- ['ProductProtection', ProductProtection],
+ ['ProductStatistic', defineAsyncComponent(() => import('@/pages/mall/admin/product/product-statistics/index.uvue'))],
+ ['ProductList', defineAsyncComponent(() => import('@/pages/mall/admin/product/product-management/index.uvue'))],
+ ['ProductEdit', defineAsyncComponent(() => import('@/pages/mall/admin/product/product-management/edit.uvue'))],
+ ['ProductMemberPrice', defineAsyncComponent(() => import('@/pages/mall/admin/product/product-management/member-price.uvue'))],
+ ['ProductClassify', defineAsyncComponent(() => import('@/pages/mall/admin/product/classification/index.uvue'))],
+ ['ProductReply', defineAsyncComponent(() => import('@/pages/mall/admin/product/reviews/index.uvue'))],
+ ['ProductAttr', defineAsyncComponent(() => import('@/pages/mall/admin/product/specifications/index.uvue'))],
+ ['ProductParam', defineAsyncComponent(() => import('@/pages/mall/admin/product/parameters/index.uvue'))],
+ ['ProductLabel', defineAsyncComponent(() => import('@/pages/mall/admin/product/labels/index.uvue'))],
+ ['ProductProtection', defineAsyncComponent(() => import('@/pages/mall/admin/product/protection/index.uvue'))],
// 订单模块
- ['OrderList', OrderList],
- ['OrderStatistic', OrderStatistic],
- ['OrderRefund', OrderRefund],
- ['OrderCashier', OrderCashier],
- ['OrderVerify', OrderVerify],
- ['OrderConfig', OrderConfig],
+ ['OrderList', defineAsyncComponent(() => import('@/pages/mall/admin/order/list.uvue'))],
+ ['OrderStatistic', defineAsyncComponent(() => import('@/pages/mall/admin/order/order-statistics/index.uvue'))],
+ ['OrderRefund', defineAsyncComponent(() => import('@/pages/mall/admin/order/aftersales-order/index.uvue'))],
+ ['OrderCashier', defineAsyncComponent(() => import('@/pages/mall/admin/order/cashier-order/index.uvue'))],
+ ['OrderVerify', defineAsyncComponent(() => import('@/pages/mall/admin/order/write-off-records/index.uvue'))],
+ ['OrderConfig', defineAsyncComponent(() => import('@/pages/mall/admin/order/order-configuration/index.uvue'))],
- // 营销模块
+ // 营销模块已改为异步加载
// 1. 优惠券
- ['MarketingCouponList', MarketingCouponList],
- ['MarketingCouponUser', MarketingCouponUser],
+ ['MarketingCouponList', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/coupon/list.uvue'))],
+ ['MarketingCouponUser', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/coupon/user.uvue'))],
// 2. 积分管理
- ['MarketingIntegralStatistic', MarketingIntegralStatistic],
- ['MarketingIntegralProduct', MarketingIntegralProduct],
- ['MarketingIntegralOrder', MarketingIntegralOrder],
- ['MarketingIntegralRecord', MarketingIntegralRecord],
- ['MarketingIntegralConfig', MarketingIntegralConfig],
+ ['MarketingIntegralStatistic', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/integral/statistic.uvue'))],
+ ['MarketingIntegralProduct', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/integral/list.uvue'))],
+ ['MarketingIntegralOrder', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/integral/order.uvue'))],
+ ['MarketingIntegralRecord', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/integral/record.uvue'))],
+ ['MarketingIntegralConfig', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/integral/config.uvue'))],
// 3. 抽奖管理
- ['MarketingLotteryList', MarketingLotteryList],
- ['MarketingLotteryConfig', MarketingLotteryConfig],
+ ['MarketingLotteryList', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/lottery/list.uvue'))],
+ ['MarketingLotteryConfig', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/lottery/config.uvue'))],
// 4. 砍价管理
['MarketingBargainProduct', PlaceholderPage],
['MarketingBargainList', PlaceholderPage],
// 5. 拼团管理
- ['MarketingCombinationProduct', MarketingCombinationProduct],
- ['MarketingCombinationList', MarketingCombinationList],
- ['MarketingCombinationCreate', MarketingCombinationCreate],
+ ['MarketingCombinationProduct', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/combination/product.uvue'))],
+ ['MarketingCombinationList', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/combination/list.uvue'))],
+ ['MarketingCombinationCreate', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/combination/create.uvue'))],
// 6. 秒杀管理
- ['MarketingSeckillList', MarketingSeckillList],
- ['MarketingSeckillProduct', MarketingSeckillProduct],
- ['MarketingSeckillConfig', MarketingSeckillConfig],
+ ['MarketingSeckillList', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/seckill/list.uvue'))],
+ ['MarketingSeckillProduct', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/seckill/product.uvue'))],
+ ['MarketingSeckillConfig', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/seckill/config.uvue'))],
// 7. 付费会员
- ['MarketingMemberType', MarketingMemberType],
- ['MarketingMemberRight', MarketingMemberRight],
- ['MarketingMemberCard', MarketingMemberCard],
- ['MarketingMemberRecord', MarketingMemberRecord],
- ['MarketingMemberConfig', MarketingMemberConfig],
+ ['MarketingMemberType', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/member/type.uvue'))],
+ ['MarketingMemberRight', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/member/right.uvue'))],
+ ['MarketingMemberCard', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/member/card.uvue'))],
+ ['MarketingMemberRecord', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/member/record.uvue'))],
+ ['MarketingMemberConfig', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/member/config.uvue'))],
// 8. 直播管理
- ['MarketingLiveRoom', MarketingLiveRoom],
- ['MarketingLiveProduct', MarketingLiveProduct],
- ['MarketingLiveAnchor', MarketingLiveAnchor],
+ ['MarketingLiveRoom', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/live/room.uvue'))],
+ ['MarketingLiveProduct', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/live/product.uvue'))],
+ ['MarketingLiveAnchor', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/live/anchor.uvue'))],
// 9. 用户充值
- ['MarketingRechargeQuota', MarketingRechargeQuota],
- ['MarketingRechargeConfig', MarketingRechargeConfig],
+ ['MarketingRechargeQuota', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/recharge/quota.uvue'))],
+ ['MarketingRechargeConfig', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/recharge/config.uvue'))],
// 10. 每日签到
- ['MarketingCheckinConfig', MarketingCheckinConfig],
- ['MarketingCheckinReward', MarketingCheckinReward],
+ ['MarketingCheckinConfig', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/checkin/config.uvue'))],
+ ['MarketingCheckinReward', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/checkin/reward.uvue'))],
// 11. 渠道码 & 新人礼
['MarketingChannelList', PlaceholderPage],
- ['MarketingNewcomerGift', MarketingNewcomerGift],
+ ['MarketingNewcomerGift', defineAsyncComponent(() => import('@/pages/mall/admin/marketing/newcomer/index.uvue'))],
// 内容模块
- ['CmsArticle', CmsArticle],
- ['CmsCategory', CmsCategory],
+ ['CmsArticle', defineAsyncComponent(() => import('@/pages/mall/admin/cms/article/list.uvue'))],
+ ['CmsCategory', defineAsyncComponent(() => import('@/pages/mall/admin/cms/category/list.uvue'))],
// 财务模块
- ['FinanceTransactionStats', FinanceTransactionStats],
- ['FinanceWithdrawal', FinanceWithdrawal],
- ['FinanceInvoice', FinanceInvoice],
- ['FinanceRecharge', FinanceRecharge],
- ['FinanceCapitalFlow', FinanceCapitalFlow],
- ['FinanceBill', FinanceBill],
- ['FinanceCommission', FinanceCommission],
- ['FinanceBalanceStats', FinanceBalanceStats],
- ['FinanceBalanceRecord', FinanceBalanceRecord],
+ ['FinanceTransactionStats', defineAsyncComponent(() => import('@/pages/mall/admin/finance/transaction_stats.uvue'))],
+ ['FinanceWithdrawal', defineAsyncComponent(() => import('@/pages/mall/admin/finance/withdrawal.uvue'))],
+ ['FinanceInvoice', defineAsyncComponent(() => import('@/pages/mall/admin/finance/invoice.uvue'))],
+ ['FinanceRecharge', defineAsyncComponent(() => import('@/pages/mall/admin/finance/recharge.uvue'))],
+ ['FinanceCapitalFlow', defineAsyncComponent(() => import('@/pages/mall/admin/finance/capital_flow.uvue'))],
+ ['FinanceBill', defineAsyncComponent(() => import('@/pages/mall/admin/finance/bill.uvue'))],
+ ['FinanceCommission', defineAsyncComponent(() => import('@/pages/mall/admin/finance/commission.uvue'))],
+ ['FinanceBalanceStats', defineAsyncComponent(() => import('@/pages/mall/admin/finance/balance_stats.uvue'))],
+ ['FinanceBalanceRecord', defineAsyncComponent(() => import('@/pages/mall/admin/finance/balance_record.uvue'))],
// 数据模块 - 暂时使用占位组件
['StatisticIndex', PlaceholderPage],
// 设置模块 - 暂时使用占位组件
- ['SettingSystemConfig', PlaceholderPage],
+ ['SettingSystemConfig', defineAsyncComponent(() => import('@/pages/mall/admin/setting/system/config.uvue'))],
['SettingSystemAdmin', PlaceholderPage],
['SettingSystemRole', PlaceholderPage],
@@ -231,27 +134,27 @@ export const componentMap: Map = new Map([
['DistributionConfig', PlaceholderPage],
// 客服模块
- ['KefuList', KefuList],
- ['KefuWords', KefuWords],
- ['KefuFeedback', KefuFeedback],
- ['KefuAutoReply', KefuAutoReply],
- ['KefuConfig', KefuConfig],
+ ['KefuList', defineAsyncComponent(() => import('@/pages/mall/admin/kefu/list.uvue'))],
+ ['KefuWords', defineAsyncComponent(() => import('@/pages/mall/admin/kefu/words.uvue'))],
+ ['KefuFeedback', defineAsyncComponent(() => import('@/pages/mall/admin/kefu/feedback.uvue'))],
+ ['KefuAutoReply', defineAsyncComponent(() => import('@/pages/mall/admin/kefu/auto_reply.uvue'))],
+ ['KefuConfig', defineAsyncComponent(() => import('@/pages/mall/admin/kefu/config.uvue'))],
// 装修模块
- ['DecorationHome', DecorationHome],
- ['DecorationCategory', DecorationCategory],
- ['DecorationUser', DecorationUser],
- ['DecorationData', DecorationData],
- ['DecorationStyle', DecorationStyle],
- ['DecorationMaterial', DecorationMaterial],
- ['DecorationLink', DecorationLink],
+ ['DecorationHome', defineAsyncComponent(() => import('@/pages/mall/admin/decoration/home.uvue'))],
+ ['DecorationCategory', defineAsyncComponent(() => import('@/pages/mall/admin/decoration/category.uvue'))],
+ ['DecorationUser', defineAsyncComponent(() => import('@/pages/mall/admin/decoration/user.uvue'))],
+ ['DecorationData', defineAsyncComponent(() => import('@/pages/mall/admin/decoration/data-config.uvue'))],
+ ['DecorationStyle', defineAsyncComponent(() => import('@/pages/mall/admin/design/theme-style.uvue'))],
+ ['DecorationMaterial', defineAsyncComponent(() => import('@/pages/mall/admin/design/material.uvue'))],
+ ['DecorationLink', defineAsyncComponent(() => import('@/pages/mall/admin/design/link-management.uvue'))],
// 应用模块
['AppStatistic', PlaceholderPage],
['AppList', PlaceholderPage],
// 维护模块
- ['MaintainDevConfig', MaintainDevConfig],
+ ['MaintainDevConfig', defineAsyncComponent(() => import('@/pages/mall/admin/maintain/dev/config.uvue'))],
['MaintainDevData', PlaceholderPage],
['MaintainDevTask', PlaceholderPage],
['MaintainDevAuth', PlaceholderPage],
diff --git a/layouts/admin/router/adminRoutes.uts b/layouts/admin/router/adminRoutes.uts
index b1f90708..3c8407c9 100644
--- a/layouts/admin/router/adminRoutes.uts
+++ b/layouts/admin/router/adminRoutes.uts
@@ -894,7 +894,7 @@ export const routes: RouteRecord[] = [
// ========== 设置模块 ==========
{
id: 'setting_systemConfig',
- title: '系统配置',
+ title: '系统设置',
path: '/pages/mall/admin/setting/system/config',
componentKey: 'SettingSystemConfig',
parentId: 'setting',
diff --git a/main.uts b/main.uts
index da42848e..3e40f0b5 100644
--- a/main.uts
+++ b/main.uts
@@ -7,11 +7,9 @@ export function createApp() {
// 注册 i18n 全局属性,使组件可以使用 $t 方法
app.config.globalProperties.$t = (key: string, values?: any, locale?: string): string => {
- if (!i18n.global) {
- console.error('i18n is not initialized')
- return key
- }
- return i18n.global.t(key, values, locale) || key
+ // 临时方案:移除对未定义 i18n 的引用,直接返回 Key
+ // 如果之后需要 i18n,应正确导入并初始化
+ return key
}
return { app }
diff --git a/pages.json b/pages.json
index b6c72b9d..590bdf88 100644
--- a/pages.json
+++ b/pages.json
@@ -487,13 +487,6 @@
"navigationStyle": "custom"
}
},
- {
- "path": "system-settings",
- "style": {
- "navigationBarTitleText": "系统设置",
- "navigationStyle": "custom"
- }
- },
{
"path": "subscription/plan-management",
"style": {
diff --git a/pages/mall/admin/setting/system/config.uvue b/pages/mall/admin/setting/system/config.uvue
index 8ac661b7..e2e14b17 100644
--- a/pages/mall/admin/setting/system/config.uvue
+++ b/pages/mall/admin/setting/system/config.uvue
@@ -1,81 +1,330 @@
-
-
-
-
-
- 页面占位
- 该功能模块正在开发中
- 当前采用 CRMEB 路由体系 1:1 映射
+
+
+
+
+
+
+
+ {{ tab.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 站点开启:
+
+
+
+
+
+ 站点开启/关闭(用于升级等临时关闭),关闭后前端会弹窗显示站点升级中,请稍后访问
+
+
+
+ 网站名称:
+
+
+ 网站名称很多地方会显示的,建议认真填写
+
+
+
+ 网站地址:
+
+
+ 安装自动配置,不要轻易修改,更换后会影响网站访问、接口请求、本地文件储存、支付回调、微信授权、支付、小程序图片访问、部分二维码、官方授权等
+
+
+
+ 消息队列:
+
+
+
+
+
+ 是否启用消息队列,启用后提升程序运行速度,启用前必须配置Redis缓存,文档地址:https://doc.crmeb.com/single/crmeb_v4/7217
+
+
+
+ 联系电话:
+
+
+ 联系电话
+
+
+
+ 授权密钥:
+
+
+
+
+
+
+
+
+
+ 分享图片:
+
+ 上传图片
+ 分享图片比例5:4,建议小于50KB
+
+
+
+ 分享标题:
+
+
+
+
+
+ 分享简介:
+
+
+
+
+
+
+
+
+
+ 后台登录LOGO:
+
+ 上传截图
+ 建议尺寸270*75
+
+
+
+ 后台小LOGO:
+
+ 上传图片
+ 建议尺寸180*180
+
+
+
+ 后台大LOGO:
+
+ 上传图片
+ 建议尺寸170*50
+
+
+
+
+
+
+
+ 移动端JS:
+
+
+
+
+
+ 管理端JS:
+
+
+
+
+
+ PC端JS:
+
+
+
+
+
+
+
+
+
+ 腾讯地图KEY:
+
+
+ 申请地址:https://lbs.qq.com
+
+
+
+
+
+
+
+ 备案号:
+
+
+
+
+
+ ICP链接:
+
+
+
+
+
+
+
+
+
+ 功能开启:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 远程登录地址:
+
+
+
+
+
+
+
+
+
+ WAF类型:
+
+
+
+
+
+
+ WAF类型:关闭(所有参数都能正常请求),拦截(匹配到WAF配置的参数阻断接口请求),过滤(匹配到WAF配置的参数过滤参数,正常请求接口)
+
+
+
+ WAF配置:
+
+
+ WAF配置验证参数,过滤掉不需要的参数或拦截请求,多个参数用回车换行分隔
+
+
+
+
+
+
+
+
+
+
+
-
+.waf-textarea { height: 200px; }
+.code-bg { background-color: #f5f7fa; font-family: "Lucida Console", Monaco, monospace; }
+
+.form-tip { font-size: 12px; color: #c0c4cc; margin-top: 8px; line-height: 1.5; width: 550px; }
+
+.radio-group, .checkbox-group { display: flex; flex-direction: row; align-items: center; min-height: 32px; }
+.radio-label, .checkbox-label { display: flex; flex-direction: row; align-items: center; margin-right: 30px; font-size: 14px; color: #606266; cursor: pointer; }
+
+.upload-placeholder { width: 80px; height: 80px; border: 1px dashed #dcdfe6; border-radius: 4px; display: flex; align-items: center; justify-content: center; font-size: 12px; color: #909399; cursor: pointer; transition: all .2s; }
+.upload-placeholder:hover { border-color: #409eff; color: #409eff; }
+
+.submit-section { display: flex; flex-direction: row; margin-top: 20px; padding-top: 10px; }
+.btn-submit { background-color: #1890ff; color: #fff; width: 65px; height: 32px; line-height: 32px; font-size: 14px; border-radius: 4px; margin: 0; border: none; cursor: pointer; text-align: center; }
+.btn-submit:active { background-color: #096dd9; }
+
\ No newline at end of file
diff --git a/pages/mall/admin/system-settings.uvue b/pages/mall/admin/system-settings.uvue
deleted file mode 100644
index 7a4538e4..00000000
--- a/pages/mall/admin/system-settings.uvue
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
-
- 页面参数(query)
- {{ params }}
-
-
-
-
-
-
-
-
From 9eaf5c1a645bc2bf964bec68b061398cd50d751d Mon Sep 17 00:00:00 2001
From: huangzhenbao <17818024429@163.com>
Date: Fri, 6 Feb 2026 10:14:46 +0800
Subject: [PATCH 06/12] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=A1=B5=E9=9D=A2?=
=?UTF-8?q?=E5=B8=83=E5=B1=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
layouts/admin/AdminLayout.uvue | 141 ++++++--
layouts/admin/components/AdminAside.uvue | 24 +-
layouts/admin/components/AdminSubsider.uvue | 315 +++++++++++-------
layouts/admin/router/adminComponentMap.uts | 21 +-
layouts/admin/router/adminRoutes.uts | 201 ++++++++++-
layouts/admin/router/settingSubSiderMenu.uts | 37 ++
layouts/admin/store/adminNavStore.uts | 18 +
layouts/admin/store/tagsViewStore.uts | 126 +++++++
pages/mall/admin/setting/agreement.uvue | 23 ++
pages/mall/admin/setting/auth/admin.uvue | 23 ++
pages/mall/admin/setting/auth/permission.uvue | 23 ++
pages/mall/admin/setting/auth/role.uvue | 23 ++
pages/mall/admin/setting/delivery/staff.uvue | 23 ++
.../mall/admin/setting/delivery/station.uvue | 23 ++
.../mall/admin/setting/delivery/template.uvue | 23 ++
.../mall/admin/setting/interface/collect.uvue | 23 ++
.../mall/admin/setting/interface/e-sheet.uvue | 23 ++
.../admin/setting/interface/logistics.uvue | 23 ++
.../setting/interface/onepass/config.uvue | 23 ++
.../setting/interface/onepass/index.uvue | 23 ++
.../mall/admin/setting/interface/payment.uvue | 23 ++
pages/mall/admin/setting/interface/sms.uvue | 23 ++
.../mall/admin/setting/interface/storage.uvue | 23 ++
pages/mall/admin/setting/message.uvue | 23 ++
.../mall/admin/setting/system/agreement.uvue | 23 ++
pages/mall/admin/setting/system/message.uvue | 23 ++
pages/mall/admin/setting/system/ticket.uvue | 23 ++
pages/mall/admin/setting/ticket.uvue | 23 ++
28 files changed, 1166 insertions(+), 177 deletions(-)
create mode 100644 layouts/admin/router/settingSubSiderMenu.uts
create mode 100644 layouts/admin/store/tagsViewStore.uts
create mode 100644 pages/mall/admin/setting/agreement.uvue
create mode 100644 pages/mall/admin/setting/auth/admin.uvue
create mode 100644 pages/mall/admin/setting/auth/permission.uvue
create mode 100644 pages/mall/admin/setting/auth/role.uvue
create mode 100644 pages/mall/admin/setting/delivery/staff.uvue
create mode 100644 pages/mall/admin/setting/delivery/station.uvue
create mode 100644 pages/mall/admin/setting/delivery/template.uvue
create mode 100644 pages/mall/admin/setting/interface/collect.uvue
create mode 100644 pages/mall/admin/setting/interface/e-sheet.uvue
create mode 100644 pages/mall/admin/setting/interface/logistics.uvue
create mode 100644 pages/mall/admin/setting/interface/onepass/config.uvue
create mode 100644 pages/mall/admin/setting/interface/onepass/index.uvue
create mode 100644 pages/mall/admin/setting/interface/payment.uvue
create mode 100644 pages/mall/admin/setting/interface/sms.uvue
create mode 100644 pages/mall/admin/setting/interface/storage.uvue
create mode 100644 pages/mall/admin/setting/message.uvue
create mode 100644 pages/mall/admin/setting/system/agreement.uvue
create mode 100644 pages/mall/admin/setting/system/message.uvue
create mode 100644 pages/mall/admin/setting/system/ticket.uvue
create mode 100644 pages/mall/admin/setting/ticket.uvue
diff --git a/layouts/admin/AdminLayout.uvue b/layouts/admin/AdminLayout.uvue
index c8458b4f..09e51631 100644
--- a/layouts/admin/AdminLayout.uvue
+++ b/layouts/admin/AdminLayout.uvue
@@ -22,14 +22,15 @@
@@ -86,9 +87,12 @@ import {
} from '@/layouts/admin/router/adminRoutes.uts'
import type { TopMenu, MenuGroup, RouteRecord } from '@/layouts/admin/router/adminRoutes.uts'
+import { MenuNode, settingSubSiderMenu } from '@/layouts/admin/router/settingSubSiderMenu.uts'
+
import {
activeTopMenuId,
activeRouteId,
+ lastSubIdByMenu,
tabs,
isMainAsideCollapsed,
showSubSider,
@@ -123,20 +127,66 @@ const isSubSiderOverlay = computed(() => {
return layoutMode.value === 'tablet'
})
+// 当前路由的路径
+const currentRoutePath = computed(() => {
+ const route = findRouteById(activeRouteId.value)
+ return route ? route.path : ''
+})
+
+// 将旧的 Group + Routes 转换为新的 Tree 结构 (支持 3 级嵌套)
+const activeMenuTree = computed(() => {
+ if (activeTopMenuId.value === 'setting') {
+ return settingSubSiderMenu
+ }
+
+ const tree: MenuNode[] = []
+ activeGroups.value.forEach(group => {
+ const routes = activeRoutes.value.get(group.id)
+ if (routes != null && routes.length > 0) {
+ const children: MenuNode[] = []
+ routes.forEach(route => {
+ children.push({
+ id: route.id,
+ title: route.title,
+ type: 'page',
+ path: route.path
+ } as MenuNode)
+ })
+
+ // 1:1 复刻 CRMEB: 如果分组标题为空,直接将子菜单平铺在顶层,不渲染分组行
+ if (group.title === '') {
+ children.forEach(child => {
+ tree.push(child)
+ })
+ } else {
+ tree.push({
+ id: group.id,
+ title: group.title,
+ type: 'group',
+ children: children
+ } as MenuNode)
+ }
+ }
+ })
+
+ return tree
+})
+
/**
* 核心逻辑:二级菜单是否可见
- * 1. 如果有子菜单内容 (activeGroups > 0)
+ * 1. 如果有子菜单内容 (activeMenuTree > 0)
* 2. 如果是 Desktop 且 showSubSider 为真 (Dock模式)
* 3. 如果是 Tablet/Mobile 且 isOverlayVisible 为真 (Overlay模式)
*/
const isSubSiderVisible = computed(() => {
- if (activeGroups.value.length === 0) return false
+ // 首页模块通常不显示 SubSider
+ if (activeTopMenuId.value === 'home' || activeMenuTree.value.length === 0) return false
if (layoutMode.value === 'desktop') {
return showSubSider.value
}
- // Tablet 和 Mobile 模式下,作为 Overlay 受 isOverlayVisible 控制
+ // Tablet 和 Mobile 模式下,直接由 isOverlayVisible 控制
return isOverlayVisible.value
})
@@ -155,7 +205,7 @@ const mainLeft = computed(() => {
let left = ASIDE_W // 只要不是 Mobile,主侧栏 70px 始终 Dock
// 只有在 Desktop 模式且二级菜单处于 Dock 模式显示时,才累加宽度
- if (layoutMode.value === 'desktop' && showSubSider.value && activeGroups.value.length > 0) {
+ if (layoutMode.value === 'desktop' && showSubSider.value && activeMenuTree.value.length > 0) {
left += SUB_W
}
@@ -199,6 +249,24 @@ const currentComponent = computed(() => {
return getComponent(route.componentKey)
})
+// 监听路由变化,同步状态 (处理从 Tabs 或外部跳转的情况)
+watch(() => activeRouteId.value, (newId) => {
+ const route = findRouteById(newId)
+ if (route && route.parentId) {
+ // 同步一级菜单
+ if (activeTopMenuId.value !== route.parentId) {
+ activeTopMenuId.value = route.parentId
+ }
+ // 同步最后访问记录
+ lastSubIdByMenu.value[route.parentId] = newId
+
+ // 如果是 Desktop 且 SubSider 关着,自动打开(除非用户手动关了)
+ if (layoutMode.value === 'desktop' && !showSubSider.value) {
+ showSubSider.value = true
+ }
+ }
+}, { immediate: true })
+
// ============================================
// 事件处理
// ============================================
@@ -206,27 +274,46 @@ const currentComponent = computed(() => {
function onTopMenuClick(menu: TopMenu): void {
activeTopMenuId.value = menu.id
- // 1:1 复刻 CRMEB 交互:
- // 1. 如果有子菜单:Desktop 下 dock,Tablet/Mobile 下唤起 Overlay
- if (menu.groups.length > 0) {
- if (layoutMode.value === 'desktop') {
- showSubSider.value = true
- } else {
- isOverlayVisible.value = true
- }
+ // 1:1 复刻 CRMEB 交互:点击 Aside 立即展示 SubSider
+ if (layoutMode.value === 'desktop') {
+ showSubSider.value = true
} else {
- // 2. 如果没有子菜单:直接跳转并关闭所有 Overlay
+ isOverlayVisible.value = true
+ isMobileMenuOpen.value = false // 如果主侧栏开着,关掉它,开二级
+ }
+
+ // 1:1 复刻 CRMEB 交互:点击一级菜单后,自动跳转到上一次记录的子页面或第一个子页面
+ let targetId = lastSubIdByMenu.value[menu.id]
+ if (!targetId && activeMenuTree.value.length > 0) {
+ const firstNode = activeMenuTree.value[0]
+ if (firstNode.type === 'page') {
+ targetId = firstNode.id
+ } else if (firstNode.children != null && firstNode.children!.length > 0) {
+ targetId = firstNode.children![0].id
+ }
+ }
+
+ if (targetId) {
+ openRoute(targetId)
+ } else {
+ // 兜底逻辑:如果没有二级菜单,跳转到 index
openRoute(menu.id + '_index')
- closeAllMenu()
}
}
-function onRouteClick(routeId: string): void {
- openRoute(routeId)
- // 1:1 复刻 CRMEB:在移动端或平板叠加模式下,点击具体子路由后自动收起
- if (layoutMode.value !== 'desktop') {
- closeAllMenu()
- }
+function onSubClick(payload: { id: string, path: string }): void {
+ // CRMEB 跳转逻辑
+ openRoute(payload.id)
+
+ // 更新最后访问记录
+ lastSubIdByMenu.value[activeTopMenuId.value] = payload.id
+
+ // 重要:1:1 复刻 CRMEB,点击二级菜单项后,SubSider 通常保持显示状态
+ // 只有在 Mobile 模式下,用户如果是想“跳转并收起”,通常需要点击遮罩或关闭按钮,但这里我们按桌面版常驻逻辑
+ // 如果需要移动端点击自动关闭,才解开下面注释
+ // if (layoutMode.value === 'mobile') {
+ // closeAllMenu()
+ // }
}
function onTabClick(tab: TabItem): void {
diff --git a/layouts/admin/components/AdminAside.uvue b/layouts/admin/components/AdminAside.uvue
index cb424d26..b2870425 100644
--- a/layouts/admin/components/AdminAside.uvue
+++ b/layouts/admin/components/AdminAside.uvue
@@ -109,45 +109,34 @@ function onLogoClick(): void {
.aside-menu {
flex: 1;
- padding: 8px 0;
+ padding: 0; /* CRMEB typically no padding here */
overflow-y: scroll;
}
.menu-item {
- height: 60px;
+ height: 50px; /* 1:1 CRMEB columnsAside height */
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
cursor: pointer;
- color: rgba(255, 255, 255, 0.65);
+ color: rgba(255, 255, 255, 0.7);
transition: all 0.3s;
position: relative;
&:hover {
background: rgba(255, 255, 255, 0.05);
- color: #fff;
}
&.active {
- background: #1890ff;
+ background: #1890ff; /* CRMEB 主色蓝 */
color: #fff;
-
- &::before {
- content: '';
- position: absolute;
- left: 0;
- top: 0;
- bottom: 0;
- width: 3px;
- background: #fff;
- }
}
}
.menu-icon {
- font-size: 24px;
- margin-bottom: 4px;
+ font-size: 18px; /* CRMEB icons are smaller than 24px usually */
+ margin-bottom: 2px;
.icon-text {
display: block;
@@ -156,6 +145,7 @@ function onLogoClick(): void {
.menu-title {
font-size: 12px;
+ transform: scale(0.9); /* CRMEB text is tiny */
text-align: center;
text {
diff --git a/layouts/admin/components/AdminSubsider.uvue b/layouts/admin/components/AdminSubsider.uvue
index 1bd2aa0e..9b2f21e7 100644
--- a/layouts/admin/components/AdminSubsider.uvue
+++ b/layouts/admin/components/AdminSubsider.uvue
@@ -1,57 +1,160 @@
-
diff --git a/layouts/admin/router/adminComponentMap.uts b/layouts/admin/router/adminComponentMap.uts
index b6789ef2..8a7a2c60 100644
--- a/layouts/admin/router/adminComponentMap.uts
+++ b/layouts/admin/router/adminComponentMap.uts
@@ -123,10 +123,25 @@ export const componentMap: Map = new Map([
// 数据模块 - 暂时使用占位组件
['StatisticIndex', PlaceholderPage],
- // 设置模块 - 暂时使用占位组件
+ // 设置模块
['SettingSystemConfig', defineAsyncComponent(() => import('@/pages/mall/admin/setting/system/config.uvue'))],
- ['SettingSystemAdmin', PlaceholderPage],
- ['SettingSystemRole', PlaceholderPage],
+ ['SettingMessage', defineAsyncComponent(() => import('@/pages/mall/admin/setting/message.uvue'))],
+ ['SettingAgreement', defineAsyncComponent(() => import('@/pages/mall/admin/setting/agreement.uvue'))],
+ ['SettingTicket', defineAsyncComponent(() => import('@/pages/mall/admin/setting/ticket.uvue'))],
+ ['SettingAuthRole', defineAsyncComponent(() => import('@/pages/mall/admin/setting/auth/role.uvue'))],
+ ['SettingAuthAdmin', defineAsyncComponent(() => import('@/pages/mall/admin/setting/auth/admin.uvue'))],
+ ['SettingAuthPermission', defineAsyncComponent(() => import('@/pages/mall/admin/setting/auth/permission.uvue'))],
+ ['SettingDeliveryStaff', defineAsyncComponent(() => import('@/pages/mall/admin/setting/delivery/staff.uvue'))],
+ ['SettingDeliveryStation', defineAsyncComponent(() => import('@/pages/mall/admin/setting/delivery/station.uvue'))],
+ ['SettingDeliveryTemplate', defineAsyncComponent(() => import('@/pages/mall/admin/setting/delivery/template.uvue'))],
+ ['SettingInterfaceOnepassConfig', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/onepass/config.uvue'))],
+ ['SettingInterfaceOnepassIndex', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/onepass/index.uvue'))],
+ ['SettingInterfaceStorage', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/storage.uvue'))],
+ ['SettingInterfaceCollect', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/collect.uvue'))],
+ ['SettingInterfaceLogistics', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/logistics.uvue'))],
+ ['SettingInterfaceESheet', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/e-sheet.uvue'))],
+ ['SettingInterfaceSms', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/sms.uvue'))],
+ ['SettingInterfacePayment', defineAsyncComponent(() => import('@/pages/mall/admin/setting/interface/payment.uvue'))],
// 分销模块
['DistributionStatistic', PlaceholderPage],
diff --git a/layouts/admin/router/adminRoutes.uts b/layouts/admin/router/adminRoutes.uts
index 3c8407c9..81a20135 100644
--- a/layouts/admin/router/adminRoutes.uts
+++ b/layouts/admin/router/adminRoutes.uts
@@ -92,7 +92,7 @@ export const topMenus: TopMenu[] = [
path: '/pages/mall/admin/product/statistic',
order: 4,
groups: [
- { id: 'product-manage', title: '商品管理', order: 1 }
+ { id: 'product-manage', title: '', order: 1 }
]
},
{
@@ -156,7 +156,7 @@ export const topMenus: TopMenu[] = [
path: '/pages/mall/admin/cms/article/list',
order: 9,
groups: [
- { id: 'cms-manage', title: '内容管理', order: 1 }
+ { id: 'cms-manage', title: '', order: 1 }
]
},
{
@@ -187,7 +187,10 @@ export const topMenus: TopMenu[] = [
order: 12,
groups: [
{ id: 'setting-system', title: '系统设置', order: 1 },
- { id: 'setting-application', title: '应用设置', order: 2 }
+ { id: 'setting-message', title: '通知管理', order: 2 },
+ { id: 'setting-auth', title: '权限管理', order: 3 },
+ { id: 'setting-delivery', title: '物流设置', order: 4 },
+ { id: 'setting-interface', title: '接口设置', order: 5 }
]
},
{
@@ -892,6 +895,7 @@ export const routes: RouteRecord[] = [
},
// ========== 设置模块 ==========
+ // 1. 系统设置
{
id: 'setting_systemConfig',
title: '系统设置',
@@ -902,27 +906,168 @@ export const routes: RouteRecord[] = [
auth: ['admin-setting-system-config'],
order: 1
},
+
+ // 2. 通知管理
{
- id: 'setting_systemAdmin',
- title: '管理员管理',
- path: '/pages/mall/admin/setting/system/admin',
- componentKey: 'SettingSystemAdmin',
+ id: 'setting_message',
+ title: '消息管理',
+ path: '/pages/mall/admin/setting/message',
+ componentKey: 'SettingMessage',
parentId: 'setting',
- groupId: 'setting-system',
- auth: ['admin-setting-system-admin'],
+ groupId: 'setting-message',
+ order: 1
+ },
+ {
+ id: 'setting_agreement',
+ title: '协议管理',
+ path: '/pages/mall/admin/setting/agreement',
+ componentKey: 'SettingAgreement',
+ parentId: 'setting',
+ groupId: 'setting-message',
order: 2
},
{
- id: 'setting_systemRole',
- title: '角色管理',
- path: '/pages/mall/admin/setting/system/role',
- componentKey: 'SettingSystemRole',
+ id: 'setting_ticket',
+ title: '客服设置',
+ path: '/pages/mall/admin/setting/ticket',
+ componentKey: 'SettingTicket',
parentId: 'setting',
- groupId: 'setting-system',
- auth: ['admin-setting-system-role'],
+ groupId: 'setting-message',
order: 3
},
+ // 3. 权限管理
+ {
+ id: 'setting_auth_role',
+ title: '角色管理',
+ path: '/pages/mall/admin/setting/auth/role',
+ componentKey: 'SettingAuthRole',
+ parentId: 'setting',
+ groupId: 'setting-auth',
+ order: 1
+ },
+ {
+ id: 'setting_auth_admin',
+ title: '管理员管理',
+ path: '/pages/mall/admin/setting/auth/admin',
+ componentKey: 'SettingAuthAdmin',
+ parentId: 'setting',
+ groupId: 'setting-auth',
+ order: 2
+ },
+ {
+ id: 'setting_auth_permission',
+ title: '权限管理',
+ path: '/pages/mall/admin/setting/auth/permission',
+ componentKey: 'SettingAuthPermission',
+ parentId: 'setting',
+ groupId: 'setting-auth',
+ order: 3
+ },
+
+ // 4. 物流设置
+ {
+ id: 'setting_delivery_staff',
+ title: '配送员管理',
+ path: '/pages/mall/admin/setting/delivery/staff',
+ componentKey: 'SettingDeliveryStaff',
+ parentId: 'setting',
+ groupId: 'setting-delivery',
+ order: 1
+ },
+ {
+ id: 'setting_delivery_station',
+ title: '提货点管理',
+ path: '/pages/mall/admin/setting/delivery/station',
+ componentKey: 'SettingDeliveryStation',
+ parentId: 'setting',
+ groupId: 'setting-delivery',
+ order: 2
+ },
+ {
+ id: 'setting_delivery_template',
+ title: '运费模板',
+ path: '/pages/mall/admin/setting/delivery/template',
+ componentKey: 'SettingDeliveryTemplate',
+ parentId: 'setting',
+ groupId: 'setting-delivery',
+ order: 3
+ },
+
+ // 5. 接口设置
+ {
+ id: 'setting_interface_onepass_config',
+ title: '总平台配置',
+ path: '/pages/mall/admin/setting/interface/onepass/config',
+ componentKey: 'SettingInterfaceOnepassConfig',
+ parentId: 'setting',
+ groupId: 'setting-interface',
+ order: 1
+ },
+ {
+ id: 'setting_interface_onepass_index',
+ title: '账号列表',
+ path: '/pages/mall/admin/setting/interface/onepass/index',
+ componentKey: 'SettingInterfaceOnepassIndex',
+ parentId: 'setting',
+ groupId: 'setting-interface',
+ order: 2
+ },
+ {
+ id: 'setting_interface_storage',
+ title: '存储配置',
+ path: '/pages/mall/admin/setting/interface/storage',
+ componentKey: 'SettingInterfaceStorage',
+ parentId: 'setting',
+ groupId: 'setting-interface',
+ order: 3
+ },
+ {
+ id: 'setting_interface_collect',
+ title: '商品采集',
+ path: '/pages/mall/admin/setting/interface/collect',
+ componentKey: 'SettingInterfaceCollect',
+ parentId: 'setting',
+ groupId: 'setting-interface',
+ order: 4
+ },
+ {
+ id: 'setting_interface_logistics',
+ title: '物流查询',
+ path: '/pages/mall/admin/setting/interface/logistics',
+ componentKey: 'SettingInterfaceLogistics',
+ parentId: 'setting',
+ groupId: 'setting-interface',
+ order: 5
+ },
+ {
+ id: 'setting_interface_esheet',
+ title: '电子面单',
+ path: '/pages/mall/admin/setting/interface/e-sheet',
+ componentKey: 'SettingInterfaceESheet',
+ parentId: 'setting',
+ groupId: 'setting-interface',
+ order: 6
+ },
+ {
+ id: 'setting_interface_sms',
+ title: '短信接口',
+ path: '/pages/mall/admin/setting/interface/sms',
+ componentKey: 'SettingInterfaceSms',
+ parentId: 'setting',
+ groupId: 'setting-interface',
+ order: 7
+ },
+ {
+ id: 'setting_interface_payment',
+ title: '商城支付',
+ path: '/pages/mall/admin/setting/interface/payment',
+ componentKey: 'SettingInterfacePayment',
+ parentId: 'setting',
+ groupId: 'setting-interface',
+ order: 8
+ },
+
// ========== 分销模块 ==========
{
id: 'distribution_statistic',
@@ -1055,7 +1200,7 @@ export const routes: RouteRecord[] = [
order: 6
},
{
- id: 'decoration_link',
+ id: 'DecorationLink',
title: '链接管理',
path: '/pages/mall/admin/decoration/link',
componentKey: 'DecorationLink',
@@ -1064,6 +1209,30 @@ export const routes: RouteRecord[] = [
order: 7
},
+ // ========== 设置模块 (1:1 复刻 CRMEB 路由结构) ==========
+ // 通知管理
+ { id: 'setting_message_index', title: '消息管理', path: '/pages/mall/admin/setting/message/index', componentKey: 'SettingMessageIndex', parentId: 'setting', groupId: 'setting-message', order: 1 },
+ { id: 'setting_protocol_index', title: '协议设置', path: '/pages/mall/admin/setting/protocol/index', componentKey: 'SettingProtocolIndex', parentId: 'setting', groupId: 'setting-message', order: 2 },
+ { id: 'setting_ticket_index', title: '小票配置', path: '/pages/mall/admin/setting/ticket/index', componentKey: 'SettingTicketIndex', parentId: 'setting', groupId: 'setting-message', order: 3 },
+
+ // 权限管理
+ { id: 'setting_auth_role', title: '角色管理', path: '/pages/mall/admin/setting/auth/role/index', componentKey: 'SettingAuthRole', parentId: 'setting', groupId: 'setting-auth', order: 1 },
+ { id: 'setting_auth_admin', title: '管理员列表', path: '/pages/mall/admin/setting/auth/admin-list/index', componentKey: 'SettingAuthAdmin', parentId: 'setting', groupId: 'setting-auth', order: 2 },
+ { id: 'setting_auth_perm', title: '权限设置', path: '/pages/mall/admin/setting/auth/permission/index', componentKey: 'SettingAuthPerm', parentId: 'setting', groupId: 'setting-auth', order: 3 },
+
+ // 物流设置
+ { id: 'setting_delivery_courier', title: '配送员管理', path: '/pages/mall/admin/setting/delivery/courier/index', componentKey: 'SettingDeliveryCourier', parentId: 'setting', groupId: 'setting-delivery', order: 1 },
+ { id: 'setting_delivery_pickup', title: '提货点设置', path: '/pages/mall/admin/setting/delivery/pickup/index', componentKey: 'SettingDeliveryPickup', parentId: 'setting', groupId: 'setting-delivery', order: 2 },
+ { id: 'setting_delivery_freight', title: '运费模板', path: '/pages/mall/admin/setting/delivery/freight/index', componentKey: 'SettingDeliveryFreight', parentId: 'setting', groupId: 'setting-delivery', order: 3 },
+
+ // 接口设置
+ { id: 'setting_api_storage', title: '系统存储配置', path: '/pages/mall/admin/setting/api/yht/storage/index', componentKey: 'SettingApiStorage', parentId: 'setting', groupId: 'setting-interface', order: 1 },
+ { id: 'setting_api_collect', title: '商品采集配置', path: '/pages/mall/admin/setting/api/yht/collect/index', componentKey: 'SettingApiCollect', parentId: 'setting', groupId: 'setting-interface', order: 2 },
+ { id: 'setting_api_logistics', title: '物流查询配置', path: '/pages/mall/admin/setting/api/yht/logistics/index', componentKey: 'SettingApiLogistics', parentId: 'setting', groupId: 'setting-interface', order: 3 },
+ { id: 'setting_api_waybill', title: '电子面单配置', path: '/pages/mall/admin/setting/api/yht/waybill/index', componentKey: 'SettingApiWaybill', parentId: 'setting', groupId: 'setting-interface', order: 4 },
+ { id: 'setting_api_sms', title: '短信接口配置', path: '/pages/mall/admin/setting/api/yht/sms/index', componentKey: 'SettingApiSms', parentId: 'setting', groupId: 'setting-interface', order: 5 },
+ { id: 'setting_api_pay', title: '商城支付配置', path: '/pages/mall/admin/setting/api/yht/pay/index', componentKey: 'SettingApiPay', parentId: 'setting', groupId: 'setting-interface', order: 6 },
+
// ========== 应用模块 ==========
{
id: 'app_statistic',
diff --git a/layouts/admin/router/settingSubSiderMenu.uts b/layouts/admin/router/settingSubSiderMenu.uts
new file mode 100644
index 00000000..d4e86291
--- /dev/null
+++ b/layouts/admin/router/settingSubSiderMenu.uts
@@ -0,0 +1,37 @@
+export type MenuNode = {
+ id: string
+ title: string
+ type: 'group' | 'page'
+ path?: string // type=page 必填
+ children?: MenuNode[] // type=group 必填
+}
+
+export const settingSubSiderMenu: MenuNode[] = [
+ { id: 'setting_message_index', title: '消息管理', type: 'page', path: '/pages/mall/admin/setting/message/index' },
+ { id: 'setting_protocol_index', title: '协议设置', type: 'page', path: '/pages/mall/admin/setting/protocol/index' },
+ { id: 'setting_ticket_index', title: '小票配置', type: 'page', path: '/pages/mall/admin/setting/ticket/index' },
+ { id: 'auth_group', title: '管理权限', type: 'group', children: [
+ { id: 'setting_auth_role', title: '角色管理', type: 'page', path: '/pages/mall/admin/setting/auth/role/index' },
+ { id: 'setting_auth_admin', title: '管理员列表', type: 'page', path: '/pages/mall/admin/setting/auth/admin-list/index' },
+ { id: 'setting_auth_perm', title: '权限设置', type: 'page', path: '/pages/mall/admin/setting/auth/permission/index' }
+ ]
+ },
+ { id: 'delivery_group', title: '发货设置', type: 'group', children: [
+ { id: 'setting_delivery_courier', title: '配送员管理', type: 'page', path: '/pages/mall/admin/setting/delivery/courier/index' },
+ { id: 'setting_delivery_pickup', title: '提货点设置', type: 'page', path: '/pages/mall/admin/setting/delivery/pickup/index' },
+ { id: 'setting_delivery_freight', title: '运费模板', type: 'page', path: '/pages/mall/admin/setting/delivery/freight/index' }
+ ]
+ },
+ { id: 'api_group', title: '接口配置', type: 'group', children: [
+ { id: 'yh_tong', title: '一号通', type: 'group', children: [
+ { id: 'setting_api_storage', title: '系统存储配置', type: 'page', path: '/pages/mall/admin/setting/api/yht/storage/index' },
+ { id: 'setting_api_collect', title: '商品采集配置', type: 'page', path: '/pages/mall/admin/setting/api/yht/collect/index' },
+ { id: 'setting_api_logistics', title: '物流查询配置', type: 'page', path: '/pages/mall/admin/setting/api/yht/logistics/index' },
+ { id: 'setting_api_waybill', title: '电子面单配置', type: 'page', path: '/pages/mall/admin/setting/api/yht/waybill/index' },
+ { id: 'setting_api_sms', title: '短信接口配置', type: 'page', path: '/pages/mall/admin/setting/api/yht/sms/index' },
+ { id: 'setting_api_pay', title: '商城支付配置', type: 'page', path: '/pages/mall/admin/setting/api/yht/pay/index' }
+ ]
+ }
+ ]
+ }
+]
diff --git a/layouts/admin/store/adminNavStore.uts b/layouts/admin/store/adminNavStore.uts
index a88eb58f..de3ab582 100644
--- a/layouts/admin/store/adminNavStore.uts
+++ b/layouts/admin/store/adminNavStore.uts
@@ -11,6 +11,7 @@ import {
buildDefaultTabs,
getTopMenus
} from '@/layouts/admin/router/adminRoutes.uts'
+import { addView, activeFullPath, visitedViews } from './tagsViewStore.uts'
/**
* 标签页类型
@@ -32,6 +33,12 @@ export const activeTopMenuId = ref('home')
/** 当前激活的路由ID */
export const activeRouteId = ref('home_index')
+/** 记录每个一级模块上一次访问的二级路由ID (CRMEB 体验增强) */
+export const lastSubIdByMenu = ref>({})
+
+/** 标记是否由用户手动关闭了 SubSider (移动端) */
+export const isManualClosed = ref(false)
+
/** 打开的标签页列表 */
export const tabs = ref([])
@@ -82,6 +89,8 @@ export function openRoute(routeId: string, addTab: boolean = true): void {
// 更新一级菜单选中态
if (route.parentId) {
activeTopMenuId.value = route.parentId
+ // 记录该模块最后访问的子路由
+ lastSubIdByMenu.value[route.parentId] = routeId
} else {
// 首页等顶级路由
activeTopMenuId.value = routeId.split('_')[0]
@@ -116,6 +125,10 @@ function addTabItem(route: RouteRecord): void {
isAffix: route.isAffix || false
})
}
+
+ // 更新新版 TagsViewStore
+ addView(route, route.path)
+ activeFullPath.value = route.path
}
/**
@@ -201,6 +214,11 @@ export function initNavState(): void {
isAffix: r.isAffix || false
}))
+ // 初始化 TagsViewStore
+ defaultTabs.forEach(r => {
+ addView(r, r.path)
+ })
+
// 打开首页
openRoute('home_index', false)
}
diff --git a/layouts/admin/store/tagsViewStore.uts b/layouts/admin/store/tagsViewStore.uts
new file mode 100644
index 00000000..01497a4f
--- /dev/null
+++ b/layouts/admin/store/tagsViewStore.uts
@@ -0,0 +1,126 @@
+/**
+ * TagsView 状态管理
+ * 复刻 CRMEB 风格的标签栏逻辑
+ */
+
+import { ref } from 'vue'
+import type { RouteRecord } from '@/layouts/admin/router/adminRoutes.uts'
+
+/**
+ * 标签页视图类型
+ */
+export type TagView = {
+ id: string // 对应路由ID
+ title: string // 标题
+ path: string // 基础路径
+ fullPath: string // 完整路径(包含参数)
+ name: string // 组件Key
+ meta: {
+ affix?: boolean
+ noCache?: boolean
+ }
+}
+
+/** 访问过的页面列表 */
+export const visitedViews = ref([])
+
+/** 缓存的页面列表 (用于 keep-alive) */
+export const cachedViews = ref([])
+
+/** 开启的标签页详情 */
+export const activeFullPath = ref('')
+
+// ============================================
+// Actions
+// ============================================
+
+/**
+ * 添加视图
+ */
+export function addView(route: RouteRecord, fullPath: string): void {
+ // 1. 添加到访问列表
+ if (visitedViews.value.some(v => v.fullPath === fullPath)) return
+
+ // 如果 ID 相同但 fullPath 不同(参数变化), 则更新或者替换
+ const existingIndex = visitedViews.value.findIndex(v => v.id === route.id)
+
+ const newView: TagView = {
+ id: route.id,
+ title: route.title,
+ path: route.path,
+ fullPath: fullPath,
+ name: route.componentKey,
+ meta: {
+ affix: route.isAffix || false,
+ noCache: false // 默认为缓存,如果有特殊需求可扩展
+ }
+ }
+
+ if (existingIndex > -1) {
+ // 同一路由不同参数, 更新记录
+ visitedViews.value[existingIndex] = newView
+ } else {
+ visitedViews.value.push(newView)
+ }
+
+ // 2. 添加到缓存列表
+ if (!route.componentKey) return
+ if (cachedViews.value.includes(route.componentKey)) return
+ cachedViews.value.push(route.componentKey)
+}
+
+/**
+ * 删除视图
+ */
+export function delView(view: TagView): void {
+ const index = visitedViews.value.findIndex(v => v.fullPath === view.fullPath)
+ if (index > -1 && !visitedViews.value[index].meta.affix) {
+ visitedViews.value.splice(index, 1)
+ }
+
+ const cacheIndex = cachedViews.value.indexOf(view.name)
+ if (cacheIndex > -1) {
+ cachedViews.value.splice(cacheIndex, 1)
+ }
+}
+
+/**
+ * 关闭其他标签
+ */
+export function delOthersViews(view: TagView): void {
+ visitedViews.value = visitedViews.value.filter(v => v.meta.affix || v.fullPath === view.fullPath)
+ cachedViews.value = visitedViews.value.map(v => v.name)
+}
+
+/**
+ * 关闭右侧标签
+ */
+export function delRightTags(view: TagView): void {
+ const index = visitedViews.value.findIndex(v => v.fullPath === view.fullPath)
+ if (index === -1) return
+
+ visitedViews.value = visitedViews.value.filter((v, i) => {
+ return i <= index || v.meta.affix
+ })
+ cachedViews.value = visitedViews.value.map(v => v.name)
+}
+
+/**
+ * 关闭所有
+ */
+export function delAllViews(): void {
+ const affixTags = visitedViews.value.filter(v => v.meta.affix)
+ visitedViews.value = affixTags
+ cachedViews.value = affixTags.map(v => v.name)
+}
+
+/**
+ * 刷新当前视图 (通常结合全局事件通知组件)
+ */
+export function refreshView(view: TagView): void {
+ const index = cachedViews.value.indexOf(view.name)
+ if (index > -1) {
+ cachedViews.value.splice(index, 1)
+ }
+ // 通知框架重新加载该组件的逻辑通常在组件内部处理或通过 key 变化
+}
diff --git a/pages/mall/admin/setting/agreement.uvue b/pages/mall/admin/setting/agreement.uvue
new file mode 100644
index 00000000..10d80c88
--- /dev/null
+++ b/pages/mall/admin/setting/agreement.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 协议管理 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/auth/admin.uvue b/pages/mall/admin/setting/auth/admin.uvue
new file mode 100644
index 00000000..a3fe4068
--- /dev/null
+++ b/pages/mall/admin/setting/auth/admin.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 管理员列表 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/auth/permission.uvue b/pages/mall/admin/setting/auth/permission.uvue
new file mode 100644
index 00000000..cb9c5c56
--- /dev/null
+++ b/pages/mall/admin/setting/auth/permission.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 权限设置 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/auth/role.uvue b/pages/mall/admin/setting/auth/role.uvue
new file mode 100644
index 00000000..9ebc8c82
--- /dev/null
+++ b/pages/mall/admin/setting/auth/role.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 角色管理 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/delivery/staff.uvue b/pages/mall/admin/setting/delivery/staff.uvue
new file mode 100644
index 00000000..a0dc1ded
--- /dev/null
+++ b/pages/mall/admin/setting/delivery/staff.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 配送员管理 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/delivery/station.uvue b/pages/mall/admin/setting/delivery/station.uvue
new file mode 100644
index 00000000..cb848d40
--- /dev/null
+++ b/pages/mall/admin/setting/delivery/station.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 提货点设置 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/delivery/template.uvue b/pages/mall/admin/setting/delivery/template.uvue
new file mode 100644
index 00000000..55733264
--- /dev/null
+++ b/pages/mall/admin/setting/delivery/template.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 运费模板 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/interface/collect.uvue b/pages/mall/admin/setting/interface/collect.uvue
new file mode 100644
index 00000000..aa80b437
--- /dev/null
+++ b/pages/mall/admin/setting/interface/collect.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 商品采集配置 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/interface/e-sheet.uvue b/pages/mall/admin/setting/interface/e-sheet.uvue
new file mode 100644
index 00000000..5a25a5e2
--- /dev/null
+++ b/pages/mall/admin/setting/interface/e-sheet.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 电子面单配置 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/interface/logistics.uvue b/pages/mall/admin/setting/interface/logistics.uvue
new file mode 100644
index 00000000..1aacab1c
--- /dev/null
+++ b/pages/mall/admin/setting/interface/logistics.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 物流查询配置 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/interface/onepass/config.uvue b/pages/mall/admin/setting/interface/onepass/config.uvue
new file mode 100644
index 00000000..b8bd3b6f
--- /dev/null
+++ b/pages/mall/admin/setting/interface/onepass/config.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 一号通配置 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/interface/onepass/index.uvue b/pages/mall/admin/setting/interface/onepass/index.uvue
new file mode 100644
index 00000000..c0366097
--- /dev/null
+++ b/pages/mall/admin/setting/interface/onepass/index.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 一号通页面 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/interface/payment.uvue b/pages/mall/admin/setting/interface/payment.uvue
new file mode 100644
index 00000000..c27a802e
--- /dev/null
+++ b/pages/mall/admin/setting/interface/payment.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 商城支付配置 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/interface/sms.uvue b/pages/mall/admin/setting/interface/sms.uvue
new file mode 100644
index 00000000..07e58033
--- /dev/null
+++ b/pages/mall/admin/setting/interface/sms.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 短信接口配置 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/interface/storage.uvue b/pages/mall/admin/setting/interface/storage.uvue
new file mode 100644
index 00000000..a53f763d
--- /dev/null
+++ b/pages/mall/admin/setting/interface/storage.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 系统存储配置 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/message.uvue b/pages/mall/admin/setting/message.uvue
new file mode 100644
index 00000000..13442107
--- /dev/null
+++ b/pages/mall/admin/setting/message.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 消息管理 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/system/agreement.uvue b/pages/mall/admin/setting/system/agreement.uvue
new file mode 100644
index 00000000..d6720e55
--- /dev/null
+++ b/pages/mall/admin/setting/system/agreement.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 协议设置 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/system/message.uvue b/pages/mall/admin/setting/system/message.uvue
new file mode 100644
index 00000000..13442107
--- /dev/null
+++ b/pages/mall/admin/setting/system/message.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 消息管理 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/system/ticket.uvue b/pages/mall/admin/setting/system/ticket.uvue
new file mode 100644
index 00000000..c5f02ac2
--- /dev/null
+++ b/pages/mall/admin/setting/system/ticket.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 小票配置 页面开发中...
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/setting/ticket.uvue b/pages/mall/admin/setting/ticket.uvue
new file mode 100644
index 00000000..5f729ad6
--- /dev/null
+++ b/pages/mall/admin/setting/ticket.uvue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ 客服设置 页面开发中...
+
+
+
+
+
+
+
+
From d6940b51e1d56f6829b0c274ed6c54274deea557 Mon Sep 17 00:00:00 2001
From: huangzhenbao <17818024429@163.com>
Date: Fri, 6 Feb 2026 10:42:35 +0800
Subject: [PATCH 07/12] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=86=E8=8A=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
layouts/admin/AdminLayout.uvue | 1 +
layouts/admin/components/AdminTagsView.uvue | 179 +++++++++++++++++++-
2 files changed, 174 insertions(+), 6 deletions(-)
diff --git a/layouts/admin/AdminLayout.uvue b/layouts/admin/AdminLayout.uvue
index 09e51631..db4062c3 100644
--- a/layouts/admin/AdminLayout.uvue
+++ b/layouts/admin/AdminLayout.uvue
@@ -57,6 +57,7 @@
@tab-close="onTabClose"
@close-other="onCloseOther"
@close-all="onCloseAll"
+ @refresh="onRefresh"
/>
diff --git a/layouts/admin/components/AdminTagsView.uvue b/layouts/admin/components/AdminTagsView.uvue
index 4df4d5b4..d7dcc394 100644
--- a/layouts/admin/components/AdminTagsView.uvue
+++ b/layouts/admin/components/AdminTagsView.uvue
@@ -1,36 +1,122 @@
-
+
{{ t.title }}
-
+
×
-
+
+
+
+
+
+
From b7545173c67c7f9237ec11e56b200a4d93b05407 Mon Sep 17 00:00:00 2001
From: huangzhenbao <17818024429@163.com>
Date: Fri, 6 Feb 2026 10:59:03 +0800
Subject: [PATCH 08/12] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=86=E8=8A=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
layouts/admin/components/AdminSubsider.uvue | 76 ++++++++++++--------
layouts/admin/router/adminRoutes.uts | 33 +++++----
layouts/admin/router/settingSubSiderMenu.uts | 39 +++++-----
3 files changed, 88 insertions(+), 60 deletions(-)
diff --git a/layouts/admin/components/AdminSubsider.uvue b/layouts/admin/components/AdminSubsider.uvue
index 9b2f21e7..968671b4 100644
--- a/layouts/admin/components/AdminSubsider.uvue
+++ b/layouts/admin/components/AdminSubsider.uvue
@@ -21,39 +21,39 @@
@click="handleNodeClick(level1, 1)"
>
-
- {{ isOpen(level1.id, 1) ? '▼' : '▶' }}
-
+ ▶
-
+
@@ -255,9 +255,29 @@ onMounted(() => {
font-size: 10px;
color: #c0c4cc;
margin-left: 4px;
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+/* 旋转动画 */
+.is-open .chevron {
+ transform: rotate(90deg);
}
.sub-menu-container {
overflow: hidden;
}
+
+/* 展开收起动画 */
+.expand-enter-active,
+.expand-leave-active {
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
+ max-height: 1000px; /* 足够大的预设值 */
+}
+
+.expand-enter-from,
+.expand-leave-to {
+ max-height: 0;
+ opacity: 0;
+ transform: translateY(-10px);
+}
diff --git a/layouts/admin/router/adminRoutes.uts b/layouts/admin/router/adminRoutes.uts
index 81a20135..684daa00 100644
--- a/layouts/admin/router/adminRoutes.uts
+++ b/layouts/admin/router/adminRoutes.uts
@@ -1211,27 +1211,30 @@ export const routes: RouteRecord[] = [
// ========== 设置模块 (1:1 复刻 CRMEB 路由结构) ==========
// 通知管理
- { id: 'setting_message_index', title: '消息管理', path: '/pages/mall/admin/setting/message/index', componentKey: 'SettingMessageIndex', parentId: 'setting', groupId: 'setting-message', order: 1 },
- { id: 'setting_protocol_index', title: '协议设置', path: '/pages/mall/admin/setting/protocol/index', componentKey: 'SettingProtocolIndex', parentId: 'setting', groupId: 'setting-message', order: 2 },
- { id: 'setting_ticket_index', title: '小票配置', path: '/pages/mall/admin/setting/ticket/index', componentKey: 'SettingTicketIndex', parentId: 'setting', groupId: 'setting-message', order: 3 },
+ { id: 'setting_message_index', title: '消息管理', path: '/pages/mall/admin/setting/message', componentKey: 'SettingMessageIndex', parentId: 'setting', groupId: 'setting-message', order: 1 },
+ { id: 'setting_protocol_index', title: '协议设置', path: '/pages/mall/admin/setting/agreement', componentKey: 'SettingProtocolIndex', parentId: 'setting', groupId: 'setting-message', order: 2 },
+ { id: 'setting_ticket_index', title: '小票配置', path: '/pages/mall/admin/setting/ticket', componentKey: 'SettingTicketIndex', parentId: 'setting', groupId: 'setting-message', order: 3 },
// 权限管理
- { id: 'setting_auth_role', title: '角色管理', path: '/pages/mall/admin/setting/auth/role/index', componentKey: 'SettingAuthRole', parentId: 'setting', groupId: 'setting-auth', order: 1 },
- { id: 'setting_auth_admin', title: '管理员列表', path: '/pages/mall/admin/setting/auth/admin-list/index', componentKey: 'SettingAuthAdmin', parentId: 'setting', groupId: 'setting-auth', order: 2 },
- { id: 'setting_auth_perm', title: '权限设置', path: '/pages/mall/admin/setting/auth/permission/index', componentKey: 'SettingAuthPerm', parentId: 'setting', groupId: 'setting-auth', order: 3 },
+ { id: 'setting_auth_admin', title: '管理员管理', path: '/pages/mall/admin/setting/auth/admin', componentKey: 'SettingAuthAdmin', parentId: 'setting', groupId: 'setting-auth', order: 1 },
+ { id: 'setting_auth_role', title: '角色管理', path: '/pages/mall/admin/setting/auth/role', componentKey: 'SettingAuthRole', parentId: 'setting', groupId: 'setting-auth', order: 2 },
+ { id: 'setting_auth_menu', title: '菜单管理', path: '/pages/mall/admin/setting/auth/permission', componentKey: 'SettingAuthMenu', parentId: 'setting', groupId: 'setting-auth', order: 3 },
// 物流设置
- { id: 'setting_delivery_courier', title: '配送员管理', path: '/pages/mall/admin/setting/delivery/courier/index', componentKey: 'SettingDeliveryCourier', parentId: 'setting', groupId: 'setting-delivery', order: 1 },
- { id: 'setting_delivery_pickup', title: '提货点设置', path: '/pages/mall/admin/setting/delivery/pickup/index', componentKey: 'SettingDeliveryPickup', parentId: 'setting', groupId: 'setting-delivery', order: 2 },
- { id: 'setting_delivery_freight', title: '运费模板', path: '/pages/mall/admin/setting/delivery/freight/index', componentKey: 'SettingDeliveryFreight', parentId: 'setting', groupId: 'setting-delivery', order: 3 },
+ { id: 'setting_delivery_courier', title: '配送员管理', path: '/pages/mall/admin/setting/delivery/staff', componentKey: 'SettingDeliveryCourier', parentId: 'setting', groupId: 'setting-delivery', order: 1 },
+ { id: 'setting_delivery_pickup_list', title: '提货点', path: '/pages/mall/admin/setting/delivery/station', componentKey: 'SettingDeliveryPickupList', parentId: 'setting', groupId: 'setting-delivery', order: 2 },
+ { id: 'setting_delivery_verifier', title: '核销员', path: '/pages/mall/admin/setting/delivery/station', componentKey: 'SettingDeliveryVerifier', parentId: 'setting', groupId: 'setting-delivery', order: 3 },
+ { id: 'setting_delivery_freight', title: '运费模板', path: '/pages/mall/admin/setting/delivery/template', componentKey: 'SettingDeliveryFreight', parentId: 'setting', groupId: 'setting-delivery', order: 4 },
// 接口设置
- { id: 'setting_api_storage', title: '系统存储配置', path: '/pages/mall/admin/setting/api/yht/storage/index', componentKey: 'SettingApiStorage', parentId: 'setting', groupId: 'setting-interface', order: 1 },
- { id: 'setting_api_collect', title: '商品采集配置', path: '/pages/mall/admin/setting/api/yht/collect/index', componentKey: 'SettingApiCollect', parentId: 'setting', groupId: 'setting-interface', order: 2 },
- { id: 'setting_api_logistics', title: '物流查询配置', path: '/pages/mall/admin/setting/api/yht/logistics/index', componentKey: 'SettingApiLogistics', parentId: 'setting', groupId: 'setting-interface', order: 3 },
- { id: 'setting_api_waybill', title: '电子面单配置', path: '/pages/mall/admin/setting/api/yht/waybill/index', componentKey: 'SettingApiWaybill', parentId: 'setting', groupId: 'setting-interface', order: 4 },
- { id: 'setting_api_sms', title: '短信接口配置', path: '/pages/mall/admin/setting/api/yht/sms/index', componentKey: 'SettingApiSms', parentId: 'setting', groupId: 'setting-interface', order: 5 },
- { id: 'setting_api_pay', title: '商城支付配置', path: '/pages/mall/admin/setting/api/yht/pay/index', componentKey: 'SettingApiPay', parentId: 'setting', groupId: 'setting-interface', order: 6 },
+ { id: 'setting_api_yht_page', title: '一号通页面', path: '/pages/mall/admin/setting/interface/onepass/index', componentKey: 'SettingApiYhtPage', parentId: 'setting', groupId: 'setting-interface', order: 1 },
+ { id: 'setting_api_yht_config', title: '一号通配置', path: '/pages/mall/admin/setting/interface/onepass/config', componentKey: 'SettingApiYhtConfig', parentId: 'setting', groupId: 'setting-interface', order: 2 },
+ { id: 'setting_api_storage', title: '系统存储配置', path: '/pages/mall/admin/setting/interface/storage', componentKey: 'SettingApiStorage', parentId: 'setting', groupId: 'setting-interface', order: 3 },
+ { id: 'setting_api_collect', title: '商品采集配置', path: '/pages/mall/admin/setting/interface/collect', componentKey: 'SettingApiCollect', parentId: 'setting', groupId: 'setting-interface', order: 4 },
+ { id: 'setting_api_logistics', title: '物流查询配置', path: '/pages/mall/admin/setting/interface/logistics', componentKey: 'SettingApiLogistics', parentId: 'setting', groupId: 'setting-interface', order: 5 },
+ { id: 'setting_api_waybill', title: '电子面单配置', path: '/pages/mall/admin/setting/interface/e-sheet', componentKey: 'SettingApiWaybill', parentId: 'setting', groupId: 'setting-interface', order: 6 },
+ { id: 'setting_api_sms', title: '短信接口配置', path: '/pages/mall/admin/setting/interface/sms', componentKey: 'SettingApiSms', parentId: 'setting', groupId: 'setting-interface', order: 7 },
+ { id: 'setting_api_pay', title: '商城支付配置', path: '/pages/mall/admin/setting/interface/payment', componentKey: 'SettingApiPay', parentId: 'setting', groupId: 'setting-interface', order: 8 },
// ========== 应用模块 ==========
{
diff --git a/layouts/admin/router/settingSubSiderMenu.uts b/layouts/admin/router/settingSubSiderMenu.uts
index d4e86291..b26a8313 100644
--- a/layouts/admin/router/settingSubSiderMenu.uts
+++ b/layouts/admin/router/settingSubSiderMenu.uts
@@ -7,31 +7,36 @@ export type MenuNode = {
}
export const settingSubSiderMenu: MenuNode[] = [
- { id: 'setting_message_index', title: '消息管理', type: 'page', path: '/pages/mall/admin/setting/message/index' },
- { id: 'setting_protocol_index', title: '协议设置', type: 'page', path: '/pages/mall/admin/setting/protocol/index' },
- { id: 'setting_ticket_index', title: '小票配置', type: 'page', path: '/pages/mall/admin/setting/ticket/index' },
+ { id: 'setting_message_index', title: '消息管理', type: 'page', path: '/pages/mall/admin/setting/message' },
+ { id: 'setting_protocol_index', title: '协议设置', type: 'page', path: '/pages/mall/admin/setting/agreement' },
+ { id: 'setting_ticket_index', title: '小票配置', type: 'page', path: '/pages/mall/admin/setting/ticket' },
{ id: 'auth_group', title: '管理权限', type: 'group', children: [
- { id: 'setting_auth_role', title: '角色管理', type: 'page', path: '/pages/mall/admin/setting/auth/role/index' },
- { id: 'setting_auth_admin', title: '管理员列表', type: 'page', path: '/pages/mall/admin/setting/auth/admin-list/index' },
- { id: 'setting_auth_perm', title: '权限设置', type: 'page', path: '/pages/mall/admin/setting/auth/permission/index' }
+ { id: 'setting_auth_admin', title: '管理员管理', type: 'page', path: '/pages/mall/admin/setting/auth/admin' },
+ { id: 'setting_auth_role', title: '角色管理', type: 'page', path: '/pages/mall/admin/setting/auth/role' },
+ { id: 'setting_auth_menu', title: '菜单管理', type: 'page', path: '/pages/mall/admin/setting/auth/permission' }
]
},
{ id: 'delivery_group', title: '发货设置', type: 'group', children: [
- { id: 'setting_delivery_courier', title: '配送员管理', type: 'page', path: '/pages/mall/admin/setting/delivery/courier/index' },
- { id: 'setting_delivery_pickup', title: '提货点设置', type: 'page', path: '/pages/mall/admin/setting/delivery/pickup/index' },
- { id: 'setting_delivery_freight', title: '运费模板', type: 'page', path: '/pages/mall/admin/setting/delivery/freight/index' }
+ { id: 'setting_delivery_courier', title: '配送员管理', type: 'page', path: '/pages/mall/admin/setting/delivery/staff' },
+ { id: 'pickup_order_group', title: '提货点设置', type: 'group', children: [
+ { id: 'setting_delivery_pickup_list', title: '提货点', type: 'page', path: '/pages/mall/admin/setting/delivery/station' },
+ { id: 'setting_delivery_verifier', title: '核销员', type: 'page', path: '/pages/mall/admin/setting/delivery/station' },
+ { id: 'setting_delivery_freight', title: '运费模板', type: 'page', path: '/pages/mall/admin/setting/delivery/template' }
+ ]}
]
},
{ id: 'api_group', title: '接口配置', type: 'group', children: [
- { id: 'yh_tong', title: '一号通', type: 'group', children: [
- { id: 'setting_api_storage', title: '系统存储配置', type: 'page', path: '/pages/mall/admin/setting/api/yht/storage/index' },
- { id: 'setting_api_collect', title: '商品采集配置', type: 'page', path: '/pages/mall/admin/setting/api/yht/collect/index' },
- { id: 'setting_api_logistics', title: '物流查询配置', type: 'page', path: '/pages/mall/admin/setting/api/yht/logistics/index' },
- { id: 'setting_api_waybill', title: '电子面单配置', type: 'page', path: '/pages/mall/admin/setting/api/yht/waybill/index' },
- { id: 'setting_api_sms', title: '短信接口配置', type: 'page', path: '/pages/mall/admin/setting/api/yht/sms/index' },
- { id: 'setting_api_pay', title: '商城支付配置', type: 'page', path: '/pages/mall/admin/setting/api/yht/pay/index' }
+ { id: 'yh_tong_group', title: '一号通', type: 'group', children: [
+ { id: 'setting_api_yht_page', title: '一号通页面', type: 'page', path: '/pages/mall/admin/setting/interface/onepass/index' },
+ { id: 'setting_api_yht_config', title: '一号通配置', type: 'page', path: '/pages/mall/admin/setting/interface/onepass/config' }
]
- }
+ },
+ { id: 'setting_api_storage', title: '系统存储配置', type: 'page', path: '/pages/mall/admin/setting/interface/storage' },
+ { id: 'setting_api_collect', title: '商品采集配置', type: 'page', path: '/pages/mall/admin/setting/interface/collect' },
+ { id: 'setting_api_logistics', title: '物流查询配置', type: 'page', path: '/pages/mall/admin/setting/interface/logistics' },
+ { id: 'setting_api_waybill', title: '电子面单配置', type: 'page', path: '/pages/mall/admin/setting/interface/e-sheet' },
+ { id: 'setting_api_sms', title: '短信接口配置', type: 'page', path: '/pages/mall/admin/setting/interface/sms' },
+ { id: 'setting_api_pay', title: '商城支付配置', type: 'page', path: '/pages/mall/admin/setting/interface/payment' }
]
}
]
From d00f0b74123f809bf960a1c7b2d1e7388abb2718 Mon Sep 17 00:00:00 2001
From: huangzhenbao <17818024429@163.com>
Date: Fri, 6 Feb 2026 12:06:33 +0800
Subject: [PATCH 09/12] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=86=E8=8A=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
layouts/admin/AdminLayout.uvue | 14 +-
layouts/admin/components/AdminAside.uvue | 3 +-
layouts/admin/pages/HomeIndex.uvue | 15 +-
layouts/admin/router/adminComponentMap.uts | 9 +-
layouts/admin/router/adminRoutes.uts | 50 +-
layouts/admin/styles/admin-responsive.css | 4 +-
pages.json | 42 ++
pages/mall/admin/cms/article/list.uvue | 125 ++---
pages/mall/admin/cms/category/list.uvue | 83 +--
pages/mall/admin/decoration/category.uvue | 149 ++---
pages/mall/admin/decoration/data-config.uvue | 77 +--
pages/mall/admin/decoration/home.uvue | 161 +++---
pages/mall/admin/design/templates.uvue | 31 +-
pages/mall/admin/design/theme-style.uvue | 130 ++---
.../admin/distribution/division/agent.uvue | 107 ++++
.../admin/distribution/division/apply.uvue | 117 ++++
.../admin/distribution/division/list.uvue | 110 ++++
.../mall/admin/distribution/level/index.uvue | 258 +++++++++
.../admin/distribution/promoter/index.uvue | 305 +++++++++++
.../admin/distribution/setting/index.uvue | 508 ++++++++++++++++++
pages/mall/admin/finance/balance_stats.uvue | 115 ++--
pages/mall/admin/finance/record.uvue | 18 +-
pages/mall/admin/finance/withdrawal.uvue | 123 ++---
pages/mall/admin/kefu/words.uvue | 101 ++--
pages/mall/admin/marketing/bargain/list.uvue | 18 +-
.../admin/marketing/combination/create.uvue | 91 ++--
pages/mall/admin/marketing/lottery/list.uvue | 135 ++---
.../mall/admin/marketing/newcomer/index.uvue | 69 +--
.../mall/admin/order/cashier-order/index.uvue | 85 +--
pages/mall/admin/order/list.uvue | 153 +++---
.../admin/order/order-statistics/index.uvue | 99 ++--
.../admin/product/classification/index.uvue | 3 +-
pages/mall/admin/product/labels/index.uvue | 3 +-
pages/mall/admin/product/list.uvue | 18 +-
.../mall/admin/product/parameters/index.uvue | 3 +-
.../product/product-management/edit.uvue | 69 +--
.../product/product-management/index.uvue | 147 ++---
.../product-management/member-price.uvue | 27 +-
.../product/product-statistics/index.uvue | 109 ++--
pages/mall/admin/product/reviews/index.uvue | 101 ++--
.../admin/product/specifications/index.uvue | 79 +--
pages/mall/admin/setting/agreement.uvue | 9 +-
pages/mall/admin/setting/auth/admin.uvue | 9 +-
pages/mall/admin/setting/auth/permission.uvue | 9 +-
pages/mall/admin/setting/auth/role.uvue | 9 +-
pages/mall/admin/setting/delivery/staff.uvue | 9 +-
.../mall/admin/setting/delivery/station.uvue | 9 +-
.../mall/admin/setting/delivery/template.uvue | 9 +-
.../mall/admin/setting/interface/collect.uvue | 9 +-
.../mall/admin/setting/interface/e-sheet.uvue | 9 +-
.../admin/setting/interface/logistics.uvue | 9 +-
.../setting/interface/onepass/config.uvue | 9 +-
.../setting/interface/onepass/index.uvue | 9 +-
.../mall/admin/setting/interface/payment.uvue | 9 +-
pages/mall/admin/setting/interface/sms.uvue | 9 +-
.../mall/admin/setting/interface/storage.uvue | 9 +-
pages/mall/admin/setting/message.uvue | 9 +-
pages/mall/admin/setting/system/admin.uvue | 18 +-
.../mall/admin/setting/system/agreement.uvue | 9 +-
pages/mall/admin/setting/system/message.uvue | 9 +-
pages/mall/admin/setting/system/role.uvue | 18 +-
pages/mall/admin/setting/system/ticket.uvue | 9 +-
pages/mall/admin/setting/ticket.uvue | 9 +-
pages/mall/admin/statistic/index.uvue | 18 +-
.../mall/admin/user/configuration/index.uvue | 63 +--
pages/mall/admin/user/grade/card.uvue | 18 +-
pages/mall/admin/user/grade/record.uvue | 18 +-
pages/mall/admin/user/grade/right.uvue | 18 +-
pages/mall/admin/user/grade/type.uvue | 18 +-
pages/mall/admin/user/grouping/index.uvue | 105 ++--
pages/mall/admin/user/label/index.uvue | 101 ++--
pages/mall/admin/user/level/index.uvue | 111 ++--
pages/mall/admin/user/management/index.uvue | 159 +++---
pages/mall/admin/user/statistics/index.uvue | 69 +--
pages/mall/analytics/coupon-analysis.uvue | 197 ++++---
pages/mall/analytics/custom-report.uvue | 173 +++---
pages/mall/analytics/delivery-analysis.uvue | 126 ++---
pages/mall/analytics/index.uvue | 318 +++++------
pages/mall/analytics/insight-detail.uvue | 59 +-
pages/mall/analytics/market-trends.uvue | 122 +++--
pages/mall/analytics/product-insights.uvue | 152 +++---
pages/mall/analytics/sales-report.uvue | 132 ++---
pages/mall/analytics/user-analysis.uvue | 198 +++----
83 files changed, 3901 insertions(+), 2354 deletions(-)
create mode 100644 pages/mall/admin/distribution/division/agent.uvue
create mode 100644 pages/mall/admin/distribution/division/apply.uvue
create mode 100644 pages/mall/admin/distribution/division/list.uvue
create mode 100644 pages/mall/admin/distribution/level/index.uvue
create mode 100644 pages/mall/admin/distribution/promoter/index.uvue
create mode 100644 pages/mall/admin/distribution/setting/index.uvue
diff --git a/layouts/admin/AdminLayout.uvue b/layouts/admin/AdminLayout.uvue
index db4062c3..8cd9562a 100644
--- a/layouts/admin/AdminLayout.uvue
+++ b/layouts/admin/AdminLayout.uvue
@@ -57,12 +57,11 @@
@tab-close="onTabClose"
@close-other="onCloseOther"
@close-all="onCloseAll"
- @refresh="onRefresh"
/>
-
+
@@ -400,7 +399,7 @@ onMounted(() => {
flex-direction: row;
width: 100%;
min-height: 100vh;
- background: #f0f2f5;
+ background: #f5f7f9;
position: relative;
}
@@ -444,7 +443,7 @@ onMounted(() => {
flex-direction: column;
min-height: 100vh;
transition: margin-left 300ms ease;
- background: #f0f2f5;
+ background: #f5f7f9;
width: 100%;
}
@@ -474,11 +473,14 @@ onMounted(() => {
flex: 1;
overflow-y: scroll;
overflow-x: auto; /* 允许横向滚动,兼容极端窄屏 */
- background: #f0f2f5;
+ background: #f5f7f9;
}
.content-inner {
min-height: calc(100vh - 120px);
- padding: 16px;
+ padding: 12px 14px;
+}
+.content-inner.is-mobile {
+ padding: 8px;
}
diff --git a/layouts/admin/components/AdminAside.uvue b/layouts/admin/components/AdminAside.uvue
index b2870425..9a2db126 100644
--- a/layouts/admin/components/AdminAside.uvue
+++ b/layouts/admin/components/AdminAside.uvue
@@ -52,8 +52,7 @@ function getIconText(icon: string): string {
'user': '👥',
'product': '📦',
'order': '📜',
- 'marketing': '📉',
- 'content': '📝',
+ 'marketing': '📉', 'share': '📢', 'content': '📝',
'finance': '💰',
'statistic': '📊',
'setting': '⚙️',
diff --git a/layouts/admin/pages/HomeIndex.uvue b/layouts/admin/pages/HomeIndex.uvue
index 16f73a47..8d06963c 100644
--- a/layouts/admin/pages/HomeIndex.uvue
+++ b/layouts/admin/pages/HomeIndex.uvue
@@ -225,9 +225,8 @@ const statsData = ref({
+
diff --git a/pages/mall/admin/cms/category/list.uvue b/pages/mall/admin/cms/category/list.uvue
index 86e75809..00ebd37c 100644
--- a/pages/mall/admin/cms/category/list.uvue
+++ b/pages/mall/admin/cms/category/list.uvue
@@ -1,39 +1,39 @@
-
+
-
+
- 是否显示:
+ 鏄惁鏄剧ず:
- 请选择
- ▼
+ 璇烽€夋嫨
+ 鈻?/text>
- 分类名称:
-
+ 鍒嗙被鍚嶇О:
+
- 查询
+ 鏌ヨ
-
+
-
+
@@ -50,11 +50,11 @@
- 编辑
+ 缂栬緫
- 删除
+ 鍒犻櫎
- 查看文章
+ 鏌ョ湅鏂囩珷
@@ -62,73 +62,73 @@
-
+
- 上级分类:
+ 涓婄骇鍒嗙被:
- 顶级分类
- ▼
+ 椤剁骇鍒嗙被
+ 鈻?/text>
- *分类名称:
+ *鍒嗙被鍚嶇О:
-
+
- *分类简介:
+ *鍒嗙被绠€浠?
-
+
@@ -140,9 +140,9 @@ import { ref } from 'vue'
const filterKeyword = ref('')
const categoryList = ref([
- { id: '181', name: '购物心得', status: true },
- { id: '180', name: '消费文化', status: true },
- { id: '179', name: '品牌资讯', status: true }
+ { id: '181', name: '璐墿蹇冨緱', status: true },
+ { id: '180', name: '娑堣垂鏂囧寲', status: true },
+ { id: '179', name: '鍝佺墝璧勮', status: true }
])
const showDrawer = ref(false)
@@ -163,7 +163,7 @@ const handleAdd = () => {
const handleEdit = (item: any) => {
formName.value = item.name
- // 模拟填充其他字段
+ // 妯℃嫙濉厖鍏朵粬瀛楁
formDesc.value = ''
formSort.value = 0
formStatus.value = item.status
@@ -224,7 +224,7 @@ const handleQuery = () => { console.log('Querying...') }
.divider { width: 1px; height: 12px; background-color: #e8eaec; margin: 0 10px; }
.drawer-mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.4); z-index: 2000; transition: opacity 0.3s; }
.mask-fade-out { opacity: 0; }
-.drawer-content { position: absolute; top: 0; right: 0; width: 50%; height: 100%; background-color: #fff; display: flex; flex-direction: column; box-shadow: -2px 0 12px rgba(0, 0, 0, 0.2); animation: slideIn 0.3s ease; }
+.drawer-content { position: absolute; top: 0; right: 0; width: 50%; height: 100%; display: flex; flex-direction: column; box-shadow: -2px 0 12px rgba(0, 0, 0, 0.2); animation: slideIn 0.3s ease; }
.slide-out { animation: slideOut 0.3s ease forwards; }
@keyframes slideIn { from { transform: translateX(100%); } to { transform: translateX(0); } }
@keyframes slideOut { from { transform: translateX(0); } to { transform: translateX(100%); } }
@@ -264,3 +264,4 @@ const handleQuery = () => { console.log('Querying...') }
.cancel-txt { font-size: 14px; color: #606266; }
.confirm-txt { font-size: 14px; color: #fff; }
+
diff --git a/pages/mall/admin/decoration/category.uvue b/pages/mall/admin/decoration/category.uvue
index 89d7a058..bed9345b 100644
--- a/pages/mall/admin/decoration/category.uvue
+++ b/pages/mall/admin/decoration/category.uvue
@@ -1,58 +1,58 @@
-
+
-
+
-
+
-
+
- 🔍
- 点击搜索商品信息
+ 馃攳
+ 鐐瑰嚮鎼滅储鍟嗗搧淇℃伅
- 精选水果
+ 绮鹃€夋按鏋?/text>
- 🍐
- {{ ['精品香蕉','坚果优选','猕猴桃','大肉块','五花肉','鸡腿'][i-1] }}
+ 馃崘
+ {{ ['绮惧搧棣欒晧','鍧氭灉浼橀€?,'鐚曠尨妗?,'澶ц倝鍧?,'浜旇姳鑲?,'楦¤吙'][i-1] }}
- 肉制品
+ 鑲夊埗鍝?/text>
- 🥩
- {{ ['大肉块','五花肉','鸡腿'][i-1] }}
+ 馃ォ
+ {{ ['澶ц倝鍧?,'浜旇姳鑲?,'楦¤吙'][i-1] }}
@@ -60,124 +60,124 @@
- 🏠
- 📂
- 🛒
- 👤
+ 馃彔
+ 馃搨
+ 馃洅
+ 馃懁
- 样式1
+ 鏍峰紡1
-
+
- 🔍
- 点击搜索商品信息
+ 馃攳
+ 鐐瑰嚮鎼滅储鍟嗗搧淇℃伅
- 水果
- 全部
- 热带水果
- 西瓜葡萄
- ▼
+ 姘存灉
+ 鍏ㄩ儴
+ 鐑甫姘存灉
+ 瑗跨摐钁¤悇
+ 鈻?/text>
- 深层 V8 高清直屏\n双镜头/VR科技体验
+ 娣卞眰 V8 楂樻竻鐩村睆\n鍙岄暅澶?VR绉戞妧浣撻獙
- Haier/海尔 BCD-216STPT 时尚静音冰箱 三门出门租家用小型电冰箱
+ Haier/娴峰皵 BCD-216STPT 鏃跺皻闈欓煶鍐扮 涓夐棬鍑洪棬绉熷鐢ㄥ皬鍨嬬數鍐扮
- ¥999.00
- 已售 92
- 立即购买
+ 楼999.00
+ 宸插敭 92
+ 绔嬪嵆璐拱
- 🛒7
+ 馃洅7
- 样式2
+ 鏍峰紡2
-
+
- 🏠
+ 馃彔
- 🔍
- 搜索商品
+ 馃攳
+ 鎼滅储鍟嗗搧
- 水果
- 时时生鲜
- 休闲零食
- 坚果蜜饯
- ∨
+ 姘存灉
+ 鏃舵椂鐢熼矞
+ 浼戦棽闆堕
+ 鍧氭灉铚滈ク
+ 鈭?/text>
- 【橙中爱马仕】果际新骑士晚季甜橙10个单装
- ¥25.99
+ 銆愭涓埍椹粫銆戞灉闄呮柊楠戝+鏅氬鐢滄10涓崟瑁?/text>
+ 楼25.99
- 🛒
+ 馃洅
- 🛒7
- ¥999.00
- 去结算
+ 馃洅7
+ 楼999.00
+ 鍘荤粨绠?/text>
- 样式3
+ 鏍峰紡3
@@ -192,7 +192,7 @@ const selectedStyle = ref(1)
const handleSave = () => {
console.log('Saving classification style:', selectedStyle.value)
- uni.showToast({ title: '保存成功', icon: 'success' })
+ uni.showToast({ title: '淇濆瓨鎴愬姛', icon: 'success' })
}
const handleReset = () => {
@@ -362,7 +362,7 @@ const handleReset = () => {
.t3-item.specialty { background-color: #f2270c; color: #fff; padding: 2px 8px; border-radius: 10px; }
.t3-arrow { font-size: 12px; color: #ccc; flex: 1; text-align: right; }
-.style3-content { flex: 1; display: flex; flex-direction: row; background-color: #fff; }
+.style3-content { flex: 1; display: flex; flex-direction: row; }
.sidebar-v3 { width: 75px; background-color: #f7f7f7; }
.s3-item { height: 50px; display: flex; align-items: center; justify-content: center; font-size: 12px; color: #666; }
.s3-item.active { background-color: #fff; color: #333; font-weight: bold; position: relative; }
@@ -383,3 +383,4 @@ const handleReset = () => {
.c3-price { font-size: 14px; color: #f2270c; font-weight: bold; flex: 1; }
.btn-settle-v3 { background-color: #f2270c; padding: 6px 20px; border-radius: 20px; }
+
diff --git a/pages/mall/admin/decoration/data-config.uvue b/pages/mall/admin/decoration/data-config.uvue
index 5252236e..d711d1ed 100644
--- a/pages/mall/admin/decoration/data-config.uvue
+++ b/pages/mall/admin/decoration/data-config.uvue
@@ -1,35 +1,35 @@
-
+
-
+
-
+
-
+
activeKey = k"
/>
-
+
-
+
-
+
- 开启广告
+ 寮€鍚箍鍛?/text>
- 广告时间
+ 骞垮憡鏃堕棿
- 单位(秒)
+ 鍗曚綅(绉?
-
+
- 开屏广告已关闭,开启后可配置图片
+ 寮€灞忓箍鍛婂凡鍏抽棴锛屽紑鍚悗鍙厤缃浘鐗?/text>
@@ -82,48 +82,48 @@ import MenuSide from '@/pages/mall/admin/decoration/components/MenuSide.uvue'
import PhonePreview from '@/pages/mall/admin/decoration/components/PhonePreview.uvue'
import CarouselEditor from '@/pages/mall/admin/decoration/components/CarouselEditor.uvue'
-// 状态定义
+// 鐘舵€佸畾涔?
const activeKey = ref('jingpin')
const categories = reactive([
- { key: 'jingpin', label: '首页精品推荐图片', type: 'carousel', recommendSizeText: '建议尺寸:690 * 240px,拖拽图片可调整图片顺序哦,最多添加五张' },
- { key: 'hot', label: '热门榜单推荐图片', type: 'carousel', recommendSizeText: '建议尺寸:690 * 240px,拖拽图片可调整图片顺序哦,最多添加五张' },
- { key: 'new', label: '首发新品推荐图片', type: 'carousel', recommendSizeText: '建议尺寸:690 * 240px,拖拽图片可调整图片顺序哦,最多添加五张' },
- { key: 'promo', label: '促销单品推荐图片', type: 'carousel', recommendSizeText: '建议尺寸:690 * 240px,拖拽图片可调整图片顺序哦,最多添加五张' },
- { key: 'login', label: '后台登录页面幻灯片', type: 'carousel', recommendSizeText: '建议尺寸:690 * 240px,拖拽图片可调整图片顺序哦,最多添加五张' },
- { key: 'group', label: '拼团列表轮播图', type: 'carousel', recommendSizeText: '建议尺寸:710 * 300px,拖拽图片可调整图片顺序哦,最多添加五张' },
- { key: 'points', label: '积分商城轮播图', type: 'carousel', recommendSizeText: '建议尺寸:710 * 300px,拖拽图片可调整图片顺序哦,最多添加五张' },
- { key: 'ad', label: '开屏广告', type: 'ad', recommendSizeText: '建议尺寸:750 * 1334px,拖拽图片可调整图片顺序哦,最多添加五张' }
+ { key: 'jingpin', label: '棣栭〉绮惧搧鎺ㄨ崘鍥剧墖', type: 'carousel', recommendSizeText: '寤鸿灏哄锛?90 * 240px锛屾嫋鎷藉浘鐗囧彲璋冩暣鍥剧墖椤哄簭鍝︼紝鏈€澶氭坊鍔犱簲寮? },
+ { key: 'hot', label: '鐑棬姒滃崟鎺ㄨ崘鍥剧墖', type: 'carousel', recommendSizeText: '寤鸿灏哄锛?90 * 240px锛屾嫋鎷藉浘鐗囧彲璋冩暣鍥剧墖椤哄簭鍝︼紝鏈€澶氭坊鍔犱簲寮? },
+ { key: 'new', label: '棣栧彂鏂板搧鎺ㄨ崘鍥剧墖', type: 'carousel', recommendSizeText: '寤鸿灏哄锛?90 * 240px锛屾嫋鎷藉浘鐗囧彲璋冩暣鍥剧墖椤哄簭鍝︼紝鏈€澶氭坊鍔犱簲寮? },
+ { key: 'promo', label: '淇冮攢鍗曞搧鎺ㄨ崘鍥剧墖', type: 'carousel', recommendSizeText: '寤鸿灏哄锛?90 * 240px锛屾嫋鎷藉浘鐗囧彲璋冩暣鍥剧墖椤哄簭鍝︼紝鏈€澶氭坊鍔犱簲寮? },
+ { key: 'login', label: '鍚庡彴鐧诲綍椤甸潰骞荤伅鐗?, type: 'carousel', recommendSizeText: '寤鸿灏哄锛?90 * 240px锛屾嫋鎷藉浘鐗囧彲璋冩暣鍥剧墖椤哄簭鍝︼紝鏈€澶氭坊鍔犱簲寮? },
+ { key: 'group', label: '鎷煎洟鍒楄〃杞挱鍥?, type: 'carousel', recommendSizeText: '寤鸿灏哄锛?10 * 300px锛屾嫋鎷藉浘鐗囧彲璋冩暣鍥剧墖椤哄簭鍝︼紝鏈€澶氭坊鍔犱簲寮? },
+ { key: 'points', label: '绉垎鍟嗗煄杞挱鍥?, type: 'carousel', recommendSizeText: '寤鸿灏哄锛?10 * 300px锛屾嫋鎷藉浘鐗囧彲璋冩暣鍥剧墖椤哄簭鍝︼紝鏈€澶氭坊鍔犱簲寮? },
+ { key: 'ad', label: '寮€灞忓箍鍛?, type: 'ad', recommendSizeText: '寤鸿灏哄锛?50 * 1334px锛屾嫋鎷藉浘鐗囧彲璋冩暣鍥剧墖椤哄簭鍝︼紝鏈€澶氭坊鍔犱簲寮? }
])
-// 初始化数据
+// 鍒濆鍖栨暟鎹?
const configMap = reactive>({
'jingpin': { max: 5, items: [{ id: 1, name: '1', imageUrl: '', link: { type: 'internal', value: '/pages/points_mall/integral_index' }, sort: 0 }] },
'hot': { max: 5, items: [{ id: 1, name: '1', imageUrl: '', link: { type: 'internal', value: '/pages/index/index' }, sort: 0 }] },
'new': { max: 5, items: [{ id: 1, name: '1', imageUrl: '', link: { type: 'internal', value: '/pages/index/index' }, sort: 0 }] },
'promo': { max: 5, items: [{ id: 1, name: '1', imageUrl: '', link: { type: 'internal', value: '/pages/points_mall/integral_index' }, sort: 0 }] },
'login': { max: 5, items: [{ id: 1, name: '1', imageUrl: '', link: { type: 'internal', value: '' }, sort: 0 }] },
- 'group': { max: 5, items: [{ id: 1, name: '拼团', imageUrl: '', link: { type: 'internal', value: '/pages/activity/goods_combination/index' }, sort: 0 }] },
+ 'group': { max: 5, items: [{ id: 1, name: '鎷煎洟', imageUrl: '', link: { type: 'internal', value: '/pages/activity/goods_combination/index' }, sort: 0 }] },
'points': { max: 5, items: [{ id: 1, name: '1', imageUrl: '', link: { type: 'internal', value: '/pages/points_mall/integral_index' }, sort: 0 }] },
'ad': { enabled: false, durationSeconds: 3, max: 5, items: [] }
})
-// 计算属性
+// 璁$畻灞炴€?
const activeCategory = computed(() => categories.find(c => c.key === activeKey.value))
const activeLabel = computed(() => activeCategory.value?.label ?? '')
const activeConfig = computed(() => configMap[activeKey.value])
const activeTitle = computed(() => {
- if (activeKey.value === 'ad') return '引导页设置'
- if (activeKey.value === 'login') return '幻灯片设置'
- return '轮播图设置'
+ if (activeKey.value === 'ad') return '寮曞椤佃缃?
+ if (activeKey.value === 'login') return '骞荤伅鐗囪缃?
+ return '杞挱鍥捐缃?
})
-// 方法
+// 鏂规硶
const handleSave = () => {
- uni.showLoading({ title: '保存中...' })
+ uni.showLoading({ title: '淇濆瓨涓?..' })
setTimeout(() => {
uni.hideLoading()
- uni.showToast({ title: '保存成功', icon: 'success' })
+ uni.showToast({ title: '淇濆瓨鎴愬姛', icon: 'success' })
}, 800)
}
@@ -134,7 +134,7 @@ const handleSwitchAd = (e: any) => {
const handleAddItem = () => {
const config = activeConfig.value
if (config.items.length >= config.max) {
- uni.showToast({ title: `最多添加 ${config.max} 条`, icon: 'none' })
+ uni.showToast({ title: `鏈€澶氭坊鍔?${config.max} 鏉, icon: 'none' })
return
}
config.items.push({
@@ -167,11 +167,11 @@ const handleUpdateItem = (payload: any) => {
const handleSelectLink = (index: number) => {
uni.showActionSheet({
- itemList: ['内部页面', '外部链接', '其他小程序'],
+ itemList: ['鍐呴儴椤甸潰', '澶栭儴閾炬帴', '鍏朵粬灏忕▼搴?],
success: (res) => {
const types: LinkType[] = ['internal', 'external', 'miniProgram']
activeConfig.value.items[index].link.type = types[res.tapIndex]
- uni.showToast({ title: '功能建设中', icon: 'none' })
+ uni.showToast({ title: '鍔熻兘寤鸿涓?, icon: 'none' })
}
})
}
@@ -219,12 +219,12 @@ const handleSelectLink = (index: number) => {
display: flex;
flex-direction: row;
min-height: 800px;
- background-color: #fff;
+
border-radius: 8px;
overflow: hidden;
}
-/* 右侧设置 */
+/* 鍙充晶璁剧疆 */
.settings-column {
flex: 1;
padding: 30px;
@@ -243,7 +243,7 @@ const handleSelectLink = (index: number) => {
.settings-desc-box { margin-bottom: 24px; padding-left: 13px; }
.settings-desc { font-size: 13px; color: #999; }
-/* 开屏广告特有样式 */
+/* 寮€灞忓箍鍛婄壒鏈夋牱寮?*/
.ad-special-fields { padding: 20px; background-color: #f6f8fb; border-radius: 8px; margin-bottom: 20px; }
.form-row { display: flex; flex-direction: row; align-items: center; margin-bottom: 15px; }
.field-label { width: 80px; font-size: 14px; color: #333; }
@@ -257,3 +257,4 @@ const handleSelectLink = (index: number) => {
.anim-fade-in { animation: fadeIn 0.4s ease-out; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
+
diff --git a/pages/mall/admin/decoration/home.uvue b/pages/mall/admin/decoration/home.uvue
index cb666372..a75df58d 100644
--- a/pages/mall/admin/decoration/home.uvue
+++ b/pages/mall/admin/decoration/home.uvue
@@ -1,23 +1,23 @@
-
+
-
+
@@ -43,8 +43,8 @@
- 📢
- CRMEB 年中618活动开启进行中!
+ 馃摙
+ CRMEB 骞翠腑618娲诲姩寮€鍚繘琛屼腑锛?/text>
>
@@ -52,11 +52,11 @@
- ⭐
- 周{{ weekDays[i-1] }}
+ 猸?/view>
+ 鍛▄{ weekDays[i-1] }}
- 签到
+ 绛惧埌
@@ -66,54 +66,54 @@
- 🏠
- 首页
+ 馃彔
+ 棣栭〉
- 📂
- 分类
+ 馃搨
+ 鍒嗙被
- 🛒
- 购物车
+ 馃洅
+ 璐墿杞?/text>
- 👤
- 我的
+ 馃懁
+ 鎴戠殑
-
+
- 添加页面
+ 娣诲姞椤甸潰
- 导入模板
+ 瀵煎叆妯℃澘
-
+
{{ item.id }}
{{ item.name }}
-
+
{{ item.type }}
@@ -121,27 +121,27 @@
{{ item.updateTime }}
- 编辑
+ 缂栬緫
|
- 删除
+ 鍒犻櫎
|
- 预览
+ 棰勮
|
- 设为首页
- |
- 导出模板
+ 璁句负棣栭〉
+ |
+ 瀵煎嚭妯℃澘
-
+
-
+
- 页面名称
-
+ 椤甸潰鍚嶇О
+
- 页面类型
+ 椤甸潰绫诲瀷
-
-
- 首页
+
+
+ 棣栭〉
-
-
- 专题页
+
+
+ 涓撻椤?/text>
- 选择模板
- 请选择要引用的模板
+ 閫夋嫨妯℃澘
+ 璇烽€夋嫨瑕佸紩鐢ㄧ殑妯℃澘
- 📄
+ 馃搫
- 通用模板 {{ i }}
+ 閫氱敤妯℃澘 {{ i }}
@@ -217,28 +217,28 @@
+
+
+
+
diff --git a/pages/mall/admin/distribution/division/apply.uvue b/pages/mall/admin/distribution/division/apply.uvue
new file mode 100644
index 00000000..ce1cec4d
--- /dev/null
+++ b/pages/mall/admin/distribution/division/apply.uvue
@@ -0,0 +1,117 @@
+
+
+
+
+
+ 鎼滅储锛?/text>
+
+
+
+
+
+
+
+
+
+
+
+ {{ tab }}
+
+
+
+
+
+
+
+
+ {{ item.uid }}
+ {{ item.name }}
+ {{ item.phone }}
+ {{ item.deptName }}
+
+
+
+ {{ item.time }}
+
+ {{ item.statusText }}
+
+ {{ item.code }}
+
+ 鍚屾剰
+ |
+ 鎷掔粷
+ |
+ 鍒犻櫎
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/distribution/division/list.uvue b/pages/mall/admin/distribution/division/list.uvue
new file mode 100644
index 00000000..f52c973d
--- /dev/null
+++ b/pages/mall/admin/distribution/division/list.uvue
@@ -0,0 +1,110 @@
+
+
+
+
+
+ 鎼滅储锛?/text>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.uid }}
+
+
+
+ {{ item.name }}
+ {{ item.code }}
+ {{ item.ratio }}%
+ {{ item.agentCount }}
+ {{ item.endTime }}
+
+
+
+
+ 鏌ョ湅浠g悊鍟?/text>
+ |
+ 缂栬緫
+ |
+ 鍒犻櫎
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/distribution/level/index.uvue b/pages/mall/admin/distribution/level/index.uvue
new file mode 100644
index 00000000..bfa00804
--- /dev/null
+++ b/pages/mall/admin/distribution/level/index.uvue
@@ -0,0 +1,258 @@
+
+
+
+
+
+ 鏄惁鏄剧ず锛?/text>
+
+ 鍏ㄩ儴
+ 鈻?/text>
+
+
+
+ 绛夌骇鍚嶇О锛?/text>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.id }}
+
+
+
+ {{ item.name }}
+ {{ item.level }}
+ {{ item.percent1 }}%
+ {{ item.percent2 }}%
+ {{ item.taskTotal }}
+ {{ item.taskFinish }}
+
+
+
+
+ 绛夌骇浠诲姟
+ |
+ 缂栬緫
+ |
+ 鍒犻櫎
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/distribution/promoter/index.uvue b/pages/mall/admin/distribution/promoter/index.uvue
new file mode 100644
index 00000000..71669fd1
--- /dev/null
+++ b/pages/mall/admin/distribution/promoter/index.uvue
@@ -0,0 +1,305 @@
+
+
+
+
+
+
+ 鏃堕棿閫夋嫨锛?/text>
+
+ 寮€濮嬫棩鏈?- 缁撴潫鏃ユ湡
+ 馃搮
+
+
+
+
+ 鎼滅储锛?/text>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.id }}
+
+
+
+
+
+ 鏄电О:{{ item.nickname }}
+ 濮撳悕:{{ item.name }}
+ 鐢佃瘽:{{ item.phone }}
+
+
+ {{ item.level }}
+ {{ item.userCount }}
+ {{ item.orderCount }}
+ {{ item.orderAmount }}
+ {{ item.commissionTotal }}
+ {{ item.withdrawnAmount }}
+ {{ item.withdrawCount }}
+ {{ item.unwithdrawnAmount }}
+
+ 鎺ㄥ箍浜?/text>
+ |
+ 鏇村
+ 鈻?/text>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/distribution/setting/index.uvue b/pages/mall/admin/distribution/setting/index.uvue
new file mode 100644
index 00000000..89a1d864
--- /dev/null
+++ b/pages/mall/admin/distribution/setting/index.uvue
@@ -0,0 +1,508 @@
+
+
+
+
+
+ {{ tab }}
+
+
+
+
+
+
+
+ 分销启用:
+ form.statue = e.detail.value">
+
+
+
+ 商城分销功能开启关闭
+
+
+
+ 分销模式:
+ form.extract_type = e.detail.value">
+
+
+
+
+ 人人分销"默认每个人都可以分销,“指定分销”仅后台手动设置推广员,“满额分销”指用户购买商品满足消费金额后自动开启分销
+
+
+
+ 分销关系绑定:
+ form.bind_type = e.detail.value">
+
+
+
+ 所有用户”指所有没有上级推广人的用户点击或扫码即绑定分销关系,“新用户”指新注册的用户或首次进入系统的用户才会绑定推广关系
+
+
+
+ 绑定模式:
+ form.store_brokerage_binding_status = e.detail.value">
+
+
+
+
+ 永久”一次绑定永久有效,“有效期”绑定后一段时间内有效,“临时”临时有效
+
+
+
+ 分销海报图:
+
+
+
+ +
+
+
+ 个人中心分销海报图片,建议尺寸600x1000
+
+
+
+ 分销层级:
+ form.brokerage_level = e.detail.value">
+
+
+
+ 分销层级,一级是只返上一层的佣金,二级是返上级 and 上上级的佣金
+
+
+
+ 事业部开关:
+ form.is_area_manager = e.detail.value">
+
+
+
+ 事业部开关,关闭后不计算事业部佣金
+
+
+
+ 代理商申请开关:
+ form.is_agent_apply = e.detail.value">
+
+
+
+ 控制移动端我的推广页面的代理商申请按钮是否显示
+
+
+
+ 佣金悬浮窗开关:
+ form.is_commission_window = e.detail.value">
+
+
+
+ 佣金悬浮窗开关,关闭之后,商品详情不显示佣金悬浮窗
+
+
+
+
+
+
+
+
+ 自购返佣:
+ form.is_self_brokerage = e.detail.value">
+
+
+
+ 是否开启自购返佣(开启:分销员自己购买商品,享受一级返佣,上级享受二级返佣;关闭:分销员自己购买商品没有返佣)
+
+
+
+ 购买付费会员返佣:
+ form.is_member_brokerage = e.detail.value">
+
+
+
+ 购买付费会员是否按照设置的佣金比例进行返佣
+
+
+
+ 返佣类型:
+ form.brokerage_type = e.detail.value">
+
+
+
+ 选择返佣类型,按照商品价格返佣(按照商品售价计算返佣金额)以及按照实际支付价格返佣(按照商品的实际支付价格计算返佣)
+
+
+
+ 推广用户返佣:
+ form.is_promoter_brokerage = e.detail.value">
+
+
+
+ 分销推广用户获取佣金
+
+
+
+ 推广佣金单价:
+
+ form.promoter_brokerage_price = e.detail.value" />
+
+ 分销推广佣金单价(每推广一个用户)
+
+
+
+ 每日推广佣金上限:
+
+ form.promoter_brokerage_day_max = e.detail.value" />
+
+ 每日推广佣金上限(0:不发佣金;-1:不限制;最好是推广佣金单价的整数倍)
+
+
+
+ 一级返佣比例:
+
+ form.store_brokerage_ratio = e.detail.value" />
+
+ 订单交易成功后给上级返佣的比例0 - 100,例:5 = 反订单商品金额的5%
+
+
+
+ 二级返佣比例:
+
+ form.store_brokerage_two_ratio = e.detail.value" />
+
+ 订单交易成功后给上上级返佣的比例0 - 100,例:5 = 反订单商品金额 of 5%
+
+
+
+ 冻结时间:
+
+ form.extract_frozen_time = e.detail.value" />
+
+ 防止用户退款,佣金被提现了,所以需要设置佣金冻结时间(天)
+
+
+
+
+
+
+
+
+ 提现最低金额:
+ form.user_extract_min_price = e.detail.value" />
+ 用户提现最低金额限制
+
+
+
+ 提现银行卡:
+
+ 配置提现银行卡类型,每个银行换行
+
+
+
+ 提现方式:
+ form.extract_type_list = e.detail.value">
+
+
+
+
+ 开启后用户可以选择该提现方式
+
+
+
+ 微信提现:
+ form.wechat_extract_type = e.detail.value">
+
+
+
+ 微信提现方式:手动线下转账,自动转账到零钱(需开通商家转账到零钱)
+
+
+
+ 支付宝提现:
+ form.alipay_extract_type = e.detail.value">
+
+
+
+ 支付宝提现方式:手动线下转账,自动转账到余额(需开通支付宝转账)
+
+
+
+ 提现手续费:
+ form.user_extract_fee = e.detail.value" />
+ 提现手续费百分比,范围0-100,0为无提现手续费,例:设置10,即收取10%手续费,提现100元,到账90元,10元手续费
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/mall/admin/finance/balance_stats.uvue b/pages/mall/admin/finance/balance_stats.uvue
index 487852ff..df1b9746 100644
--- a/pages/mall/admin/finance/balance_stats.uvue
+++ b/pages/mall/admin/finance/balance_stats.uvue
@@ -1,63 +1,63 @@
-
+
-
+
- 💰
+ 馃挵
1447117274.55
- 当前余额
+ 褰撳墠浣欓
- 🏦
+ 馃彟
1602611838.49
- 累计余额
+ 绱浣欓
- 💳
+ 馃挸
155494563.94
- 累计消耗余额
+ 绱娑堣€椾綑棰?/text>
-
+
- 时间选择:
+ 鏃堕棿閫夋嫨:
- 📅
+ 馃搮
2026/01/05 - 2026/02/03
-
+
@@ -65,26 +65,26 @@
-
+
-
+
-
+
@@ -104,22 +104,22 @@
-
+
-
+
@@ -149,28 +149,28 @@ const trendOption = ref(null)
const sourceOption = ref(null)
const consumptionOption = ref(null)
-// 样式切换状态: 0=图表, 1=列表
+// 鏍峰紡鍒囨崲鐘舵€? 0=鍥捐〃, 1=鍒楄〃
const sourceStyleMode = ref(0)
const consumptionStyleMode = ref(0)
-// 统计数据 (使用 ref 保证响应式)
+// 缁熻鏁版嵁 (浣跨敤 ref 淇濊瘉鍝嶅簲寮?
const sourceData = ref([
- { value: 125000.00, name: '系统增加', percent: 40.00 },
- { value: 93750.00, name: '用户充值', percent: 30.00 },
- { value: 78125.00, name: '佣金提现', percent: 25.00 },
- { value: 62500.00, name: '抽奖赠送', percent: 20.00 },
- { value: 46875.00, name: '商品退款', percent: 15.00 }
+ { value: 125000.00, name: '绯荤粺澧炲姞', percent: 40.00 },
+ { value: 93750.00, name: '鐢ㄦ埛鍏呭€?, percent: 30.00 },
+ { value: 78125.00, name: '浣i噾鎻愮幇', percent: 25.00 },
+ { value: 62500.00, name: '鎶藉璧犻€?, percent: 20.00 },
+ { value: 46875.00, name: '鍟嗗搧閫€娆?, percent: 15.00 }
])
const consumptionDataList = ref([
- { value: 435692.51, name: '购买商品', percent: 50.00 },
- { value: 8060.18, name: '购买会员', percent: 20.00 },
- { value: 0.00, name: '充值退款', percent: 15.00 },
- { value: 0.00, name: '系统减少', percent: 15.00 }
+ { value: 435692.51, name: '璐拱鍟嗗搧', percent: 50.00 },
+ { value: 8060.18, name: '璐拱浼氬憳', percent: 20.00 },
+ { value: 0.00, name: '鍏呭€奸€€娆?, percent: 15.00 },
+ { value: 0.00, name: '绯荤粺鍑忓皯', percent: 15.00 }
])
/**
- * 转换 Plain Object 工具
+ * 杞崲 Plain Object 宸ュ叿
*/
function toPlainObject(obj : any) : any {
if (obj == null) return null
@@ -225,14 +225,14 @@ function initTrendChart() {
},
series: [
{
- name: '余额积累',
+ name: '浣欓绉疮',
type: 'line',
smooth: true,
data: accumulationData,
itemStyle: { color: '#1890ff' }
},
{
- name: '余额消耗',
+ name: '浣欓娑堣€?,
type: 'line',
smooth: true,
data: consumptionData,
@@ -250,12 +250,12 @@ function initSourceChart() {
color: ['#5b8ff9', '#5ad8a6', '#5d7092', '#f6bd16', '#e8684a'],
series: [
{
- name: '余额来源',
+ name: '浣欓鏉ユ簮',
type: 'pie',
radius: '70%',
center: ['40%', '50%'],
label: { show: true, fontSize: 11, formatter: '{b}\n{c}%' },
- // 关键点:将图表数据映射到 percent 字段
+ // 鍏抽敭鐐癸細灏嗗浘琛ㄦ暟鎹槧灏勫埌 percent 瀛楁
data: sourceData.value.map(item => ({ value: item.percent, name: item.name }))
}
]
@@ -270,12 +270,12 @@ function initConsumptionChart() {
color: ['#5b8ff9', '#5ad8a6', '#5d7092', '#f6bd16'],
series: [
{
- name: '余额消耗',
+ name: '浣欓娑堣€?,
type: 'pie',
radius: '70%',
center: ['40%', '50%'],
label: { show: true, fontSize: 11, formatter: '{b}\n{c}%' },
- // 关键点:将图表数据映射到 percent 字段
+ // 鍏抽敭鐐癸細灏嗗浘琛ㄦ暟鎹槧灏勫埌 percent 瀛楁
data: consumptionDataList.value.map(item => ({ value: item.percent, name: item.name }))
}
]
@@ -311,7 +311,7 @@ function toggleConsumptionStyle() {
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
}
-/* 顶部卡片 */
+/* 椤堕儴鍗$墖 */
.stats-grid {
display: flex;
flex-direction: row;
@@ -365,7 +365,7 @@ function toggleConsumptionStyle() {
margin-top: 4px;
}
-/* 时间筛选区 */
+/* 鏃堕棿绛涢€夊尯 */
.filter-bar {
padding: 16px 24px;
margin-bottom: 20px;
@@ -397,7 +397,7 @@ function toggleConsumptionStyle() {
.calendar-icon { font-size: 14px; color: #c0c4cc; margin-right: 10px; }
.date-range { font-size: 14px; color: #606266; }
-/* 趋势图表区 */
+/* 瓒嬪娍鍥捐〃鍖?*/
.chart-box {
padding: 24px;
margin-bottom: 20px;
@@ -436,7 +436,7 @@ function toggleConsumptionStyle() {
height: 100%;
}
-/* 底部分析 */
+/* 搴曢儴鍒嗘瀽 */
.bottom-analysis {
display: flex;
flex-direction: row;
@@ -478,7 +478,7 @@ function toggleConsumptionStyle() {
height: 100%;
}
-/* 列表样式 */
+/* 鍒楄〃鏍峰紡 */
.stats-table {
display: flex;
flex-direction: column;
@@ -521,7 +521,7 @@ function toggleConsumptionStyle() {
.progress-container {
flex: 1;
height: 8px;
- background-color: #f5f5f5;
+
border-radius: 4px;
margin-right: 10px;
overflow: hidden;
@@ -539,3 +539,4 @@ function toggleConsumptionStyle() {
color: #666;
}
+
diff --git a/pages/mall/admin/finance/record.uvue b/pages/mall/admin/finance/record.uvue
index 0e7a66be..aac9c9af 100644
--- a/pages/mall/admin/finance/record.uvue
+++ b/pages/mall/admin/finance/record.uvue
@@ -1,15 +1,15 @@
-
+
- 页面占位
- 该功能模块正在开发中
- 当前采用 CRMEB 路由体系 1:1 映射
+ 椤甸潰鍗犱綅
+ 璇ュ姛鑳芥ā鍧楁鍦ㄥ紑鍙戜腑
+ 褰撳墠閲囩敤 CRMEB 璺敱浣撶郴 1:1 鏄犲皠
@@ -18,14 +18,14 @@
+
+
diff --git a/pages/mall/admin/finance/withdrawal.uvue b/pages/mall/admin/finance/withdrawal.uvue
index 61e9980d..d610fdf9 100644
--- a/pages/mall/admin/finance/withdrawal.uvue
+++ b/pages/mall/admin/finance/withdrawal.uvue
@@ -1,14 +1,14 @@
-
+
-
+
- 时间选择:
-
+ 鏃堕棿閫夋嫨:
+
- 提现状态:
+ 鎻愮幇鐘舵€?
{{ statusLabel }}
@@ -17,7 +17,7 @@
- 提现方式:
+ 鎻愮幇鏂瑰紡:
{{ methodLabel }}
@@ -26,14 +26,14 @@
- 搜索:
-
+ 鎼滅储:
+
-
+
-
+
@@ -46,27 +46,27 @@
-
+
- 佣金记录
+ 浣i噾璁板綍
-
+
@@ -79,7 +79,7 @@
{{ item.nickname }}
- 用户id:{{ item.userId }}
+ 鐢ㄦ埛id:{{ item.userId }}
@@ -88,26 +88,26 @@
{{ item.netAmount }}
- 姓名:{{ item.name }}
+ 濮撳悕:{{ item.name }}
{{ item.type }}:{{ item.account }}
- 银行开户地址:{{ item.bank }}
+ 閾惰寮€鎴峰湴鍧€:{{ item.bank }}
- ■
+ 鈻?/text>
{{ item.time }}
- 申请中
+ 鐢宠涓?/text>
- 编辑
+ 缂栬緫
|
- 通过
+ 閫氳繃
|
- 驳回
+ 椹冲洖
@@ -126,61 +126,61 @@ const methodValue = ref('all')
const searchKeyword = ref('')
const statusOptions = ref([
- { value: 'all', text: '全部' },
- { value: '0', text: '待审核' },
- { value: '1', text: '已通过' },
- { value: '-1', text: '已驳回' }
+ { value: 'all', text: '鍏ㄩ儴' },
+ { value: '0', text: '寰呭鏍? },
+ { value: '1', text: '宸查€氳繃' },
+ { value: '-1', text: '宸查┏鍥? }
])
const methodOptions = ref([
- { value: 'all', text: '全部' },
- { value: 'alipay', text: '支付宝' },
- { value: 'bank', text: '银行卡' },
- { value: 'weixin', text: '微信' }
+ { value: 'all', text: '鍏ㄩ儴' },
+ { value: 'alipay', text: '鏀粯瀹? },
+ { value: 'bank', text: '閾惰鍗? },
+ { value: 'weixin', text: '寰俊' }
])
const statusLabel = computed(() => {
const item = statusOptions.value.find((opt: any) => opt.value === statusValue.value)
- return item ? item.text : '全部'
+ return item ? item.text : '鍏ㄩ儴'
})
const methodLabel = computed(() => {
const item = methodOptions.value.find((opt: any) => opt.value === methodValue.value)
- return item ? item.text : '全部'
+ return item ? item.text : '鍏ㄩ儴'
})
const stats = ref([
- { label: '佣金总金额', value: '676809.25', icon: '$', colorClass: 'blue' },
- { label: '待提现金额', value: '71', icon: '¥', colorClass: 'orange' },
- { label: '已提现金额', value: '68879.25', icon: '$', colorClass: 'green' },
- { label: '未提现金额', value: '607930.00', icon: '¥', colorClass: 'pink' }
+ { label: '浣i噾鎬婚噾棰?, value: '676809.25', icon: '$', colorClass: 'blue' },
+ { label: '寰呮彁鐜伴噾棰?, value: '71', icon: '楼', colorClass: 'orange' },
+ { label: '宸叉彁鐜伴噾棰?, value: '68879.25', icon: '$', colorClass: 'green' },
+ { label: '鏈彁鐜伴噾棰?, value: '607930.00', icon: '楼', colorClass: 'pink' }
])
const tableData = ref([
{
id: 57,
- nickname: '用户昵称: 177****766',
+ nickname: '鐢ㄦ埛鏄电О: 177****766',
userId: '58837',
amount: '20.00',
fee: '0.00',
netAmount: '20.00',
- name: '接口',
- type: '支付宝',
+ name: '鎺ュ彛',
+ type: '鏀粯瀹?,
account: '1195953899',
time: '2025-10-24 16:04',
remark: ''
},
{
id: 56,
- nickname: '用户昵称: 测试员的',
+ nickname: '鐢ㄦ埛鏄电О: 娴嬭瘯鍛樼殑',
userId: '20695',
amount: '1.00',
fee: '0.00',
netAmount: '1.00',
name: '123',
- type: '银行卡',
+ type: '閾惰鍗?,
account: '4001231221',
- bank: '中国银行',
+ bank: '涓浗閾惰',
time: '2025-07-04 15:11',
remark: ''
}
@@ -206,7 +206,7 @@ const handleQuery = () => {
min-height: 100vh;
}
-/* 筛选样式更新 */
+/* 绛涢€夋牱寮忔洿鏂?*/
.filter-card {
background-color: #fff;
padding: 24px;
@@ -284,7 +284,7 @@ const handleQuery = () => {
margin-bottom: 16px;
}
-/* 统计卡片样式 */
+/* 缁熻鍗$墖鏍峰紡 */
.stats-grid {
display: flex;
flex-direction: row;
@@ -338,7 +338,7 @@ const handleQuery = () => {
margin-top: 6px;
}
-/* 操作区域 */
+/* 鎿嶄綔鍖哄煙 */
.action-section {
margin-bottom: 12px;
display: flex;
@@ -359,9 +359,9 @@ const handleQuery = () => {
font-size: 13px;
}
-/* 表格容器样式 (Flex 模拟) */
+/* 琛ㄦ牸瀹瑰櫒鏍峰紡 (Flex 妯℃嫙) */
.table-container {
- background-color: #fff;
+
border-radius: 4px;
overflow: hidden;
display: flex;
@@ -411,7 +411,7 @@ const handleQuery = () => {
color: #606266;
}
-/* 列宽定义 (与截图匹配) */
+/* 鍒楀瀹氫箟 (涓庢埅鍥惧尮閰? */
.col-id { width: 60px; }
.col-user { width: 180px; justify-content: flex-start; }
.col-amount { width: 100px; }
@@ -424,7 +424,7 @@ const handleQuery = () => {
.col-status { width: 100px; }
.col-ops { width: 160px; }
-/* 用户信息单元格 */
+/* 鐢ㄦ埛淇℃伅鍗曞厓鏍?*/
.user-info-box {
display: flex;
flex-direction: row;
@@ -463,7 +463,7 @@ const handleQuery = () => {
color: #909399;
}
-/* 提现方式单元格 */
+/* 鎻愮幇鏂瑰紡鍗曞厓鏍?*/
.method-box {
display: flex;
flex-direction: column;
@@ -480,7 +480,7 @@ const handleQuery = () => {
font-weight: 600;
}
-/* 收款码 */
+/* 鏀舵鐮?*/
.qr-box {
width: 40px;
height: 40px;
@@ -496,7 +496,7 @@ const handleQuery = () => {
font-size: 16px;
}
-/* 操作项 */
+/* 鎿嶄綔椤?*/
.ops-box {
display: flex;
flex-direction: row;
@@ -515,3 +515,4 @@ const handleQuery = () => {
font-size: 12px;
}
+
diff --git a/pages/mall/admin/kefu/words.uvue b/pages/mall/admin/kefu/words.uvue
index 1b97edc8..b3ab01cc 100644
--- a/pages/mall/admin/kefu/words.uvue
+++ b/pages/mall/admin/kefu/words.uvue
@@ -1,11 +1,11 @@
-
+
-
+
- 📂
+ 馃搨
{{ cat.name }}
-
+
- 添加话术
+ 娣诲姞璇濇湳
@@ -50,19 +50,19 @@
{{ item.sort }}
{{ item.time }}
- 编辑
+ 缂栬緫
- 删除
+ 鍒犻櫎
-
+
-
+
- 话术分类:
+ 璇濇湳鍒嗙被:
- {{ formData.category || '请选择分类' }}
- ▼
+ {{ formData.category || '璇烽€夋嫨鍒嗙被' }}
+ 鈻?/text>
@@ -103,26 +103,26 @@
*
- 话术标题:
+ 璇濇湳鏍囬:
-
+
*
- 话术内容:
+ 璇濇湳鍐呭:
-
+
@@ -217,28 +217,28 @@
-
-
-
+
\ No newline at end of file
diff --git a/pages/mall/admin/distribution/division/apply.uvue b/pages/mall/admin/distribution/division/apply.uvue
index ce1cec4d..e5a50e0b 100644
--- a/pages/mall/admin/distribution/division/apply.uvue
+++ b/pages/mall/admin/distribution/division/apply.uvue
@@ -1,43 +1,34 @@
-
+
- 鎼滅储锛?/text>
-
+ 搜索:
+
-
+
-
-
+
{{ tab }}
-
-
{{ item.uid }}
@@ -53,11 +44,11 @@
{{ item.code }}
- 鍚屾剰
+ 同意
|
- 鎷掔粷
+ 拒绝
|
- 鍒犻櫎
+ 删除
@@ -65,26 +56,17 @@
-
-
-
-
+
\ No newline at end of file
diff --git a/pages/mall/admin/distribution/division/list.uvue b/pages/mall/admin/distribution/division/list.uvue
index f52c973d..de109dc5 100644
--- a/pages/mall/admin/distribution/division/list.uvue
+++ b/pages/mall/admin/distribution/division/list.uvue
@@ -1,35 +1,32 @@
-
+
- 鎼滅储锛?/text>
-
+ 搜索:
+
-
+
-
-
-
-
{{ item.uid }}
@@ -45,11 +42,11 @@
- 鏌ョ湅浠g悊鍟?/text>
+ 查看代理商
|
- 缂栬緫
+ 编辑
|
- 鍒犻櫎
+ 删除
@@ -57,54 +54,30 @@
-
-
-
-
+
\ No newline at end of file
diff --git a/pages/mall/admin/distribution/level/index.uvue b/pages/mall/admin/distribution/level/index.uvue
index bfa00804..3f1bf95a 100644
--- a/pages/mall/admin/distribution/level/index.uvue
+++ b/pages/mall/admin/distribution/level/index.uvue
@@ -1,43 +1,37 @@
-
+
- 鏄惁鏄剧ず锛?/text>
-
- 鍏ㄩ儴
- 鈻?/text>
-
+ 是否显示:
+ 全部▼
- 绛夌骇鍚嶇О锛?/text>
- 等级名称:
+
- 鏌ヨ
+ 查询
-
- 娣诲姞绛夌骇
+ 添加等级
-
-
{{ item.id }}
@@ -54,205 +48,48 @@
- 绛夌骇浠诲姟
+ 等级任务
|
- 缂栬緫
+ 编辑
|
- 鍒犻櫎
+ 删除
-
-
-
-
-
+.admin-page { padding: 0; }
+.filter-card { background: #fff; padding: 24px; margin-bottom: 16px; border-radius: 4px; }
+.filter-row { display: flex; flex-direction: row; align-items: center; gap: 24px; }
+.label { font-size: 14px; color: #333; }
+.select-mock { display: flex; flex-direction: row; align-items: center; justify-content: space-between; border: 1px solid #d9d9d9; border-radius: 2px; height: 32px; width: 160px; padding: 0 12px; background: #fff; text { font-size: 14px; color: #666; } .arrow { font-size: 10px; color: #bfbfbf; } }
+.filter-input { border: 1px solid #d9d9d9; height: 32px; width: 220px; padding: 0 12px; font-size: 14px; }
+.btn { height: 32px; padding: 0 16px; font-size: 14px; border-radius: 2px; border: 1px solid #d9d9d9; background: #fff; display: flex; align-items: center; justify-content: center; cursor: pointer; }
+.btn.primary { background: #1890ff; border-color: #1890ff; color: #fff; }
+.content-card { background: #fff; border-radius: 4px; }
+.action-bar { padding: 16px 24px; }
+.table-container { padding: 0 24px 24px; }
+.table-header { display: flex; flex-direction: row; background: #f8faff; border-bottom: 1px solid #f0f0f0; padding: 12px 0; }
+.table-row { display: flex; flex-direction: row; border-bottom: 1px solid #f0f0f0; padding: 12px 0; align-items: center; &:hover { background: #fafafa; } }
+.col { padding: 0 8px; display: flex; align-items: center; font-size: 14px; color: #333; }
+.col-id { width: 50px; } .col-img { width: 80px; justify-content: center; } .col-name { width: 120px; } .col-level { width: 80px; justify-content: center; } .col-percent { width: 120px; justify-content: center; } .col-stat { width: 100px; justify-content: center; } .col-status { width: 100px; justify-content: center; } .col-ops { flex: 1; justify-content: flex-end; padding-right: 16px; }
+.table-img { width: 32px; height: 32px; border-radius: 2px; }
+.op-link { color: #1890ff; cursor: pointer; }
+.op-divider { color: #e8e8e8; margin: 0 8px; }
+.pagination { padding: 16px 24px; border-top: 1px solid #f0f0f0; }
+.page-info { font-size: 14px; color: #999; }
+
\ No newline at end of file
diff --git a/pages/mall/admin/distribution/promoter/index.uvue b/pages/mall/admin/distribution/promoter/index.uvue
index 71669fd1..60364207 100644
--- a/pages/mall/admin/distribution/promoter/index.uvue
+++ b/pages/mall/admin/distribution/promoter/index.uvue
@@ -1,51 +1,42 @@
-
+
-
- 鏃堕棿閫夋嫨锛?/text>
+ 时间选择:
- 寮€濮嬫棩鏈?- 缁撴潫鏃ユ湡
- 馃搮
+ 开始日期 - 结束日期
+ 📅
-
- 鎼滅储锛?/text>
-
+ 搜索:
+
-
- 鏌ヨ
+ 查询
-
-
- 瀵煎嚭
+ 导出
-
-
-
-
{{ item.id }}
@@ -54,9 +45,9 @@
- 鏄电О:{{ item.nickname }}
- 濮撳悕:{{ item.name }}
- 鐢佃瘽:{{ item.phone }}
+ 昵称:{{ item.nickname }}
+ 姓名:{{ item.name }}
+ 电话:{{ item.phone }}
{{ item.level }}
@@ -68,18 +59,16 @@
{{ item.withdrawCount }}
{{ item.unwithdrawnAmount }}
- 鎺ㄥ箍浜?/text>
+ 推广人
|
- 鏇村
- 鈻?/text>
+ 更多
+ ▼
-
-
@@ -87,219 +76,39 @@
-
-
+.admin-page { padding: 0; }
+.filter-card { background: #fff; padding: 24px; margin-bottom: 16px; border-radius: 4px; }
+.filter-row { display: flex; flex-direction: row; align-items: center; gap: 24px; }
+.label { font-size: 14px; color: #333; }
+.date-picker-mock { display: flex; flex-direction: row; align-items: center; justify-content: space-between; border: 1px solid #d9d9d9; border-radius: 2px; height: 32px; width: 260px; padding: 0 12px; background: #fff; .placeholder { font-size: 14px; color: #bfbfbf; } .icon-calendar { font-size: 14px; color: #bfbfbf; } }
+.filter-input { border: 1px solid #d9d9d9; height: 32px; width: 220px; padding: 0 12px; font-size: 14px; }
+.btn { height: 32px; padding: 0 16px; font-size: 14px; border-radius: 2px; border: 1px solid #d9d9d9; background: #fff; display: flex; align-items: center; justify-content: center; cursor: pointer; }
+.btn.primary { background: #1890ff; border-color: #1890ff; color: #fff; }
+.btn.ghost { color: #666; background: #fff; }
+.btn.small { height: 28px; padding: 0 12px; font-size: 13px; }
+.content-card { background: #fff; border-radius: 4px; }
+.action-bar { padding: 16px 24px; }
+.table-container { padding: 0 24px 24px; }
+.table-header { display: flex; flex-direction: row; background: #f8faff; border-bottom: 1px solid #f0f0f0; padding: 12px 0; }
+.table-row { display: flex; flex-direction: row; border-bottom: 1px solid #f0f0f0; padding: 12px 0; align-items: center; &:hover { background: #fafafa; } }
+.col { padding: 0 8px; display: flex; align-items: center; font-size: 14px; color: #333; }
+.col-id { width: 60px; } .col-img { width: 80px; justify-content: center; } .col-info { width: 180px; } .col-level { width: 100px; justify-content: center; } .col-stat { width: 110px; justify-content: center; } .col-ops { flex: 1; justify-content: flex-end; padding-right: 16px; }
+.table-img { width: 40px; height: 40px; border-radius: 4px; }
+.user-info-box { display: flex; flex-direction: column; }
+.info-text { font-size: 12px; color: #666; margin-bottom: 2px; }
+.op-link { color: #1890ff; cursor: pointer; }
+.op-divider { color: #e8e8e8; margin: 0 8px; }
+.arrow-down { font-size: 10px; color: #1890ff; margin-left: 4px; }
+.pagination { padding: 16px 24px; border-top: 1px solid #f0f0f0; }
+.page-info { font-size: 14px; color: #999; }
+
\ No newline at end of file
diff --git a/pages/mall/admin/finance/balance_stats.uvue b/pages/mall/admin/finance/balance_stats.uvue
index df1b9746..487852ff 100644
--- a/pages/mall/admin/finance/balance_stats.uvue
+++ b/pages/mall/admin/finance/balance_stats.uvue
@@ -1,63 +1,63 @@
-
+
-
+
- 馃挵
+ 💰
1447117274.55
- 褰撳墠浣欓
+ 当前余额
- 馃彟
+ 🏦
1602611838.49
- 绱浣欓
+ 累计余额
- 馃挸
+ 💳
155494563.94
- 绱娑堣€椾綑棰?/text>
+ 累计消耗余额
-
+
- 鏃堕棿閫夋嫨:
+ 时间选择:
- 馃搮
+ 📅
2026/01/05 - 2026/02/03
-
+
@@ -65,26 +65,26 @@
-
+
-
+
-
+
@@ -104,22 +104,22 @@
-
+
-
+
@@ -149,28 +149,28 @@ const trendOption = ref(null)
const sourceOption = ref(null)
const consumptionOption = ref(null)
-// 鏍峰紡鍒囨崲鐘舵€? 0=鍥捐〃, 1=鍒楄〃
+// 样式切换状态: 0=图表, 1=列表
const sourceStyleMode = ref(0)
const consumptionStyleMode = ref(0)
-// 缁熻鏁版嵁 (浣跨敤 ref 淇濊瘉鍝嶅簲寮?
+// 统计数据 (使用 ref 保证响应式)
const sourceData = ref([
- { value: 125000.00, name: '绯荤粺澧炲姞', percent: 40.00 },
- { value: 93750.00, name: '鐢ㄦ埛鍏呭€?, percent: 30.00 },
- { value: 78125.00, name: '浣i噾鎻愮幇', percent: 25.00 },
- { value: 62500.00, name: '鎶藉璧犻€?, percent: 20.00 },
- { value: 46875.00, name: '鍟嗗搧閫€娆?, percent: 15.00 }
+ { value: 125000.00, name: '系统增加', percent: 40.00 },
+ { value: 93750.00, name: '用户充值', percent: 30.00 },
+ { value: 78125.00, name: '佣金提现', percent: 25.00 },
+ { value: 62500.00, name: '抽奖赠送', percent: 20.00 },
+ { value: 46875.00, name: '商品退款', percent: 15.00 }
])
const consumptionDataList = ref([
- { value: 435692.51, name: '璐拱鍟嗗搧', percent: 50.00 },
- { value: 8060.18, name: '璐拱浼氬憳', percent: 20.00 },
- { value: 0.00, name: '鍏呭€奸€€娆?, percent: 15.00 },
- { value: 0.00, name: '绯荤粺鍑忓皯', percent: 15.00 }
+ { value: 435692.51, name: '购买商品', percent: 50.00 },
+ { value: 8060.18, name: '购买会员', percent: 20.00 },
+ { value: 0.00, name: '充值退款', percent: 15.00 },
+ { value: 0.00, name: '系统减少', percent: 15.00 }
])
/**
- * 杞崲 Plain Object 宸ュ叿
+ * 转换 Plain Object 工具
*/
function toPlainObject(obj : any) : any {
if (obj == null) return null
@@ -225,14 +225,14 @@ function initTrendChart() {
},
series: [
{
- name: '浣欓绉疮',
+ name: '余额积累',
type: 'line',
smooth: true,
data: accumulationData,
itemStyle: { color: '#1890ff' }
},
{
- name: '浣欓娑堣€?,
+ name: '余额消耗',
type: 'line',
smooth: true,
data: consumptionData,
@@ -250,12 +250,12 @@ function initSourceChart() {
color: ['#5b8ff9', '#5ad8a6', '#5d7092', '#f6bd16', '#e8684a'],
series: [
{
- name: '浣欓鏉ユ簮',
+ name: '余额来源',
type: 'pie',
radius: '70%',
center: ['40%', '50%'],
label: { show: true, fontSize: 11, formatter: '{b}\n{c}%' },
- // 鍏抽敭鐐癸細灏嗗浘琛ㄦ暟鎹槧灏勫埌 percent 瀛楁
+ // 关键点:将图表数据映射到 percent 字段
data: sourceData.value.map(item => ({ value: item.percent, name: item.name }))
}
]
@@ -270,12 +270,12 @@ function initConsumptionChart() {
color: ['#5b8ff9', '#5ad8a6', '#5d7092', '#f6bd16'],
series: [
{
- name: '浣欓娑堣€?,
+ name: '余额消耗',
type: 'pie',
radius: '70%',
center: ['40%', '50%'],
label: { show: true, fontSize: 11, formatter: '{b}\n{c}%' },
- // 鍏抽敭鐐癸細灏嗗浘琛ㄦ暟鎹槧灏勫埌 percent 瀛楁
+ // 关键点:将图表数据映射到 percent 字段
data: consumptionDataList.value.map(item => ({ value: item.percent, name: item.name }))
}
]
@@ -311,7 +311,7 @@ function toggleConsumptionStyle() {
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
}
-/* 椤堕儴鍗$墖 */
+/* 顶部卡片 */
.stats-grid {
display: flex;
flex-direction: row;
@@ -365,7 +365,7 @@ function toggleConsumptionStyle() {
margin-top: 4px;
}
-/* 鏃堕棿绛涢€夊尯 */
+/* 时间筛选区 */
.filter-bar {
padding: 16px 24px;
margin-bottom: 20px;
@@ -397,7 +397,7 @@ function toggleConsumptionStyle() {
.calendar-icon { font-size: 14px; color: #c0c4cc; margin-right: 10px; }
.date-range { font-size: 14px; color: #606266; }
-/* 瓒嬪娍鍥捐〃鍖?*/
+/* 趋势图表区 */
.chart-box {
padding: 24px;
margin-bottom: 20px;
@@ -436,7 +436,7 @@ function toggleConsumptionStyle() {
height: 100%;
}
-/* 搴曢儴鍒嗘瀽 */
+/* 底部分析 */
.bottom-analysis {
display: flex;
flex-direction: row;
@@ -478,7 +478,7 @@ function toggleConsumptionStyle() {
height: 100%;
}
-/* 鍒楄〃鏍峰紡 */
+/* 列表样式 */
.stats-table {
display: flex;
flex-direction: column;
@@ -521,7 +521,7 @@ function toggleConsumptionStyle() {
.progress-container {
flex: 1;
height: 8px;
-
+ background-color: #f5f5f5;
border-radius: 4px;
margin-right: 10px;
overflow: hidden;
@@ -539,4 +539,3 @@ function toggleConsumptionStyle() {
color: #666;
}
-
diff --git a/pages/mall/admin/finance/record.uvue b/pages/mall/admin/finance/record.uvue
index aac9c9af..0e7a66be 100644
--- a/pages/mall/admin/finance/record.uvue
+++ b/pages/mall/admin/finance/record.uvue
@@ -1,15 +1,15 @@
-
+
- 椤甸潰鍗犱綅
- 璇ュ姛鑳芥ā鍧楁鍦ㄥ紑鍙戜腑
- 褰撳墠閲囩敤 CRMEB 璺敱浣撶郴 1:1 鏄犲皠
+ 页面占位
+ 该功能模块正在开发中
+ 当前采用 CRMEB 路由体系 1:1 映射
@@ -18,14 +18,14 @@
-
-
diff --git a/pages/mall/admin/finance/withdrawal.uvue b/pages/mall/admin/finance/withdrawal.uvue
index d610fdf9..61e9980d 100644
--- a/pages/mall/admin/finance/withdrawal.uvue
+++ b/pages/mall/admin/finance/withdrawal.uvue
@@ -1,14 +1,14 @@
-
+
-
+
- 鏃堕棿閫夋嫨:
-
+ 时间选择:
+
- 鎻愮幇鐘舵€?
+ 提现状态:
{{ statusLabel }}
@@ -17,7 +17,7 @@
- 鎻愮幇鏂瑰紡:
+ 提现方式:
{{ methodLabel }}
@@ -26,14 +26,14 @@
- 鎼滅储:
-
+ 搜索:
+
- 鏌ヨ
+ 查询
-
+
@@ -46,27 +46,27 @@
-
+
- 浣i噾璁板綍
+ 佣金记录
-
+
@@ -79,7 +79,7 @@
{{ item.nickname }}
- 鐢ㄦ埛id:{{ item.userId }}
+ 用户id:{{ item.userId }}
@@ -88,26 +88,26 @@
{{ item.netAmount }}
- 濮撳悕:{{ item.name }}
+ 姓名:{{ item.name }}
{{ item.type }}:{{ item.account }}
- 閾惰寮€鎴峰湴鍧€:{{ item.bank }}
+ 银行开户地址:{{ item.bank }}
- 鈻?/text>
+ ■
{{ item.time }}
- 鐢宠涓?/text>
+ 申请中
- 缂栬緫
+ 编辑
|
- 閫氳繃
+ 通过
|
- 椹冲洖
+ 驳回
@@ -126,61 +126,61 @@ const methodValue = ref('all')
const searchKeyword = ref('')
const statusOptions = ref([
- { value: 'all', text: '鍏ㄩ儴' },
- { value: '0', text: '寰呭鏍? },
- { value: '1', text: '宸查€氳繃' },
- { value: '-1', text: '宸查┏鍥? }
+ { value: 'all', text: '全部' },
+ { value: '0', text: '待审核' },
+ { value: '1', text: '已通过' },
+ { value: '-1', text: '已驳回' }
])
const methodOptions = ref([
- { value: 'all', text: '鍏ㄩ儴' },
- { value: 'alipay', text: '鏀粯瀹? },
- { value: 'bank', text: '閾惰鍗? },
- { value: 'weixin', text: '寰俊' }
+ { value: 'all', text: '全部' },
+ { value: 'alipay', text: '支付宝' },
+ { value: 'bank', text: '银行卡' },
+ { value: 'weixin', text: '微信' }
])
const statusLabel = computed(() => {
const item = statusOptions.value.find((opt: any) => opt.value === statusValue.value)
- return item ? item.text : '鍏ㄩ儴'
+ return item ? item.text : '全部'
})
const methodLabel = computed(() => {
const item = methodOptions.value.find((opt: any) => opt.value === methodValue.value)
- return item ? item.text : '鍏ㄩ儴'
+ return item ? item.text : '全部'
})
const stats = ref([
- { label: '浣i噾鎬婚噾棰?, value: '676809.25', icon: '$', colorClass: 'blue' },
- { label: '寰呮彁鐜伴噾棰?, value: '71', icon: '楼', colorClass: 'orange' },
- { label: '宸叉彁鐜伴噾棰?, value: '68879.25', icon: '$', colorClass: 'green' },
- { label: '鏈彁鐜伴噾棰?, value: '607930.00', icon: '楼', colorClass: 'pink' }
+ { label: '佣金总金额', value: '676809.25', icon: '$', colorClass: 'blue' },
+ { label: '待提现金额', value: '71', icon: '¥', colorClass: 'orange' },
+ { label: '已提现金额', value: '68879.25', icon: '$', colorClass: 'green' },
+ { label: '未提现金额', value: '607930.00', icon: '¥', colorClass: 'pink' }
])
const tableData = ref([
{
id: 57,
- nickname: '鐢ㄦ埛鏄电О: 177****766',
+ nickname: '用户昵称: 177****766',
userId: '58837',
amount: '20.00',
fee: '0.00',
netAmount: '20.00',
- name: '鎺ュ彛',
- type: '鏀粯瀹?,
+ name: '接口',
+ type: '支付宝',
account: '1195953899',
time: '2025-10-24 16:04',
remark: ''
},
{
id: 56,
- nickname: '鐢ㄦ埛鏄电О: 娴嬭瘯鍛樼殑',
+ nickname: '用户昵称: 测试员的',
userId: '20695',
amount: '1.00',
fee: '0.00',
netAmount: '1.00',
name: '123',
- type: '閾惰鍗?,
+ type: '银行卡',
account: '4001231221',
- bank: '涓浗閾惰',
+ bank: '中国银行',
time: '2025-07-04 15:11',
remark: ''
}
@@ -206,7 +206,7 @@ const handleQuery = () => {
min-height: 100vh;
}
-/* 绛涢€夋牱寮忔洿鏂?*/
+/* 筛选样式更新 */
.filter-card {
background-color: #fff;
padding: 24px;
@@ -284,7 +284,7 @@ const handleQuery = () => {
margin-bottom: 16px;
}
-/* 缁熻鍗$墖鏍峰紡 */
+/* 统计卡片样式 */
.stats-grid {
display: flex;
flex-direction: row;
@@ -338,7 +338,7 @@ const handleQuery = () => {
margin-top: 6px;
}
-/* 鎿嶄綔鍖哄煙 */
+/* 操作区域 */
.action-section {
margin-bottom: 12px;
display: flex;
@@ -359,9 +359,9 @@ const handleQuery = () => {
font-size: 13px;
}
-/* 琛ㄦ牸瀹瑰櫒鏍峰紡 (Flex 妯℃嫙) */
+/* 表格容器样式 (Flex 模拟) */
.table-container {
-
+ background-color: #fff;
border-radius: 4px;
overflow: hidden;
display: flex;
@@ -411,7 +411,7 @@ const handleQuery = () => {
color: #606266;
}
-/* 鍒楀瀹氫箟 (涓庢埅鍥惧尮閰? */
+/* 列宽定义 (与截图匹配) */
.col-id { width: 60px; }
.col-user { width: 180px; justify-content: flex-start; }
.col-amount { width: 100px; }
@@ -424,7 +424,7 @@ const handleQuery = () => {
.col-status { width: 100px; }
.col-ops { width: 160px; }
-/* 鐢ㄦ埛淇℃伅鍗曞厓鏍?*/
+/* 用户信息单元格 */
.user-info-box {
display: flex;
flex-direction: row;
@@ -463,7 +463,7 @@ const handleQuery = () => {
color: #909399;
}
-/* 鎻愮幇鏂瑰紡鍗曞厓鏍?*/
+/* 提现方式单元格 */
.method-box {
display: flex;
flex-direction: column;
@@ -480,7 +480,7 @@ const handleQuery = () => {
font-weight: 600;
}
-/* 鏀舵鐮?*/
+/* 收款码 */
.qr-box {
width: 40px;
height: 40px;
@@ -496,7 +496,7 @@ const handleQuery = () => {
font-size: 16px;
}
-/* 鎿嶄綔椤?*/
+/* 操作项 */
.ops-box {
display: flex;
flex-direction: row;
@@ -515,4 +515,3 @@ const handleQuery = () => {
font-size: 12px;
}
-
diff --git a/pages/mall/admin/kefu/words.uvue b/pages/mall/admin/kefu/words.uvue
index b3ab01cc..1b97edc8 100644
--- a/pages/mall/admin/kefu/words.uvue
+++ b/pages/mall/admin/kefu/words.uvue
@@ -1,11 +1,11 @@
-
+
-
+
- 馃搨
+ 📂
{{ cat.name }}
-
+
- 娣诲姞璇濇湳
+ 添加话术
@@ -50,19 +50,19 @@
{{ item.sort }}
{{ item.time }}
- 缂栬緫
+ 编辑
- 鍒犻櫎
+ 删除
-
+
-
+
- 璇濇湳鍒嗙被:
+ 话术分类:
- {{ formData.category || '璇烽€夋嫨鍒嗙被' }}
- 鈻?/text>
+ {{ formData.category || '请选择分类' }}
+ ▼
@@ -103,26 +103,26 @@
*
- 璇濇湳鏍囬:
+ 话术标题:
-
*
- 璇濇湳鍐呭:
+ 话术内容:
-
- 鎺掑簭:
+ 排序:
@@ -132,10 +132,10 @@
@@ -161,8 +161,8 @@ interface Category {
}
const categories = ref([
- { id: 1, name: '鍏ㄩ儴' },
- { id: 2, name: '绯荤粺璇濇湳' }
+ { id: 1, name: '全部' },
+ { id: 2, name: '系统话术' }
])
const activeCategoryId = ref(1)
@@ -170,20 +170,20 @@ const activeCategoryId = ref(1)
const wordList = ref([
{
id: '67',
- category: '绯荤粺榛樿',
- title: '鏃楄埌鐗堜粙缁?,
- content: '銆愭棗鑸扮増銆戝彲浠ユ巿鏉冪粰鍏徃鎴栬€呬釜浜猴紝浼佷笟鑷敤鎼缓锛屼笉闄愬埗鎺堟潈鍩熷悕锛屾彁渚涗笓灞炴妧鏈€荤洃銆佷骇鍝佹€荤洃绛夈€?,
+ category: '系统默认',
+ title: '旗舰版介绍',
+ content: '【旗舰版】可以授权给公司或者个人,企业自用搭建,不限制授权域名,提供专属技术总监、产品总监等。',
sort: 0,
time: '2024-09-27 10:15:07'
}
])
-// 琛ㄥ崟閫昏緫
+// 表单逻辑
const showDrawer = ref(false)
const isEdit = ref(false)
const formData = reactive({
id: '',
- category: '绯荤粺璇濇湳',
+ category: '系统话术',
title: '',
content: '',
sort: 0
@@ -194,7 +194,7 @@ const selectCategory = (id: number) => {
}
const handleAddCategory = () => {
- console.log('娣诲姞鍒嗙被')
+ console.log('添加分类')
}
const handleAddWord = () => {
@@ -221,7 +221,7 @@ const closeDrawer = () => {
}
const submitForm = () => {
- console.log('鎻愪氦琛ㄥ崟', formData)
+ console.log('提交表单', formData)
showDrawer.value = false
}
@@ -246,7 +246,7 @@ const submitForm = () => {
gap: 20px;
}
-/* 宸︿晶鍒嗙被 */
+/* 左侧分类 */
.category-sidebar {
width: 280px;
display: flex;
@@ -307,7 +307,7 @@ const submitForm = () => {
color: #333;
}
-/* 鍙充晶鍐呭 */
+/* 右侧内容 */
.content-main {
flex: 1;
display: flex;
@@ -395,7 +395,7 @@ const submitForm = () => {
text-align: left;
}
-/* 鍒楀鍒嗛厤 */
+/* 列宽分配 */
.col-id { width: 60px; }
.col-cat { width: 100px; }
.col-title { width: 150px; }
@@ -421,7 +421,7 @@ const submitForm = () => {
margin: 0 10px;
}
-/* 鍒嗛〉 */
+/* 分页 */
.pagination-bar {
padding: 15px 20px;
display: flex;
@@ -478,7 +478,7 @@ const submitForm = () => {
font-size: 13px;
}
-/* 鎶藉眽 Drawer 1:1 澶嶅埢 - 淇浣嶇疆鍒板彸渚?*/
+/* 抽屉 Drawer 1:1 复刻 - 修正位置到右侧 */
.drawer-mask {
position: fixed;
top: 0;
@@ -492,10 +492,10 @@ const submitForm = () => {
.drawer-content {
position: absolute;
top: 0;
- right: 0; /* 寮哄埗闈犲彸鍗犳嵁鍙宠竟灞忓箷 */
- width: 50%; /* 鍗犲睆骞曚竴鍗婂搴?*/
+ right: 0; /* 强制靠右占据右边屏幕 */
+ width: 50%; /* 占屏幕一半宽度 */
height: 100%;
-
+ background-color: #fff;
display: flex;
flex-direction: column;
box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15);
@@ -624,4 +624,3 @@ const submitForm = () => {
.cancel-txt { font-size: 14px; color: #606266; }
.confirm-txt { font-size: 14px; color: #fff; }
-
diff --git a/pages/mall/admin/marketing/bargain/list.uvue b/pages/mall/admin/marketing/bargain/list.uvue
index 38f80c17..53077201 100644
--- a/pages/mall/admin/marketing/bargain/list.uvue
+++ b/pages/mall/admin/marketing/bargain/list.uvue
@@ -1,15 +1,15 @@
-
+
- 椤甸潰鍗犱綅
- 璇ュ姛鑳芥ā鍧楁鍦ㄥ紑鍙戜腑
- 褰撳墠閲囩敤 CRMEB 璺敱浣撶郴 1:1 鏄犲皠
+ 页面占位
+ 该功能模块正在开发中
+ 当前采用 CRMEB 路由体系 1:1 映射
@@ -18,14 +18,14 @@
-
-
diff --git a/pages/mall/admin/marketing/combination/create.uvue b/pages/mall/admin/marketing/combination/create.uvue
index 6a1decf7..9e9f35b3 100644
--- a/pages/mall/admin/marketing/combination/create.uvue
+++ b/pages/mall/admin/marketing/combination/create.uvue
@@ -1,11 +1,11 @@
-
+
@@ -13,7 +13,7 @@
{{ index + 1 }}
- 鉁?/text>
+ ✓
{{ step }}
@@ -21,82 +21,82 @@
-
+
- 閫夋嫨鍟嗗搧锛?/text>
+ 选择商品:
{{ selectedGood.title }}
- 馃泹锔?/text>
- 閫夋嫨鍟嗗搧
+ 🛍️
+ 选择商品
-
+
- 鍩虹閰嶇疆
+ 基础配置
- 鎷煎洟鍚嶇О锛?/text>
- 拼团名称:
+
- 鎷煎洟绠€浠嬶細
-
- 鎷煎洟鏃堕棿锛?/text>
+ 拼团时间:
-
-
-
+
- 鎷煎洟瑙勫垯
+ 拼团规则
- 鎷煎洟鏃舵晥锛?/text>
+ 拼团时效:
- 灏忔椂
+ 小时
- 鎷煎洟浜烘暟锛?/text>
+ 拼团人数:
- 浜?/text>
+ 人
- 铏氭嫙鎴愬洟锛?/text>
+ 虚拟成团:
- 浜?/text>
+ 人
-
+
- 瑙勬牸
- 鎷煎洟浠?/view>
- 鎴愭湰浠?/view>
- 闄愰噺
- 搴撳瓨
+ 规格
+ 拼团价
+ 成本价
+ 限量
+ 库存
{{ spec.name }}
@@ -108,25 +108,25 @@
- 鍟嗗搧璇︽儏锛?/text>
+ 商品详情:
- 杩欓噷鏄紪杈戝櫒鍖哄煙 (WangEditor 鏄犲皠)
+ 这里是编辑器区域 (WangEditor 映射)