123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- <template>
- <DiyEditor
- v-if="formData && !formLoading"
- v-model="currentFormData!.property"
- :title="templateItems[selectedTemplateItem].name"
- :libs="libs"
- :show-page-config="selectedTemplateItem !== 0"
- :show-tab-bar="selectedTemplateItem === 0"
- :show-navigation-bar="selectedTemplateItem !== 0"
- :preview-url="previewUrl"
- @save="submitForm"
- @reset="handleEditorReset"
- >
- <template #toolBarLeft>
- <el-radio-group
- v-model="selectedTemplateItem"
- class="h-full!"
- @change="handleTemplateItemChange"
- >
- <el-tooltip v-for="(item, index) in templateItems" :key="index" :content="item.name">
- <el-radio-button :label="index">
- <Icon :icon="item.icon" :size="24" />
- </el-radio-button>
- </el-tooltip>
- </el-radio-group>
- </template>
- </DiyEditor>
- </template>
- <script setup lang="ts">
- // TODO @疯狂:要不要建个 decorate 目录,然后挪进去,改成 index.vue,这样可以更明确看到是个独立界面哈,更好找
- import * as DiyTemplateApi from '@/api/mall/promotion/diy/template'
- import * as DiyPageApi from '@/api/mall/promotion/diy/page'
- import { useTagsViewStore } from '@/store/modules/tagsView'
- import { DiyComponentLibrary, PAGE_LIBS } from '@/components/DiyEditor/util' // 商城的 DIY 组件,在 DiyEditor 目录下
- import { toNumber } from 'lodash-es'
- /** 装修模板表单 */
- defineOptions({ name: 'DiyTemplateDecorate' })
- // 左上角工具栏操作按钮
- const selectedTemplateItem = ref(0)
- const templateItems = reactive([
- { name: '基础设置', icon: 'ep:iphone' },
- { name: '首页', icon: 'ep:home-filled' },
- { name: '我的', icon: 'ep:user-filled' }
- ])
- const message = useMessage() // 消息弹窗
- const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
- const formData = ref<DiyTemplateApi.DiyTemplatePropertyVO>()
- const formRef = ref() // 表单 Ref
- // 当前编辑的属性
- const currentFormData = ref<DiyTemplateApi.DiyTemplatePropertyVO | DiyPageApi.DiyPageVO>()
- // 商城 H5 预览地址
- const previewUrl = ref('')
- // 获取详情
- const getPageDetail = async (id: any) => {
- formLoading.value = true
- try {
- formData.value = await DiyTemplateApi.getDiyTemplateProperty(id)
- currentFormData.value = formData.value
- // 拼接手机预览链接
- const domain = import.meta.env.VITE_MALL_H5_DOMAIN
- previewUrl.value = `${domain}/#/pages/index/index?templateId=${formData.value.id}`
- } finally {
- formLoading.value = false
- }
- }
- // 模板组件库
- const templateLibs = [] as DiyComponentLibrary[]
- // 当前组件库
- const libs = ref<DiyComponentLibrary[]>(templateLibs)
- // 模板选项切换
- const handleTemplateItemChange = () => {
- // 编辑模板
- if (selectedTemplateItem.value === 0) {
- libs.value = templateLibs
- currentFormData.value = formData.value
- return
- }
- // 编辑页面
- libs.value = PAGE_LIBS
- currentFormData.value = formData.value!.pages.find(
- (page: DiyPageApi.DiyPageVO) => page.name === templateItems[selectedTemplateItem.value].name
- )
- }
- // 提交表单
- const submitForm = async () => {
- // 校验表单
- if (!formRef) return
- // 提交请求
- formLoading.value = true
- try {
- if (selectedTemplateItem.value === 0) {
- // 提交模板属性
- await DiyTemplateApi.updateDiyTemplateProperty(unref(formData)!)
- } else {
- // 提交页面属性
- await DiyPageApi.updateDiyPageProperty(unref(currentFormData)!)
- }
- message.success('保存成功')
- } finally {
- formLoading.value = false
- }
- }
- // 重置表单
- const resetForm = () => {
- formData.value = {
- id: undefined,
- name: '',
- used: false,
- usedTime: undefined,
- remark: '',
- previewPicUrls: [],
- property: '',
- pages: []
- } as DiyTemplateApi.DiyTemplatePropertyVO
- formRef.value?.resetFields()
- }
- // 重置时记录当前编辑的页面
- const handleEditorReset = () => storePageIndex()
- //#region 无感刷新
- // 记录标识
- const DIY_PAGE_INDEX_KEY = 'diy_page_index'
- // 1. 记录
- const storePageIndex = () =>
- sessionStorage.setItem(DIY_PAGE_INDEX_KEY, `${selectedTemplateItem.value}`)
- // 2. 恢复
- const recoverPageIndex = () => {
- // 恢复重置前的页面,默认是第一个页面
- const pageIndex = toNumber(sessionStorage.getItem(DIY_PAGE_INDEX_KEY)) || 0
- // 移除标记
- sessionStorage.removeItem(DIY_PAGE_INDEX_KEY)
- // 切换页面
- if (pageIndex !== selectedTemplateItem.value) {
- selectedTemplateItem.value = pageIndex
- handleTemplateItemChange()
- }
- }
- //#endregion
- /** 初始化 **/
- const { currentRoute } = useRouter() // 路由
- const { delView } = useTagsViewStore() // 视图操作
- onMounted(async () => {
- resetForm()
- if (!currentRoute.value.params.id) {
- message.warning('参数错误,页面编号不能为空!')
- delView(unref(currentRoute))
- return
- }
- // 查询详情
- await getPageDetail(currentRoute.value.params.id)
- // 恢复重置前的页面
- recoverPageIndex()
- })
- </script>
|