vform.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <template>
  2. <el-dialog :title="form.${pk.attrName} ? '编辑' : '新增'" v-model="visible" :close-on-click-modal="false" draggable>
  3. <el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px">
  4. #foreach($key in $resultMap.keySet())
  5. #set($itemList = $resultMap.get($key))
  6. <el-row :gutter="24">
  7. #foreach($field in $itemList)
  8. <el-col :span="$field.span">
  9. #if($field.type == 'input')
  10. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  11. <el-input v-model="form.${field.options.name}" placeholder="${field.options.placeholder}"/>
  12. </el-form-item>
  13. #elseif($field.type == 'number')
  14. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  15. <el-input-number :min="${field.options.min}" :max="${field.options.max}" v-model="form.${field.options.name}" placeholder="${field.options.placeholder}"></el-input-number>
  16. </el-form-item>
  17. #elseif($field.type == 'textarea')
  18. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  19. <el-input type="textarea" :rows="${field.options.rows}" v-model="form.${field.options.name}" placeholder="${field.options.placeholder}"/>
  20. </el-form-item>
  21. #elseif($field.type == 'select')
  22. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  23. <el-select v-model="form.${field.options.name}" placeholder="${field.options.placeholder}">
  24. #if($field.options.optionItemsDictType)
  25. <el-option :value="item.value" :label="item.label" v-for="(item, index) in ${field.options.optionItemsDictType}" :key="index"></el-option>
  26. #else
  27. <el-option label="请选择">0</el-option>
  28. #end
  29. </el-select>
  30. </el-form-item>
  31. #elseif($field.type == 'radio')
  32. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  33. <el-radio-group v-model="form.${field.options.name}">
  34. #if($field.options.optionItemsDictType)
  35. <el-radio :label="item.value" v-for="(item, index) in ${field.options.optionItemsDictType}" border :key="index">{{ item.label }}
  36. </el-radio>
  37. #end
  38. </el-radio-group>
  39. </el-form-item>
  40. #elseif($field.type == 'checkbox')
  41. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  42. <el-checkbox-group v-model="form.${field.options.name}">
  43. #if($field.options.optionItemsDictType)
  44. <el-checkbox :label="item.value" :name="item.label" v-for="(item, index) in ${field.options.optionItemsDictType}" :key="index"></el-checkbox>
  45. #else
  46. <el-checkbox label="启用" name="type"></el-checkbox>
  47. <el-checkbox label="禁用" name="type"></el-checkbox>
  48. #end
  49. </<el-checkbox-group>
  50. </el-form-item>
  51. #elseif($field.type == 'date')
  52. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  53. <el-date-picker type="date" placeholder="${field.options.placeholder}" v-model="form.${field.options.name}" :value-format="dateStr"></el-date-picker>
  54. </el-form-item>
  55. #elseif($field.type == 'time')
  56. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  57. <el-time-picker placeholder="${field.options.placeholder}" v-model="form.${field.options.name}" :value-format="dateTimeStr"></el-date-picker>
  58. </el-form-item>
  59. #elseif($field.type == 'file-upload')
  60. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  61. <upload-file v-model="form.${field.attrName}" limit="${field.options.limit}" fileMaxSize="${field.options.fileMaxSize}"></upload-file>
  62. </el-form-item>
  63. #elseif($field.type == 'picture-upload')
  64. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  65. <upload-img v-model:imageUrl="form.${field.options.name}" limit="${field.options.limit}" fileMaxSize="${field.options.fileMaxSize}"></upload-img>
  66. </el-form-item>
  67. #elseif($field.type == 'rich-editor')
  68. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  69. <editor v-model:get-html="form.${field.options.name}" placeholder="${field.options.placeholder}"></editor>
  70. </el-form-item>
  71. #elseif($field.type == 'switch')
  72. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  73. <el-switch v-model="form.${field.options.name}" />
  74. </el-form-item>
  75. #elseif($field.type == 'rate')
  76. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  77. <el-rate v-model="form.${field.options.name}" />
  78. </el-form-item>
  79. #elseif($field.type == 'slider')
  80. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  81. <el-slider v-model="form.${field.options.name}" />
  82. </el-form-item>
  83. #elseif($field.type == 'color')
  84. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  85. <el-color-picker v-model="form.${field.options.name}" />
  86. </el-form-item>
  87. #elseif($field.type == 'static-text' || $field.type == 'html-text')
  88. <span>{{form.${field.options.name}}}</span>
  89. #elseif($field.type == 'divider')
  90. <el-divider />
  91. #else
  92. <el-form-item label="${field.options.label}" prop="${field.options.name}">
  93. <el-input v-model="form.${field.options.name}" placeholder="${field.options.placeholder}"/>
  94. </el-form-item>
  95. #end
  96. </el-col>
  97. #end
  98. </el-row>
  99. #end
  100. </el-form>
  101. <template #footer>
  102. <span class="dialog-footer">
  103. <el-button @click="visible = false" formDialogRef>取消</el-button>
  104. <el-button type="primary" @click="onSubmit" formDialogRef>确认</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. // 定义字典
  119. #set($fieldDict=[])
  120. #foreach($key in $resultMap.keySet())
  121. #set($itemList = $resultMap.get($key))
  122. #foreach($field in $itemList)
  123. #if($field.options.optionItemsDictType)
  124. #set($void=$fieldDict.add($field.options.optionItemsDictType))
  125. #end
  126. #end
  127. #end
  128. #if($fieldDict)
  129. const { $dict.format($fieldDict) } = useDict($dict.quotation($fieldDict))
  130. #end
  131. // 提交表单数据
  132. const form = reactive({
  133. ${pk.attrName}:"",
  134. #foreach($key in $resultMap.keySet())
  135. #set($itemList = $resultMap.get($key))
  136. #foreach($field in $itemList)
  137. ${field.options.name}: "",
  138. #end
  139. #end
  140. });
  141. // 定义校验规则
  142. const dataRules = ref({
  143. #foreach($key in $resultMap.keySet())
  144. #set($itemList = $resultMap.get($key))
  145. #foreach($field in $itemList)
  146. #if($field.options.required && $field.options.validation)
  147. ${field.options.name}: [{required: true, message: '${field.options.label}不能为空', trigger: 'blur'}, {{ validator: rule.${field.options.validation}, trigger: 'blur' }],
  148. #elseif($field.options.required)
  149. ${field.options.name}: [{required: true, message: '${field.options.label}不能为空', trigger: 'blur'}],
  150. #elseif($field.options.validation)
  151. ${field.options.name}: [{ validator: rule.${field.options.validation}, trigger: 'blur' }],
  152. #end
  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 = () => {
  172. dataFormRef.value.validate((valid: boolean) => {
  173. if (!valid) {
  174. return false
  175. }
  176. // 更新
  177. if (form.${pk.attrName}) {
  178. putObj(form).then(() => {
  179. useMessage().success('修改成功')
  180. visible.value = false // 关闭弹窗
  181. emit('refresh')
  182. }).catch((err: any) => {
  183. useMessage().error(err.msg)
  184. })
  185. } else {
  186. addObj(form).then(() => {
  187. useMessage().success('添加成功')
  188. visible.value = false // 关闭弹窗
  189. emit('refresh')
  190. }).catch((err: any) => {
  191. useMessage().error(err.msg)
  192. })
  193. }
  194. })
  195. }
  196. // 初始化表单数据
  197. const get${className}Data = (id: string) => {
  198. // 获取数据
  199. getObj(id).then((res: any) => {
  200. Object.assign(form, res.data)
  201. })
  202. };
  203. // 暴露变量
  204. defineExpose({
  205. openDialog
  206. });
  207. </script>