useSync.hook.ts 6.1 KB

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