| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440 |
- package util
- import (
- "sort"
- "strings"
- )
- // 修改mysql数据库对应的go类型
- func formatSqlToVueType(str string) string {
- str = strings.ToLower(str)
- switch str {
- case "varchar":
- return "string"
- case "char":
- return "string"
- case "int":
- return "number"
- case "decimal":
- return "number"
- case "datetime":
- return "string"
- case "longblob":
- return "string"
- default:
- panic("未定义的类型:" + str)
- }
- }
- func MysqlToVueApi() {
- vueFileContent := "import api, {ResponseData} from \"../api.ts\";" +
- "\nimport {BaseListVo} from \"../detail/DetailApi.ts\";\n\n"
- var objectList = ""
- var apiList = ""
- //生成结构体
- for i := range MTables {
- table := MTables[i]
- //添加名字
- objectList += "export class " + table.GreatHump + "{"
- ct := "\n\tstatic Create(){\n return new " + table.GreatHump + "("
- for j := range table.MColumns {
- column := table.MColumns[j]
- objectList += "\n\t" + column.LittleHump + ": " + column.VueTypeName
- ct += "null,"
- //switch column.VueTypeName {
- //case "number":
- // ct += "0,"
- // break
- //case "string":
- // ct += "\"\","
- //}
- }
- objectList += ct + ");\n }"
- objectList += "\n\n\tconstructor("
- for j := range table.MColumns {
- column := table.MColumns[j]
- objectList += column.LittleHump + ": " + column.VueTypeName + ", "
- }
- objectList += ") {"
- for j := range table.MColumns {
- column := table.MColumns[j]
- objectList += "\n\t\tthis." + column.LittleHump + " = " + column.LittleHump + ";"
- }
- objectList += "\n\t}\n}\n\n"
- //生成api
- apiList += "export function GetBase" + table.GreatHump + "ById(id: number | string) {" +
- "\n return api.GetDataByPath(\"/back/base/" + table.LittleHump + "?id=\" + id, {}, true) as Promise<ResponseData<" + table.GreatHump + ">>;" +
- "\n}" +
- "\n" +
- //"\nexport function GetBase" + table.GreatHump + "ListBy" + table.GreatHump + "(" + table.GreatHump + ": " + table.GreatHump + ", pageNum = 1, pageSize = 10) {" +
- "\nexport function GetBase" + table.GreatHump + "ListBy" + table.GreatHump + "(param: " + table.GreatHump + ", pageNum = 1, pageSize = 10) {" +
- "\n return api.PostDataByPath(\"/back/base/" + table.LittleHump + "/list\", {param: param,pageNum: pageNum,pageSize: pageSize}, true) as Promise<ResponseData<BaseListVo<" + table.GreatHump + ">>>;" +
- "\n}" +
- "\n" +
- "\nexport function GetBase" + table.GreatHump + "ListByIds(ids: number[] | string[]) {" +
- "\n return api.PostDataByPath(\"/back/base/" + table.LittleHump + "/in\", {" +
- "\n ids: ids" +
- "\n }, true) as Promise<ResponseData<" + table.GreatHump + "[]>>;" +
- "\n}" +
- "\n" +
- "\nexport function SaveBase" + table.GreatHump + "(" + table.GreatHump + ": " + table.GreatHump + ") {" +
- "\n return api.PostDataByPath(\"/back/base/" + table.LittleHump + "\", {" + table.LittleHump + ": " + table.GreatHump + "}, true) as Promise<ResponseData<" + table.GreatHump + ">>;" +
- "\n}" +
- "\n" +
- "\nexport function UpdateBase" + table.GreatHump + "(" + table.GreatHump + ": " + table.GreatHump + ", id: number | string) {" +
- "\n return api.PutDataByPath(\"/back/base/" + table.LittleHump + "\", {" + table.LittleHump + ": " + table.GreatHump + ", id: id}, true) as Promise<ResponseData<" + table.GreatHump + ">>;" +
- "\n}" +
- "\n" +
- "\nexport function DeleteBase" + table.GreatHump + "ById(id: number | string) {" +
- "\n return api.DeleteDataByPath(\"/back/base/" + table.LittleHump + "?id=\" + id, {}, true) as Promise<ResponseData<any>>;" +
- "\n}\n\n"
- }
- //url := "D:\\project\\study\\kkc\\kkc-shop\\src\\api\\back\\BaseBackApi.ts"
- WriteFile(GetVueApiUrl(), vueFileContent+apiList+objectList)
- }
- // MysqlToVueView 生成vue的view表单
- // 查询类型,搁置
- // 输入框 input
- // 文本域 textarea
- // 下拉框 Select
- // 复选框 Checkbox
- // 单选框 Radio
- // 时间选择 Time
- // 图片上传 image
- // 文件上传 File
- // 富文本 Editor
- func CreateVue() {
- //sql表格名
- for _, gTable := range GTables {
- view := MysqlToVueView(gTable, gTable.GenTableColumn)
- WriteFile("E:\\project\\kkc\\go-xorm-create\\file\\"+gTable.GenTable.Name+"View.vue", view)
- }
- }
- func MysqlToVueView(table GTable, columns []GenTableColumn) string {
- vueContent := "<template>" +
- "\n <div class=\"back-form-container\">" +
- "\n <div class=\"back-table-handler\">" +
- "\n <el-row :gutter=\"10\" class=\"mb8\">" +
- "\n <el-col :span=\"1.5\">" +
- "\n <el-button" +
- "\n type=\"primary\"" +
- "\n plain size=\"small\"" +
- "\n @click=\"getList(pageNum)\">" +
- "\n <el-icon>" +
- "\n <RefreshLeft/>" +
- "\n </el-icon>" +
- "\n <span>刷新</span>" +
- "\n </el-button>" +
- "\n </el-col>" +
- "\n <el-col :span=\"1.5\">" +
- "\n <el-button" +
- "\n type=\"primary\"" +
- "\n plain size=\"small\"" +
- "\n @click=\"openDialog('save', " + table.GenTable.Name + ".Create())\">" +
- "\n <el-icon>" +
- "\n <Plus/>" +
- "\n </el-icon>" +
- "\n <span>新增</span>" +
- "\n </el-button>" +
- "\n </el-col>" +
- "\n <el-col :span=\"1.5\">" +
- "\n <el-button" +
- "\n type=\"danger\"" +
- "\n plain size=\"small\"" +
- "\n @click=\"deleteByIds()\">" +
- "\n <el-icon>" +
- "\n <Delete/>" +
- "\n </el-icon>" +
- "\n <span>删除</span>" +
- "\n </el-button>" +
- "\n </el-col>" +
- "\n </el-row>" +
- "\n </div>"
- //========================================表格部分内容
- {
- vueContent += "\n <div class=\"back-table\">" +
- "\n <el-table v-loading=\"listLoading\" :data=\"list\" @selection-change=\"selected\" border>" +
- "\n <el-table-column type=\"selection\" width=\"40\" align=\"center\"/>"
- //数组排序
- sort.SliceStable(columns, func(i, j int) bool {
- return columns[i].Sort < columns[j].Sort
- })
- for _, column := range columns {
- _, value := FormatName(column.ColumnName)
- name := column.ColumnComment
- if name == "" {
- name = value
- }
- if column.IsKey == "1" {
- vueContent += elTableColumn(name, value, column.VueShowType, column.DictType)
- } else {
- vueContent += elTableColumn(name, value, column.VueShowType, column.DictType)
- }
- }
- vueContent += "\n <el-table-column label=\"操作\" align=\"center\" fixed=\"right\">" +
- "\n <template #default=\"scope\">" +
- "\n <el-button link type=\"primary\" @click=\"openDialog('update',scope.row)\">修改</el-button>" +
- "\n <el-button link type=\"danger\" @click=\"deleteById(scope.row.id)\">删除</el-button>" +
- "\n </template>" +
- "\n </el-table-column>" +
- "\n </el-table>" +
- "\n <div class=\"pagination-container\">" +
- "\n <el-pagination" +
- "\n background" +
- "\n :current-page=\"pageNum\"" +
- "\n @current-change=\"getList\"" +
- "\n :page-size=\"pageSize\"" +
- "\n :page-sizes=\"[10, 20, 30, 50,100]\"" +
- "\n :total=\"total\"" +
- "\n @size-change=\"SetPageSized\"" +
- "\n layout=\"total, sizes, prev, pager, next\"" +
- "\n />" +
- "\n </div>"
- }
- //===========================================form表单修改
- {
- vueContent += "\n <!-- 添加或修改参数配置对话框 -->" +
- "\n <el-dialog :title=\"dialogType=='update'?'更改字典类型':'新增字典类型'\" v-model=\"open\" width=\"500px\"" +
- "\n append-to-body>" +
- "\n <el-form ref=\"dictRef\" :model=\"dialogForm\" label-width=\"80px\"><!--:rules=\"rules\"-->"
- for _, column := range columns {
- _, value := FormatName(column.ColumnName)
- if strings.ToLower(value) == "id" {
- continue
- }
- name := column.ColumnComment
- if name == "" {
- name = value
- }
- vueContent += elDialog(name, value, column.VueShowType, column.DictType)
- }
- vueContent += "\n </el-form>" +
- "\n <template #footer>" +
- "\n <div class=\"dialog-footer\">" +
- "\n <el-button type=\"primary\" @click=\"submitForm()\">确 定</el-button>" +
- "\n <el-button @click=\"open=false\">取 消</el-button>" +
- "\n </div>" +
- "\n </template>" +
- "\n </el-dialog>" +
- "\n </div>" +
- "\n </div>" +
- "\n</template>" +
- "\n" +
- // =============================js代码部分
- "\n<script setup lang=\"ts\">" +
- "\nimport {ref} from \"vue\";" +
- "\nimport {" +
- "\n DeleteBase" + table.GenTable.Name + "ById," +
- "\n " + table.GenTable.Name + "," +
- "\n GetBase" + table.GenTable.Name + "ListBy" + table.GenTable.Name + "," +
- "\n SaveBase" + table.GenTable.Name + "," +
- "\n UpdateBase" + table.GenTable.Name + "" +
- "\n} from \"../../../api/back/BaseBackApi.ts\";" +
- "\nimport {ElMessage} from \"element-plus\";" +
- "\nimport {Delete, Plus, RefreshLeft} from \"@element-plus/icons-vue\";" +
- "\nimport router from \"../../../router\";" +
- "\nimport {store} from \"../../../state/TokenState.ts\";" +
- "\n" +
- "\nlet listLoading = ref(true)" +
- "\n" +
- "\nlet total = ref(0)" +
- "\nlet pageNum = ref(1)" +
- "\nlet pageSize = ref(10)" +
- "\n" +
- "\nlet list = ref<" + table.GenTable.Name + "[]>([])" +
- "\n//搜索用" +
- "\nlet search = ref<" + table.GenTable.Name + ">(" + table.GenTable.Name + ".Create())" +
- "\n//修改,添加用" +
- "\nlet open = ref(false)" +
- "\nlet dialogType = ref(\"\")//save添加,update修改" +
- "\nlet dialogForm = ref<" + table.GenTable.Name + ">(null)" +
- "\n" +
- "\nlet selectItems = ref<" + table.GenTable.Name + "[]>([])" +
- "\nconst selected = (arr: " + table.GenTable.Name + "[]) => {" +
- "\n selectItems.value = arr" +
- "\n}" +
- "\n" +
- "\ngetList()" +
- "\nconst SetPageSized = (val: number) => {" +
- "\n pageSize.value = val" +
- "\n getList(pageNum.value)" +
- "\n}" +
- "\n" +
- "\nfunction openDialog(type: string, row: " + table.GenTable.Name + ") {" +
- "\n open.value = true" +
- "\n dialogType.value = type" +
- "\n //深拷贝,不会影响数据" +
- "\n dialogForm.value = JSON.parse(JSON.stringify(row))" +
- "\n" +
- "\n}" +
- "\n" +
- "\nfunction deleteByIds() {" +
- "\n for (let i = 0; i < selectItems.value.length; i++) {" +
- "\n deleteById(selectItems[i].id)" +
- "\n }" +
- "\n}" +
- "\n" +
- "\nfunction deleteById(id) {" +
- "\n DeleteBase" + table.GenTable.Name + "ById(id).then(response => {" +
- "\n if (response.code == 200) {" +
- "\n ElMessage.success(\"删除成功,id:\" + id)" +
- "\n getList()" +
- "\n } else {" +
- "\n ElMessage.error(\"删除失败,id:\" + id)" +
- "\n }" +
- "\n })" +
- "\n}" +
- "\n" +
- "\nfunction getList(pn = 1) {" +
- "\n pageNum.value = pn" +
- "\n GetBase" + table.GenTable.Name + "ListBy" + table.GenTable.Name + "(search.value, pageNum.value, pageSize.value).then(response => {" +
- "\n let data = response.data" +
- "\n total.value = data.total" +
- "\n list.value = response.data.list" +
- "\n listLoading.value = false" +
- "\n })" +
- "\n}" +
- "\n" +
- "\nfunction submitForm() {" +
- "\n switch (dialogType.value) {" +
- "\n case \"update\":" +
- "\n UpdateBase" + table.GenTable.Name + "(dialogForm.value, dialogForm.value.id).then(response => {" +
- "\n if (response.code == 200) {" +
- "\n open.value = false" +
- "\n getList()" +
- "\n ElMessage.success(\"修改成功\")" +
- "\n } else {" +
- "\n ElMessage.error(\"修改失败\")" +
- "\n }" +
- "\n })" +
- "\n break" +
- "\n case \"save\":" +
- "\n SaveBase" + table.GenTable.Name + "(dialogForm.value).then(response => {" +
- "\n if (response.code == 200) {" +
- "\n open.value = false" +
- "\n getList()" +
- "\n ElMessage.success(\"添加成功\")" +
- "\n } else {" +
- "\n ElMessage.error(\"添加失败\")" +
- "\n }" +
- "\n })" +
- "\n break" +
- "\n default:" +
- "\n break" +
- "\n }" +
- "\n}" +
- "\n</script>"
- }
- return vueContent
- }
- // 输入框 input
- // 文本域 textarea
- // 下拉框 Select
- // 复选框 Checkbox
- // 单选框 Radio
- // 时间选择 Time
- // 图片上传 Image
- // 文件上传 File
- // 富文本 Editor
- func elTableColumn(name, value, typeName string, dictType string) string {
- if typeName == "input" || typeName == "textarea" || typeName == "select" || typeName == "radio" || typeName == "checkbox" || typeName == "time" {
- if dictType == "" {
- return "\n <el-table-column label=\"" + name + "\" align=\"center\" prop=\"" + value + "\"/>"
- } else {
- return "\n <el-table-column label=\"" + name + "\" align=\"center\" prop=\"" + value + "\">" +
- "\n <template #default=\"scope\">" +
- "\n <DictTag :dict-type=\"'" + dictType + "'\" :dict-value=\"scope.row." + value + "\"/>" +
- "\n </template>" +
- "\n </el-table-column>"
- }
- }
- if typeName == "image" {
- return "\n <el-table-column label=\"" + name + "\" align=\"center\" prop=\"" + value + "\">" +
- "\n <template #default=\"scope\">" +
- "\n <el-image src=" + value + "></el-image>" +
- "\n </template>" +
- "\n </el-table-column>"
- }
- return ""
- }
- func elDialog(name, value, typeName, dictType string) string {
- typeName = strings.ToLower(typeName)
- if typeName == "input" {
- return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
- "\n <el-input v-model=\"dialogForm." + value + "\" placeholder=\"请输入" + name + "\"/>" +
- "\n </el-form-item>"
- } else if typeName == "number" {
- return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
- "\n <el-input-number v-model=\"dialogForm." + value + "\" placeholder=\"请输入" + name + "\"/>" +
- "\n </el-form-item>"
- } else if typeName == "textarea" {
- return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
- "\n <el-input v-model=\"dialogForm." + value + "\" placeholder=\"请输入" + name + "\" type=\"textarea\"/>" +
- "\n </el-form-item>"
- } else if typeName == "select" {
- return "" +
- "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
- "\n <el-select v-model=\"dialogForm." + value + "\" placeholder=\"请选择" + name + "\">" +
- "\n <el-option" +
- "\n v-for=\"item in store.state.dicts.get('" + dictType + "')\"" +
- "\n :key=\"item.dictValue\"" +
- "\n :label=\"item.dictLabel\"" +
- "\n :value=\"item.dictValue\"/>" +
- "\n </el-select>" +
- "\n </el-form-item>"
- } else if typeName == "radio" {
- if dictType == "" {
- return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
- " <el-radio-group v-model=\"dialogForm." + value + "\">" +
- "\n <el-radio" +
- "\n v-for=\"item in [['0','否'], ['1','是']]\"" +
- "\n :key=\"item[0]\"" +
- "\n :label=\"item[0]\">" +
- "\n {{ item[1] }}" +
- "\n </el-radio>" +
- "\n </el-radio-group>" +
- "\n </el-form-item>"
- } else {
- return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
- "\n <el-radio-group v-model=\"dialogForm." + value + "\">" +
- "\n <el-radio" +
- "\n v-for=\"item in store.state.dicts.get(" + dictType + ")\"" +
- "\n :key=\"item.dictValue\"" +
- "\n :label=\"item.dictLabel\">" +
- "\n {{item.dictLabel}}" +
- "\n </el-radio>" +
- "\n </el-radio-group>" +
- "\n </el-form-item>"
- }
- } else if typeName == "checkbox" {
- return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
- "\n <el-checkbox-group v-model=\"dialogForm." + value + "\">" +
- "\n <el-checkbox :label=\"item.dictLabel\" :value=\"item.dictValue\" v-for=\"item in store.state.dicts.get('" + dictType + "')\"/>" +
- "\n </el-checkbox-group>" +
- "\n </el-form-item>"
- } else if typeName == "time" {
- return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
- " <el-date-picker v-model=\"dialogForm." + value + "\" type=\"datetime\" placeholder=\"请选择时间\"\n/>" +
- "\n </el-form-item>"
- } else if typeName == "image" {
- return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
- " <ImageUpload v-model:ImgUrl=\"dialogForm." + value + "\"/>" +
- "\n </el-form-item>"
- } else if typeName == "file" {
- } else if typeName == "editor" {
- return "\n <el-form-item label=\"" + name + "\" prop=\"" + value + "\">" +
- " <EditorComponent v-model:htmlString=\"dialogForm." + value + "\"/>" +
- "\n </el-form-item>"
- }
- return ""
- }
|