diff --git a/20260117.zip b/20260117.zip
deleted file mode 100644
index 867736e..0000000
Binary files a/20260117.zip and /dev/null differ
diff --git a/index.html b/index.html
index f2d23d5..d69d7a4 100644
--- a/index.html
+++ b/index.html
@@ -5,6 +5,7 @@
- |
- {{ getNodeData(key)?.code }}
+ |
+ {{ getNodeData(key)?.code }}
|
-
@@ -559,6 +549,15 @@
.map-count .count-num {
color: #000 !important;
}
+
+ /* 选中时第二行插槽(如创建时间)保持深色,不变白 */
+ .node-second-row-extra-slot {
+ color: #666 !important;
+
+ .create-time {
+ color: #666 !important;
+ }
+ }
}
.node-table {
diff --git a/src/components/global-setting/index.vue b/src/components/global-setting/index.vue
index 3d6f03a..45ec0b8 100644
--- a/src/components/global-setting/index.vue
+++ b/src/components/global-setting/index.vue
@@ -13,6 +13,11 @@
{{ $t('settings.alertContent') }}
+
+
+ {{ $t('settings.restoreDefault') }}
+
+
@@ -72,6 +77,8 @@
},
]);
+ const DEFAULT_THEME_COLOR = '#132c44';
+
const cancel = () => {
appStore.updateSettings({ globalSettings: false });
emit('cancel');
@@ -81,5 +88,15 @@
await copy(text);
Message.success(t('settings.copySettings.message'));
};
+ const restoreDefault = () => {
+ appStore.updateSettings({ themeColor: DEFAULT_THEME_COLOR });
+ Message.success(t('settings.restoreDefault.message'));
+ };
+
+
diff --git a/src/components/tab-bar/index.vue b/src/components/tab-bar/index.vue
index e9a1276..2a06234 100644
--- a/src/components/tab-bar/index.vue
+++ b/src/components/tab-bar/index.vue
@@ -1,7 +1,7 @@
-
+
@@ -89,6 +111,16 @@
cursor: pointer;
transition: all 0.3s ease;
+ .tag-link {
+ cursor: grab;
+ }
+ &.sortable-ghost {
+ opacity: 0.4;
+ }
+ &.sortable-drag {
+ cursor: grabbing;
+ }
+
&:first-child {
.arco-tag-close-btn {
display: none;
diff --git a/src/config/settings.json b/src/config/settings.json
index 50c19d8..da709f0 100644
--- a/src/config/settings.json
+++ b/src/config/settings.json
@@ -7,7 +7,7 @@
"hideMenu": false,
"menuCollapse": false,
"footer": false,
- "themeColor": "#2D8C8C",
+ "themeColor": "#132c44",
"menuWidth": 220,
"globalSettings": false,
"device": "desktop",
diff --git a/src/env.d.ts b/src/env.d.ts
index 85ceb3f..baafdbc 100644
--- a/src/env.d.ts
+++ b/src/env.d.ts
@@ -1,3 +1,18 @@
+declare module 'vg-print' {
+ import type { DefineComponent } from 'vue';
+ export const FullDesigner: DefineComponent, {}, any>;
+ export const hiprint: { register(options: { authKey: string }): void };
+ export const createTemplate: (json: unknown) => unknown;
+ export const printBrowser: (tpl: unknown, data: unknown) => void;
+ const plugin: { install: (app: unknown) => void };
+ export default plugin;
+}
+
+declare module 'vg-print/style.css' {
+ const css: string;
+ export default css;
+}
+
declare module 'vue-request-editor' {
import type { DefineComponent } from 'vue';
export const RequestEditor: DefineComponent, {}, any>;
diff --git a/src/locale/en-US.ts b/src/locale/en-US.ts
index 3510f3e..1a23500 100644
--- a/src/locale/en-US.ts
+++ b/src/locale/en-US.ts
@@ -74,6 +74,7 @@ export default {
'menu.channel.weightRules': 'Weight Rules',
'menu.channel.weightRounding': 'Weight Rounding',
'menu.channel.autoTrigger': 'Auto Trigger',
+ 'menu.channel.labelDesign': 'Label Design',
'menu.track': 'Track',
'menu.track.trackOrder': 'Track Order',
'menu.track.warningOrder': 'Warning Order',
@@ -1296,6 +1297,25 @@ export default {
'system.interface.import.success': 'Imported successfully',
'system.interface.import.fail': 'Import failed',
+ // Channel - Label Design
+ 'channel.labelDesign.pageTitle': 'Label Template Config',
+ 'channel.labelDesign.configTitle': 'Template Config',
+ 'channel.labelDesign.sizeLabel': 'Label Size (W×H)',
+ 'channel.labelDesign.widthPlaceholder': 'Width',
+ 'channel.labelDesign.heightPlaceholder': 'Height',
+ 'channel.labelDesign.titleLabel': 'Label Title',
+ 'channel.labelDesign.titlePlaceholder': 'Enter label title',
+ 'channel.labelDesign.contentLabel': 'Label Content',
+ 'channel.labelDesign.contentPlaceholder': 'Enter label content',
+ 'channel.labelDesign.apply': 'Apply',
+ 'channel.labelDesign.reset': 'Reset',
+ 'channel.labelDesign.previewTitle': 'Preview (drag to move, resize from corner)',
+ 'channel.labelDesign.sizeMinError': 'Min size is 50px',
+ 'channel.labelDesign.noTitle': 'No title',
+ 'channel.labelDesign.noContent': 'No content',
+ 'channel.labelDesign.applySuccess': 'Config applied',
+ 'channel.labelDesign.resetSuccess': 'Config reset',
+
// Channel - Sales Products
'channel.salesProducts.search.placeholder': 'Enter product name',
'channel.salesProducts.search.refresh': 'Refresh list',
@@ -1455,6 +1475,7 @@ export default {
'channel.serviceChannels.createTime': 'Created: {time}',
// Channel - Blacklist/Remote Zones (shared)
+ 'channel.area.listTitle': 'List',
'channel.area.search.placeholder': 'Enter keyword',
'channel.area.search.refresh': 'Refresh list',
'channel.area.search.addArea': 'Add area',
@@ -1506,6 +1527,7 @@ export default {
'channel.area.search.button.reset': 'Reset',
// Channel - Weight Rules
+ 'channel.weightRules.listTitle': 'List',
'channel.weightRules.search.placeholder': 'Enter keyword',
'channel.weightRules.search.refresh': 'Refresh list',
'channel.weightRules.search.addRule': 'Add rule',
@@ -1556,6 +1578,7 @@ export default {
'channel.weightRules.updateTime': 'Updated: {time}',
// Channel - Weight Rounding
+ 'channel.weightRounding.listTitle': 'List',
'channel.weightRounding.search.placeholder': 'Enter keyword',
'channel.weightRounding.search.refresh': 'Refresh list',
'channel.weightRounding.search.addRounding': 'Add rounding',
diff --git a/src/locale/en-US/settings.ts b/src/locale/en-US/settings.ts
index f929e50..b18a72c 100644
--- a/src/locale/en-US/settings.ts
+++ b/src/locale/en-US/settings.ts
@@ -22,6 +22,8 @@ export default {
'settings.copySettings': 'Copy Settings',
'settings.copySettings.message':
'Copy succeeded, please paste to file src/settings.json.',
+ 'settings.restoreDefault': 'Restore Default',
+ 'settings.restoreDefault.message': 'Theme color has been restored to default',
'settings.close': 'Close',
'settings.color.tooltip':
'10 gradient colors generated according to the theme color',
diff --git a/src/locale/zh-CN.ts b/src/locale/zh-CN.ts
index b02a270..62f080e 100644
--- a/src/locale/zh-CN.ts
+++ b/src/locale/zh-CN.ts
@@ -74,6 +74,7 @@ export default {
'menu.channel.weightRules': '计重规则',
'menu.channel.weightRounding': '计重进位',
'menu.channel.autoTrigger': '自动触发',
+ 'menu.channel.labelDesign': '标签设计',
'menu.track': '轨迹',
'menu.track.trackOrder': '轨迹订单',
'menu.track.warningOrder': '预警订单',
@@ -1297,6 +1298,25 @@ export default {
'system.interface.import.success': '导入成功',
'system.interface.import.fail': '导入失败',
+ // 渠道 - 标签设计
+ 'channel.labelDesign.pageTitle': '标签模板配置',
+ 'channel.labelDesign.configTitle': '模板配置',
+ 'channel.labelDesign.sizeLabel': '标签尺寸 (宽×高)',
+ 'channel.labelDesign.widthPlaceholder': '宽度',
+ 'channel.labelDesign.heightPlaceholder': '高度',
+ 'channel.labelDesign.titleLabel': '标签标题',
+ 'channel.labelDesign.titlePlaceholder': '请输入标签标题',
+ 'channel.labelDesign.contentLabel': '标签内容',
+ 'channel.labelDesign.contentPlaceholder': '请输入标签内容',
+ 'channel.labelDesign.apply': '应用配置',
+ 'channel.labelDesign.reset': '重置',
+ 'channel.labelDesign.previewTitle': '模板预览 (可拖拽调整位置、右下角缩放调整尺寸)',
+ 'channel.labelDesign.sizeMinError': '标签尺寸最小值为 50px,请重新输入',
+ 'channel.labelDesign.noTitle': '无标题',
+ 'channel.labelDesign.noContent': '无内容',
+ 'channel.labelDesign.applySuccess': '配置已应用',
+ 'channel.labelDesign.resetSuccess': '配置已重置',
+
// 渠道 - 销售产品
'channel.salesProducts.search.placeholder': '请输入产品名称',
'channel.salesProducts.search.refresh': '刷新列表',
@@ -1457,6 +1477,7 @@ export default {
'channel.serviceChannels.createTime': '创建: {time}',
// 渠道 - 黑名单区/偏远分区(共用)
+ 'channel.area.listTitle': '列表',
'channel.area.search.placeholder': '请输入关键字',
'channel.area.search.refresh': '刷新列表',
'channel.area.search.addArea': '新增分区',
@@ -1508,6 +1529,7 @@ export default {
'channel.area.search.button.reset': '重置',
// 渠道 - 计重规则
+ 'channel.weightRules.listTitle': '列表',
'channel.weightRules.search.placeholder': '请输入关键字',
'channel.weightRules.search.refresh': '刷新列表',
'channel.weightRules.search.addRule': '新增规则',
@@ -1558,6 +1580,7 @@ export default {
'channel.weightRules.updateTime': '更新: {time}',
// 渠道 - 计重进位
+ 'channel.weightRounding.listTitle': '列表',
'channel.weightRounding.search.placeholder': '请输入关键字',
'channel.weightRounding.search.refresh': '刷新列表',
'channel.weightRounding.search.addRounding': '新增进位',
diff --git a/src/locale/zh-CN/settings.ts b/src/locale/zh-CN/settings.ts
index e42021d..97c3f47 100644
--- a/src/locale/zh-CN/settings.ts
+++ b/src/locale/zh-CN/settings.ts
@@ -22,6 +22,8 @@ export default {
'settings.copySettings': '复制配置',
'settings.copySettings.message':
'复制成功,请粘贴到 src/settings.json 文件中',
+ 'settings.restoreDefault': '恢复默认',
+ 'settings.restoreDefault.message': '主题色已恢复为默认',
'settings.close': '关闭',
'settings.color.tooltip':
'根据主题颜色生成的 10 个梯度色(将配置复制到项目中,主题色才能对亮色 / 暗黑模式同时生效)',
diff --git a/src/main.ts b/src/main.ts
index e8db3a0..fe60743 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,6 +1,8 @@
import { createApp, watch } from 'vue';
import ArcoVue from '@arco-design/web-vue';
import ArcoVueIcon from '@arco-design/web-vue/es/icon';
+import ElementPlus from 'element-plus';
+import 'element-plus/dist/index.css';
import VxeUITable from 'vxe-table';
import 'vxe-table/lib/style.css';
// eslint-disable-next-line import/no-unresolved
@@ -19,6 +21,7 @@ import globalProperties from './plugins/globalProperties';
import './mock';
// 导入 ECharts 配置,确保组件在应用启动时注册
import './utils/echarts';
+
// 初始化 RBAC token(从localStorage恢复)
import { setAuthToken } from './api/rbac';
import { applyThemeColor } from '@/utils/themeColor';
@@ -119,6 +122,8 @@ const app = createApp(App);
app.use(ArcoVue, {});
app.use(ArcoVueIcon);
+// vg-print 内部使用 Element Plus 组件(el-row、el-col 等),需全局注册
+app.use(ElementPlus);
app.use(router);
app.use(store);
diff --git a/src/router/routes/newModules/channel.ts b/src/router/routes/newModules/channel.ts
index 6fa624c..45f9db0 100644
--- a/src/router/routes/newModules/channel.ts
+++ b/src/router/routes/newModules/channel.ts
@@ -75,6 +75,15 @@ const CHANNEL: AppRouteRecordRaw = {
requiresAuth: true,
},
},
+ {
+ path: 'labelDesign',
+ name: 'LabelDesign',
+ component: () => import('@/views/channel/labelDesign/index.vue'),
+ meta: {
+ locale: 'menu.channel.labelDesign',
+ requiresAuth: true,
+ },
+ },
],
};
diff --git a/src/store/modules/tab-bar/index.ts b/src/store/modules/tab-bar/index.ts
index 121985d..3eb2aec 100644
--- a/src/store/modules/tab-bar/index.ts
+++ b/src/store/modules/tab-bar/index.ts
@@ -75,6 +75,14 @@ const useAppStore = defineStore('tabBar', {
this.deleteTag(idx, tag);
}
},
+ /** 拖动排序标签:将 fromIndex 位置的标签移动到 toIndex */
+ reorderTabs(fromIndex: number, toIndex: number) {
+ if (fromIndex === toIndex || fromIndex < 0 || toIndex < 0) return;
+ const list = [...this.tagList];
+ const [item] = list.splice(fromIndex, 1);
+ list.splice(toIndex, 0, item);
+ this.freshTabList(list);
+ },
},
});
diff --git a/src/views/channel/blacklist/index.vue b/src/views/channel/blacklist/index.vue
index 8d9bafd..35bdae7 100644
--- a/src/views/channel/blacklist/index.vue
+++ b/src/views/channel/blacklist/index.vue
@@ -4,84 +4,38 @@
|