works.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <template>
  2. <!-- 传承人作品采集 -->
  3. <Form
  4. :formModel="formModel"
  5. :formOptions="formOptions"
  6. :load="loadData"
  7. />
  8. </template>
  9. <script setup lang="ts">
  10. import { ref, type Ref } from 'vue';
  11. import { useImageSimpleUploadCo } from '@/common/upload/ImageUploadCo';
  12. import Form from './form.vue';
  13. import InheritorContent, { InheritorWorkInfo } from '@/api/inheritor/InheritorContent';
  14. import CommonContent from '@/api/CommonContent';
  15. import type { IDynamicFormOptions } from '@imengyu/vue-dynamic-form';
  16. import type { SelectProps } from 'ant-design-vue';
  17. import type { UploadImageFormItemProps } from '@/components/dynamicf/UploadImageFormItem';
  18. import { useRoute } from 'vue-router';
  19. const formModel = ref(new InheritorWorkInfo()) as Ref<InheritorWorkInfo>;
  20. const formOptions = ref<IDynamicFormOptions>({
  21. formLabelCol: { span: 6 },
  22. formWrapperCol: { span: 24 },
  23. formAdditionaProps: {
  24. layout: 'vertical',
  25. scrollToFirstError: true,
  26. },
  27. formNestNameGenerateType: 'array',
  28. formItems: [
  29. {
  30. type: 'group-flat', label: '作品信息', name: 'baseInfo',
  31. childrenColProps: { span: 24 },
  32. children: [
  33. { label: '标题', name: 'title', type: 'text', additionalProps: { placeholder: '请输入标题' } },
  34. { label: '地区', name: 'region', type: 'select-id', additionalProps: { placeholder: '请选择地区', loadData: async () => (await CommonContent.getCategoryList(1)).map(p => ({ label: p.title, value: p.id, raw: p })) } },
  35. { label: '类型', name: 'type', type: 'select', additionalProps: { placeholder: '请选择类型', options: [{ text: '文章', value: 1 }, { text: '音频', value: 2 }, { text: '视频', value: 3 }, { text: '相册', value: 4 }, { text: '数字档案', value: 5 }] } },
  36. { label: '图片', name: 'image', type: 'single-image', additionalProps: { placeholder: '请上传图片', uploadCo: useImageSimpleUploadCo(), name: 'file', accept: 'image/*' } as UploadImageFormItemProps },
  37. { label: '图片说明', name: 'imageDesc', type: 'text', additionalProps: { placeholder: '请输入图片说明' } },
  38. { label: '组图', name: 'images', type: 'mulit-image', additionalProps: { placeholder: '请上传组图', uploadCo: useImageSimpleUploadCo(), name: 'file', accept: 'image/*', maxCount: 20 } as UploadImageFormItemProps },
  39. { label: '内容介绍', name: 'content', type: 'richtext', additionalProps: { placeholder: '请输入内容介绍' } },
  40. {
  41. label: '音频', name: 'audio', type: 'single-image',
  42. hidden: { callback: (_, model) => (model as InheritorWorkInfo).type !== 2 },
  43. additionalProps: {
  44. placeholder: '请上传音频',
  45. uploadCo: useImageSimpleUploadCo(), name: 'file'
  46. } as UploadImageFormItemProps
  47. },
  48. {
  49. label: '视频', name: 'video', type: 'single-video',
  50. hidden: { callback: (_, model) => (model as InheritorWorkInfo).type !== 3 },
  51. additionalProps: {
  52. placeholder: '请上传视频', uploadCo: useImageSimpleUploadCo(), name: 'file'
  53. } as UploadImageFormItemProps
  54. },
  55. {
  56. label: '数字档案', name: 'archives', type: 'mulit-image',
  57. hidden: { callback: (_, model) => (model as InheritorWorkInfo).type !== 5 },
  58. additionalProps: { placeholder: '请上传数字档案', uploadCo: useImageSimpleUploadCo(), name: 'file', maxCount: 20 } as UploadImageFormItemProps
  59. },
  60. ]
  61. },
  62. {
  63. type: 'group-flat', label: '扩展信息', name: 'extendInfo',
  64. childrenColProps: { span: 24 },
  65. children: [
  66. { label: '转自', name: 'from', type: 'text', additionalProps: { placeholder: '请输入转自' } },
  67. { label: '关键字', name: 'keywords', type: 'select', additionalProps: { mode: 'tags', options: [], placeholder: '请输入关键字,回车添加' } as SelectProps },
  68. { label: '描述', name: 'desc', type: 'text-area', additionalProps: { placeholder: '请输入描述' } },
  69. { label: 'TAG', name: 'tags', type: 'text', additionalProps: { placeholder: '请输入TAG' } },
  70. { label: '分类', name: 'category', type: 'text', additionalProps: { placeholder: '请输入分类' } },
  71. { label: '特点', name: 'feature', type: 'text', additionalProps: { placeholder: '请输入特点' } },
  72. { label: '别名别称', name: 'otherName', type: 'text', additionalProps: { placeholder: '请输入别名别称' } },
  73. { label: '创作者', name: 'creator', type: 'text', additionalProps: { placeholder: '请输入创作者' } },
  74. { label: '语言', name: 'language', type: 'text', additionalProps: { placeholder: '请输入语言' } },
  75. { label: '内容概览', name: 'overview', type: 'text', additionalProps: { placeholder: '请输入内容概览' } },
  76. { label: '族属', name: 'ethnicGroup', type: 'text', additionalProps: { placeholder: '请输入族属' } },
  77. { label: '形成或记录年代', name: 'creationEra', type: 'text', additionalProps: { placeholder: '请输入形成或记录年代' } },
  78. { label: '主要演述人', name: 'mainPerformer', type: 'text', additionalProps: { placeholder: '请输入主要演述人' } },
  79. { label: '其他代表人物', name: 'otherPerformers', type: 'text', additionalProps: { placeholder: '请输入其他代表人物' } },
  80. { label: '作品全文', name: 'fullString', type: 'text-area', additionalProps: { placeholder: '请输入作品全文' } },
  81. { label: '曲调', name: 'tune', type: 'text', additionalProps: { placeholder: '请输入曲调' } },
  82. { label: '发展演变', name: 'development', type: 'text', additionalProps: { placeholder: '请输入发展演变' } },
  83. { label: '流传情况', name: 'spread', type: 'text', additionalProps: { placeholder: '请输入流传情况' } },
  84. { label: '影响力', name: 'influence', type: 'text', additionalProps: { placeholder: '请输入影响力' } },
  85. { label: '采集人', name: 'collector', type: 'text', additionalProps: { placeholder: '请输入采集人' } },
  86. { label: '采集时间', name: 'collectionTime', type: 'date-time', additionalProps: { placeholder: '请选择采集时间' } },
  87. { label: '采集地点', name: 'collectionLocation', type: 'text', additionalProps: { placeholder: '请输入采集地点' } },
  88. ]
  89. }
  90. ],
  91. formRules: {
  92. title: [{ required: true, message: '请输入标题' }],
  93. region: [{ required: true, message: '请选择地区' }],
  94. image: [{ required: true, message: '请上传图片' }],
  95. type: [{ required: true, message: '请选择类型' }],
  96. images: [{ required: true, message: '请上传组图' }],
  97. content: [{ required: true, message: '请输入内容介绍' }],
  98. }
  99. });
  100. const route = useRoute();
  101. async function loadData() {
  102. const id = parseFloat(route.query.id as string);
  103. if (id) {
  104. const works = await InheritorContent.getInheritorInfo();
  105. formModel.value = works.works.find((item) => item.id === id) || new InheritorWorkInfo();
  106. }
  107. }
  108. </script>