form.vue.vm 11 KB

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