eoss 0.1.0-alpha.20 → 0.1.0-alpha.22

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 (275) hide show
  1. package/lib/account-login.js +1993 -1940
  2. package/lib/alert.js +4 -4
  3. package/lib/aside.js +4 -4
  4. package/lib/autocomplete.js +4935 -4833
  5. package/lib/avatar.js +4 -4
  6. package/lib/backtop.js +4 -4
  7. package/lib/badge.js +4 -4
  8. package/lib/breadcrumb-item.js +6 -6
  9. package/lib/breadcrumb.js +7 -7
  10. package/lib/button-group.js +11 -14
  11. package/lib/button.js +6 -6
  12. package/lib/ca-login.js +2479 -2381
  13. package/lib/calendar.js +798 -798
  14. package/lib/card.js +4 -4
  15. package/lib/carousel-item.js +910 -812
  16. package/lib/carousel.js +1647 -1549
  17. package/lib/cascader-panel.js +2555 -2457
  18. package/lib/cascader.js +4545 -4443
  19. package/lib/checkbox-button.js +4 -4
  20. package/lib/checkbox-group.js +2944 -2891
  21. package/lib/checkbox.js +4 -4
  22. package/lib/col.js +2 -2
  23. package/lib/collapse-item.js +35215 -2615
  24. package/lib/collapse.js +35451 -2789
  25. package/lib/color-picker.js +410 -406
  26. package/lib/config/api.js +15 -1
  27. package/lib/container.js +4 -4
  28. package/lib/cron.js +4 -4
  29. package/lib/data-table.js +1945 -1892
  30. package/lib/date-picker.js +6385 -6283
  31. package/lib/dialog.js +2911 -2805
  32. package/lib/divider.js +4 -4
  33. package/lib/drawer.js +311 -299
  34. package/lib/dropdown-item.js +6 -6
  35. package/lib/dropdown-menu.js +539 -535
  36. package/lib/dropdown.js +2269 -2171
  37. package/lib/email-login.js +1833 -1780
  38. package/lib/empty.js +723 -0
  39. package/lib/eoss.common.js +63164 -55517
  40. package/lib/flip.js +4 -4
  41. package/lib/flow-group.js +2984 -2886
  42. package/lib/flow.js +25094 -28062
  43. package/lib/flows.js +9195 -0
  44. package/lib/footer.js +4 -4
  45. package/lib/form-item.js +1945 -1836
  46. package/lib/form.js +10084 -9932
  47. package/lib/header.js +4 -4
  48. package/lib/icon.js +1692 -1574
  49. package/lib/icons.js +4 -4
  50. package/lib/image-viewer.js +1659 -1561
  51. package/lib/image.js +162 -162
  52. package/lib/index.js +1 -1
  53. package/lib/infinite-scroll.js +76 -76
  54. package/lib/input-number.js +172 -172
  55. package/lib/input.js +1361 -1263
  56. package/lib/link.js +4 -4
  57. package/lib/loading.js +321 -317
  58. package/lib/login.js +3390 -3350
  59. package/lib/lowcode.js +13610 -0
  60. package/lib/main.js +14581 -14389
  61. package/lib/marquee.js +1236 -1138
  62. package/lib/menu-item-group.js +119 -119
  63. package/lib/menu-item.js +114 -114
  64. package/lib/menu.js +6192 -6090
  65. package/lib/message-box.js +3581 -3479
  66. package/lib/message.js +2264 -2162
  67. package/lib/notification.js +2429 -2327
  68. package/lib/option-group.js +4 -4
  69. package/lib/option.js +841 -743
  70. package/lib/page-header.js +4 -4
  71. package/lib/pagination.js +1915 -1814
  72. package/lib/phone-login.js +1838 -1785
  73. package/lib/popconfirm.js +8 -8
  74. package/lib/popover.js +4558 -4456
  75. package/lib/progress.js +4 -4
  76. package/lib/qr-code.js +9 -9
  77. package/lib/qrcode-login.js +1650 -1593
  78. package/lib/radio-button.js +6 -6
  79. package/lib/radio-group.js +2192 -2139
  80. package/lib/radio.js +6 -6
  81. package/lib/rate.js +1225 -1127
  82. package/lib/row.js +2 -2
  83. package/lib/scrollbar.js +2687 -2589
  84. package/lib/select.js +6207 -6170
  85. package/lib/selector-panel.js +5289 -5236
  86. package/lib/selector.js +1764 -1711
  87. package/lib/slider.js +16 -16
  88. package/lib/step.js +35754 -2640
  89. package/lib/steps.js +1280 -1182
  90. package/lib/submenu.js +461 -457
  91. package/lib/switch.js +1009 -911
  92. package/lib/tab-pane.js +4 -4
  93. package/lib/table-column.js +2594 -2496
  94. package/lib/table.js +9210 -9224
  95. package/lib/tabs.js +2413 -2319
  96. package/lib/tag.js +4 -4
  97. package/lib/theme-chalk/account-login.css +1 -1
  98. package/lib/theme-chalk/autocomplete.css +1 -1
  99. package/lib/theme-chalk/base.css +1 -1
  100. package/lib/theme-chalk/cascader-panel.css +1 -1
  101. package/lib/theme-chalk/cascader.css +1 -1
  102. package/lib/theme-chalk/checkbox-group.css +1 -1
  103. package/lib/theme-chalk/date-picker.css +1 -1
  104. package/lib/theme-chalk/descriptions-item.css +1 -1
  105. package/lib/theme-chalk/descriptions.css +1 -1
  106. package/lib/theme-chalk/empty.css +1 -0
  107. package/lib/theme-chalk/flow.css +1 -1
  108. package/lib/theme-chalk/flows.css +1 -0
  109. package/lib/theme-chalk/fonts/iconfont.ttf +0 -0
  110. package/lib/theme-chalk/fonts/iconfont.woff +0 -0
  111. package/lib/theme-chalk/form.css +1 -1
  112. package/lib/theme-chalk/icon.css +1 -1
  113. package/lib/theme-chalk/index.css +1 -1
  114. package/lib/theme-chalk/input-number.css +1 -1
  115. package/lib/theme-chalk/input.css +1 -1
  116. package/lib/theme-chalk/login.css +1 -1
  117. package/lib/theme-chalk/lowcode.css +1 -0
  118. package/lib/theme-chalk/main.css +1 -1
  119. package/lib/theme-chalk/menu.css +1 -1
  120. package/lib/theme-chalk/message-box.css +1 -1
  121. package/lib/theme-chalk/message.css +1 -1
  122. package/lib/theme-chalk/notification.css +1 -1
  123. package/lib/theme-chalk/pagination.css +1 -1
  124. package/lib/theme-chalk/qrcode-login.css +1 -1
  125. package/lib/theme-chalk/scrollbar.css +1 -1
  126. package/lib/theme-chalk/select.css +1 -1
  127. package/lib/theme-chalk/selector-panel.css +1 -1
  128. package/lib/theme-chalk/selector.css +1 -1
  129. package/lib/theme-chalk/slider.css +1 -1
  130. package/lib/theme-chalk/table.css +1 -1
  131. package/lib/theme-chalk/tabs.css +1 -1
  132. package/lib/theme-chalk/time-picker.css +1 -1
  133. package/lib/theme-chalk/time-select.css +1 -1
  134. package/lib/theme-chalk/timeline-item.css +1 -1
  135. package/lib/theme-chalk/transfer.css +1 -1
  136. package/lib/theme-chalk/tree.css +1 -1
  137. package/lib/theme-chalk/upload.css +1 -1
  138. package/lib/time-picker.js +5819 -5815
  139. package/lib/time-select.js +3578 -3574
  140. package/lib/timeline-item.js +4 -4
  141. package/lib/timeline.js +4 -4
  142. package/lib/tips.js +1683 -1630
  143. package/lib/toolbar.js +213 -213
  144. package/lib/tooltip.js +4440 -4338
  145. package/lib/transfer.js +937 -839
  146. package/lib/tree-group.js +1925 -1807
  147. package/lib/tree.js +2630 -2577
  148. package/lib/upload.js +7262 -7209
  149. package/lib/utils/ajax.js +185 -243
  150. package/lib/utils/bus.js +2 -2
  151. package/lib/utils/popup/index.js +5 -1
  152. package/lib/utils/util.js +108 -11
  153. package/package.json +2 -2
  154. package/packages/button/src/button-group.vue +1 -4
  155. package/packages/carousel/src/carousel.vue +2 -2
  156. package/packages/collapse/src/collapse-item.vue +47 -33
  157. package/packages/dialog/src/dialog.vue +4 -1
  158. package/packages/drawer/src/drawer.vue +12 -4
  159. package/packages/empty/index.js +7 -0
  160. package/packages/empty/src/img-empty.vue +132 -0
  161. package/packages/empty/src/index.vue +49 -0
  162. package/packages/flow/index.js +4 -4
  163. package/packages/flow/src/component/FreeCirculation.vue +4 -3
  164. package/packages/flow/src/component/SendMsg.vue +2 -4
  165. package/packages/flow/src/component/opinions.vue +203 -226
  166. package/packages/flow/src/component/taskUnionExamine.vue +2 -4
  167. package/packages/flow/src/freeStartFlow.vue +2 -2
  168. package/packages/flow/src/selectUser.vue +36 -1
  169. package/packages/flow/src/supervise.vue +4 -2
  170. package/packages/flows/index.js +7 -0
  171. package/packages/flows/readme.md +600 -0
  172. package/packages/flows/src/components/basis.vue +108 -0
  173. package/packages/flows/src/components/distribute.vue +42 -0
  174. package/packages/flows/src/components/opinions-file.vue +123 -0
  175. package/packages/{flow-copy/src/component → flows/src/components}/opinions.vue +227 -204
  176. package/packages/flows/src/components/quick-actions.vue +64 -0
  177. package/packages/flows/src/components/reject.vue +83 -0
  178. package/packages/flows/src/components/start-flow.vue +210 -0
  179. package/packages/flows/src/flow.vue +510 -0
  180. package/packages/{flow/src/flow.vue → flows/src/flows.vue} +40 -1327
  181. package/packages/form/src/form-item-render.vue +16 -18
  182. package/packages/form/src/form-item.vue +9 -2
  183. package/packages/form/src/form.vue +27 -5
  184. package/packages/form/src/label-wrap.vue +4 -1
  185. package/packages/icons/src/icon.json +1 -1
  186. package/packages/login/src/login.vue +78 -51
  187. package/packages/login/src/mixins.js +2 -1
  188. package/packages/lowcode/index.js +5 -0
  189. package/packages/lowcode/src/aside.vue +331 -0
  190. package/packages/lowcode/src/attribute/bind.vue +441 -0
  191. package/packages/lowcode/src/attribute/dependency.vue +325 -0
  192. package/packages/lowcode/src/attribute/function.vue +112 -0
  193. package/packages/lowcode/src/attribute/property.vue +331 -0
  194. package/packages/lowcode/src/attribute/styles.vue +318 -0
  195. package/packages/lowcode/src/attribute.vue +135 -0
  196. package/packages/lowcode/src/canvas.vue +296 -0
  197. package/packages/lowcode/src/json.vue +32 -0
  198. package/packages/lowcode/src/lowcode.vue +640 -0
  199. package/packages/lowcode/src/modules.vue +93 -0
  200. package/packages/lowcode/src/pages.vue +111 -0
  201. package/packages/lowcode/src/render.vue +247 -0
  202. package/packages/lowcode/src/source.vue +32 -0
  203. package/packages/lowcode/src/toolbar.vue +147 -0
  204. package/packages/main/src/components/pages.vue +122 -64
  205. package/packages/main/src/components/router-page.vue +0 -2
  206. package/packages/main/src/components/set-menus.vue +3 -3
  207. package/packages/main/src/components/user.vue +6 -1
  208. package/packages/main/src/early.vue +2 -2
  209. package/packages/main/src/gzw.vue +57 -62
  210. package/packages/main/src/minxs.js +172 -75
  211. package/packages/pagination/src/pager.vue +2 -2
  212. package/packages/pagination/src/pagination.js +4 -1
  213. package/packages/qrcode-login/src/qrcode-login.vue +6 -2
  214. package/packages/select/src/select.vue +33 -6
  215. package/packages/steps/src/step.vue +7 -5
  216. package/packages/tabs/src/tab-nav.vue +1 -0
  217. package/packages/tabs/src/tabs.vue +0 -2
  218. package/packages/theme-chalk/dist/fonts/iconfont.ttf +0 -0
  219. package/packages/theme-chalk/dist/fonts/iconfont.woff +0 -0
  220. package/packages/theme-chalk/gulpfile.js +3 -0
  221. package/packages/theme-chalk/src/account-login.scss +1 -0
  222. package/packages/theme-chalk/src/base.scss +7 -1
  223. package/packages/theme-chalk/src/checkbox-group.scss +1 -0
  224. package/packages/theme-chalk/src/common/var.scss +17 -1
  225. package/packages/theme-chalk/src/empty.scss +45 -0
  226. package/packages/theme-chalk/src/flow.scss +7 -4
  227. package/packages/theme-chalk/src/flows.scss +141 -0
  228. package/packages/theme-chalk/src/fonts/iconfont.ttf +0 -0
  229. package/packages/theme-chalk/src/fonts/iconfont.woff +0 -0
  230. package/packages/theme-chalk/src/form.scss +2 -9
  231. package/packages/theme-chalk/src/icon.scss +30 -1
  232. package/packages/theme-chalk/src/index.scss +3 -0
  233. package/packages/theme-chalk/src/input-number.scss +0 -4
  234. package/packages/theme-chalk/src/input.scss +10 -0
  235. package/packages/theme-chalk/src/login.scss +32 -29
  236. package/packages/theme-chalk/src/lowcode.scss +461 -0
  237. package/packages/theme-chalk/src/main.scss +28 -65
  238. package/packages/theme-chalk/src/pagination.scss +4 -55
  239. package/packages/theme-chalk/src/qrcode-login.scss +3 -1
  240. package/packages/theme-chalk/src/select.scss +3 -1
  241. package/packages/theme-chalk/src/selector.scss +1 -1
  242. package/packages/theme-chalk/src/tabs.scss +81 -50
  243. package/src/config/api.js +13 -0
  244. package/src/index.js +20 -4
  245. package/src/utils/ajax.js +61 -65
  246. package/src/utils/bus.js +2 -2
  247. package/src/utils/popup/index.js +5 -1
  248. package/src/utils/util.js +104 -7
  249. package/lib/index_/345/211/257/346/234/254.js +0 -583
  250. package/packages/dialog copy/index.js +0 -8
  251. package/packages/dialog copy/src/dialog.vue +0 -615
  252. package/packages/flow/src/component/quick-actions.vue +0 -1168
  253. package/packages/flow-copy/index.js +0 -7
  254. package/packages/flow-copy/src/component/Circulate.vue +0 -452
  255. package/packages/flow-copy/src/component/CustomPreset.vue +0 -333
  256. package/packages/flow-copy/src/component/FreeCirculation.vue +0 -275
  257. package/packages/flow-copy/src/component/Preset.vue +0 -273
  258. package/packages/flow-copy/src/component/SendMsg.vue +0 -290
  259. package/packages/flow-copy/src/component/TimeLimit.vue +0 -205
  260. package/packages/flow-copy/src/component/taskUnionExamine.vue +0 -818
  261. package/packages/flow-copy/src/freeStartFlow.vue +0 -2912
  262. package/packages/flow-copy/src/processForm.vue +0 -1411
  263. package/packages/flow-copy/src/processReject.vue +0 -319
  264. package/packages/flow-copy/src/reset.vue +0 -944
  265. package/packages/flow-copy/src/selectUser.vue +0 -513
  266. package/packages/flow-copy/src/startTaskRead.vue +0 -723
  267. package/packages/flow-copy/src/supervise.vue +0 -182
  268. package/packages/flow-copy/src/table.vue +0 -65
  269. package/src/index_/345/211/257/346/234/254.js +0 -359
  270. /package/packages/{flow-copy → flow}/src/component/FileList.vue +0 -0
  271. /package/packages/{flow-copy → flow}/src/main.vue +0 -0
  272. /package/packages/{flow-copy/src → flows/src/components}/form.vue +0 -0
  273. /package/packages/{flow/src/component → flows/src/components}/message.vue +0 -0
  274. /package/packages/{flow/src/component → flows/src/components}/opinions-list.vue +0 -0
  275. /package/{packages/form/src → src/components}/field-render.vue +0 -0
