1
+ <template >
2
+ <Dialog :title =" dialogTitle" v-model =" dialogVisible" >
3
+ <el-form
4
+ ref =" formRef"
5
+ :model =" formData"
6
+ :rules =" formRules"
7
+ label-width =" 100px"
8
+ v-loading =" formLoading"
9
+ >
10
+ <el-form-item label =" 名字" prop =" name" >
11
+ <el-input v-model =" formData.name" placeholder =" 请输入名字" />
12
+ </el-form-item >
13
+ <el-form-item label =" 简介" prop =" description" >
14
+ <el-input v-model =" formData.description" type =" textarea" placeholder =" 请输入简介" />
15
+ </el-form-item >
16
+ <el-form-item label =" 出生日期" prop =" birthday" >
17
+ <el-date-picker
18
+ v-model =" formData.birthday"
19
+ type =" date"
20
+ value-format =" x"
21
+ placeholder =" 选择出生日期"
22
+ />
23
+ </el-form-item >
24
+ <el-form-item label =" 性别" prop =" sex" >
25
+ <el-select v-model =" formData.sex" placeholder =" 请选择性别" >
26
+ <el-option
27
+ v-for =" dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
28
+ :key =" dict.value"
29
+ :label =" dict.label"
30
+ :value =" dict.value"
31
+ />
32
+ </el-select >
33
+ </el-form-item >
34
+ <el-form-item label =" 是否有效" prop =" enabled" >
35
+ <el-radio-group v-model =" formData.enabled" >
36
+ <el-radio
37
+ v-for =" dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
38
+ :key =" dict.value"
39
+ :label =" dict.value"
40
+ >
41
+ {{ dict.label }}
42
+ </el-radio >
43
+ </el-radio-group >
44
+ </el-form-item >
45
+ <el-form-item label =" 头像" >
46
+ <UploadImg v-model =" formData.avatar" />
47
+ </el-form-item >
48
+ <el-form-item label =" 附件" prop =" video" >
49
+ <UploadFile v-model =" formData.video" />
50
+ </el-form-item >
51
+ <el-form-item label =" 备注" prop =" memo" >
52
+ <Editor v-model =" formData.memo" height =" 150px" />
53
+ </el-form-item >
54
+ </el-form >
55
+ <!-- 子表的表单 -->
56
+ <el-tabs v-model =" subTabsName" >
57
+ <el-tab-pane label =" 学生联系人" name =" demo11StudentContact" >
58
+ <Demo11StudentContactForm ref =" demo11StudentContactFormRef" :student-id =" formData.id" />
59
+ </el-tab-pane >
60
+ <el-tab-pane label =" 学生班主任" name =" demo11StudentTeacher" >
61
+ <Demo11StudentTeacherForm ref =" demo11StudentTeacherFormRef" :student-id =" formData.id" />
62
+ </el-tab-pane >
63
+ </el-tabs >
64
+ <template #footer >
65
+ <el-button @click =" submitForm" type =" primary" :disabled =" formLoading" >确 定</el-button >
66
+ <el-button @click =" dialogVisible = false" >取 消</el-button >
67
+ </template >
68
+ </Dialog >
69
+ </template >
70
+ <script setup lang="ts">
71
+ import { getIntDictOptions , getBoolDictOptions , DICT_TYPE } from ' @/utils/dict'
72
+ import * as Demo11StudentApi from ' @/api/infra/demo11'
73
+ import Demo11StudentContactForm from ' ./components/Demo11StudentContactForm.vue'
74
+ import Demo11StudentTeacherForm from ' ./components/Demo11StudentTeacherForm.vue'
75
+
76
+ const { t } = useI18n () // 国际化
77
+ const message = useMessage () // 消息弹窗
78
+
79
+ const dialogVisible = ref (false ) // 弹窗的是否展示
80
+ const dialogTitle = ref (' ' ) // 弹窗的标题
81
+ const formLoading = ref (false ) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
82
+ const formType = ref (' ' ) // 表单的类型:create - 新增;update - 修改
83
+ const formData = ref ({
84
+ id: undefined ,
85
+ name: undefined ,
86
+ description: undefined ,
87
+ birthday: undefined ,
88
+ sex: undefined ,
89
+ enabled: undefined ,
90
+ avatar: undefined ,
91
+ video: undefined ,
92
+ memo: undefined
93
+ })
94
+ const formRules = reactive ({
95
+ name: [{ required: true , message: ' 名字不能为空' , trigger: ' blur' }],
96
+ description: [{ required: true , message: ' 简介不能为空' , trigger: ' blur' }],
97
+ birthday: [{ required: true , message: ' 出生日期不能为空' , trigger: ' blur' }],
98
+ sex: [{ required: true , message: ' 性别不能为空' , trigger: ' change' }],
99
+ enabled: [{ required: true , message: ' 是否有效不能为空' , trigger: ' blur' }],
100
+ avatar: [{ required: true , message: ' 头像不能为空' , trigger: ' blur' }],
101
+ memo: [{ required: true , message: ' 备注不能为空' , trigger: ' blur' }]
102
+ })
103
+ const formRef = ref () // 表单 Ref
104
+
105
+ /** 子表的表单 */
106
+ const subTabsName = ref (' demo11StudentContact' )
107
+ const demo11StudentContactFormRef = ref ()
108
+ const demo11StudentTeacherFormRef = ref ()
109
+
110
+ /** 打开弹窗 */
111
+ const open = async (type : string , id ? : number ) => {
112
+ dialogVisible .value = true
113
+ dialogTitle .value = t (' action.' + type )
114
+ formType .value = type
115
+ resetForm ()
116
+ // 修改时,设置数据
117
+ if (id ) {
118
+ formLoading .value = true
119
+ try {
120
+ formData .value = await Demo11StudentApi .getDemo11Student (id )
121
+ } finally {
122
+ formLoading .value = false
123
+ }
124
+ }
125
+ }
126
+ defineExpose ({ open }) // 提供 open 方法,用于打开弹窗
127
+
128
+ /** 提交表单 */
129
+ const emit = defineEmits ([' success' ]) // 定义 success 事件,用于操作成功后的回调
130
+ const submitForm = async () => {
131
+ // 校验表单
132
+ await formRef .value .validate ()
133
+ // 校验子表单
134
+ try {
135
+ await demo11StudentContactFormRef .value .validate ()
136
+ } catch (e ) {
137
+ subTabsName .value = ' demo11StudentContact'
138
+ return
139
+ }
140
+ try {
141
+ await demo11StudentTeacherFormRef .value .validate ()
142
+ } catch (e ) {
143
+ subTabsName .value = ' demo11StudentTeacher'
144
+ return
145
+ }
146
+ // 提交请求
147
+ formLoading .value = true
148
+ try {
149
+ const data = formData .value as unknown as Demo11StudentApi .Demo11StudentVO
150
+ // 拼接子表的数据
151
+ data .demo11StudentContacts = demo11StudentContactFormRef .value .getData ()
152
+ data .demo11StudentTeacher = demo11StudentTeacherFormRef .value .getData ()
153
+ if (formType .value === ' create' ) {
154
+ await Demo11StudentApi .createDemo11Student (data )
155
+ message .success (t (' common.createSuccess' ))
156
+ } else {
157
+ await Demo11StudentApi .updateDemo11Student (data )
158
+ message .success (t (' common.updateSuccess' ))
159
+ }
160
+ dialogVisible .value = false
161
+ // 发送操作成功的事件
162
+ emit (' success' )
163
+ } finally {
164
+ formLoading .value = false
165
+ }
166
+ }
167
+
168
+ /** 重置表单 */
169
+ const resetForm = () => {
170
+ formData .value = {
171
+ id: undefined ,
172
+ name: undefined ,
173
+ description: undefined ,
174
+ birthday: undefined ,
175
+ sex: undefined ,
176
+ enabled: undefined ,
177
+ avatar: undefined ,
178
+ video: undefined ,
179
+ memo: undefined
180
+ }
181
+ formRef .value ?.resetFields ()
182
+ }
183
+ </script >
0 commit comments