form.vue.vm 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  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. #foreach($column in $columns)
  11. #if ($column.createOperation || $column.updateOperation)
  12. #set ($dictType = $column.dictType)
  13. #set ($javaField = $column.javaField)
  14. #set ($javaType = $column.javaType)
  15. #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
  16. #set ($comment = $column.columnComment)
  17. #set ($dictMethod = "getDictOptions")## 计算使用哪个 dict 字典方法
  18. #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short")
  19. #set ($dictMethod = "getIntDictOptions")
  20. #elseif ($javaType == "String")
  21. #set ($dictMethod = "getStrDictOptions")
  22. #elseif ($javaType == "Boolean")
  23. #set ($dictMethod = "getBoolDictOptions")
  24. #end
  25. #if ( $table.templateType == 2 && $column.id == $treeParentColumn.id )
  26. <el-form-item label="${comment}" prop="${javaField}">
  27. <el-tree-select
  28. v-model="formData.${javaField}"
  29. :data="${classNameVar}Tree"
  30. #if ($treeNameColumn.javaField == "name")
  31. :props="defaultProps"
  32. #else
  33. :props="{...defaultProps, label: '$treeNameColumn.javaField'}"
  34. #end
  35. check-strictly
  36. default-expand-all
  37. placeholder="请选择${comment}"
  38. />
  39. </el-form-item>
  40. #elseif ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里
  41. <el-form-item label="${comment}" prop="${javaField}">
  42. <el-input v-model="formData.${javaField}" placeholder="请输入${comment}" />
  43. </el-form-item>
  44. #elseif($column.htmlType == "imageUpload")## 图片上传
  45. <el-form-item label="${comment}" prop="${javaField}">
  46. <UploadImg v-model="formData.${javaField}" />
  47. </el-form-item>
  48. #elseif($column.htmlType == "fileUpload")## 文件上传
  49. <el-form-item label="${comment}" prop="${javaField}">
  50. <UploadFile v-model="formData.${javaField}" />
  51. </el-form-item>
  52. #elseif($column.htmlType == "editor")## 文本编辑器
  53. <el-form-item label="${comment}" prop="${javaField}">
  54. <Editor v-model="formData.${javaField}" height="150px" />
  55. </el-form-item>
  56. #elseif($column.htmlType == "select")## 下拉框
  57. <el-form-item label="${comment}" prop="${javaField}">
  58. <el-select v-model="formData.${javaField}" placeholder="请选择${comment}">
  59. #if ("" != $dictType)## 有数据字典
  60. <el-option
  61. v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
  62. :key="dict.value"
  63. :label="dict.label"
  64. :value="dict.value"
  65. />
  66. #else##没数据字典
  67. <el-option label="请选择字典生成" value="" />
  68. #end
  69. </el-select>
  70. </el-form-item>
  71. #elseif($column.htmlType == "checkbox")## 多选框
  72. <el-form-item label="${comment}" prop="${javaField}">
  73. <el-checkbox-group v-model="formData.${javaField}">
  74. #if ("" != $dictType)## 有数据字典
  75. <el-checkbox
  76. v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
  77. :key="dict.value"
  78. :label="dict.value"
  79. >
  80. {{ dict.label }}
  81. </el-checkbox>
  82. #else##没数据字典
  83. <el-checkbox>请选择字典生成</el-checkbox>
  84. #end
  85. </el-checkbox-group>
  86. </el-form-item>
  87. #elseif($column.htmlType == "radio")## 单选框
  88. <el-form-item label="${comment}" prop="${javaField}">
  89. <el-radio-group v-model="formData.${javaField}">
  90. #if ("" != $dictType)## 有数据字典
  91. <el-radio
  92. v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())"
  93. :key="dict.value"
  94. :label="dict.value"
  95. >
  96. {{ dict.label }}
  97. </el-radio>
  98. #else##没数据字典
  99. <el-radio label="1">请选择字典生成</el-radio>
  100. #end
  101. </el-radio-group>
  102. </el-form-item>
  103. #elseif($column.htmlType == "datetime")## 时间框
  104. <el-form-item label="${comment}" prop="${javaField}">
  105. <el-date-picker
  106. v-model="formData.${javaField}"
  107. type="date"
  108. value-format="x"
  109. placeholder="选择${comment}"
  110. />
  111. </el-form-item>
  112. #elseif($column.htmlType == "textarea")## 文本框
  113. <el-form-item label="${comment}" prop="${javaField}">
  114. <el-input v-model="formData.${javaField}" type="textarea" placeholder="请输入${comment}" />
  115. </el-form-item>
  116. #end
  117. #end
  118. #end
  119. </el-form>
  120. ## 特殊:主子表专属逻辑
  121. #if ( $subTables && $subTables.size() > 0 )
  122. <!-- 子表的表单 -->
  123. <el-tabs v-model="subTabsName">
  124. #foreach ($subTable in $subTables)
  125. #set ($index = $foreach.count - 1)
  126. #set ($subClassNameVar = $subClassNameVars.get($index))
  127. #set ($subSimpleClassName = $subSimpleClassNames.get($index))
  128. #set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index))
  129. <el-tab-pane label="${subTable.classComment}" name="$subClassNameVar">
  130. <${subSimpleClassName}Form ref="${subClassNameVar}FormRef" :${subJoinColumn_strikeCase}="formData.id" />
  131. </el-tab-pane>
  132. #end
  133. </el-tabs>
  134. #end
  135. <template #footer>
  136. <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
  137. <el-button @click="dialogVisible = false">取 消</el-button>
  138. </template>
  139. </Dialog>
  140. </template>
  141. <script setup lang="ts">
  142. import { getIntDictOptions, getStrDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
  143. import * as ${simpleClassName}Api from '@/api/${table.moduleName}/${table.businessName}'
  144. ## 特殊:树表专属逻辑
  145. #if ( $table.templateType == 2 )
  146. import { defaultProps, handleTree } from '@/utils/tree'
  147. #end
  148. ## 特殊:主子表专属逻辑
  149. #if ( $subTables && $subTables.size() > 0 )
  150. #foreach ($subSimpleClassName in $subSimpleClassNames)
  151. import ${subSimpleClassName}Form from './components/${subSimpleClassName}Form.vue'
  152. #end
  153. #end
  154. const { t } = useI18n() // 国际化
  155. const message = useMessage() // 消息弹窗
  156. const dialogVisible = ref(false) // 弹窗的是否展示
  157. const dialogTitle = ref('') // 弹窗的标题
  158. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  159. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  160. const formData = ref({
  161. #foreach ($column in $columns)
  162. #if ($column.createOperation || $column.updateOperation)
  163. #if ($column.htmlType == "checkbox")
  164. $column.javaField: [],
  165. #else
  166. $column.javaField: undefined,
  167. #end
  168. #end
  169. #end
  170. })
  171. const formRules = reactive({
  172. #foreach ($column in $columns)
  173. #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键
  174. #set($comment=$column.columnComment)
  175. $column.javaField: [{ required: true, message: '${comment}不能为空', trigger: #if($column.htmlType == 'select')'change'#else'blur'#end }],
  176. #end
  177. #end
  178. })
  179. const formRef = ref() // 表单 Ref
  180. ## 特殊:树表专属逻辑
  181. #if ( $table.templateType == 2 )
  182. const ${classNameVar}Tree = ref() // 树形结构
  183. #end
  184. ## 特殊:主子表专属逻辑
  185. #if ( $subTables && $subTables.size() > 0 )
  186. /** 子表的表单 */
  187. const subTabsName = ref('$subClassNameVars.get(0)')
  188. #foreach ($subClassNameVar in $subClassNameVars)
  189. const ${subClassNameVar}FormRef = ref()
  190. #end
  191. #end
  192. /** 打开弹窗 */
  193. const open = async (type: string, id?: number) => {
  194. dialogVisible.value = true
  195. dialogTitle.value = t('action.' + type)
  196. formType.value = type
  197. resetForm()
  198. // 修改时,设置数据
  199. if (id) {
  200. formLoading.value = true
  201. try {
  202. formData.value = await ${simpleClassName}Api.get${simpleClassName}(id)
  203. } finally {
  204. formLoading.value = false
  205. }
  206. }
  207. ## 特殊:树表专属逻辑
  208. #if ( $table.templateType == 2 )
  209. await get${simpleClassName}Tree()
  210. #end
  211. }
  212. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  213. /** 提交表单 */
  214. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  215. const submitForm = async () => {
  216. // 校验表单
  217. await formRef.value.validate()
  218. ## 特殊:主子表专属逻辑
  219. #if ( $subTables && $subTables.size() > 0 )
  220. // 校验子表单
  221. #foreach ($subTable in $subTables)
  222. #set ($index = $foreach.count - 1)
  223. #set ($subClassNameVar = $subClassNameVars.get($index))
  224. try {
  225. await ${subClassNameVar}FormRef.value.validate()
  226. } catch (e) {
  227. subTabsName.value = '${subClassNameVar}'
  228. return
  229. }
  230. #end
  231. #end
  232. // 提交请求
  233. formLoading.value = true
  234. try {
  235. const data = formData.value as unknown as ${simpleClassName}Api.${simpleClassName}VO
  236. ## 特殊:主子表专属逻辑
  237. #if ( $subTables && $subTables.size() > 0 )
  238. // 拼接子表的数据
  239. #foreach ($subTable in $subTables)
  240. #set ($index = $foreach.count - 1)
  241. #set ($subClassNameVar = $subClassNameVars.get($index))
  242. data.${subClassNameVar}#if ( $subTable.subJoinMany)s#end = ${subClassNameVar}FormRef.value.getData()
  243. #end
  244. #end
  245. if (formType.value === 'create') {
  246. await ${simpleClassName}Api.create${simpleClassName}(data)
  247. message.success(t('common.createSuccess'))
  248. } else {
  249. await ${simpleClassName}Api.update${simpleClassName}(data)
  250. message.success(t('common.updateSuccess'))
  251. }
  252. dialogVisible.value = false
  253. // 发送操作成功的事件
  254. emit('success')
  255. } finally {
  256. formLoading.value = false
  257. }
  258. }
  259. /** 重置表单 */
  260. const resetForm = () => {
  261. formData.value = {
  262. #foreach ($column in $columns)
  263. #if ($column.createOperation || $column.updateOperation)
  264. #if ($column.htmlType == "checkbox")
  265. $column.javaField: [],
  266. #else
  267. $column.javaField: undefined,
  268. #end
  269. #end
  270. #end
  271. }
  272. formRef.value?.resetFields()
  273. }
  274. ## 特殊:树表专属逻辑
  275. #if ( $table.templateType == 2 )
  276. /** 获得${table.classComment}树 */
  277. const get${simpleClassName}Tree = async () => {
  278. ${classNameVar}Tree.value = []
  279. const data = await ${simpleClassName}Api.get${simpleClassName}List()
  280. const root: Tree = { id: 0, name: '顶级${table.classComment}', children: [] }
  281. root.children = handleTree(data, 'id', '${treeParentColumn.javaField}')
  282. ${classNameVar}Tree.value.push(root)
  283. }
  284. #end
  285. </script>