Forráskód Böngészése

添加口述人管理

快乐的梦鱼 2 hónapja
szülő
commit
a77e1de9e7

+ 1 - 1
src/api/inhert/VillageInfoApi.ts

@@ -186,7 +186,7 @@ export class VillageInfoApi extends AppServerRequestModule<DataModel> {
       village_id: villageId,
       village_volunteer_id: villageVolunteerId,
     }, '获取信息详情'))
-      .then(res => transformArrayDataModel<T>(modelClassCreator, res.data2 ?? [], `获取分类列表`, true))
+      .then(res => transformArrayDataModel<T>(modelClassCreator, (res.data2.data || res.data2) ?? [], `获取分类列表`, true))
       .catch(e => { throw e });
   }
   async updateInfo<T extends DataModel>(

+ 5 - 1
src/common/components/dynamicf/ComponentRender.vue

@@ -61,5 +61,9 @@ const itemRef = ref();
 defineExpose({
   getItemRef: () => itemRef.value,
 })
-
+defineOptions({
+  options: {
+    virtualHost: true,
+  }
+})
 </script>

+ 21 - 0
src/components/dynamic/DynamicFormControl.vue

@@ -190,6 +190,24 @@
           />
         </view>
       </template>
+      <template v-else-if="item.type === 'button'">
+        <Button
+          ref="itemRef"
+          v-bind="params"
+        />
+      </template>
+      <template v-else-if="item.type === 'image'">
+        <Image
+          ref="itemRef"
+          v-bind="params"
+        />
+      </template>
+      <template v-else-if="item.type === 'alert'">
+        <Alert
+          ref="itemRef"
+          v-bind="params"
+        />
+      </template>
       <ComponentRender v-else
         ref="itemRef"
         :modelValue="model"
@@ -230,6 +248,9 @@ import ComponentConfigs from '@/common/components/dynamicf/ComponentConfigs';
 import ComponentRender from '@/common/components/dynamicf/ComponentRender.vue';
 import type { Rules } from 'async-validator';
 import PickerAddressField from './wrappers/PickerAddressField.vue';
+import Button from '../basic/Button.vue';
+import Alert from '../feedback/Alert.vue';
+import Image from '../basic/Image.vue';
 
 export interface FormCeilProps {
   model: unknown,

+ 12 - 0
src/pages/dig/composeable/TaskEntryForm.ts

@@ -22,4 +22,16 @@ export function useTaskEntryForm() {
   return {
     goForm,
   }
+}
+
+export function goFormStatic(villageId: number, villageVolunteerId: number, subType: string, subId: number, subKey = 'type', type = 'list', subTitle = '') {
+  navTo('/pages/dig/forms/' + type, {
+    id: type === 'common' ? 1 : undefined,
+    villageId,  
+    villageVolunteerId,  
+    subType,
+    subId,
+    subKey,
+    subTitle,
+  })
 }

+ 0 - 3
src/pages/dig/forms/common.vue

@@ -141,8 +141,5 @@ const { querys } = useLoadQuerys({
   await nextTick();
 
   formRef.value.initDefaultValuesToModel();
-
-  console.log(formModel.value);
-  
 });
 </script>

+ 54 - 3
src/pages/dig/forms/data/cultural.ts

@@ -1,12 +1,14 @@
 import VillageInfoApi, { CommonInfoModel, VillageBulidingInfo } from "@/api/inhert/VillageInfoApi";
 import type { GroupForm, SingleForm } from "../forms";
-import type { IDynamicFormItemCallbackAdditionalProps } from "@/components/dynamic";
+import type { IDynamicFormItemCallback, IDynamicFormItemCallbackAdditionalProps } from "@/components/dynamic";
 import type { PickerIdFieldProps } from "@/components/dynamic/wrappers/PickerIdField";
 import type { FieldProps } from "@/components/form/Field.vue";
-import { useAliOssUploadCo } from "@/common/components/upload/AliOssUploadCo";
 import type { UploaderInstance } from "@/components/form/Uploader.vue";
 import type { UploaderFieldProps, UploaderFieldInstance } from "@/components/form/UploaderField.vue";
+import { useAliOssUploadCo } from "@/common/components/upload/AliOssUploadCo";
 import { villageCommonContent } from "./common";
+import { goFormStatic } from "../../composeable/TaskEntryForm";
+import type { ButtonProp } from "@/components/basic/Button.vue";
 
 export function villageInfoFolkCultureForm(title: string) : SingleForm {
   return [VillageBulidingInfo, (m) => ({
@@ -93,6 +95,55 @@ export const villageInfoCulture : GroupForm = {
         showTitle: true
       }).formItems.slice(0, 1),
       {
+        label: '口述人', 
+        name: 'speakerId',
+        type: 'select-id', 
+        additionalProps: {
+          loadData: { 
+            callback(_, m, p, i) { 
+              return async () => (await VillageInfoApi.getList('speaker', undefined, undefined,
+                i.formGlobalParams.villageId,
+                i.formGlobalParams.villageVolunteerId
+              ))
+              .map((p) => ({
+                value: p.id,
+                text: p.name,
+              }))
+            } 
+          },
+        } as IDynamicFormItemCallbackAdditionalProps<PickerIdFieldProps>,
+        formProps: { showRightArrow: true } as FieldProps,
+        rules: [{
+          required: true,
+          message: '请选择口述人',
+        }],
+      },
+      {
+        label: '口述人管理',
+        type: 'button',
+        name: 'manage',
+        defaultValue: '',
+        additionalProps: {
+          text: '口述人管理',
+          onClick: { callback(v, m, p, i) {
+            return () => {
+              goFormStatic(
+                i.formGlobalParams.villageId,
+                i.formGlobalParams.villageVolunteerId,
+                'speaker',
+                1,
+                undefined,
+                undefined,
+                '口述人管理'
+              );
+            }
+          } } as IDynamicFormItemCallback<() => void>,
+        } as IDynamicFormItemCallbackAdditionalProps<ButtonProp>,
+        formProps: {
+          inputAlign: 'right'
+        } as FieldProps,
+      },
+      {
         label: '口述历史视频/录音',
         name: 'video',
         type: 'uploader',
@@ -123,4 +174,4 @@ export const villageInfoCulture : GroupForm = {
       },
     ],
   })],
-}
+}

