edit.tpl 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <template>
  2. {[if eq .IsDrawer 2]}
  3. <el-drawer
  4. :title="dialogTitle"
  5. v-model="dialogVisible"
  6. :close-on-click-modal="false"
  7. :size="$isMobile()?'100%':'40%'"
  8. direction="rtl">
  9. <el-card class="box-card">
  10. {[else]}
  11. <Dialog v-model="dialogVisible" :title="dialogTitle"> {[end]}
  12. <el-form
  13. ref="formRef"
  14. v-loading="formLoading"
  15. :model="formData"
  16. :rules="formRules"
  17. label-width="90px"
  18. >
  19. <el-row :gutter="20">{[range $index, $item := .SubColumns]}{[if eq $item.IsEdit "1"]}{[if eq $item.HtmlType "input"]}{[if eq $item.IsRow "1"]}
  20. <el-col :span="24">{[else]}
  21. <el-col :span="{[$.Span]}">{[end]}
  22. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  23. <el-input
  24. v-model="formData.{[$item.ColumnNameLower]}"
  25. placeholder="请输入{[$item.ColumnComment]}"
  26. />
  27. </el-form-item>
  28. </el-col>{[else if eq $item.HtmlType "number"]}{[if eq $item.IsRow "1"]}
  29. <el-col :span="24">{[else]}
  30. <el-col :span="{[$.Span]}">{[end]}
  31. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  32. <el-input-number
  33. v-model="formData.{[$item.ColumnNameLower]}"
  34. placeholder="请输入{[$item.ColumnComment]}"
  35. />
  36. </el-form-item>
  37. </el-col>{[else if eq $item.HtmlType "select"]}{[if eq $item.IsRow "1"]}
  38. <el-col :span="24">{[else]}
  39. <el-col :span="{[$.Span]}">{[end]}
  40. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  41. <el-select v-model="formData.{[$item.ColumnNameLower]}" placeholder="{[$item.ColumnComment]}">
  42. <el-option
  43. v-for="dict in {[$item.ColumnNameLower]}Options"
  44. {[if eq $item.Source "2"]}
  45. :key="dict.id"
  46. :label="dict.label"
  47. :value="dict.id"
  48. {[else]}
  49. :key="dict.id"
  50. :label="dict.label"
  51. :value="dict.id"{[end]}
  52. />
  53. </el-select>
  54. </el-form-item>
  55. </el-col>{[else if eq $item.HtmlType "switch"]}{[if eq $item.IsRow "1"]}
  56. <el-col :span="24">{[else]}
  57. <el-col :span="{[$.Span]}">{[end]}
  58. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  59. <el-switch
  60. v-model="formData.{[$item.ColumnNameLower]}"
  61. :active-value="1"
  62. :inactive-value="2"
  63. active-text="是"
  64. inactive-text="否">
  65. </el-switch>
  66. </el-form-item>
  67. </el-col>{[else if eq $item.HtmlType "treeSelect"]}{[if eq $item.IsRow "1"]}
  68. <el-col :span="24">{[else]}
  69. <el-col :span="{[$.Span]}">{[end]}
  70. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  71. <treeselect
  72. v-model="formData.{[$item.ColumnNameLower]}"
  73. :options="{[$item.ColumnNameLower]}Options"
  74. :props="defaultProps"
  75. placeholder="选择{[$item.ColumnComment]}"
  76. />
  77. </el-form-item>
  78. </el-col>{[else if eq $item.HtmlType "imageUpload"]}{[if eq $item.IsRow "1"]}
  79. <el-col :span="24">{[else]}
  80. <el-col :span="{[$.Span]}">{[end]}
  81. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  82. <UploadImg v-model="formData.{[$item.ColumnNameLower]}" />
  83. </el-form-item>
  84. </el-col>{[else if eq $item.HtmlType "fileUpload"]}{[if eq $item.IsRow "1"]}
  85. <el-col :span="24">{[else]}
  86. <el-col :span="{[$.Span]}">{[end]}
  87. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  88. <file-upload
  89. v-model="formData.{[$item.ColumnNameLower]}"
  90. :limit="1"
  91. />
  92. </el-form-item>
  93. </el-col> {[else if eq $item.HtmlType "radio"]}{[if eq $item.IsRow "1"]}
  94. <el-col :span="24">{[else]}
  95. <el-col :span="{[$.Span]}"> {[end]}
  96. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  97. <el-radio-group v-model="formData.{[$item.ColumnNameLower]}">
  98. <el-radio
  99. v-for="dict in {[$item.ColumnNameLower]}Options"
  100. :key="dict.id"
  101. :label="dict.id"
  102. >{{ dict.label }}
  103. </el-radio>
  104. </el-radio-group>
  105. </el-form-item>
  106. </el-col>{[else if eq $item.HtmlType "textarea"]}{[if eq $item.IsRow "1"]}
  107. <el-col :span="24">{[else]}
  108. <el-col :span="{[$.Span]}">{[end]}
  109. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  110. <el-input v-model="formData.{[$item.ColumnNameLower]}" type="textarea" placeholder="请输入{[$item.ColumnComment]}" />
  111. </el-form-item> </el-col>{[else if eq $item.HtmlType "datetime"]}{[if eq $item.IsRow "1"]}
  112. <el-col :span="24">{[else]}
  113. <el-col :span="{[$.Span]}">{[end]}
  114. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  115. <el-date-picker
  116. v-model="formData.{[$item.ColumnNameLower]}"
  117. type="date"
  118. placeholder="选择日期">
  119. </el-date-picker>
  120. </el-form-item>
  121. </el-col>{[else if eq $item.HtmlType "editor"]}{[if eq $item.IsRow "1"]}
  122. <el-col :span="24">{[else]}
  123. <el-col :span="{[$.Span]}">{[end]}
  124. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  125. <editor v-model="formData.{[$item.ColumnNameLower]}" :min-height="192"/>
  126. </el-form-item>
  127. </el-col>{[else]}{[if eq $item.IsRow "1"]}
  128. <el-col :span="24">{[else]}
  129. <el-col :span="{[$.Span]}">{[end]}
  130. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  131. <el-input
  132. v-model="formData.{[$item.ColumnNameLower]}"
  133. placeholder="请输入{[$item.ColumnComment]}"
  134. />
  135. </el-form-item>
  136. </el-col> {[end]} {[end]} {[end]}
  137. </el-row>
  138. </el-form>{[if eq .IsDrawer 2]}
  139. </el-card>
  140. <div class="dialog-footer">
  141. <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
  142. <el-button @click="dialogVisible = false">取 消</el-button>
  143. </div>
  144. </el-drawer>{[else]}
  145. <template #footer>
  146. <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
  147. <el-button @click="dialogVisible = false">取 消</el-button>
  148. </template>
  149. </Dialog>{[end]}
  150. </template>
  151. {[htmlSafe "<script lang=\"ts\" setup>"]}
  152. import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
  153. import { CommonStatusEnum } from '@/utils/constants'
  154. import * as {[.ClassNameUpper]}Api from '@/api/{[.ModuleName]}/{[toMiddle .ClassNameCamel]}'{[range $index, $item := .Columns]}{[if eq $item.Source "2"]}
  155. import * as {[toUpper $item.Menu]}Api from "@/api/{[$item.Module]}/{[toMiddle $item.Menu]}"{[end]}{[end]}
  156. /** 定义变量*/
  157. const { t } = useI18n() // 国际化
  158. const message = useMessage() // 消息弹窗
  159. const dialogVisible = ref(false) // 弹窗的是否展示
  160. const dialogTitle = ref('') // 弹窗的标题
  161. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  162. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  163. const formData = ref({
  164. id: undefined,{[range $index, $item := .Columns]}{[if eq $item.IsEdit "1"]}{[if $item.ColumnDefault]}{[if eq $item.GoType "string"]}
  165. {[$item.ColumnNameLower]}: '{[$item.ColumnDefault]}',{[else]}
  166. {[$item.ColumnNameLower]}: {[$item.ColumnDefault]},{[end]}{[else]}
  167. //{[$item.ColumnComment]}字段
  168. {[$item.ColumnNameLower]}: undefined,{[end]} {[end]}{[end]}
  169. })
  170. const formRules = reactive({{[range $index, $item := .Columns]}{[if eq $item.IsRequired "1"]}
  171. {[$item.ColumnNameLower]}: [{ required: true, message: "{[$item.ColumnComment]}不能为空", trigger: "blur" }],{[end]}{[end]}
  172. })
  173. {[range $index, $item := .Columns]}{[if eq $item.Source "1"]}
  174. //{[$item.ColumnComment]}数据字典
  175. let {[$item.ColumnNameLower]}Options = ref([]){[else if eq $item.Source "2"]}
  176. //{[$item.ColumnComment]}数据菜单
  177. let {[$item.ColumnNameLower]}Options = ref([]){[else if eq $item.Source "3"]}
  178. //{[$item.ColumnComment]}本地数据
  179. {[if eq $item.GoType "string"]}
  180. const {[$item.ColumnNameLower]}Options = [ {[range $i, $it := $item.Data]}
  181. {id:'{[$it.Id]}',label:"{[$it.Label]}",color:"{[$it.Color]}"}{[if not (isLast $i (len $item.Data))]},{[end]}{[end]}]
  182. {[else]}
  183. const {[$item.ColumnNameLower]}Options = [ {[range $i, $it := $item.Data]}
  184. {id:{[$it.Id]},label:"{[$it.Label]}",color:"{[$it.Color]}"}{[if not (isLast $i (len $item.Data))]},{[end]}{[end]}]
  185. {[end]}{[end]}{[end]}
  186. /**定义窗体*/
  187. const formRef = ref() // 表单 Ref
  188. /**定义方法*/
  189. /** 打开弹窗 */
  190. const open = async (type: string, id?: number) => {
  191. dialogVisible.value = true
  192. dialogTitle.value = t('action.' + type)
  193. formType.value = type
  194. resetForm(){[range $index, $item := .Columns]}{[if eq $item.Source "1"]}
  195. //获取{[$item.ColumnComment]}数据字典
  196. getDicts("{[$item.DictType]}").then(response => {
  197. {[$item.ColumnNameLower]}Options = response.data;
  198. }){[else if eq $item.Source "2"]}
  199. //获取{[$item.ColumnComment]}菜单
  200. getList{[$item.ColumnNameUpper]}(){[end]}{[end]}
  201. // 修改时,设置数据
  202. if (id) {
  203. formLoading.value = true
  204. try {
  205. formData.value = await {[.ClassNameUpper]}Api.get{[.ClassNameUpper]}(id)
  206. } finally {
  207. formLoading.value = false
  208. }
  209. }
  210. }
  211. {[range $index, $item := .Columns]}{[if eq $item.Source "2"]}
  212. //查询{[$item.ColumnComment]}菜单
  213. const getList{[$item.ColumnNameUpper]}= async () =>{
  214. const data = await {[toUpper $item.Menu]}Api.get{[toUpper $item.Menu]}List(){[if eq $item.HtmlType "select"]}
  215. {[$item.ColumnNameLower]}Options.value = data{[else if eq $item.HtmlType "treeSelect"]}
  216. // response.data.push({ id: 0, menuName: '顶级节点', children: [] });
  217. {[$item.ColumnNameLower]}List= Object.assign([],data)
  218. {[$item.ColumnNameLower]}List.push({ id: 0, menuName: '顶级节点', children: []})
  219. const root = { id: 0, label: '顶级节点', children: [] }
  220. root.children = this.handleTree(response.data, 'id')
  221. this.{[$item.ColumnNameLower]}Options.push(root){[end]}
  222. }{[end]}{[end]}
  223. /** 重置表单 */
  224. const resetForm = () => {
  225. formData.value = {
  226. id: undefined,{[range $index, $item := .Columns]}{[if eq $item.IsEdit "1"]}{[if $item.ColumnDefault]}{[if eq $item.GoType "string"]}
  227. {[$item.ColumnNameLower]}: '{[$item.ColumnDefault]}',{[else]}
  228. {[$item.ColumnNameLower]}: {[$item.ColumnDefault]},{[end]}{[else]}
  229. //{[$item.ColumnComment]}字段
  230. {[$item.ColumnNameLower]}: undefined,{[end]} {[end]}{[end]}
  231. }
  232. formRef.value?.resetFields()
  233. }
  234. /** 提交表单 */
  235. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  236. const submitForm = async () => {
  237. // 校验表单
  238. if (!formRef) return
  239. const valid = await formRef.value.validate()
  240. if (!valid) return
  241. // 提交请求
  242. formLoading.value = true
  243. try {
  244. const data = formData.value as unknown as {[.ClassNameUpper]}Api.{[.ClassNameUpper]}VO
  245. if (formType.value === 'create') {
  246. await {[.ClassNameUpper]}Api.create{[.ClassNameUpper]}(data)
  247. message.success(t('common.createSuccess'))
  248. } else {
  249. await {[.ClassNameUpper]}Api.update{[.ClassNameUpper]}(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. /**define方法*/
  260. defineOptions({ name: 'SystemTestForm' })
  261. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  262. </script>