表单 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <template>
  2. <el-dialog :title="form.${pk.attrName} ? '编辑' : '新增'" v-model="visible"
  3. :close-on-click-modal="false" draggable>
  4. <el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
  5. <el-row :gutter="24">
  6. #foreach($field in $formList)
  7. #if($field.attrName != ${pk.attrName})
  8. #if($formLayout == 1)
  9. <el-col :span="24" class="mb20">
  10. #elseif($formLayout == 2)
  11. <el-col :span="12" class="mb20">
  12. #end
  13. #if($field.formType == 'text')
  14. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end" prop="${field.attrName}">
  15. <el-input v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end"/>
  16. </el-form-item>
  17. </el-col>
  18. #elseif($field.formType == 'textarea')
  19. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end" prop="${field.attrName}">
  20. <el-input type="textarea" v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end"/>
  21. </el-form-item>
  22. </el-col>
  23. #elseif($field.formType == 'select')
  24. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end" prop="${field.attrName}">
  25. <el-select v-model="form.${field.attrName}" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end">
  26. #if($field.fieldDict)
  27. <el-option :value="item.value" :label="item.label" v-for="(item, index) in ${field.fieldDict}" :key="index"></el-option>
  28. #end
  29. #if(!$field.fieldDict)
  30. <el-option label="请选择">0</el-option>
  31. #end
  32. </el-select>
  33. </el-form-item>
  34. </el-col>
  35. #elseif($field.formType == 'radio')
  36. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end" prop="${field.attrName}">
  37. <el-radio-group v-model="form.${field.attrName}">
  38. #if($field.fieldDict)
  39. <el-radio :label="item.value" v-for="(item, index) in ${field.fieldDict}" border :key="index">{{ item.label }}
  40. </el-radio>
  41. #else
  42. <el-radio label="${field.fieldComment}" border>${field.fieldComment}</el-radio>
  43. #end
  44. </el-radio-group>
  45. </el-form-item>
  46. </el-col>
  47. #elseif($field.formType == 'checkbox')
  48. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end" prop="${field.attrName}">
  49. <el-checkbox-group v-model="form.${field.attrName}">
  50. #if($field.fieldDict)
  51. <el-checkbox :label="item.value" v-for="(item, index) in ${field.fieldDict}" :key="index">{{ item.label }}</el-checkbox>
  52. #end
  53. #if(!$field.fieldDict)
  54. <el-checkbox label="启用" name="type"></el-checkbox>
  55. <el-checkbox label="禁用" name="type"></el-checkbox>
  56. #end
  57. </el-checkbox-group>
  58. </el-form-item>
  59. </el-col>
  60. #elseif($field.formType == 'date')
  61. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end" prop="${field.attrName}">
  62. <el-date-picker type="date" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end" v-model="form.${field.attrName}" :value-format="dateStr"></el-date-picker>
  63. </el-form-item>
  64. </el-col>
  65. #elseif($field.formType == 'datetime')
  66. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end" prop="${field.attrName}">
  67. <el-date-picker type="datetime" placeholder="请选择#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end" v-model="form.${field.attrName}" :value-format="dateTimeStr"></el-date-picker>
  68. </el-form-item>
  69. </el-col>
  70. #elseif($field.formType == 'number')
  71. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end" prop="${field.attrName}">
  72. <el-input-number :min="1" :max="1000" v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end"></el-input-number>
  73. </el-form-item>
  74. </el-col>
  75. #elseif($field.formType == 'upload-file')
  76. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end" prop="${field.attrName}">
  77. <upload-file v-model:imageUrl="form.${field.attrName}"></upload-file>
  78. </el-form-item>
  79. </el-col>
  80. #elseif($field.formType == 'upload-img')
  81. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end" prop="${field.attrName}">
  82. <upload-img v-model="form.${field.attrName}"></upload-img>
  83. </el-form-item>
  84. </el-col>
  85. #elseif($field.formType == 'editor')
  86. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end" prop="${field.attrName}">
  87. <editor v-if="visible" v-model:get-html="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end"></editor>
  88. </el-form-item>
  89. </el-col>
  90. #end
  91. #if(!$field.formType)
  92. <el-form-item label="#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end" prop="${column.attrName}">
  93. <el-input v-model="form.${field.attrName}" placeholder="请输入#if(${field.fieldComment})${field.fieldComment}#else ${field.attrName}#end"/>
  94. </el-form-item>
  95. </el-col>
  96. #end
  97. #end
  98. #end
  99. </el-row>
  100. </el-form>
  101. <template #footer>
  102. <span class="dialog-footer">
  103. <el-button @click="visible = false">取消</el-button>
  104. <el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button>
  105. </span>
  106. </template>
  107. </el-dialog>
  108. </template>
  109. <script setup lang="ts" name="${ClassName}Dialog">
  110. import { useDict } from '/@/hooks/dict';
  111. import { useMessage } from "/@/hooks/message";
  112. import { getObj, addObj, putObj } from '/@/api/${moduleName}/${functionName}'
  113. import { rule } from '/@/utils/validate';
  114. const emit = defineEmits(['refresh']);
  115. // 定义变量内容
  116. const dataFormRef = ref();
  117. const visible = ref(false)
  118. const loading = ref(false)
  119. // 定义字典
  120. #set($fieldDict=[])
  121. #foreach($field in $gridList)
  122. #if($field.fieldDict)
  123. #set($void=$fieldDict.add($field.fieldDict))
  124. #end
  125. #end
  126. #if($fieldDict)
  127. const { $dict.format($fieldDict) } = useDict($dict.quotation($fieldDict))
  128. #end
  129. // 提交表单数据
  130. const form = reactive({
  131. #if(!$formList.contains(${pk.attrName}))
  132. ${pk.attrName}:'',
  133. #end
  134. #foreach($field in $formList)
  135. #if($field.formType == 'number')
  136. ${field.attrName}: 0,
  137. #elseif($field.formType == 'checkbox')
  138. ${field.attrName}: [],
  139. #else
  140. ${field.attrName}: '',
  141. #end
  142. #end
  143. });
  144. // 定义校验规则
  145. const dataRules = ref({
  146. #foreach($field in $formList)
  147. #if($field.formRequired == '1' && $field.formValidator)
  148. ${field.attrName}: [{required: true, message: '${field.fieldComment}不能为空', trigger: 'blur'}, { validator: rule.${field.formValidator}, trigger: 'blur' }],
  149. #elseif($field.formRequired == '1')
  150. ${field.attrName}: [{required: true, message: '${field.fieldComment}不能为空', trigger: 'blur'}],
  151. #elseif($field.formValidator)
  152. ${field.attrName}: [{ validator: rule.${field.formValidator}, trigger: 'blur' }],
  153. #end
  154. #end
  155. })
  156. // 打开弹窗
  157. const openDialog = (id: string) => {
  158. visible.value = true
  159. form.${pk.attrName} = ''
  160. // 重置表单数据
  161. nextTick(() => {
  162. dataFormRef.value?.resetFields();
  163. });
  164. // 获取${className}信息
  165. if (id) {
  166. form.${pk.attrName} = id
  167. get${className}Data(id)
  168. }
  169. };
  170. // 提交
  171. const onSubmit = async () => {
  172. const valid = await dataFormRef.value.validate().catch(() => {});
  173. if (!valid) return false;
  174. try {
  175. loading.value = true;
  176. form.${pk.attrName} ? await putObj(form) : await addObj(form);
  177. useMessage().success(form.${pk.attrName} ? '修改成功' : '添加成功');
  178. visible.value = false;
  179. emit('refresh');
  180. } catch (err: any) {
  181. useMessage().error(err.msg);
  182. } finally {
  183. loading.value = false;
  184. }
  185. };
  186. // 初始化表单数据
  187. const get${className}Data = (id: string) => {
  188. // 获取数据
  189. loading.value = true
  190. getObj(id).then((res: any) => {
  191. Object.assign(form, res.data)
  192. }).finally(() => {
  193. loading.value = false
  194. })
  195. };
  196. // 暴露变量
  197. defineExpose({
  198. openDialog
  199. });
  200. </script>