CatPtain commited on
Commit
3713bef
·
verified ·
1 Parent(s): 5a1360b

Update frontend/src/services/dataSyncService.ts

Browse files
frontend/src/services/dataSyncService.ts CHANGED
@@ -1,5 +1,7 @@
1
  import api from '@/services'
2
  import { debounce } from 'lodash'
 
 
3
 
4
  class DataSyncService {
5
  private currentPPTId: string | null = null
@@ -251,6 +253,72 @@ class DataSyncService {
251
  async manualSave(): Promise<boolean> {
252
  return await this.savePPT(true)
253
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
  }
255
 
256
  // 创建单例实例
 
1
  import api from '@/services'
2
  import { debounce } from 'lodash'
3
+ // 添加前端截图支持
4
+ import { toPng, toJpeg, toSvg } from 'html-to-image'
5
 
6
  class DataSyncService {
7
  private currentPPTId: string | null = null
 
253
  async manualSave(): Promise<boolean> {
254
  return await this.savePPT(true)
255
  }
256
+
257
+ // 前端截图功能 - 作为后端截图的备用方案
258
+ async generateFrontendScreenshot(elementId = 'slideContainer', options = {}) {
259
+ try {
260
+ const element = document.getElementById(elementId)
261
+ if (!element) {
262
+ throw new Error(`Element with id '${elementId}' not found`)
263
+ }
264
+
265
+ const defaultOptions = {
266
+ quality: 0.95,
267
+ pixelRatio: 1,
268
+ backgroundColor: '#ffffff',
269
+ ...options
270
+ }
271
+
272
+ console.log('🖼️ 开始前端截图生成...')
273
+
274
+ // 使用html-to-image生成截图
275
+ const imageDataUrl = await toJpeg(element, defaultOptions)
276
+
277
+ console.log('✅ 前端截图生成成功')
278
+ return imageDataUrl
279
+ } catch (error) {
280
+ console.error('❌ 前端截图生成失败:', error)
281
+ throw error
282
+ }
283
+ }
284
+
285
+ // 生成PPT截图链接(优先使用后端,失败时尝试前端)
286
+ async generateScreenshotUrl(slideIndex = 0, useFrontend = false) {
287
+ const { useAuthStore } = await import('@/store')
288
+ const authStore = useAuthStore()
289
+
290
+ if (!authStore.isLoggedIn || !this.currentPPTId) {
291
+ throw new Error('用户未登录或没有当前PPT')
292
+ }
293
+
294
+ const baseUrl = window.location.origin
295
+ const backendScreenshotUrl = `${baseUrl}/api/public/screenshot/${authStore.currentUser!.id}/${this.currentPPTId}/${slideIndex}`
296
+
297
+ if (useFrontend) {
298
+ try {
299
+ // 尝试前端截图
300
+ const frontendScreenshot = await this.generateFrontendScreenshot()
301
+ return {
302
+ type: 'frontend',
303
+ url: frontendScreenshot,
304
+ isDataUrl: true
305
+ }
306
+ } catch (frontendError) {
307
+ console.warn('前端截图失败,回退到后端URL:', frontendError.message)
308
+ return {
309
+ type: 'backend',
310
+ url: backendScreenshotUrl,
311
+ isDataUrl: false
312
+ }
313
+ }
314
+ }
315
+
316
+ return {
317
+ type: 'backend',
318
+ url: backendScreenshotUrl,
319
+ isDataUrl: false
320
+ }
321
+ }
322
  }
323
 
324
  // 创建单例实例