edit.vue.vm 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. <template>
  2. <div class="edit-popup">
  3. <popup
  4. ref="popupRef"
  5. :title="popupTitle"
  6. :async="true"
  7. width="550px"
  8. :clickModalClose="true"
  9. @confirm="handleSubmit"
  10. @close="handleClose"
  11. >
  12. <el-form ref="formRef" :model="formData" label-width="84px" :rules="formRules">
  13. #foreach ($column in $columns)
  14. #if($column.isEdit)
  15. #if($table.treeParent!="" && $column.javaField==$table.treeParent)
  16. <el-form-item label="${column.columnComment}" prop="${column.javaField}">
  17. <el-tree-select
  18. class="flex-1"
  19. v-model="formData.${column.javaField}"
  20. :data="treeList"
  21. clearable
  22. node-key="${table.treePrimary}"
  23. :props="{ label: '${table.treeName}', value: '${table.treePrimary}', children: 'children' }"
  24. :default-expand-all="true"
  25. placeholder="请选择${column.columnComment}"
  26. check-strictly
  27. />
  28. </el-form-item>
  29. #elseif($column.htmlType=="input")
  30. <el-form-item label="${column.columnComment}" prop="${column.javaField}">
  31. <el-input v-model="formData.${column.javaField}" placeholder="请输入${column.columnComment}" />
  32. </el-form-item>
  33. #elseif($column.htmlType=="number")
  34. <el-form-item label="${column.columnComment}" prop="${column.javaField}">
  35. <el-input-number v-model="formData.${column.javaField}" />
  36. </el-form-item>
  37. #elseif($column.htmlType=="textarea")
  38. <el-form-item label="${column.columnComment}" prop="${column.javaField}">
  39. <el-input
  40. v-model="formData.${column.javaField}"
  41. placeholder="请输入${column.columnComment}"
  42. type="textarea"
  43. :autosize="{ minRows: 4, maxRows: 6 }"
  44. />
  45. </el-form-item>
  46. #elseif($column.htmlType=="checkbox")
  47. <el-form-item label="${column.columnComment}" prop="${column.javaField}">
  48. <el-checkbox-group v-model="formData.${column.javaField}" placeholder="请选择${column.columnComment}">
  49. #if($column.dictType!="")
  50. <el-checkbox
  51. v-for="(item, index) in dictData.${column.dictType}"
  52. :key="index"
  53. :label="item.value"
  54. :disabled="!item.status"
  55. >
  56. {{ item.name }}
  57. </el-checkbox>
  58. #else
  59. <el-checkbox>请选择字典生成</el-checkbox>
  60. #end
  61. </el-checkbox-group>
  62. </el-form-item>
  63. #elseif($column.htmlType=="select")
  64. <el-form-item label="${column.columnComment}" prop="${column.javaField}">
  65. <el-select class="flex-1" v-model="formData.${column.javaField}" placeholder="请选择${column.columnComment}">
  66. #if($column.dictType!="")
  67. <el-option
  68. v-for="(item, index) in dictData.${column.dictType}"
  69. :key="index"
  70. :label="item.name"
  71. #if($column.javaType == "Integer")
  72. :value="parseInt(item.value)"
  73. #else
  74. :value="item.value"
  75. #end
  76. clearable
  77. :disabled="!item.status"
  78. />
  79. #else
  80. <el-option label="请选择字典生成" value="" />
  81. #end
  82. </el-select>
  83. </el-form-item>
  84. #elseif($column.htmlType=="radio")
  85. <el-form-item label="${column.columnComment}" prop="${column.javaField}">
  86. <el-radio-group v-model="formData.${column.javaField}" placeholder="请选择${column.columnComment}">
  87. #if($column.dictType!="")
  88. <el-radio
  89. v-for="(item, index) in dictData.${column.dictType}"
  90. :key="index"
  91. #if($column.javaType == "Integer")
  92. :label="parseInt(item.value)"
  93. #else
  94. :label="item.value"
  95. #end
  96. :disabled="!item.status"
  97. >
  98. {{ item.name }}
  99. </el-radio>
  100. #else
  101. <el-radio label="0">请选择字典生成</el-radio>
  102. #end
  103. </el-radio-group>
  104. </el-form-item>
  105. #elseif($column.htmlType=="datetime")
  106. <el-form-item label="${column.columnComment}" prop="${column.javaField}">
  107. <el-date-picker
  108. class="flex-1 !flex"
  109. v-model="formData.${column.javaField}"
  110. type="datetime"
  111. clearable
  112. value-format="YYYY-MM-DD hh:mm:ss"
  113. placeholder="请选择${column.columnComment}"
  114. />
  115. </el-form-item>
  116. #elseif($column.htmlType=="editor")
  117. <el-form-item label="${column.columnComment}" prop="${column.javaField}">
  118. <editor v-model="formData.${column.javaField}" :height="500" />
  119. </el-form-item>
  120. #elseif($column.htmlType=="imageUpload")
  121. <el-form-item label="${column.columnComment}" prop="${column.javaField}">
  122. <material-picker v-model="formData.${column.javaField}" />
  123. </el-form-item>
  124. #end
  125. #end
  126. #end
  127. </el-form>
  128. </popup>
  129. </div>
  130. </template>
  131. <script lang="ts" setup>
  132. import type { FormInstance } from 'element-plus'
  133. import { #if($table.treePrimary && $table.treeParent)${moduleName}Lists,#end ${moduleName}Edit, ${moduleName}Add, ${moduleName}Detail } from '@/api/${moduleName}'
  134. import Popup from '@/components/popup/index.vue'
  135. import feedback from '@/utils/feedback'
  136. import type { PropType } from 'vue'
  137. defineProps({
  138. dictData: {
  139. type: Object as PropType<Record<string, any[]>>,
  140. default: () => ({})
  141. }
  142. })
  143. const emit = defineEmits(['success', 'close'])
  144. const formRef = shallowRef<FormInstance>()
  145. const popupRef = shallowRef<InstanceType<typeof Popup>>()
  146. #if($table.treePrimary && $table.treeParent)
  147. const treeList = ref<any[]>([])
  148. #end
  149. const mode = ref('add')
  150. const popupTitle = computed(() => {
  151. return mode.value == 'edit' ? '编辑${functionName}' : '新增${functionName}'
  152. })
  153. const formData = reactive({
  154. #foreach ($column in $columns)
  155. #if($column.javaField==$primaryKey)
  156. ${primaryKey}: '',
  157. #elseif($column.isEdit)
  158. #if($column.htmlType=="checkbox")
  159. ${column.javaField}: [],
  160. #elseif($column.htmlType=="number")
  161. ${column.javaField}: 0,
  162. #else
  163. ${column.javaField}: '',
  164. #end
  165. #end
  166. #end
  167. })
  168. const formRules = {
  169. #foreach ($column in $columns)
  170. #if($column.isEdit && $column.isRequired)
  171. ${column.javaField}: [
  172. {
  173. required: true,
  174. #if($column.htmlType=="checkbox" || $column.htmlType=="datetime" || $column.htmlType=="radio" || $column.htmlType=="select" || $column.htmlType=="imageUpload")
  175. message: '请选择${column.columnComment}',
  176. #else
  177. message: '请输入${column.columnComment}',
  178. #end
  179. trigger: ['blur']
  180. }
  181. ],
  182. #end
  183. #end
  184. }
  185. const handleSubmit = async () => {
  186. await formRef.value?.validate()
  187. const data: any = { ...formData }
  188. #foreach ($column in $columns)
  189. #if($column.htmlType == "checkbox")
  190. data.${column.javaField} = data.${column.javaField}.join(',')
  191. #end
  192. #end
  193. mode.value == 'edit' ? await ${moduleName}Edit(data) : await ${moduleName}Add(data)
  194. popupRef.value?.close()
  195. feedback.msgSuccess('操作成功')
  196. emit('success')
  197. }
  198. const open = (type = 'add') => {
  199. mode.value = type
  200. popupRef.value?.open()
  201. }
  202. const setFormData = async (data: Record<string, any>) => {
  203. for (const key in formData) {
  204. if (data[key] != null && data[key] != undefined) {
  205. //@ts-ignore
  206. formData[key] = data[key]
  207. #foreach ($column in $columns)
  208. #if($column.htmlType == "checkbox")
  209. //@ts-ignore
  210. formData.${column.javaField} = String(data.${column.javaField}).split(',')
  211. #end
  212. #end
  213. }
  214. }
  215. }
  216. const getDetail = async (row: Record<string, any>) => {
  217. const data = await ${moduleName}Detail({
  218. ${primaryKey}: row.${primaryKey}
  219. })
  220. setFormData(data)
  221. }
  222. const handleClose = () => {
  223. emit('close')
  224. }
  225. #if($table.treePrimary && $table.treeParent)
  226. const getLists = async () => {
  227. const data: any = await ${moduleName}Lists()
  228. const item = { ${table.treePrimary}: 0, ${table.treeName}: '顶级', children: [] }
  229. item.children = data
  230. treeList.value.push(item)
  231. }
  232. getLists()
  233. #end
  234. defineExpose({
  235. open,
  236. setFormData,
  237. getDetail
  238. })
  239. </script>