深度画布保存接口
This commit is contained in:
41
src/api/depth-canvas.ts
Normal file
41
src/api/depth-canvas.ts
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取深度画布
|
||||||
|
* @param id depth id
|
||||||
|
* @returns 深度画布数据
|
||||||
|
*/
|
||||||
|
export const getDepthCanvas = (id: string) => {
|
||||||
|
return request({
|
||||||
|
url: `/api/deep-canvas/${id}`,
|
||||||
|
method: 'get',
|
||||||
|
loading: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存深度画布
|
||||||
|
* @param data 保存depth的画布数据
|
||||||
|
* @returns 保存结果
|
||||||
|
*/
|
||||||
|
export const saveDepthCanvas = (data: object) => {
|
||||||
|
return request({
|
||||||
|
url: `/api/deep-canvas/update`,
|
||||||
|
method: 'put',
|
||||||
|
data,
|
||||||
|
loading: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除深度画布
|
||||||
|
* @param id depth id
|
||||||
|
* @returns 删除结果
|
||||||
|
*/
|
||||||
|
export const deleteDepthCanvas = (id: string) => {
|
||||||
|
return request({
|
||||||
|
url: `/api/deep-canvas/${id}`,
|
||||||
|
method: 'delete',
|
||||||
|
loading: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -178,8 +178,8 @@
|
|||||||
}
|
}
|
||||||
const onWorkbench = async () => {
|
const onWorkbench = async () => {
|
||||||
exportCanvasToImage(canvasManager.canvas).then((url) => {
|
exportCanvasToImage(canvasManager.canvas).then((url) => {
|
||||||
const json = canvasManager.getCanvasJSON()
|
const { canvas, images } = canvasManager.getCanvasDisUrlJSON()
|
||||||
emit('workbench', { url, json })
|
emit('workbench', { url, canvas, images })
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -89,16 +89,19 @@
|
|||||||
globalStore.setLoading(true)
|
globalStore.setLoading(true)
|
||||||
keyEventManager.registerEvents()
|
keyEventManager.registerEvents()
|
||||||
const url = props.config.url || ''
|
const url = props.config.url || ''
|
||||||
const json = props.config.json || ''
|
const canvasData = props.config.canvasData || ''
|
||||||
await canvasManager.initCanvas({
|
await canvasManager.initCanvas({
|
||||||
canvasRef,
|
canvasRef,
|
||||||
canvasViewWidth: canvasContainerRef.value.clientWidth,
|
canvasViewWidth: canvasContainerRef.value.clientWidth,
|
||||||
canvasViewHeight: canvasContainerRef.value.clientHeight,
|
canvasViewHeight: canvasContainerRef.value.clientHeight,
|
||||||
canvasWidth: props.config.width || 750,
|
canvasWidth: props.config.width || 750,
|
||||||
canvasHeight: props.config.height || 600,
|
canvasHeight: props.config.height || 600,
|
||||||
url: json ? '' : url
|
url: canvasData ? '' : url
|
||||||
})
|
})
|
||||||
if (json) await canvasManager.loadJSON(json)
|
if (canvasData) {
|
||||||
|
const json = canvasManager.processCanvasDisUrlJSON(canvasData)
|
||||||
|
await canvasManager.loadJSON(json)
|
||||||
|
}
|
||||||
globalStore.setLoading(false)
|
globalStore.setLoading(false)
|
||||||
|
|
||||||
stateManager.onMounted()
|
stateManager.onMounted()
|
||||||
|
|||||||
@@ -9,33 +9,54 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { base64Tofile } from '../tools/tools'
|
import { base64Tofile } from '../tools/tools'
|
||||||
import { uploadImage } from '@/api/upload'
|
import { uploadImage } from '@/api/upload'
|
||||||
|
import { getDepthCanvas, saveDepthCanvas } from '@/api/depth-canvas'
|
||||||
import FullscreenDialog from '../components/fullscreen-dialog.vue'
|
import FullscreenDialog from '../components/fullscreen-dialog.vue'
|
||||||
import depthCanvas from './depth-canvas.vue'
|
import depthCanvas from './depth-canvas.vue'
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
const dialogVisible = ref(false)
|
const dialogVisible = ref(false)
|
||||||
const config = ref({
|
const config = ref({
|
||||||
id: '',
|
canvasId: '',
|
||||||
|
sketchId: '',
|
||||||
url: '',
|
url: '',
|
||||||
json: ''
|
canvasData: '' as any,
|
||||||
|
onWorkbench(options) {},
|
||||||
|
onClose() {}
|
||||||
})
|
})
|
||||||
|
|
||||||
const open = (options) => {
|
const open = async (options) => {
|
||||||
config.value = options
|
config.value = options
|
||||||
console.log(config.value)
|
if (config.value.canvasId) {
|
||||||
config.value.json = sessionStorage.getItem('canvasJson_' + config.value.id)
|
const res = await getDepthCanvas(config.value.canvasId)
|
||||||
|
const canvas = res.deepCanvasDetail
|
||||||
|
const images = res.images
|
||||||
|
if (canvas && images) {
|
||||||
|
config.value.canvasData = { canvas: JSON.stringify(canvas), images }
|
||||||
|
} else {
|
||||||
|
config.value.canvasData = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
}
|
}
|
||||||
// 工作区
|
// 工作区
|
||||||
const onWorkbench = async (options) => {
|
const onWorkbench = async (options) => {
|
||||||
const json = options.json
|
// 保存画布数据
|
||||||
|
const data = {
|
||||||
sessionStorage.setItem('canvasJson_' + config.value.id, json)
|
deepCanvasDetail: JSON.parse(options.canvas),
|
||||||
|
images: options.images,
|
||||||
|
sketchId: config.value.sketchId,
|
||||||
|
id: config.value.canvasId || null
|
||||||
|
}
|
||||||
|
const sData = await saveDepthCanvas(data)
|
||||||
|
console.log(sData)
|
||||||
|
const canvasId = sData.id
|
||||||
|
// base64 转 file 上传转换为 url
|
||||||
const file = base64Tofile(options.url, 'canvas.png')
|
const file = base64Tofile(options.url, 'canvas.png')
|
||||||
const formData = new FormData()
|
const formData = new FormData()
|
||||||
formData.append('file', file)
|
formData.append('file', file)
|
||||||
const url = await uploadImage(formData)
|
const url = await uploadImage(formData)
|
||||||
config.value.onWorkbench?.({ url })
|
config.value.onWorkbench?.({ url, canvasId })
|
||||||
|
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
}
|
}
|
||||||
// 关闭
|
// 关闭
|
||||||
|
|||||||
@@ -293,12 +293,12 @@ export class CanvasManager {
|
|||||||
/** 导出画布为处理图片的JSON */
|
/** 导出画布为处理图片的JSON */
|
||||||
getCanvasDisUrlJSON() {
|
getCanvasDisUrlJSON() {
|
||||||
const canvas = this.canvas.toJSON()
|
const canvas = this.canvas.toJSON()
|
||||||
const images = [];
|
const images = {};
|
||||||
var i = 0;
|
var i = 0;
|
||||||
const create = (url) => {
|
const create = (url) => {
|
||||||
const logo = `xxxxxxxx_${i++}_xxxxxxxx`;
|
const key = `xxxxxxxx_${i++}_xxxxxxxx`;
|
||||||
images.push({ index: logo, url })
|
images[key] = url
|
||||||
return logo
|
return key
|
||||||
}
|
}
|
||||||
canvas.objects.forEach((object: any) => {
|
canvas.objects.forEach((object: any) => {
|
||||||
if (object.thumbnail) {
|
if (object.thumbnail) {
|
||||||
@@ -317,11 +317,13 @@ export class CanvasManager {
|
|||||||
return { canvas: JSON.stringify(canvas), images }
|
return { canvas: JSON.stringify(canvas), images }
|
||||||
}
|
}
|
||||||
/** 处理JSON为正常画布 */
|
/** 处理JSON为正常画布 */
|
||||||
processCanvasDisUrlJSON(obj: { canvas: string, images: Object[] }) {
|
processCanvasDisUrlJSON(obj: { canvas: string, images: Object }) {
|
||||||
var json = obj.canvas;
|
var json = obj.canvas;
|
||||||
const images = obj.images || []
|
const images = obj.images || {}
|
||||||
images.forEach((v: any) => json = json.replace(new RegExp(v.index), v.url))
|
for (const key in images) {
|
||||||
return JSON.parse(json)
|
json = json.replace(new RegExp(key), images[key])
|
||||||
|
}
|
||||||
|
return json
|
||||||
}
|
}
|
||||||
dispose() {
|
dispose() {
|
||||||
this.animationManager?.dispose()
|
this.animationManager?.dispose()
|
||||||
|
|||||||
Reference in New Issue
Block a user