@epxing/business 5.3.0-beta.2 → 5.3.0-beta.4

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 (98) hide show
  1. package/API.md +115 -111
  2. package/README.md +44 -44
  3. package/dist/src/base/AiSkillEditor.js +1 -1
  4. package/dist/src/base/AiSkillEditor.vue.js +2 -0
  5. package/dist/src/base/AppConfigFormItem.js +1 -3
  6. package/dist/src/base/AppConfigFormItem.vue.js +210 -85
  7. package/dist/src/base/CommonFieldList.js +1 -1
  8. package/dist/src/base/CommonFieldList.vue.js +2 -1
  9. package/dist/src/base/ConfigModuleIndex.js +38 -1
  10. package/dist/src/base/ManageAppNav.js +1 -1
  11. package/dist/src/base/ManageMenu.js +1 -1
  12. package/dist/src/base/RoleBindTrace.js +253 -0
  13. package/dist/src/base/RoleGroupManage.js +1037 -0
  14. package/dist/src/base/ServiceMenu.js +7 -6
  15. package/dist/src/components/AiList.js +1278 -3
  16. package/dist/src/components/EntityCheckboxFind.vue.js +14 -10
  17. package/dist/src/components/EntityRightFormItem.js +1 -5
  18. package/dist/src/components/EntityRightFormItem.vue.js +3 -1
  19. package/dist/src/components/EntitySystemEr.js +492 -0
  20. package/dist/src/components/HallNav.vue.js +7 -36
  21. package/dist/src/components/IconFontLibrary.js +22 -1
  22. package/dist/src/components/IconFontList.js +21 -1
  23. package/dist/src/components/PrintFormList.js +2 -1
  24. package/dist/src/components/PrintFormList.vue.js +3 -1
  25. package/dist/src/components/WikiWorkbench.js +153 -129
  26. package/dist/src/components/authorization/AuthorizationInterface.js +3 -1
  27. package/dist/src/components/custom-bpmn/PropertiesView.js +1991 -1942
  28. package/dist/src/components/icon-gallery/IconGallery.js +193 -0
  29. package/dist/src/components/icon-gallery/mixin.js +150 -0
  30. package/dist/src/components/wiki-workbench/WikiIntake.js +86 -93
  31. package/dist/src/components/wiki-workbench/WikiIntake.vue.js +153 -73
  32. package/dist/src/index.js +26 -20
  33. package/dist/src/public-components.js +16 -14
  34. package/dist/src/route-components.js +5 -5
  35. package/dist/src/system.component.index.js +1 -1
  36. package/dist/src/system.component.js +8 -3
  37. package/dist/src/system.component.lazy.js +1 -1
  38. package/dist/src/views/Add.js +1 -1
  39. package/dist/src/views/Add.vue.js +8 -3
  40. package/dist/src/views/AiToolManager.js +792 -317
  41. package/dist/src/views/App.js +3 -45
  42. package/dist/src/views/AppRoleSelect.js +3 -230
  43. package/dist/src/views/Error.js +3 -207
  44. package/dist/src/views/ExcelDesign.js +326 -316
  45. package/dist/src/views/JvmMemoryMonitor.js +463 -0
  46. package/dist/src/views/Module.js +3 -170
  47. package/dist/src/views/WikiBinding.js +88 -25
  48. package/dist/style.css +2867 -1487
  49. package/package.json +12 -6
  50. package/src/base/AiSkillEditor.vue +2 -0
  51. package/src/base/AppConfigFormItem.vue +211 -145
  52. package/src/base/CommonFieldList.vue +9 -6
  53. package/src/base/ConfigModuleIndex.vue +37 -1
  54. package/src/base/ManageAppNav.vue +1188 -1188
  55. package/src/base/ManageMenu.vue +933 -933
  56. package/src/base/RoleBindTrace.vue +364 -0
  57. package/src/base/RoleGroupManage.vue +1160 -0
  58. package/src/base/ServiceMenu.vue +6 -5
  59. package/src/components/AiList.vue +439 -113
  60. package/src/components/EntityCheckboxFind.vue +12 -8
  61. package/src/components/EntityRightFormItem.vue +9 -10
  62. package/src/components/EntitySystemEr.vue +517 -0
  63. package/src/components/HallNav.vue +6 -33
  64. package/src/components/IconFontLibrary.vue +27 -60
  65. package/src/components/IconFontList.vue +13 -64
  66. package/src/components/PrintFormList.vue +33 -27
  67. package/src/components/WikiWorkbench.vue +90 -60
  68. package/src/components/authorization/AuthorizationInterface.vue +2 -0
  69. package/src/components/custom-bpmn/CustomPalette.js +1 -1
  70. package/src/components/custom-bpmn/CustomRenderer.js +1 -1
  71. package/src/components/custom-bpmn/PropertiesView.vue +35 -4
  72. package/src/components/custom-bpmn/index.js +1 -1
  73. package/src/components/icon-gallery/IconGallery.vue +130 -0
  74. package/src/components/icon-gallery/mixin.jsx +109 -0
  75. package/src/components/wiki-workbench/WikiIntake.vue +178 -104
  76. package/src/index.js +24 -20
  77. package/src/public-components.js +1 -0
  78. package/src/route-components.js +4 -4
  79. package/src/system.component.index.js +1 -1
  80. package/src/views/Add.vue +8 -5
  81. package/src/views/AiToolManager.vue +326 -4
  82. package/src/views/App.vue +4 -53
  83. package/src/views/AppRoleSelect.vue +4 -334
  84. package/src/views/Error.vue +4 -63
  85. package/src/views/ExcelDesign.vue +24 -7
  86. package/src/views/JvmMemoryMonitor.vue +284 -0
  87. package/src/views/Module.vue +4 -210
  88. package/src/views/WikiBinding.vue +42 -0
  89. package/types/app.d.ts +1 -0
  90. package/types/dept-find.d.ts +1 -1
  91. package/types/index.d.ts +15 -14
  92. package/types/popup.d.ts +2 -2
  93. package/types/route-components.d.ts +1 -1
  94. package/types/user-find.d.ts +1 -1
  95. package/dist/assets/role_select-DTqRlFNz.webp +0 -0
  96. package/dist/src/components/AiList.vue.js +0 -93
  97. package/dist/src/components/IconFontLibrary.vue.js +0 -67
  98. package/dist/src/components/IconFontList.vue.js +0 -79
