useSync.hook.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import { onUnmounted } from 'vue';
  2. import html2canvas from 'html2canvas'
  3. import { getUUID, httpErrorHandle, fetchRouteParamsLocation, base64toFile } from '@/utils'
  4. import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
  5. import { EditCanvasTypeEnum, ChartEditStoreEnum, ProjectInfoEnum, ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d'
  6. import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
  7. import { fetchChartComponent, createComponent } from '@/packages/index'
  8. import { CreateComponentType } from '@/packages/index.d'
  9. import { saveInterval } from '@/settings/designSetting'
  10. // 接口状态
  11. import { ResultEnum } from '@/enums/httpEnum'
  12. // 接口
  13. import { saveProjectApi, fetchProjectApi, uploadFile, updateProjectApi } from '@/api/path/project'
  14. // 画布枚举
  15. import { SyncEnum } from '@/enums/editPageEnum'
  16. // 请求处理
  17. export const useSync = () => {
  18. const chartEditStore = useChartEditStore()
  19. const chartHistoryStore = useChartHistoryStore()
  20. /**
  21. * * 组件动态注册
  22. * @param projectData 项目数据
  23. * @param isSplace 是否替换数据
  24. * @returns
  25. */
  26. const updateComponent = async (projectData: ChartEditStorage, isSplace = false) => {
  27. if (isSplace) {
  28. // 清除列表
  29. chartEditStore.componentList = []
  30. // 清除历史记录
  31. chartHistoryStore.clearBackStack()
  32. chartHistoryStore.clearForwardStack()
  33. }
  34. // 列表组件注册
  35. projectData.componentList.forEach(async (e: CreateComponentType) => {
  36. if (!window['$vue'].component(e.chartConfig.chartKey)) {
  37. window['$vue'].component(
  38. e.chartConfig.chartKey,
  39. fetchChartComponent(e.chartConfig)
  40. )
  41. }
  42. })
  43. // 数据赋值
  44. for (const key in projectData) {
  45. // 组件
  46. if (key === ChartEditStoreEnum.COMPONENT_LIST) {
  47. for (const comItem of projectData[key]) {
  48. // 补充 class 上的方法
  49. let newComponent: CreateComponentType = await createComponent(
  50. comItem.chartConfig
  51. )
  52. chartEditStore.addComponentList(
  53. Object.assign(newComponent, {...comItem, id: getUUID()}),
  54. false,
  55. true
  56. )
  57. }
  58. } else {
  59. // 非组件(顺便排除脏数据)
  60. if (key !== 'editCanvasConfig' && key !== 'requestGlobalConfig') return
  61. Object.assign((chartEditStore as any)[key], projectData[key])
  62. }
  63. }
  64. }
  65. /**
  66. * * 赋值全局数据
  67. * @param projectData 项目数据
  68. * @returns
  69. */
  70. const updateStoreInfo = (projectData: {
  71. id: string,
  72. projectName: string,
  73. indexImage: string,
  74. remarks: string,
  75. }) => {
  76. const { projectName, remarks, indexImage } = projectData
  77. // 名称
  78. chartEditStore.setProjectInfo(ProjectInfoEnum.PROJECT_NAME, projectName)
  79. // 描述
  80. chartEditStore.setProjectInfo(ProjectInfoEnum.REMARKS, remarks)
  81. // 缩略图
  82. chartEditStore.setProjectInfo(ProjectInfoEnum.THUMBNAIL, indexImage)
  83. }
  84. // * 数据获取
  85. const dataSyncFetch = async () => {
  86. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.START)
  87. try {
  88. const res: any = await fetchProjectApi({ projectId: fetchRouteParamsLocation() })
  89. if (res.code === ResultEnum.SUCCESS) {
  90. if (res.data) {
  91. updateStoreInfo(res.data)
  92. // 更新全局数据
  93. await updateComponent(JSON.parse(res.data.content))
  94. return
  95. }
  96. setTimeout(() => {
  97. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.SUCCESS)
  98. }, 1000)
  99. return
  100. }
  101. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
  102. } catch (error) {
  103. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
  104. httpErrorHandle()
  105. }
  106. }
  107. // * 数据保存
  108. const dataSyncUpdate = async () => {
  109. if(!fetchRouteParamsLocation()) return
  110. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.START)
  111. // 获取缩略图片
  112. const range = document.querySelector('.go-edit-range') as HTMLElement
  113. const canvasImage: HTMLCanvasElement = await html2canvas(range)
  114. // 上传预览图
  115. let uploadParams = new FormData()
  116. uploadParams.append('object', base64toFile(canvasImage.toDataURL(), `${fetchRouteParamsLocation()}_index_preview.png`))
  117. const uploadRes:any = await uploadFile(uploadParams)
  118. // 保存预览图
  119. if(uploadRes.code === ResultEnum.SUCCESS) {
  120. await updateProjectApi({
  121. id: fetchRouteParamsLocation(),
  122. indexImage: uploadRes.data.objectContent.httpRequest.uri
  123. })
  124. }
  125. // 保存数据
  126. let params = new FormData()
  127. params.append('projectId', fetchRouteParamsLocation())
  128. params.append('content', JSON.stringify(chartEditStore.getStorageInfo || {}))
  129. const res: any = await saveProjectApi(params)
  130. if (res.code === ResultEnum.SUCCESS) {
  131. // 成功状态
  132. setTimeout(() => {
  133. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.SUCCESS)
  134. }, 1000)
  135. return
  136. }
  137. // 失败状态
  138. chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
  139. }
  140. // * 定时处理
  141. const intervalDataSyncUpdate = () => {
  142. // 定时获取数据
  143. const syncTiming = setInterval(() => {
  144. dataSyncUpdate()
  145. }, saveInterval * 1000)
  146. // 销毁
  147. onUnmounted(() => {
  148. clearInterval(syncTiming)
  149. })
  150. }
  151. return {
  152. updateComponent,
  153. updateStoreInfo,
  154. dataSyncFetch,
  155. dataSyncUpdate,
  156. intervalDataSyncUpdate
  157. }
  158. }