form.vue.template 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. {{- if .IsAdd }}
  2. // 新增表单中增加如下代码
  3. {{- range .Fields}}
  4. {{- if .Form}}
  5. <el-form-item label="{{.FieldDesc}}:" prop="{{.FieldJson}}" >
  6. {{- if .CheckDataSource}}
  7. <el-select {{if eq .DataSource.Association 2}} multiple {{ end }} v-model="formData.{{.FieldJson}}" placeholder="请选择{{.FieldDesc}}" style="width:100%" :clearable="{{.Clearable}}" >
  8. <el-option v-for="(item,key) in dataSource.{{.FieldJson}}" :key="key" :label="item.label" :value="item.value" />
  9. </el-select>
  10. {{- else }}
  11. {{- if eq .FieldType "bool" }}
  12. <el-switch v-model="formData.{{.FieldJson}}" active-color="#13ce66" inactive-color="#ff4949" active-text="是" inactive-text="否" clearable ></el-switch>
  13. {{- end }}
  14. {{- if eq .FieldType "string" }}
  15. {{- if .DictType}}
  16. <el-select {{if eq .FieldType "array"}}multiple {{end}}v-model="formData.{{ .FieldJson }}" placeholder="请选择{{.FieldDesc}}" style="width:100%" :clearable="{{.Clearable}}" >
  17. <el-option v-for="(item,key) in {{ .DictType }}Options" :key="key" :label="item.label" :value="item.value" />
  18. </el-select>
  19. {{- else }}
  20. <el-input v-model="formData.{{.FieldJson}}" :clearable="{{.Clearable}}" placeholder="请输入{{.FieldDesc}}" />
  21. {{- end }}
  22. {{- end }}
  23. {{- if eq .FieldType "richtext" }}
  24. <RichEdit v-model="formData.{{.FieldJson}}"/>
  25. {{- end }}
  26. {{- if eq .FieldType "json" }}
  27. // 此字段为json结构,可以前端自行控制展示和数据绑定模式 需绑定json的key为 formData.{{.FieldJson}} 后端会按照json的类型进行存取
  28. {{"{{"}} formData.{{.FieldJson}} {{"}}"}}
  29. {{- end }}
  30. {{- if eq .FieldType "array" }}
  31. <ArrayCtrl v-model="formData.{{ .FieldJson }}" editable/>
  32. {{- end }}
  33. {{- if eq .FieldType "int" }}
  34. <el-input v-model.number="formData.{{ .FieldJson }}" :clearable="{{.Clearable}}" placeholder="请输入{{.FieldDesc}}" />
  35. {{- end }}
  36. {{- if eq .FieldType "time.Time" }}
  37. <el-date-picker v-model="formData.{{ .FieldJson }}" type="date" style="width:100%" placeholder="选择日期" :clearable="{{.Clearable}}" />
  38. {{- end }}
  39. {{- if eq .FieldType "float64" }}
  40. <el-input-number v-model="formData.{{ .FieldJson }}" style="width:100%" :precision="2" :clearable="{{.Clearable}}" />
  41. {{- end }}
  42. {{- if eq .FieldType "enum" }}
  43. <el-select v-model="formData.{{ .FieldJson }}" placeholder="请选择{{.FieldDesc}}" style="width:100%" :clearable="{{.Clearable}}" >
  44. <el-option v-for="item in [{{.DataTypeLong}}]" :key="item" :label="item" :value="item" />
  45. </el-select>
  46. {{- end }}
  47. {{- if eq .FieldType "picture" }}
  48. <SelectImage
  49. v-model="formData.{{ .FieldJson }}"
  50. file-type="image"
  51. />
  52. {{- end }}
  53. {{- if eq .FieldType "pictures" }}
  54. <SelectImage
  55. multiple
  56. v-model="formData.{{ .FieldJson }}"
  57. file-type="image"
  58. />
  59. {{- end }}
  60. {{- if eq .FieldType "video" }}
  61. <SelectImage
  62. v-model="formData.{{ .FieldJson }}"
  63. file-type="video"
  64. />
  65. {{- end }}
  66. {{- if eq .FieldType "file" }}
  67. <SelectFile v-model="formData.{{ .FieldJson }}" />
  68. {{- end }}
  69. {{- end }}
  70. </el-form-item>
  71. {{- end }}
  72. {{- end }}
  73. // 字典增加如下代码
  74. {{- range $index, $element := .DictTypes}}
  75. const {{ $element }}Options = ref([])
  76. {{- end }}
  77. // init方法中增加如下调用
  78. {{- range $index, $element := .DictTypes }}
  79. {{ $element }}Options.value = await getDictFunc('{{$element}}')
  80. {{- end }}
  81. // 基础formData结构增加如下字段
  82. {{- range .Fields}}
  83. {{- if .Form}}
  84. {{- if eq .FieldType "bool" }}
  85. {{.FieldJson}}: false,
  86. {{- end }}
  87. {{- if eq .FieldType "string" }}
  88. {{.FieldJson}}: '',
  89. {{- end }}
  90. {{- if eq .FieldType "richtext" }}
  91. {{.FieldJson}}: '',
  92. {{- end }}
  93. {{- if eq .FieldType "int" }}
  94. {{.FieldJson}}: {{- if or .DataSource}} undefined{{ else }} 0{{- end }},
  95. {{- end }}
  96. {{- if eq .FieldType "time.Time" }}
  97. {{.FieldJson}}: new Date(),
  98. {{- end }}
  99. {{- if eq .FieldType "float64" }}
  100. {{.FieldJson}}: 0,
  101. {{- end }}
  102. {{- if eq .FieldType "picture" }}
  103. {{.FieldJson}}: "",
  104. {{- end }}
  105. {{- if eq .FieldType "video" }}
  106. {{.FieldJson}}: "",
  107. {{- end }}
  108. {{- if eq .FieldType "pictures" }}
  109. {{.FieldJson}}: [],
  110. {{- end }}
  111. {{- if eq .FieldType "file" }}
  112. {{.FieldJson}}: [],
  113. {{- end }}
  114. {{- if eq .FieldType "json" }}
  115. {{.FieldJson}}: {},
  116. {{- end }}
  117. {{- if eq .FieldType "array" }}
  118. {{.FieldJson}}: [],
  119. {{- end }}
  120. {{- end }}
  121. {{- end }}
  122. // 验证规则中增加如下字段
  123. {{- range .Fields }}
  124. {{- if .Form }}
  125. {{- if eq .Require true }}
  126. {{.FieldJson }} : [{
  127. required: true,
  128. message: '{{ .ErrorText }}',
  129. trigger: ['input','blur'],
  130. },
  131. {{- if eq .FieldType "string" }}
  132. {
  133. whitespace: true,
  134. message: '不能只输入空格',
  135. trigger: ['input', 'blur'],
  136. }
  137. {{- end }}
  138. ],
  139. {{- end }}
  140. {{- end }}
  141. {{- end }}
  142. {{- if .HasDataSource }}
  143. // 请引用
  144. get{{.StructName}}DataSource,
  145. // 获取数据源
  146. const dataSource = ref([])
  147. const getDataSourceFunc = async()=>{
  148. const res = await get{{.StructName}}DataSource()
  149. if (res.code === 0) {
  150. dataSource.value = res.data
  151. }
  152. }
  153. getDataSourceFunc()
  154. {{- end }}
  155. {{- else }}
  156. {{- if not .OnlyTemplate }}
  157. <template>
  158. <div>
  159. <div class="gva-form-box">
  160. <el-form :model="formData" ref="elFormRef" label-position="right" :rules="rule" label-width="80px">
  161. {{- if .IsTree }}
  162. <el-form-item label="父节点:" prop="parentID" >
  163. <el-tree-select
  164. v-model="formData.parentID"
  165. :data="[rootNode,...tableData]"
  166. check-strictly
  167. :render-after-expand="false"
  168. :props="defaultProps"
  169. clearable
  170. style="width: 240px"
  171. placeholder="根节点"
  172. />
  173. </el-form-item>
  174. {{- end }}
  175. {{- range .Fields}}
  176. {{- if .Form }}
  177. <el-form-item label="{{.FieldDesc}}:" prop="{{.FieldJson}}">
  178. {{- if .CheckDataSource}}
  179. <el-select {{if eq .DataSource.Association 2}} multiple {{ end }} v-model="formData.{{.FieldJson}}" placeholder="请选择{{.FieldDesc}}" style="width:100%" :clearable="{{.Clearable}}" >
  180. <el-option v-for="(item,key) in dataSource.{{.FieldJson}}" :key="key" :label="item.label" :value="item.value" />
  181. </el-select>
  182. {{- else }}
  183. {{- if eq .FieldType "bool" }}
  184. <el-switch v-model="formData.{{.FieldJson}}" active-color="#13ce66" inactive-color="#ff4949" active-text="是" inactive-text="否" clearable ></el-switch>
  185. {{- end }}
  186. {{- if eq .FieldType "string" }}
  187. {{- if .DictType}}
  188. <el-select {{if eq .FieldType "array"}}multiple {{end}}v-model="formData.{{ .FieldJson }}" placeholder="请选择{{.FieldDesc}}" style="width:100%" :clearable="{{.Clearable}}" >
  189. <el-option v-for="(item,key) in {{ .DictType }}Options" :key="key" :label="item.label" :value="item.value" />
  190. </el-select>
  191. {{- else }}
  192. <el-input v-model="formData.{{.FieldJson}}" :clearable="{{.Clearable}}" placeholder="请输入{{.FieldDesc}}" />
  193. {{- end }}
  194. {{- end }}
  195. {{- if eq .FieldType "richtext" }}
  196. <RichEdit v-model="formData.{{.FieldJson}}"/>
  197. {{- end }}
  198. {{- if eq .FieldType "int" }}
  199. <el-input v-model.number="formData.{{ .FieldJson }}" :clearable="{{.Clearable}}" placeholder="请输入" />
  200. {{- end }}
  201. {{- if eq .FieldType "time.Time" }}
  202. <el-date-picker v-model="formData.{{ .FieldJson }}" type="date" placeholder="选择日期" :clearable="{{.Clearable}}"></el-date-picker>
  203. {{- end }}
  204. {{- if eq .FieldType "float64" }}
  205. <el-input-number v-model="formData.{{ .FieldJson }}" :precision="2" :clearable="{{.Clearable}}"></el-input-number>
  206. {{- end }}
  207. {{- if eq .FieldType "enum" }}
  208. <el-select v-model="formData.{{ .FieldJson }}" placeholder="请选择" style="width:100%" :clearable="{{.Clearable}}">
  209. <el-option v-for="item in [{{ .DataTypeLong }}]" :key="item" :label="item" :value="item" />
  210. </el-select>
  211. {{- end }}
  212. {{- if eq .FieldType "picture" }}
  213. <SelectImage v-model="formData.{{ .FieldJson }}" file-type="image"/>
  214. {{- end }}
  215. {{- if eq .FieldType "video" }}
  216. <SelectImage v-model="formData.{{ .FieldJson }}" file-type="video"/>
  217. {{- end }}
  218. {{- if eq .FieldType "pictures" }}
  219. <SelectImage v-model="formData.{{ .FieldJson }}" multiple file-type="image"/>
  220. {{- end }}
  221. {{- if eq .FieldType "file" }}
  222. <SelectFile v-model="formData.{{ .FieldJson }}" />
  223. {{- end }}
  224. {{- if eq .FieldType "json" }}
  225. // 此字段为json结构,可以前端自行控制展示和数据绑定模式 需绑定json的key为 formData.{{.FieldJson}} 后端会按照json的类型进行存取
  226. {{"{{"}} formData.{{.FieldJson}} {{"}}"}}
  227. {{- end }}
  228. {{- if eq .FieldType "array" }}
  229. <ArrayCtrl v-model="formData.{{ .FieldJson }}" editable/>
  230. {{- end }}
  231. {{- end }}
  232. </el-form-item>
  233. {{- end }}
  234. {{- end }}
  235. <el-form-item>
  236. <el-button :loading="btnLoading" type="primary" @click="save">保存</el-button>
  237. <el-button type="primary" @click="back">返回</el-button>
  238. </el-form-item>
  239. </el-form>
  240. </div>
  241. </div>
  242. </template>
  243. <script setup>
  244. import {
  245. {{- if .HasDataSource }}
  246. get{{.StructName}}DataSource,
  247. {{- end }}
  248. {{- if .IsTree }}
  249. get{{.StructName}}List,
  250. {{- end }}
  251. create{{.StructName}},
  252. update{{.StructName}},
  253. find{{.StructName}}
  254. } from '@/api/{{.Package}}/{{.PackageName}}'
  255. defineOptions({
  256. name: '{{.StructName}}Form'
  257. })
  258. // 自动获取字典
  259. import { getDictFunc } from '@/utils/format'
  260. import { useRoute, useRouter } from "vue-router"
  261. import { ElMessage } from 'element-plus'
  262. import { ref, reactive } from 'vue'
  263. {{- if .HasPic }}
  264. // 图片选择组件
  265. import SelectImage from '@/components/selectImage/selectImage.vue'
  266. {{- end }}
  267. {{- if .HasFile }}
  268. // 文件选择组件
  269. import SelectFile from '@/components/selectFile/selectFile.vue'
  270. {{- end }}
  271. {{- if .HasRichText }}
  272. // 富文本组件
  273. import RichEdit from '@/components/richtext/rich-edit.vue'
  274. {{- end }}
  275. {{- if .HasArray}}
  276. // 数组控制组件
  277. import ArrayCtrl from '@/components/arrayCtrl/arrayCtrl.vue'
  278. {{- end }}
  279. const route = useRoute()
  280. const router = useRouter()
  281. {{- if .IsTree }}
  282. const tableData = ref([])
  283. const defaultProps = {
  284. children: "children",
  285. label: "{{ .TreeJson }}",
  286. value: "{{ .PrimaryField.FieldJson }}"
  287. }
  288. const rootNode = {
  289. {{ .PrimaryField.FieldJson }}: 0,
  290. {{ .TreeJson }}: '根节点',
  291. children: []
  292. }
  293. const getTableData = async() => {
  294. const table = await get{{.StructName}}List()
  295. if (table.code === 0) {
  296. tableData.value = table.data || []
  297. }
  298. }
  299. getTableData()
  300. {{- end }}
  301. // 提交按钮loading
  302. const btnLoading = ref(false)
  303. const type = ref('')
  304. {{- range $index, $element := .DictTypes}}
  305. const {{ $element }}Options = ref([])
  306. {{- end }}
  307. const formData = ref({
  308. {{- if .IsTree }}
  309. parentID: undefined,
  310. {{- end }}
  311. {{- range .Fields}}
  312. {{- if .Form }}
  313. {{- if eq .FieldType "bool" }}
  314. {{.FieldJson}}: false,
  315. {{- end }}
  316. {{- if eq .FieldType "string" }}
  317. {{.FieldJson}}: '',
  318. {{- end }}
  319. {{- if eq .FieldType "richtext" }}
  320. {{.FieldJson}}: '',
  321. {{- end }}
  322. {{- if eq .FieldType "int" }}
  323. {{.FieldJson}}: {{- if or .DataSource }} undefined{{ else }} 0{{- end }},
  324. {{- end }}
  325. {{- if eq .FieldType "time.Time" }}
  326. {{.FieldJson}}: new Date(),
  327. {{- end }}
  328. {{- if eq .FieldType "float64" }}
  329. {{.FieldJson}}: 0,
  330. {{- end }}
  331. {{- if eq .FieldType "picture" }}
  332. {{.FieldJson}}: "",
  333. {{- end }}
  334. {{- if eq .FieldType "video" }}
  335. {{.FieldJson}}: "",
  336. {{- end }}
  337. {{- if eq .FieldType "pictures" }}
  338. {{.FieldJson}}: [],
  339. {{- end }}
  340. {{- if eq .FieldType "file" }}
  341. {{.FieldJson}}: [],
  342. {{- end }}
  343. {{- if eq .FieldType "json" }}
  344. {{.FieldJson}}: {},
  345. {{- end }}
  346. {{- if eq .FieldType "array" }}
  347. {{.FieldJson}}: [],
  348. {{- end }}
  349. {{- end }}
  350. {{- end }}
  351. })
  352. // 验证规则
  353. const rule = reactive({
  354. {{- range .Fields }}
  355. {{- if eq .Require true }}
  356. {{.FieldJson }} : [{
  357. required: true,
  358. message: '{{ .ErrorText }}',
  359. trigger: ['input','blur'],
  360. }],
  361. {{- end }}
  362. {{- end }}
  363. })
  364. const elFormRef = ref()
  365. {{- if .HasDataSource }}
  366. const dataSource = ref([])
  367. const getDataSourceFunc = async()=>{
  368. const res = await get{{.StructName}}DataSource()
  369. if (res.code === 0) {
  370. dataSource.value = res.data
  371. }
  372. }
  373. getDataSourceFunc()
  374. {{- end }}
  375. // 初始化方法
  376. const init = async () => {
  377. // 建议通过url传参获取目标数据ID 调用 find方法进行查询数据操作 从而决定本页面是create还是update 以下为id作为url参数示例
  378. if (route.query.id) {
  379. const res = await find{{.StructName}}({ ID: route.query.id })
  380. if (res.code === 0) {
  381. formData.value = res.data
  382. type.value = 'update'
  383. }
  384. } else {
  385. type.value = 'create'
  386. }
  387. {{- range $index, $element := .DictTypes }}
  388. {{ $element }}Options.value = await getDictFunc('{{$element}}')
  389. {{- end }}
  390. }
  391. init()
  392. // 保存按钮
  393. const save = async() => {
  394. btnLoading.value = true
  395. elFormRef.value?.validate( async (valid) => {
  396. if (!valid) return btnLoading.value = false
  397. let res
  398. switch (type.value) {
  399. case 'create':
  400. res = await create{{.StructName}}(formData.value)
  401. break
  402. case 'update':
  403. res = await update{{.StructName}}(formData.value)
  404. break
  405. default:
  406. res = await create{{.StructName}}(formData.value)
  407. break
  408. }
  409. btnLoading.value = false
  410. if (res.code === 0) {
  411. ElMessage({
  412. type: 'success',
  413. message: '创建/更改成功'
  414. })
  415. }
  416. })
  417. }
  418. // 返回按钮
  419. const back = () => {
  420. router.go(-1)
  421. }
  422. </script>
  423. <style>
  424. </style>
  425. {{- else }}
  426. <template>
  427. <div>form</div>
  428. </template>
  429. <script setup>
  430. </script>
  431. <style>
  432. </style>
  433. {{- end }}
  434. {{- end }}