Commit d5d48e53 by lijiabin

【需求 20331】 chore: 删除无用文件代码

parent 1eca796d
import { ArticleTypeEnum, BooleanFlag, ReleaseStatusTypeEnum, SendTypeEnum } from '@/constants'
import UploadFile from '@/components/common/UploadFile/index.vue'
import { useResetData } from '@/hooks'
import type { TagItemDto } from '@/api/tag/types'
import { useColumnStore } from '@/stores/column'
import { storeToRefs } from 'pinia'
import SelectTags from '@/components/common/SelectTags/index.vue'
import type { AddOrUpdateColumnForm, AddOrUpdateColumnDto } from '@/api/article/types'
import { push } from 'notivue'
export default defineComponent((_, { expose }) => {
const columnStore = useColumnStore()
const { columnList } = storeToRefs(columnStore)
console.log(columnList.value)
const [form, resetForm] = useResetData<AddOrUpdateColumnForm>({
title: '',
content: '',
faceUrl: '',
imgUrl: '',
releaseStatus: ReleaseStatusTypeEnum.PUBLISH,
mainTagId: '',
tagList: [],
sendType: SendTypeEnum.IMMEDIATE,
sendTime: '',
isRelateColleague: BooleanFlag.NO,
relateColumnId: undefined,
type: ArticleTypeEnum.COLUMN,
isRecommend: BooleanFlag.NO,
})
const formRef = ref<InstanceType<typeof ElForm>>()
const rules = {
title: [{ required: true, message: '请输入专栏标题', trigger: 'blur' }],
content: [{ required: true, message: '请输入专栏内容', trigger: 'blur' }],
releaseStatus: [{ required: true, message: '请选择发布时间', trigger: 'blur' }],
mainTagId: [{ required: true, message: '请选择主标签', trigger: 'blur' }],
sendType: [{ required: true, message: '请选择发布类型', trigger: 'blur' }],
sendTime: [{ required: true, message: '请选择发布时间', trigger: 'blur' }],
relateColumnId: [
{ required: true, message: '请选择专栏栏目', trigger: 'blur', type: 'number', min: 1 },
],
isRecommend: [{ required: true, message: '请选择是否推荐', trigger: 'blur' }],
imgUrl: [{ required: true, message: '请上传图片', trigger: 'blur' }],
}
const transformForm = (releaseStatus: ReleaseStatusTypeEnum): AddOrUpdateColumnDto => {
return {
...form.value,
releaseStatus,
faceUrl: form.value.imgUrl?.split(',').filter(Boolean)[0] || '',
tagList: [form.value.mainTagId, ...form.value.tagList].map((tag, index) => {
return {
sort: index,
tagId: Number(tag),
}
}),
}
}
// 检验并且获取表单数据
const getValidatedFormData = async (releaseStatus: ReleaseStatusTypeEnum) => {
try {
await formRef.value?.validate()
return transformForm(releaseStatus)
} catch (error) {
console.log(error)
push.warning('请检查输入内容')
return null
}
}
const filterTagsFn = (allTags: TagItemDto[]) => {
// 引用了form.value.mainTagId
return allTags.filter((tag) => tag.id !== Number(form.value.mainTagId))
}
const resetFields = () => {
formRef.value?.resetFields()
resetForm()
}
expose({
getValidatedFormData,
resetFields,
})
return () => (
<div>
<el-form
ref={formRef}
model={form.value}
label-width="auto"
label-position="right"
rules={rules}
>
<el-form-item label="标题" prop="title">
<el-input
v-model={form.value.title}
placeholder="请输入实践标题"
maxlength={200}
show-word-limit
/>
</el-form-item>
<el-form-item label="内容" prop="content">
<el-input
v-model={form.value.content}
type="textarea"
placeholder="请输入专栏内容"
rows={6}
maxlength={1000}
show-word-limit
class="content-input"
/>
</el-form-item>
<el-form-item label="图片" prop="imgUrl">
{/* @ts-ignore */}
<UploadFile v-model={form.value.imgUrl} />
</el-form-item>
<el-form-item label="专栏栏目选择" prop="relateColumnId">
<el-select v-model={form.value.relateColumnId} placeholder="请选择专栏栏目">
{columnList.value.map((item) => (
<el-option value={item.id} label={item.title}></el-option>
))}
</el-select>
</el-form-item>
<el-form-item label="主标签" prop="mainTagId">
{{
// @ts-ignore
default: () => <SelectTags v-model={form.value.mainTagId} />,
label: () => (
// <el-tooltip content="主标签最多选1个" placement="top">
<span class="cursor-pointer">
主标签
{/* <el-icon class="ml-1">
<InfoFilled />
</el-icon> */}
</span>
// </el-tooltip>
),
}}
</el-form-item>
<el-form-item label="副标签">
{{
default: () => (
// @ts-ignore
<SelectTags
v-model={form.value.tagList}
filterTagsFn={filterTagsFn}
maxSelectedTags={3}
/>
),
label: () => (
// <el-tooltip content="副标签最多选3个" placement="top">
<span class="cursor-pointer">
副标签
{/* <el-icon class="ml-1">
<InfoFilled />
</el-icon> */}
</span>
// </el-tooltip>
),
}}
</el-form-item>
<el-form-item label="是否同步同事吧" prop="isRelateColleague">
<el-radio-group v-model={form.value.isRelateColleague}>
<el-radio value={BooleanFlag.YES} class="radio-item scheduled">
</el-radio>
<el-radio value={BooleanFlag.NO} class="radio-item scheduled">
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="是否推荐" prop="isRecommend">
<el-radio-group v-model={form.value.isRecommend} class="radio-group">
<el-radio value={BooleanFlag.YES} class="radio-item immediate">
</el-radio>
<el-radio value={BooleanFlag.NO} class="radio-item scheduled">
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="发布类型" prop="sendType">
<el-radio-group v-model={form.value.sendType} class="radio-group">
<el-radio value={SendTypeEnum.IMMEDIATE} class="radio-item immediate">
立即发布
</el-radio>
<el-radio value={SendTypeEnum.SCHEDULED} class="radio-item scheduled">
定时发布
</el-radio>
</el-radio-group>
</el-form-item>
{form.value.sendType === SendTypeEnum.SCHEDULED && (
<el-form-item label="发布时间" prop="sendTime">
<el-date-picker
class="ml-2"
v-model={form.value.sendTime}
type="datetime"
placeholder="请选择发布时间"
// 不能选现在
disabled-date={(time: Date) => {
return time.getTime() < Date.now() - 1000 * 60 * 60 * 24
}}
value-format="X"
style={{ width: '250px' }}
/>
</el-form-item>
)}
</el-form>
</div>
)
})
import { ArticleTypeEnum, BooleanFlag, ReleaseStatusTypeEnum, SendTypeEnum } from '@/constants'
import UploadFile from '@/components/common/UploadFile/index.vue'
import { useResetData } from '@/hooks'
import { useInterviewStore } from '@/stores/interview'
import { storeToRefs } from 'pinia'
import type { AddOrUpdateInterviewDto, AddOrUpdateInterviewForm } from '@/api/article/types'
import type { TagItemDto } from '@/api/tag/types'
import { push } from 'notivue'
export default defineComponent((_, { expose }) => {
const interviewStore = useInterviewStore()
const { interviewList } = storeToRefs(interviewStore)
const [form, resetForm] = useResetData<AddOrUpdateInterviewForm>({
title: '',
content: '',
faceUrl: '',
imgUrl: '',
releaseStatus: ReleaseStatusTypeEnum.PUBLISH,
mainTagId: '',
tagList: [],
sendType: SendTypeEnum.IMMEDIATE,
sendTime: '',
type: ArticleTypeEnum.INTERVIEW,
relateColumnId: undefined,
isRecommend: BooleanFlag.NO,
})
const formRef = ref<InstanceType<typeof ElForm>>()
const rules = {
title: [{ required: true, message: '请输入专访标题', trigger: 'blur' }],
content: [{ required: true, message: '请输入专访内容', trigger: 'blur' }],
releaseStatus: [{ required: true, message: '请选择发布时间', trigger: 'blur' }],
mainTagId: [{ required: true, message: '请选择主标签', trigger: 'blur' }],
sendType: [{ required: true, message: '请选择发布类型', trigger: 'blur' }],
sendTime: [{ required: true, message: '请选择发布时间', trigger: 'blur' }],
relateColumnId: [
{ required: true, message: '请选择专访栏目', trigger: 'blur', type: 'number', min: 1 },
],
isRecommend: [{ required: true, message: '请选择是否推荐', trigger: 'blur' }],
imgUrl: [{ required: true, message: '请上传图片', trigger: 'blur' }],
}
const transformForm = (releaseStatus: ReleaseStatusTypeEnum): AddOrUpdateInterviewDto => {
return {
...form.value,
releaseStatus,
faceUrl: form.value.imgUrl?.split(',').filter(Boolean)[0] || '',
tagList: [form.value.mainTagId, ...form.value.tagList].map((tag, index) => {
return {
sort: index,
tagId: Number(tag),
}
}),
}
}
// 检验并且获取表单数据
const getValidatedFormData = async (releaseStatus: ReleaseStatusTypeEnum) => {
try {
await formRef.value?.validate()
return transformForm(releaseStatus)
} catch (error) {
console.log(error)
push.warning('请检查输入内容')
return null
}
}
const filterTagsFn = (allTags: TagItemDto[]) => {
// 引用了form.value.mainTagId
return allTags.filter((tag) => tag.id !== Number(form.value.mainTagId))
}
const resetFields = () => {
formRef.value?.resetFields()
resetForm()
}
expose({
getValidatedFormData,
resetFields,
})
return () => (
<div>
<el-form
ref={formRef}
model={form.value}
label-width="auto"
label-position="right"
rules={rules}
>
<el-form-item label="标题" prop="title">
<el-input
v-model={form.value.title}
placeholder="请输入实践标题"
maxlength={200}
show-word-limit
/>
</el-form-item>
<el-form-item label="内容" prop="content">
<el-input
v-model={form.value.content}
type="textarea"
placeholder="请输入专访内容"
rows={6}
maxlength={1000}
show-word-limit
class="content-input"
/>
</el-form-item>
<el-form-item label="图片" prop="imgUrl">
{/* @ts-ignore */}
<UploadFile v-model={form.value.imgUrl} />
</el-form-item>
<el-form-item label="专访栏目选择" prop="relateColumnId">
<el-select v-model={form.value.relateColumnId} placeholder="请选择专访栏目">
{interviewList.value.map((item) => (
<el-option value={item.id} label={item.title} />
))}
</el-select>
</el-form-item>
<el-form-item label="主标签" prop="mainTagId">
{{
// @ts-ignore
default: () => <SelectTags v-model={form.value.mainTagId} />,
label: () => (
// <el-tooltip content="主标签最多选1个" placement="top">
<span class="cursor-pointer">
主标签
{/* <el-icon class="ml-1">
<InfoFilled />
</el-icon> */}
</span>
// </el-tooltip>
),
}}
</el-form-item>
<el-form-item label="副标签">
{{
default: () => (
// @ts-ignore
<SelectTags
v-model={form.value.tagList}
filterTagsFn={filterTagsFn}
maxSelectedTags={3}
/>
),
label: () => (
// <el-tooltip content="副标签最多选3个" placement="top">
<span class="cursor-pointer">
副标签
{/* <el-icon class="ml-1">
<InfoFilled />
</el-icon> */}
</span>
// </el-tooltip>
),
}}
</el-form-item>
<el-form-item label="是否推荐" prop="isRecommend">
<el-radio-group v-model={form.value.isRecommend} class="radio-group">
<el-radio value={BooleanFlag.YES} class="radio-item immediate">
</el-radio>
<el-radio value={BooleanFlag.NO} class="radio-item scheduled">
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="发布类型" prop="sendType">
<el-radio-group v-model={form.value.sendType} class="radio-group">
<el-radio value={SendTypeEnum.IMMEDIATE} class="radio-item immediate">
立即发布
</el-radio>
<el-radio value={SendTypeEnum.SCHEDULED} class="radio-item scheduled">
定时发布
</el-radio>
</el-radio-group>
</el-form-item>
{form.value.sendType === SendTypeEnum.SCHEDULED && (
<el-form-item label="发布时间" prop="sendTime">
<el-date-picker
class="ml-2"
v-model={form.value.sendTime}
type="datetime"
placeholder="请选择发布时间"
// 不能选现在
disabled-date={(time: Date) => {
return time.getTime() < Date.now() - 1000 * 60 * 60 * 24
}}
value-format="X"
style={{ width: '250px' }}
/>
</el-form-item>
)}
</el-form>
</div>
)
})
import { ArticleTypeEnum, ReleaseStatusTypeEnum, SendTypeEnum } from '@/constants'
import UploadFile from '@/components/common/UploadFile/index.vue'
import { useResetData } from '@/hooks'
import type { AddOrUpdatePostDto } from '@/api'
import { push } from 'notivue'
export default defineComponent(
(_, { expose }) => {
const [form, resetForm] = useResetData<AddOrUpdatePostDto>({
title: '',
content: '',
faceUrl: '',
imgUrl: '',
releaseStatus: ReleaseStatusTypeEnum.PUBLISH,
type: ArticleTypeEnum.POST,
sendType: SendTypeEnum.IMMEDIATE,
sendTime: '',
})
const formRef = ref<InstanceType<typeof ElForm>>()
const rules = {
title: [{ required: true, message: '请输入帖子标题', trigger: 'blur' }],
content: [{ required: true, message: '请输入帖子内容', trigger: 'blur' }],
sendType: [{ required: true, message: '请选择发布类型', trigger: 'blur' }],
sendTime: [{ required: true, message: '请选择发布时间', trigger: 'blur' }],
}
const transformForm = (releaseStatus: ReleaseStatusTypeEnum) => {
return {
...form.value,
releaseStatus,
faceUrl: form.value.imgUrl?.split(',').filter(Boolean)[0] || '',
}
}
const getValidatedFormData = async (releaseStatus: ReleaseStatusTypeEnum) => {
try {
await formRef.value?.validate()
return transformForm(releaseStatus)
} catch (error) {
console.log(error)
push.warning('请检查输入内容')
return null
}
}
const resetFields = () => {
formRef.value?.resetFields()
resetForm()
}
expose({
getValidatedFormData,
resetFields,
})
return () => (
<div>
<el-form
ref={formRef}
model={form.value}
label-width="auto"
label-position="right"
rules={rules}
>
<el-form-item label="标题" prop="title">
<el-input
v-model={form.value.title}
placeholder="请输入帖子标题"
maxlength={30}
show-word-limit
/>
</el-form-item>
<el-form-item label="内容" prop="content">
<el-input
v-model={form.value.content}
type="textarea"
placeholder="良言良语,快乐无限;恶语恶言,伤心伤肝。请简述发帖内容,或点击长文章编辑格式"
rows={6}
maxlength={255}
show-word-limit
class="content-input"
/>
</el-form-item>
<el-form-item label="图片" prop="faceUrl">
{/* @ts-ignore */}
<UploadFile v-model={form.value.imgUrl} />
</el-form-item>
<el-form-item label="发布类型" prop="sendType">
<el-radio-group v-model={form.value.sendType} class="radio-group">
<el-radio value={SendTypeEnum.IMMEDIATE} class="radio-item immediate">
立即发布
</el-radio>
<el-radio value={SendTypeEnum.SCHEDULED} class="radio-item scheduled">
定时发布
</el-radio>
</el-radio-group>
</el-form-item>
{form.value.sendType === SendTypeEnum.SCHEDULED && (
<el-form-item label="发布时间" prop="sendTime">
<el-date-picker
class="w-full"
v-model={form.value.sendTime}
type="datetime"
placeholder="请选择发布时间"
// 不能选现在
disabled-date={(time: Date) => {
return time.getTime() < Date.now() - 1000 * 60 * 60 * 24
}}
value-format="X"
style={{ width: '250px' }}
/>
</el-form-item>
)}
</el-form>
</div>
)
},
{
name: 'PostForm',
},
)
import { ReleaseStatusTypeEnum, SendTypeEnum } from '@/constants'
import UploadFile from '@/components/common/UploadFile/index.vue'
import SelectTags from '@/components/common/SelectTags/index.vue'
import { useResetData } from '@/hooks'
import type { TagItemDto } from '@/api/tag/types'
import type { AddOrUpdatePracticeDto } from '@/api/practice/types'
import { push } from 'notivue'
export default defineComponent((_, { expose }) => {
const [form, resetForm] = useResetData<AddOrUpdatePracticeDto>({
title: '',
content: '',
faceUrl: '',
imgUrl: '',
releaseStatus: ReleaseStatusTypeEnum.PUBLISH,
mainTagId: '',
tagList: [],
sendType: SendTypeEnum.IMMEDIATE,
sendTime: '',
})
const formRef = ref<InstanceType<typeof ElForm>>()
const rules = {
title: [{ required: true, message: '请输入实践标题', trigger: 'blur' }],
content: [{ required: true, message: '请输入实践内容', trigger: 'blur' }],
releaseStatus: [{ required: true, message: '请选择发布时间', trigger: 'blur' }],
mainTagId: [{ required: true, message: '请选择主标签', trigger: 'blur' }],
sendType: [{ required: true, message: '请选择发布类型', trigger: 'blur' }],
sendTime: [{ required: true, message: '请选择发布时间', trigger: 'blur' }],
}
const transformForm = (releaseStatus: ReleaseStatusTypeEnum) => {
return {
...form.value,
releaseStatus,
faceUrl: form.value.imgUrl.split(',')[0],
tagList: [form.value.mainTagId, ...form.value.tagList].map((tag, index) => {
return {
sort: index,
tagId: Number(tag),
}
}),
}
}
// 检验并且获取表单数据
const getValidatedFormData = async (releaseStatus: ReleaseStatusTypeEnum) => {
try {
await formRef.value?.validate()
return transformForm(releaseStatus)
} catch (error) {
console.log(error)
push.warning('请检查输入内容')
return null
}
}
const filterTagsFn = (allTags: TagItemDto[]) => {
// 引用了form.value.mainTagId
return allTags.filter((tag) => tag.id !== Number(form.value.mainTagId))
}
const resetFields = () => {
formRef.value?.resetFields()
resetForm()
}
expose({
getValidatedFormData,
resetFields,
})
return () => (
<div>
<el-form
ref={formRef}
model={form.value}
label-width="auto"
label-position="right"
rules={rules}
>
<el-form-item label="标题" prop="title">
<el-input
v-model={form.value.title}
placeholder="请输入实践标题"
maxlength={200}
show-word-limit
/>
</el-form-item>
<el-form-item label="内容" prop="content">
<el-input
v-model={form.value.content}
type="textarea"
placeholder="分享你的企业文化实践实例"
rows={6}
maxlength={2000}
show-word-limit
class="content-input"
/>
</el-form-item>
<el-form-item label="图片">
{/* @ts-ignore */}
<UploadFile v-model={form.value.imgUrl} />
</el-form-item>
<el-form-item label="主标签" prop="mainTagId">
{{
// @ts-ignore
default: () => <SelectTags v-model={form.value.mainTagId} />,
label: () => (
// <el-tooltip content="主标签最多选1个" placement="top">
<span class="cursor-pointer">
主标签
{/* <el-icon class="ml-1">
<InfoFilled />
</el-icon> */}
</span>
// </el-tooltip>
),
}}
</el-form-item>
<el-form-item label="副标签">
{{
default: () => (
// @ts-ignore
<SelectTags
v-model={form.value.tagList}
filterTagsFn={filterTagsFn}
maxSelectedTags={3}
/>
),
label: () => (
// <el-tooltip content="副标签最多选3个" placement="top">
<span class="cursor-pointer">
副标签
{/* <el-icon class="ml-1">
<InfoFilled />
</el-icon> */}
</span>
// </el-tooltip>
),
}}
</el-form-item>
<el-form-item label="发布类型" prop="sendType">
<el-radio-group v-model={form.value.sendType} class="radio-group">
<el-radio value={SendTypeEnum.IMMEDIATE} class="radio-item immediate">
立即发布
</el-radio>
<el-radio value={SendTypeEnum.SCHEDULED} class="radio-item scheduled">
定时发布
</el-radio>
</el-radio-group>
</el-form-item>
{form.value.sendType === SendTypeEnum.SCHEDULED && (
<el-form-item label="发布时间" prop="sendTime">
<el-date-picker
class="ml-2"
v-model={form.value.sendTime}
type="datetime"
placeholder="请选择发布时间"
// 不能选现在
disabled-date={(time: Date) => {
return time.getTime() < Date.now() - 1000 * 60 * 60 * 24
}}
value-format="X"
style={{ width: '250px' }}
/>
</el-form-item>
)}
</el-form>
</div>
)
})
<template>
<el-dialog
v-model="dialogVisible"
:title="dialogTitle"
:close-on-click-modal="false"
width="500px"
class="post-dialog"
:lock-scroll="true"
align-center
@closed="handleClosed"
>
<div v-loading="loading" class="bg-white/95 rounded-16px p-24px backdrop-blur-10px">
<!-- <keep-alive> -->
<component :is="currentFormComp" ref="formComponentRef" />
<!-- </keep-alive> -->
<!-- 底部按钮 -->
<div class="flex justify-end gap-1">
<el-button class="rounded-lg" @click="handleClosed">取消</el-button>
<el-button class="rounded-lg" @click="handleSubmit(ReleaseStatusTypeEnum.DRAFT)">
存草稿
</el-button>
<el-button
type="primary"
@click="handleSubmit(ReleaseStatusTypeEnum.PUBLISH)"
class="px-6 py-2 bg-blue-500 hover:bg-blue-600 rounded-lg text-white text-sm font-medium shadow-sm hover:shadow-md transition-all duration-200"
>
发布
</el-button>
</div>
</div>
</el-dialog>
</template>
<script setup lang="ts">
import type { Component } from 'vue'
// 如果 你已经按需引入了 那么写 这个就会有css bug 所以 这里不写 就是你如果写这个的话 那么 他不会引入css
// import { ElDialog } from 'element-plus'
// import { Plus } from '@element-plus/icons-vue'
import { addOrUpdateArticle, addOrUpdatePractice } from '@/api'
import { ArticleTypeEnum, ReleaseStatusTypeEnum } from '@/constants'
import LoadingComponent from '@/components/common/LoadingComponent/index.vue'
import { push } from 'notivue'
interface ApiMap {
[ArticleTypeEnum.VIDEO]: typeof addOrUpdateArticle
[ArticleTypeEnum.QUESTION]: typeof addOrUpdateArticle
[ArticleTypeEnum.POST]: typeof addOrUpdateArticle
[ArticleTypeEnum.PRACTICE]: typeof addOrUpdatePractice
[ArticleTypeEnum.COLUMN]: typeof addOrUpdateArticle
[ArticleTypeEnum.INTERVIEW]: typeof addOrUpdateArticle
}
interface TypeConfig<T extends ArticleTypeEnum> {
title: string
component: Component
api?: ApiMap[T]
}
const typeMap: {
[key in ArticleTypeEnum]: TypeConfig<key>
} = {
[ArticleTypeEnum.VIDEO]: {
title: '视频',
component: defineAsyncComponent({
loader: () => import('./postForm.tsx'),
delay: 200,
loadingComponent: LoadingComponent,
}),
},
[ArticleTypeEnum.QUESTION]: {
title: '问题',
component: defineAsyncComponent({
loader: () => import('./postForm.tsx'),
delay: 200,
loadingComponent: LoadingComponent,
}),
},
[ArticleTypeEnum.POST]: {
title: '帖子',
component: defineAsyncComponent({
loader: async () => {
const start = Date.now()
const comp = await import('./postForm.tsx')
const cost = Date.now() - start
console.log('cost', cost)
const min = 1000 // 最低 200ms
if (cost < min) {
await new Promise((r) => setTimeout(r, min - cost))
}
return comp
},
delay: 200,
loadingComponent: LoadingComponent,
}),
api: addOrUpdateArticle,
},
[ArticleTypeEnum.PRACTICE]: {
title: '实践',
component: defineAsyncComponent({
loader: () => import('./practiceForm.tsx'),
delay: 200,
loadingComponent: LoadingComponent,
}),
api: addOrUpdatePractice,
},
[ArticleTypeEnum.COLUMN]: {
title: '专栏',
component: defineAsyncComponent({
loader: () => import('./colnumForm.tsx'),
delay: 200,
loadingComponent: LoadingComponent,
}),
api: addOrUpdateArticle,
},
[ArticleTypeEnum.INTERVIEW]: {
title: '专访',
component: defineAsyncComponent({
loader: () => import('./interviewForm.tsx'),
delay: 200,
loadingComponent: LoadingComponent,
}),
api: addOrUpdateArticle,
},
}
const dialogTitle = computed(() => '发布' + typeMap[articleType.value].title)
export interface BaseFormExpose {
resetFields: () => void
getValidatedFormData: (releaseStatus: ReleaseStatusTypeEnum) => Promise<unknown>
}
const formComponentRef = useTemplateRef<BaseFormExpose>('formComponentRef')
const currentFormComp = computed(() => {
return typeMap[articleType.value].component
})
const dialogVisible = ref(false)
const articleType = ref<ArticleTypeEnum>(ArticleTypeEnum.PRACTICE)
const loading = ref(false)
// 打开弹窗
const open = (type: ArticleTypeEnum) => {
articleType.value = type
dialogVisible.value = true
}
// 关闭弹窗
const close = () => {
dialogVisible.value = false
formComponentRef?.value?.resetFields()
}
const handleClosed = () => {
dialogVisible.value = false
formComponentRef.value?.resetFields()
}
const handleSubmit = async (releaseStatus: ReleaseStatusTypeEnum) => {
loading.value = true
try {
const formData = (await formComponentRef.value?.getValidatedFormData(releaseStatus)) as any
if (!formData) return
console.log(formData)
await typeMap[articleType.value].api?.({
...formData,
})
push.success('发布成功')
// 这里可以添加发布逻辑
close()
} catch (error) {
console.log(error)
} finally {
loading.value = false
}
}
// 暴露方法给父组件
defineExpose({
open,
close,
})
</script>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment