Showing
4 changed files
with
118 additions
and
18 deletions
@@ -97,7 +97,8 @@ import { | @@ -97,7 +97,8 @@ import { | ||
97 | Carbon3DSoftware as Carbon3DSoftwareIcon, | 97 | Carbon3DSoftware as Carbon3DSoftwareIcon, |
98 | Filter as FilterIcon, | 98 | Filter as FilterIcon, |
99 | FilterEdit as FilterEditIcon, | 99 | FilterEdit as FilterEditIcon, |
100 | - Laptop as LaptopIcon | 100 | + Laptop as LaptopIcon, |
101 | + Save as SaveIcon | ||
101 | } from '@vicons/carbon' | 102 | } from '@vicons/carbon' |
102 | 103 | ||
103 | const ionicons5 = { | 104 | const ionicons5 = { |
@@ -231,7 +232,7 @@ const ionicons5 = { | @@ -231,7 +232,7 @@ const ionicons5 = { | ||
231 | // 眼睛 | 232 | // 眼睛 |
232 | EyeOutlineIcon, | 233 | EyeOutlineIcon, |
233 | EyeOffOutlineIcon, | 234 | EyeOffOutlineIcon, |
234 | - // 图表列表 | 235 | + // 图表列表 |
235 | AlbumsIcon | 236 | AlbumsIcon |
236 | } | 237 | } |
237 | 238 | ||
@@ -285,7 +286,9 @@ const carbon = { | @@ -285,7 +286,9 @@ const carbon = { | ||
285 | FilterIcon, | 286 | FilterIcon, |
286 | FilterEditIcon, | 287 | FilterEditIcon, |
287 | // 图层 | 288 | // 图层 |
288 | - LaptopIcon | 289 | + LaptopIcon, |
290 | + // 保存 | ||
291 | + SaveIcon | ||
289 | } | 292 | } |
290 | 293 | ||
291 | // https://www.xicons.org/#/ 还有很多 | 294 | // https://www.xicons.org/#/ 还有很多 |
@@ -6,10 +6,10 @@ import designColor from './designColor.json' | @@ -6,10 +6,10 @@ import designColor from './designColor.json' | ||
6 | export const lang = LangEnum.ZH | 6 | export const lang = LangEnum.ZH |
7 | 7 | ||
8 | // 水印文字 | 8 | // 水印文字 |
9 | -export const watermarkText = "GoView 低代码平台" | 9 | +export const watermarkText = 'GoView 低代码平台' |
10 | 10 | ||
11 | // 分组名称 | 11 | // 分组名称 |
12 | -export const groupTitle = "分组" | 12 | +export const groupTitle = '分组' |
13 | 13 | ||
14 | // 主题配置 | 14 | // 主题配置 |
15 | export const theme = { | 15 | export const theme = { |
@@ -17,7 +17,7 @@ export const theme = { | @@ -17,7 +17,7 @@ export const theme = { | ||
17 | darkTheme: false, | 17 | darkTheme: false, |
18 | //默认主题色 | 18 | //默认主题色 |
19 | appTheme: '#51d6a9', | 19 | appTheme: '#51d6a9', |
20 | - appThemeDetail: null, | 20 | + appThemeDetail: null |
21 | } | 21 | } |
22 | 22 | ||
23 | // 图表初始配置(px) | 23 | // 图表初始配置(px) |
@@ -28,7 +28,7 @@ export const chartInitConfig = { | @@ -28,7 +28,7 @@ export const chartInitConfig = { | ||
28 | h: 300, | 28 | h: 300, |
29 | // 不建议动 offset | 29 | // 不建议动 offset |
30 | offsetX: 0, | 30 | offsetX: 0, |
31 | - offsetY: 0, | 31 | + offsetY: 0 |
32 | } | 32 | } |
33 | 33 | ||
34 | // dialog 图标的大小 | 34 | // dialog 图标的大小 |
@@ -72,3 +72,6 @@ export const canvasModelIndex = 9999 | @@ -72,3 +72,6 @@ export const canvasModelIndex = 9999 | ||
72 | 72 | ||
73 | // 框选时蒙层的 z-index,需比所有图表高 | 73 | // 框选时蒙层的 z-index,需比所有图表高 |
74 | export const selectBoxIndex = canvasModelIndex + 10 | 74 | export const selectBoxIndex = canvasModelIndex + 10 |
75 | + | ||
76 | +// 工作台自动保存间隔(s) | ||
77 | +export const saveInterval = 120 |
@@ -29,6 +29,22 @@ | @@ -29,6 +29,22 @@ | ||
29 | </template> | 29 | </template> |
30 | <span>{{ item.title }}</span> | 30 | <span>{{ item.title }}</span> |
31 | </n-tooltip> | 31 | </n-tooltip> |
32 | + <n-divider vertical /> | ||
33 | + <!-- 保存 --> | ||
34 | + <n-tooltip placement="bottom" trigger="hover"> | ||
35 | + <template #trigger> | ||
36 | + <div class="save-btn"> | ||
37 | + <n-button size="small" type="primary" ghost @click="dataSyncUpdate()"> | ||
38 | + <template #icon> | ||
39 | + <n-icon> | ||
40 | + <SaveIcon></SaveIcon> | ||
41 | + </n-icon> | ||
42 | + </template> | ||
43 | + </n-button> | ||
44 | + </div> | ||
45 | + </template> | ||
46 | + <span>保存</span> | ||
47 | + </n-tooltip> | ||
32 | </n-space> | 48 | </n-space> |
33 | </n-space> | 49 | </n-space> |
34 | </template> | 50 | </template> |
@@ -43,12 +59,14 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore | @@ -43,12 +59,14 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore | ||
43 | 59 | ||
44 | import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore' | 60 | import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore' |
45 | import { HistoryStackEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d' | 61 | import { HistoryStackEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d' |
46 | - | 62 | +import { useSync } from '../../hooks/useSync.hook' |
47 | import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore' | 63 | import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore' |
48 | import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' | 64 | import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' |
49 | 65 | ||
50 | const { LayersIcon, BarChartIcon, PrismIcon, HomeIcon, ArrowBackIcon, ArrowForwardIcon } = icon.ionicons5 | 66 | const { LayersIcon, BarChartIcon, PrismIcon, HomeIcon, ArrowBackIcon, ArrowForwardIcon } = icon.ionicons5 |
67 | +const { SaveIcon } = icon.carbon | ||
51 | const { setItem } = useChartLayoutStore() | 68 | const { setItem } = useChartLayoutStore() |
69 | +const { dataSyncUpdate } = useSync() | ||
52 | const { getLayers, getCharts, getDetails } = toRefs(useChartLayoutStore()) | 70 | const { getLayers, getCharts, getDetails } = toRefs(useChartLayoutStore()) |
53 | const chartEditStore = useChartEditStore() | 71 | const chartEditStore = useChartEditStore() |
54 | const chartHistoryStore = useChartHistoryStore() | 72 | const chartHistoryStore = useChartHistoryStore() |
@@ -81,9 +99,9 @@ const btnList = reactive<ItemType<ChartLayoutStoreEnum>[]>([ | @@ -81,9 +99,9 @@ const btnList = reactive<ItemType<ChartLayoutStoreEnum>[]>([ | ||
81 | } | 99 | } |
82 | ]) | 100 | ]) |
83 | 101 | ||
84 | -const isBackStack = computed(()=> chartHistoryStore.getBackStack.length> 1) | 102 | +const isBackStack = computed(() => chartHistoryStore.getBackStack.length > 1) |
85 | 103 | ||
86 | -const isForwardStack = computed(()=> chartHistoryStore.getForwardStack.length> 0) | 104 | +const isForwardStack = computed(() => chartHistoryStore.getForwardStack.length > 0) |
87 | 105 | ||
88 | const historyList = reactive<ItemType<HistoryStackEnum>[]>([ | 106 | const historyList = reactive<ItemType<HistoryStackEnum>[]>([ |
89 | { | 107 | { |
@@ -101,7 +119,6 @@ const historyList = reactive<ItemType<HistoryStackEnum>[]>([ | @@ -101,7 +119,6 @@ const historyList = reactive<ItemType<HistoryStackEnum>[]>([ | ||
101 | } | 119 | } |
102 | ]) | 120 | ]) |
103 | 121 | ||
104 | - | ||
105 | // store 描述的是展示的值,所以和 ContentConfigurations 的 collapsed 是相反的 | 122 | // store 描述的是展示的值,所以和 ContentConfigurations 的 collapsed 是相反的 |
106 | const styleHandle = (item: ItemType<ChartLayoutStoreEnum>) => { | 123 | const styleHandle = (item: ItemType<ChartLayoutStoreEnum>) => { |
107 | if (item.key === ChartLayoutStoreEnum.DETAILS) { | 124 | if (item.key === ChartLayoutStoreEnum.DETAILS) { |
@@ -120,10 +137,10 @@ const clickHistoryHandle = (item: ItemType<HistoryStackEnum>) => { | @@ -120,10 +137,10 @@ const clickHistoryHandle = (item: ItemType<HistoryStackEnum>) => { | ||
120 | switch (item.key) { | 137 | switch (item.key) { |
121 | case HistoryStackEnum.BACK_STACK: | 138 | case HistoryStackEnum.BACK_STACK: |
122 | chartEditStore.setBack() | 139 | chartEditStore.setBack() |
123 | - break; | 140 | + break |
124 | case HistoryStackEnum.FORWARD_STACK: | 141 | case HistoryStackEnum.FORWARD_STACK: |
125 | chartEditStore.setForward() | 142 | chartEditStore.setForward() |
126 | - break; | 143 | + break |
127 | } | 144 | } |
128 | } | 145 | } |
129 | 146 | ||
@@ -142,5 +159,5 @@ const goHomeHandle = () => { | @@ -142,5 +159,5 @@ const goHomeHandle = () => { | ||
142 | <style lang="scss" scoped> | 159 | <style lang="scss" scoped> |
143 | .header-left-btn { | 160 | .header-left-btn { |
144 | margin-left: -37px; | 161 | margin-left: -37px; |
145 | - } | 162 | +} |
146 | </style> | 163 | </style> |
1 | -import { getUUID } from '@/utils' | 1 | +import { getUUID, fetchRouteParamsLocation } from '@/utils' |
2 | import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' | 2 | import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' |
3 | import { ChartEditStoreEnum, ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d' | 3 | import { ChartEditStoreEnum, ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d' |
4 | import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore' | 4 | import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore' |
@@ -9,6 +9,10 @@ import { CreateComponentType, CreateComponentGroupType } from '@/packages/index. | @@ -9,6 +9,10 @@ import { CreateComponentType, CreateComponentGroupType } from '@/packages/index. | ||
9 | import { BaseEvent, EventLife } from '@/enums/eventEnum' | 9 | import { BaseEvent, EventLife } from '@/enums/eventEnum' |
10 | import { PublicGroupConfigClass } from '@/packages/public/publicConfig' | 10 | import { PublicGroupConfigClass } from '@/packages/public/publicConfig' |
11 | import merge from 'lodash/merge' | 11 | import merge from 'lodash/merge' |
12 | +import { onUnmounted } from 'vue' | ||
13 | +import { saveInterval } from '@/settings/designSetting' | ||
14 | +import throttle from 'lodash/throttle' | ||
15 | +import html2canvas from 'html2canvas' | ||
12 | 16 | ||
13 | /** | 17 | /** |
14 | * * 画布-版本升级对旧数据无法兼容的补丁 | 18 | * * 画布-版本升级对旧数据无法兼容的补丁 |
@@ -116,7 +120,7 @@ export const useSync = () => { | @@ -116,7 +120,7 @@ export const useSync = () => { | ||
116 | } | 120 | } |
117 | 121 | ||
118 | if (e.isGroup) { | 122 | if (e.isGroup) { |
119 | - (e as CreateComponentGroupType).groupList.forEach(groupItem => { | 123 | + ;(e as CreateComponentGroupType).groupList.forEach(groupItem => { |
120 | intComponent(groupItem) | 124 | intComponent(groupItem) |
121 | }) | 125 | }) |
122 | } else { | 126 | } else { |
@@ -155,7 +159,7 @@ export const useSync = () => { | @@ -155,7 +159,7 @@ export const useSync = () => { | ||
155 | // 组件 | 159 | // 组件 |
156 | if (key === ChartEditStoreEnum.COMPONENT_LIST) { | 160 | if (key === ChartEditStoreEnum.COMPONENT_LIST) { |
157 | let loadIndex = 0 | 161 | let loadIndex = 0 |
158 | - const listLength = projectData[key].length; | 162 | + const listLength = projectData[key].length |
159 | for (const comItem of projectData[key]) { | 163 | for (const comItem of projectData[key]) { |
160 | // 设置加载数量 | 164 | // 设置加载数量 |
161 | let percentage = parseInt((parseFloat(`${++loadIndex / listLength}`) * 100).toString()) | 165 | let percentage = parseInt((parseFloat(`${++loadIndex / listLength}`) * 100).toString()) |
@@ -196,7 +200,80 @@ export const useSync = () => { | @@ -196,7 +200,80 @@ export const useSync = () => { | ||
196 | chartLayoutStore.setItemUnHandle(ChartLayoutStoreEnum.PERCENTAGE, 0) | 200 | chartLayoutStore.setItemUnHandle(ChartLayoutStoreEnum.PERCENTAGE, 0) |
197 | } | 201 | } |
198 | 202 | ||
203 | + // 数据保存 | ||
204 | + const dataSyncUpdate = throttle(async (updateImg = true) => { | ||
205 | + if (!fetchRouteParamsLocation()) return | ||
206 | + window['$message'].success('保存成功!') | ||
207 | + // let projectId = chartEditStore.getProjectInfo[ProjectInfoEnum.PROJECT_ID] | ||
208 | + // if (projectId === null || projectId === '') { | ||
209 | + // window['$message'].error('数据初未始化成功,请刷新页面!') | ||
210 | + // return | ||
211 | + // } | ||
212 | + | ||
213 | + // chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.START) | ||
214 | + | ||
215 | + // 异常处理:缩略图上传失败不影响JSON的保存 | ||
216 | + try { | ||
217 | + if (updateImg) { | ||
218 | + // 获取缩略图片 | ||
219 | + const range = document.querySelector('.go-edit-range') as HTMLElement | ||
220 | + // 生成图片 | ||
221 | + const canvasImage: HTMLCanvasElement = await html2canvas(range, { | ||
222 | + backgroundColor: null, | ||
223 | + allowTaint: true, | ||
224 | + useCORS: true | ||
225 | + }) | ||
226 | + | ||
227 | + // 上传预览图 | ||
228 | + // let uploadParams = new FormData() | ||
229 | + // uploadParams.append( | ||
230 | + // 'object', | ||
231 | + // base64toFile(canvasImage.toDataURL(), `${fetchRouteParamsLocation()}_index_preview.png`) | ||
232 | + // ) | ||
233 | + // const uploadRes = await uploadFile(uploadParams) | ||
234 | + // 保存预览图 | ||
235 | + // if (uploadRes && uploadRes.code === ResultEnum.SUCCESS) { | ||
236 | + // await updateProjectApi({ | ||
237 | + // id: fetchRouteParamsLocation(), | ||
238 | + // indexImage: `${systemStore.getFetchInfo.OSSUrl}${uploadRes.data.fileName}` | ||
239 | + // }) | ||
240 | + // } | ||
241 | + } | ||
242 | + } catch (e) { | ||
243 | + console.log(e) | ||
244 | + } | ||
245 | + | ||
246 | + // 保存数据 | ||
247 | + // let params = new FormData() | ||
248 | + // params.append('projectId', projectId) | ||
249 | + // params.append('content', JSONStringify(chartEditStore.getStorageInfo || {})) | ||
250 | + // const res = await saveProjectApi(params) | ||
251 | + | ||
252 | + // if (res && res.code === ResultEnum.SUCCESS) { | ||
253 | + // // 成功状态 | ||
254 | + // setTimeout(() => { | ||
255 | + // chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.SUCCESS) | ||
256 | + // }, 1000) | ||
257 | + // return | ||
258 | + // } | ||
259 | + // 失败状态 | ||
260 | + // chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE) | ||
261 | + }, 3000) | ||
262 | + // * 定时处理 | ||
263 | + const intervalDataSyncUpdate = () => { | ||
264 | + // 定时获取数据 | ||
265 | + const syncTiming = setInterval(() => { | ||
266 | + dataSyncUpdate() | ||
267 | + }, saveInterval * 1000) | ||
268 | + | ||
269 | + // 销毁 | ||
270 | + onUnmounted(() => { | ||
271 | + clearInterval(syncTiming) | ||
272 | + }) | ||
273 | + } | ||
199 | return { | 274 | return { |
200 | - updateComponent | 275 | + updateComponent, |
276 | + dataSyncUpdate, | ||
277 | + intervalDataSyncUpdate | ||
201 | } | 278 | } |
202 | } | 279 | } |