@@ -0,0 +1,640 @@
1
+ <template>
2
+ <div class="es-lowcode">
3
+ <toolbar></toolbar>
4
+ <div class="es-lowcode__main">
5
+ <!-- 左侧菜单 -->
6
+ <Aside
7
+ :pages="pagesData"
8
+ :components="components"
9
+ :library="library"
10
+ :pagination="paginations"
11
+ />
12
+
13
+ <!-- 中间画布区域 -->
14
+ <Canvas :page="page" />
15
+ <!-- 右侧属性区域 -->
16
+ <Attribute :page="page" />
17
+ </div>
18
+ <es-dialog size="max" :title="open.title" :visible.sync="open.visible">
19
+ <Json :page="page" v-if="open.type === 'json'" />
20
+ <Source :page="page" v-else />
21
+ </es-dialog>
22
+ <es-dialog
23
+ title="信息完善"
24
+ width="600px"
25
+ height="380px"
26
+ :visible.sync="visible"
27
+ :close-on-click-modal="false"
28
+ >
29
+ <es-form :model="form" :rules="rules" ref="formRef" label-width="80px">
30
+ <es-form-item label="名称" prop="name">
31
+ <es-input v-model="form.name" placeholder="请输入名称" />
32
+ </es-form-item>
33
+ <es-form-item label="描述" prop="description">
34
+ <es-input
35
+ type="textarea"
36
+ v-model="form.description"
37
+ placeholder="请输入描述"
38
+ />
39
+ </es-form-item>
40
+ <es-form-item label="类型" prop="type">
41
+ <es-radio-group v-model="form.type">
42
+ <es-radio label="page">页面</es-radio>
43
+ <es-radio label="component">组件</es-radio>
44
+ </es-radio-group>
45
+ </es-form-item>
46
+ <es-form-item label="公开" prop="scopeType">
47
+ <es-radio-group v-model="form.scopeType">
48
+ <es-radio :label="0">是</es-radio>
49
+ <es-radio :label="3">否</es-radio>
50
+ </es-radio-group>
51
+ </es-form-item>
52
+ <div class="es-lowcode__aside--form-btn">
53
+ <es-button type="primary" @click="submitForm">确定</es-button>
54
+ </div>
55
+ </es-form>
56
+ </es-dialog>
57
+ <es-dialog
58
+ :title="publishTitle"
59
+ width="600px"
60
+ height="360px"
61
+ :visible.sync="publishVisible"
62
+ :close-on-click-modal="false"
63
+ >
64
+ <es-form :model="publishForm" ref="publishForm" label-width="80px">
65
+ <es-form-item label="发布类型">
66
+ <es-radio-group v-model="scopeType" :disabled="readonly">
67
+ <es-radio label="菜单">菜单</es-radio>
68
+ <es-radio label="应用">应用</es-radio>
69
+ </es-radio-group>
70
+ </es-form-item>
71
+ <es-form-item
72
+ :label="`${scopeType}名称`"
73
+ prop="name"
74
+ :disabled="readonly"
75
+ >
76
+ <es-input
77
+ v-model="publishForm.name"
78
+ :placeholder="`请输入${scopeType}名称`"
79
+ />
80
+ </es-form-item>
81
+ <es-form-item
82
+ :label="`${scopeType}地址`"
83
+ prop="url"
84
+ :disabled="readonly"
85
+ >
86
+ <es-input
87
+ v-model="publishForm.url"
88
+ :placeholder="`请输入${scopeType}地址`"
89
+ >
90
+ <template slot="append"
91
+ ><es-button @click.stop="copyUrl">复制</es-button></template
92
+ >
93
+ </es-input>
94
+ </es-form-item>
95
+ <es-form-item :label="`父${scopeType}`" prop="parentId">
96
+ <es-select
97
+ v-model="publishForm.parentId"
98
+ label-key="name"
99
+ value-key="id"
100
+ tree
101
+ :disabled="readonly"
102
+ :data="parentData"
103
+ :placeholder="`请选择父${scopeType}`"
104
+ ></es-select>
105
+ </es-form-item>
106
+ <div class="es-lowcode__aside--form-btn" v-show="!readonly">
107
+ <es-button type="primary" @click="submitPublishForm">确定</es-button>
108
+ </div>
109
+ </es-form>
110
+ </es-dialog>
111
+ </div>
112
+ </template>
113
+
114
+ <script>
115
+ import bus from 'eoss/src/utils/bus.js';
116
+ import Toolbar from './toolbar.vue';
117
+ import Aside from './aside.vue';
118
+ import Canvas from './canvas.vue';
119
+ import Attribute from './attribute.vue';
120
+ import Json from './json.vue';
121
+ import Source from './source.vue';
122
+ import Message from 'eoss/packages/message';
123
+ import { ajax } from 'eoss/src/utils/ajax';
124
+ import {
125
+ pageLists,
126
+ pageSave,
127
+ pageUpdate,
128
+ pageDelete
129
+ } from 'eoss/src/config/api.js';
130
+ import { loading } from 'eoss/src/utils/util';
131
+ export default {
132
+ name: 'EsLowcode',
133
+ provide() {
134
+ return {
135
+ lowcode: this
136
+ };
137
+ },
138
+ components: { Toolbar, Aside, Canvas, Attribute },
139
+
140
+ props: {
141
+ // url模式
142
+ urlMode: {
143
+ type: String,
144
+ required: true
145
+ },
146
+ // 页面列表
147
+ pages: {
148
+ type: Array,
149
+ default: () => []
150
+ },
151
+ // 组件库数据
152
+ components: {
153
+ type: Array,
154
+ default: () => []
155
+ },
156
+ // 组件库数据
157
+ library: {
158
+ type: Array,
159
+ default: () => []
160
+ },
161
+ // 分页信息
162
+ pagination: {
163
+ type: Object,
164
+ default: () => ({
165
+ total: 0,
166
+ currentPage: 1,
167
+ pageSize: 20
168
+ })
169
+ },
170
+ // 是否远程获取页面列表
171
+ remote: {
172
+ type: Boolean,
173
+ default: false
174
+ },
175
+ // 下一页方法
176
+ nextPage: Function,
177
+ // 上一页方法
178
+ prevPage: Function,
179
+ // 当前页方法
180
+ currentPage: Function,
181
+ // 保存方法
182
+ save: Function,
183
+ // 发布方法
184
+ publish: Function
185
+ },
186
+
187
+ data() {
188
+ return {
189
+ pagesData: this.pages,
190
+ paginations: this.pagination,
191
+ page: null,
192
+ open: {
193
+ title: '',
194
+ type: '',
195
+ visible: false
196
+ },
197
+ visible: false,
198
+ form: {
199
+ name: '',
200
+ title: '',
201
+ code: '',
202
+ description: '',
203
+ scopeType: 0
204
+ },
205
+ rules: {
206
+ name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
207
+ code: [{ required: true, message: '请输入编码', trigger: 'blur' }]
208
+ //title: [{ required: true, message: '请输入页面标题', trigger: 'blur' }],
209
+ //description: [
210
+ // { required: true, message: '请输入描述', trigger: 'blur' }
211
+ // ]
212
+ },
213
+ publishVisible: false,
214
+ publishTitle: '',
215
+ readonly: false,
216
+ scopeType: '菜单',
217
+ parentData: [],
218
+ publishForm: {
219
+ name: '',
220
+ code: '',
221
+ url: '',
222
+ parentId: ''
223
+ }
224
+ };
225
+ },
226
+
227
+ watch: {
228
+ pages: {
229
+ handler(val) {
230
+ this.pagesData = val;
231
+ }
232
+ },
233
+ pagination(val) {
234
+ this.paginations = val;
235
+ }
236
+ },
237
+
238
+ mounted() {
239
+ if (this.remote) {
240
+ this.getPageLists({
241
+ pageNum: this.paginations.currentPage,
242
+ pageSize: this.paginations.pageSize
243
+ });
244
+ }
245
+ // 下一页
246
+ bus.$on('nextPage', () => {
247
+ if (this.nextPage) {
248
+ this.nextPage(this.paginations);
249
+ } else {
250
+ this.getPageLists({
251
+ pageNum: this.paginations.currentPage + 1,
252
+ pageSize: this.paginations.pageSize
253
+ });
254
+ }
255
+ });
256
+ // 上一页
257
+ bus.$on('prevPage', () => {
258
+ if (this.prevPage) {
259
+ this.prevPage(this.paginations);
260
+ } else {
261
+ this.getPageLists({
262
+ pageNum: this.paginations.currentPage - 1,
263
+ pageSize: this.paginations.pageSize
264
+ });
265
+ }
266
+ });
267
+ // 当前页
268
+ bus.$on('currentPage', (pageNum) => {
269
+ if (this.currentPage) {
270
+ this.currentPage(pageNum);
271
+ } else {
272
+ this.getPageLists({
273
+ pageNum,
274
+ pageSize: this.paginations.pageSize
275
+ });
276
+ }
277
+ });
278
+ /** 添加页面 */
279
+ bus.$on('addPage', (page) => {
280
+ this.addPage(page);
281
+ });
282
+ /** 页面切换 */
283
+ bus.$on('selectPage', (page) => {
284
+ this.page = page;
285
+ });
286
+ /** 更新当前页面 */
287
+ bus.$on('updatePage', (page) => {
288
+ this.page = page;
289
+ });
290
+
291
+ /** 页面删除 */
292
+ bus.$on('removePage', (index) => {
293
+ this.removePage(index);
294
+ });
295
+
296
+ /** 组件/页面属性更新(来自 attribute 面板) */
297
+ bus.$on('updateComponent', (updates) => {
298
+ if (!this.page || !updates.id) return;
299
+ // 区分:修改的是页面本身还是子组件
300
+ if (this.page.id === updates.id) {
301
+ // 修改页面本身的属性(如 style、span 等)
302
+ Object.keys(updates).forEach((key) => {
303
+ if (key !== 'id') {
304
+ this.$set(this.page, key, updates[key]);
305
+ }
306
+ });
307
+ } else if (this.page.children) {
308
+ // 修改子组件属性
309
+ const index = this.page.children.findIndex((c) => c.id === updates.id);
310
+ if (index !== -1) {
311
+ const newComponent = { ...this.page.children[index], ...updates };
312
+ this.$set(this.page.children, index, newComponent);
313
+ }
314
+ }
315
+ });
316
+
317
+ /** 组件列表更新(来自 Canvas 拖拽操作) */
318
+ bus.$on('updateChildren', (children) => {
319
+ if (!this.page) return;
320
+ this.$set(this.page, 'children', children);
321
+ });
322
+
323
+ /** 显示JSON或源码 */
324
+ bus.$on('open', (type) => {
325
+ this.open.visible = true;
326
+ this.open.type = type;
327
+ this.open.title = type === 'json' ? 'JSON' : '源码';
328
+ });
329
+
330
+ /** 发布 */
331
+ bus.$on('publish', (index) => {
332
+ const page = this.pagesData[index];
333
+ if (page.id.startsWith('page_')) {
334
+ Message.warning('请先选择要保存的页面');
335
+ return;
336
+ }
337
+ this.publishTitle = page.status === 1 ? '查看' : '发布';
338
+ const url = this.urlMode?this.urlMode.replace('{id}',page.id):'';
339
+ this.readonly = page.status === 1;
340
+ this.publishForm = { name: page.name, pid: page.pid||'', url: url};
341
+ this.parentData = this.pagesData.filter((item) => item.type === 'page');
342
+ this.scopeType = page.code ? '应用' : '菜单';
343
+ this.publishVisible = true;
344
+ });
345
+
346
+ /** 保存 */
347
+ bus.$on('save', (index) => {
348
+ let page = this.page;
349
+ if (index !== undefined) {
350
+ page = this.pagesData[index];
351
+ } else if (!this.page) {
352
+ Message.warning('请先选择要发布的页面');
353
+ return;
354
+ }
355
+ const {
356
+ name,
357
+ title,
358
+ code,
359
+ description,
360
+ scopeType = 0,
361
+ type = 'page'
362
+ } = page;
363
+ this.form = { name, title, code, description, scopeType, type };
364
+ this.visible = true;
365
+ });
366
+ },
367
+
368
+ methods: {
369
+ getPageLists(params = {}) {
370
+ const loadingInstance = loading('加载中...');
371
+ ajax({
372
+ url: pageLists,
373
+ method: 'GET',
374
+ params: {
375
+ ...params,
376
+ type: 'page'
377
+ }
378
+ })
379
+ .then((res) => {
380
+ loadingInstance.close();
381
+ if (res.rCode === 0) {
382
+ this.paginations.total = res.results.pageCount;
383
+ this.paginations.currentPage = res.results.pageNum;
384
+ this.paginations.pageSize = res.results.pageSize;
385
+ const records = res.results.records || [];
386
+ this.pagesData = records.map((item) => {
387
+ const {
388
+ id,
389
+ code,
390
+ name,
391
+ title,
392
+ type,
393
+ description,
394
+ componentConfig,
395
+ layoutConfig,
396
+ status,
397
+ advancedConfig,
398
+ category,
399
+ versionType,
400
+ versionNo,
401
+ scopeType,
402
+ scopeValue,
403
+ content
404
+ } = item;
405
+ return {
406
+ id,
407
+ code,
408
+ name,
409
+ title,
410
+ type,
411
+ description,
412
+ componentConfig,
413
+ layoutConfig,
414
+ status,
415
+ advancedConfig,
416
+ category,
417
+ versionType,
418
+ versionNo,
419
+ scopeType,
420
+ scopeValue,
421
+ ...JSON.parse(content)
422
+ };
423
+ });
424
+ } else {
425
+ Message.error(res.msg || '获取页面列表失败');
426
+ }
427
+ })
428
+ .catch(() => {
429
+ loadingInstance.close();
430
+ });
431
+ },
432
+ /**
433
+ * 提取页面数据(分离元信息与内容)
434
+ * @returns {Object} 包含 meta(元信息)和 content(内容)的对象
435
+ */
436
+ extractPageData() {
437
+ const {
438
+ id,
439
+ name,
440
+ type,
441
+ description,
442
+ componentConfig,
443
+ layoutConfig,
444
+ status,
445
+ advancedConfig,
446
+ category,
447
+ versionType,
448
+ versionNo,
449
+ scopeType,
450
+ scopeValue,
451
+ ...content
452
+ } = this.page;
453
+
454
+ const meta = {
455
+ id,
456
+ name,
457
+ type,
458
+ description,
459
+ componentConfig,
460
+ layoutConfig,
461
+ advancedConfig,
462
+ category,
463
+ versionType,
464
+ versionNo,
465
+ scopeType,
466
+ scopeValue
467
+ };
468
+
469
+ return { meta, content };
470
+ },
471
+
472
+ /**
473
+ * 根据页面状态提交保存或更新
474
+ * @param {Object} extraData - 额外的合并数据(如表单数据)
475
+ */
476
+ submitPageData() {
477
+ const { meta, content } = this.extractPageData();
478
+ const data = {
479
+ status: 0,
480
+ ...meta,
481
+ content: JSON.stringify(content)
482
+ };
483
+
484
+ if (meta.status !== undefined) {
485
+ this.updatePage(data);
486
+ } else {
487
+ delete data.id;
488
+ this.savePage(data);
489
+ }
490
+ },
491
+ /**
492
+ * 添加页面
493
+ * @param {Object} page - 页面对象
494
+ */
495
+ addPage(page) {
496
+ this.pagesData.unshift(page);
497
+ this.$emit('page-add', page);
498
+ },
499
+ savePage(page) {
500
+ const loadingInstance = loading('保存中...');
501
+ ajax({
502
+ url: pageSave,
503
+ method: 'POST',
504
+ format: false,
505
+ data: page
506
+ })
507
+ .then((res) => {
508
+ loadingInstance.close();
509
+ if (res.code === 200) {
510
+ Message.success('保存成功');
511
+ this.$emit('page-save', page);
512
+ this.visible = false;
513
+ } else {
514
+ Message.error(res.msg || '保存失败');
515
+ }
516
+ })
517
+ .catch(() => {
518
+ loadingInstance.close();
519
+ });
520
+ },
521
+ updatePage(page) {
522
+ const loadingInstance = loading('保存中...');
523
+ ajax({
524
+ url: pageUpdate,
525
+ method: 'POST',
526
+ format: false,
527
+ data: page
528
+ })
529
+ .then((res) => {
530
+ loadingInstance.close();
531
+ if (res.code === 200) {
532
+ Message.success('更新成功');
533
+ this.$emit('page-update', page);
534
+ this.visible = false;
535
+ } else {
536
+ Message.error(res.msg || '更新失败');
537
+ }
538
+ })
539
+ .catch(() => {
540
+ loadingInstance.close();
541
+ });
542
+ },
543
+ /**
544
+ * 提交表单(发布页面时完善信息)
545
+ */
546
+ submitForm() {
547
+ this.$refs.formRef.validate((valid) => {
548
+ if (valid) {
549
+ this.submitPageData(this.form);
550
+ }
551
+ });
552
+ },
553
+ removePage(index) {
554
+ const page = this.pagesData[index];
555
+ if (page.id.startsWith('page_')) {
556
+ Message.success('删除成功');
557
+ this.pagesData.splice(index, 1);
558
+ return;
559
+ }
560
+ const loadingInstance = loading('删除中...');
561
+ ajax({
562
+ url: pageDelete,
563
+ method: 'POST',
564
+ format: false,
565
+ data: {
566
+ id: page.id
567
+ }
568
+ })
569
+ .then((res) => {
570
+ loadingInstance.close();
571
+ if (res.code === 200) {
572
+ Message.success('删除成功');
573
+ this.pagesData.splice(index, 1);
574
+ this.$emit('page-delete', page);
575
+ if (this.remote) {
576
+ this.getPagesList();
577
+ }
578
+ } else {
579
+ Message.error(res.msg || '删除失败');
580
+ }
581
+ })
582
+ .catch(() => {
583
+ loadingInstance.close();
584
+ });
585
+ },
586
+ /**
587
+ * 更新当前页面对象
588
+ * @param {Object} page - 页面对象
589
+ */
590
+ setCurrentPage(page) {
591
+ this.$set(this, 'page', { ...page });
592
+ this.$emit('update:page-update', { ...page });
593
+ },
594
+ /**
595
+ * 在 page 树中递归查找指定组件
596
+ * @param {Object} page - 页面对象
597
+ * @param {String} id - 组件 ID
598
+ * @returns {Object|null} 找到的组件对象
599
+ */
600
+ findComponent(page, id) {
601
+ if (!page || !page.children) return null;
602
+ for (const child of page.children) {
603
+ if (child.id === id) return child;
604
+ if (child.children && child.children.length) {
605
+ const found = this.findComponent(child, id);
606
+ if (found) return found;
607
+ }
608
+ }
609
+ return null;
610
+ },
611
+ /**
612
+ * 复制 URL 到剪贴板
613
+ */
614
+ copyUrl() {
615
+ navigator.clipboard.writeText(this.publishForm.url);
616
+ Message.success('复制成功');
617
+ },
618
+ /**
619
+ * 提交发布表单
620
+ */
621
+ submitPublishForm() {
622
+ this.$refs.publishForm.validate((valid) => {
623
+ if (valid) {
624
+ Message.warning('接口暂未开通,请复制地址手动创建菜单或应用');
625
+ //this.submitPageData(this.publishForm);
626
+ }
627
+ });
628
+ },
629
+ },
630
+ destroyed() {
631
+ // 移除所有事件监听器,防止内存泄漏
632
+ bus.$off('updatePage');
633
+ bus.$off('updateComponent');
634
+ bus.$off('updateChildren');
635
+ bus.$off('open');
636
+ bus.$off('save');
637
+ bus.$off('publish');
638
+ }
639
+ };
640
+ </script>