MysqlCreateVue.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. package util
  2. import (
  3. "sort"
  4. "strings"
  5. )
  6. // 修改mysql数据库对应的go类型
  7. func formatSqlToVueType(str string) string {
  8. str = strings.ToLower(str)
  9. switch str {
  10. case "varchar":
  11. return "string"
  12. case "char":
  13. return "string"
  14. case "int":
  15. return "number"
  16. case "decimal":
  17. return "number"
  18. case "datetime":
  19. return "string"
  20. case "longblob":
  21. return "string"
  22. default:
  23. panic("未定义的类型:" + str)
  24. }
  25. }
  26. func MysqlToVueApi() {
  27. vueFileContent := "import api, {ResponseData} from \"../api.ts\";" +
  28. "\nimport {BaseListVo} from \"../detail/DetailApi.ts\";\n\n"
  29. var objectList = ""
  30. var apiList = ""
  31. //生成结构体
  32. for i := range MTables {
  33. table := MTables[i]
  34. //添加名字
  35. objectList += "export class " + table.GreatHump + "{"
  36. ct := "\n\tstatic Create(){\n return new " + table.GreatHump + "("
  37. for j := range table.MColumns {
  38. column := table.MColumns[j]
  39. objectList += "\n\t" + column.LittleHump + ": " + column.VueTypeName
  40. ct += "null,"
  41. //switch column.VueTypeName {
  42. //case "number":
  43. // ct += "0,"
  44. // break
  45. //case "string":
  46. // ct += "\"\","
  47. //}
  48. }
  49. objectList += ct + ");\n }"
  50. objectList += "\n\n\tconstructor("
  51. for j := range table.MColumns {
  52. column := table.MColumns[j]
  53. objectList += column.LittleHump + ": " + column.VueTypeName + ", "
  54. }
  55. objectList += ") {"
  56. for j := range table.MColumns {
  57. column := table.MColumns[j]
  58. objectList += "\n\t\tthis." + column.LittleHump + " = " + column.LittleHump + ";"
  59. }
  60. objectList += "\n\t}\n}\n\n"
  61. //生成api
  62. apiList += "export function GetBase" + table.GreatHump + "ById(id: number | string) {" +
  63. "\n return api.GetDataByPath(\"/back/base/" + table.LittleHump + "?id=\" + id, {}, true) as Promise<ResponseData<" + table.GreatHump + ">>;" +
  64. "\n}" +
  65. "\n" +
  66. //"\nexport function GetBase" + table.GreatHump + "ListBy" + table.GreatHump + "(" + table.GreatHump + ": " + table.GreatHump + ", pageNum = 1, pageSize = 10) {" +
  67. "\nexport function GetBase" + table.GreatHump + "ListBy" + table.GreatHump + "(param: " + table.GreatHump + ", pageNum = 1, pageSize = 10) {" +
  68. "\n return api.PostDataByPath(\"/back/base/" + table.LittleHump + "/list\", {param: param,pageNum: pageNum,pageSize: pageSize}, true) as Promise<ResponseData<BaseListVo<" + table.GreatHump + ">>>;" +
  69. "\n}" +
  70. "\n" +
  71. "\nexport function GetBase" + table.GreatHump + "ListByIds(ids: number[] | string[]) {" +
  72. "\n return api.PostDataByPath(\"/back/base/" + table.LittleHump + "/in\", {" +
  73. "\n ids: ids" +
  74. "\n }, true) as Promise<ResponseData<" + table.GreatHump + "[]>>;" +
  75. "\n}" +
  76. "\n" +
  77. "\nexport function SaveBase" + table.GreatHump + "(" + table.GreatHump + ": " + table.GreatHump + ") {" +
  78. "\n return api.PostDataByPath(\"/back/base/" + table.LittleHump + "\", {" + table.LittleHump + ": " + table.GreatHump + "}, true) as Promise<ResponseData<" + table.GreatHump + ">>;" +
  79. "\n}" +
  80. "\n" +
  81. "\nexport function UpdateBase" + table.GreatHump + "(" + table.GreatHump + ": " + table.GreatHump + ", id: number | string) {" +
  82. "\n return api.PutDataByPath(\"/back/base/" + table.LittleHump + "\", {" + table.LittleHump + ": " + table.GreatHump + ", id: id}, true) as Promise<ResponseData<" + table.GreatHump + ">>;" +
  83. "\n}" +
  84. "\n" +
  85. "\nexport function DeleteBase" + table.GreatHump + "ById(id: number | string) {" +
  86. "\n return api.DeleteDataByPath(\"/back/base/" + table.LittleHump + "?id=\" + id, {}, true) as Promise<ResponseData<any>>;" +
  87. "\n}\n\n"
  88. }
  89. //url := "D:\\project\\study\\kkc\\kkc-shop\\src\\api\\back\\BaseBackApi.ts"
  90. WriteFile(GetVueApiUrl(), vueFileContent+apiList+objectList)
  91. }
  92. // MysqlToVueView 生成vue的view表单
  93. // 查询类型,搁置
  94. // 输入框 input
  95. // 文本域 textarea
  96. // 下拉框 Select
  97. // 复选框 Checkbox
  98. // 单选框 Radio
  99. // 时间选择 Time
  100. // 图片上传 image
  101. // 文件上传 File
  102. // 富文本 Editor
  103. func CreateVue() {
  104. //sql表格名
  105. for _, gTable := range GTables {
  106. //跳过 一些表
  107. if gTable.GenTable.Name == "DictData" ||
  108. gTable.GenTable.Name == "DictType" ||
  109. gTable.GenTable.Name == "GenTableColumn" ||
  110. gTable.GenTable.Name == "GenTable" {
  111. continue
  112. }
  113. view := MysqlToVueView(gTable, gTable.GenTableColumn)
  114. WriteFile(ProjectGoCreateUrl+"file\\"+gTable.GenTable.Name+"View.vue", view)
  115. }
  116. }
  117. func MysqlToVueView(table GTable, columns []GenTableColumn) string {
  118. vueContent := "<template>" +
  119. "\n <div class=\"back-form-container\">" +
  120. "\n <div class=\"back-table-handler\">" +
  121. "\n <el-row :gutter=\"10\" class=\"mb8\">" +
  122. "\n <el-col :span=\"1.5\">" +
  123. "\n <el-button" +
  124. "\n type=\"primary\"" +
  125. "\n plain size=\"small\"" +
  126. "\n @click=\"getList(pageNum)\">" +
  127. "\n <el-icon>" +
  128. "\n <RefreshLeft/>" +
  129. "\n </el-icon>" +
  130. "\n <span>刷新</span>" +
  131. "\n </el-button>" +
  132. "\n </el-col>" +
  133. "\n <el-col :span=\"1.5\">" +
  134. "\n <el-button" +
  135. "\n type=\"primary\"" +
  136. "\n plain size=\"small\"" +
  137. "\n @click=\"openDialog('save', " + table.GenTable.Name + ".Create())\">" +
  138. "\n <el-icon>" +
  139. "\n <Plus/>" +
  140. "\n </el-icon>" +
  141. "\n <span>新增</span>" +
  142. "\n </el-button>" +
  143. "\n </el-col>" +
  144. "\n <el-col :span=\"1.5\">" +
  145. "\n <el-button" +
  146. "\n type=\"danger\"" +
  147. "\n plain size=\"small\"" +
  148. "\n @click=\"deleteByIds()\">" +
  149. "\n <el-icon>" +
  150. "\n <Delete/>" +
  151. "\n </el-icon>" +
  152. "\n <span>删除</span>" +
  153. "\n </el-button>" +
  154. "\n </el-col>" +
  155. "\n </el-row>" +
  156. "\n </div>"
  157. //========================================表格部分内容
  158. {
  159. vueContent += "\n <div class=\"back-table\">" +
  160. "\n <el-table v-loading=\"listLoading\" :data=\"list\" @selection-change=\"selected\" border :key=\"ListKey\">" +
  161. "\n <el-table-column type=\"selection\" width=\"40\" align=\"center\"/>"
  162. //数组排序
  163. sort.SliceStable(columns, func(i, j int) bool {
  164. return columns[i].Sort < columns[j].Sort
  165. })
  166. for _, column := range columns {
  167. _, value := FormatName(column.ColumnName)
  168. name := column.ColumnComment
  169. if name == "" {
  170. name = value
  171. }
  172. if column.IsKey == "1" {
  173. vueContent += elTableColumn(name, value, column.VueShowType, column.DictType)
  174. } else {
  175. vueContent += elTableColumn(name, value, column.VueShowType, column.DictType)
  176. }
  177. }
  178. vueContent += "\n <el-table-column label=\"操作\" align=\"center\" fixed=\"right\">" +
  179. "\n <template #default=\"scope\">" +
  180. "\n <el-button link type=\"primary\" @click=\"openDialog('update',scope.row)\">修改</el-button>" +
  181. "\n <el-button link type=\"danger\" @click=\"deleteById(scope.row.id)\">删除</el-button>" +
  182. "\n </template>" +
  183. "\n </el-table-column>" +
  184. "\n </el-table>" +
  185. "\n <div class=\"pagination-container\">" +
  186. "\n <el-pagination" +
  187. "\n background" +
  188. "\n :current-page=\"pageNum\"" +
  189. "\n @current-change=\"getList\"" +
  190. "\n :page-size=\"pageSize\"" +
  191. "\n :page-sizes=\"[10, 20, 30, 50,100]\"" +
  192. "\n :total=\"total\"" +
  193. "\n @size-change=\"SetPageSized\"" +
  194. "\n layout=\"total, sizes, prev, pager, next\"" +
  195. "\n />" +
  196. "\n </div>"
  197. }
  198. //===========================================form表单修改
  199. {
  200. vueContent += "\n <!-- 添加或修改参数配置对话框 -->" +
  201. "\n <el-dialog :title=\"dialogType=='update'?'更改字典类型':'新增字典类型'\" v-model=\"open\" width=\"500px\"" +
  202. "\n append-to-body>" +
  203. "\n <el-form ref=\"dictRef\" :model=\"dialogForm\" label-width=\"80px\"><!--:rules=\"rules\"-->"
  204. for _, column := range columns {
  205. _, value := FormatName(column.ColumnName)
  206. if strings.ToLower(value) == "id" {
  207. continue
  208. }
  209. name := column.ColumnComment
  210. if name == "" {
  211. name = value
  212. }
  213. vueContent += elDialog(name, value, column.VueShowType, column.DictType)
  214. }
  215. vueContent += "\n </el-form>" +
  216. "\n <template #footer>" +
  217. "\n <div class=\"dialog-footer\">" +
  218. "\n <el-button type=\"primary\" @click=\"submitForm()\">确 定</el-button>" +
  219. "\n <el-button @click=\"open=false\">取 消</el-button>" +
  220. "\n </div>" +
  221. "\n </template>" +
  222. "\n </el-dialog>" +
  223. "\n </div>" +
  224. "\n </div>" +
  225. "\n</template>" +
  226. "\n" +
  227. // =============================js代码部分
  228. "\n<script setup lang=\"ts\">" +
  229. "\nimport {ref} from \"vue\";" +
  230. "\nimport {" +
  231. "\n DeleteBase" + table.GenTable.Name + "ById," +
  232. "\n " + table.GenTable.Name + "," +
  233. "\n GetBase" + table.GenTable.Name + "ListBy" + table.GenTable.Name + "," +
  234. "\n SaveBase" + table.GenTable.Name + "," +
  235. "\n UpdateBase" + table.GenTable.Name + "" +
  236. "\n} from \"../../../api/back/BaseBackApi.ts\";" +
  237. "\nimport {ElMessage} from \"element-plus\";" +
  238. "\nimport {Delete, Plus, RefreshLeft} from \"@element-plus/icons-vue\";" +
  239. "\nimport router from \"../../../router\";" +
  240. "\nimport {store} from \"../../../state/TokenState.ts\";" +
  241. "\n" +
  242. "\nlet listLoading = ref(true)" +
  243. "\n" +
  244. "\nlet total = ref(0)" +
  245. "\nlet pageNum = ref(1)" +
  246. "\nlet pageSize = ref(10)" +
  247. "\n" +
  248. "\nlet list = ref<" + table.GenTable.Name + "[]>([])" +
  249. "\nlet ListKey = ref(0)" +
  250. "\n//搜索用" +
  251. "\nlet search = ref<" + table.GenTable.Name + ">(" + table.GenTable.Name + ".Create())" +
  252. "\n//修改,添加用" +
  253. "\nlet open = ref(false)" +
  254. "\nlet dialogType = ref(\"\")//save添加,update修改" +
  255. "\nlet dialogForm = ref<" + table.GenTable.Name + ">(null)" +
  256. "\n" +
  257. "\nlet selectItems = ref<" + table.GenTable.Name + "[]>([])" +
  258. "\nconst selected = (arr: " + table.GenTable.Name + "[]) => {" +
  259. "\n selectItems.value = arr" +
  260. "\n}" +
  261. "\n" +
  262. "\ngetList()" +
  263. "\nconst SetPageSized = (val: number) => {" +
  264. "\n pageSize.value = val" +
  265. "\n getList(pageNum.value)" +
  266. "\n}" +
  267. "\n" +
  268. "\nfunction openDialog(type: string, row: " + table.GenTable.Name + ") {" +
  269. "\n open.value = true" +
  270. "\n dialogType.value = type" +
  271. "\n\tif (type===\"save\"){" +
  272. "\n dialogForm.value = " + table.GenTable.Name + ".Create()" +
  273. "\n return" +
  274. "\n }" +
  275. "\n //深拷贝,不会影响数据" +
  276. "\n dialogForm.value = JSON.parse(JSON.stringify(row))" +
  277. "\n" +
  278. "\n}" +
  279. "\n" +
  280. "\nfunction deleteByIds() {" +
  281. "\n for (let i = 0; i < selectItems.value.length; i++) {" +
  282. "\n deleteById(selectItems[i].id)" +
  283. "\n }" +
  284. "\n}" +
  285. "\n" +
  286. "\nfunction deleteById(id) {" +
  287. "\n DeleteBase" + table.GenTable.Name + "ById(id).then(response => {" +
  288. "\n if (response.code == 200) {" +
  289. "\n ElMessage.success(\"删除成功,id:\" + id)" +
  290. "\n getList()" +
  291. "\n } else {" +
  292. "\n ElMessage.error(\"删除失败,id:\" + id)" +
  293. "\n }" +
  294. "\n })" +
  295. "\n}" +
  296. "\n" +
  297. "\nfunction getList(pn = 1) {" +
  298. "\n pageNum.value = pn" +
  299. "\n GetBase" + table.GenTable.Name + "ListBy" + table.GenTable.Name + "(search.value, pageNum.value, pageSize.value).then(response => {" +
  300. "\n let data = response.data" +
  301. "\n total.value = data.total" +
  302. "\n list.value = response.data.list" +
  303. "\n ListKey.value++" +
  304. "\n listLoading.value = false" +
  305. "\n })" +
  306. "\n}" +
  307. "\n" +
  308. "\nfunction submitForm() {" +
  309. "\n switch (dialogType.value) {" +
  310. "\n case \"update\":" +
  311. "\n UpdateBase" + table.GenTable.Name + "(dialogForm.value, dialogForm.value.id).then(response => {" +
  312. "\n if (response.code == 200) {" +
  313. "\n open.value = false" +
  314. "\n getList()" +
  315. "\n ElMessage.success(\"修改成功\")" +
  316. "\n } else {" +
  317. "\n ElMessage.error(\"修改失败\")" +
  318. "\n }" +
  319. "\n })" +
  320. "\n break" +
  321. "\n case \"save\":" +
  322. "\n SaveBase" + table.GenTable.Name + "(dialogForm.value).then(response => {" +
  323. "\n if (response.code == 200) {" +
  324. "\n open.value = false" +
  325. "\n getList()" +
  326. "\n ElMessage.success(\"添加成功\")" +
  327. "\n } else {" +
  328. "\n ElMessage.error(\"添加失败\")" +
  329. "\n }" +
  330. "\n })" +
  331. "\n break" +
  332. "\n default:" +
  333. "\n break" +
  334. "\n }" +
  335. "\n}" +
  336. "\n</script>"
  337. }
  338. return vueContent
  339. }
  340. // 输入框 input
  341. // 文本域 textarea
  342. // 下拉框 Select
  343. // 复选框 Checkbox
  344. // 单选框 Radio
  345. // 时间选择 Time
  346. // 图片上传 Image
  347. // 文件上传 File
  348. // 富文本 Editor
  349. func elTableColumn(name, value, typeName string, dictType string) string {
  350. if typeName == "input" || typeName == "textarea" || typeName == "select" || typeName == "radio" ||
  351. typeName == "checkbox" || typeName == "time" || typeName == "text" {
  352. if dictType == "" {
  353. return "\n <el-table-column label=\"" + name + "\" align=\"center\" prop=\"" + value + "\"/>"
  354. } else {
  355. return "\n <el-table-column label=\"" + name + "\" align=\"center\" prop=\"" + value + "\">" +
  356. "\n <template #default=\"scope\">" +
  357. "\n <DictTag :dict-type=\"'" + dictType + "'\" :dict-value=\"scope.row." + value + "\"/>" +
  358. "\n </template>" +
  359. "\n </el-table-column>"
  360. }
  361. }
  362. if typeName == "image" {
  363. return "\n <el-table-column label=\"" + name + "\" align=\"center\" prop=\"" + value + "\">" +
  364. "\n <template #default=\"scope\">" +
  365. "\n <el-image :src=\"scope.row." + value + "\"></el-image>" +
  366. "\n </template>" +
  367. "\n </el-table-column>"
  368. }
  369. return "\n <el-table-column label=\"" + name + "\" align=\"center\" prop=\"" + value + "\"/>"
  370. }
  371. func elDialog(name, value, typeName, dictType string) string {
  372. typeName = strings.ToLower(typeName)
  373. if typeName == "input" {
  374. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  375. "\n <el-input v-model=\"dialogForm." + value + "\" placeholder=\"请输入" + name + "\"/>" +
  376. "\n </el-form-item>"
  377. } else if typeName == "number" {
  378. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  379. "\n <el-input-number v-model=\"dialogForm." + value + "\" placeholder=\"请输入" + name + "\"/>" +
  380. "\n </el-form-item>"
  381. } else if typeName == "textarea" {
  382. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  383. "\n <el-input v-model=\"dialogForm." + value + "\" placeholder=\"请输入" + name + "\" type=\"textarea\"/>" +
  384. "\n </el-form-item>"
  385. } else if typeName == "select" {
  386. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  387. "\n <el-select v-model=\"dialogForm." + value + "\" placeholder=\"请选择" + name + "\">" +
  388. "\n <el-option" +
  389. "\n v-for=\"item in store.state.dicts.get('" + dictType + "')\"" +
  390. "\n :key=\"item.dictValue\"" +
  391. "\n :label=\"item.dictLabel\"" +
  392. "\n :value=\"item.dictValue\"/>" +
  393. "\n </el-select>" +
  394. "\n </el-form-item>"
  395. } else if typeName == "radio" {
  396. if dictType == "" {
  397. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  398. " <el-radio-group v-model=\"dialogForm." + value + "\">" +
  399. "\n <el-radio" +
  400. "\n v-for=\"item in [['0','否'], ['1','是']]\"" +
  401. "\n :key=\"item[0]\"" +
  402. "\n :label=\"item[0]\">" +
  403. "\n {{ item[1] }}" +
  404. "\n </el-radio>" +
  405. "\n </el-radio-group>" +
  406. "\n </el-form-item>"
  407. } else {
  408. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  409. "\n <el-radio-group v-model=\"dialogForm." + value + "\">" +
  410. "\n <el-radio" +
  411. "\n v-for=\"item in store.state.dicts.get(" + dictType + ")\"" +
  412. "\n :key=\"item.dictValue\"" +
  413. "\n :label=\"item.dictLabel\">" +
  414. "\n {{item.dictLabel}}" +
  415. "\n </el-radio>" +
  416. "\n </el-radio-group>" +
  417. "\n </el-form-item>"
  418. }
  419. } else if typeName == "checkbox" {
  420. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  421. "\n <el-checkbox-group v-model=\"dialogForm." + value + "\">" +
  422. "\n <el-checkbox :label=\"item.dictLabel\" :value=\"item.dictValue\" v-for=\"item in store.state.dicts.get('" + dictType + "')\"/>" +
  423. "\n </el-checkbox-group>" +
  424. "\n </el-form-item>"
  425. } else if typeName == "time" {
  426. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  427. " <el-date-picker v-model=\"dialogForm." + value + "\" type=\"datetime\" placeholder=\"请选择时间\" value-format=\"YYYY-MM-DD hh:mm:ss\"/>" +
  428. "\n </el-form-item>"
  429. } else if typeName == "image" {
  430. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  431. " <ImageUpload v-model:ImgUrl=\"dialogForm." + value + "\"/>" +
  432. "\n </el-form-item>"
  433. } else if typeName == "file" {
  434. } else if typeName == "editor" {
  435. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  436. " <EditorComponent v-model:htmlString=\"dialogForm." + value + "\"/>" +
  437. "\n </el-form-item>"
  438. } else if typeName == "text" {
  439. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  440. " <el-text class=\"mx-1\">{{dialogForm." + value + "}}</el-text>" +
  441. "\n </el-form-item>"
  442. }
  443. //默认的就显示文本
  444. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  445. " <el-text class=\"mx-1\">{{dialogForm." + value + "}}</el-text>" +
  446. "\n </el-form-item>"
  447. }