form.vue.tpl 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <template>
  2. <div>
  3. <div class="gva-form-box">
  4. <el-form :model="formData" ref="elFormRef" label-position="right" :rules="rule" label-width="80px">
  5. {{- range .Fields}}
  6. <el-form-item label="{{.FieldDesc}}:" prop="{{.FieldJson}}">
  7. {{- if .CheckDataSource}}
  8. <el-select v-model="formData.{{.FieldJson}}" placeholder="请选择{{.FieldDesc}}" style="width:100%" :clearable="{{.Clearable}}" >
  9. <el-option v-for="(item,key) in dataSource.{{.FieldJson}}" :key="key" :label="item.label" :value="item.value" />
  10. </el-select>
  11. {{- else }}
  12. {{- if eq .FieldType "bool" }}
  13. <el-switch v-model="formData.{{.FieldJson}}" active-color="#13ce66" inactive-color="#ff4949" active-text="是" inactive-text="否" clearable ></el-switch>
  14. {{- end }}
  15. {{- if eq .FieldType "string" }}
  16. {{- if .DictType}}
  17. <el-select v-model="formData.{{ .FieldJson }}" placeholder="请选择{{.FieldDesc}}" style="width:100%" :clearable="{{.Clearable}}" >
  18. <el-option v-for="(item,key) in {{ .DictType }}Options" :key="key" :label="item.label" :value="item.value" />
  19. </el-select>
  20. {{- else }}
  21. <el-input v-model="formData.{{.FieldJson}}" :clearable="{{.Clearable}}" placeholder="请输入{{.FieldDesc}}" />
  22. {{- end }}
  23. {{- end }}
  24. {{- if eq .FieldType "richtext" }}
  25. <RichEdit v-model="formData.{{.FieldJson}}"/>
  26. {{- end }}
  27. {{- if eq .FieldType "int" }}
  28. <el-input v-model.number="formData.{{ .FieldJson }}" :clearable="{{.Clearable}}" placeholder="请输入" />
  29. {{- end }}
  30. {{- if eq .FieldType "time.Time" }}
  31. <el-date-picker v-model="formData.{{ .FieldJson }}" type="date" placeholder="选择日期" :clearable="{{.Clearable}}"></el-date-picker>
  32. {{- end }}
  33. {{- if eq .FieldType "float64" }}
  34. <el-input-number v-model="formData.{{ .FieldJson }}" :precision="2" :clearable="{{.Clearable}}"></el-input-number>
  35. {{- end }}
  36. {{- if eq .FieldType "enum" }}
  37. <el-select v-model="formData.{{ .FieldJson }}" placeholder="请选择" style="width:100%" :clearable="{{.Clearable}}">
  38. <el-option v-for="item in [{{ .DataTypeLong }}]" :key="item" :label="item" :value="item" />
  39. </el-select>
  40. {{- end }}
  41. {{- if eq .FieldType "picture" }}
  42. <SelectImage v-model="formData.{{ .FieldJson }}" file-type="image"/>
  43. {{- end }}
  44. {{- if eq .FieldType "video" }}
  45. <SelectImage v-model="formData.{{ .FieldJson }}" file-type="video"/>
  46. {{- end }}
  47. {{- if eq .FieldType "pictures" }}
  48. <SelectImage v-model="formData.{{ .FieldJson }}" multiple file-type="image"/>
  49. {{- end }}
  50. {{- if eq .FieldType "file" }}
  51. <SelectFile v-model="formData.{{ .FieldJson }}" />
  52. {{- end }}
  53. {{- if eq .FieldType "json" }}
  54. // 此字段为json结构,可以前端自行控制展示和数据绑定模式 需绑定json的key为 formData.{{.FieldJson}} 后端会按照json的类型进行存取
  55. {{"{{"}} formData.{{.FieldJson}} {{"}}"}}
  56. {{- end }}
  57. {{- end }}
  58. </el-form-item>
  59. {{- end }}
  60. <el-form-item>
  61. <el-button type="primary" @click="save">保存</el-button>
  62. <el-button type="primary" @click="back">返回</el-button>
  63. </el-form-item>
  64. </el-form>
  65. </div>
  66. </div>
  67. </template>
  68. <script setup>
  69. import {
  70. {{- if .HasDataSource }}
  71. get{{.StructName}}DataSource,
  72. {{- end }}
  73. create{{.StructName}},
  74. update{{.StructName}},
  75. find{{.StructName}}
  76. } from '@/api/{{.Package}}/{{.PackageName}}'
  77. defineOptions({
  78. name: '{{.StructName}}Form'
  79. })
  80. // 自动获取字典
  81. import { getDictFunc } from '@/utils/format'
  82. import { useRoute, useRouter } from "vue-router"
  83. import { ElMessage } from 'element-plus'
  84. import { ref, reactive } from 'vue'
  85. {{- if .HasPic }}
  86. import SelectImage from '@/components/selectImage/selectImage.vue'
  87. {{- end }}
  88. {{- if .HasFile }}
  89. import SelectFile from '@/components/selectFile/selectFile.vue'
  90. {{- end }}
  91. {{- if .HasRichText }}
  92. // 富文本组件
  93. import RichEdit from '@/components/richtext/rich-edit.vue'
  94. {{- end }}
  95. const route = useRoute()
  96. const router = useRouter()
  97. const type = ref('')
  98. {{- range $index, $element := .DictTypes}}
  99. const {{ $element }}Options = ref([])
  100. {{- end }}
  101. const formData = ref({
  102. {{- range .Fields}}
  103. {{- if eq .FieldType "bool" }}
  104. {{.FieldJson}}: false,
  105. {{- end }}
  106. {{- if eq .FieldType "string" }}
  107. {{.FieldJson}}: '',
  108. {{- end }}
  109. {{- if eq .FieldType "richtext" }}
  110. {{.FieldJson}}: '',
  111. {{- end }}
  112. {{- if eq .FieldType "int" }}
  113. {{.FieldJson}}: {{- if .DictType }} undefined{{ else }} 0{{- end }},
  114. {{- end }}
  115. {{- if eq .FieldType "time.Time" }}
  116. {{.FieldJson}}: new Date(),
  117. {{- end }}
  118. {{- if eq .FieldType "float64" }}
  119. {{.FieldJson}}: 0,
  120. {{- end }}
  121. {{- if eq .FieldType "picture" }}
  122. {{.FieldJson}}: "",
  123. {{- end }}
  124. {{- if eq .FieldType "video" }}
  125. {{.FieldJson}}: "",
  126. {{- end }}
  127. {{- if eq .FieldType "pictures" }}
  128. {{.FieldJson}}: [],
  129. {{- end }}
  130. {{- if eq .FieldType "file" }}
  131. {{.FieldJson}}: [],
  132. {{- end }}
  133. {{- if eq .FieldType "json" }}
  134. {{.FieldJson}}: {},
  135. {{- end }}
  136. {{- end }}
  137. })
  138. // 验证规则
  139. const rule = reactive({
  140. {{- range .Fields }}
  141. {{- if eq .Require true }}
  142. {{.FieldJson }} : [{
  143. required: true,
  144. message: '{{ .ErrorText }}',
  145. trigger: ['input','blur'],
  146. }],
  147. {{- end }}
  148. {{- end }}
  149. })
  150. const elFormRef = ref()
  151. {{- if .HasDataSource }}
  152. const dataSource = ref([])
  153. const getDataSourceFunc = async()=>{
  154. const res = await get{{.StructName}}DataSource()
  155. if (res.code === 0) {
  156. dataSource.value = res.data
  157. }
  158. }
  159. getDataSourceFunc()
  160. {{- end }}
  161. // 初始化方法
  162. const init = async () => {
  163. // 建议通过url传参获取目标数据ID 调用 find方法进行查询数据操作 从而决定本页面是create还是update 以下为id作为url参数示例
  164. if (route.query.id) {
  165. const res = await find{{.StructName}}({ ID: route.query.id })
  166. if (res.code === 0) {
  167. formData.value = res.data.re{{.Abbreviation}}
  168. type.value = 'update'
  169. }
  170. } else {
  171. type.value = 'create'
  172. }
  173. {{- range $index, $element := .DictTypes }}
  174. {{ $element }}Options.value = await getDictFunc('{{$element}}')
  175. {{- end }}
  176. }
  177. init()
  178. // 保存按钮
  179. const save = async() => {
  180. elFormRef.value?.validate( async (valid) => {
  181. if (!valid) return
  182. let res
  183. switch (type.value) {
  184. case 'create':
  185. res = await create{{.StructName}}(formData.value)
  186. break
  187. case 'update':
  188. res = await update{{.StructName}}(formData.value)
  189. break
  190. default:
  191. res = await create{{.StructName}}(formData.value)
  192. break
  193. }
  194. if (res.code === 0) {
  195. ElMessage({
  196. type: 'success',
  197. message: '创建/更改成功'
  198. })
  199. }
  200. })
  201. }
  202. // 返回按钮
  203. const back = () => {
  204. router.go(-1)
  205. }
  206. </script>
  207. <style>
  208. </style>