eoss 0.1.0-alpha.20 → 0.1.0-alpha.21

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 (207) hide show
  1. package/lib/account-login.js +1943 -1890
  2. package/lib/alert.js +4 -4
  3. package/lib/aside.js +4 -4
  4. package/lib/autocomplete.js +4936 -4834
  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 +2480 -2382
  13. package/lib/calendar.js +798 -798
  14. package/lib/card.js +4 -4
  15. package/lib/carousel-item.js +911 -813
  16. package/lib/carousel.js +1646 -1548
  17. package/lib/cascader-panel.js +2556 -2458
  18. package/lib/cascader.js +4546 -4444
  19. package/lib/checkbox-button.js +4 -4
  20. package/lib/checkbox-group.js +2894 -2841
  21. package/lib/checkbox.js +4 -4
  22. package/lib/col.js +2 -2
  23. package/lib/collapse-item.js +35159 -2572
  24. package/lib/collapse.js +35410 -2762
  25. package/lib/color-picker.js +494 -490
  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 +1895 -1842
  30. package/lib/date-picker.js +6422 -6320
  31. package/lib/dialog.js +2912 -2806
  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 +2270 -2172
  37. package/lib/email-login.js +1783 -1730
  38. package/lib/empty.js +723 -0
  39. package/lib/eoss.common.js +63680 -56193
  40. package/lib/flip.js +4 -4
  41. package/lib/flow-group.js +2985 -2887
  42. package/lib/flow.js +28067 -28022
  43. package/lib/footer.js +4 -4
  44. package/lib/form-item.js +1935 -1837
  45. package/lib/form.js +9230 -9092
  46. package/lib/header.js +4 -4
  47. package/lib/icon.js +1708 -1590
  48. package/lib/icons.js +4 -4
  49. package/lib/image-viewer.js +1660 -1562
  50. package/lib/image.js +162 -162
  51. package/lib/index.js +1 -1
  52. package/lib/infinite-scroll.js +76 -76
  53. package/lib/input-number.js +172 -172
  54. package/lib/input.js +1362 -1264
  55. package/lib/link.js +4 -4
  56. package/lib/loading.js +321 -317
  57. package/lib/login.js +3306 -3300
  58. package/lib/lowcode.js +13320 -0
  59. package/lib/main.js +14465 -14339
  60. package/lib/marquee.js +1237 -1139
  61. package/lib/menu-item-group.js +119 -119
  62. package/lib/menu-item.js +114 -114
  63. package/lib/menu.js +6193 -6091
  64. package/lib/message-box.js +3582 -3480
  65. package/lib/message.js +2265 -2163
  66. package/lib/notification.js +2430 -2328
  67. package/lib/option-group.js +4 -4
  68. package/lib/option.js +842 -744
  69. package/lib/page-header.js +4 -4
  70. package/lib/pagination.js +1916 -1815
  71. package/lib/phone-login.js +1788 -1735
  72. package/lib/popconfirm.js +8 -8
  73. package/lib/popover.js +4559 -4457
  74. package/lib/progress.js +4 -4
  75. package/lib/qr-code.js +9 -9
  76. package/lib/qrcode-login.js +1600 -1543
  77. package/lib/radio-button.js +6 -6
  78. package/lib/radio-group.js +2142 -2089
  79. package/lib/radio.js +6 -6
  80. package/lib/rate.js +1226 -1128
  81. package/lib/row.js +2 -2
  82. package/lib/scrollbar.js +2695 -2597
  83. package/lib/select.js +5985 -5961
  84. package/lib/selector-panel.js +5239 -5186
  85. package/lib/selector.js +1712 -1659
  86. package/lib/slider.js +16 -16
  87. package/lib/step.js +35836 -2736
  88. package/lib/steps.js +1281 -1183
  89. package/lib/submenu.js +461 -457
  90. package/lib/switch.js +1010 -912
  91. package/lib/tab-pane.js +4 -4
  92. package/lib/table-column.js +2595 -2497
  93. package/lib/table.js +9225 -9239
  94. package/lib/tabs.js +2414 -2320
  95. package/lib/tag.js +4 -4
  96. package/lib/theme-chalk/account-login.css +1 -1
  97. package/lib/theme-chalk/autocomplete.css +1 -1
  98. package/lib/theme-chalk/base.css +1 -1
  99. package/lib/theme-chalk/cascader.css +1 -1
  100. package/lib/theme-chalk/date-picker.css +1 -1
  101. package/lib/theme-chalk/empty.css +1 -0
  102. package/lib/theme-chalk/fonts/iconfont.ttf +0 -0
  103. package/lib/theme-chalk/fonts/iconfont.woff +0 -0
  104. package/lib/theme-chalk/form.css +1 -1
  105. package/lib/theme-chalk/icon.css +1 -1
  106. package/lib/theme-chalk/index.css +1 -1
  107. package/lib/theme-chalk/input-number.css +1 -1
  108. package/lib/theme-chalk/input.css +1 -1
  109. package/lib/theme-chalk/login.css +1 -1
  110. package/lib/theme-chalk/lowcode.css +1 -0
  111. package/lib/theme-chalk/main.css +1 -1
  112. package/lib/theme-chalk/message-box.css +1 -1
  113. package/lib/theme-chalk/pagination.css +1 -1
  114. package/lib/theme-chalk/qrcode-login.css +1 -1
  115. package/lib/theme-chalk/select.css +1 -1
  116. package/lib/theme-chalk/slider.css +1 -1
  117. package/lib/theme-chalk/tabs.css +1 -1
  118. package/lib/theme-chalk/time-picker.css +1 -1
  119. package/lib/theme-chalk/transfer.css +1 -1
  120. package/lib/time-picker.js +5823 -5819
  121. package/lib/time-select.js +3578 -3574
  122. package/lib/timeline-item.js +4 -4
  123. package/lib/timeline.js +4 -4
  124. package/lib/tips.js +1633 -1580
  125. package/lib/toolbar.js +213 -213
  126. package/lib/tooltip.js +4441 -4339
  127. package/lib/transfer.js +938 -840
  128. package/lib/tree-group.js +1875 -1757
  129. package/lib/tree.js +2626 -2573
  130. package/lib/upload.js +7209 -7156
  131. package/lib/utils/ajax.js +185 -243
  132. package/lib/utils/bus.js +2 -2
  133. package/lib/utils/popup/index.js +5 -1
  134. package/lib/utils/util.js +108 -11
  135. package/package.json +2 -2
  136. package/packages/button/src/button-group.vue +1 -4
  137. package/packages/collapse/src/collapse-item.vue +47 -33
  138. package/packages/dialog/src/dialog.vue +4 -1
  139. package/packages/drawer/src/drawer.vue +12 -4
  140. package/packages/empty/index.js +7 -0
  141. package/packages/empty/src/img-empty.vue +132 -0
  142. package/packages/empty/src/index.vue +49 -0
  143. package/packages/form/src/form-item-render.vue +16 -18
  144. package/packages/form/src/form.vue +27 -5
  145. package/packages/icons/src/icon.json +1 -1
  146. package/packages/login/src/login.vue +19 -21
  147. package/packages/login/src/mixins.js +2 -1
  148. package/packages/lowcode/index.js +5 -0
  149. package/packages/lowcode/src/aside.vue +331 -0
  150. package/packages/lowcode/src/attribute/bind.vue +441 -0
  151. package/packages/lowcode/src/attribute/dependency.vue +325 -0
  152. package/packages/lowcode/src/attribute/function.vue +112 -0
  153. package/packages/lowcode/src/attribute/property.vue +331 -0
  154. package/packages/lowcode/src/attribute/styles.vue +318 -0
  155. package/packages/lowcode/src/attribute.vue +135 -0
  156. package/packages/lowcode/src/canvas.vue +296 -0
  157. package/packages/lowcode/src/json.vue +32 -0
  158. package/packages/lowcode/src/lowcode.vue +539 -0
  159. package/packages/lowcode/src/modules.vue +93 -0
  160. package/packages/lowcode/src/pages.vue +91 -0
  161. package/packages/lowcode/src/render.vue +247 -0
  162. package/packages/lowcode/src/source.vue +32 -0
  163. package/packages/lowcode/src/toolbar.vue +162 -0
  164. package/packages/main/src/components/pages.vue +28 -2
  165. package/packages/main/src/components/set-menus.vue +3 -3
  166. package/packages/main/src/components/user.vue +6 -1
  167. package/packages/main/src/early.vue +2 -2
  168. package/packages/main/src/gzw.vue +55 -61
  169. package/packages/main/src/minxs.js +113 -36
  170. package/packages/pagination/src/pager.vue +2 -2
  171. package/packages/pagination/src/pagination.js +4 -1
  172. package/packages/qrcode-login/src/qrcode-login.vue +6 -2
  173. package/packages/select/src/select.vue +28 -6
  174. package/packages/steps/src/step.vue +7 -5
  175. package/packages/tabs/src/tab-nav.vue +1 -0
  176. package/packages/tabs/src/tabs.vue +0 -2
  177. package/packages/theme-chalk/dist/fonts/iconfont.ttf +0 -0
  178. package/packages/theme-chalk/dist/fonts/iconfont.woff +0 -0
  179. package/packages/theme-chalk/gulpfile.js +3 -0
  180. package/packages/theme-chalk/src/account-login.scss +1 -0
  181. package/packages/theme-chalk/src/base.scss +1 -1
  182. package/packages/theme-chalk/src/common/var.scss +16 -0
  183. package/packages/theme-chalk/src/empty.scss +45 -0
  184. package/packages/theme-chalk/src/fonts/iconfont.ttf +0 -0
  185. package/packages/theme-chalk/src/fonts/iconfont.woff +0 -0
  186. package/packages/theme-chalk/src/form.scss +1 -8
  187. package/packages/theme-chalk/src/icon.scss +30 -1
  188. package/packages/theme-chalk/src/index.scss +2 -0
  189. package/packages/theme-chalk/src/input-number.scss +0 -4
  190. package/packages/theme-chalk/src/input.scss +9 -0
  191. package/packages/theme-chalk/src/login.scss +32 -29
  192. package/packages/theme-chalk/src/lowcode.scss +461 -0
  193. package/packages/theme-chalk/src/main.scss +28 -65
  194. package/packages/theme-chalk/src/pagination.scss +4 -55
  195. package/packages/theme-chalk/src/qrcode-login.scss +3 -1
  196. package/packages/theme-chalk/src/tabs.scss +81 -50
  197. package/src/config/api.js +13 -0
  198. package/src/index.js +17 -4
  199. package/src/utils/ajax.js +61 -65
  200. package/src/utils/bus.js +2 -2
  201. package/src/utils/popup/index.js +5 -1
  202. package/src/utils/util.js +104 -7
  203. package/lib/index_/345/211/257/346/234/254.js +0 -583
  204. package/packages/dialog copy/index.js +0 -8
  205. package/packages/dialog copy/src/dialog.vue +0 -615
  206. package/src/index_/345/211/257/346/234/254.js +0 -359
  207. /package/{packages/form/src → src/components}/field-render.vue +0 -0
