|
@@ -1,21 +1,21 @@
|
|
|
<template>
|
|
|
- <!-- 项目申报 -->
|
|
|
-
|
|
|
+ <!-- 非遗基础表单 -->
|
|
|
<Form
|
|
|
:formModel="formModel"
|
|
|
:formOptions="formOptions"
|
|
|
:load="loadData"
|
|
|
+ :save="saveData"
|
|
|
/>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import type { IDynamicFormOptions } from '@imengyu/vue-dynamic-form';
|
|
|
+import { ref, type Ref } from 'vue';
|
|
|
+import { useImageSimpleUploadCo } from '@/common/upload/ImageUploadCo';
|
|
|
import Form from './form.vue';
|
|
|
-import { onMounted, ref, type Ref } from 'vue';
|
|
|
import InheritorContent, { IchInfo } from '@/api/inheritor/InheritorContent';
|
|
|
import CommonContent from '@/api/CommonContent';
|
|
|
+import type { IDynamicFormOptions } from '@imengyu/vue-dynamic-form';
|
|
|
import type { SelectProps } from 'ant-design-vue';
|
|
|
-import { useImageSimpleUploadCo } from '@/common/upload/ImageUploadCo';
|
|
|
import type { UploadImageFormItemProps } from '@/components/dynamicf/UploadImageFormItem';
|
|
|
|
|
|
const formModel = ref(new IchInfo()) as Ref<IchInfo>;
|
|
@@ -23,36 +23,38 @@ const formOptions = ref<IDynamicFormOptions>({
|
|
|
formLabelCol: { span: 6 },
|
|
|
formWrapperCol: { span: 24 },
|
|
|
formAdditionaProps: {
|
|
|
- layout: 'vertical'
|
|
|
+ layout: 'vertical',
|
|
|
+ scrollToFirstError: true,
|
|
|
},
|
|
|
+ formNestNameGenerateType: 'array',
|
|
|
formItems: [
|
|
|
{
|
|
|
type: 'group-flat', label: '非遗信息', name: 'ichInfo',
|
|
|
childrenColProps: { span: 24 },
|
|
|
children: [
|
|
|
{
|
|
|
- label: '标题', name: 'title', type: 'text',
|
|
|
- additionalProps: { placeholder: '请输入标题' },
|
|
|
+ label: '标题', name: 'title', type: 'text',
|
|
|
+ additionalProps: { placeholder: '请输入标题' },
|
|
|
},
|
|
|
{
|
|
|
label: '级别', name: 'level', type: 'select-id',
|
|
|
- additionalProps: {
|
|
|
- placeholder: '请选择级别',
|
|
|
- loadData: async () => (await CommonContent.getCategoryList(2)).map(p => ({ label: p.title, value: p.id, raw: p }))
|
|
|
+ additionalProps: {
|
|
|
+ placeholder: '请选择级别',
|
|
|
+ loadData: async () => (await CommonContent.getCategoryList(2)).map(p => ({ label: p.title, value: p.id, raw: p }))
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
- label: '非遗类型', name: 'ichType', type: 'select-id',
|
|
|
- additionalProps: {
|
|
|
- placeholder: '请选择非遗类型',
|
|
|
- loadData: async () => (await CommonContent.getCategoryList(4)).map(p => ({ label: p.title, value: p.id, raw: p }))
|
|
|
+ label: '非遗类型', name: 'ichType', type: 'select-id',
|
|
|
+ additionalProps: {
|
|
|
+ placeholder: '请选择非遗类型',
|
|
|
+ loadData: async () => (await CommonContent.getCategoryList(4)).map(p => ({ label: p.title, value: p.id, raw: p }))
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
- label: '批次', name: 'batch', type: 'select-id',
|
|
|
- additionalProps: {
|
|
|
- placeholder: '请选择批次',
|
|
|
- loadData: async () => (await CommonContent.getCategoryList(289)).map(p => ({ label: p.title, value: p.id, raw: p }))
|
|
|
+ label: '批次', name: 'batch', type: 'select-id',
|
|
|
+ additionalProps: {
|
|
|
+ placeholder: '请选择批次',
|
|
|
+ loadData: async () => (await CommonContent.getCategoryList(289)).map(p => ({ label: p.title, value: p.id, raw: p }))
|
|
|
},
|
|
|
},
|
|
|
{ label: '简介', name: 'intro', type: 'richtext', additionalProps: { placeholder: '请输入简介' } },
|
|
@@ -76,15 +78,37 @@ const formOptions = ref<IDynamicFormOptions>({
|
|
|
{ label: '流行地区', name: 'popularRegion', type: 'text', additionalProps: { placeholder: '请输入流行地区' } },
|
|
|
{ label: '批准时间', name: 'approveTime', type: 'text', additionalProps: { placeholder: '请输入批准时间' } },
|
|
|
{
|
|
|
- label: '代表性图片', name: 'typicalImages', type: 'mulit-image',
|
|
|
- additionalProps: {
|
|
|
- placeholder: '请上传代表性图片',
|
|
|
- tip: '格式要求: JSON数组,包含from、mobile、desc、url字段'
|
|
|
- }
|
|
|
+ type: 'array-object', label: '代表性图片', name: 'typicalImages',
|
|
|
+ formProps: {
|
|
|
+ center: false,
|
|
|
+ },
|
|
|
+ additionalProps: {
|
|
|
+ direction: 'horizontal'
|
|
|
+ },
|
|
|
+ newChildrenObject: (arrayNow) => ({
|
|
|
+ desc: `代表性图片${arrayNow.length+1}`,
|
|
|
+ url: '',
|
|
|
+ from: '',
|
|
|
+ mobile: '',
|
|
|
+ }),
|
|
|
+ children: [
|
|
|
+ { type: 'text', label: '来源', name: 'from', additionalProps: { placeholder: '请输入来源' } },
|
|
|
+ { type: 'text', label: '联系方式', name: 'mobile', additionalProps: { placeholder: '请输入联系方式' } },
|
|
|
+ { type: 'text', label: '说明', name: 'desc', additionalProps: { placeholder: '请输入说明' } },
|
|
|
+ {
|
|
|
+ label: '图片', name: 'url', type: 'single-image',
|
|
|
+ additionalProps: {
|
|
|
+ name: 'file',
|
|
|
+ placeholder: '请上传图片',
|
|
|
+ uploadCo: useImageSimpleUploadCo(),
|
|
|
+ } as UploadImageFormItemProps,
|
|
|
+ },
|
|
|
+ ]
|
|
|
},
|
|
|
{
|
|
|
- label: '展厅图片', name: 'ztImage', type: 'single-image',
|
|
|
- additionalProps: {
|
|
|
+ label: '展厅图片', name: 'ztImage', type: 'single-image',
|
|
|
+ additionalProps: {
|
|
|
+ name: 'file',
|
|
|
placeholder: '请上传展厅图片',
|
|
|
uploadCo: useImageSimpleUploadCo(),
|
|
|
} as UploadImageFormItemProps,
|
|
@@ -96,66 +120,81 @@ const formOptions = ref<IDynamicFormOptions>({
|
|
|
childrenColProps: { span: 24 },
|
|
|
children: [
|
|
|
{
|
|
|
- label: '地区', name: 'region', type: 'select-id',
|
|
|
- additionalProps: {
|
|
|
- placeholder: '请选择地区',
|
|
|
+ label: '地区', name: 'region', type: 'select-id',
|
|
|
+ additionalProps: {
|
|
|
+ placeholder: '请选择地区',
|
|
|
loadData: async () => (await CommonContent.getCategoryList(1)).map(p => ({ label: p.title, value: p.id, raw: p })) ,
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
- label: '类型', name: 'type', type: 'select',
|
|
|
- additionalProps: {
|
|
|
- placeholder: '请选择类型',
|
|
|
+ label: '类型', name: 'type', type: 'select',
|
|
|
+ additionalProps: {
|
|
|
+ placeholder: '请选择类型',
|
|
|
options: [
|
|
|
- { text: '文章', value: 1 },
|
|
|
- { text: '音频', value: 2 },
|
|
|
- { text: '视频', value: 3 },
|
|
|
- { text: '相册', value: 4 },
|
|
|
- { text: '数字档案', value: 5 }]
|
|
|
+ { text: '文章', value: 1 },
|
|
|
+ { text: '音频', value: 2 },
|
|
|
+ { text: '视频', value: 3 },
|
|
|
+ { text: '相册', value: 4 },
|
|
|
+ { text: '数字档案', value: 5 }]
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
- label: '图片', name: 'image', type: 'single-image',
|
|
|
- additionalProps: {
|
|
|
+ label: '图片', name: 'image', type: 'single-image',
|
|
|
+ additionalProps: {
|
|
|
placeholder: '请上传图片',
|
|
|
+ name: 'file',
|
|
|
uploadCo: useImageSimpleUploadCo()
|
|
|
- } as UploadImageFormItemProps,
|
|
|
+ } as UploadImageFormItemProps,
|
|
|
},
|
|
|
{
|
|
|
- label: '图片说明', name: 'imageDesc', type: 'text',
|
|
|
- additionalProps: { placeholder: '请输入图片说明' }
|
|
|
+ label: '图片说明', name: 'imageDesc', type: 'text',
|
|
|
+ additionalProps: { placeholder: '请输入图片说明' }
|
|
|
},
|
|
|
{
|
|
|
- label: '转自', name: 'from', type: 'text',
|
|
|
- additionalProps: { placeholder: '请输入来源' },
|
|
|
+ label: '转自', name: 'from', type: 'text',
|
|
|
+ additionalProps: { placeholder: '请输入来源' },
|
|
|
},
|
|
|
{
|
|
|
- label: '组图', name: 'images', type: 'mulit-image',
|
|
|
+ label: '组图', name: 'images', type: 'mulit-image',
|
|
|
hidden: { callback: (_, model) => (model as IchInfo).type !== 4 },
|
|
|
- additionalProps: {
|
|
|
+ additionalProps: {
|
|
|
placeholder: '请上传图片',
|
|
|
maxCount: 20,
|
|
|
+ name: 'file',
|
|
|
uploadCo: useImageSimpleUploadCo(),
|
|
|
- } as UploadImageFormItemProps,
|
|
|
+ } as UploadImageFormItemProps,
|
|
|
},
|
|
|
{
|
|
|
- label: '音频', name: 'audio', type: 'text',
|
|
|
+ label: '音频', name: 'audio', type: 'single-image',
|
|
|
hidden: { callback: (_, model) => (model as IchInfo).type !== 2 },
|
|
|
- additionalProps: { placeholder: '请上传音频' },
|
|
|
+ additionalProps: {
|
|
|
+ placeholder: '请上传音频',
|
|
|
+ name: 'file',
|
|
|
+ uploadCo: useImageSimpleUploadCo()
|
|
|
+ } as UploadImageFormItemProps,
|
|
|
},
|
|
|
{
|
|
|
- label: '视频', name: 'video', type: 'text',
|
|
|
+ label: '视频', name: 'video', type: 'single-video',
|
|
|
hidden: { callback: (_, model) => (model as IchInfo).type !== 3 },
|
|
|
- additionalProps: { placeholder: '请上传视频' },
|
|
|
+ additionalProps: {
|
|
|
+ placeholder: '请上传视频',
|
|
|
+ name: 'file',
|
|
|
+ uploadCo: useImageSimpleUploadCo()
|
|
|
+ } as UploadImageFormItemProps,
|
|
|
},
|
|
|
{
|
|
|
- label: '数字档案', name: 'archives', type: 'text',
|
|
|
+ label: '数字档案', name: 'archives', type: 'mulit-image',
|
|
|
hidden: { callback: (_, model) => (model as IchInfo).type !== 5 },
|
|
|
- additionalProps: { placeholder: '请上传数字档案' },
|
|
|
+ additionalProps: {
|
|
|
+ placeholder: '请上传数字档案',
|
|
|
+ maxCount: 20,
|
|
|
+ name: 'file',
|
|
|
+ uploadCo: useImageSimpleUploadCo()
|
|
|
+ } as UploadImageFormItemProps,
|
|
|
},
|
|
|
{
|
|
|
- label: '标志', name: 'flag', type: 'select',
|
|
|
- additionalProps: {
|
|
|
+ label: '标志', name: 'flag', type: 'select',
|
|
|
+ additionalProps: {
|
|
|
mode: 'tags',
|
|
|
options: [
|
|
|
{ text: '热门', value: 'hot' },
|
|
@@ -163,32 +202,85 @@ const formOptions = ref<IDynamicFormOptions>({
|
|
|
{ text: '置顶', value: 'top' },
|
|
|
],
|
|
|
placeholder: '请输入标志'
|
|
|
- } as SelectProps,
|
|
|
+ } as SelectProps,
|
|
|
},
|
|
|
{
|
|
|
- label: '关键字', name: 'keywords', type: 'select',
|
|
|
- additionalProps: {
|
|
|
+ label: '关键字', name: 'keywords', type: 'select',
|
|
|
+ additionalProps: {
|
|
|
mode: 'tags',
|
|
|
options: [],
|
|
|
placeholder: '请输入关键字,回车添加'
|
|
|
- } as SelectProps,
|
|
|
+ } as SelectProps,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '描述', name: 'desc', type: 'text-area',
|
|
|
+ additionalProps: { placeholder: '请输入描述' },
|
|
|
},
|
|
|
{
|
|
|
- label: '描述', name: 'desc', type: 'text-area',
|
|
|
- additionalProps: { placeholder: '请输入描述' },
|
|
|
+ label: 'TAG', name: 'tags', type: 'text',
|
|
|
+ additionalProps: { placeholder: '请输入TAG' },
|
|
|
},
|
|
|
{
|
|
|
- label: 'TAG', name: 'tags', type: 'text',
|
|
|
- additionalProps: { placeholder: '请输入TAG' },
|
|
|
+ label: '备注', name: 'memo', type: 'text-area',
|
|
|
+ additionalProps: { placeholder: '请输入备注' },
|
|
|
},
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type: 'group-object', label: '扩展信息', name: 'expandInfo',
|
|
|
+ childrenColProps: { span: 24 },
|
|
|
+ children: [
|
|
|
{
|
|
|
- label: '备注', name: 'memo', type: 'text-area',
|
|
|
- additionalProps: { placeholder: '请输入备注' },
|
|
|
+ type: 'select-id', label: '保护级别', name: 'protectLevel',
|
|
|
+ additionalProps: {
|
|
|
+ placeholder: '请选择保护级别',
|
|
|
+ loadData: async () => (await CommonContent.getCategoryList(171)).map(p => ({ label: p.title, value: p.id, raw: p }))
|
|
|
+ }
|
|
|
},
|
|
|
+ { type: 'text', label: '其他名称', name: 'otherNames', additionalProps: { placeholder: '请输入其他名称' } },
|
|
|
+ { type: 'text', label: '实践方式', name: 'practice', additionalProps: { placeholder: '请输入实践方式' } },
|
|
|
+ { type: 'text', label: '表现形式', name: 'expression', additionalProps: { placeholder: '请输入表现形式' } },
|
|
|
+ { type: 'text', label: '遗产持有者', name: 'holders', additionalProps: { placeholder: '请输入遗产持有者' } },
|
|
|
+ { type: 'text', label: '列入名录时间', name: 'joinday', additionalProps: { placeholder: '请选择列入名录时间' } },
|
|
|
+ { type: 'text', label: '形成时间', name: 'formation', additionalProps: { placeholder: '请选择形成时间' } },
|
|
|
+ { type: 'text', label: '分布区域', name: 'area', additionalProps: { placeholder: '请输入分布区域' } },
|
|
|
+ { type: 'text', label: '源流', name: 'origin', additionalProps: { placeholder: '请输入源流' } },
|
|
|
+ { type: 'text', label: '主要特点', name: 'feature', additionalProps: { placeholder: '请输入主要特点' } },
|
|
|
+ { type: 'text', label: '重要功能', name: 'functions', additionalProps: { placeholder: '请输入重要功能' } },
|
|
|
+ { type: 'text', label: '代表作品', name: 'works', additionalProps: { placeholder: '请输入代表作品' } },
|
|
|
+ { type: 'text', label: '保护单位', name: 'unit', additionalProps: { placeholder: '请输入保护单位' } },
|
|
|
+ { type: 'text', label: '保护情况', name: 'protect', additionalProps: { placeholder: '请输入保护情况' } },
|
|
|
+ { type: 'text-area', label: '综合概述', name: 'overview', additionalProps: { placeholder: '请输入综合概述' } },
|
|
|
+ { type: 'text', label: '代表人物', name: 'figures', additionalProps: { placeholder: '请输入代表人物' } },
|
|
|
+ { type: 'text', label: '传承群体', name: 'group', additionalProps: { placeholder: '请输入传承群体' } },
|
|
|
+ { type: 'text', label: '传承方式', name: 'inherit', additionalProps: { placeholder: '请输入传承方式' } },
|
|
|
+ { type: 'text', label: '发展现状', name: 'develop', additionalProps: { placeholder: '请输入发展现状' } },
|
|
|
+ { type: 'text', label: '相关民俗', name: 'customs', additionalProps: { placeholder: '请输入相关民俗' } },
|
|
|
+ { type: 'text', label: '相关信仰', name: 'religion', additionalProps: { placeholder: '请输入相关信仰' } },
|
|
|
+ { type: 'text', label: '文化空间', name: 'space', additionalProps: { placeholder: '请输入文化空间' } },
|
|
|
+ { type: 'text', label: '自然环境', name: 'natural', additionalProps: { placeholder: '请输入自然环境' } },
|
|
|
+ { type: 'text', label: '社会环境', name: 'social', additionalProps: { placeholder: '请输入社会环境' } },
|
|
|
+ { type: 'text', label: '历史沿革', name: 'history', additionalProps: { placeholder: '请输入历史沿革' } },
|
|
|
+ { type: 'text', label: '续存状态', name: 'existence', additionalProps: { placeholder: '请输入续存状态' } },
|
|
|
+ { type: 'text', label: '价值', name: 'meaning', additionalProps: { placeholder: '请输入价值' } },
|
|
|
+ { type: 'text', label: '相关实物', name: 'prop', additionalProps: { placeholder: '请输入相关实物' } },
|
|
|
+ { type: 'text', label: '其他基本情况', name: 'other', additionalProps: { placeholder: '请输入其他基本情况' } },
|
|
|
+ { type: 'mulit-image', label: '相关图片', name: 'images', additionalProps: { placeholder: '请上传相关图片', uploadCo: useImageSimpleUploadCo() } },
|
|
|
+ { type: 'text', label: '相关习俗', name: 'folkCulture', additionalProps: { placeholder: '请输入相关习俗' } },
|
|
|
+ { type: 'text', label: '文物古迹', name: 'culturalRelic', additionalProps: { placeholder: '请输入文物古迹' } },
|
|
|
+ { type: 'text', label: '文献资料', name: 'literature', additionalProps: { placeholder: '请输入文献资料' } },
|
|
|
+ { type: 'text', label: '组织机构', name: 'organization', additionalProps: { placeholder: '请输入组织机构' } },
|
|
|
+ { type: 'text-area', label: '项目描述', name: 'description', additionalProps: { placeholder: '请输入项目描述' } },
|
|
|
+ { type: 'text-area', label: '简介', name: 'desc', additionalProps: { placeholder: '请输入简介' } },
|
|
|
+ { type: 'text', label: '申报地区', name: 'declarationRegion', additionalProps: { placeholder: '请输入申报地区' } },
|
|
|
+ { type: 'text', label: '流行地区', name: 'popularRegion', additionalProps: { placeholder: '请输入流行地区' } },
|
|
|
]
|
|
|
},
|
|
|
],
|
|
|
formRules: {
|
|
|
+ expandInfo: {
|
|
|
+ protectLevel: [{ required: true, message: '请选择保护级别' }],
|
|
|
+ },
|
|
|
title: [{ required: true, message: '请输入标题' }],
|
|
|
region: [{ required: true, message: '请选择地区' }],
|
|
|
type: [{ required: true, message: '请选择类型' }],
|
|
@@ -201,5 +293,10 @@ const formOptions = ref<IDynamicFormOptions>({
|
|
|
|
|
|
async function loadData() {
|
|
|
formModel.value = await InheritorContent.getIchInfo();
|
|
|
+ formModel.value.expandInfo = await InheritorContent.getIchExpandInfo();
|
|
|
}
|
|
|
+async function saveData(model: IchInfo) {
|
|
|
+ await InheritorContent.saveExpandInfo(model.expandInfo);
|
|
|
+}
|
|
|
+
|
|
|
</script>
|