JinZHouXiYiJi_DaPin2/examples/pages/DesignerView/toolbars/save/SavePage.vue

110 lines
3.2 KiB
Vue

<template>
<ConfigProvider>
<n-modal
:show="saveDialogVisible"
:mask-closable="false"
preset="card"
center
title="保存当前布局"
style="width: 30%; min-width: 600px"
size="medium"
@update:show="saveDialogVisible = false"
>
<n-form :model="form" :rules="rules" @submit.prevent>
<n-form-item label="页面名称" prop="name">
<n-input v-model:value="form.name" placeholder="请输入页面名称" />
</n-form-item>
<n-form-item label="页面缩略图" prop="thumbnail">
<n-input v-model:value="form.thumbnail" placeholder="请输入缩略图地址" />
</n-form-item>
</n-form>
<template #footer>
<n-space>
<n-button @click="saveDialogVisible = false">取消</n-button>
<n-button v-if="!index" type="primary" @click="handleSubmit('new')">新增</n-button>
<n-button v-else type="primary" @click="handleSubmit('update')"></n-button>
</n-space>
</template>
</n-modal>
</ConfigProvider>
</template>
<script lang="ts" setup>
import type { FormItemRule } from 'naive-ui'
import { NButton, NForm, NFormItem, NInput, NModal, NSpace } from 'naive-ui'
import { useCanvasState } from 'open-data-v/designer'
import { reactive, ref } from 'vue'
import type { LayoutData } from '@/api/pages'
import { savePageApi, updatePageApi } from '@/api/pages'
import ConfigProvider from '@/components/provider/ConfigProvider.vue'
import router from '@/router'
import { message } from '@/utils/message'
const canvasState = useCanvasState()
const props = defineProps<{ index?: string }>()
const saveDialogVisible = ref<boolean>(true)
const form = reactive<{
name: string
thumbnail: string
}>({
name: canvasState.name,
thumbnail: canvasState.thumbnail
})
const rules = reactive<{
name: FormItemRule[]
}>({
name: [{ required: true, message: '请输入页面名称', trigger: 'blur' }]
})
const handleSubmit = async (type: string) => {
const { name, thumbnail } = form
if (!name) {
message.error('请输入页面名称')
return
}
const layoutData: LayoutData = {
name: name,
thumbnail: thumbnail!,
canvasData: canvasState.layoutData,
canvasStyle: canvasState.canvasStyleData,
dataSlotters: canvasState.dataSlotterData
}
if (type === 'update') {
try {
const resp = await updatePageApi(props.index!, layoutData)
if (resp.status === 200) {
message.success('修改成功')
if (canvasState.name !== name) {
canvasState.setName(name)
}
}
} catch (e) {
message.error('保存失败,请导出到本地,并重新进入此页面')
} finally {
saveDialogVisible.value = false
}
} else {
try {
const result = await savePageApi(layoutData)
if (result.status === 201) {
message.success('保存成功')
// 新增页面成功,则跳转到编辑页
await router.push({
name: 'Editor',
params: {
index: result.data.id
}
})
}
} catch (e: any) {
message.error(`保存失败,失败信息:${e?.message || e}`)
} finally {
saveDialogVisible.value = false
}
}
}
</script>