Commit fdf17197a7b469bc1f54738ec403db721fb78db1

Authored by fengwotao
1 parent 1ed798e1

feat:大屏新增保存 使用官方自带保存逻辑

... ... @@ -97,7 +97,8 @@ import {
97 97 Carbon3DSoftware as Carbon3DSoftwareIcon,
98 98 Filter as FilterIcon,
99 99 FilterEdit as FilterEditIcon,
100   - Laptop as LaptopIcon
  100 + Laptop as LaptopIcon,
  101 + Save as SaveIcon
101 102 } from '@vicons/carbon'
102 103
103 104 const ionicons5 = {
... ... @@ -231,7 +232,7 @@ const ionicons5 = {
231 232 // 眼睛
232 233 EyeOutlineIcon,
233 234 EyeOffOutlineIcon,
234   - // 图表列表
  235 + // 图表列表
235 236 AlbumsIcon
236 237 }
237 238
... ... @@ -285,7 +286,9 @@ const carbon = {
285 286 FilterIcon,
286 287 FilterEditIcon,
287 288 // 图层
288   - LaptopIcon
  289 + LaptopIcon,
  290 + // 保存
  291 + SaveIcon
289 292 }
290 293
291 294 // https://www.xicons.org/#/ 还有很多
... ...
... ... @@ -6,10 +6,10 @@ import designColor from './designColor.json'
6 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 15 export const theme = {
... ... @@ -17,7 +17,7 @@ export const theme = {
17 17 darkTheme: false,
18 18 //默认主题色
19 19 appTheme: '#51d6a9',
20   - appThemeDetail: null,
  20 + appThemeDetail: null
21 21 }
22 22
23 23 // 图表初始配置(px)
... ... @@ -28,7 +28,7 @@ export const chartInitConfig = {
28 28 h: 300,
29 29 // 不建议动 offset
30 30 offsetX: 0,
31   - offsetY: 0,
  31 + offsetY: 0
32 32 }
33 33
34 34 // dialog 图标的大小
... ... @@ -72,3 +72,6 @@ export const canvasModelIndex = 9999
72 72
73 73 // 框选时蒙层的 z-index,需比所有图表高
74 74 export const selectBoxIndex = canvasModelIndex + 10
  75 +
  76 +// 工作台自动保存间隔(s)
  77 +export const saveInterval = 120
... ...
... ... @@ -29,6 +29,22 @@
29 29 </template>
30 30 <span>{{ item.title }}</span>
31 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 48 </n-space>
33 49 </n-space>
34 50 </template>
... ... @@ -43,12 +59,14 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore
43 59
44 60 import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
45 61 import { HistoryStackEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
46   -
  62 +import { useSync } from '../../hooks/useSync.hook'
47 63 import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore'
48 64 import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d'
49 65
50 66 const { LayersIcon, BarChartIcon, PrismIcon, HomeIcon, ArrowBackIcon, ArrowForwardIcon } = icon.ionicons5
  67 +const { SaveIcon } = icon.carbon
51 68 const { setItem } = useChartLayoutStore()
  69 +const { dataSyncUpdate } = useSync()
52 70 const { getLayers, getCharts, getDetails } = toRefs(useChartLayoutStore())
53 71 const chartEditStore = useChartEditStore()
54 72 const chartHistoryStore = useChartHistoryStore()
... ... @@ -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 106 const historyList = reactive<ItemType<HistoryStackEnum>[]>([
89 107 {
... ... @@ -101,7 +119,6 @@ const historyList = reactive<ItemType<HistoryStackEnum>[]>([
101 119 }
102 120 ])
103 121
104   -
105 122 // store 描述的是展示的值,所以和 ContentConfigurations 的 collapsed 是相反的
106 123 const styleHandle = (item: ItemType<ChartLayoutStoreEnum>) => {
107 124 if (item.key === ChartLayoutStoreEnum.DETAILS) {
... ... @@ -120,10 +137,10 @@ const clickHistoryHandle = (item: ItemType<HistoryStackEnum>) => {
120 137 switch (item.key) {
121 138 case HistoryStackEnum.BACK_STACK:
122 139 chartEditStore.setBack()
123   - break;
  140 + break
124 141 case HistoryStackEnum.FORWARD_STACK:
125 142 chartEditStore.setForward()
126   - break;
  143 + break
127 144 }
128 145 }
129 146
... ... @@ -142,5 +159,5 @@ const goHomeHandle = () => {
142 159 <style lang="scss" scoped>
143 160 .header-left-btn {
144 161 margin-left: -37px;
145   - }
  162 +}
146 163 </style>
... ...
1   -import { getUUID } from '@/utils'
  1 +import { getUUID, fetchRouteParamsLocation } from '@/utils'
2 2 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
3 3 import { ChartEditStoreEnum, ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d'
4 4 import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
... ... @@ -9,6 +9,10 @@ import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.
9 9 import { BaseEvent, EventLife } from '@/enums/eventEnum'
10 10 import { PublicGroupConfigClass } from '@/packages/public/publicConfig'
11 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 120 }
117 121
118 122 if (e.isGroup) {
119   - (e as CreateComponentGroupType).groupList.forEach(groupItem => {
  123 + ;(e as CreateComponentGroupType).groupList.forEach(groupItem => {
120 124 intComponent(groupItem)
121 125 })
122 126 } else {
... ... @@ -155,7 +159,7 @@ export const useSync = () => {
155 159 // 组件
156 160 if (key === ChartEditStoreEnum.COMPONENT_LIST) {
157 161 let loadIndex = 0
158   - const listLength = projectData[key].length;
  162 + const listLength = projectData[key].length
159 163 for (const comItem of projectData[key]) {
160 164 // 设置加载数量
161 165 let percentage = parseInt((parseFloat(`${++loadIndex / listLength}`) * 100).toString())
... ... @@ -196,7 +200,80 @@ export const useSync = () => {
196 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 274 return {
200   - updateComponent
  275 + updateComponent,
  276 + dataSyncUpdate,
  277 + intervalDataSyncUpdate
201 278 }
202 279 }
... ...