+ 127 - 0
src/pages/dig/forms/data/specker.ts

@@ -0,0 +1,127 @@
+import { CommonInfoModel } from "@/api/inhert/VillageInfoApi";
+import { useAliOssUploadCo } from "@/common/components/upload/AliOssUploadCo";
+import type { PickerIdFieldProps } from "@/components/dynamic/wrappers/PickerIdField";
+import type { FieldProps } from "@/components/form/Field.vue";
+import type { UploaderFieldProps } from "@/components/form/UploaderField.vue";
+import type { SingleForm } from "../forms";
+import { villageCommonContent } from "./common";
+import type { RadioIdFieldProps } from "@/components/dynamic/wrappers/RadioIdField";
+
+export const villageInfoSpeakerForm : SingleForm = [CommonInfoModel, (r) => ({
+  formItems: [
+    {
+      label: '基本信息',
+      name: 'baseInfo',
+      type: 'flat-group',
+      childrenColProps: {
+        span: 24,
+      },
+      children: [
+        {
+          label: '标题',
+          name: 'name',
+          type: 'text',
+          defaultValue: '',
+          additionalProps: {
+            placeholder: '请输入标题',
+          },
+          rules: [{
+            required: true,
+            message: '请输入标题',
+          }]
+        },
+        {
+          label: '性别',
+          name: 'sex',
+          type: 'radio-id',
+          defaultValue: 3,
+          additionalProps: {
+            loadData: async () => [
+              { value: 1, text: '男' },
+              { value: 2, text: '女' },
+              { value: 3, text: '未知' },
+            ],
+          } as RadioIdFieldProps,
+          rules: [{
+            required: true,
+            message: '请选择性别',
+          }]
+        },
+        {
+          label: '联系方式',
+          name: 'mobile',
+          type: 'text',
+          defaultValue: '',
+          additionalProps: {
+            placeholder: '请输入联系方式',
+          },
+          rules: []
+        },
+        {
+          label: '生日',
+          name: 'birth',
+          type: 'datetime',
+          defaultValue: '',
+          additionalProps: {
+            type: 'date',
+          },
+          formProps: { showRightArrow: true } as FieldProps,
+          rules: [{
+            required: true,
+            message: '请选择生日',
+          }]
+        },
+      ]
+    },
+    {
+      label: '媒体信息',
+      name: 'mediaInfo',
+      type: 'flat-group',
+      childrenColProps: {
+        span: 24,
+      },
+      children: [
+        {
+          label: '头像',
+          name: 'image',
+          type: 'uploader',
+          defaultValue: '',
+          additionalProps: {
+            upload: useAliOssUploadCo('xiangyuan/speaker'),
+            maxFileSize: 1024 * 1024 * 20,
+            maxUploadCount: 1,
+          } as UploaderFieldProps,
+          rules: []
+        },
+        {
+          label: '头像说明',
+          name: 'image_desc',
+          type: 'text',
+          defaultValue: '',
+          additionalProps: {
+            placeholder: '请输入头像说明',
+          },
+          rules: []
+        },
+        {
+          label: '音频',
+          name: 'audio',
+          type: 'uploader',
+          defaultValue: '',
+          additionalProps: {
+            upload: useAliOssUploadCo('xiangyuan/speaker/audio'),
+            maxFileSize: 1024 * 1024 * 50,
+            maxUploadCount: 1,
+            accept: 'audio/*',
+          } as UploaderFieldProps,
+          rules: []
+        },
+        ...villageCommonContent(r, {
+          title: '口述人',
+          showTitle: false,
+          showContent: false,
+        }).formItems,
+      ]
+    },
+  ]
+})]

+ 4 - 0
src/pages/dig/forms/forms.ts

@@ -24,6 +24,7 @@ import { villageInfoRelicForm } from "./data/relic";
 import { vilElementForm } from "./data/element";
 import { villageInfoFigureFormItems, villageInfoStoryFormItems } from "./data/history";
 import { villageInfoRouteForm, villageInfoTravelGuideForm } from "./data/travel";
+import { villageInfoSpeakerForm } from "./data/specker";
 
 export type SingleForm = [NewDataModel, (formRef: Ref<IDynamicFormRef>) => IDynamicFormOptions]
 export type GroupForm = Record<number, SingleForm>
@@ -34,6 +35,9 @@ const villageInfoForm : Record<string, GroupForm> = {
   'story': {
     [0]: villageInfoStoryFormItems
   },
+  'speaker': {
+    [1]: villageInfoSpeakerForm,
+  },
   'figure': {
     [0]: villageInfoFigureFormItems,
   },