MysqlCreateVue.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  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. view := MysqlToVueView(gTable, gTable.GenTableColumn)
  107. WriteFile("E:\\project\\kkc\\go-xorm-create\\file\\"+gTable.GenTable.Name+"View.vue", view)
  108. }
  109. }
  110. func MysqlToVueView(table GTable, columns []GenTableColumn) string {
  111. vueContent := "<template>" +
  112. "\n <div class=\"back-form-container\">" +
  113. "\n <div class=\"back-table-handler\">" +
  114. "\n <el-row :gutter=\"10\" class=\"mb8\">" +
  115. "\n <el-col :span=\"1.5\">" +
  116. "\n <el-button" +
  117. "\n type=\"primary\"" +
  118. "\n plain size=\"small\"" +
  119. "\n @click=\"getList(pageNum)\">" +
  120. "\n <el-icon>" +
  121. "\n <RefreshLeft/>" +
  122. "\n </el-icon>" +
  123. "\n <span>刷新</span>" +
  124. "\n </el-button>" +
  125. "\n </el-col>" +
  126. "\n <el-col :span=\"1.5\">" +
  127. "\n <el-button" +
  128. "\n type=\"primary\"" +
  129. "\n plain size=\"small\"" +
  130. "\n @click=\"openDialog('save', " + table.GenTable.Name + ".Create())\">" +
  131. "\n <el-icon>" +
  132. "\n <Plus/>" +
  133. "\n </el-icon>" +
  134. "\n <span>新增</span>" +
  135. "\n </el-button>" +
  136. "\n </el-col>" +
  137. "\n <el-col :span=\"1.5\">" +
  138. "\n <el-button" +
  139. "\n type=\"danger\"" +
  140. "\n plain size=\"small\"" +
  141. "\n @click=\"deleteByIds()\">" +
  142. "\n <el-icon>" +
  143. "\n <Delete/>" +
  144. "\n </el-icon>" +
  145. "\n <span>删除</span>" +
  146. "\n </el-button>" +
  147. "\n </el-col>" +
  148. "\n </el-row>" +
  149. "\n </div>"
  150. //========================================表格部分内容
  151. {
  152. vueContent += "\n <div class=\"back-table\">" +
  153. "\n <el-table v-loading=\"listLoading\" :data=\"list\" @selection-change=\"selected\" border>" +
  154. "\n <el-table-column type=\"selection\" width=\"40\" align=\"center\"/>"
  155. //数组排序
  156. sort.SliceStable(columns, func(i, j int) bool {
  157. return columns[i].Sort < columns[j].Sort
  158. })
  159. for _, column := range columns {
  160. _, value := FormatName(column.ColumnName)
  161. name := column.ColumnComment
  162. if name == "" {
  163. name = value
  164. }
  165. if column.IsKey == "1" {
  166. vueContent += elTableColumn(name, value, column.VueShowType, column.DictType)
  167. } else {
  168. vueContent += elTableColumn(name, value, column.VueShowType, column.DictType)
  169. }
  170. }
  171. vueContent += "\n <el-table-column label=\"操作\" align=\"center\" fixed=\"right\">" +
  172. "\n <template #default=\"scope\">" +
  173. "\n <el-button link type=\"primary\" @click=\"openDialog('update',scope.row)\">修改</el-button>" +
  174. "\n <el-button link type=\"danger\" @click=\"deleteById(scope.row.id)\">删除</el-button>" +
  175. "\n </template>" +
  176. "\n </el-table-column>" +
  177. "\n </el-table>" +
  178. "\n <div class=\"pagination-container\">" +
  179. "\n <el-pagination" +
  180. "\n background" +
  181. "\n :current-page=\"pageNum\"" +
  182. "\n @current-change=\"getList\"" +
  183. "\n :page-size=\"pageSize\"" +
  184. "\n :page-sizes=\"[10, 20, 30, 50,100]\"" +
  185. "\n :total=\"total\"" +
  186. "\n @size-change=\"SetPageSized\"" +
  187. "\n layout=\"total, sizes, prev, pager, next\"" +
  188. "\n />" +
  189. "\n </div>"
  190. }
  191. //===========================================form表单修改
  192. {
  193. vueContent += "\n <!-- 添加或修改参数配置对话框 -->" +
  194. "\n <el-dialog :title=\"dialogType=='update'?'更改字典类型':'新增字典类型'\" v-model=\"open\" width=\"500px\"" +
  195. "\n append-to-body>" +
  196. "\n <el-form ref=\"dictRef\" :model=\"dialogForm\" label-width=\"80px\"><!--:rules=\"rules\"-->"
  197. for _, column := range columns {
  198. _, value := FormatName(column.ColumnName)
  199. if strings.ToLower(value) == "id" {
  200. continue
  201. }
  202. name := column.ColumnComment
  203. if name == "" {
  204. name = value
  205. }
  206. vueContent += elDialog(name, value, column.VueShowType, column.DictType)
  207. }
  208. vueContent += "\n </el-form>" +
  209. "\n <template #footer>" +
  210. "\n <div class=\"dialog-footer\">" +
  211. "\n <el-button type=\"primary\" @click=\"submitForm()\">确 定</el-button>" +
  212. "\n <el-button @click=\"open=false\">取 消</el-button>" +
  213. "\n </div>" +
  214. "\n </template>" +
  215. "\n </el-dialog>" +
  216. "\n </div>" +
  217. "\n </div>" +
  218. "\n</template>" +
  219. "\n" +
  220. // =============================js代码部分
  221. "\n<script setup lang=\"ts\">" +
  222. "\nimport {ref} from \"vue\";" +
  223. "\nimport {" +
  224. "\n DeleteBase" + table.GenTable.Name + "ById," +
  225. "\n " + table.GenTable.Name + "," +
  226. "\n GetBase" + table.GenTable.Name + "ListBy" + table.GenTable.Name + "," +
  227. "\n SaveBase" + table.GenTable.Name + "," +
  228. "\n UpdateBase" + table.GenTable.Name + "" +
  229. "\n} from \"../../../api/back/BaseBackApi.ts\";" +
  230. "\nimport {ElMessage} from \"element-plus\";" +
  231. "\nimport {Delete, Plus, RefreshLeft} from \"@element-plus/icons-vue\";" +
  232. "\nimport router from \"../../../router\";" +
  233. "\nimport {store} from \"../../../state/TokenState.ts\";" +
  234. "\n" +
  235. "\nlet listLoading = ref(true)" +
  236. "\n" +
  237. "\nlet total = ref(0)" +
  238. "\nlet pageNum = ref(1)" +
  239. "\nlet pageSize = ref(10)" +
  240. "\n" +
  241. "\nlet list = ref<" + table.GenTable.Name + "[]>([])" +
  242. "\n//搜索用" +
  243. "\nlet search = ref<" + table.GenTable.Name + ">(" + table.GenTable.Name + ".Create())" +
  244. "\n//修改,添加用" +
  245. "\nlet open = ref(false)" +
  246. "\nlet dialogType = ref(\"\")//save添加,update修改" +
  247. "\nlet dialogForm = ref<" + table.GenTable.Name + ">(null)" +
  248. "\n" +
  249. "\nlet selectItems = ref<" + table.GenTable.Name + "[]>([])" +
  250. "\nconst selected = (arr: " + table.GenTable.Name + "[]) => {" +
  251. "\n selectItems.value = arr" +
  252. "\n}" +
  253. "\n" +
  254. "\ngetList()" +
  255. "\nconst SetPageSized = (val: number) => {" +
  256. "\n pageSize.value = val" +
  257. "\n getList(pageNum.value)" +
  258. "\n}" +
  259. "\n" +
  260. "\nfunction openDialog(type: string, row: " + table.GenTable.Name + ") {" +
  261. "\n open.value = true" +
  262. "\n dialogType.value = type" +
  263. "\n //深拷贝,不会影响数据" +
  264. "\n dialogForm.value = JSON.parse(JSON.stringify(row))" +
  265. "\n" +
  266. "\n}" +
  267. "\n" +
  268. "\nfunction deleteByIds() {" +
  269. "\n for (let i = 0; i < selectItems.value.length; i++) {" +
  270. "\n deleteById(selectItems[i].id)" +
  271. "\n }" +
  272. "\n}" +
  273. "\n" +
  274. "\nfunction deleteById(id) {" +
  275. "\n DeleteBase" + table.GenTable.Name + "ById(id).then(response => {" +
  276. "\n if (response.code == 200) {" +
  277. "\n ElMessage.success(\"删除成功,id:\" + id)" +
  278. "\n getList()" +
  279. "\n } else {" +
  280. "\n ElMessage.error(\"删除失败,id:\" + id)" +
  281. "\n }" +
  282. "\n })" +
  283. "\n}" +
  284. "\n" +
  285. "\nfunction getList(pn = 1) {" +
  286. "\n pageNum.value = pn" +
  287. "\n GetBase" + table.GenTable.Name + "ListBy" + table.GenTable.Name + "(search.value, pageNum.value, pageSize.value).then(response => {" +
  288. "\n let data = response.data" +
  289. "\n total.value = data.total" +
  290. "\n list.value = response.data.list" +
  291. "\n listLoading.value = false" +
  292. "\n })" +
  293. "\n}" +
  294. "\n" +
  295. "\nfunction submitForm() {" +
  296. "\n switch (dialogType.value) {" +
  297. "\n case \"update\":" +
  298. "\n UpdateBase" + table.GenTable.Name + "(dialogForm.value, dialogForm.value.id).then(response => {" +
  299. "\n if (response.code == 200) {" +
  300. "\n open.value = false" +
  301. "\n getList()" +
  302. "\n ElMessage.success(\"修改成功\")" +
  303. "\n } else {" +
  304. "\n ElMessage.error(\"修改失败\")" +
  305. "\n }" +
  306. "\n })" +
  307. "\n break" +
  308. "\n case \"save\":" +
  309. "\n SaveBase" + table.GenTable.Name + "(dialogForm.value).then(response => {" +
  310. "\n if (response.code == 200) {" +
  311. "\n open.value = false" +
  312. "\n getList()" +
  313. "\n ElMessage.success(\"添加成功\")" +
  314. "\n } else {" +
  315. "\n ElMessage.error(\"添加失败\")" +
  316. "\n }" +
  317. "\n })" +
  318. "\n break" +
  319. "\n default:" +
  320. "\n break" +
  321. "\n }" +
  322. "\n}" +
  323. "\n</script>"
  324. }
  325. return vueContent
  326. }
  327. // 输入框 input
  328. // 文本域 textarea
  329. // 下拉框 Select
  330. // 复选框 Checkbox
  331. // 单选框 Radio
  332. // 时间选择 Time
  333. // 图片上传 Image
  334. // 文件上传 File
  335. // 富文本 Editor
  336. func elTableColumn(name, value, typeName string, dictType string) string {
  337. if typeName == "input" || typeName == "textarea" || typeName == "select" || typeName == "radio" || typeName == "checkbox" || typeName == "time" {
  338. if dictType == "" {
  339. return "\n <el-table-column label=\"" + name + "\" align=\"center\" prop=\"" + value + "\"/>"
  340. } else {
  341. return "\n <el-table-column label=\"" + name + "\" align=\"center\" prop=\"" + value + "\">" +
  342. "\n <template #default=\"scope\">" +
  343. "\n <DictTag :dict-type=\"'" + dictType + "'\" :dict-value=\"scope.row." + value + "\"/>" +
  344. "\n </template>" +
  345. "\n </el-table-column>"
  346. }
  347. }
  348. if typeName == "image" {
  349. return "\n <el-table-column label=\"" + name + "\" align=\"center\" prop=\"" + value + "\">" +
  350. "\n <template #default=\"scope\">" +
  351. "\n <el-image src=" + value + "></el-image>" +
  352. "\n </template>" +
  353. "\n </el-table-column>"
  354. }
  355. return ""
  356. }
  357. func elDialog(name, value, typeName, dictType string) string {
  358. typeName = strings.ToLower(typeName)
  359. if typeName == "input" {
  360. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  361. "\n <el-input v-model=\"dialogForm." + value + "\" placeholder=\"请输入" + name + "\"/>" +
  362. "\n </el-form-item>"
  363. } else if typeName == "number" {
  364. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  365. "\n <el-input-number v-model=\"dialogForm." + value + "\" placeholder=\"请输入" + name + "\"/>" +
  366. "\n </el-form-item>"
  367. } else if typeName == "textarea" {
  368. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  369. "\n <el-input v-model=\"dialogForm." + value + "\" placeholder=\"请输入" + name + "\" type=\"textarea\"/>" +
  370. "\n </el-form-item>"
  371. } else if typeName == "select" {
  372. return "" +
  373. "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  374. "\n <el-select v-model=\"dialogForm." + value + "\" placeholder=\"请选择" + name + "\">" +
  375. "\n <el-option" +
  376. "\n v-for=\"item in store.state.dicts.get('" + dictType + "')\"" +
  377. "\n :key=\"item.dictValue\"" +
  378. "\n :label=\"item.dictLabel\"" +
  379. "\n :value=\"item.dictValue\"/>" +
  380. "\n </el-select>" +
  381. "\n </el-form-item>"
  382. } else if typeName == "radio" {
  383. if dictType == "" {
  384. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  385. " <el-radio-group v-model=\"dialogForm." + value + "\">" +
  386. "\n <el-radio" +
  387. "\n v-for=\"item in [['0','否'], ['1','是']]\"" +
  388. "\n :key=\"item[0]\"" +
  389. "\n :label=\"item[0]\">" +
  390. "\n {{ item[1] }}" +
  391. "\n </el-radio>" +
  392. "\n </el-radio-group>" +
  393. "\n </el-form-item>"
  394. } else {
  395. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  396. "\n <el-radio-group v-model=\"dialogForm." + value + "\">" +
  397. "\n <el-radio" +
  398. "\n v-for=\"item in store.state.dicts.get(" + dictType + ")\"" +
  399. "\n :key=\"item.dictValue\"" +
  400. "\n :label=\"item.dictLabel\">" +
  401. "\n {{item.dictLabel}}" +
  402. "\n </el-radio>" +
  403. "\n </el-radio-group>" +
  404. "\n </el-form-item>"
  405. }
  406. } else if typeName == "checkbox" {
  407. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  408. "\n <el-checkbox-group v-model=\"dialogForm." + value + "\">" +
  409. "\n <el-checkbox :label=\"item.dictLabel\" :value=\"item.dictValue\" v-for=\"item in store.state.dicts.get('" + dictType + "')\"/>" +
  410. "\n </el-checkbox-group>" +
  411. "\n </el-form-item>"
  412. } else if typeName == "time" {
  413. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  414. " <el-date-picker v-model=\"dialogForm." + value + "\" type=\"datetime\" placeholder=\"请选择时间\"\n/>" +
  415. "\n </el-form-item>"
  416. } else if typeName == "image" {
  417. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  418. " <ImageUpload v-model:ImgUrl=\"dialogForm." + value + "\"/>" +
  419. "\n </el-form-item>"
  420. } else if typeName == "file" {
  421. } else if typeName == "editor" {
  422. return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
  423. " <EditorComponent v-model:htmlString=\"dialogForm." + value + "\"/>" +
  424. "\n </el-form-item>"
  425. }
  426. return ""
  427. }