n20-common-lib 1.2.8 → 1.2.9

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 (189) hide show
  1. package/README.md +2 -2
  2. package/package.json +87 -87
  3. package/src/_qiankun/index.js +113 -113
  4. package/src/_qiankun/postMessage.js +48 -48
  5. package/src/assets/css/_coreLib.scss +35 -35
  6. package/src/assets/css/cl-anchor.scss +23 -23
  7. package/src/assets/css/cl-approve-card.scss +58 -58
  8. package/src/assets/css/cl-dialog.scss +99 -99
  9. package/src/assets/css/cl-drag-list.scss +22 -22
  10. package/src/assets/css/cl-empty.scss +10 -10
  11. package/src/assets/css/cl-expandable-pane.scss +26 -26
  12. package/src/assets/css/cl-expandable.scss +24 -24
  13. package/src/assets/css/cl-file-upload-table.scss +11 -11
  14. package/src/assets/css/cl-filter.scss +4 -4
  15. package/src/assets/css/cl-flow-step.scss +185 -185
  16. package/src/assets/css/cl-footer-box.scss +10 -10
  17. package/src/assets/css/cl-form-item.scss +454 -454
  18. package/src/assets/css/cl-general-card.scss +11 -11
  19. package/src/assets/css/cl-layout-aside.scss +88 -88
  20. package/src/assets/css/cl-layout-content.scss +16 -16
  21. package/src/assets/css/cl-layout-header.scss +73 -73
  22. package/src/assets/css/cl-layout-tabs.scss +87 -87
  23. package/src/assets/css/cl-layout.scss +97 -97
  24. package/src/assets/css/cl-login-temporary.scss +37 -37
  25. package/src/assets/css/cl-message.scss +75 -75
  26. package/src/assets/css/cl-more-tab.scss +98 -98
  27. package/src/assets/css/cl-nav-menu.scss +5 -5
  28. package/src/assets/css/cl-pagination.scss +65 -65
  29. package/src/assets/css/cl-secondary-tab.scss +39 -39
  30. package/src/assets/css/cl-showcolumn.scss +23 -23
  31. package/src/assets/css/cl-sifting.scss +51 -51
  32. package/src/assets/css/cl-statis.scss +42 -42
  33. package/src/assets/css/cl-step.scss +73 -73
  34. package/src/assets/css/cl-suspend.scss +19 -19
  35. package/src/assets/css/cl-tertiary-tab.scss +9 -9
  36. package/src/assets/css/cl-upload.scss +41 -41
  37. package/src/assets/css/cl-worn-pagination.scss +50 -50
  38. package/src/assets/css/el-button.scss +173 -173
  39. package/src/assets/css/el-table.scss +79 -79
  40. package/src/assets/css/element-variables.scss +1061 -1061
  41. package/src/assets/css/element.dev.scss +21 -21
  42. package/src/assets/css/font-icon.scss +27 -27
  43. package/src/assets/css/index.dev.scss +4 -4
  44. package/src/assets/css/index.scss +11 -11
  45. package/src/assets/css/normalize.scss +726 -726
  46. package/src/assets/css/rootvar.scss +139 -139
  47. package/src/assets/css/select.scss +25 -25
  48. package/src/assets/css/title-pop.scss +4 -4
  49. package/src/assets/getJsonc.js +50 -50
  50. package/src/assets/realUrl.js +12 -12
  51. package/src/components/.DS_Store +0 -0
  52. package/src/components/Anchor/AnchorItem.vue +29 -29
  53. package/src/components/Anchor/index.vue +185 -185
  54. package/src/components/ApprovalButtons/index.vue +232 -232
  55. package/src/components/ApprovalCard/index.vue +128 -128
  56. package/src/components/ApprovalRecord/approvalImg.vue +39 -39
  57. package/src/components/ApprovalRecord/index.vue +59 -59
  58. package/src/components/Button/button-group.vue +150 -150
  59. package/src/components/Button/icon-group-button.vue +61 -61
  60. package/src/components/Button/index.vue +56 -56
  61. package/src/components/CascaderArea/index.vue +81 -81
  62. package/src/components/ContentLoading/index.vue +41 -41
  63. package/src/components/ContentNull/index.vue +19 -19
  64. package/src/components/DatePicker/index.vue +27 -27
  65. package/src/components/DatePicker/por.vue +169 -169
  66. package/src/components/Dialog/index.vue +26 -26
  67. package/src/components/Dialog/indexO.vue +116 -116
  68. package/src/components/DragList/index.vue +68 -68
  69. package/src/components/Empty/img/abnormal.svg +108 -108
  70. package/src/components/Empty/img/dispose.svg +71 -71
  71. package/src/components/Empty/img/empty.svg +57 -57
  72. package/src/components/Empty/img/general.svg +58 -58
  73. package/src/components/Empty/img/lock.svg +57 -57
  74. package/src/components/Empty/img/network.svg +59 -59
  75. package/src/components/Empty/img/relevant.svg +68 -68
  76. package/src/components/Empty/img/search.svg +72 -72
  77. package/src/components/Empty/index.vue +92 -92
  78. package/src/components/Expandable/index.vue +49 -49
  79. package/src/components/Expandable/main.vue +52 -52
  80. package/src/components/FileExportAsync/index.vue +174 -174
  81. package/src/components/FileUploadTable/index.vue +484 -484
  82. package/src/components/Filters/index.vue +369 -369
  83. package/src/components/Filters/indexO.vue +104 -104
  84. package/src/components/FlowStep/index.vue +68 -68
  85. package/src/components/FooterBox/index.vue +21 -21
  86. package/src/components/GeneralCard/index.vue +15 -15
  87. package/src/components/InputNumber/index.vue +153 -153
  88. package/src/components/InputNumber/numberRange.vue +47 -47
  89. package/src/components/InputSearch/index.vue +75 -75
  90. package/src/components/Layout/.DS_Store +0 -0
  91. package/src/components/Layout/AsideNav/index.vue +119 -119
  92. package/src/components/Layout/AsideNav/menuItem.vue +34 -34
  93. package/src/components/Layout/AsideNav/submenuTitle.vue +26 -26
  94. package/src/components/Layout/HeaderWrap/changePwd.vue +215 -215
  95. package/src/components/Layout/HeaderWrap/index.vue +348 -348
  96. package/src/components/Layout/HeaderWrap/noticePop.vue +300 -300
  97. package/src/components/Layout/SubContent/index.vue +131 -131
  98. package/src/components/Layout/TabsNav/index.vue +170 -170
  99. package/src/components/Layout/index.vue +529 -529
  100. package/src/components/Layout/utils.js +12 -12
  101. package/src/components/LoginTemporary/form.vue +537 -537
  102. package/src/components/LoginTemporary/index.vue +122 -122
  103. package/src/components/LoginTemporary/qrcode.vue +90 -90
  104. package/src/components/LoginTemporary/retrievePw.vue +28 -28
  105. package/src/components/LoginTemporary/utils.js +73 -73
  106. package/src/components/MicroApp/index.js +67 -67
  107. package/src/components/MicroFrame/index.vue +95 -95
  108. package/src/components/MoreTab/index.vue +232 -232
  109. package/src/components/NavMenu/index.vue +60 -60
  110. package/src/components/NstcG6Components/NstcDialog/NstcDialog.vue +184 -184
  111. package/src/components/PageLayout/page.vue +15 -15
  112. package/src/components/Pagination/index.vue +96 -96
  113. package/src/components/SecondaryTab/index.vue +58 -58
  114. package/src/components/SelectLazy/index.vue +75 -75
  115. package/src/components/SelectTree/SelectTreeLazy.vue +241 -241
  116. package/src/components/SelectTree/index.vue +205 -205
  117. package/src/components/ShowColumn/index.vue +204 -204
  118. package/src/components/Sifting/index.vue +99 -99
  119. package/src/components/Statis/index.vue +97 -97
  120. package/src/components/Statis/statisItem.vue +54 -54
  121. package/src/components/Statis/statisPopover.vue +55 -55
  122. package/src/components/Step/index.vue +38 -38
  123. package/src/components/Suspend/index.vue +72 -72
  124. package/src/components/Table/index.vue +179 -179
  125. package/src/components/Table/indexO.vue +149 -149
  126. package/src/components/Task/index.vue +26 -26
  127. package/src/components/TertiaryTab/index.vue +53 -53
  128. package/src/components/TimePicker/index.vue +28 -28
  129. package/src/components/Upload/index.vue +242 -242
  130. package/src/components/WornPagination/index.vue +73 -73
  131. package/src/directives/VClickOutside/index.js +19 -19
  132. package/src/directives/VHas/index.js +32 -32
  133. package/src/directives/VMove/index.js +42 -42
  134. package/src/directives/VTitle/index.js +64 -64
  135. package/src/directives/VTitle/tooltip.vue +21 -21
  136. package/src/index.js +225 -225
  137. package/src/plugins/CompatibleOld/index.js +57 -57
  138. package/src/plugins/Print/index.js +4 -4
  139. package/src/plugins/Print/print-js/.babelrc +12 -12
  140. package/src/plugins/Print/print-js/LICENSE +21 -21
  141. package/src/plugins/Print/print-js/README.md +98 -98
  142. package/src/plugins/Print/print-js/dist/print.css +96 -96
  143. package/src/plugins/Print/print-js/dist/print.js +990 -990
  144. package/src/plugins/Print/print-js/package.json +60 -60
  145. package/src/plugins/Print/print-js/src/index.d.ts +45 -45
  146. package/src/plugins/Print/print-js/src/index.js +10 -10
  147. package/src/plugins/Print/print-js/src/js/browser.js +33 -33
  148. package/src/plugins/Print/print-js/src/js/functions.js +103 -103
  149. package/src/plugins/Print/print-js/src/js/html.js +70 -70
  150. package/src/plugins/Print/print-js/src/js/image.js +48 -48
  151. package/src/plugins/Print/print-js/src/js/init.js +168 -168
  152. package/src/plugins/Print/print-js/src/js/json.js +109 -109
  153. package/src/plugins/Print/print-js/src/js/modal.js +62 -62
  154. package/src/plugins/Print/print-js/src/js/pdf.js +62 -62
  155. package/src/plugins/Print/print-js/src/js/print.js +102 -102
  156. package/src/plugins/Print/print-js/src/js/raw-html.js +15 -15
  157. package/src/plugins/Print/print-js/src/sass/index.scss +13 -13
  158. package/src/plugins/Print/print-js/src/sass/modules/_colors.scss +9 -9
  159. package/src/plugins/Print/print-js/src/sass/partials/_modal.scss +40 -40
  160. package/src/plugins/Print/print-js/src/sass/partials/_spinner.scss +45 -45
  161. package/src/plugins/Print/print.js +2 -2
  162. package/src/plugins/Print/print.scss +1 -1
  163. package/src/plugins/SetMenuTree/index.vue +41 -41
  164. package/src/plugins/SetMenuTree/logoIcon.vue +37 -37
  165. package/src/plugins/SetMenuTree/setmenutree.vue +427 -427
  166. package/src/plugins/SetMenuTree/utils.js +74 -74
  167. package/src/plugins/Sign/InfosecNetSignCNGAgent.min.js +2000 -2000
  168. package/src/plugins/Sign/index.js +65 -65
  169. package/src/plugins/Sign/sign.js +1 -1
  170. package/src/plugins/setTabsForSub.js +2 -2
  171. package/src/utils/auth.js +53 -53
  172. package/src/utils/axios.js +203 -203
  173. package/src/utils/downloadBlob.js +19 -19
  174. package/src/utils/forEachs.js +16 -16
  175. package/src/utils/getScrollContainer.js +43 -43
  176. package/src/utils/i18n/cn2hk.json +1270 -1270
  177. package/src/utils/i18n/index.js +54 -54
  178. package/src/utils/list2tree.js +36 -36
  179. package/src/utils/msgboxPor.js +26 -26
  180. package/src/utils/print.js +161 -161
  181. package/src/utils/relaNo.js +69 -69
  182. package/src/utils/repairElementUI.js +66 -66
  183. package/src/utils/urlToGo.js +82 -82
  184. package/style/css/normalize.scss +723 -726
  185. package/style/pageDemo/demo-1.vue +130 -131
  186. package/style/pageDemo/demo-2.vue +35 -35
  187. package/style/pageDemo/demo-3.vue +22 -22
  188. package/style/pageDemo/seeCode.js +20 -20
  189. package/style/server-config.jsonc +663 -596