@@ -0,0 +1,539 @@
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="code">
31
+ <es-input v-model="form.code" placeholder="请输入编码" />
32
+ </es-form-item>
33
+ <es-form-item label="名称" prop="name">
34
+ <es-input v-model="form.name" placeholder="请输入名称" />
35
+ </es-form-item>
36
+ <es-form-item label="标题" prop="title">
37
+ <es-input v-model="form.title" placeholder="请输入页面标题" />
38
+ </es-form-item>
39
+ <es-form-item label="描述" prop="description">
40
+ <es-input
41
+ type="textarea"
42
+ v-model="form.description"
43
+ placeholder="请输入描述"
44
+ />
45
+ </es-form-item>
46
+ <div class="es-lowcode__aside--form-btn">
47
+ <es-button type="primary" @click="submitForm">确定</es-button>
48
+ </div>
49
+ </es-form>
50
+ </es-dialog>
51
+ </div>
52
+ </template>
53
+
54
+ <script>
55
+ import bus from 'eoss/src/utils/bus.js';
56
+ import Toolbar from './toolbar.vue';
57
+ import Aside from './aside.vue';
58
+ import Canvas from './canvas.vue';
59
+ import Attribute from './attribute.vue';
60
+ import Json from './json.vue';
61
+ import Source from './source.vue';
62
+ import Message from 'eoss/packages/message';
63
+ import { ajax } from 'eoss/src/utils/ajax';
64
+ import {
65
+ pageLists,
66
+ pageSave,
67
+ pageUpdate,
68
+ pageDelete
69
+ } from 'eoss/src/config/api.js';
70
+ import { loading } from 'eoss/src/utils/util';
71
+ export default {
72
+ name: 'EsLowcode',
73
+ provide() {
74
+ return {
75
+ lowcode: this
76
+ };
77
+ },
78
+ components: { Toolbar, Aside, Canvas, Attribute },
79
+
80
+ props: {
81
+ // 页面列表
82
+ pages: {
83
+ type: Array,
84
+ default: () => []
85
+ },
86
+ // 组件库数据
87
+ components: {
88
+ type: Array,
89
+ default: () => []
90
+ },
91
+ // 组件库数据
92
+ library: {
93
+ type: Array,
94
+ default: () => []
95
+ },
96
+ // 分页信息
97
+ pagination: {
98
+ type: Object,
99
+ default: () => ({
100
+ total: 0,
101
+ currentPage: 1,
102
+ pageSize: 20
103
+ })
104
+ },
105
+ // 是否远程获取页面列表
106
+ remote: {
107
+ type: Boolean,
108
+ default: false
109
+ },
110
+ // 下一页方法
111
+ nextPage: Function,
112
+ // 上一页方法
113
+ prevPage: Function,
114
+ // 当前页方法
115
+ currentPage: Function,
116
+ // 保存方法
117
+ save: Function,
118
+ // 发布方法
119
+ publish: Function
120
+ },
121
+
122
+ data() {
123
+ return {
124
+ pagesData: this.pages,
125
+ paginations: this.pagination,
126
+ page: null,
127
+ open: {
128
+ title: '',
129
+ type: '',
130
+ visible: false
131
+ },
132
+ visible: false,
133
+ form: {
134
+ name: '',
135
+ title: '',
136
+ code: '',
137
+ description: ''
138
+ },
139
+ rules: {
140
+ name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
141
+ code: [{ required: true, message: '请输入编码', trigger: 'blur' }]
142
+ //title: [{ required: true, message: '请输入页面标题', trigger: 'blur' }],
143
+ //description: [
144
+ // { required: true, message: '请输入描述', trigger: 'blur' }
145
+ // ]
146
+ }
147
+ };
148
+ },
149
+
150
+ watch: {
151
+ pages: {
152
+ handler(val) {
153
+ this.pagesData = val;
154
+ }
155
+ },
156
+ pagination(val) {
157
+ this.paginations = val;
158
+ }
159
+ },
160
+
161
+ mounted() {
162
+ if (this.remote) {
163
+ this.getPageLists({
164
+ pageNum: this.paginations.currentPage,
165
+ pageSize: this.paginations.pageSize
166
+ });
167
+ }
168
+ // 下一页
169
+ bus.$on('nextPage', () => {
170
+ if (this.nextPage) {
171
+ this.nextPage(this.paginations);
172
+ } else {
173
+ this.getPageLists({
174
+ pageNum: this.paginations.currentPage + 1,
175
+ pageSize: this.paginations.pageSize
176
+ });
177
+ }
178
+ });
179
+ // 上一页
180
+ bus.$on('prevPage', () => {
181
+ if (this.prevPage) {
182
+ this.prevPage(this.paginations);
183
+ } else {
184
+ this.getPageLists({
185
+ pageNum: this.paginations.currentPage - 1,
186
+ pageSize: this.paginations.pageSize
187
+ });
188
+ }
189
+ });
190
+ // 当前页
191
+ bus.$on('currentPage', (pageNum) => {
192
+ if (this.currentPage) {
193
+ this.currentPage(pageNum);
194
+ } else {
195
+ this.getPageLists({
196
+ pageNum,
197
+ pageSize: this.paginations.pageSize
198
+ });
199
+ }
200
+ });
201
+ /** 添加页面 */
202
+ bus.$on('addPage', (page) => {
203
+ this.addPage(page);
204
+ });
205
+ /** 页面切换 */
206
+ bus.$on('selectPage', (page) => {
207
+ this.page = page;
208
+ });
209
+ /** 更新当前页面 */
210
+ bus.$on('updatePage', (page) => {
211
+ this.page = page;
212
+ });
213
+
214
+ /** 页面删除 */
215
+ bus.$on('removePage', (index) => {
216
+ this.removePage(index);
217
+ });
218
+
219
+ /** 组件/页面属性更新(来自 attribute 面板) */
220
+ bus.$on('updateComponent', (updates) => {
221
+ if (!this.page || !updates.id) return;
222
+ // 区分:修改的是页面本身还是子组件
223
+ if (this.page.id === updates.id) {
224
+ // 修改页面本身的属性(如 style、span 等)
225
+ Object.keys(updates).forEach((key) => {
226
+ if (key !== 'id') {
227
+ this.$set(this.page, key, updates[key]);
228
+ }
229
+ });
230
+ } else if (this.page.children) {
231
+ // 修改子组件属性
232
+ const index = this.page.children.findIndex((c) => c.id === updates.id);
233
+ if (index !== -1) {
234
+ const newComponent = { ...this.page.children[index], ...updates };
235
+ this.$set(this.page.children, index, newComponent);
236
+ }
237
+ }
238
+ });
239
+
240
+ /** 组件列表更新(来自 Canvas 拖拽操作) */
241
+ bus.$on('updateChildren', (children) => {
242
+ if (!this.page) return;
243
+ this.$set(this.page, 'children', children);
244
+ });
245
+
246
+ /** 显示JSON或源码 */
247
+ bus.$on('open', (type) => {
248
+ this.open.visible = true;
249
+ this.open.type = type;
250
+ this.open.title = type === 'json' ? 'JSON' : '源码';
251
+ });
252
+ /** 保存 */
253
+ bus.$on('save', () => {
254
+ if (!this.page) {
255
+ Message.warning('请先选择要保存的页面');
256
+ return;
257
+ }
258
+ if (this.save) {
259
+ this.save(this.page);
260
+ return;
261
+ }
262
+ this.submitPageData();
263
+ });
264
+ /** 发布 */
265
+ bus.$on('publish', (genre) => {
266
+ if (!this.page) {
267
+ Message.warning('请先选择要发布的页面');
268
+ return;
269
+ }
270
+ this.page.type = genre;
271
+ if (genre === 'page') {
272
+ const { name, title, code, description } = this.page;
273
+ this.form = { name, title, code, description };
274
+ this.visible = true;
275
+ } else {
276
+ if (this.publish) {
277
+ this.publish(this.page);
278
+ return;
279
+ }
280
+ this.submitPageData({ status: 1 });
281
+ }
282
+ });
283
+ },
284
+
285
+ methods: {
286
+ getPageLists(params = {}) {
287
+ const loadingInstance = loading('加载中...');
288
+ ajax({
289
+ url: pageLists,
290
+ method: 'GET',
291
+ params: {
292
+ ...params,
293
+ type: 'page'
294
+ }
295
+ })
296
+ .then((res) => {
297
+ loadingInstance.close();
298
+ if (res.rCode === 0) {
299
+ this.paginations.total = res.results.pageCount;
300
+ this.paginations.currentPage = res.results.pageNum;
301
+ this.paginations.pageSize = res.results.pageSize;
302
+ const records = res.results.records || [];
303
+ this.pagesData = records.map((item) => {
304
+ const {
305
+ id,
306
+ code,
307
+ name,
308
+ title,
309
+ type,
310
+ description,
311
+ componentConfig,
312
+ layoutConfig,
313
+ status,
314
+ advancedConfig,
315
+ category,
316
+ versionType,
317
+ versionNo,
318
+ scopeType,
319
+ scopeValue,
320
+ content
321
+ } = item;
322
+ return {
323
+ id,
324
+ code,
325
+ name,
326
+ title,
327
+ type,
328
+ description,
329
+ componentConfig,
330
+ layoutConfig,
331
+ status,
332
+ advancedConfig,
333
+ category,
334
+ versionType,
335
+ versionNo,
336
+ scopeType,
337
+ scopeValue,
338
+ ...JSON.parse(content)
339
+ };
340
+ });
341
+ } else {
342
+ Message.error(res.msg || '获取页面列表失败');
343
+ }
344
+ })
345
+ .catch(() => {
346
+ loadingInstance.close();
347
+ });
348
+ },
349
+ /**
350
+ * 提取页面数据(分离元信息与内容)
351
+ * @returns {Object} 包含 meta(元信息)和 content(内容)的对象
352
+ */
353
+ extractPageData() {
354
+ const {
355
+ id,
356
+ code,
357
+ name,
358
+ title,
359
+ type,
360
+ description,
361
+ componentConfig,
362
+ layoutConfig,
363
+ status,
364
+ advancedConfig,
365
+ category,
366
+ versionType,
367
+ versionNo,
368
+ scopeType,
369
+ scopeValue,
370
+ ...content
371
+ } = this.page;
372
+
373
+ const meta = {
374
+ id,
375
+ code,
376
+ name,
377
+ title,
378
+ type,
379
+ description,
380
+ componentConfig,
381
+ layoutConfig,
382
+ advancedConfig,
383
+ category,
384
+ versionType,
385
+ versionNo,
386
+ scopeType,
387
+ scopeValue
388
+ };
389
+
390
+ return { meta, content };
391
+ },
392
+
393
+ /**
394
+ * 根据页面状态提交保存或更新
395
+ * @param {Object} extraData - 额外的合并数据(如表单数据)
396
+ */
397
+ submitPageData(extraData = {}) {
398
+ const { meta, content } = this.extractPageData();
399
+ const data = {
400
+ ...meta,
401
+ content: JSON.stringify(content),
402
+ ...extraData
403
+ };
404
+
405
+ // 根据是否有 id 判断是更新还是新建
406
+ if (meta.status !== undefined) {
407
+ this.updatePage(data);
408
+ } else {
409
+ delete data.id;
410
+ this.savePage(data);
411
+ }
412
+ },
413
+ /**
414
+ * 添加页面
415
+ * @param {Object} page - 页面对象
416
+ */
417
+ addPage(page) {
418
+ this.pagesData.unshift(page);
419
+ this.$emit('page-add', page);
420
+ },
421
+ savePage(page) {
422
+ const loadingInstance = loading('保存中...');
423
+ ajax({
424
+ url: pageSave,
425
+ method: 'POST',
426
+ format: false,
427
+ data: page
428
+ })
429
+ .then((res) => {
430
+ loadingInstance.close();
431
+ if (res.code === 200) {
432
+ Message.success('保存成功');
433
+ this.$emit('page-save', page);
434
+ this.visible = false;
435
+ } else {
436
+ Message.error(res.msg || '保存失败');
437
+ }
438
+ })
439
+ .catch(() => {
440
+ loadingInstance.close();
441
+ });
442
+ },
443
+ updatePage(page) {
444
+ const loadingInstance = loading('保存中...');
445
+ ajax({
446
+ url: pageUpdate,
447
+ method: 'POST',
448
+ format: false,
449
+ data: page
450
+ })
451
+ .then((res) => {
452
+ loadingInstance.close();
453
+ if (res.code === 200) {
454
+ Message.success('更新成功');
455
+ this.$emit('page-update', page);
456
+ this.visible = false;
457
+ } else {
458
+ Message.error(res.msg || '更新失败');
459
+ }
460
+ })
461
+ .catch(() => {
462
+ loadingInstance.close();
463
+ });
464
+ },
465
+ /**
466
+ * 提交表单(发布页面时完善信息)
467
+ */
468
+ submitForm() {
469
+ this.$refs.formRef.validate((valid) => {
470
+ if (valid) {
471
+ this.submitPageData(this.form);
472
+ }
473
+ });
474
+ },
475
+ removePage(index) {
476
+ const page = this.pagesData[index];
477
+ const loadingInstance = loading('删除中...');
478
+ ajax({
479
+ url: pageDelete,
480
+ method: 'POST',
481
+ format: false,
482
+ data: {
483
+ id: page.id
484
+ }
485
+ })
486
+ .then((res) => {
487
+ loadingInstance.close();
488
+ if (res.code === 200) {
489
+ Message.success('删除成功');
490
+ this.pagesData.splice(index, 1);
491
+ this.$emit('page-delete', page);
492
+ if (this.remote) {
493
+ this.getPagesList();
494
+ }
495
+ } else {
496
+ Message.error(res.msg || '删除失败');
497
+ }
498
+ })
499
+ .catch(() => {
500
+ loadingInstance.close();
501
+ });
502
+ },
503
+ /**
504
+ * 更新当前页面对象
505
+ * @param {Object} page - 页面对象
506
+ */
507
+ setCurrentPage(page) {
508
+ this.$set(this, 'page', { ...page });
509
+ this.$emit('update:page-update', { ...page });
510
+ },
511
+ /**
512
+ * 在 page 树中递归查找指定组件
513
+ * @param {Object} page - 页面对象
514
+ * @param {String} id - 组件 ID
515
+ * @returns {Object|null} 找到的组件对象
516
+ */
517
+ findComponent(page, id) {
518
+ if (!page || !page.children) return null;
519
+ for (const child of page.children) {
520
+ if (child.id === id) return child;
521
+ if (child.children && child.children.length) {
522
+ const found = this.findComponent(child, id);
523
+ if (found) return found;
524
+ }
525
+ }
526
+ return null;
527
+ }
528
+ },
529
+ destroyed() {
530
+ // 移除所有事件监听器,防止内存泄漏
531
+ bus.$off('updatePage');
532
+ bus.$off('updateComponent');
533
+ bus.$off('updateChildren');
534
+ bus.$off('open');
535
+ bus.$off('save');
536
+ bus.$off('publish');
537
+ }
538
+ };
539
+ </script>
@@ -0,0 +1,93 @@
1
+ <template>
2
+ <es-tabs class="es-lowcode__modules" v-model="active">
3
+ <es-tab-pane
4
+ :label="items.label"
5
+ :name="String(index)"
6
+ lazy
7
+ v-for="(items, index) in contents"
8
+ :key="items.name"
9
+ >
10
+ <es-collapse
11
+ v-model="actives"
12
+ v-show="items.children.length"
13
+ v-if="items.collapse"
14
+ >
15
+ <es-collapse-item
16
+ :title="item.label"
17
+ class="es-lowcode__modules--content"
18
+ v-for="item in items.children"
19
+ :name="item.name"
20
+ :key="item.name"
21
+ >
22
+ <div
23
+ class="es-lowcode__modules--item"
24
+ v-for="ele in item.children"
25
+ :key="ele.name"
26
+ draggable="true"
27
+ @dragstart="handleDragStart($event, ele)"
28
+ >
29
+ <span class="es-lowcode__modules--item-dom">{{ ele.name }}</span>
30
+ <span class="es-lowcode__modules--item-desc">{{
31
+ ele.description
32
+ }}</span>
33
+ </div>
34
+ </es-collapse-item>
35
+ </es-collapse>
36
+ <div v-else class="es-lowcode__modules--contents">
37
+ <div
38
+ class="es-lowcode__modules--item"
39
+ v-for="ele in items.children"
40
+ :key="ele.name"
41
+ draggable="true"
42
+ @dragstart="handleDragStart($event, ele)"
43
+ >
44
+ <span class="es-lowcode__modules--item-dom">{{ ele.name }}</span>
45
+ <span class="es-lowcode__modules--item-desc">{{
46
+ ele.description
47
+ }}</span>
48
+ </div>
49
+ </div>
50
+ </es-tab-pane>
51
+ </es-tabs>
52
+ </template>
53
+ <script>
54
+ export default {
55
+ name: 'Modules',
56
+ props: {
57
+ contents: {
58
+ type: Array,
59
+ default: () => []
60
+ }
61
+ },
62
+ data() {
63
+ return {
64
+ active: '0'
65
+ };
66
+ },
67
+ computed: {
68
+ actives() {
69
+ const content = this.contents[Number(this.active)];
70
+ return (
71
+ (content &&
72
+ content.children &&
73
+ content.children.map((item) => item.name)) ||
74
+ []
75
+ );
76
+ }
77
+ },
78
+ methods: {
79
+ /**
80
+ * 处理拖动开始事件
81
+ * @param event 拖动事件对象
82
+ * @param ele 被拖动的组件信息
83
+ */
84
+ handleDragStart(event, ele) {
85
+ if (event.dataTransfer) {
86
+ event.dataTransfer.setData('component', JSON.stringify(ele));
87
+ }
88
+ }
89
+ },
90
+ mounted() {
91
+ }
92
+ };
93
+ </script>
@@ -0,0 +1,91 @@
1
+ <template>
2
+ <div class="es-lowcode__pages">
3
+ <es-scrollbar :class="{'is-page':paginations.total > paginations.pageSize}">
4
+ <div
5
+ v-for="(page, index) in pages"
6
+ :key="page.id"
7
+ @click="handleSelect(page)"
8
+ class="es-lowcode__pages--item"
9
+ :class="{ 'is-active': active === page.id }"
10
+ >
11
+ <span class="es-lowcode__pages--item-name">{{
12
+ page.name || page.id
13
+ }}</span>
14
+ <i
15
+ class="es-icon-shanchu es-lowcode__pages--item-delete"
16
+ @click.stop="handleDelete(index)"
17
+ ></i>
18
+ </div>
19
+ </es-scrollbar>
20
+ <es-pagination
21
+ layout="prev, pager, next"
22
+ :hide-on-single-page="true"
23
+ :background="false"
24
+ v-bind="paginations"
25
+ >
26
+ </es-pagination>
27
+ </div>
28
+ </template>
29
+ <script>
30
+ import bus from 'eoss/src/utils/bus.js';
31
+ export default {
32
+ name: 'Pages',
33
+ inject: ['lowcode'],
34
+ props: {
35
+ pages: {
36
+ type: Array,
37
+ default: () => []
38
+ }
39
+ },
40
+ data() {
41
+ return {
42
+ active: ''
43
+ };
44
+ },
45
+ computed: {
46
+ paginations() {
47
+ return this.lowcode.paginations;
48
+ }
49
+ },
50
+ watch: {
51
+ pages: {
52
+ handler(newPages) {
53
+ this.active = (newPages[0] && newPages[0].id) || '';
54
+ // 延迟发送事件,确保父组件监听器已注册
55
+ this.active && this.$nextTick(() => this.handleSelect(newPages[0]));
56
+ },
57
+ immediate: true
58
+ }
59
+ },
60
+ mounted() {
61
+ },
62
+ methods: {
63
+ /**
64
+ * 处理页面选择事件
65
+ * @param page 页面对象
66
+ */
67
+ handleSelect(page) {
68
+ const pageList = localStorage.getItem('pageList');
69
+ if (pageList) {
70
+ this.$message.warning('请先保存当前页面');
71
+ return;
72
+ }
73
+ this.active = page.id;
74
+ bus.$emit('selectPage', page);
75
+ },
76
+ /**
77
+ * 处理页面删除事件
78
+ * @param index 页面索引
79
+ */
80
+ handleDelete(index) {
81
+ this.$confirm('确定删除该页面吗?', '提示', {
82
+ confirmButtonText: '确定',
83
+ cancelButtonText: '取消',
84
+ type: 'warning'
85
+ }).then(() => {
86
+ bus.$emit('removePage', index);
87
+ });
88
+ }
89
+ }
90
+ };
91
+ </script>