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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +414 -25
  3. package/README.md +426 -277
  4. package/bin/cli.js +99 -99
  5. package/bin/generator.js +502 -502
  6. package/bin/prompts.js +158 -158
  7. package/bin/utils.js +133 -133
  8. package/package.json +3 -3
  9. package/public/logo.png +0 -0
  10. package/src/App.vue +1 -1
  11. package/src/api/methods/sysAccount.js +0 -1
  12. package/src/api/methods/sysDictItem.js +3 -3
  13. package/src/api/methods/system.js +10 -11
  14. package/src/api/request.js +39 -39
  15. package/src/assets/css/style.css +0 -11
  16. package/src/assets/css/zcui.css +1002 -319
  17. package/src/assets/imgs/logo.png +0 -0
  18. package/src/assets/imgs/md/console.png +0 -0
  19. package/src/assets/imgs/md/login.png +0 -0
  20. package/src/assets/imgs/md/menu.png +0 -0
  21. package/src/assets/imgs/md/serviceMonitoring.png +0 -0
  22. package/src/assets/imgs/md/statistics.png +0 -0
  23. package/src/components/FormTable.vue +50 -37
  24. package/src/components/IconPicker.vue +351 -344
  25. package/src/components/MainPage.vue +220 -339
  26. package/src/components/edit/QuartzEdit.vue +1 -1
  27. package/src/components/edit/SysAccountEdit.vue +15 -8
  28. package/src/components/edit/SysDictEdit.vue +6 -4
  29. package/src/components/edit/SysDictItemEdit.vue +8 -6
  30. package/src/components/edit/SysRoleEdit.vue +5 -3
  31. package/src/components/edit/sysMenuEdit.vue +10 -25
  32. package/src/config/index.js +74 -74
  33. package/src/directives/permission.js +49 -45
  34. package/src/main.js +2 -3
  35. package/src/router/index.js +48 -30
  36. package/src/stores/config.js +7 -1
  37. package/src/stores/menu.js +32 -8
  38. package/src/stores/user.js +17 -17
  39. package/src/utils/regionUtils.js +20 -16
  40. package/src/utils/useFormCRUD.js +59 -60
  41. package/src/views/baiscstatis/center.vue +53 -42
  42. package/src/views/baiscstatis/iframePage.vue +9 -11
  43. package/src/views/console.vue +92 -42
  44. package/src/views/demo/button.vue +269 -0
  45. package/src/views/demo/importexport.vue +8 -12
  46. package/src/views/demo/region.vue +103 -21
  47. package/src/views/demo/statistics.vue +38 -19
  48. package/src/views/home.vue +2 -3
  49. package/src/views/login.vue +254 -149
  50. package/src/views/operations/log/logQuartz.vue +0 -1
  51. package/src/views/operations/quartz.vue +22 -24
  52. package/src/views/system/sysAccount.vue +16 -11
  53. package/src/views/system/sysDict.vue +9 -6
  54. package/src/views/system/sysMenu.vue +17 -15
  55. package/src/views/system/sysRole.vue +44 -21
  56. package/SCAFFOLD_README.md +0 -215
  57. package/src/assets/imgs/md/1.png +0 -0
  58. package/src/assets/imgs/md/10.png +0 -0
  59. package/src/assets/imgs/md/11.png +0 -0
  60. package/src/assets/imgs/md/2.png +0 -0
  61. package/src/assets/imgs/md/3.png +0 -0
  62. package/src/assets/imgs/md/4.png +0 -0
  63. package/src/assets/imgs/md/5.png +0 -0
  64. package/src/assets/imgs/md/6.png +0 -0
  65. package/src/assets/imgs/md/7.png +0 -0
  66. package/src/assets/imgs/md/8.png +0 -0
  67. 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