@@ -1,427 +1,427 @@
1
- <template>
2
- <div class="flex-box" style="height: 420px">
3
- <div class="flex-column bd-r" style="width: 300px; height: 100%">
4
- <div class="flex-box flex-v">
5
- <span>导航菜单树</span>
6
- <el-button
7
- class="m-l-auto"
8
- type="primary"
9
- size="mini"
10
- @click="saveMenuTree"
11
- >保存菜单树</el-button
12
- >
13
- <el-button class="m-r-s" plain size="mini" @click="addFF"
14
- >新建目录</el-button
15
- >
16
- </div>
17
- <el-tree
18
- ref="menu-tree"
19
- class="flex-item p-t p-b"
20
- :data="menuTree"
21
- :props="{
22
- children: 'children',
23
- label: 'label'
24
- }"
25
- node-key="menuid"
26
- highlight-current
27
- draggable
28
- style="overflow: auto"
29
- @node-click="clickMenu"
30
- >
31
- <span
32
- slot-scope="{ node, data }"
33
- class="menu-item flex-item flex-box flex-lr flex-v"
34
- >
35
- <span>
36
- <logoIcon
37
- v-if="data.logo"
38
- :logo="data.logo"
39
- width="14px"
40
- style="vertical-align: bottom"
41
- />
42
- {{ node.label || '未命名...' }}</span
43
- >
44
- <span class="menu-item-btn m-r">
45
- <el-button
46
- v-title="'新增下级'"
47
- icon="el-icon-document-add"
48
- plain
49
- onlyicon
50
- size="mini"
51
- @click.stop="() => appendMenu(data)"
52
- />
53
- <el-button
54
- v-title="'删除本级和下级'"
55
- icon="el-icon-document-delete"
56
- plain
57
- onlyicon
58
- size="mini"
59
- @click.stop="() => removeMenu(node, data)"
60
- />
61
- </span>
62
- </span>
63
- </el-tree>
64
- </div>
65
- <div class="flex-item p-l flex-column" style="height: 100%">
66
- <div style="line-height: 28px">菜单/按钮详情</div>
67
- <div class="flex-item p-t p-b flex-box flex-c">
68
- <el-form
69
- v-if="activeMenu.menuid"
70
- ref="menu-form"
71
- label-width="6em"
72
- label-position="right"
73
- :model="activeMenu"
74
- >
75
- <el-form-item
76
- label="名称:"
77
- prop="label"
78
- :rules="[
79
- { required: true, message: '请输入名称', trigger: 'blur' }
80
- ]"
81
- >
82
- <el-input v-model="activeMenu.label" class="input-w" />
83
- </el-form-item>
84
- <el-form-item label="属性:">
85
- <el-select v-model="activeMenu.resType" class="input-w">
86
- <el-option value="1" label="左边栏菜单" />
87
- <el-option value="2" label="隐藏菜单" />
88
- <el-option value="3" label="权限按钮" />
89
- </el-select>
90
- </el-form-item>
91
-
92
- <el-form-item
93
- v-if="activeMenu.resType === '1'"
94
- label="所属模块"
95
- prop="appNo"
96
- :rules="[
97
- { required: true, message: '请输入所属模块', trigger: 'blur' }
98
- ]"
99
- >
100
- <el-input
101
- v-model="activeMenu.appNo"
102
- class="input-w"
103
- @change="(val) => setAppNo(val, activeMenu)"
104
- />
105
- </el-form-item>
106
-
107
- <template v-if="['1', '2'].includes(activeMenu.resType)">
108
- <el-form-item
109
- label="访问路径:"
110
- prop="pageurl"
111
- :rules="[
112
- { required: true, message: '请输入访问路径', trigger: 'blur' }
113
- ]"
114
- >
115
- <el-input v-model="activeMenu.pageurl" class="input-w" />
116
- </el-form-item>
117
- <el-form-item label="图标:">
118
- <div class="flex-box">
119
- <logoIcon :logo="activeMenu.logo" />
120
- <div class="m-r-s">
121
- <el-button plain size="mini" @click="sltLogoV = true"
122
- >选择图标</el-button
123
- >
124
- </div>
125
- <el-upload
126
- action="http://nstc.com.cn"
127
- accept="image/*"
128
- :show-file-list="false"
129
- :http-request="(req) => uploadFile(req, activeMenu)"
130
- >
131
- <el-button slot="trigger" plain size="mini"
132
- >上传图标</el-button
133
- >
134
- </el-upload>
135
- </div>
136
- </el-form-item>
137
- <el-form-item label="快捷菜单: ">
138
- <template slot="label">
139
- <span>快捷菜单:</span>
140
- </template>
141
- <el-switch
142
- v-model="activeMenu.isDisplay"
143
- v-title="'是否作为门户首页的快捷入口的备选项'"
144
- active-value="1"
145
- inactive-value="0"
146
- active-text="是"
147
- inactive-text="否"
148
- inline
149
- :width="46"
150
- />
151
- </el-form-item>
152
- </template>
153
- <el-form-item v-if="activeMenu.treeno" label="权限编码:">
154
- <div class="input-w flex-box">
155
- <el-input class="flex-item" :value="activeMenu.treeno" readonly />
156
- </div>
157
- </el-form-item>
158
- </el-form>
159
- </div>
160
- </div>
161
- <el-dialog
162
- title="选择图标"
163
- :visible.sync="sltLogoV"
164
- width="714px"
165
- append-to-body
166
- >
167
- <div class="overflow">
168
- <div
169
- v-for="(item, i) in logosClass"
170
- :key="i"
171
- class="m-icon-item flex-column left m-l m-r"
172
- :class="{ active: sltIcon === item }"
173
- style="width: 80px; height: 120px"
174
- @click="sltIcon = item"
175
- >
176
- <div class="text-c" style="font-size: 32px">
177
- <i :class="item"></i>
178
- </div>
179
- <div class="m-t text-c">{{ item }}</div>
180
- </div>
181
- </div>
182
- <div class="dialog-footer">
183
- <el-button type="primary" @click="sltLogo">确认</el-button>
184
- <el-button @click="closeSltLogo">取消</el-button>
185
- </div>
186
- </el-dialog>
187
- </div>
188
- </template>
189
-
190
- <script>
191
- /* eslint-disable no-unused-vars */
192
-
193
- import { nanoid } from 'nanoid'
194
- import forEachs from '../../utils/forEachs'
195
- import list2tree from '../../utils/list2tree'
196
- import { treeSource2menutree, menutree2treeSource } from './utils'
197
- import logoIcon from './logoIcon.vue'
198
-
199
- export default {
200
- components: {
201
- logoIcon
202
- },
203
- filters: {
204
- typeF(v) {}
205
- },
206
- props: {
207
- setNew: {
208
- type: Boolean,
209
- default: true
210
- }
211
- },
212
- data() {
213
- this.menuidMax = 0
214
- return {
215
- menuTree: [],
216
- activeMenu: {},
217
- exKeys: [],
218
- sltLogoV: false,
219
- sltIcon: undefined,
220
- logosClass: [
221
- 'el-icon-s-home',
222
- 'el-icon-s-cooperation',
223
- 'el-icon-s-order',
224
- 'el-icon-s-management',
225
- 'el-icon-s-marketing',
226
- 'el-icon-s-comment',
227
- 'el-icon-menu',
228
- 'el-icon-s-grid',
229
- 'el-icon-s-data',
230
- 'el-icon-date',
231
- 'el-icon-pie-chart',
232
- 'el-icon-loading'
233
- ]
234
- }
235
- },
236
- created() {
237
- if (this.setNew) {
238
- this.getMenuTree()
239
- } else {
240
- this.getTreeSource()
241
- }
242
- },
243
- methods: {
244
- getMenuTree() {
245
- this.$axios
246
- .get('/server-assets/menutree.json', null, { noMsg: true })
247
- .then((res) => {
248
- this.menuTree = res.map((c) => c)
249
- })
250
- .catch(this.getTreeSource())
251
- },
252
- getTreeSource() {
253
- this.$axios.get('/json/treeSource.json').then((res) => {
254
- this.menuTree = treeSource2menutree(res)
255
- })
256
- },
257
- saveMenuTree() {
258
- this.$msgboxPor({
259
- title: '保存菜单树',
260
- message: '保存菜单树会覆盖原有的菜单树, 确定要保存吗?',
261
- type: 'warning',
262
- confirmButtonText: '确定',
263
- cancelButtonText: '取消'
264
- }).then(() => {
265
- this.saveMenuTreeAs()
266
- })
267
- },
268
- saveMenuTreeAs() {
269
- let menuTree = JSON.parse(JSON.stringify(this.menuTree))
270
- forEachs(menuTree, (item, i, arr) => {
271
- item.status = '1'
272
- item.sortnum = (i + 1).toString()
273
- item.path = null
274
-
275
- item?.children?.forEach((c) => {
276
- c.pmid = item.menuid
277
- c.parentTreeNo = item.treeno
278
- })
279
-
280
- if (['1', '2'].includes(item.resType)) {
281
- item.isSearch = '1'
282
- } else {
283
- item.isSearch = '0'
284
- item.pageurl = null
285
- }
286
- })
287
-
288
- if (this.setNew) {
289
- this.setMenuTree(menuTree)
290
- } else {
291
- this.setTreeSource(menuTree)
292
- }
293
- },
294
- setMenuTree(menuTree) {
295
- this.$axios.post('/set-file', {
296
- fileName: 'server-assets/menutree.json',
297
- fileContent: JSON.stringify(menuTree, null, 2)
298
- })
299
- },
300
- setTreeSource(menuTree) {
301
- let treeSource = menutree2treeSource(menuTree)
302
- this.$axios.post('/set-file', {
303
- fileName: 'json/treeSource.json',
304
- fileContent: JSON.stringify(treeSource, null, 2)
305
- })
306
- },
307
- addFF() {
308
- this.menuidMax = this.menuidMax + 1
309
- let menu = {
310
- menuid: this.menuidMax /* * -1 */,
311
- appNo: '',
312
- label: '',
313
- treeno: '',
314
- pageurl: '',
315
- sortnum: 0,
316
- resType: '1',
317
- isDisplay: '1',
318
- children: []
319
- }
320
- this.menuTree.unshift(menu)
321
-
322
- this.$nextTick(() => {
323
- this.activeMenu = menu
324
- this.$refs['menu-tree'].setCurrentKey(menu.menuid)
325
- })
326
- },
327
- appendMenu(data) {
328
- this.menuidMax = this.menuidMax + 1
329
- let appNo = data.appNo
330
-
331
- let menu = {
332
- menuid: this.menuidMax /* * -1 */,
333
- appNo: appNo,
334
- label: '',
335
- treeno: appNo + '-' + nanoid(8),
336
- pageurl: '',
337
- sortnum: undefined,
338
- resType: '3',
339
- isDisplay: '0'
340
- }
341
-
342
- data.children || this.$set(data, 'children', [])
343
-
344
- if (data.children.length === 0) {
345
- menu.sortnum = '1'
346
- data.children.push(menu)
347
- } else {
348
- let lastC = data.children[data.children.length - 1]
349
- let sortnum = Number(lastC.sortnum) + 1
350
- menu.sortnum = sortnum.toString()
351
-
352
- data.children.push(menu)
353
- }
354
-
355
- this.$nextTick(() => {
356
- this.activeMenu = menu
357
- this.$refs['menu-tree'].setCurrentKey(menu.menuid)
358
- })
359
- },
360
- removeMenu(node, data) {
361
- this.$msgboxPor({
362
- title: '删除菜单/按钮',
363
- message: '确定要删除吗?',
364
- type: 'warning',
365
- confirmButtonText: '确定',
366
- cancelButtonText: '取消'
367
- }).then(() => {
368
- let children = node.parent.data.children || node.parent.data
369
- let index = children.findIndex((d) => d.menuid === data.menuid)
370
- index !== -1 && children.splice(index, 1)
371
- })
372
- },
373
- clickMenu(data) {
374
- this.activeMenu = data
375
- },
376
- setAppNo(val, menu) {
377
- if (val && !menu.treeno) {
378
- menu.treeno = val + '-' + nanoid(8)
379
- }
380
- },
381
- uploadFile(req, menu) {
382
- let fR = new FileReader()
383
- fR.onload = (e) => {
384
- menu.logo = e.target.result
385
- }
386
- fR.readAsDataURL(req.file)
387
- },
388
- closeSltLogo() {
389
- this.sltIcon = undefined
390
- this.sltLogoV = false
391
- },
392
- sltLogo() {
393
- this.activeMenu.logo = this.sltIcon
394
- this.sltLogoV = false
395
- },
396
- submitForm() {
397
- this.$refs['menu-form'].validate((valid) => {
398
- if (valid) {
399
- Object.assign(this.activeMenu, this.activeMenu)
400
- }
401
- })
402
- }
403
- }
404
- }
405
- </script>
406
- <style scoped>
407
- .menu-item .menu-item-btn {
408
- display: none;
409
- }
410
- .menu-item:hover .menu-item-btn {
411
- display: block;
412
- }
413
-
414
- .m-icon-item {
415
- cursor: pointer;
416
- }
417
- .m-icon-item:hover {
418
- color: var(--color-primary);
419
- }
420
- .m-icon-item.active {
421
- color: var(--color-primary);
422
- }
423
-
424
- .hint {
425
- color: var(--color-text-placeholder);
426
- }
427
- </style>
1
+ <template>
2
+ <div class="flex-box" style="height: 420px">
3
+ <div class="flex-column bd-r" style="width: 300px; height: 100%">
4
+ <div class="flex-box flex-v">
5
+ <span>导航菜单树</span>
6
+ <el-button
7
+ class="m-l-auto"
8
+ type="primary"
9
+ size="mini"
10
+ @click="saveMenuTree"
11
+ >保存菜单树</el-button
12
+ >
13
+ <el-button class="m-r-s" plain size="mini" @click="addFF"
14
+ >新建目录</el-button
15
+ >
16
+ </div>
17
+ <el-tree
18
+ ref="menu-tree"
19
+ class="flex-item p-t p-b"
20
+ :data="menuTree"
21
+ :props="{
22
+ children: 'children',
23
+ label: 'label'
24
+ }"
25
+ node-key="menuid"
26
+ highlight-current
27
+ draggable
28
+ style="overflow: auto"
29
+ @node-click="clickMenu"
30
+ >
31
+ <span
32
+ slot-scope="{ node, data }"
33
+ class="menu-item flex-item flex-box flex-lr flex-v"
34
+ >
35
+ <span>
36
+ <logoIcon
37
+ v-if="data.logo"
38
+ :logo="data.logo"
39
+ width="14px"
40
+ style="vertical-align: bottom"
41
+ />
42
+ {{ node.label || '未命名...' }}</span
43
+ >
44
+ <span class="menu-item-btn m-r">
45
+ <el-button
46
+ v-title="'新增下级'"
47
+ icon="el-icon-document-add"
48
+ plain
49
+ onlyicon
50
+ size="mini"
51
+ @click.stop="() => appendMenu(data)"
52
+ />
53
+ <el-button
54
+ v-title="'删除本级和下级'"
55
+ icon="el-icon-document-delete"
56
+ plain
57
+ onlyicon
58
+ size="mini"
59
+ @click.stop="() => removeMenu(node, data)"
60
+ />
61
+ </span>
62
+ </span>
63
+ </el-tree>
64
+ </div>
65
+ <div class="flex-item p-l flex-column" style="height: 100%">
66
+ <div style="line-height: 28px">菜单/按钮详情</div>
67
+ <div class="flex-item p-t p-b flex-box flex-c">
68
+ <el-form
69
+ v-if="activeMenu.menuid"
70
+ ref="menu-form"
71
+ label-width="6em"
72
+ label-position="right"
73
+ :model="activeMenu"
74
+ >
75
+ <el-form-item
76
+ label="名称:"
77
+ prop="label"
78
+ :rules="[
79
+ { required: true, message: '请输入名称', trigger: 'blur' }
80
+ ]"
81
+ >
82
+ <el-input v-model="activeMenu.label" class="input-w" />
83
+ </el-form-item>
84
+ <el-form-item label="属性:">
85
+ <el-select v-model="activeMenu.resType" class="input-w">
86
+ <el-option value="1" label="左边栏菜单" />
87
+ <el-option value="2" label="隐藏菜单" />
88
+ <el-option value="3" label="权限按钮" />
89
+ </el-select>
90
+ </el-form-item>
91
+
92
+ <el-form-item
93
+ v-if="activeMenu.resType === '1'"
94
+ label="所属模块"
95
+ prop="appNo"
96
+ :rules="[
97
+ { required: true, message: '请输入所属模块', trigger: 'blur' }
98
+ ]"
99
+ >
100
+ <el-input
101
+ v-model="activeMenu.appNo"
102
+ class="input-w"
103
+ @change="(val) => setAppNo(val, activeMenu)"
104
+ />
105
+ </el-form-item>
106
+
107
+ <template v-if="['1', '2'].includes(activeMenu.resType)">
108
+ <el-form-item
109
+ label="访问路径:"
110
+ prop="pageurl"
111
+ :rules="[
112
+ { required: true, message: '请输入访问路径', trigger: 'blur' }
113
+ ]"
114
+ >
115
+ <el-input v-model="activeMenu.pageurl" class="input-w" />
116
+ </el-form-item>
117
+ <el-form-item label="图标:">
118
+ <div class="flex-box">
119
+ <logoIcon :logo="activeMenu.logo" />
120
+ <div class="m-r-s">
121
+ <el-button plain size="mini" @click="sltLogoV = true"
122
+ >选择图标</el-button
123
+ >
124
+ </div>
125
+ <el-upload
126
+ action="http://nstc.com.cn"
127
+ accept="image/*"
128
+ :show-file-list="false"
129
+ :http-request="(req) => uploadFile(req, activeMenu)"
130
+ >
131
+ <el-button slot="trigger" plain size="mini"
132
+ >上传图标</el-button
133
+ >
134
+ </el-upload>
135
+ </div>
136
+ </el-form-item>
137
+ <el-form-item label="快捷菜单: ">
138
+ <template slot="label">
139
+ <span>快捷菜单:</span>
140
+ </template>
141
+ <el-switch
142
+ v-model="activeMenu.isDisplay"
143
+ v-title="'是否作为门户首页的快捷入口的备选项'"
144
+ active-value="1"
145
+ inactive-value="0"
146
+ active-text="是"
147
+ inactive-text="否"
148
+ inline
149
+ :width="46"
150
+ />
151
+ </el-form-item>
152
+ </template>
153
+ <el-form-item v-if="activeMenu.treeno" label="权限编码:">
154
+ <div class="input-w flex-box">
155
+ <el-input class="flex-item" :value="activeMenu.treeno" readonly />
156
+ </div>
157
+ </el-form-item>
158
+ </el-form>
159
+ </div>
160
+ </div>
161
+ <el-dialog
162
+ title="选择图标"
163
+ :visible.sync="sltLogoV"
164
+ width="714px"
165
+ append-to-body
166
+ >
167
+ <div class="overflow">
168
+ <div
169
+ v-for="(item, i) in logosClass"
170
+ :key="i"
171
+ class="m-icon-item flex-column left m-l m-r"
172
+ :class="{ active: sltIcon === item }"
173
+ style="width: 80px; height: 120px"
174
+ @click="sltIcon = item"
175
+ >
176
+ <div class="text-c" style="font-size: 32px">
177
+ <i :class="item"></i>
178
+ </div>
179
+ <div class="m-t text-c">{{ item }}</div>
180
+ </div>
181
+ </div>
182
+ <div class="dialog-footer">
183
+ <el-button type="primary" @click="sltLogo">确认</el-button>
184
+ <el-button @click="closeSltLogo">取消</el-button>
185
+ </div>
186
+ </el-dialog>
187
+ </div>
188
+ </template>
189
+
190
+ <script>
191
+ /* eslint-disable no-unused-vars */
192
+
193
+ import { nanoid } from 'nanoid'
194
+ import forEachs from '../../utils/forEachs'
195
+ import list2tree from '../../utils/list2tree'
196
+ import { treeSource2menutree, menutree2treeSource } from './utils'
197
+ import logoIcon from './logoIcon.vue'
198
+
199
+ export default {
200
+ components: {
201
+ logoIcon
202
+ },
203
+ filters: {
204
+ typeF(v) {}
205
+ },
206
+ props: {
207
+ setNew: {
208
+ type: Boolean,
209
+ default: true
210
+ }
211
+ },
212
+ data() {
213
+ this.menuidMax = 0
214
+ return {
215
+ menuTree: [],
216
+ activeMenu: {},
217
+ exKeys: [],
218
+ sltLogoV: false,
219
+ sltIcon: undefined,
220
+ logosClass: [
221
+ 'el-icon-s-home',
222
+ 'el-icon-s-cooperation',
223
+ 'el-icon-s-order',
224
+ 'el-icon-s-management',
225
+ 'el-icon-s-marketing',
226
+ 'el-icon-s-comment',
227
+ 'el-icon-menu',
228
+ 'el-icon-s-grid',
229
+ 'el-icon-s-data',
230
+ 'el-icon-date',
231
+ 'el-icon-pie-chart',
232
+ 'el-icon-loading'
233
+ ]
234
+ }
235
+ },
236
+ created() {
237
+ if (this.setNew) {
238
+ this.getMenuTree()
239
+ } else {
240
+ this.getTreeSource()
241
+ }
242
+ },
243
+ methods: {
244
+ getMenuTree() {
245
+ this.$axios
246
+ .get('/server-assets/menutree.json', null, { noMsg: true })
247
+ .then((res) => {
248
+ this.menuTree = res.map((c) => c)
249
+ })
250
+ .catch(this.getTreeSource())
251
+ },
252
+ getTreeSource() {
253
+ this.$axios.get('/json/treeSource.json').then((res) => {
254
+ this.menuTree = treeSource2menutree(res)
255
+ })
256
+ },
257
+ saveMenuTree() {
258
+ this.$msgboxPor({
259
+ title: '保存菜单树',
260
+ message: '保存菜单树会覆盖原有的菜单树, 确定要保存吗?',
261
+ type: 'warning',
262
+ confirmButtonText: '确定',
263
+ cancelButtonText: '取消'
264
+ }).then(() => {
265
+ this.saveMenuTreeAs()
266
+ })
267
+ },
268
+ saveMenuTreeAs() {
269
+ let menuTree = JSON.parse(JSON.stringify(this.menuTree))
270
+ forEachs(menuTree, (item, i, arr) => {
271
+ item.status = '1'
272
+ item.sortnum = (i + 1).toString()
273
+ item.path = null
274
+
275
+ item?.children?.forEach((c) => {
276
+ c.pmid = item.menuid
277
+ c.parentTreeNo = item.treeno
278
+ })
279
+
280
+ if (['1', '2'].includes(item.resType)) {
281
+ item.isSearch = '1'
282
+ } else {
283
+ item.isSearch = '0'
284
+ item.pageurl = null
285
+ }
286
+ })
287
+
288
+ if (this.setNew) {
289
+ this.setMenuTree(menuTree)
290
+ } else {
291
+ this.setTreeSource(menuTree)
292
+ }
293
+ },
294
+ setMenuTree(menuTree) {
295
+ this.$axios.post('/set-file', {
296
+ fileName: 'server-assets/menutree.json',
297
+ fileContent: JSON.stringify(menuTree, null, 2)
298
+ })
299
+ },
300
+ setTreeSource(menuTree) {
301
+ let treeSource = menutree2treeSource(menuTree)
302
+ this.$axios.post('/set-file', {
303
+ fileName: 'json/treeSource.json',
304
+ fileContent: JSON.stringify(treeSource, null, 2)
305
+ })
306
+ },
307
+ addFF() {
308
+ this.menuidMax = this.menuidMax + 1
309
+ let menu = {
310
+ menuid: this.menuidMax /* * -1 */,
311
+ appNo: '',
312
+ label: '',
313
+ treeno: '',
314
+ pageurl: '',
315
+ sortnum: 0,
316
+ resType: '1',
317
+ isDisplay: '1',
318
+ children: []
319
+ }
320
+ this.menuTree.unshift(menu)
321
+
322
+ this.$nextTick(() => {
323
+ this.activeMenu = menu
324
+ this.$refs['menu-tree'].setCurrentKey(menu.menuid)
325
+ })
326
+ },
327
+ appendMenu(data) {
328
+ this.menuidMax = this.menuidMax + 1
329
+ let appNo = data.appNo
330
+
331
+ let menu = {
332
+ menuid: this.menuidMax /* * -1 */,
333
+ appNo: appNo,
334
+ label: '',
335
+ treeno: appNo + '-' + nanoid(8),
336
+ pageurl: '',
337
+ sortnum: undefined,
338
+ resType: '3',
339
+ isDisplay: '0'
340
+ }
341
+
342
+ data.children || this.$set(data, 'children', [])
343
+
344
+ if (data.children.length === 0) {
345
+ menu.sortnum = '1'
346
+ data.children.push(menu)
347
+ } else {
348
+ let lastC = data.children[data.children.length - 1]
349
+ let sortnum = Number(lastC.sortnum) + 1
350
+ menu.sortnum = sortnum.toString()
351
+
352
+ data.children.push(menu)
353
+ }
354
+
355
+ this.$nextTick(() => {
356
+ this.activeMenu = menu
357
+ this.$refs['menu-tree'].setCurrentKey(menu.menuid)
358
+ })
359
+ },
360
+ removeMenu(node, data) {
361
+ this.$msgboxPor({
362
+ title: '删除菜单/按钮',
363
+ message: '确定要删除吗?',
364
+ type: 'warning',
365
+ confirmButtonText: '确定',
366
+ cancelButtonText: '取消'
367
+ }).then(() => {
368
+ let children = node.parent.data.children || node.parent.data
369
+ let index = children.findIndex((d) => d.menuid === data.menuid)
370
+ index !== -1 && children.splice(index, 1)
371
+ })
372
+ },
373
+ clickMenu(data) {
374
+ this.activeMenu = data
375
+ },
376
+ setAppNo(val, menu) {
377
+ if (val && !menu.treeno) {
378
+ menu.treeno = val + '-' + nanoid(8)
379
+ }
380
+ },
381
+ uploadFile(req, menu) {
382
+ let fR = new FileReader()
383
+ fR.onload = (e) => {
384
+ menu.logo = e.target.result
385
+ }
386
+ fR.readAsDataURL(req.file)
387
+ },
388
+ closeSltLogo() {
389
+ this.sltIcon = undefined
390
+ this.sltLogoV = false
391
+ },
392
+ sltLogo() {
393
+ this.activeMenu.logo = this.sltIcon
394
+ this.sltLogoV = false
395
+ },
396
+ submitForm() {
397
+ this.$refs['menu-form'].validate((valid) => {
398
+ if (valid) {
399
+ Object.assign(this.activeMenu, this.activeMenu)
400
+ }
401
+ })
402
+ }
403
+ }
404
+ }
405
+ </script>
406
+ <style scoped>
407
+ .menu-item .menu-item-btn {
408
+ display: none;
409
+ }
410
+ .menu-item:hover .menu-item-btn {
411
+ display: block;
412
+ }
413
+
414
+ .m-icon-item {
415
+ cursor: pointer;
416
+ }
417
+ .m-icon-item:hover {
418
+ color: var(--color-primary);
419
+ }
420
+ .m-icon-item.active {
421
+ color: var(--color-primary);
422
+ }
423
+
424
+ .hint {
425
+ color: var(--color-text-placeholder);
426
+ }
427
+ </style>