潘志宝
2024-09-09 ed81b7371e376df35448b81531d30dd9024bd44a
提交 | 用户 | 时间
e7c126 1 <template>
H 2   <el-form
3     ref="formRef"
4     :model="formData"
5     :rules="formRules"
6     label-width="100px"
7     v-loading="formLoading"
8   >
9      <el-form-item label="名字" prop="name">
10       <el-input v-model="formData.name" placeholder="请输入名字" />
11     </el-form-item>
12     <el-form-item label="简介" prop="description">
13       <el-input v-model="formData.description" type="textarea" placeholder="请输入简介" />
14     </el-form-item>
15     <el-form-item label="出生日期" prop="birthday">
16       <el-date-picker
17         v-model="formData.birthday"
18         type="date"
19         value-format="x"
20         placeholder="选择出生日期"
21       />
22     </el-form-item>
23     <el-form-item label="性别" prop="sex">
24       <el-select v-model="formData.sex" placeholder="请选择性别">
25         <el-option
26           v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
27           :key="dict.value"
28           :label="dict.label"
29           :value="dict.value"
30         />
31       </el-select>
32     </el-form-item>
33     <el-form-item label="是否有效" prop="enabled">
34       <el-radio-group v-model="formData.enabled">
35         <el-radio
36           v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
37           :key="dict.value"
38           :label="dict.value"
39           >
40           {{ dict.label }}
41         </el-radio>
42       </el-radio-group>
43     </el-form-item>
44     <el-form-item label="头像" prop="avatar">
45       <UploadImg v-model="formData.avatar" />
46     </el-form-item>
47     <el-form-item label="附件" prop="video">
48       <UploadFile v-model="formData.video" />
49     </el-form-item>
50     <el-form-item label="备注" prop="memo">
51       <Editor v-model="formData.memo" height="150px" />
52     </el-form-item>
53   </el-form>
54 </template>
55 <script setup lang="ts">
56 import { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
57 import * as StudentApi from '@/api/infra/demo'
58
59 const props = defineProps<{
60   studentId: undefined // 学生编号(主表的关联字段)
61 }>()
62 const formLoading = ref(false) // 表单的加载中
63 const formData = ref([])
64 const formRules = reactive({
65   studentId: [{ required: true, message: '学生编号不能为空', trigger: 'blur' }],
66   name: [{ required: true, message: '名字不能为空', trigger: 'blur' }],
67   description: [{ required: true, message: '简介不能为空', trigger: 'blur' }],
68   birthday: [{ required: true, message: '出生日期不能为空', trigger: 'blur' }],
69   sex: [{ required: true, message: '性别不能为空', trigger: 'change' }],
70   enabled: [{ required: true, message: '是否有效不能为空', trigger: 'blur' }],
71   avatar: [{ required: true, message: '头像不能为空', trigger: 'blur' }],
72   memo: [{ required: true, message: '备注不能为空', trigger: 'blur' }],
73 })
74 const formRef = ref() // 表单 Ref
75
76 /** 监听主表的关联字段的变化,加载对应的子表数据 */
77 watch(
78   () => props.studentId,
79   async (val) => {
80     // 1. 重置表单
81     formData.value = {
82       id: undefined,
83       studentId: undefined,
84       name: undefined,
85       description: undefined,
86       birthday: undefined,
87       sex: undefined,
88       enabled: undefined,
89       avatar: undefined,
90       video: undefined,
91       memo: undefined,
92     }
93     // 2. val 非空,则加载数据
94     if (!val) {
95       return;
96     }
97     try {
98       formLoading.value = true
99       const data = await StudentApi.getStudentTeacherByStudentId(val)
100       if (!data) {
101         return
102       }
103       formData.value = data
104     } finally {
105       formLoading.value = false
106     }
107   },
108   { immediate: true }
109 )
110
111 /** 表单校验 */
112 const validate = () => {
113   return formRef.value.validate()
114 }
115
116 /** 表单值 */
117 const getData = () => {
118   return formData.value
119 }
120
121 defineExpose({ validate, getData })
122 </script>