seminar.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. <template>
  2. <!-- 传习所基础表单
  3. :extendFormModel="formExtendModel"
  4. :extendFormOptions="formExtendOptions" -->
  5. <Form
  6. ref="formRef"
  7. :formModel="formModel"
  8. :formOptions="formOptions"
  9. :load="loadData"
  10. />
  11. </template>
  12. <script setup lang="ts">
  13. import { ref, type Ref } from 'vue';
  14. import { useImageSimpleUploadCo } from '@/common/upload/ImageUploadCo';
  15. import Form from './form.vue';
  16. import InheritorContent, { SeminarExpandInfo, SeminarInfo } from '@/api/inheritor/InheritorContent';
  17. import CommonContent from '@/api/CommonContent';
  18. import type { IDynamicFormOptions, IDynamicFormRef } from '@imengyu/vue-dynamic-form';
  19. import type { SelectProps } from 'ant-design-vue';
  20. import type { UploadImageFormItemProps } from '@/components/dynamicf/UploadImageFormItem';
  21. import type { AddressItem } from '@/components/dynamicf/Map/AddressSercher.vue';
  22. import { useAuthStore } from '@/stores/auth';
  23. import { useAliOssUploadCo } from '@/common/upload/AliOssUploadCo';
  24. const authStore = useAuthStore();
  25. const formRef = ref();
  26. const formModel = ref(new SeminarInfo()) as Ref<SeminarInfo>;
  27. const formOptions = ref<IDynamicFormOptions>({
  28. formLabelCol: { span: 6 },
  29. formWrapperCol: { span: 24 },
  30. formAdditionaProps: {
  31. layout: 'vertical',
  32. scrollToFirstError: true,
  33. },
  34. formNestNameGenerateType: 'array',
  35. formItems: [
  36. {
  37. type: 'group-flat', label: '传习所/保护单位信息', name: 'seminarInfo',
  38. childrenColProps: { span: 24 },
  39. children: [
  40. {
  41. label: '传习所名称', name: 'title', type: 'text',
  42. additionalProps: { placeholder: '请输入标题' },
  43. },
  44. {
  45. label: '批次', name: 'batch', type: 'select-id',
  46. additionalProps: {
  47. placeholder: '请选择批次',
  48. loadData: async () => (await CommonContent.getCategoryList(289)).map(p => ({ label: p.title, value: p.id, raw: p }))
  49. },
  50. },
  51. {
  52. label: '传习所级别', name: 'level', type: 'select-id',
  53. additionalProps: {
  54. placeholder: '请选择传习所级别',
  55. loadData: async () => (await CommonContent.getCategoryList(2)).map(p => ({ label: p.title, value: p.id, raw: p }))
  56. },
  57. },
  58. { label: '传习所介绍', name: 'content', type: 'richtext', additionalProps: { placeholder: '请输入内容' } },
  59. { label: '传习所地址', name: 'address', type: 'address-sercher',
  60. additionalProps: { placeholder: '请输入地址' },
  61. additionalEvents: {
  62. choosedAddress: (address: AddressItem) => {
  63. ((formRef.value?.getFormRef() as IDynamicFormRef).getFormItemControlRef('lonlat') as any).moveTo([
  64. address.lng, address.lat
  65. ], 20)
  66. },
  67. }
  68. },
  69. { label: '地图坐标', name: 'lonlat', type: 'map-pick-point' },
  70. {
  71. type: 'simple-flat', label: '', name: 'map',
  72. childrenColProps: { span: 12 },
  73. children: [
  74. { label: '平面坐标X', name: 'mapX', type: 'number', additionalProps: { placeholder: '请输入平面坐标X' } },
  75. { label: '平面坐标Y', name: 'mapY', type: 'number', additionalProps: { placeholder: '请输入平面坐标Y' } },
  76. ]
  77. },
  78. { label: '联系人', name: 'contact', type: 'text', additionalProps: { placeholder: '请输入联系人' } },
  79. { label: '联系电话', name: 'mobile', type: 'text', additionalProps: { placeholder: '请输入联系电话' } },
  80. {
  81. label: '传习所/保护单位类型', name: 'ichSiteType', type: 'select',
  82. additionalProps: {
  83. placeholder: '请选择非遗单位类型',
  84. options: [
  85. { text: '传习所', value: 1 },
  86. { text: '保护单位', value: 2 }
  87. ]
  88. },
  89. },
  90. {
  91. label: '是否对游客开放', name: 'visit', type: 'select',
  92. additionalProps: {
  93. placeholder: '请选择是否对游客开放',
  94. options: [
  95. { text: '否', value: 0 },
  96. { text: '是', value: 1 }
  97. ]
  98. },
  99. },
  100. {
  101. label: '审核人员', name: 'text1', type: 'static-text',
  102. additionalProps: {
  103. text: '黄念旭,李向群,卢志明',
  104. style: { color: '#999', }
  105. }
  106. },
  107. {
  108. label: '审核状态', name: 'text2', type: 'static-text',
  109. additionalProps: {
  110. text: '暂未审核',
  111. style: { color: '#999', }
  112. }
  113. },
  114. {
  115. label: '填报人', name: 'text3', type: 'static-text',
  116. additionalProps: {
  117. text: authStore.userInfo?.nickname,
  118. }
  119. },
  120. ]
  121. },
  122. /* {
  123. type: 'group-flat', label: '通用信息', name: 'commonInfo',
  124. childrenColProps: { span: 24 },
  125. children: [
  126. {
  127. label: '地区', name: 'region', type: 'select-id',
  128. additionalProps: {
  129. placeholder: '请选择地区',
  130. loadData: async () => (await CommonContent.getCategoryList(1)).map(p => ({ label: p.title, value: p.id, raw: p })) ,
  131. },
  132. },
  133. {
  134. label: '类型', name: 'type', type: 'select',
  135. additionalProps: {
  136. placeholder: '请选择类型',
  137. options: [
  138. { text: '文章', value: 1 },
  139. { text: '音频', value: 2 },
  140. { text: '视频', value: 3 },
  141. { text: '相册', value: 4 },
  142. { text: '数字档案', value: 5 }]
  143. },
  144. },
  145. {
  146. label: '图片', name: 'image', type: 'single-image',
  147. additionalProps: {
  148. placeholder: '请上传图片',
  149. name: 'file',
  150. beforeUpload: useBeforeUploadImageChecker(),
  151. uploadCo: useAliOssUploadCo('seminar/images')
  152. } as UploadImageFormItemProps,
  153. },
  154. {
  155. label: '图片说明', name: 'imageDesc', type: 'text',
  156. additionalProps: { placeholder: '请输入图片说明' }
  157. },
  158. {
  159. label: '转自', name: 'from', type: 'text',
  160. additionalProps: { placeholder: '请输入来源' },
  161. },
  162. {
  163. label: '组图', name: 'images', type: 'mulit-image',
  164. hidden: { callback: (_, model) => (model as SeminarInfo).type !== 4 },
  165. additionalProps: {
  166. placeholder: '请上传图片',
  167. maxCount: 20,
  168. name: 'file',
  169. beforeUpload: useBeforeUploadImageChecker(),
  170. uploadCo: useAliOssUploadCo('seminar/images'),
  171. } as UploadImageFormItemProps,
  172. },
  173. {
  174. label: '音频', name: 'audio', type: 'single-image',
  175. hidden: { callback: (_, model) => (model as SeminarInfo).type !== 2 },
  176. additionalProps: {
  177. placeholder: '请上传音频',
  178. name: 'file',
  179. beforeUpload: useBeforeUploadAudioChecker(),
  180. uploadCo: useAliOssUploadCo('seminar/audios')
  181. } as UploadImageFormItemProps,
  182. },
  183. {
  184. label: '相关视频', name: 'video', type: 'single-video',
  185. hidden: { callback: (_, model) => (model as SeminarInfo).type !== 3 },
  186. additionalProps: {
  187. placeholder: '请上传视频',
  188. name: 'file',
  189. beforeUpload: useBeforeUploadVideoChecker(),
  190. uploadCo: useAliOssUploadCo('seminar/videos')
  191. } as UploadImageFormItemProps,
  192. },
  193. {
  194. label: '数字档案', name: 'archives', type: 'mulit-image',
  195. hidden: { callback: (_, model) => (model as SeminarInfo).type !== 5 },
  196. additionalProps: {
  197. placeholder: '请上传数字档案',
  198. maxCount: 20,
  199. name: 'file',
  200. uploadCo: useAliOssUploadCo('seminar/archives')
  201. } as UploadImageFormItemProps,
  202. },
  203. {
  204. label: '标志', name: 'flag', type: 'select',
  205. additionalProps: {
  206. mode: 'tags',
  207. options: [
  208. { text: '热门', value: 'hot' },
  209. { text: '推荐', value: 'recommend' },
  210. { text: '置顶', value: 'top' },
  211. ],
  212. placeholder: '请输入标志'
  213. } as SelectProps,
  214. },
  215. {
  216. label: '关键字', name: 'keywords', type: 'select',
  217. additionalProps: {
  218. mode: 'tags',
  219. options: [],
  220. placeholder: '请输入关键字,回车添加'
  221. } as SelectProps,
  222. },
  223. {
  224. label: '描述', name: 'desc', type: 'text-area',
  225. additionalProps: { placeholder: '请输入描述' },
  226. },
  227. {
  228. label: 'TAG', name: 'tags', type: 'text',
  229. additionalProps: { placeholder: '请输入TAG' },
  230. },
  231. {
  232. label: '备注', name: 'memo', type: 'text-area',
  233. additionalProps: { placeholder: '请输入备注' },
  234. },
  235. ]
  236. }, */
  237. ],
  238. formRules: {
  239. expandInfo: {
  240. protectLevel: [{ required: true, message: '请选择保护级别' }],
  241. },
  242. title: [{ required: true, message: '请输入标题' }],
  243. region: [{ required: true, message: '请选择地区' }],
  244. type: [{ required: true, message: '请选择类型' }],
  245. image: [{ required: true, message: '请上传图片' }],
  246. level: [{ required: true, message: '请选择级别' }],
  247. ichType: [{ required: true, message: '请选择非遗类型' }],
  248. batch: [{ required: true, message: '请输入批次' }]
  249. }
  250. });
  251. const formExtendModel = ref(new SeminarExpandInfo()) as Ref<SeminarExpandInfo>;
  252. const formExtendOptions = ref<IDynamicFormOptions>({
  253. formLabelCol: { span: 6 },
  254. formWrapperCol: { span: 24 },
  255. formAdditionaProps: {
  256. layout: 'vertical',
  257. scrollToFirstError: true,
  258. },
  259. formNestNameGenerateType: 'array',
  260. formItems: [
  261. { label: '持有者', name: 'holders', type: 'text', additionalProps: { placeholder: '请输入持有者' } },
  262. { label: '地区', name: 'region', type: 'select-id', additionalProps: { placeholder: '请选择地区', loadData: async () => (await CommonContent.getCategoryList(1)).map(p => ({ label: p.title, value: p.id, raw: p })) } },
  263. { label: '地图坐标', name: 'lonlat', type: 'map-pick-point' },
  264. {
  265. type: 'simple-flat', label: '', name: 'map',
  266. childrenColProps: { span: 12 },
  267. children: [
  268. { label: '平面坐标X', name: 'mapX', type: 'number', additionalProps: { placeholder: '请输入平面坐标X' } },
  269. { label: '平面坐标Y', name: 'mapY', type: 'number', additionalProps: { placeholder: '请输入平面坐标Y' } },
  270. ]
  271. },
  272. { label: '成立时间', name: 'openTime', type: 'date-time', additionalProps: { placeholder: '请选择成立时间' } },
  273. { label: '图片', name: 'image', type: 'single-image', additionalProps: { placeholder: '请上传图片', uploadCo: useAliOssUploadCo('seminar/images') } },
  274. { label: '相关图片', name: 'images', type: 'mulit-image', additionalProps: { placeholder: '请上传相关图片', uploadCo: useAliOssUploadCo('seminar/images') } },
  275. { label: '地址', name: 'address', type: 'text', additionalProps: { placeholder: '请输入地址' } },
  276. { label: '描述', name: 'intro', type: 'text-area', additionalProps: { placeholder: '请输入描述' } },
  277. { label: '简介', name: 'desc', type: 'text-area', additionalProps: { placeholder: '请输入简介' } }
  278. ],
  279. formRules: {
  280. region: [{ required: true, message: '请选择地区' }]
  281. }
  282. });
  283. async function loadData(id: number|undefined) {
  284. formModel.value = await InheritorContent.getSeminarInfo(id);
  285. formModel.value.expandInfo = await InheritorContent.getSeminarExpandInfo(id);
  286. formExtendModel.value = formModel.value.expandInfo || new SeminarExpandInfo();
  287. }
  288. </script>