- v-if="!collapsed"
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
- v-if="collapsed"
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: '16px' }" />
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
- <a-avatar
95
- :size="35"
96
- :style="{
97
- backgroundColor: '#1677ff',
98
- verticalAlign: 'middle',
99
- margin: '0 0 5px 0',
100
- }"
101
- >
102
- {{ username }}
103
- </a-avatar>
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
- <MoreOutlined />
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
- @wheel.prevent="onWheelScroll"
163
- ref="scrollContainer"
164
- >
165
- <a-tag
166
- v-for="pane in panes"
167
- :key="pane.key"
168
- :class="selectmenuKey[0] == pane.key ? 'tag-select' : 'tag'"
169
- :closable="pane.closable"
170
- :bordered="false"
171
- @close="tagdelete(pane)"
172
- @click="tagchange(pane)"
173
- >
174
- {{ pane.title }}
175
- </a-tag>
176
- </div>
177
- <div class="zc-layout-content-tabs-right">
178
- <a-dropdown class="zc-layout-content-tabs-right-dropdown">
179
- <a class="ant-dropdown-link" @click.prevent>
180
- <DownOutlined />
181
- </a>
182
- <template #overlay>
183
- <a-menu @click="dropdownonClick">
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
- src="@/assets/imgs/logo.png"
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
- :class="
264
- formConfig.themeClass == 'light'
265
- ? 'text-color-black'
266
- : 'text-color-white'
267
- "
268
- @click.prevent
269
- >
270
- <a-avatar
271
- :size="35"
272
- :style="{
273
- backgroundColor: '#1677ff',
274
- verticalAlign: 'middle',
275
- margin: '0 0 5px 0',
276
- }"
277
- >
278
- {{ username }}
279
- </a-avatar>
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
- :class="
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
- @wheel.prevent="onWheelScroll"
358
- ref="scrollContainer"
359
- >
360
- <a-tag
361
- v-for="pane in panes"
362
- :key="pane.key"
363
- :class="selectmenuKey[0] == pane.key ? 'tag-select' : 'tag'"
364
- :closable="pane.closable"
365
- :bordered="false"
366
- @close="tagdelete(pane)"
367
- @click="tagchange(pane)"
368
- >
369
- {{ pane.title }}
370
- </a-tag>
371
- </div>
372
- <div class="zc-layout-content-tabs-right">
373
- <a-dropdown class="zc-layout-content-tabs-right-dropdown">
374
- <a class="ant-dropdown-link" @click.prevent>
375
- <DownOutlined />
376
- </a>
377
- <template #overlay>
378
- <a-menu @click="dropdownonClick">
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
- <a-breadcrumb class="breadcrumb-top" v-if="breadcrumbItems.length > 0">
396
- <a-breadcrumb-item v-for="item in breadcrumbItems" :key="item.key">
397
- {{ item.title }}
398
- </a-breadcrumb-item>
399
- </a-breadcrumb>
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 = pane => {
530
- const current = panes.value.find(x => x.key === pane.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 = pane => {
537
- if (pane.key == selectmenuKey.value[0]) {
538
- console.log(JSON.stringify(panes.value))
539
- const index = panes.value.findIndex(item => item.key === pane.key)
540
- let nextPane = null
541
- //如果有下一条
542
- if (index + 1 < panes.value.length) {
543
- // 有下一个
544
- nextPane = panes.value[index + 1]
545
- } else if (index - 1 >= 0) {
546
- // 有上一个
547
- nextPane = panes.value[index - 1]
548
- }
549
- if (nextPane) {
550
- updateMenuPanes(nextPane)
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(selectmenuKey, () => {
808
- generateBreadcrumbItems()
809
- }, { immediate: true })
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
- margin-top: 69px;
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
- .tag {
903
- background-color: #fff;
904
- color: #999999;
905
- height: 30px;
906
- line-height: 30px;
907
- cursor: pointer;
908
- font-size: 14px;
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.95;
922
- padding-left: 10px;
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.05;
783
+ flex: 0.01;
940
784
  text-align: right;
941
- padding-right: 10px;
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
- .zc-layout-content-tabs-right-dropdown {
944
- background-color: white;
945
- padding: 8px 10px;
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>