@@ -1,935 +1,935 @@
1
- <template>
2
- <div class="epx-menu" :style="{ width: width + 'px'}">
3
- <el-row class="epx-menu__row manage-menu-row">
4
- <el-col>
5
- <h5 :class="['epx-menu__header', {'is-active': isActive }]" @click="backModule" v-if="showNav">
6
- <p class="epx-menu__name">
7
- <i v-if="back" @click="$emit('back')" class="epx-menu__back el-icon-arrow-left"></i>
8
- <i v-else class="el-icon-s-data"></i>
9
- <span>{{moduleName}}</span>
10
- </p>
11
- <p class="epx-menu__subtitle" v-if="subTitle">({{subTitle}})</p>
12
- </h5>
13
- <template v-if="serviceMenu.length>0">
14
- <el-tree
15
- class="tree-wrap"
16
- :data="serviceMenu"
17
- node-key="id"
18
- :props="props"
19
- :default-expanded-keys="defaultOpenMenuId"
20
- accordion
21
- draggable
22
- :indent="0"
23
- icon="mycons"
24
- @node-drop="nodeDrop"
25
- >
26
- <template v-slot="{ node, data }"><div :class="{'tree-node':true,'tree-active':currentNodeId === data.id && node.isLeaf}">
27
- <div
28
- :class="['tree-content-panel' ]"
29
- @click="treeNodeClick(node, data)"
30
- >
31
- <div :style="{'padding-left': (node.level-1)* 16+20 + 'px'}">
32
- <div v-if="data.children&&data.children.length>0" class="tree-content-panel-span">
33
- <span>
34
- <!-- 图标 -->
35
- <epx-icon class="epx-menu-item__icon" :name="data.FONT_ICON || 'el-icon-monitor'"></epx-icon>
36
- <span :title="node.label">{{node.label}}</span>
37
- </span>
38
- <i :class="['iconfont','el-icon-arrow-down', node.expanded ? 'rotate' : 'rotate1']"></i>
39
- </div>
40
- <div v-else class="tree-content-panel-span">
41
- <span>
42
- <!-- 图标 -->
43
- <epx-icon class="epx-menu-item__icon" :name="data.FONT_ICON || 'el-icon-monitor'"></epx-icon>
44
- <span :title="node.label">{{node.label}}</span>
45
- </span>
46
- <i style="width: 8px;height: 16px;display: inline-block;"></i>
47
- </div>
48
- </div>
49
- </div>
50
- <el-dropdown trigger="click" placement="right-start">
51
- <span class="setting-btn" @click.stop><i class="el-icon-s-tools"></i></span>
52
- <template v-slot:dropdown><el-dropdown-menu>
53
- <el-dropdown-item class="app-config-item" @click="editAppMenu( data, '菜单-重命名', 'menu-rename')"><i class="el-icon-edit"></i>重命名</el-dropdown-item>
54
- <el-dropdown-item class="app-config-item" @click="editAppMenu(data, '菜单-设置', 'menu-setting')"><i class="el-icon-setting"></i>设置</el-dropdown-item>
55
- <el-popover
56
- popper-class="manage-menu-popover"
57
- placement="right-start"
58
- trigger="hover"
59
- >
60
- <template v-slot:reference><div class="delete-dropdown-item">
61
- <div class="app-config-delete-item"><i class="el-icon-delete"></i>删除</div>
62
- <i class="el-icon-arrow-right"></i>
63
- </div></template>
64
- <div>
65
- <div class="app-config-item" @click="editAppMenu(data,'delete-menu','0')">删除菜单</div>
66
- <div class="app-config-item" @click="editAppMenu(data,'delete-menu','1')">删除菜单及页面</div>
67
- </div>
68
- </el-popover>
69
- <el-dropdown-item class="app-config-item" @click="editAppMenu(data, '菜单授权', 'menu-sq')">
70
- <i class="el-icon-finished"></i>菜单授权
71
- </el-dropdown-item>
72
- <el-popover
73
- popper-class="manage-menu-popover"
74
- placement="right-start"
75
- trigger="hover">
76
- <div class="add-menu-container">
77
- <div>选择新增菜单类型</div>
78
- <div class="add-type">
79
- <div v-for="item in addMenuTypeList" class="add-menu-type__item" :key="item.value" @click="addAppMenu(data,item, '新增同级菜单', 'add-tj')">
80
- <div>
81
- <img :src="item.preview" />
82
- </div>
83
- <p class="add-menu-type-label">{{item.label}}</p>
84
- </div>
85
- </div>
86
- </div>
87
- <template v-slot:reference><div class="delete-dropdown-item">
88
- <div class="app-config-delete-item"><i class="el-icon-plus"></i>新增同级菜单</div>
89
- <i class="el-icon-arrow-right"></i>
90
- </div></template>
91
- </el-popover>
92
- <el-popover
93
- popper-class="manage-menu-popover"
94
- placement="right-start"
95
- trigger="hover">
96
- <div class="add-menu-container">
97
- <div>选择新增菜单类型</div>
98
- <div class="add-type">
99
- <div v-for="item in addMenuTypeList" class="add-menu-type__item" :key="item.value" @click="addAppMenu(data,item, '新增下级菜单', 'add-xj')">
100
- <div>
101
- <img :src="item.preview" />
102
- </div>
103
- <p class="add-menu-type-label">{{item.label}}</p>
104
- </div>
105
- </div>
106
- </div>
107
- <template v-slot:reference><div class="delete-dropdown-item">
108
- <div class="app-config-delete-item"><i class="el-icon-bottom"></i>新增下级菜单</div>
109
- <i class="el-icon-arrow-right"></i>
110
- </div></template>
111
- <!-- <el-dropdown-item slot="reference" class="app-config-item"><i class="el-icon-bottom"></i>新增下级菜单</el-dropdown-item> -->
112
- </el-popover>
113
- </el-dropdown-menu></template>
114
- </el-dropdown>
115
- </div></template>
116
- </el-tree>
117
- <!-- <el-menu
118
- :default-active="currentModuleId"
119
- :default-openeds="defaultOpenMenuId"
120
- class="el-menu-vertical"
121
- :unique-opened="true"
122
- @open="openMenuFn"
123
- >
124
- <draggable
125
- class="draggable-menu-con"
126
- v-model="serviceMenu"
127
- group="description"
128
- ghostClass="epx-page-designer-widget-tree__drag-ghost"
129
- :animation="300"
130
- @change="changeLog"
131
- >
132
- <template v-for="item in serviceMenu" :key="item.ID">
133
- <epx-manage-menu-item v-if="item.HIDDEN_MENU!=='1'" :module="item" :select="handleSelect" :menuFontSize="menuFontSize"></epx-manage-menu-item>
134
- </template>
135
- </draggable>
136
- </el-menu> -->
137
- <div class="add-menu">
138
- <el-popover
139
- ref="popover"
140
- popper-class="manage-menu-popover"
141
- placement="right"
142
- trigger="click"
143
- >
144
- <div class="add-menu-container">
145
- <div>选择新增菜单类型</div>
146
- <div class="add-type">
147
- <div v-for="item in addMenuTypeList" class="add-menu-type__item" :key="item.value" @click="chooseMenuType(item)">
148
- <div>
149
- <img :src="item.preview" />
150
- </div>
151
- <p class="add-menu-type-label">{{item.label}}</p>
152
- </div>
153
- </div>
154
- </div>
155
- <template v-slot:reference><el-button style="paddingLeft:20px" type="primary" link>
156
- <i class="el-icon-plus"></i>
157
- 新增菜单
158
- </el-button></template>
159
- </el-popover>
160
- </div>
161
- </template>
162
- <div v-else class="no-menu">
163
- <i class="epx-icon-color-kong"></i>
164
- <div>暂无菜单</div>
165
- <div class="no-menu-add-menu">
166
- <el-popover
167
- ref="popover"
168
- popper-class="manage-menu-popover"
169
- placement="right"
170
- :offset="10"
171
- trigger="click"
172
- >
173
- <div class="add-menu-container">
174
- <div>选择新增菜单类型</div>
175
- <div class="add-type">
176
- <div v-for="item in addMenuTypeList" class="add-menu-type__item" :key="item.value" @click="chooseMenuType(item)">
177
- <div>
178
- <img :src="item.preview" />
179
- </div>
180
- <p class="add-menu-type-label">{{item.label}}</p>
181
- </div>
182
- </div>
183
- </div>
184
- <!-- 无菜单时新增 -->
185
- <!-- <el-button v-popover:popover style="width:100%" type="primary" @click="addMenuMenual"> -->
186
- <template v-slot:reference><el-button style="width:100%" type="primary">
187
- <i class="el-icon-plus"></i>
188
- 新增菜单
189
- </el-button></template>
190
- </el-popover>
191
- </div>
192
- </div>
193
- <slot></slot>
194
- </el-col>
195
- </el-row>
196
- <slot name="footer"></slot>
197
- <!-- <el-popover
198
- ref="popover"
199
- popper-class="manage-menu-popover"
200
- placement="right"
201
- :offset="10"
202
- trigger="manual"
203
- v-model:visible="popoverManualVisible"
204
- >
205
- <div class="add-menu-container">
206
- <div>选择新增菜单类型</div>
207
- <div class="add-type">
208
- <div v-for="item in addMenuTypeList" class="add-menu-type__item" :key="item.value" @click="chooseMenuType(item)">
209
- <div>
210
- <img :src="item.preview" />
211
- </div>
212
- <p class="add-menu-type-label">{{item.label}}</p>
213
- </div>
214
- </div>
215
- </div>
216
- </el-popover> -->
217
- <el-dialog
218
- :title="dialogTitle"
219
- v-model="showEditAppDialog"
220
- class="popup-dialog"
221
- :append-to-body="true"
222
- :width="this.dialogWidth + 'px'"
223
- @close="this.showEditAppDialog = false"
224
- >
225
- <div class="epx-add-form__check-dialog">
226
- <div>
227
- <div v-if="editType === 'menu-rename'">
228
- <div style="width:300px;margin:auto;marginBottom:20px">
229
- <el-input v-model="inputAppName" clearable placeholder="请输入要修改的菜单名称"></el-input>
230
- </div>
231
- </div>
232
- <div v-else-if="editType === 'menu-sq'" class="role-system__content">
233
- <el-checkbox-group v-model="checkRoleList">
234
- <el-checkbox v-for="item in appAllRoleList" :key="item.ID" :label="item.ID" :value="item.ID">{{item.NAME}}
235
- <el-tag size="small" v-if="item.TYPE==='client'">通用</el-tag>
236
- </el-checkbox>
237
- </el-checkbox-group>
238
- </div>
239
- </div>
240
- <div class="epx-add-form__sign-buttongroup">
241
- <el-button size="middle" type="primary" @click="editAppDialog">{{$t('determine')}}</el-button>
242
- <el-button size="middle" @click="showEditAppDialog = false">{{$t('return')}}</el-button>
243
- </div>
244
- </div>
245
- </el-dialog>
246
- </div>
247
- </template>
248
-
249
- <script>
250
- import Menu from '@epxing/components/src/menu/Menu.vue'
251
- // import draggable from '@epxing/core/src/components/draggable'
252
- export default {
253
- name: 'epx-manager-menu',
254
- extends: Menu,
255
- props: {
256
- terminal: String
257
- },
258
- computed: {
259
- $isMobile () {
260
- return this.terminal === 'mobile'
261
- },
262
- navType () {
263
- const appConfig = this.appConfig.APP_CONFIG ? JSON.parse(this.appConfig.APP_CONFIG) : {}
264
- return this.terminal === 'mobile' || appConfig.navType === '3' ? '0' : appConfig.navType
265
- }
266
- },
267
- data () {
268
- return {
269
- addMenuTypeList: [
270
- { label: '列表查询页面', value: 'list', preview: require('@/assets/images/addmenu/list.png') },
271
- { label: '数据看板页面', value: 'data', preview: require('@/assets/images/addmenu/data.png') },
272
- { label: '空白页面', value: 'blank', preview: require('@/assets/images/addmenu/basepage.png') },
273
- { label: '自选模版页面', value: 'choose', preview: require('@/assets/images/addmenu/zxmb.png') },
274
- { label: '关联已有页面', value: 'select', preview: require('@/assets/images/addmenu/link.png') },
275
- { label: '菜单目录', value: 'dir', preview: require('@/assets/images/addmenu/menu.png') }
276
- ],
277
- showEditAppDialog: false,
278
- dialogTitle: '',
279
- editType: '1',
280
- inputAppName: '',
281
- // navOptions: [
282
- // { label: '经典(默认)', value: '1', preview: require('@/assets/images/nav/1.png') },
283
- // { label: '左侧', value: '0', preview: require('@/assets/images/nav/0.png') },
284
- // { label: '顶部', value: '2', preview: require('@/assets/images/nav/2.png') }
285
- // ],
286
- dialogWidth: '610',
287
- navAppType: '',
288
- editMenuInfo: {},
289
- serviceMenu: [],
290
- addMenuData: {},
291
- dragOptions () {
292
- return {
293
- animation: 200,
294
- group: 'description',
295
- // disabled: false,
296
- ghostClass: 'ghost'
297
- }
298
- },
299
- props: {
300
- label: 'title',
301
- children: 'children'
302
- },
303
- currentNodeId: '',
304
- // expendIdArr: [],
305
- appAllRoleList: [],
306
- checkRoleList: [],
307
- popoverManualVisible: false
308
- }
309
- },
310
- // provide () {
311
- // return {
312
- // $editAppMenu: this.editAppMenu,
313
- // $addAppMenu: this.addAppMenu,
314
- // $reloadMenu: this.reloadMenu
315
- // }
316
- // },
317
- watch: {
318
- modules: {
319
- handler (v) {
320
- this.serviceMenu = [...v]
321
- // if (v.length > 0) {
322
- // this.expendIdArr = [v[0].id]
323
- // }
324
- this.judgeClickMenu()
325
- },
326
- immediate: true
327
- }
328
- },
329
- methods: {
330
- // addMenuMenual (e) {
331
- // if (this.popoverManualVisible) {
332
- // this.popoverManualVisible = false
333
- // return
334
- // }
335
- // this.popoverManualVisible = false
336
- // this.$refs.popover.doDestroy(true)
337
- // this.$nextTick(() => {
338
- // this.$refs.popover.referenceElm = e.target
339
- // this.popoverManualVisible = true
340
- // })
341
- // },
342
- getClientSystemAppRole () {
343
- const scopeParams = [
344
- {
345
- field: 'SYSTEM',
346
- mode: 'equal',
347
- values: this.SYSTEM,
348
- link: 'or'
349
- },
350
- {
351
- field: 'TYPE',
352
- mode: 'equal',
353
- values: 'client'
354
- }
355
- ]
356
- const params = {
357
- entityId: 'FM_ROLE',
358
- scopeParams: JSON.stringify(scopeParams),
359
- order_field: 'TYPE',
360
- order_mode: 'desc'
361
- }
362
- this.$http.list(params)
363
- .then(data => {
364
- this.appAllRoleList = data.entitys
365
- })
366
- },
367
- treeNodeClick (node, data) {
368
- if (node.isLeaf) {
369
- this.currentNodeId = data.id
370
- this.handleSelect(data)
371
- }
372
- },
373
- getTreeModuleNode (modules, parentId) {
374
- let node = null
375
- for (let i = 0; i < modules.length; i++) {
376
- const module = modules[i]
377
- if ((module.id || module.ID) === parentId) {
378
- node = module
379
- return node
380
- } else if (module.children && module.children.length > 0) {
381
- node = this.getTreeModuleNode(module.children, parentId)
382
- }
383
- if (node) {
384
- return node
385
- }
386
- }
387
- },
388
- nodeDrop (node, current, type, event) {
389
- // 获取当前节点结束后的父节点
390
- let parentId = ''
391
- let modules = []
392
- if (type === 'after' || type === 'before') {
393
- parentId = current.data.parent || 'root'
394
- } else if (type === 'inner') {
395
- parentId = current.data.id || current.data.ID
396
- }
397
- const parentNode = this.getTreeModuleNode(this.serviceMenu, parentId) || { children: [...this.serviceMenu] }
398
- modules = [...parentNode.children]
399
- // 获取其父节点的所有子节点
400
- const str = modules.reduce((str, item, index) => (str += (item.id || item.ID) + ':' + index + ','), '')
401
- // const str1 = modules.reduce((str, item, index) => (str += (item.title || item.ID) + ':' + index + ','), '')
402
- // console.log(str1)
403
- // 递归获取id为parentId的节点
404
- this.$http.$post({
405
- action: 'moveTree',
406
- entityId: 'FM_MODULE',
407
- id: node.data.id || node.data.ID,
408
- selfAttriName: 'ID',
409
- newParentId: parentId,
410
- orderString: str,
411
- orderAtrriName: 'ORDER_NUM'
412
- })
413
- .then(() => {
414
-
415
- })
416
- .catch(err => {
417
- this.$message.error(err.message || '拖拽排序失败')
418
- this.$reloadMenu()
419
- })
420
- },
421
- // changeLog (e) {
422
- // console.log(e)
423
- // if (e.added || e.moved) {
424
- // let node = {}
425
- // // let isAdd = false
426
- // if (e.added) {
427
- // // isAdd = true
428
- // node = e.added.element
429
- // } else {
430
- // node = e.moved.element
431
- // }
432
-
433
- // const parentId = this.$tab.moduleId
434
- // // 获取其父节点的所有子节点orderString
435
- // const str = this.serviceMenu.reduce((str, item, index) => (str += item.id + ':' + index + ','), '')
436
- // // // this.drag = false
437
- // this.$http.$post({
438
- // action: 'moveTree',
439
- // entityId: 'FM_MODULE',
440
- // orderString: str,
441
- // newParentId: parentId,
442
- // id: node.id,
443
- // selfAttriName: 'ID',
444
- // orderAtrriName: 'ORDER_NUM'
445
- // })
446
- // .then(() => {
447
-
448
- // })
449
- // .catch(err => {
450
- // this.$message.error(err.message || '拖拽排序失败')
451
- // this.$reloadMenu()
452
- // })
453
- // }
454
- // },
455
- judgeClickMenu () {
456
- // 一级导航菜单信息后点击查看该新增菜单信息
457
- if (this.editType === 'add-tj' || this.editType === 'add-xj') {
458
- const nav = this.findClickMenuItem(this.modules, this.addMenuData.ID)
459
- if (nav) {
460
- this.editType = ''
461
- this.handleSelect(nav)
462
- }
463
- }
464
- },
465
- findClickMenuItem (arr, id) {
466
- for (const node of arr) {
467
- if (node.ID === id) {
468
- return node
469
- }
470
- if (node.children.length > 0) {
471
- const foundNode = this.findClickMenuItem(node.children, id)
472
- if (foundNode) {
473
- return foundNode
474
- }
475
- }
476
- }
477
- return null
478
- },
479
- removeEntity (select, type) {
480
- this.showPopover = null
481
- let selectItem = this.clickItem
482
- if (select && select.id) {
483
- selectItem = select
484
- }
485
- this.expandKeys = []
486
- if (!selectItem || !selectItem.id) {
487
- this.$message.error(this.$t('please select a record'))
488
- return
489
- }
490
- // const idArr = [selectItem.id]
491
- // this.getSubIds(idArr, selectItem.children)
492
- const params = {
493
- action: 'removeMulti',
494
- entityId: 'FM_MODULE',
495
- ids: selectItem.id
496
- // ids: idArr.join(',')
497
- }
498
- if (type === '1') {
499
- params.deletePag = '1'
500
- }
501
- this.$confirm(this.$t('Confirm the deletion') + '?')
502
- .then(() => {
503
- this.$http.$request(params)
504
- .then(data => {
505
- this.$message.success(this.$t('deleted successfully'))
506
- this.reloadMenu()
507
- // this.$emit('clearPage')
508
- this.backModule()
509
- })
510
- })
511
- },
512
- getSubIds (idArr = [], data) {
513
- data.forEach(item => {
514
- idArr.push(item.id)
515
- if (item.children) {
516
- this.getSubIds(idArr, item.children)
517
- }
518
- })
519
- },
520
- addAppMenu (nav, menuTypeItem, name, type) {
521
- // const { nav, menuTypeItem, name, type } = obj
522
- this.editMenuInfo = { ...nav }
523
- this.editType = type
524
- const defaultValue = {}
525
- // 这里的add-nav-menu为新增同级菜单
526
- defaultValue.UP_ID = type === 'add-tj' ? nav.parent : nav.id
527
- // 新增菜单
528
- const query = {
529
- flag: 'manage-client-system-app-add-menu',
530
- metaId: 'FM_MODULE',
531
- defaultValue,
532
- title: name,
533
- serviceId: this.appConfig.ID,
534
- moduleType: menuTypeItem.value,
1
+ <template>
2
+ <div class="epx-menu" :style="{ width: width + 'px'}">
3
+ <el-row class="epx-menu__row manage-menu-row">
4
+ <el-col>
5
+ <h5 :class="['epx-menu__header', {'is-active': isActive }]" @click="backModule" v-if="showNav">
6
+ <p class="epx-menu__name">
7
+ <i v-if="back" @click="$emit('back')" class="epx-menu__back el-icon-arrow-left"></i>
8
+ <i v-else class="el-icon-s-data"></i>
9
+ <span>{{moduleName}}</span>
10
+ </p>
11
+ <p class="epx-menu__subtitle" v-if="subTitle">({{subTitle}})</p>
12
+ </h5>
13
+ <template v-if="serviceMenu.length>0">
14
+ <el-tree
15
+ class="tree-wrap"
16
+ :data="serviceMenu"
17
+ node-key="id"
18
+ :props="props"
19
+ :default-expanded-keys="defaultOpenMenuId"
20
+ accordion
21
+ draggable
22
+ :indent="0"
23
+ icon="mycons"
24
+ @node-drop="nodeDrop"
25
+ >
26
+ <template v-slot="{ node, data }"><div :class="{'tree-node':true,'tree-active':currentNodeId === data.id && node.isLeaf}">
27
+ <div
28
+ :class="['tree-content-panel' ]"
29
+ @click="treeNodeClick(node, data)"
30
+ >
31
+ <div :style="{'padding-left': (node.level-1)* 16+20 + 'px'}">
32
+ <div v-if="data.children&&data.children.length>0" class="tree-content-panel-span">
33
+ <span>
34
+ <!-- 图标 -->
35
+ <epx-icon class="epx-menu-item__icon" :name="data.FONT_ICON || 'el-icon-monitor'"></epx-icon>
36
+ <span :title="node.label">{{node.label}}</span>
37
+ </span>
38
+ <i :class="['iconfont','el-icon-arrow-down', node.expanded ? 'rotate' : 'rotate1']"></i>
39
+ </div>
40
+ <div v-else class="tree-content-panel-span">
41
+ <span>
42
+ <!-- 图标 -->
43
+ <epx-icon class="epx-menu-item__icon" :name="data.FONT_ICON || 'el-icon-monitor'"></epx-icon>
44
+ <span :title="node.label">{{node.label}}</span>
45
+ </span>
46
+ <i style="width: 8px;height: 16px;display: inline-block;"></i>
47
+ </div>
48
+ </div>
49
+ </div>
50
+ <el-dropdown trigger="click" placement="right-start">
51
+ <span class="setting-btn" @click.stop><i class="el-icon-s-tools"></i></span>
52
+ <template v-slot:dropdown><el-dropdown-menu>
53
+ <el-dropdown-item class="app-config-item" @click="editAppMenu( data, '菜单-重命名', 'menu-rename')"><i class="el-icon-edit"></i>重命名</el-dropdown-item>
54
+ <el-dropdown-item class="app-config-item" @click="editAppMenu(data, '菜单-设置', 'menu-setting')"><i class="el-icon-setting"></i>设置</el-dropdown-item>
55
+ <el-popover
56
+ popper-class="manage-menu-popover"
57
+ placement="right-start"
58
+ trigger="hover"
59
+ >
60
+ <template v-slot:reference><div class="delete-dropdown-item">
61
+ <div class="app-config-delete-item"><i class="el-icon-delete"></i>删除</div>
62
+ <i class="el-icon-arrow-right"></i>
63
+ </div></template>
64
+ <div>
65
+ <div class="app-config-item" @click="editAppMenu(data,'delete-menu','0')">删除菜单</div>
66
+ <div class="app-config-item" @click="editAppMenu(data,'delete-menu','1')">删除菜单及页面</div>
67
+ </div>
68
+ </el-popover>
69
+ <el-dropdown-item class="app-config-item" @click="editAppMenu(data, '菜单授权', 'menu-sq')">
70
+ <i class="el-icon-finished"></i>菜单授权
71
+ </el-dropdown-item>
72
+ <el-popover
73
+ popper-class="manage-menu-popover"
74
+ placement="right-start"
75
+ trigger="hover">
76
+ <div class="add-menu-container">
77
+ <div>选择新增菜单类型</div>
78
+ <div class="add-type">
79
+ <div v-for="item in addMenuTypeList" class="add-menu-type__item" :key="item.value" @click="addAppMenu(data,item, '新增同级菜单', 'add-tj')">
80
+ <div>
81
+ <img :src="item.preview" />
82
+ </div>
83
+ <p class="add-menu-type-label">{{item.label}}</p>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ <template v-slot:reference><div class="delete-dropdown-item">
88
+ <div class="app-config-delete-item"><i class="el-icon-plus"></i>新增同级菜单</div>
89
+ <i class="el-icon-arrow-right"></i>
90
+ </div></template>
91
+ </el-popover>
92
+ <el-popover
93
+ popper-class="manage-menu-popover"
94
+ placement="right-start"
95
+ trigger="hover">
96
+ <div class="add-menu-container">
97
+ <div>选择新增菜单类型</div>
98
+ <div class="add-type">
99
+ <div v-for="item in addMenuTypeList" class="add-menu-type__item" :key="item.value" @click="addAppMenu(data,item, '新增下级菜单', 'add-xj')">
100
+ <div>
101
+ <img :src="item.preview" />
102
+ </div>
103
+ <p class="add-menu-type-label">{{item.label}}</p>
104
+ </div>
105
+ </div>
106
+ </div>
107
+ <template v-slot:reference><div class="delete-dropdown-item">
108
+ <div class="app-config-delete-item"><i class="el-icon-bottom"></i>新增下级菜单</div>
109
+ <i class="el-icon-arrow-right"></i>
110
+ </div></template>
111
+ <!-- <el-dropdown-item slot="reference" class="app-config-item"><i class="el-icon-bottom"></i>新增下级菜单</el-dropdown-item> -->
112
+ </el-popover>
113
+ </el-dropdown-menu></template>
114
+ </el-dropdown>
115
+ </div></template>
116
+ </el-tree>
117
+ <!-- <el-menu
118
+ :default-active="currentModuleId"
119
+ :default-openeds="defaultOpenMenuId"
120
+ class="el-menu-vertical"
121
+ :unique-opened="true"
122
+ @open="openMenuFn"
123
+ >
124
+ <draggable
125
+ class="draggable-menu-con"
126
+ v-model="serviceMenu"
127
+ group="description"
128
+ ghostClass="epx-page-designer-widget-tree__drag-ghost"
129
+ :animation="300"
130
+ @change="changeLog"
131
+ >
132
+ <template v-for="item in serviceMenu" :key="item.ID">
133
+ <epx-manage-menu-item v-if="item.HIDDEN_MENU!=='1'" :module="item" :select="handleSelect" :menuFontSize="menuFontSize"></epx-manage-menu-item>
134
+ </template>
135
+ </draggable>
136
+ </el-menu> -->
137
+ <div class="add-menu">
138
+ <el-popover
139
+ ref="popover"
140
+ popper-class="manage-menu-popover"
141
+ placement="right"
142
+ trigger="click"
143
+ >
144
+ <div class="add-menu-container">
145
+ <div>选择新增菜单类型</div>
146
+ <div class="add-type">
147
+ <div v-for="item in addMenuTypeList" class="add-menu-type__item" :key="item.value" @click="chooseMenuType(item)">
148
+ <div>
149
+ <img :src="item.preview" />
150
+ </div>
151
+ <p class="add-menu-type-label">{{item.label}}</p>
152
+ </div>
153
+ </div>
154
+ </div>
155
+ <template v-slot:reference><el-button style="paddingLeft:20px" type="primary" link>
156
+ <i class="el-icon-plus"></i>
157
+ 新增菜单
158
+ </el-button></template>
159
+ </el-popover>
160
+ </div>
161
+ </template>
162
+ <div v-else class="no-menu">
163
+ <i class="epx-icon-color-kong"></i>
164
+ <div>暂无菜单</div>
165
+ <div class="no-menu-add-menu">
166
+ <el-popover
167
+ ref="popover"
168
+ popper-class="manage-menu-popover"
169
+ placement="right"
170
+ :offset="10"
171
+ trigger="click"
172
+ >
173
+ <div class="add-menu-container">
174
+ <div>选择新增菜单类型</div>
175
+ <div class="add-type">
176
+ <div v-for="item in addMenuTypeList" class="add-menu-type__item" :key="item.value" @click="chooseMenuType(item)">
177
+ <div>
178
+ <img :src="item.preview" />
179
+ </div>
180
+ <p class="add-menu-type-label">{{item.label}}</p>
181
+ </div>
182
+ </div>
183
+ </div>
184
+ <!-- 无菜单时新增 -->
185
+ <!-- <el-button v-popover:popover style="width:100%" type="primary" @click="addMenuMenual"> -->
186
+ <template v-slot:reference><el-button style="width:100%" type="primary">
187
+ <i class="el-icon-plus"></i>
188
+ 新增菜单
189
+ </el-button></template>
190
+ </el-popover>
191
+ </div>
192
+ </div>
193
+ <slot></slot>
194
+ </el-col>
195
+ </el-row>
196
+ <slot name="footer"></slot>
197
+ <!-- <el-popover
198
+ ref="popover"
199
+ popper-class="manage-menu-popover"
200
+ placement="right"
201
+ :offset="10"
202
+ trigger="manual"
203
+ v-model:visible="popoverManualVisible"
204
+ >
205
+ <div class="add-menu-container">
206
+ <div>选择新增菜单类型</div>
207
+ <div class="add-type">
208
+ <div v-for="item in addMenuTypeList" class="add-menu-type__item" :key="item.value" @click="chooseMenuType(item)">
209
+ <div>
210
+ <img :src="item.preview" />
211
+ </div>
212
+ <p class="add-menu-type-label">{{item.label}}</p>
213
+ </div>
214
+ </div>
215
+ </div>
216
+ </el-popover> -->
217
+ <el-dialog
218
+ :title="dialogTitle"
219
+ v-model="showEditAppDialog"
220
+ class="popup-dialog"
221
+ :append-to-body="true"
222
+ :width="this.dialogWidth + 'px'"
223
+ @close="this.showEditAppDialog = false"
224
+ >
225
+ <div class="epx-add-form__check-dialog">
226
+ <div>
227
+ <div v-if="editType === 'menu-rename'">
228
+ <div style="width:300px;margin:auto;marginBottom:20px">
229
+ <el-input v-model="inputAppName" clearable placeholder="请输入要修改的菜单名称"></el-input>
230
+ </div>
231
+ </div>
232
+ <div v-else-if="editType === 'menu-sq'" class="role-system__content">
233
+ <el-checkbox-group v-model="checkRoleList">
234
+ <el-checkbox v-for="item in appAllRoleList" :key="item.ID" :label="item.ID" :value="item.ID">{{item.NAME}}
235
+ <el-tag size="small" v-if="item.TYPE==='client'">通用</el-tag>
236
+ </el-checkbox>
237
+ </el-checkbox-group>
238
+ </div>
239
+ </div>
240
+ <div class="epx-add-form__sign-buttongroup">
241
+ <el-button size="middle" type="primary" @click="editAppDialog">{{$t('determine')}}</el-button>
242
+ <el-button size="middle" @click="showEditAppDialog = false">{{$t('return')}}</el-button>
243
+ </div>
244
+ </div>
245
+ </el-dialog>
246
+ </div>
247
+ </template>
248
+
249
+ <script>
250
+ import Menu from '@epxing/components/src/menu/Menu.vue'
251
+ // import draggable from '@epxing/core/src/components/draggable'
252
+ export default {
253
+ name: 'epx-manager-menu',
254
+ extends: Menu,
255
+ props: {
256
+ terminal: String
257
+ },
258
+ computed: {
259
+ $isMobile () {
260
+ return this.terminal === 'mobile'
261
+ },
262
+ navType () {
263
+ const appConfig = this.appConfig.APP_CONFIG ? JSON.parse(this.appConfig.APP_CONFIG) : {}
264
+ return this.terminal === 'mobile' || appConfig.navType === '3' ? '0' : appConfig.navType
265
+ }
266
+ },
267
+ data () {
268
+ return {
269
+ addMenuTypeList: [
270
+ { label: '列表查询页面', value: 'list', preview: require('@/assets/images/addmenu/list.png') },
271
+ { label: '数据看板页面', value: 'data', preview: require('@/assets/images/addmenu/data.png') },
272
+ { label: '空白页面', value: 'blank', preview: require('@/assets/images/addmenu/basepage.png') },
273
+ { label: '自选模版页面', value: 'choose', preview: require('@/assets/images/addmenu/zxmb.png') },
274
+ { label: '关联已有页面', value: 'select', preview: require('@/assets/images/addmenu/link.png') },
275
+ { label: '菜单目录', value: 'dir', preview: require('@/assets/images/addmenu/menu.png') }
276
+ ],
277
+ showEditAppDialog: false,
278
+ dialogTitle: '',
279
+ editType: '1',
280
+ inputAppName: '',
281
+ // navOptions: [
282
+ // { label: '经典(默认)', value: '1', preview: require('@/assets/images/nav/1.png') },
283
+ // { label: '左侧', value: '0', preview: require('@/assets/images/nav/0.png') },
284
+ // { label: '顶部', value: '2', preview: require('@/assets/images/nav/2.png') }
285
+ // ],
286
+ dialogWidth: '610',
287
+ navAppType: '',
288
+ editMenuInfo: {},
289
+ serviceMenu: [],
290
+ addMenuData: {},
291
+ dragOptions () {
292
+ return {
293
+ animation: 200,
294
+ group: 'description',
295
+ // disabled: false,
296
+ ghostClass: 'ghost'
297
+ }
298
+ },
299
+ props: {
300
+ label: 'title',
301
+ children: 'children'
302
+ },
303
+ currentNodeId: '',
304
+ // expendIdArr: [],
305
+ appAllRoleList: [],
306
+ checkRoleList: [],
307
+ popoverManualVisible: false
308
+ }
309
+ },
310
+ // provide () {
311
+ // return {
312
+ // $editAppMenu: this.editAppMenu,
313
+ // $addAppMenu: this.addAppMenu,
314
+ // $reloadMenu: this.reloadMenu
315
+ // }
316
+ // },
317
+ watch: {
318
+ modules: {
319
+ handler (v) {
320
+ this.serviceMenu = [...v]
321
+ // if (v.length > 0) {
322
+ // this.expendIdArr = [v[0].id]
323
+ // }
324
+ this.judgeClickMenu()
325
+ },
326
+ immediate: true
327
+ }
328
+ },
329
+ methods: {
330
+ // addMenuMenual (e) {
331
+ // if (this.popoverManualVisible) {
332
+ // this.popoverManualVisible = false
333
+ // return
334
+ // }
335
+ // this.popoverManualVisible = false
336
+ // this.$refs.popover.doDestroy(true)
337
+ // this.$nextTick(() => {
338
+ // this.$refs.popover.referenceElm = e.target
339
+ // this.popoverManualVisible = true
340
+ // })
341
+ // },
342
+ getClientSystemAppRole () {
343
+ const scopeParams = [
344
+ {
345
+ field: 'SYSTEM',
346
+ mode: 'equal',
347
+ values: this.SYSTEM,
348
+ link: 'or'
349
+ },
350
+ {
351
+ field: 'TYPE',
352
+ mode: 'equal',
353
+ values: 'client'
354
+ }
355
+ ]
356
+ const params = {
357
+ entityId: 'FM_ROLE',
358
+ scopeParams: JSON.stringify(scopeParams),
359
+ order_field: 'TYPE',
360
+ order_mode: 'desc'
361
+ }
362
+ this.$http.list(params)
363
+ .then(data => {
364
+ this.appAllRoleList = data.entitys
365
+ })
366
+ },
367
+ treeNodeClick (node, data) {
368
+ if (node.isLeaf) {
369
+ this.currentNodeId = data.id
370
+ this.handleSelect(data)
371
+ }
372
+ },
373
+ getTreeModuleNode (modules, parentId) {
374
+ let node = null
375
+ for (let i = 0; i < modules.length; i++) {
376
+ const module = modules[i]
377
+ if ((module.id || module.ID) === parentId) {
378
+ node = module
379
+ return node
380
+ } else if (module.children && module.children.length > 0) {
381
+ node = this.getTreeModuleNode(module.children, parentId)
382
+ }
383
+ if (node) {
384
+ return node
385
+ }
386
+ }
387
+ },
388
+ nodeDrop (node, current, type, event) {
389
+ // 获取当前节点结束后的父节点
390
+ let parentId = ''
391
+ let modules = []
392
+ if (type === 'after' || type === 'before') {
393
+ parentId = current.data.parent || 'root'
394
+ } else if (type === 'inner') {
395
+ parentId = current.data.id || current.data.ID
396
+ }
397
+ const parentNode = this.getTreeModuleNode(this.serviceMenu, parentId) || { children: [...this.serviceMenu] }
398
+ modules = [...parentNode.children]
399
+ // 获取其父节点的所有子节点
400
+ const str = modules.reduce((str, item, index) => (str += (item.id || item.ID) + ':' + index + ','), '')
401
+ // const str1 = modules.reduce((str, item, index) => (str += (item.title || item.ID) + ':' + index + ','), '')
402
+ // console.log(str1)
403
+ // 递归获取id为parentId的节点
404
+ this.$http.$post({
405
+ action: 'moveTree',
406
+ entityId: 'FM_MODULE',
407
+ id: node.data.id || node.data.ID,
408
+ selfAttriName: 'ID',
409
+ newParentId: parentId,
410
+ orderString: str,
411
+ orderAtrriName: 'ORDER_NUM'
412
+ })
413
+ .then(() => {
414
+
415
+ })
416
+ .catch(err => {
417
+ this.$message.error(err.message || '拖拽排序失败')
418
+ this.$reloadMenu()
419
+ })
420
+ },
421
+ // changeLog (e) {
422
+ // console.log(e)
423
+ // if (e.added || e.moved) {
424
+ // let node = {}
425
+ // // let isAdd = false
426
+ // if (e.added) {
427
+ // // isAdd = true
428
+ // node = e.added.element
429
+ // } else {
430
+ // node = e.moved.element
431
+ // }
432
+
433
+ // const parentId = this.$tab.moduleId
434
+ // // 获取其父节点的所有子节点orderString
435
+ // const str = this.serviceMenu.reduce((str, item, index) => (str += item.id + ':' + index + ','), '')
436
+ // // // this.drag = false
437
+ // this.$http.$post({
438
+ // action: 'moveTree',
439
+ // entityId: 'FM_MODULE',
440
+ // orderString: str,
441
+ // newParentId: parentId,
442
+ // id: node.id,
443
+ // selfAttriName: 'ID',
444
+ // orderAtrriName: 'ORDER_NUM'
445
+ // })
446
+ // .then(() => {
447
+
448
+ // })
449
+ // .catch(err => {
450
+ // this.$message.error(err.message || '拖拽排序失败')
451
+ // this.$reloadMenu()
452
+ // })
453
+ // }
454
+ // },
455
+ judgeClickMenu () {
456
+ // 一级导航菜单信息后点击查看该新增菜单信息
457
+ if (this.editType === 'add-tj' || this.editType === 'add-xj') {
458
+ const nav = this.findClickMenuItem(this.modules, this.addMenuData.ID)
459
+ if (nav) {
460
+ this.editType = ''
461
+ this.handleSelect(nav)
462
+ }
463
+ }
464
+ },
465
+ findClickMenuItem (arr, id) {
466
+ for (const node of arr) {
467
+ if (node.ID === id) {
468
+ return node
469
+ }
470
+ if (node.children.length > 0) {
471
+ const foundNode = this.findClickMenuItem(node.children, id)
472
+ if (foundNode) {
473
+ return foundNode
474
+ }
475
+ }
476
+ }
477
+ return null
478
+ },
479
+ removeEntity (select, type) {
480
+ this.showPopover = null
481
+ let selectItem = this.clickItem
482
+ if (select && select.id) {
483
+ selectItem = select
484
+ }
485
+ this.expandKeys = []
486
+ if (!selectItem || !selectItem.id) {
487
+ this.$message.error(this.$t('please select a record'))
488
+ return
489
+ }
490
+ // const idArr = [selectItem.id]
491
+ // this.getSubIds(idArr, selectItem.children)
492
+ const params = {
493
+ action: 'removeMulti',
494
+ entityId: 'FM_MODULE',
495
+ ids: selectItem.id
496
+ // ids: idArr.join(',')
497
+ }
498
+ if (type === '1') {
499
+ params.deletePag = '1'
500
+ }
501
+ this.$confirm(this.$t('Confirm the deletion') + '?')
502
+ .then(() => {
503
+ this.$http.$request(params)
504
+ .then(data => {
505
+ this.$message.success(this.$t('deleted successfully'))
506
+ this.reloadMenu()
507
+ // this.$emit('clearPage')
508
+ this.backModule()
509
+ })
510
+ })
511
+ },
512
+ getSubIds (idArr = [], data) {
513
+ data.forEach(item => {
514
+ idArr.push(item.id)
515
+ if (item.children) {
516
+ this.getSubIds(idArr, item.children)
517
+ }
518
+ })
519
+ },
520
+ addAppMenu (nav, menuTypeItem, name, type) {
521
+ // const { nav, menuTypeItem, name, type } = obj
522
+ this.editMenuInfo = { ...nav }
523
+ this.editType = type
524
+ const defaultValue = {}
525
+ // 这里的add-nav-menu为新增同级菜单
526
+ defaultValue.UP_ID = type === 'add-tj' ? nav.parent : nav.id
527
+ // 新增菜单
528
+ const query = {
529
+ flag: 'manage-client-system-app-add-menu',
530
+ metaId: 'FM_MODULE',
531
+ defaultValue,
532
+ title: name,
533
+ serviceId: this.appConfig.ID,
534
+ moduleType: menuTypeItem.value,
535
535
  ...(menuTypeItem.value === 'data' ? { component: 'dashboard-create', flag: undefined, title: '创建数据看板', dialogWidth: '560px' } : {}),
536
- openType: '2',
537
- callback: this.reloadMenu
538
- }
539
- this.$createPage(query)
540
- },
541
- editAppMenu (nav, name, type, width) {
542
- // console.log(obj)
543
- // const { nav, name, type, width } = obj
544
- this.editMenuInfo = { ...nav }
545
- this.dialogTitle = name
546
- this.editType = type
547
- if (name === 'delete-menu') {
548
- this.removeEntity(nav, type)
549
- } else {
550
- if (type === 'menu-rename') {
551
- this.inputAppName = nav.text
552
- } else if (type === 'add-tj' || type === 'add-xj') {
553
- const defaultValue = {}
554
- defaultValue.UP_ID = type === 'add-tj' ? nav.parent : nav.id
555
- const query = {
556
- openType: '2',
557
- pageType: 'ADD',
558
- flag: 'v_service_menu_add_mobile',
559
- metaId: 'FM_MODULE',
560
- defaultValue: defaultValue,
561
- title: name,
562
- SYSTEM: this.SYSTEM,
563
- CLIENT: this.CLIENT,
564
- serviceId: this.appConfig.ID,
565
- callback: this.reloadMenu
566
- }
567
- this.$createPage(query)
568
- return
569
- } else if (type === 'menu-setting') {
570
- const query = {
571
- openType: '2',
572
- pageType: 'DETAIL',
573
- flag: 'v_service_menu_detail_mobile',
574
- metaId: 'FM_MODULE',
575
- title: name,
576
- id: nav.id,
577
- callback: this.reloadMenu
578
- }
579
- this.$createPage(query)
580
- return
581
- } else if (type === 'menu-sq') {
582
- // const query = {
583
- // openType: '2',
584
- // pageType: 'ADD',
585
- // flag: 'manage-client-system-app-menu-add-role',
586
- // metaId: 'FM_ROLE_MODULE',
587
- // title: name,
588
- // parentId: nav.id
589
- // }
590
- // this.$createPage(query)
591
- this.checkRoleList = []
592
- this.showEditAppDialog = true
593
- this.getSqList()
594
- return
595
- }
596
- this.dialogWidth = width || '610'
597
- this.showEditAppDialog = true
598
- }
599
- },
600
- getSqList () {
601
- this.$http.list({
602
- entityId: 'FM_ROLE_MODULE',
603
- 'scope.MODULE': this.editMenuInfo.id
604
- })
605
- .then(data => {
606
- this.checkRoleList = data.entitys.map(item => item.ROLE)
607
- })
608
- },
609
- getUserServiceMenu () {
610
- let { roleId, role } = this.$route.params
611
- if (!roleId) {
612
- const { roles = {} } = this.user
613
- const currentRole = Object.entries(roles).find(([key, item]) => item.CODE === role) || []
614
- roleId = currentRole[0]
615
- }
616
- const { ID } = this.appConfig
617
- this.$http.get({
618
- action: 'getUserServiceMenu',
619
- entityId: 'FM_MODULE',
620
- serviceId: ID,
621
- roleId,
622
- mode: this.$isMobile ? 'move' : 'pc'
623
- })
624
- .then(data => {
625
- const menu = data ? [...data] : []
626
- this.$store.commit('SET_MENUS', menu)
627
- this.serviceMenu = menu
628
- this.$emit('change-menu', menu)
629
- })
630
- },
631
- editAppDialog () {
632
- if (this.editType === 'menu-rename') {
633
- if (!this.inputAppName) {
634
- this.$message.error('名称不能为空')
635
- return
636
- }
637
- this.$http.update({
638
- entityId: 'FM_MODULE',
639
- 'bean.ID': this.editMenuInfo.id,
640
- 'bean.NAME': this.inputAppName
641
- })
642
- .then(data => {
643
- if (this.$tab.moduleId) {
644
- this.$emit('updateMenu', this.$tab.moduleId)
645
- } else {
646
- this.getUserServiceMenu()
647
- }
648
- this.$message.success('修改成功')
649
- this.showEditAppDialog = false
650
- })
651
- .catch(err => {
652
- this.$message.error(err.message || '修改失败')
653
- this.showEditAppDialog = false
654
- })
655
- } else if (this.editType === 'menu-sq') {
656
- // if (this.checkRoleList.length === 0) {
657
- // this.$message.error('请先选择授权角色')
658
- // return
659
- // }
660
- this.$http.$post({
661
- action: 'refreshModuleRoles',
662
- entityId: 'FM_ROLE_MODULE',
663
- moduleId: this.editMenuInfo.id,
664
- roleIds: this.checkRoleList.join(',')
665
- })
666
- .then(data => {
667
- this.$message.success('添加成功')
668
- this.showEditAppDialog = false
669
- })
670
- .catch(err => {
671
- this.$message.error(err.message || '操作失败')
672
- })
673
- }
674
- },
675
- reloadMenu (v) {
676
- // navType :0 左侧模式
677
- if (this.$tab.moduleId && this.navType !== '0') {
678
- if (this.editType === 'add-tj' || this.editType === 'add-xj') {
679
- this.addMenuData = v
680
- }
681
- this.$emit('updateMenu', this.$tab.moduleId)
682
- } else {
683
- // 导航模式为左侧模式时需更新所有菜单
684
- this.getUserServiceMenu()
685
- }
686
- },
687
- chooseMenuType (item) {
688
- const defaultValue = {}
689
- if (this.$tab.moduleId && this.navType !== '0') {
690
- defaultValue.UP_ID = this.$tab.moduleId
691
- }
692
- // 新增菜单
693
- const query = {
694
- flag: 'manage-client-system-app-add-menu',
695
- metaId: 'FM_MODULE',
696
- serviceId: this.appConfig.ID,
697
- moduleType: item.value,
536
+ openType: '2',
537
+ callback: this.reloadMenu
538
+ }
539
+ this.$createPage(query)
540
+ },
541
+ editAppMenu (nav, name, type, width) {
542
+ // console.log(obj)
543
+ // const { nav, name, type, width } = obj
544
+ this.editMenuInfo = { ...nav }
545
+ this.dialogTitle = name
546
+ this.editType = type
547
+ if (name === 'delete-menu') {
548
+ this.removeEntity(nav, type)
549
+ } else {
550
+ if (type === 'menu-rename') {
551
+ this.inputAppName = nav.text
552
+ } else if (type === 'add-tj' || type === 'add-xj') {
553
+ const defaultValue = {}
554
+ defaultValue.UP_ID = type === 'add-tj' ? nav.parent : nav.id
555
+ const query = {
556
+ openType: '2',
557
+ pageType: 'ADD',
558
+ flag: 'v_service_menu_add_mobile',
559
+ metaId: 'FM_MODULE',
560
+ defaultValue: defaultValue,
561
+ title: name,
562
+ SYSTEM: this.SYSTEM,
563
+ CLIENT: this.CLIENT,
564
+ serviceId: this.appConfig.ID,
565
+ callback: this.reloadMenu
566
+ }
567
+ this.$createPage(query)
568
+ return
569
+ } else if (type === 'menu-setting') {
570
+ const query = {
571
+ openType: '2',
572
+ pageType: 'DETAIL',
573
+ flag: 'v_service_menu_detail_mobile',
574
+ metaId: 'FM_MODULE',
575
+ title: name,
576
+ id: nav.id,
577
+ callback: this.reloadMenu
578
+ }
579
+ this.$createPage(query)
580
+ return
581
+ } else if (type === 'menu-sq') {
582
+ // const query = {
583
+ // openType: '2',
584
+ // pageType: 'ADD',
585
+ // flag: 'manage-client-system-app-menu-add-role',
586
+ // metaId: 'FM_ROLE_MODULE',
587
+ // title: name,
588
+ // parentId: nav.id
589
+ // }
590
+ // this.$createPage(query)
591
+ this.checkRoleList = []
592
+ this.showEditAppDialog = true
593
+ this.getSqList()
594
+ return
595
+ }
596
+ this.dialogWidth = width || '610'
597
+ this.showEditAppDialog = true
598
+ }
599
+ },
600
+ getSqList () {
601
+ this.$http.list({
602
+ entityId: 'FM_ROLE_MODULE',
603
+ 'scope.MODULE': this.editMenuInfo.id
604
+ })
605
+ .then(data => {
606
+ this.checkRoleList = data.entitys.map(item => item.ROLE)
607
+ })
608
+ },
609
+ getUserServiceMenu () {
610
+ let { roleId, role } = this.$route.params
611
+ if (!roleId) {
612
+ const { roles = {} } = this.user
613
+ const currentRole = Object.entries(roles).find(([key, item]) => item.CODE === role) || []
614
+ roleId = currentRole[0]
615
+ }
616
+ const { ID } = this.appConfig
617
+ this.$http.get({
618
+ action: 'getUserServiceMenu',
619
+ entityId: 'FM_MODULE',
620
+ serviceId: ID,
621
+ roleId,
622
+ mode: this.$isMobile ? 'move' : 'pc'
623
+ })
624
+ .then(data => {
625
+ const menu = data ? [...data] : []
626
+ this.$store.commit('SET_MENUS', menu)
627
+ this.serviceMenu = menu
628
+ this.$emit('change-menu', menu)
629
+ })
630
+ },
631
+ editAppDialog () {
632
+ if (this.editType === 'menu-rename') {
633
+ if (!this.inputAppName) {
634
+ this.$message.error('名称不能为空')
635
+ return
636
+ }
637
+ this.$http.update({
638
+ entityId: 'FM_MODULE',
639
+ 'bean.ID': this.editMenuInfo.id,
640
+ 'bean.NAME': this.inputAppName
641
+ })
642
+ .then(data => {
643
+ if (this.$tab.moduleId) {
644
+ this.$emit('updateMenu', this.$tab.moduleId)
645
+ } else {
646
+ this.getUserServiceMenu()
647
+ }
648
+ this.$message.success('修改成功')
649
+ this.showEditAppDialog = false
650
+ })
651
+ .catch(err => {
652
+ this.$message.error(err.message || '修改失败')
653
+ this.showEditAppDialog = false
654
+ })
655
+ } else if (this.editType === 'menu-sq') {
656
+ // if (this.checkRoleList.length === 0) {
657
+ // this.$message.error('请先选择授权角色')
658
+ // return
659
+ // }
660
+ this.$http.$post({
661
+ action: 'refreshModuleRoles',
662
+ entityId: 'FM_ROLE_MODULE',
663
+ moduleId: this.editMenuInfo.id,
664
+ roleIds: this.checkRoleList.join(',')
665
+ })
666
+ .then(data => {
667
+ this.$message.success('添加成功')
668
+ this.showEditAppDialog = false
669
+ })
670
+ .catch(err => {
671
+ this.$message.error(err.message || '操作失败')
672
+ })
673
+ }
674
+ },
675
+ reloadMenu (v) {
676
+ // navType :0 左侧模式
677
+ if (this.$tab.moduleId && this.navType !== '0') {
678
+ if (this.editType === 'add-tj' || this.editType === 'add-xj') {
679
+ this.addMenuData = v
680
+ }
681
+ this.$emit('updateMenu', this.$tab.moduleId)
682
+ } else {
683
+ // 导航模式为左侧模式时需更新所有菜单
684
+ this.getUserServiceMenu()
685
+ }
686
+ },
687
+ chooseMenuType (item) {
688
+ const defaultValue = {}
689
+ if (this.$tab.moduleId && this.navType !== '0') {
690
+ defaultValue.UP_ID = this.$tab.moduleId
691
+ }
692
+ // 新增菜单
693
+ const query = {
694
+ flag: 'manage-client-system-app-add-menu',
695
+ metaId: 'FM_MODULE',
696
+ serviceId: this.appConfig.ID,
697
+ moduleType: item.value,
698
698
  ...(item.value === 'data' ? { component: 'dashboard-create', flag: undefined, title: '创建数据看板', dialogWidth: '560px' } : {}),
699
- defaultValue: defaultValue,
700
- openType: '2',
701
- callback: this.reloadMenu
702
- }
703
- const popover = this.$refs.popover
704
- if (popover)popover.doClose()
705
- // this.popoverManualVisible = false
706
- this.$createPage(query)
707
- }
708
- },
709
- created () {
710
- this.getClientSystemAppRole()
711
- if (this.modules) {
712
- this.serviceMenu = [...this.modules]
713
- } else {
714
- this.getUserServiceMenu()
715
- }
716
- }
717
- }
718
- </script>
719
-
720
- <style lang="scss" scoped>
721
- .manage-menu-row{
722
- box-sizing: border-box;
723
- // height: 100%;
724
- // overflow: auto;
725
- // padding-bottom: 60px;
726
- }
727
- .add-menu{
728
- // position: absolute;
729
- // bottom: 0;
730
- // left: 0;
731
- box-sizing: border-box;
732
- width: 100%;
733
- height: 56px;
734
- // padding: 10px;
735
- background: var(--epx-bg-card);
736
- box-shadow: 0px -2px 4px 0px rgba(0,0,0,0.15);
737
- }
738
- .add-menu-container{
739
- box-sizing: border-box;
740
- padding: 4px 0 0 20px;
741
- width: 560px;
742
- height: 352px;
743
- font-size: var(--epx-font-size-l);
744
- color: var(--epx-text);
745
- font-weight: bold;
746
- }
747
- .add-type {
748
- display: flex;
749
- flex-wrap: wrap;
750
- margin-top: 12px;
751
- }
752
- .add-menu-type-label{
753
- font-size: var(--epx-font-size-base);
754
- color: #444444;
755
- margin-top: 10px;
756
- line-height: 19px;
757
- font-weight: 500;
758
- }
759
- .add-menu-type__item {
760
- width: 160px;
761
- margin-right: 20px;
762
- margin-bottom: 20px;
763
- text-align: center;
764
- cursor: pointer;
765
- img {
766
- width: 100%;
767
- }
768
- &:hover {
769
- .add-menu-type-label{
770
- @include font_color_primary;
771
- }
772
- }
773
- }
774
- .draggable-menu-con{
775
- padding-bottom: 20px;
776
- }
777
- .delete-dropdown-item{
778
- display: flex;
779
- align-items: center;
780
- justify-content: space-between;
781
- padding-right: 10px;
782
- cursor: pointer;
783
- background: var(--epx-bg-card);
784
- color: var(--epx-text);
785
- }
786
- .delete-dropdown-item:hover{
787
- @include font_color_primary;
788
- @include bg_color_primary(0.1);
789
- }
790
- .app-config-delete-item{
791
- box-sizing: border-box;
792
- height: 36px;
793
- cursor: pointer;
794
- line-height: 36px;
795
- padding: 0 40px 0 20px;
796
- i{
797
- margin-right: 10px;
798
- }
799
- }
800
- .app-config-item{
801
- box-sizing: border-box;
802
- height: 36px;
803
- background: var(--epx-bg-card);
804
- cursor: pointer;
805
- line-height: 36px;
806
- padding: 0 40px 0 20px;
807
- color: var(--epx-text);
808
- i{
809
- margin-right: 10px;
810
- }
811
- &:hover{
812
- @include font_color_primary;
813
- @include bg_color_primary(0.1);
814
- }
815
- }
816
- .role-system__content {
817
- padding-bottom: 20px;
818
-
819
- :deep(.el-checkbox) {
820
- padding: 10px 0;
821
- color: var(--epx-text);
822
- }
823
-
824
- }
825
- .popup-dialog{
826
- :deep(.el-dialog__header){
827
- padding: 16px;
828
- }
829
- }
830
- .epx-add-form__sign-buttongroup .el-button + .el-button{
831
- margin-left: 20px;
832
- }
833
-
834
- // 菜单样式
835
- .tree-node {
836
- line-height: 48px;
837
- flex: 1;
838
- display: flex;
839
- align-items: center;
840
- justify-content: space-between;
841
- font-size: var(--epx-font-size-base);
842
- padding-right: 8px;
843
- color: var(--epx-text);
844
- width: 100%;
845
- box-sizing: border-box;
846
- }
847
- .tree-node i{
848
- margin-right: 8px;
849
- }
850
- .tree-wrap{
851
-
852
- :deep(.el-tree-node__content) {
853
- height: auto;
854
- &:hover {
855
- @include bg_color_primary(0.2);
856
- .setting-btn{
857
- visibility: visible;
858
- }
859
- }
860
- }
861
- :deep(.el-tree-node__content>.el-tree-node__expand-icon) {
862
- padding: 0;
863
- }
864
-
865
- }
866
- .setting-btn{
867
- width: 20px;
868
- display: inline-block;
869
- visibility: hidden;
870
- font-size: var(--epx-font-size-l);
871
- text-align: right;
872
- }
873
- .mycons {
874
- padding: 0;
875
- }
876
- .tree-content-panel {
877
- display: inline-block;
878
- width: calc(100% - 20px);
879
- overflow: hidden;
880
- }
881
- .tree-active {
882
- @include bg_color_primary(0.1);
883
- @include font_color_primary;
884
- }
885
- .tree-content-panel-span {
886
- display: flex;
887
- justify-content: space-between;
888
- align-items: center;
889
- & span{
890
- display: flex;
891
- justify-content: space-between;
892
- align-items: center;
893
- }
894
- }
895
- .rotate {
896
- transform-origin: center center; //旋转中心要是正中间 才行
897
- transform: rotate(180deg);
898
- -webkit-transform: rotate(180deg);
899
- -moz-transform: rotate(180deg);
900
- -ms-transform: rotate(180deg);
901
- -o-transform: rotate(180deg);
902
- transition: transform 0.2s; //过度时间 可调
903
- -moz-transition: -moz-transform 0.2s;
904
- -moz-transition: -moz-transform 0.2s;
905
- -o-transition: -o-transform 0.2s;
906
- -ms-transition: -ms-transform 0.2s;
907
- }
908
- .rotate1 {
909
- transform-origin: center center;
910
- transform: rotate(0deg); //返回原点
911
- -webkit-transform: rotate(0deg);
912
- -moz-transform: rotate(0deg);
913
- -ms-transform: rotate(0deg);
914
- -o-transform: rotate(0deg);
915
- transition: transform 0.2s;
916
- -moz-transition: -moz-transform 0.2s;
917
- -moz-transition: -moz-transform 0.2s;
918
- -o-transition: -o-transform 0.2s;
919
- -ms-transition: -ms-transform 0.2s;
920
- }
921
-
922
- .no-menu{
923
- text-align: center;
924
- color: var(--epx-text-secondary);
925
- padding-top: 20px;
926
- .epx-icon-color-kong{
927
- font-size: 120px;
928
- }
929
- }
930
- .no-menu-add-menu{
931
- box-sizing: border-box;
932
- width: 100%;
933
- padding: 10px;
934
- }
935
- </style>
699
+ defaultValue: defaultValue,
700
+ openType: '2',
701
+ callback: this.reloadMenu
702
+ }
703
+ const popover = this.$refs.popover
704
+ if (popover)popover.doClose()
705
+ // this.popoverManualVisible = false
706
+ this.$createPage(query)
707
+ }
708
+ },
709
+ created () {
710
+ this.getClientSystemAppRole()
711
+ if (this.modules) {
712
+ this.serviceMenu = [...this.modules]
713
+ } else {
714
+ this.getUserServiceMenu()
715
+ }
716
+ }
717
+ }
718
+ </script>
719
+
720
+ <style lang="scss" scoped>
721
+ .manage-menu-row{
722
+ box-sizing: border-box;
723
+ // height: 100%;
724
+ // overflow: auto;
725
+ // padding-bottom: 60px;
726
+ }
727
+ .add-menu{
728
+ // position: absolute;
729
+ // bottom: 0;
730
+ // left: 0;
731
+ box-sizing: border-box;
732
+ width: 100%;
733
+ height: 56px;
734
+ // padding: 10px;
735
+ background: var(--epx-bg-card);
736
+ box-shadow: 0px -2px 4px 0px rgba(0,0,0,0.15);
737
+ }
738
+ .add-menu-container{
739
+ box-sizing: border-box;
740
+ padding: 4px 0 0 20px;
741
+ width: 560px;
742
+ height: 352px;
743
+ font-size: var(--epx-font-size-l);
744
+ color: var(--epx-text);
745
+ font-weight: bold;
746
+ }
747
+ .add-type {
748
+ display: flex;
749
+ flex-wrap: wrap;
750
+ margin-top: 12px;
751
+ }
752
+ .add-menu-type-label{
753
+ font-size: var(--epx-font-size-base);
754
+ color: #444444;
755
+ margin-top: 10px;
756
+ line-height: 19px;
757
+ font-weight: 500;
758
+ }
759
+ .add-menu-type__item {
760
+ width: 160px;
761
+ margin-right: 20px;
762
+ margin-bottom: 20px;
763
+ text-align: center;
764
+ cursor: pointer;
765
+ img {
766
+ width: 100%;
767
+ }
768
+ &:hover {
769
+ .add-menu-type-label{
770
+ @include font_color_primary;
771
+ }
772
+ }
773
+ }
774
+ .draggable-menu-con{
775
+ padding-bottom: 20px;
776
+ }
777
+ .delete-dropdown-item{
778
+ display: flex;
779
+ align-items: center;
780
+ justify-content: space-between;
781
+ padding-right: 10px;
782
+ cursor: pointer;
783
+ background: var(--epx-bg-card);
784
+ color: var(--epx-text);
785
+ }
786
+ .delete-dropdown-item:hover{
787
+ @include font_color_primary;
788
+ @include bg_color_primary(0.1);
789
+ }
790
+ .app-config-delete-item{
791
+ box-sizing: border-box;
792
+ height: 36px;
793
+ cursor: pointer;
794
+ line-height: 36px;
795
+ padding: 0 40px 0 20px;
796
+ i{
797
+ margin-right: 10px;
798
+ }
799
+ }
800
+ .app-config-item{
801
+ box-sizing: border-box;
802
+ height: 36px;
803
+ background: var(--epx-bg-card);
804
+ cursor: pointer;
805
+ line-height: 36px;
806
+ padding: 0 40px 0 20px;
807
+ color: var(--epx-text);
808
+ i{
809
+ margin-right: 10px;
810
+ }
811
+ &:hover{
812
+ @include font_color_primary;
813
+ @include bg_color_primary(0.1);
814
+ }
815
+ }
816
+ .role-system__content {
817
+ padding-bottom: 20px;
818
+
819
+ :deep(.el-checkbox) {
820
+ padding: 10px 0;
821
+ color: var(--epx-text);
822
+ }
823
+
824
+ }
825
+ .popup-dialog{
826
+ :deep(.el-dialog__header){
827
+ padding: 16px;
828
+ }
829
+ }
830
+ .epx-add-form__sign-buttongroup .el-button + .el-button{
831
+ margin-left: 20px;
832
+ }
833
+
834
+ // 菜单样式
835
+ .tree-node {
836
+ line-height: 48px;
837
+ flex: 1;
838
+ display: flex;
839
+ align-items: center;
840
+ justify-content: space-between;
841
+ font-size: var(--epx-font-size-base);
842
+ padding-right: 8px;
843
+ color: var(--epx-text);
844
+ width: 100%;
845
+ box-sizing: border-box;
846
+ }
847
+ .tree-node i{
848
+ margin-right: 8px;
849
+ }
850
+ .tree-wrap{
851
+
852
+ :deep(.el-tree-node__content) {
853
+ height: auto;
854
+ &:hover {
855
+ @include bg_color_primary(0.2);
856
+ .setting-btn{
857
+ visibility: visible;
858
+ }
859
+ }
860
+ }
861
+ :deep(.el-tree-node__content>.el-tree-node__expand-icon) {
862
+ padding: 0;
863
+ }
864
+
865
+ }
866
+ .setting-btn{
867
+ width: 20px;
868
+ display: inline-block;
869
+ visibility: hidden;
870
+ font-size: var(--epx-font-size-l);
871
+ text-align: right;
872
+ }
873
+ .mycons {
874
+ padding: 0;
875
+ }
876
+ .tree-content-panel {
877
+ display: inline-block;
878
+ width: calc(100% - 20px);
879
+ overflow: hidden;
880
+ }
881
+ .tree-active {
882
+ @include bg_color_primary(0.1);
883
+ @include font_color_primary;
884
+ }
885
+ .tree-content-panel-span {
886
+ display: flex;
887
+ justify-content: space-between;
888
+ align-items: center;
889
+ & span{
890
+ display: flex;
891
+ justify-content: space-between;
892
+ align-items: center;
893
+ }
894
+ }
895
+ .rotate {
896
+ transform-origin: center center; //旋转中心要是正中间 才行
897
+ transform: rotate(180deg);
898
+ -webkit-transform: rotate(180deg);
899
+ -moz-transform: rotate(180deg);
900
+ -ms-transform: rotate(180deg);
901
+ -o-transform: rotate(180deg);
902
+ transition: transform 0.2s; //过度时间 可调
903
+ -moz-transition: -moz-transform 0.2s;
904
+ -moz-transition: -moz-transform 0.2s;
905
+ -o-transition: -o-transform 0.2s;
906
+ -ms-transition: -ms-transform 0.2s;
907
+ }
908
+ .rotate1 {
909
+ transform-origin: center center;
910
+ transform: rotate(0deg); //返回原点
911
+ -webkit-transform: rotate(0deg);
912
+ -moz-transform: rotate(0deg);
913
+ -ms-transform: rotate(0deg);
914
+ -o-transform: rotate(0deg);
915
+ transition: transform 0.2s;
916
+ -moz-transition: -moz-transform 0.2s;
917
+ -moz-transition: -moz-transform 0.2s;
918
+ -o-transition: -o-transform 0.2s;
919
+ -ms-transition: -ms-transform 0.2s;
920
+ }
921
+
922
+ .no-menu{
923
+ text-align: center;
924
+ color: var(--epx-text-secondary);
925
+ padding-top: 20px;
926
+ .epx-icon-color-kong{
927
+ font-size: 120px;
928
+ }
929
+ }
930
+ .no-menu-add-menu{
931
+ box-sizing: border-box;
932
+ width: 100%;
933
+ padding: 10px;
934
+ }
935
+ </style>