zant-admin 1.0.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.en.md +414 -25
- package/README.md +426 -277
- package/bin/cli.js +99 -99
- package/bin/generator.js +502 -502
- package/bin/prompts.js +158 -158
- package/bin/utils.js +133 -133
- package/package.json +3 -3
- package/public/logo.png +0 -0
- package/src/App.vue +1 -1
- package/src/api/methods/sysAccount.js +0 -1
- package/src/api/methods/sysDictItem.js +3 -3
- package/src/api/methods/system.js +10 -11
- package/src/api/request.js +39 -39
- package/src/assets/css/style.css +0 -11
- package/src/assets/css/zcui.css +1002 -319
- package/src/assets/imgs/logo.png +0 -0
- package/src/assets/imgs/md/console.png +0 -0
- package/src/assets/imgs/md/login.png +0 -0
- package/src/assets/imgs/md/menu.png +0 -0
- package/src/assets/imgs/md/serviceMonitoring.png +0 -0
- package/src/assets/imgs/md/statistics.png +0 -0
- package/src/components/FormTable.vue +50 -37
- package/src/components/IconPicker.vue +351 -344
- package/src/components/MainPage.vue +220 -339
- package/src/components/edit/QuartzEdit.vue +1 -1
- package/src/components/edit/SysAccountEdit.vue +15 -8
- package/src/components/edit/SysDictEdit.vue +6 -4
- package/src/components/edit/SysDictItemEdit.vue +8 -6
- package/src/components/edit/SysRoleEdit.vue +5 -3
- package/src/components/edit/sysMenuEdit.vue +10 -25
- package/src/config/index.js +74 -74
- package/src/directives/permission.js +49 -45
- package/src/main.js +2 -3
- package/src/router/index.js +48 -30
- package/src/stores/config.js +7 -1
- package/src/stores/menu.js +32 -8
- package/src/stores/user.js +17 -17
- package/src/utils/regionUtils.js +20 -16
- package/src/utils/useFormCRUD.js +59 -60
- package/src/views/baiscstatis/center.vue +53 -42
- package/src/views/baiscstatis/iframePage.vue +9 -11
- package/src/views/console.vue +92 -42
- package/src/views/demo/button.vue +269 -0
- package/src/views/demo/importexport.vue +8 -12
- package/src/views/demo/region.vue +103 -21
- package/src/views/demo/statistics.vue +38 -19
- package/src/views/home.vue +2 -3
- package/src/views/login.vue +254 -149
- package/src/views/operations/log/logQuartz.vue +0 -1
- package/src/views/operations/quartz.vue +22 -24
- package/src/views/system/sysAccount.vue +16 -11
- package/src/views/system/sysDict.vue +9 -6
- package/src/views/system/sysMenu.vue +17 -15
- package/src/views/system/sysRole.vue +44 -21
- package/SCAFFOLD_README.md +0 -215
- package/src/assets/imgs/md/1.png +0 -0
- package/src/assets/imgs/md/10.png +0 -0
- package/src/assets/imgs/md/11.png +0 -0
- package/src/assets/imgs/md/2.png +0 -0
- package/src/assets/imgs/md/3.png +0 -0
- package/src/assets/imgs/md/4.png +0 -0
- package/src/assets/imgs/md/5.png +0 -0
- package/src/assets/imgs/md/6.png +0 -0
- package/src/assets/imgs/md/7.png +0 -0
- package/src/assets/imgs/md/8.png +0 -0
- package/src/assets/imgs/md/9.png +0 -0
|
@@ -17,32 +17,10 @@
|
|
|
17
17
|
}"
|
|
18
18
|
>
|
|
19
19
|
<div class="logo">
|
|
20
|
-
<span
|
|
21
|
-
|
|
22
|
-
:class="
|
|
23
|
-
formConfig.themeClass == 'light'
|
|
24
|
-
? 'text-color-primary'
|
|
25
|
-
: 'text-color-white '
|
|
26
|
-
"
|
|
27
|
-
>
|
|
28
|
-
<div class="flex-row">
|
|
29
|
-
<img
|
|
30
|
-
src="@/assets/imgs/logo.png"
|
|
31
|
-
alt=""
|
|
32
|
-
width="30px"
|
|
33
|
-
class="margin-right-10"
|
|
34
|
-
/>{{ config.projectName }}
|
|
35
|
-
</div>
|
|
20
|
+
<span v-if="!collapsed" :class="formConfig.themeClass == 'light' ? 'text-color-primary' : 'text-color-white '">
|
|
21
|
+
<div class="flex-row"><img src="@/assets/imgs/logo.png" alt="" width="30px" class="margin-right-10" />{{ config.projectName }}</div>
|
|
36
22
|
</span>
|
|
37
|
-
<span
|
|
38
|
-
v-else
|
|
39
|
-
:class="
|
|
40
|
-
formConfig.themeClass == 'light'
|
|
41
|
-
? 'text-color-primary'
|
|
42
|
-
: 'text-color-white '
|
|
43
|
-
"
|
|
44
|
-
><img src="@/assets/imgs/logo.png" alt="" width="30px"
|
|
45
|
-
/></span>
|
|
23
|
+
<span v-else :class="formConfig.themeClass == 'light' ? 'text-color-primary' : 'text-color-white '"><img src="@/assets/imgs/logo.png" alt="" width="30px" /></span>
|
|
46
24
|
</div>
|
|
47
25
|
<a-menu
|
|
48
26
|
v-model:openKeys="openmenuKey"
|
|
@@ -66,22 +44,13 @@
|
|
|
66
44
|
>
|
|
67
45
|
<div class="flex-row">
|
|
68
46
|
<div class="flex-item text-align-left">
|
|
69
|
-
<menu-unfold-outlined
|
|
70
|
-
|
|
71
|
-
class="trigger"
|
|
72
|
-
@click="() => (collapsed = !collapsed)"
|
|
73
|
-
/>
|
|
74
|
-
<menu-fold-outlined
|
|
75
|
-
v-else
|
|
76
|
-
class="trigger"
|
|
77
|
-
@click="() => (collapsed = !collapsed)"
|
|
78
|
-
/>
|
|
47
|
+
<menu-unfold-outlined v-if="collapsed" class="trigger" @click="() => (collapsed = !collapsed)" />
|
|
48
|
+
<menu-fold-outlined v-else class="trigger" @click="() => (collapsed = !collapsed)" />
|
|
79
49
|
<a class="text-color-black" @click="reload">
|
|
80
|
-
<UndoOutlined :style="{ fontSize: '
|
|
50
|
+
<UndoOutlined :style="{ fontSize: '18px' }" />
|
|
81
51
|
</a>
|
|
82
52
|
<!-- 面包屑导航 -->
|
|
83
53
|
<a-breadcrumb class="breadcrumb" v-if="breadcrumbItems.length > 0">
|
|
84
|
-
|
|
85
54
|
<a-breadcrumb-item v-for="item in breadcrumbItems" :key="item.key">
|
|
86
55
|
{{ item.title }}
|
|
87
56
|
</a-breadcrumb-item>
|
|
@@ -91,16 +60,25 @@
|
|
|
91
60
|
<a-space :size="18">
|
|
92
61
|
<a-dropdown>
|
|
93
62
|
<a class="text-color-black" @click.prevent>
|
|
94
|
-
<
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
63
|
+
<div class="flex-row">
|
|
64
|
+
<div class="flex-item">
|
|
65
|
+
<a-avatar
|
|
66
|
+
:size="35"
|
|
67
|
+
:style="{
|
|
68
|
+
backgroundColor: '#1677ff',
|
|
69
|
+
verticalAlign: 'middle',
|
|
70
|
+
margin: '0 0 5px 0',
|
|
71
|
+
}"
|
|
72
|
+
>
|
|
73
|
+
{{ username?.charAt(0) }}
|
|
74
|
+
</a-avatar>
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
<div class="flex-item margin-left-10 text-align-left">
|
|
78
|
+
<div class="username">{{ username }}</div>
|
|
79
|
+
<div class="userphone">{{ mobile }}</div>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
104
82
|
</a>
|
|
105
83
|
<template #overlay>
|
|
106
84
|
<a-menu @click="avatardropdownonClick">
|
|
@@ -109,11 +87,7 @@
|
|
|
109
87
|
</a-menu>
|
|
110
88
|
</template>
|
|
111
89
|
</a-dropdown>
|
|
112
|
-
<a
|
|
113
|
-
class="text-color-black"
|
|
114
|
-
@click.prevent
|
|
115
|
-
@click="toggleFullScreen"
|
|
116
|
-
>
|
|
90
|
+
<a class="text-color-black" @click.prevent @click="toggleFullScreen">
|
|
117
91
|
<a-tooltip :title="isFullScreen ? '退出全屏' : '进入全屏'">
|
|
118
92
|
<FullscreenOutlined v-if="isFullScreen" />
|
|
119
93
|
<FullscreenExitOutlined v-else />
|
|
@@ -126,80 +100,51 @@
|
|
|
126
100
|
<template #overlay>
|
|
127
101
|
<a-menu @click="dropdownonLanguageClick">
|
|
128
102
|
<a-menu-item key="zhCN">
|
|
129
|
-
<span
|
|
130
|
-
:class="
|
|
131
|
-
config.dayjsLocale == 'zh-cn'
|
|
132
|
-
? 'text-color-primary'
|
|
133
|
-
: ''
|
|
134
|
-
"
|
|
135
|
-
>简体中文</span
|
|
136
|
-
>
|
|
103
|
+
<span :class="config.dayjsLocale == 'zh-cn' ? 'text-color-primary' : ''">简体中文</span>
|
|
137
104
|
</a-menu-item>
|
|
138
105
|
<a-menu-item key="enUS">
|
|
139
|
-
<span
|
|
140
|
-
:class="
|
|
141
|
-
config.dayjsLocale == 'en'
|
|
142
|
-
? 'text-color-primary'
|
|
143
|
-
: ''
|
|
144
|
-
"
|
|
145
|
-
>English</span
|
|
146
|
-
>
|
|
106
|
+
<span :class="config.dayjsLocale == 'en' ? 'text-color-primary' : ''">English</span>
|
|
147
107
|
</a-menu-item>
|
|
148
108
|
</a-menu>
|
|
149
109
|
</template>
|
|
150
110
|
</a-dropdown>
|
|
151
111
|
<a class="text-color-black" @click.prevent @click="showDrawer">
|
|
152
|
-
<
|
|
112
|
+
<SettingOutlined />
|
|
153
113
|
</a>
|
|
154
114
|
</a-space>
|
|
155
115
|
</div>
|
|
156
116
|
</div>
|
|
157
117
|
</a-layout-header>
|
|
158
118
|
<!-- 选项卡组件 -->
|
|
159
|
-
<div class="zc-layout-content-tabs">
|
|
160
|
-
<div
|
|
161
|
-
class="zc-layout-content-tabs-left"
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
<a-menu-item key="1">
|
|
185
|
-
<ArrowLeftOutlined /> 关闭左侧
|
|
186
|
-
</a-menu-item>
|
|
187
|
-
<a-menu-item key="2">
|
|
188
|
-
<ArrowRightOutlined /> 关闭右侧
|
|
189
|
-
</a-menu-item>
|
|
190
|
-
<a-menu-item key="3">
|
|
191
|
-
<CloseOutlined /> 关闭其它
|
|
192
|
-
</a-menu-item>
|
|
193
|
-
<a-menu-item key="4">
|
|
194
|
-
<CloseCircleOutlined /> 全部关闭
|
|
195
|
-
</a-menu-item>
|
|
196
|
-
</a-menu>
|
|
197
|
-
</template>
|
|
198
|
-
</a-dropdown>
|
|
119
|
+
<div :class="['zc-layout-content-tabs', { collapsed: collapsed }]">
|
|
120
|
+
<div class="flex-row">
|
|
121
|
+
<div class="zc-layout-content-tabs-left">
|
|
122
|
+
<div class="my-tabs-wrapper" @wheel.prevent="onWheelScroll" ref="scrollContainer">
|
|
123
|
+
<a-tabs v-model:activeKey="selectmenuKey[0]" hide-add type="editable-card" size="small" @edit="tagdelete" @tabClick="tagchange">
|
|
124
|
+
<a-tab-pane v-for="pane in panes" :key="pane.key" :tab="pane.title" :closable="pane.closable" class="tag"> </a-tab-pane>
|
|
125
|
+
</a-tabs>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
<div class="zc-layout-content-tabs-right">
|
|
130
|
+
<a-dropdown>
|
|
131
|
+
<a class="text-color-black" @click.prevent>
|
|
132
|
+
<MoreOutlined :style="{ color: 'black', fontSize: '18px' }" />
|
|
133
|
+
</a>
|
|
134
|
+
<template #overlay>
|
|
135
|
+
<a-menu @click="dropdownonClick">
|
|
136
|
+
<a-menu-item key="1"> <ArrowLeftOutlined /> 关闭左侧 </a-menu-item>
|
|
137
|
+
<a-menu-item key="2"> <ArrowRightOutlined /> 关闭右侧 </a-menu-item>
|
|
138
|
+
<a-menu-item key="3"> <CloseOutlined /> 关闭其它 </a-menu-item>
|
|
139
|
+
<a-menu-item key="4"> <CloseCircleOutlined /> 全部关闭 </a-menu-item>
|
|
140
|
+
</a-menu>
|
|
141
|
+
</template>
|
|
142
|
+
</a-dropdown>
|
|
143
|
+
</div>
|
|
199
144
|
</div>
|
|
200
145
|
</div>
|
|
201
146
|
<!-- 路由视图部分 -->
|
|
202
|
-
<a-layout-content :style="{ margin: '8px' }">
|
|
147
|
+
<a-layout-content :style="{ margin: '120px 8px 8px 8px' }">
|
|
203
148
|
<router-view v-slot="{ Component, route }">
|
|
204
149
|
<keep-alive v-if="route.meta.cache">
|
|
205
150
|
<component :is="Component" />
|
|
@@ -209,6 +154,7 @@
|
|
|
209
154
|
</a-layout-content>
|
|
210
155
|
</a-layout>
|
|
211
156
|
</a-layout>
|
|
157
|
+
<!-- 顶部菜单布局 -->
|
|
212
158
|
<a-layout v-else>
|
|
213
159
|
<a-layout-header
|
|
214
160
|
class="zc-layout-header-top"
|
|
@@ -222,61 +168,40 @@
|
|
|
222
168
|
<div class="flex-row">
|
|
223
169
|
<div class="flex-item-9">
|
|
224
170
|
<div class="flex-row">
|
|
225
|
-
<div
|
|
226
|
-
class="flex-item-1"
|
|
227
|
-
style="line-height: 32px; height: 32px; margin: 16px"
|
|
228
|
-
>
|
|
171
|
+
<div class="flex-item-1" style="line-height: 32px; height: 32px; margin: 16px">
|
|
229
172
|
<a-flex>
|
|
230
|
-
<img
|
|
231
|
-
|
|
232
|
-
alt=""
|
|
233
|
-
width="30px"
|
|
234
|
-
class="margin-right-10"
|
|
235
|
-
/>
|
|
236
|
-
<span
|
|
237
|
-
:class="
|
|
238
|
-
formConfig.themeClass == 'light'
|
|
239
|
-
? 'text-color-primary'
|
|
240
|
-
: 'text-color-white '
|
|
241
|
-
"
|
|
242
|
-
style="font-size: 16px"
|
|
243
|
-
>{{ config.projectName }}</span
|
|
244
|
-
>
|
|
173
|
+
<img src="@/assets/imgs/logo.png" alt="" width="30px" class="margin-right-10" />
|
|
174
|
+
<span :class="formConfig.themeClass == 'light' ? 'text-color-primary' : 'text-color-white '" style="font-size: 16px">{{ config.projectName }}</span>
|
|
245
175
|
</a-flex>
|
|
246
176
|
</div>
|
|
247
177
|
<div class="flex-item-9">
|
|
248
|
-
<a-menu
|
|
249
|
-
v-model:selectedKeys="selectmenuKey"
|
|
250
|
-
mode="horizontal"
|
|
251
|
-
:theme="formConfig.themeClass"
|
|
252
|
-
:items="menuItems"
|
|
253
|
-
@click="menuclick"
|
|
254
|
-
></a-menu>
|
|
178
|
+
<a-menu v-model:selectedKeys="selectmenuKey" mode="horizontal" :theme="formConfig.themeClass" :items="menuItems" @click="menuclick"></a-menu>
|
|
255
179
|
</div>
|
|
256
180
|
</div>
|
|
257
|
-
|
|
258
181
|
</div>
|
|
259
182
|
<div class="flex-item-1 text-align-right padding-right-20">
|
|
260
183
|
<a-space :size="18">
|
|
261
184
|
<a-dropdown>
|
|
262
|
-
<a
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
185
|
+
<a :class="formConfig.themeClass == 'light' ? 'text-color-black' : 'text-color-white'" @click.prevent>
|
|
186
|
+
<div class="flex-row">
|
|
187
|
+
<div class="flex-item">
|
|
188
|
+
<a-avatar
|
|
189
|
+
:size="35"
|
|
190
|
+
:style="{
|
|
191
|
+
backgroundColor: '#1677ff',
|
|
192
|
+
verticalAlign: 'middle',
|
|
193
|
+
margin: '0 0 5px 0',
|
|
194
|
+
}"
|
|
195
|
+
>
|
|
196
|
+
{{ username?.charAt(0) }}
|
|
197
|
+
</a-avatar>
|
|
198
|
+
</div>
|
|
199
|
+
|
|
200
|
+
<div class="flex-item margin-left-10 text-align-left">
|
|
201
|
+
<div class="username" :class="formConfig.themeClass == 'light' ? 'text-color-black' : 'text-color-white'">{{ username }}</div>
|
|
202
|
+
<div class="userphone" :class="formConfig.themeClass == 'light' ? 'text-color-black' : 'text-color-white'">{{ mobile }}</div>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
280
205
|
</a>
|
|
281
206
|
<template #overlay>
|
|
282
207
|
<a-menu @click="avatardropdownonClick">
|
|
@@ -285,120 +210,70 @@
|
|
|
285
210
|
</a-menu>
|
|
286
211
|
</template>
|
|
287
212
|
</a-dropdown>
|
|
288
|
-
<a
|
|
289
|
-
:class="
|
|
290
|
-
formConfig.themeClass == 'light'
|
|
291
|
-
? 'text-color-black'
|
|
292
|
-
: 'text-color-white'
|
|
293
|
-
"
|
|
294
|
-
@click.prevent
|
|
295
|
-
@click="toggleFullScreen"
|
|
296
|
-
>
|
|
213
|
+
<a :class="formConfig.themeClass == 'light' ? 'text-color-black' : 'text-color-white'" @click.prevent @click="toggleFullScreen">
|
|
297
214
|
<a-tooltip :title="isFullScreen ? '退出全屏' : '进入全屏'">
|
|
298
215
|
<FullscreenOutlined v-if="isFullScreen" />
|
|
299
216
|
<FullscreenExitOutlined v-else />
|
|
300
217
|
</a-tooltip>
|
|
301
218
|
</a>
|
|
302
219
|
<a-dropdown>
|
|
303
|
-
<a
|
|
304
|
-
:class="
|
|
305
|
-
formConfig.themeClass == 'light'
|
|
306
|
-
? 'text-color-black'
|
|
307
|
-
: 'text-color-white'
|
|
308
|
-
"
|
|
309
|
-
@click.prevent
|
|
310
|
-
>
|
|
220
|
+
<a :class="formConfig.themeClass == 'light' ? 'text-color-black' : 'text-color-white'" @click.prevent>
|
|
311
221
|
<GlobalOutlined />
|
|
312
222
|
</a>
|
|
313
223
|
<template #overlay>
|
|
314
224
|
<a-menu @click="dropdownonLanguageClick">
|
|
315
225
|
<a-menu-item key="zhCN">
|
|
316
|
-
<span
|
|
317
|
-
:class="
|
|
318
|
-
config.locale.locale == 'zh-cn'
|
|
319
|
-
? 'text-color-primary'
|
|
320
|
-
: ''
|
|
321
|
-
"
|
|
322
|
-
>简体中文</span
|
|
323
|
-
>
|
|
226
|
+
<span :class="config.locale.locale == 'zh-cn' ? 'text-color-primary' : ''">简体中文</span>
|
|
324
227
|
</a-menu-item>
|
|
325
228
|
<a-menu-item key="enUS">
|
|
326
|
-
<span
|
|
327
|
-
:class="
|
|
328
|
-
config.locale.locale == 'en'
|
|
329
|
-
? 'text-color-primary'
|
|
330
|
-
: ''
|
|
331
|
-
"
|
|
332
|
-
>English</span
|
|
333
|
-
>
|
|
229
|
+
<span :class="config.locale.locale == 'en' ? 'text-color-primary' : ''">English</span>
|
|
334
230
|
</a-menu-item>
|
|
335
231
|
</a-menu>
|
|
336
232
|
</template>
|
|
337
233
|
</a-dropdown>
|
|
338
|
-
<a
|
|
339
|
-
|
|
340
|
-
formConfig.themeClass == 'light'
|
|
341
|
-
? 'text-color-black'
|
|
342
|
-
: 'text-color-white'
|
|
343
|
-
"
|
|
344
|
-
@click.prevent
|
|
345
|
-
@click="showDrawer"
|
|
346
|
-
>
|
|
347
|
-
<MoreOutlined />
|
|
234
|
+
<a :class="formConfig.themeClass == 'light' ? 'text-color-black' : 'text-color-white'" @click.prevent @click="showDrawer">
|
|
235
|
+
<SettingOutlined />
|
|
348
236
|
</a>
|
|
349
237
|
</a-space>
|
|
350
238
|
</div>
|
|
351
239
|
</div>
|
|
352
240
|
</a-layout-header>
|
|
353
241
|
<!-- 选项卡组件 -->
|
|
354
|
-
<div class="zc-layout-content-tabs">
|
|
355
|
-
<div
|
|
356
|
-
class="zc-layout-content-tabs-left"
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
<a-menu-item key="1">
|
|
380
|
-
<ArrowLeftOutlined /> 关闭左侧
|
|
381
|
-
</a-menu-item>
|
|
382
|
-
<a-menu-item key="2">
|
|
383
|
-
<ArrowRightOutlined /> 关闭右侧
|
|
384
|
-
</a-menu-item>
|
|
385
|
-
<a-menu-item key="3"> <CloseOutlined /> 关闭其它 </a-menu-item>
|
|
386
|
-
<a-menu-item key="4">
|
|
387
|
-
<CloseCircleOutlined /> 全部关闭
|
|
388
|
-
</a-menu-item>
|
|
389
|
-
</a-menu>
|
|
390
|
-
</template>
|
|
391
|
-
</a-dropdown>
|
|
242
|
+
<div :class="['zc-layout-content-tabs', 'top-layout', { collapsed: collapsed }]">
|
|
243
|
+
<div class="flex-row">
|
|
244
|
+
<div class="zc-layout-content-tabs-left">
|
|
245
|
+
<div class="my-tabs-wrapper" @wheel.prevent="onWheelScroll" ref="scrollContainer">
|
|
246
|
+
<a-tabs v-model:activeKey="selectmenuKey[0]" hide-add type="editable-card" size="small" @edit="tagdelete" @tabClick="tagchange">
|
|
247
|
+
<a-tab-pane v-for="pane in panes" :key="pane.key" :tab="pane.title" :closable="pane.closable" class="tag"> </a-tab-pane>
|
|
248
|
+
</a-tabs>
|
|
249
|
+
</div>
|
|
250
|
+
</div>
|
|
251
|
+
|
|
252
|
+
<div class="zc-layout-content-tabs-right">
|
|
253
|
+
<a-dropdown>
|
|
254
|
+
<a class="text-color-black" @click.prevent>
|
|
255
|
+
<MoreOutlined :style="{ color: 'black', fontSize: '18px' }" />
|
|
256
|
+
</a>
|
|
257
|
+
<template #overlay>
|
|
258
|
+
<a-menu @click="dropdownonClick">
|
|
259
|
+
<a-menu-item key="1"> <ArrowLeftOutlined /> 关闭左侧 </a-menu-item>
|
|
260
|
+
<a-menu-item key="2"> <ArrowRightOutlined /> 关闭右侧 </a-menu-item>
|
|
261
|
+
<a-menu-item key="3"> <CloseOutlined /> 关闭其它 </a-menu-item>
|
|
262
|
+
<a-menu-item key="4"> <CloseCircleOutlined /> 全部关闭 </a-menu-item>
|
|
263
|
+
</a-menu>
|
|
264
|
+
</template>
|
|
265
|
+
</a-dropdown>
|
|
266
|
+
</div>
|
|
392
267
|
</div>
|
|
393
268
|
</div>
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
269
|
+
<!-- 面包屑导航 -->
|
|
270
|
+
<a-breadcrumb class="breadcrumb-top" v-if="breadcrumbItems.length > 0">
|
|
271
|
+
<a-breadcrumb-item v-for="item in breadcrumbItems" :key="item.key">
|
|
272
|
+
{{ item.title }}
|
|
273
|
+
</a-breadcrumb-item>
|
|
274
|
+
</a-breadcrumb>
|
|
400
275
|
<!-- 路由视图部分 -->
|
|
401
|
-
<a-layout-content :style="{ margin: '8px' }">
|
|
276
|
+
<a-layout-content :style="{ margin: '120px 8px 8px 8px' }">
|
|
402
277
|
<router-view v-slot="{ Component, route }">
|
|
403
278
|
<keep-alive v-if="route.meta.cache">
|
|
404
279
|
<component :is="Component" />
|
|
@@ -412,20 +287,14 @@
|
|
|
412
287
|
<a-form name="config_form" :model="formConfig">
|
|
413
288
|
<div class="blockquote">主题</div>
|
|
414
289
|
<div class="padding-10">
|
|
415
|
-
<a-radio-group
|
|
416
|
-
v-model:value="formConfig.themeClass"
|
|
417
|
-
@change="themeClasschangeTheme"
|
|
418
|
-
>
|
|
290
|
+
<a-radio-group v-model:value="formConfig.themeClass" @change="themeClasschangeTheme">
|
|
419
291
|
<a-radio value="dark">黑</a-radio>
|
|
420
292
|
<a-radio value="light">白</a-radio>
|
|
421
293
|
</a-radio-group>
|
|
422
294
|
</div>
|
|
423
295
|
<div class="blockquote">导航模式</div>
|
|
424
296
|
<div class="padding-10">
|
|
425
|
-
<a-radio-group
|
|
426
|
-
v-model:value="formConfig.navigationMode"
|
|
427
|
-
@change="navigationModechangeTheme"
|
|
428
|
-
>
|
|
297
|
+
<a-radio-group v-model:value="formConfig.navigationMode" @change="navigationModechangeTheme">
|
|
429
298
|
<a-radio value="side">侧边菜单布局</a-radio>
|
|
430
299
|
<a-radio value="top">顶部菜单布局</a-radio>
|
|
431
300
|
</a-radio-group>
|
|
@@ -435,12 +304,7 @@
|
|
|
435
304
|
<a-row>
|
|
436
305
|
<a-col :span="12">表格边框</a-col>
|
|
437
306
|
<a-col :span="12">
|
|
438
|
-
<a-switch
|
|
439
|
-
v-model:checked="formConfig.tableBordered"
|
|
440
|
-
checked-children="边框开"
|
|
441
|
-
un-checked-children="边框关"
|
|
442
|
-
@change="tableBorderedchangeTheme"
|
|
443
|
-
/>
|
|
307
|
+
<a-switch v-model:checked="formConfig.tableBordered" checked-children="边框开" un-checked-children="边框关" @change="tableBorderedchangeTheme" />
|
|
444
308
|
</a-col>
|
|
445
309
|
</a-row>
|
|
446
310
|
</div>
|
|
@@ -458,6 +322,7 @@ import zhCN from 'ant-design-vue/es/locale/zh_CN'
|
|
|
458
322
|
import enUS from 'ant-design-vue/es/locale/en_US'
|
|
459
323
|
const user = useUserStore()
|
|
460
324
|
const username = user.userInfo.name
|
|
325
|
+
const mobile = user.userInfo.mobile
|
|
461
326
|
// 菜单状态
|
|
462
327
|
const menu = menuStore()
|
|
463
328
|
const config = configStore()
|
|
@@ -526,43 +391,43 @@ const menuclick = ({ item, key }) => {
|
|
|
526
391
|
updateMenuPanes(current)
|
|
527
392
|
}
|
|
528
393
|
// 点击 Tag 切换选项卡
|
|
529
|
-
const tagchange =
|
|
530
|
-
const current = panes.value.find(x => x.key ===
|
|
394
|
+
const tagchange = key => {
|
|
395
|
+
const current = panes.value.find(x => x.key === key)
|
|
531
396
|
if (current) {
|
|
532
397
|
updateMenuPanes(current)
|
|
533
398
|
}
|
|
534
399
|
}
|
|
400
|
+
|
|
535
401
|
// 删除 Tag
|
|
536
|
-
const tagdelete =
|
|
537
|
-
if (
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
402
|
+
const tagdelete = (key, action) => {
|
|
403
|
+
if (action === 'add') {
|
|
404
|
+
//add();
|
|
405
|
+
} else {
|
|
406
|
+
if (key == selectmenuKey.value[0]) {
|
|
407
|
+
const index = panes.value.findIndex(item => item.key === key)
|
|
408
|
+
let nextPane = null
|
|
409
|
+
//如果有下一条
|
|
410
|
+
if (index + 1 < panes.value.length) {
|
|
411
|
+
// 有下一个
|
|
412
|
+
nextPane = panes.value[index + 1]
|
|
413
|
+
} else if (index - 1 >= 0) {
|
|
414
|
+
// 有上一个
|
|
415
|
+
nextPane = panes.value[index - 1]
|
|
416
|
+
}
|
|
417
|
+
if (nextPane) {
|
|
418
|
+
updateMenuPanes(nextPane)
|
|
419
|
+
}
|
|
551
420
|
}
|
|
421
|
+
panes.value = panes.value.filter(x => x.key !== key)
|
|
422
|
+
menu.tagmenus = panes.value
|
|
552
423
|
}
|
|
553
|
-
panes.value = panes.value.filter(x => x.key !== pane.key)
|
|
554
|
-
menu.tagmenus = panes.value
|
|
555
424
|
}
|
|
556
425
|
// 下拉菜单点击事件
|
|
557
426
|
const dropdownonClick = ({ key }) => {
|
|
558
|
-
const index = panes.value.findIndex(
|
|
559
|
-
item => item.key === selectmenuKey.value[0],
|
|
560
|
-
)
|
|
427
|
+
const index = panes.value.findIndex(item => item.key === selectmenuKey.value[0])
|
|
561
428
|
switch (key) {
|
|
562
429
|
case '1':
|
|
563
|
-
panes.value = panes.value.filter(
|
|
564
|
-
(item, i) => i >= index || item.key === 0,
|
|
565
|
-
)
|
|
430
|
+
panes.value = panes.value.filter((item, i) => i >= index || item.key === 0)
|
|
566
431
|
menu.tagmenus = panes.value
|
|
567
432
|
break
|
|
568
433
|
case '2':
|
|
@@ -570,9 +435,7 @@ const dropdownonClick = ({ key }) => {
|
|
|
570
435
|
menu.tagmenus = panes.value
|
|
571
436
|
break
|
|
572
437
|
case '3':
|
|
573
|
-
panes.value = panes.value.filter(
|
|
574
|
-
x => x.key === selectmenuKey.value[0] || x.key === 0,
|
|
575
|
-
)
|
|
438
|
+
panes.value = panes.value.filter(x => x.key === selectmenuKey.value[0] || x.key === 0)
|
|
576
439
|
menu.tagmenus = panes.value
|
|
577
440
|
break
|
|
578
441
|
case '4':
|
|
@@ -659,10 +522,7 @@ function findParentKeys(menuArray, targetKey, parentKeys = []) {
|
|
|
659
522
|
|
|
660
523
|
// 如果有子菜单,递归查找
|
|
661
524
|
if (item.children && item.children.length > 0) {
|
|
662
|
-
const result = findParentKeys(item.children, targetKey, [
|
|
663
|
-
...parentKeys,
|
|
664
|
-
item.key,
|
|
665
|
-
])
|
|
525
|
+
const result = findParentKeys(item.children, targetKey, [...parentKeys, item.key])
|
|
666
526
|
if (result) {
|
|
667
527
|
return result
|
|
668
528
|
}
|
|
@@ -798,25 +658,29 @@ const generateBreadcrumbItems = () => {
|
|
|
798
658
|
title: item.title,
|
|
799
659
|
path: item.path,
|
|
800
660
|
type: item.type,
|
|
801
|
-
url: item.url
|
|
661
|
+
url: item.url,
|
|
802
662
|
}))
|
|
803
663
|
}
|
|
804
664
|
}
|
|
805
665
|
|
|
806
666
|
// 监听选中菜单项变化,更新面包屑
|
|
807
|
-
watch(
|
|
808
|
-
|
|
809
|
-
|
|
667
|
+
watch(
|
|
668
|
+
selectmenuKey,
|
|
669
|
+
() => {
|
|
670
|
+
generateBreadcrumbItems()
|
|
671
|
+
},
|
|
672
|
+
{ immediate: true },
|
|
673
|
+
)
|
|
810
674
|
|
|
811
675
|
// 组件挂载时恢复路由状态
|
|
812
676
|
onMounted(() => {
|
|
813
677
|
// 检查是否有持久化的选中菜单项
|
|
814
678
|
if (selectmenuKey.value && selectmenuKey.value.length > 0 && selectmenuKey.value[0] !== 0) {
|
|
815
679
|
const currentKey = selectmenuKey.value[0]
|
|
816
|
-
|
|
680
|
+
|
|
817
681
|
// 在tagmenus中查找对应的pane
|
|
818
682
|
const savedPane = panes.value.find(pane => pane.key === currentKey)
|
|
819
|
-
|
|
683
|
+
|
|
820
684
|
if (savedPane) {
|
|
821
685
|
// 如果找到了对应的pane,恢复路由状态
|
|
822
686
|
updateMenuPanes(savedPane)
|
|
@@ -893,65 +757,82 @@ provide('menuclick', menuclick)
|
|
|
893
757
|
padding: 0 !important;
|
|
894
758
|
}
|
|
895
759
|
.zc-layout-content-tabs {
|
|
896
|
-
display: flex;
|
|
897
|
-
flex-direction: row;
|
|
898
|
-
justify-content: center;
|
|
899
760
|
align-items: center;
|
|
900
|
-
|
|
761
|
+
position: fixed;
|
|
762
|
+
top: 64px;
|
|
763
|
+
left: 200px;
|
|
764
|
+
right: 0;
|
|
765
|
+
z-index: 100;
|
|
766
|
+
background: #fff;
|
|
767
|
+
border-bottom: 1px solid rgba(5, 5, 5, 0.06);
|
|
768
|
+
transition: left 0.3s ease;
|
|
901
769
|
}
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
padding: 0 15px;
|
|
910
|
-
}
|
|
911
|
-
.tag-select {
|
|
912
|
-
background-color: #fff;
|
|
913
|
-
color: #1677ff;
|
|
914
|
-
height: 30px;
|
|
915
|
-
line-height: 30px;
|
|
916
|
-
cursor: pointer;
|
|
917
|
-
font-size: 14px;
|
|
918
|
-
padding: 0 15px;
|
|
770
|
+
|
|
771
|
+
.zc-layout-content-tabs.collapsed {
|
|
772
|
+
left: 80px;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
.zc-layout-content-tabs.top-layout {
|
|
776
|
+
left: 0;
|
|
919
777
|
}
|
|
920
778
|
.zc-layout-content-tabs-left {
|
|
921
|
-
flex: 0.
|
|
922
|
-
|
|
923
|
-
white-space: nowrap;
|
|
924
|
-
overflow-x: auto;
|
|
925
|
-
overflow-y: hidden;
|
|
926
|
-
/* 确保只有横向滑动 */
|
|
927
|
-
width: 100%;
|
|
928
|
-
/* 父容器宽度 */
|
|
929
|
-
-ms-overflow-style: none;
|
|
930
|
-
/* 适用于 IE 和 Edge */
|
|
931
|
-
scrollbar-width: none;
|
|
932
|
-
/* 适用于 Firefox */
|
|
933
|
-
}
|
|
934
|
-
.zc-layout-content-tabs-left::-webkit-scrollbar {
|
|
935
|
-
display: none;
|
|
936
|
-
/* 隐藏 Webkit 浏览器中的滚动条 */
|
|
779
|
+
flex: 0.99;
|
|
780
|
+
width: 90%;
|
|
937
781
|
}
|
|
938
782
|
.zc-layout-content-tabs-right {
|
|
939
|
-
flex: 0.
|
|
783
|
+
flex: 0.01;
|
|
940
784
|
text-align: right;
|
|
941
|
-
padding-right:
|
|
785
|
+
padding-right: 15px;
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
/* 使用深度选择器修改所有标签项的样式 */
|
|
789
|
+
.my-tabs-wrapper :deep(.ant-tabs-tab) {
|
|
790
|
+
border-radius: 4px !important; /* 圆角 */
|
|
791
|
+
color: #999999 !important;
|
|
792
|
+
background-color: #f5f5f5 !important;
|
|
793
|
+
border: 0px !important;
|
|
794
|
+
margin-right: 4px;
|
|
795
|
+
margin: 8px;
|
|
796
|
+
padding: 5px 10px !important;
|
|
797
|
+
}
|
|
798
|
+
/* 修改激活标签的样式 */
|
|
799
|
+
.my-tabs-wrapper :deep(.ant-tabs-tab-active .ant-tabs-tab-btn .ant-tabs-tab-remove) {
|
|
800
|
+
color: #1890ff !important;
|
|
801
|
+
}
|
|
802
|
+
.my-tabs-wrapper :deep(.ant-tabs-tab-active .ant-tabs-tab-remove) {
|
|
803
|
+
color: #1890ff !important;
|
|
942
804
|
}
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
border-radius: 4px;
|
|
805
|
+
/* 标签悬停效果 */
|
|
806
|
+
.my-tabs-wrapper :deep(.ant-tabs-tab:hover, .ant-tabs-tab-remove:hover) {
|
|
807
|
+
color: #1890ff !important;
|
|
947
808
|
}
|
|
809
|
+
.my-tabs-wrapper :deep(.ant-tabs-content-holder) {
|
|
810
|
+
display: none !important;
|
|
811
|
+
}
|
|
812
|
+
.my-tabs-wrapper :deep(.ant-tabs-nav) {
|
|
813
|
+
margin: 0px !important;
|
|
814
|
+
border-bottom: none !important; /* 移除底部分割线 */
|
|
815
|
+
}
|
|
816
|
+
.my-tabs-wrapper :deep(.ant-tabs-tab-remove) {
|
|
817
|
+
margin-left: 0px !important;
|
|
818
|
+
}
|
|
819
|
+
|
|
948
820
|
.breadcrumb {
|
|
949
821
|
display: inline-block;
|
|
950
822
|
margin-left: 16px;
|
|
951
|
-
vertical-align: middle;
|
|
952
823
|
}
|
|
953
824
|
.breadcrumb-top {
|
|
954
825
|
margin-top: 8px;
|
|
955
826
|
padding-left: 16px;
|
|
956
827
|
}
|
|
828
|
+
|
|
829
|
+
.username {
|
|
830
|
+
line-height: 1.2;
|
|
831
|
+
margin-bottom: 2px;
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
.userphone {
|
|
835
|
+
line-height: 1.2;
|
|
836
|
+
margin-bottom: 4px;
|
|
837
|
+
}
|
|
957
838
|
</style>
|