template_funcs.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. package autocode
  2. import (
  3. "fmt"
  4. systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
  5. "slices"
  6. "strings"
  7. "text/template"
  8. )
  9. // GetTemplateFuncMap 返回模板函数映射,用于在模板中使用
  10. func GetTemplateFuncMap() template.FuncMap {
  11. return template.FuncMap{
  12. "title": strings.Title,
  13. "GenerateField": GenerateField,
  14. "GenerateSearchField": GenerateSearchField,
  15. "GenerateSearchConditions": GenerateSearchConditions,
  16. "GenerateSearchFormItem": GenerateSearchFormItem,
  17. "GenerateTableColumn": GenerateTableColumn,
  18. "GenerateFormItem": GenerateFormItem,
  19. "GenerateDescriptionItem": GenerateDescriptionItem,
  20. "GenerateDefaultFormValue": GenerateDefaultFormValue,
  21. }
  22. }
  23. // 渲染Model中的字段
  24. func GenerateField(field systemReq.AutoCodeField) string {
  25. // 构建gorm标签
  26. gormTag := ``
  27. if field.FieldIndexType != "" {
  28. gormTag += field.FieldIndexType + ";"
  29. }
  30. if field.PrimaryKey {
  31. gormTag += "primarykey;"
  32. }
  33. if field.DefaultValue != "" {
  34. gormTag += fmt.Sprintf("default:%s;", field.DefaultValue)
  35. }
  36. if field.Comment != "" {
  37. gormTag += fmt.Sprintf("comment:%s;", field.Comment)
  38. }
  39. gormTag += "column:" + field.ColumnName + ";"
  40. // 对于int类型,根据DataTypeLong决定具体的Go类型,不使用size标签
  41. if field.DataTypeLong != "" && field.FieldType != "enum" && field.FieldType != "int" {
  42. gormTag += fmt.Sprintf("size:%s;", field.DataTypeLong)
  43. }
  44. requireTag := ` binding:"required"` + "`"
  45. // 根据字段类型构建不同的字段定义
  46. var result string
  47. switch field.FieldType {
  48. case "enum":
  49. result = fmt.Sprintf(`%s string `+"`"+`json:"%s" form:"%s" gorm:"%stype:enum(%s);"`+"`",
  50. field.FieldName, field.FieldJson, field.FieldJson, gormTag, field.DataTypeLong)
  51. case "picture", "video":
  52. tagContent := fmt.Sprintf(`json:"%s" form:"%s" gorm:"%s"`,
  53. field.FieldJson, field.FieldJson, gormTag)
  54. result = fmt.Sprintf(`%s string `+"`"+`%s`+"`"+``, field.FieldName, tagContent)
  55. case "file", "pictures", "array":
  56. tagContent := fmt.Sprintf(`json:"%s" form:"%s" gorm:"%s"`,
  57. field.FieldJson, field.FieldJson, gormTag)
  58. result = fmt.Sprintf(`%s datatypes.JSON `+"`"+`%s swaggertype:"array,object"`+"`"+``,
  59. field.FieldName, tagContent)
  60. case "richtext":
  61. tagContent := fmt.Sprintf(`json:"%s" form:"%s" gorm:"%s`,
  62. field.FieldJson, field.FieldJson, gormTag)
  63. result = fmt.Sprintf(`%s *string `+"`"+`%stype:text;"`+"`"+``,
  64. field.FieldName, tagContent)
  65. case "json":
  66. tagContent := fmt.Sprintf(`json:"%s" form:"%s" gorm:"%s"`,
  67. field.FieldJson, field.FieldJson, gormTag)
  68. result = fmt.Sprintf(`%s datatypes.JSON `+"`"+`%s swaggertype:"object"`+"`"+``,
  69. field.FieldName, tagContent)
  70. default:
  71. tagContent := fmt.Sprintf(`json:"%s" form:"%s" gorm:"%s"`,
  72. field.FieldJson, field.FieldJson, gormTag)
  73. // 对于int类型,根据DataTypeLong决定具体的Go类型
  74. var fieldType string
  75. if field.FieldType == "int" {
  76. switch field.DataTypeLong {
  77. case "1", "2", "3":
  78. fieldType = "int8"
  79. case "4", "5":
  80. fieldType = "int16"
  81. case "6", "7", "8", "9", "10":
  82. fieldType = "int32"
  83. case "11", "12", "13", "14", "15", "16", "17", "18", "19", "20":
  84. fieldType = "int64"
  85. default:
  86. fieldType = "int64"
  87. }
  88. } else {
  89. fieldType = field.FieldType
  90. }
  91. result = fmt.Sprintf(`%s *%s `+"`"+`%s`+"`"+``,
  92. field.FieldName, fieldType, tagContent)
  93. }
  94. if field.Require {
  95. result = result[0:len(result)-1] + requireTag
  96. }
  97. // 添加字段描述
  98. if field.FieldDesc != "" {
  99. result += fmt.Sprintf(" //%s", field.FieldDesc)
  100. }
  101. return result
  102. }
  103. // 格式化搜索条件语句
  104. func GenerateSearchConditions(fields []*systemReq.AutoCodeField) string {
  105. var conditions []string
  106. for _, field := range fields {
  107. if field.FieldSearchType == "" {
  108. continue
  109. }
  110. var condition string
  111. if slices.Contains([]string{"enum", "pictures", "picture", "video", "json", "richtext", "array"}, field.FieldType) {
  112. if field.FieldType == "enum" {
  113. if field.FieldSearchType == "LIKE" {
  114. condition = fmt.Sprintf(`
  115. if info.%s != "" {
  116. db = db.Where("%s LIKE ?", "%%"+ info.%s+"%%")
  117. }`,
  118. field.FieldName, field.ColumnName, field.FieldName)
  119. } else {
  120. condition = fmt.Sprintf(`
  121. if info.%s != "" {
  122. db = db.Where("%s %s ?", info.%s)
  123. }`,
  124. field.FieldName, field.ColumnName, field.FieldSearchType, field.FieldName)
  125. }
  126. } else {
  127. condition = fmt.Sprintf(`
  128. if info.%s != "" {
  129. // TODO 数据类型为复杂类型,请根据业务需求自行实现复杂类型的查询业务
  130. }`, field.FieldName)
  131. }
  132. } else if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" {
  133. if field.FieldType == "time.Time" {
  134. condition = fmt.Sprintf(`
  135. if len(info.%sRange) == 2 {
  136. db = db.Where("%s %s ? AND ? ", info.%sRange[0], info.%sRange[1])
  137. }`,
  138. field.FieldName, field.ColumnName, field.FieldSearchType, field.FieldName, field.FieldName)
  139. } else {
  140. condition = fmt.Sprintf(`
  141. if info.Start%s != nil && info.End%s != nil {
  142. db = db.Where("%s %s ? AND ? ", *info.Start%s, *info.End%s)
  143. }`,
  144. field.FieldName, field.FieldName, field.ColumnName,
  145. field.FieldSearchType, field.FieldName, field.FieldName)
  146. }
  147. } else {
  148. nullCheck := "info." + field.FieldName + " != nil"
  149. if field.FieldType == "string" {
  150. condition = fmt.Sprintf(`
  151. if %s && *info.%s != "" {`, nullCheck, field.FieldName)
  152. } else {
  153. condition = fmt.Sprintf(`
  154. if %s {`, nullCheck)
  155. }
  156. if field.FieldSearchType == "LIKE" {
  157. condition += fmt.Sprintf(`
  158. db = db.Where("%s LIKE ?", "%%"+ *info.%s+"%%")
  159. }`,
  160. field.ColumnName, field.FieldName)
  161. } else {
  162. condition += fmt.Sprintf(`
  163. db = db.Where("%s %s ?", *info.%s)
  164. }`,
  165. field.ColumnName, field.FieldSearchType, field.FieldName)
  166. }
  167. }
  168. conditions = append(conditions, condition)
  169. }
  170. return strings.Join(conditions, "")
  171. }
  172. // 格式化前端搜索条件
  173. func GenerateSearchFormItem(field systemReq.AutoCodeField) string {
  174. // 开始构建表单项
  175. result := fmt.Sprintf(`<el-form-item label="%s" prop="%s">
  176. `, field.FieldDesc, field.FieldJson)
  177. // 根据字段属性生成不同的输入类型
  178. if field.FieldType == "bool" {
  179. result += fmt.Sprintf(` <el-select v-model="searchInfo.%s" clearable placeholder="请选择">
  180. `, field.FieldJson)
  181. result += ` <el-option key="true" label="是" value="true"></el-option>
  182. `
  183. result += ` <el-option key="false" label="否" value="false"></el-option>
  184. `
  185. result += ` </el-select>
  186. `
  187. } else if field.DictType != "" {
  188. multipleAttr := ""
  189. if field.FieldType == "array" {
  190. multipleAttr = "multiple "
  191. }
  192. result += fmt.Sprintf(` <el-select %sv-model="searchInfo.%s" clearable filterable placeholder="请选择" @clear="()=>{searchInfo.%s=undefined}">
  193. `,
  194. multipleAttr, field.FieldJson, field.FieldJson)
  195. result += fmt.Sprintf(` <el-option v-for="(item,key) in %sOptions" :key="key" :label="item.label" :value="item.value" />
  196. `,
  197. field.DictType)
  198. result += ` </el-select>
  199. `
  200. } else if field.CheckDataSource {
  201. multipleAttr := ""
  202. if field.DataSource.Association == 2 {
  203. multipleAttr = "multiple "
  204. }
  205. result += fmt.Sprintf(` <el-select %sv-model="searchInfo.%s" filterable placeholder="请选择%s" :clearable="%v">
  206. `,
  207. multipleAttr, field.FieldJson, field.FieldDesc, field.Clearable)
  208. result += fmt.Sprintf(` <el-option v-for="(item,key) in dataSource.%s" :key="key" :label="item.label" :value="item.value" />
  209. `,
  210. field.FieldJson)
  211. result += ` </el-select>
  212. `
  213. } else if field.FieldType == "float64" || field.FieldType == "int" {
  214. if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" {
  215. result += fmt.Sprintf(` <el-input class="!w-40" v-model.number="searchInfo.start%s" placeholder="最小值" />
  216. `, field.FieldName)
  217. result += ` —
  218. `
  219. result += fmt.Sprintf(` <el-input class="!w-40" v-model.number="searchInfo.end%s" placeholder="最大值" />
  220. `, field.FieldName)
  221. } else {
  222. result += fmt.Sprintf(` <el-input v-model.number="searchInfo.%s" placeholder="搜索条件" />
  223. `, field.FieldJson)
  224. }
  225. } else if field.FieldType == "time.Time" {
  226. if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" {
  227. result += ` <template #label>
  228. `
  229. result += ` <span>
  230. `
  231. result += fmt.Sprintf(` %s
  232. `, field.FieldDesc)
  233. result += ` <el-tooltip content="搜索范围是开始日期(包含)至结束日期(不包含)">
  234. `
  235. result += ` <el-icon><QuestionFilled /></el-icon>
  236. `
  237. result += ` </el-tooltip>
  238. `
  239. result += ` </span>
  240. `
  241. result += ` </template>
  242. `
  243. result += fmt.Sprintf(`<el-date-picker class="!w-380px" v-model="searchInfo.%sRange" type="datetimerange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间"></el-date-picker>`, field.FieldJson)
  244. } else {
  245. result += fmt.Sprintf(`<el-date-picker v-model="searchInfo.%s" type="datetime" placeholder="搜索条件"></el-date-picker>`, field.FieldJson)
  246. }
  247. } else {
  248. result += fmt.Sprintf(` <el-input v-model="searchInfo.%s" placeholder="搜索条件" />
  249. `, field.FieldJson)
  250. }
  251. // 关闭表单项
  252. result += `</el-form-item>`
  253. return result
  254. }
  255. // GenerateTableColumn generates HTML for table column based on field properties
  256. func GenerateTableColumn(field systemReq.AutoCodeField) string {
  257. // Add sortable attribute if needed
  258. sortAttr := ""
  259. if field.Sort {
  260. sortAttr = " sortable"
  261. }
  262. // Handle different field types
  263. if field.CheckDataSource {
  264. result := fmt.Sprintf(`<el-table-column%s align="left" label="%s" prop="%s" width="120">
  265. `,
  266. sortAttr, field.FieldDesc, field.FieldJson)
  267. result += ` <template #default="scope">
  268. `
  269. if field.DataSource.Association == 2 {
  270. result += fmt.Sprintf(` <el-tag v-for="(item,key) in filterDataSource(dataSource.%s,scope.row.%s)" :key="key">
  271. `,
  272. field.FieldJson, field.FieldJson)
  273. result += ` {{ item }}
  274. `
  275. result += ` </el-tag>
  276. `
  277. } else {
  278. result += fmt.Sprintf(` <span>{{ filterDataSource(dataSource.%s,scope.row.%s) }}</span>
  279. `,
  280. field.FieldJson, field.FieldJson)
  281. }
  282. result += ` </template>
  283. `
  284. result += `</el-table-column>`
  285. return result
  286. } else if field.DictType != "" {
  287. result := fmt.Sprintf(`<el-table-column%s align="left" label="%s" prop="%s" width="120">
  288. `,
  289. sortAttr, field.FieldDesc, field.FieldJson)
  290. result += ` <template #default="scope">
  291. `
  292. if field.FieldType == "array" {
  293. result += fmt.Sprintf(` <el-tag class="mr-1" v-for="item in scope.row.%s" :key="item"> {{ filterDict(item,%sOptions) }}</el-tag>
  294. `,
  295. field.FieldJson, field.DictType)
  296. } else {
  297. result += fmt.Sprintf(` {{ filterDict(scope.row.%s,%sOptions) }}
  298. `,
  299. field.FieldJson, field.DictType)
  300. }
  301. result += ` </template>
  302. `
  303. result += `</el-table-column>`
  304. return result
  305. } else if field.FieldType == "bool" {
  306. result := fmt.Sprintf(`<el-table-column%s align="left" label="%s" prop="%s" width="120">
  307. `,
  308. sortAttr, field.FieldDesc, field.FieldJson)
  309. result += fmt.Sprintf(` <template #default="scope">{{ formatBoolean(scope.row.%s) }}</template>
  310. `, field.FieldJson)
  311. result += `</el-table-column>`
  312. return result
  313. } else if field.FieldType == "time.Time" {
  314. result := fmt.Sprintf(`<el-table-column%s align="left" label="%s" prop="%s" width="180">
  315. `,
  316. sortAttr, field.FieldDesc, field.FieldJson)
  317. result += fmt.Sprintf(` <template #default="scope">{{ formatDate(scope.row.%s) }}</template>
  318. `, field.FieldJson)
  319. result += `</el-table-column>`
  320. return result
  321. } else if field.FieldType == "picture" {
  322. result := fmt.Sprintf(`<el-table-column label="%s" prop="%s" width="200">
  323. `, field.FieldDesc, field.FieldJson)
  324. result += ` <template #default="scope">
  325. `
  326. result += fmt.Sprintf(` <el-image preview-teleported style="width: 100px; height: 100px" :src="getUrl(scope.row.%s)" fit="cover"/>
  327. `, field.FieldJson)
  328. result += ` </template>
  329. `
  330. result += `</el-table-column>`
  331. return result
  332. } else if field.FieldType == "pictures" {
  333. result := fmt.Sprintf(`<el-table-column label="%s" prop="%s" width="200">
  334. `, field.FieldDesc, field.FieldJson)
  335. result += ` <template #default="scope">
  336. `
  337. result += ` <div class="multiple-img-box">
  338. `
  339. result += fmt.Sprintf(` <el-image preview-teleported v-for="(item,index) in scope.row.%s" :key="index" style="width: 80px; height: 80px" :src="getUrl(item)" fit="cover"/>
  340. `, field.FieldJson)
  341. result += ` </div>
  342. `
  343. result += ` </template>
  344. `
  345. result += `</el-table-column>`
  346. return result
  347. } else if field.FieldType == "video" {
  348. result := fmt.Sprintf(`<el-table-column label="%s" prop="%s" width="200">
  349. `, field.FieldDesc, field.FieldJson)
  350. result += ` <template #default="scope">
  351. `
  352. result += ` <video
  353. `
  354. result += ` style="width: 100px; height: 100px"
  355. `
  356. result += ` muted
  357. `
  358. result += ` preload="metadata"
  359. `
  360. result += ` >
  361. `
  362. result += fmt.Sprintf(` <source :src="getUrl(scope.row.%s) + '#t=1'">
  363. `, field.FieldJson)
  364. result += ` </video>
  365. `
  366. result += ` </template>
  367. `
  368. result += `</el-table-column>`
  369. return result
  370. } else if field.FieldType == "richtext" {
  371. result := fmt.Sprintf(`<el-table-column label="%s" prop="%s" width="200">
  372. `, field.FieldDesc, field.FieldJson)
  373. result += ` <template #default="scope">
  374. `
  375. result += ` [富文本内容]
  376. `
  377. result += ` </template>
  378. `
  379. result += `</el-table-column>`
  380. return result
  381. } else if field.FieldType == "file" {
  382. result := fmt.Sprintf(`<el-table-column label="%s" prop="%s" width="200">
  383. `, field.FieldDesc, field.FieldJson)
  384. result += ` <template #default="scope">
  385. `
  386. result += ` <div class="file-list">
  387. `
  388. result += fmt.Sprintf(` <el-tag v-for="file in scope.row.%s" :key="file.uid" @click="onDownloadFile(file.url)">{{ file.name }}</el-tag>
  389. `, field.FieldJson)
  390. result += ` </div>
  391. `
  392. result += ` </template>
  393. `
  394. result += `</el-table-column>`
  395. return result
  396. } else if field.FieldType == "json" {
  397. result := fmt.Sprintf(`<el-table-column label="%s" prop="%s" width="200">
  398. `, field.FieldDesc, field.FieldJson)
  399. result += ` <template #default="scope">
  400. `
  401. result += ` [JSON]
  402. `
  403. result += ` </template>
  404. `
  405. result += `</el-table-column>`
  406. return result
  407. } else if field.FieldType == "array" {
  408. result := fmt.Sprintf(`<el-table-column label="%s" prop="%s" width="200">
  409. `, field.FieldDesc, field.FieldJson)
  410. result += ` <template #default="scope">
  411. `
  412. result += fmt.Sprintf(` <ArrayCtrl v-model="scope.row.%s"/>
  413. `, field.FieldJson)
  414. result += ` </template>
  415. `
  416. result += `</el-table-column>`
  417. return result
  418. } else {
  419. return fmt.Sprintf(`<el-table-column%s align="left" label="%s" prop="%s" width="120" />
  420. `,
  421. sortAttr, field.FieldDesc, field.FieldJson)
  422. }
  423. }
  424. func GenerateFormItem(field systemReq.AutoCodeField) string {
  425. // 开始构建表单项
  426. result := fmt.Sprintf(`<el-form-item label="%s:" prop="%s">
  427. `, field.FieldDesc, field.FieldJson)
  428. // 处理不同字段类型
  429. if field.CheckDataSource {
  430. multipleAttr := ""
  431. if field.DataSource.Association == 2 {
  432. multipleAttr = " multiple"
  433. }
  434. result += fmt.Sprintf(` <el-select%s v-model="formData.%s" placeholder="请选择%s" filterable style="width:100%%" :clearable="%v">
  435. `,
  436. multipleAttr, field.FieldJson, field.FieldDesc, field.Clearable)
  437. result += fmt.Sprintf(` <el-option v-for="(item,key) in dataSource.%s" :key="key" :label="item.label" :value="item.value" />
  438. `,
  439. field.FieldJson)
  440. result += ` </el-select>
  441. `
  442. } else {
  443. switch field.FieldType {
  444. case "bool":
  445. result += fmt.Sprintf(` <el-switch v-model="formData.%s" active-color="#13ce66" inactive-color="#ff4949" active-text="是" inactive-text="否" clearable ></el-switch>
  446. `,
  447. field.FieldJson)
  448. case "string":
  449. if field.DictType != "" {
  450. result += fmt.Sprintf(` <el-select v-model="formData.%s" placeholder="请选择%s" style="width:100%%" filterable :clearable="%v">
  451. `,
  452. field.FieldJson, field.FieldDesc, field.Clearable)
  453. result += fmt.Sprintf(` <el-option v-for="(item,key) in %sOptions" :key="key" :label="item.label" :value="item.value" />
  454. `,
  455. field.DictType)
  456. result += ` </el-select>
  457. `
  458. } else {
  459. result += fmt.Sprintf(` <el-input v-model="formData.%s" :clearable="%v" placeholder="请输入%s" />
  460. `,
  461. field.FieldJson, field.Clearable, field.FieldDesc)
  462. }
  463. case "richtext":
  464. result += fmt.Sprintf(` <RichEdit v-model="formData.%s"/>
  465. `, field.FieldJson)
  466. case "json":
  467. result += fmt.Sprintf(` // 此字段为json结构,可以前端自行控制展示和数据绑定模式 需绑定json的key为 formData.%s 后端会按照json的类型进行存取
  468. `, field.FieldJson)
  469. result += fmt.Sprintf(` {{ formData.%s }}
  470. `, field.FieldJson)
  471. case "array":
  472. if field.DictType != "" {
  473. result += fmt.Sprintf(` <el-select multiple v-model="formData.%s" placeholder="请选择%s" filterable style="width:100%%" :clearable="%v">
  474. `,
  475. field.FieldJson, field.FieldDesc, field.Clearable)
  476. result += fmt.Sprintf(` <el-option v-for="(item,key) in %sOptions" :key="key" :label="item.label" :value="item.value" />
  477. `,
  478. field.DictType)
  479. result += ` </el-select>
  480. `
  481. } else {
  482. result += fmt.Sprintf(` <ArrayCtrl v-model="formData.%s" editable/>
  483. `, field.FieldJson)
  484. }
  485. case "int":
  486. result += fmt.Sprintf(` <el-input v-model.number="formData.%s" :clearable="%v" placeholder="请输入%s" />
  487. `,
  488. field.FieldJson, field.Clearable, field.FieldDesc)
  489. case "time.Time":
  490. result += fmt.Sprintf(` <el-date-picker v-model="formData.%s" type="date" style="width:100%%" placeholder="选择日期" :clearable="%v" />
  491. `,
  492. field.FieldJson, field.Clearable)
  493. case "float64":
  494. result += fmt.Sprintf(` <el-input-number v-model="formData.%s" style="width:100%%" :precision="2" :clearable="%v" />
  495. `,
  496. field.FieldJson, field.Clearable)
  497. case "enum":
  498. result += fmt.Sprintf(` <el-select v-model="formData.%s" placeholder="请选择%s" style="width:100%%" filterable :clearable="%v">
  499. `,
  500. field.FieldJson, field.FieldDesc, field.Clearable)
  501. result += fmt.Sprintf(` <el-option v-for="item in [%s]" :key="item" :label="item" :value="item" />
  502. `,
  503. field.DataTypeLong)
  504. result += ` </el-select>
  505. `
  506. case "picture":
  507. result += fmt.Sprintf(` <SelectImage
  508. v-model="formData.%s"
  509. file-type="image"
  510. />
  511. `, field.FieldJson)
  512. case "pictures":
  513. result += fmt.Sprintf(` <SelectImage
  514. multiple
  515. v-model="formData.%s"
  516. file-type="image"
  517. />
  518. `, field.FieldJson)
  519. case "video":
  520. result += fmt.Sprintf(` <SelectImage
  521. v-model="formData.%s"
  522. file-type="video"
  523. />
  524. `, field.FieldJson)
  525. case "file":
  526. result += fmt.Sprintf(` <SelectFile v-model="formData.%s" />
  527. `, field.FieldJson)
  528. }
  529. }
  530. // 关闭表单项
  531. result += `</el-form-item>`
  532. return result
  533. }
  534. func GenerateDescriptionItem(field systemReq.AutoCodeField) string {
  535. // 开始构建描述项
  536. result := fmt.Sprintf(`<el-descriptions-item label="%s">
  537. `, field.FieldDesc)
  538. if field.CheckDataSource {
  539. result += ` <template #default="scope">
  540. `
  541. if field.DataSource.Association == 2 {
  542. result += fmt.Sprintf(` <el-tag v-for="(item,key) in filterDataSource(dataSource.%s,detailForm.%s)" :key="key">
  543. `,
  544. field.FieldJson, field.FieldJson)
  545. result += ` {{ item }}
  546. `
  547. result += ` </el-tag>
  548. `
  549. } else {
  550. result += fmt.Sprintf(` <span>{{ filterDataSource(dataSource.%s,detailForm.%s) }}</span>
  551. `,
  552. field.FieldJson, field.FieldJson)
  553. }
  554. result += ` </template>
  555. `
  556. } else if field.FieldType != "picture" && field.FieldType != "pictures" &&
  557. field.FieldType != "file" && field.FieldType != "array" &&
  558. field.FieldType != "richtext" {
  559. result += fmt.Sprintf(` {{ detailForm.%s }}
  560. `, field.FieldJson)
  561. } else {
  562. switch field.FieldType {
  563. case "picture":
  564. result += fmt.Sprintf(` <el-image style="width: 50px; height: 50px" :preview-src-list="returnArrImg(detailForm.%s)" :src="getUrl(detailForm.%s)" fit="cover" />
  565. `,
  566. field.FieldJson, field.FieldJson)
  567. case "array":
  568. result += fmt.Sprintf(` <ArrayCtrl v-model="detailForm.%s"/>
  569. `, field.FieldJson)
  570. case "pictures":
  571. result += fmt.Sprintf(` <el-image style="width: 50px; height: 50px; margin-right: 10px" :preview-src-list="returnArrImg(detailForm.%s)" :initial-index="index" v-for="(item,index) in detailForm.%s" :key="index" :src="getUrl(item)" fit="cover" />
  572. `,
  573. field.FieldJson, field.FieldJson)
  574. case "richtext":
  575. result += fmt.Sprintf(` <RichView v-model="detailForm.%s" />
  576. `, field.FieldJson)
  577. case "file":
  578. result += fmt.Sprintf(` <div class="fileBtn" v-for="(item,index) in detailForm.%s" :key="index">
  579. `, field.FieldJson)
  580. result += ` <el-button type="primary" text bg @click="onDownloadFile(item.url)">
  581. `
  582. result += ` <el-icon style="margin-right: 5px"><Download /></el-icon>
  583. `
  584. result += ` {{ item.name }}
  585. `
  586. result += ` </el-button>
  587. `
  588. result += ` </div>
  589. `
  590. }
  591. }
  592. // 关闭描述项
  593. result += `</el-descriptions-item>`
  594. return result
  595. }
  596. func GenerateDefaultFormValue(field systemReq.AutoCodeField) string {
  597. // 根据字段类型确定默认值
  598. var defaultValue string
  599. switch field.FieldType {
  600. case "bool":
  601. defaultValue = "false"
  602. case "string", "richtext":
  603. defaultValue = "''"
  604. case "int":
  605. if field.DataSource != nil { // 检查数据源是否存在
  606. defaultValue = "undefined"
  607. } else {
  608. defaultValue = "0"
  609. }
  610. case "time.Time":
  611. defaultValue = "new Date()"
  612. case "float64":
  613. defaultValue = "0"
  614. case "picture", "video":
  615. defaultValue = "\"\""
  616. case "pictures", "file", "array":
  617. defaultValue = "[]"
  618. case "json":
  619. defaultValue = "{}"
  620. default:
  621. defaultValue = "null"
  622. }
  623. // 返回格式化后的默认值字符串
  624. return fmt.Sprintf(`%s: %s,`, field.FieldJson, defaultValue)
  625. }
  626. // GenerateSearchField 根据字段属性生成搜索结构体中的字段定义
  627. func GenerateSearchField(field systemReq.AutoCodeField) string {
  628. var result string
  629. if field.FieldSearchType == "" {
  630. return "" // 如果没有搜索类型,返回空字符串
  631. }
  632. if field.FieldSearchType == "BETWEEN" || field.FieldSearchType == "NOT BETWEEN" {
  633. // 生成范围搜索字段
  634. // time 的情况
  635. if field.FieldType == "time.Time" {
  636. result = fmt.Sprintf("%sRange []time.Time `json:\"%sRange\" form:\"%sRange[]\"`",
  637. field.FieldName, field.FieldJson, field.FieldJson)
  638. } else {
  639. startField := fmt.Sprintf("Start%s *%s `json:\"start%s\" form:\"start%s\"`",
  640. field.FieldName, field.FieldType, field.FieldName, field.FieldName)
  641. endField := fmt.Sprintf("End%s *%s `json:\"end%s\" form:\"end%s\"`",
  642. field.FieldName, field.FieldType, field.FieldName, field.FieldName)
  643. result = startField + "\n" + endField
  644. }
  645. } else {
  646. // 生成普通搜索字段
  647. if field.FieldType == "enum" || field.FieldType == "picture" ||
  648. field.FieldType == "pictures" || field.FieldType == "video" ||
  649. field.FieldType == "json" || field.FieldType == "richtext" || field.FieldType == "array" {
  650. result = fmt.Sprintf("%s string `json:\"%s\" form:\"%s\"` ",
  651. field.FieldName, field.FieldJson, field.FieldJson)
  652. } else {
  653. result = fmt.Sprintf("%s *%s `json:\"%s\" form:\"%s\"` ",
  654. field.FieldName, field.FieldType, field.FieldJson, field.FieldJson)
  655. }
  656. }
  657. return result
  658. }