├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── _config.yml ├── conf ├── app.conf └── myconf.ini ├── controllers ├── basecontrol.go ├── commoncontrol.go ├── companycontrol.go ├── enumcontrol.go ├── enumsearchcontrol.go ├── flowcontrol.go ├── logincontrol.go └── mastercontrol.go ├── go.mod ├── go.sum ├── main.go ├── models ├── cmn_group_tbmodel.go ├── cmn_lang_tbmodel.go ├── cmn_modual_tbmodel.go ├── cmn_org_tbmodel.go ├── cmn_role_tbmodel.go ├── cmn_user_tbmodel.go ├── commonmodel.go ├── companymodel.go ├── createtreemodel.go ├── datamoveapplymodel.go ├── datasourcemodel.go ├── datasourcetablefieldchildmodel.go ├── datasourcetablefieldchildsearchmodel.go ├── datasourcetablefieldmodel.go ├── datasourcetablemodel.go ├── enummodel.go ├── enumsearchmodel.go ├── flowmodel.go ├── init.go ├── log.go ├── mongoconn.go ├── mssqlconn.go ├── mysqlconn.go ├── oracleconn.go ├── websocketclient.go └── websocketserver.go ├── mysql.sql ├── mysql_function.sql ├── postgres.sql ├── postgres_function.sql ├── routers └── router.go ├── sqlite3.sql ├── swagger ├── swagger.json └── swagger.yml ├── tests └── default_test.go └── util └── email.go /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | *.bak 3 | *.db 4 | *.db 5 | skl-go.db 6 | *.exe 7 | *.exe 8 | main.exe 9 | *.exe 10 | *.exe 11 | *.exe 12 | *.exe 13 | Dockerfile 14 | build.sh 15 | *.log 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 mikezss 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # skl-go 2 | 3 | ## Project description 4 | * Using beego to build enterprise development platform. 5 | * including login,user,user group,role,origazation,priviledge,oa engineer modules 6 | 7 | ## Features 8 | * login 9 | * user 10 | * usergroup 11 | * company 12 | * role 13 | * orginazation 14 | * priviledage 15 | * lang 16 | * enumeration 17 | * oa engineer 18 | 19 | ## Environment Support 20 | * beego 1.9.0 21 | * golang go1.9.2 22 | 23 | ## Installation 24 | * install golang by yourself 25 | * install beego by yourself 26 | * go get github.com/mikezss/skl-go 27 | 28 | 29 | ## Usage 30 | * cd %gopath%/github.com/mikezss/skl-go 31 | * go build main.go 32 | * main.exe (windows user) 33 | 34 | ## Links 35 | 36 | ## Development 37 | 38 | ## License 39 | * MIT 40 | 41 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman 2 | encoding: UTF-8 -------------------------------------------------------------------------------- /conf/app.conf: -------------------------------------------------------------------------------- 1 | appname = skl-go 2 | httpport = 8088 3 | runmode = dev 4 | autorender = false 5 | copyrequestbody = true 6 | EnableDocs = true 7 | 8 | -------------------------------------------------------------------------------- /conf/myconf.ini: -------------------------------------------------------------------------------- 1 | dbtype="mysql" 2 | mailhost="" 3 | mailhostaddress="" 4 | mailuser="1329565748@qq.com" 5 | mailpwd="" 6 | inittable="false" 7 | [sqlite3] 8 | dbname="skl-go.db" 9 | [mysql] 10 | dbname="mysqlskl8" 11 | hostname="localhost" 12 | port="3306" 13 | username="root" 14 | password="root" 15 | [postgres] 16 | dbname="pgskl6" 17 | hostname="localhost" 18 | port="5433" 19 | username="postgres" 20 | password="postgres" -------------------------------------------------------------------------------- /controllers/basecontrol.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | _ "encoding/json" 5 | "strconv" 6 | "strings" 7 | 8 | "fmt" 9 | "github.com/mikezss/skl-go/models" 10 | 11 | "github.com/astaxie/beego" 12 | "github.com/astaxie/beego/session" 13 | "github.com/beego/i18n" 14 | ) 15 | 16 | //(2)建立一个全局session mananger对象 17 | var GlobalSessions *session.Manager 18 | 19 | // Operations about Users 20 | type BASEController struct { 21 | beego.Controller 22 | i18n.Locale 23 | User models.CMN_USER_TB 24 | IsLogin bool 25 | } 26 | 27 | func init() { 28 | fmt.Println("BASEController.init()==>") 29 | var err error 30 | GlobalSessions, err = session.NewManager("memory", &session.ManagerConfig{CookieName: "gosessionid", Gclifetime: 3600}) 31 | go GlobalSessions.GC() 32 | if err != nil { 33 | fmt.Println(err) 34 | } 35 | fmt.Println("GlobalSessions:") 36 | fmt.Println(GlobalSessions) 37 | fmt.Println("BASEController.init()<==") 38 | } 39 | 40 | // Prepare implemented Prepare method for baseRouter. 41 | func (this *BASEController) Prepare() { 42 | fmt.Println("BASEController.Prepare==>") 43 | rquri := this.Ctx.Request.RequestURI 44 | fmt.Println("rquest uri==>" + rquri) 45 | if this.CruSession == nil { 46 | this.StartSession() 47 | } else { 48 | PROFILE := this.CruSession.Get("PROFILE") 49 | fmt.Println(PROFILE) 50 | if PROFILE == nil && !strings.Contains(rquri, "/login/login") { 51 | status := "expired" 52 | this.Data["json"] = map[string]string{"status": status} 53 | this.ServeJSON() 54 | return 55 | 56 | } 57 | } 58 | 59 | fmt.Println("BASEController.Prepare<==") 60 | } 61 | func (this *BASEController) getUserid() string { 62 | var p models.PROFILE 63 | pr := this.CruSession.Get("PROFILE") 64 | if pr != nil { 65 | p = pr.(models.PROFILE) 66 | return p.Userid 67 | } 68 | 69 | return "" 70 | } 71 | func stringsToJson(str string) string { 72 | rs := []rune(str) 73 | jsons := "" 74 | for _, r := range rs { 75 | rint := int(r) 76 | if rint < 128 { 77 | jsons += string(r) 78 | } else { 79 | jsons += "\\u" + strconv.FormatInt(int64(rint), 16) // json 80 | } 81 | } 82 | return jsons 83 | } 84 | func (ctl *BASEController) Outputresult(err error) { 85 | if err != nil { 86 | 87 | ctl.Data["json"] = map[string]string{"status": "false", "result": err.Error()} 88 | ctl.ServeJSON() 89 | 90 | } else { 91 | 92 | ctl.Data["json"] = map[string]string{"status": "ok"} 93 | ctl.ServeJSON() 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /controllers/commoncontrol.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | "archive/zip" 5 | "bufio" 6 | "encoding/json" 7 | 8 | "fmt" 9 | "io" 10 | "io/ioutil" 11 | "log" 12 | "os" 13 | _ "os/exec" 14 | _ "path" 15 | "path/filepath" 16 | "regexp" 17 | "github.com/mikezss/skl-go/models" 18 | "strconv" 19 | "strings" 20 | "time" 21 | 22 | "github.com/astaxie/beego" 23 | "golang.org/x/text/encoding/simplifiedchinese" 24 | "golang.org/x/text/encoding/traditionalchinese" 25 | ) 26 | 27 | // Operations about Users 28 | type COMMONController struct { 29 | //beego.Controller 30 | BASEController 31 | } 32 | 33 | // @Title createUser 34 | // @Description create users 35 | // @Param body body models.User true "body for user content" 36 | // @Success 200 {int} models.User.Id 37 | // @Failure 403 body is empty 38 | // @router / [post] 39 | 40 | func (ctl *COMMONController) GetCurrentDirectory() string { 41 | dir, err := filepath.Abs(filepath.Dir(os.Args[0])) 42 | if err != nil { 43 | log.Fatal(err) 44 | } 45 | return strings.Replace(dir, "\\", "/", -1) 46 | } 47 | 48 | //获得文件的扩展名 49 | func (ctl *COMMONController) GetExt(filename string) string { 50 | fileextarr := strings.Split(filename, ".") 51 | fileext := fileextarr[1] 52 | return fileext 53 | } 54 | func (ctl *COMMONController) GetFilename(filename string) string { 55 | fileextarr := strings.Split(filename, ".") 56 | filename1 := fileextarr[0] 57 | return filename1 58 | } 59 | func (ctl *COMMONController) Uploadfile() { 60 | var status, result, rename string 61 | rename = "true" 62 | err := ctl.Ctx.Request.ParseMultipartForm(32 << 20) 63 | if err != nil { 64 | status = "false" 65 | result = err.Error() 66 | ctl.Data["json"] = map[string]string{"status": status, "result": result} 67 | ctl.ServeJSON() 68 | return 69 | } 70 | LOCAL_FILE_DIR := ctl.Ctx.Request.FormValue("filepath") 71 | err = os.MkdirAll(LOCAL_FILE_DIR, 0777) 72 | if err != nil { 73 | status = "false" 74 | result = err.Error() 75 | ctl.Data["json"] = map[string]string{"status": status, "result": result} 76 | ctl.ServeJSON() 77 | return 78 | } 79 | rename1 := ctl.Ctx.Request.FormValue("renamefilename") 80 | if rename1 != "" { 81 | rename = rename1 82 | } 83 | log.Println(LOCAL_FILE_DIR) 84 | //file, handler, err := ctl.Ctx.Request.FormFile("filelist") 85 | //LOCAL_FILE_DIR := ctl.GetString("filepath") 86 | // f, h, err := ctl.GetFile("fileList") 87 | // defer f.Close() 88 | // if err != nil { 89 | // status = "false" 90 | // result = err.Error() 91 | // } else { 92 | // var Url string 93 | // ext := ctl.Ext(h.Filename) 94 | // fileExt := strings.TrimLeft(ext, ".") 95 | // fileSaveName := fmt.Sprintf("%s_%d%s", fileExt, time.Now().Unix(), ext) 96 | // filePath := fmt.Sprintf("%s/%s", LOCAL_FILE_DIR, fileSaveName) 97 | 98 | // err = ctl.SaveToFile("fileList", filePath) // 保存位置在 static/upload,没有文件夹要先创建 99 | // if err != nil { 100 | // status = "false" 101 | // result = err.Error() 102 | // } 103 | // Url = "/" + filePath 104 | // status = "ok" 105 | // result = Url 106 | // } 107 | // GetFiles return multi-upload files 108 | files, err := ctl.GetFiles("filelist") 109 | if err != nil { 110 | status = "false" 111 | result = err.Error() 112 | ctl.Data["json"] = map[string]string{"status": status, "result": result} 113 | ctl.ServeJSON() 114 | return 115 | } 116 | for i, _ := range files { 117 | status = "ok" 118 | if rename == "true" { 119 | filename := ctl.GetFilename(files[i].Filename) 120 | fileExt := ctl.GetExt(files[i].Filename) 121 | fileSaveName := fmt.Sprintf("%s_%d%s%s", filename, time.Now().Unix(), ".", fileExt) 122 | result = LOCAL_FILE_DIR + fileSaveName 123 | } else { 124 | result = LOCAL_FILE_DIR + files[i].Filename 125 | } 126 | //for each fileheader, get a handle to the actual file 127 | file, err := files[i].Open() 128 | defer file.Close() 129 | if err != nil { 130 | status = "false" 131 | result = err.Error() 132 | break 133 | } 134 | //create destination file making sure the path is writeable. 135 | dst, err := os.Create(result) 136 | defer dst.Close() 137 | if err != nil { 138 | status = "false" 139 | result = err.Error() 140 | break 141 | } 142 | //copy the uploaded file to the destination file 143 | _, err = io.Copy(dst, file) 144 | if err != nil { 145 | status = "false" 146 | result = err.Error() 147 | break 148 | } 149 | } 150 | 151 | ctl.Data["json"] = map[string]string{"status": status, "result": result} 152 | ctl.ServeJSON() 153 | } 154 | 155 | //文件按行读入数组 156 | func (this *COMMONController) GetFileContentAsStringLines(filepath string) ([]string, error) { 157 | 158 | result := []string{} 159 | b, err := ioutil.ReadFile(filepath) 160 | if err != nil { 161 | fmt.Println(err) 162 | return result, err 163 | } 164 | s := string(b) 165 | for _, lineStr := range strings.Split(s, "\n") { 166 | lineStr = strings.TrimSpace(lineStr) 167 | // if lineStr == "" { 168 | // continue 169 | // } 170 | result = append(result, lineStr) 171 | } 172 | fmt.Println(result) 173 | fmt.Println(len(result)) 174 | 175 | return result, nil 176 | } 177 | 178 | //文件中是否包含此字符串 179 | func (this *COMMONController) IsFileIncludestring(filePath string, includedstr string) bool { 180 | 181 | b, err := ioutil.ReadFile(filePath) 182 | if err != nil { 183 | fmt.Println(err) 184 | return false 185 | } 186 | s := string(b) 187 | return strings.Contains(s, includedstr) 188 | } 189 | 190 | //文件转换为字符串 191 | func (this *COMMONController) Readfile2string(filePath string, charset string) (s string, err1 error) { 192 | 193 | b, err := ioutil.ReadFile(filePath) 194 | if err != nil { 195 | fmt.Println(err) 196 | return "", err 197 | } 198 | switch charset { 199 | case "GBK": 200 | decodeBytes, _ := simplifiedchinese.GB18030.NewDecoder().Bytes(b) 201 | s = string(decodeBytes) 202 | case "TGBK": 203 | decodeBytes, _ := traditionalchinese.Big5.NewDecoder().Bytes(b) 204 | s = string(decodeBytes) 205 | default: 206 | s = string(b) 207 | 208 | } 209 | 210 | return s, nil 211 | } 212 | 213 | func (ctl *COMMONController) Getfilelistbyfiid() { 214 | ob := models.FIFLOW{} 215 | flist := make([]models.FILELIST, 0) 216 | beego.Debug(string(ctl.Ctx.Input.RequestBody)) 217 | err := json.Unmarshal(ctl.Ctx.Input.RequestBody, &ob) 218 | if err != nil { 219 | beego.Error(err) 220 | } 221 | fmt.Println(ob.Fiid) 222 | uri := "/static/files/" + strconv.Itoa(ob.Fiid) 223 | dirname := ctl.GetCurrentDirectory() + uri 224 | fmt.Println("DIRNAME:" + dirname) 225 | fif, err1 := ioutil.ReadDir(dirname) 226 | if err1 != nil { 227 | fmt.Println(err1) 228 | ctl.Data["json"] = map[string]string{"status": err1.Error()} 229 | ctl.ServeJSON() 230 | return 231 | } 232 | for index, fif1 := range fif { 233 | flist = append(flist, models.FILELIST{Uid: index, Name: fif1.Name(), Size: fif1.Size(), Url: uri + "/" + fif1.Name()}) 234 | } 235 | 236 | ctl.Data["json"] = flist 237 | ctl.ServeJSON() 238 | 239 | } 240 | func (ctl *COMMONController) Replacefilecontent(filepath string, fromstr string, tostr string) error { 241 | filecontent, err := ctl.Readfile2string(filepath, "utf8") 242 | if err != nil { 243 | fmt.Println(err) 244 | return err 245 | } 246 | reg := regexp.MustCompile(fromstr) 247 | resultstr := reg.ReplaceAllString(filecontent, tostr) 248 | data := []byte(resultstr) 249 | err = ioutil.WriteFile(filepath, data, 0644) 250 | if err != nil { 251 | fmt.Println(err) 252 | return err 253 | } 254 | return nil 255 | } 256 | 257 | //文件转换为字符串 258 | func (this *COMMONController) Readfilefirstline(filePath string, charset string) (s string, err1 error) { 259 | f, err := os.Open(filePath) 260 | if err != nil { 261 | panic(err) 262 | } 263 | defer f.Close() 264 | 265 | rd := bufio.NewReader(f) 266 | 267 | line, err := rd.ReadString('\n') //以'\n'为结束符读入一行 268 | if err != nil { 269 | fmt.Println(err) 270 | return "", err 271 | } 272 | fmt.Println(line) 273 | 274 | return line, nil 275 | } 276 | func (this *COMMONController) IsFDexists(filePath string) bool { 277 | f, err := os.Open(filePath) 278 | defer f.Close() 279 | if err != nil { 280 | return false 281 | } 282 | return true 283 | } 284 | func (this *COMMONController) DeCompressZip(zipfilename string, unzipdir string) (err error, unzipfilenames []string) { 285 | 286 | unzipfilenames = make([]string, 0) 287 | err = os.MkdirAll(unzipdir, 0777) //创建一个目录 288 | if err != nil { 289 | return err, nil 290 | } 291 | 292 | cf, err := zip.OpenReader(zipfilename) //读取zip文件 293 | if err != nil { 294 | fmt.Println(err) 295 | return err, nil 296 | } 297 | defer cf.Close() 298 | for _, file := range cf.File { 299 | rc, err := file.Open() 300 | if err != nil { 301 | fmt.Println(err) 302 | return err, nil 303 | } 304 | unzipfilepath := "" 305 | if strings.LastIndex(unzipdir, "/") == 0 { 306 | unzipfilepath = unzipdir + file.Name 307 | } else { 308 | unzipfilepath = unzipdir + "/" + file.Name 309 | } 310 | //unzipdir.LastIndexOf("is", 1) 311 | f, err := os.Create(unzipfilepath) 312 | if err != nil { 313 | fmt.Println(err) 314 | return err, nil 315 | } 316 | defer f.Close() 317 | _, err = io.Copy(f, rc) 318 | if err != nil { 319 | fmt.Println(err) 320 | return err, nil 321 | } 322 | unzipfilenames = append(unzipfilenames, unzipfilepath) 323 | 324 | } 325 | return nil, unzipfilenames 326 | 327 | } 328 | -------------------------------------------------------------------------------- /controllers/companycontrol.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/mikezss/skl-go/models" 6 | 7 | _ "fmt" 8 | 9 | "github.com/astaxie/beego" 10 | ) 11 | 12 | // Operations about Users 13 | type COMPANYController struct { 14 | //beego.Controller 15 | BASEController 16 | } 17 | 18 | // @Description create users 19 | // @Param body body models.User true "body for user content" 20 | // @Success 200 {int} models.User.Id 21 | // @Failure 403 body is empty 22 | // @router / [post] 23 | func (ctl *COMPANYController) Savecompany() { 24 | var status = "" 25 | ob := make([]models.COMPANY, 0) 26 | beego.Debug(string(ctl.Ctx.Input.RequestBody)) 27 | err := json.Unmarshal(ctl.Ctx.Input.RequestBody, &ob) 28 | if err != nil { 29 | beego.Error(err) 30 | } 31 | 32 | err = models.AddMultiCOMPANY(ob) 33 | 34 | if err != nil { 35 | 36 | status = "false" 37 | ctl.Data["json"] = map[string]string{"status": err.Error()} 38 | ctl.ServeJSON() 39 | 40 | } else { 41 | status = "ok" 42 | ctl.Data["json"] = map[string]string{"status": status} 43 | ctl.ServeJSON() 44 | } 45 | 46 | } 47 | 48 | // @Title createUser 49 | // @Description create users 50 | // @Param body body models.User true "body for user content" 51 | // @Success 200 {int} models.User.Id 52 | // @Failure 403 body is empty 53 | // @router / [post] 54 | func (ctl *COMPANYController) Getcompany() { 55 | ob := models.COMPANY{} 56 | 57 | beego.Debug(string(ctl.Ctx.Input.RequestBody)) 58 | err := json.Unmarshal(ctl.Ctx.Input.RequestBody, &ob) 59 | if err != nil { 60 | beego.Error(err) 61 | } 62 | 63 | var status = "" 64 | 65 | ob2, err := models.GetCOMPANY(&ob) 66 | 67 | if err != nil { 68 | 69 | status = "false" 70 | ctl.Data["json"] = map[string]string{"status": status} 71 | ctl.ServeJSON() 72 | return 73 | } else { 74 | status = "ok" 75 | ctl.Data["json"] = ob2 76 | ctl.ServeJSON() 77 | } 78 | 79 | } 80 | 81 | // @Title createUser 82 | // @Description create users 83 | // @Param body body models.User true "body for user content" 84 | // @Success 200 {int} models.User.Id 85 | // @Failure 403 body is empty 86 | // @router / [post] 87 | func (ctl *COMPANYController) Getallcompany() { 88 | //var status = "" 89 | 90 | users, err := models.GetAllCOMPANY() 91 | 92 | if err != nil { 93 | 94 | //status = "false" 95 | ctl.Data["json"] = map[string]string{"status": err.Error()} 96 | ctl.ServeJSON() 97 | return 98 | } else { 99 | //status = "ok" 100 | ctl.Data["json"] = users 101 | ctl.ServeJSON() 102 | } 103 | 104 | } 105 | 106 | // @Title createUser 107 | // @Description create users 108 | // @Param body body models.User true "body for user content" 109 | // @Success 200 {int} models.User.Id 110 | // @Failure 403 body is empty 111 | // @router / [post] 112 | func (ctl *COMPANYController) Getallcompanyoptions() { 113 | //var status = "" 114 | 115 | users, err := models.GetAllCOMPANYoptions() 116 | 117 | if err != nil { 118 | 119 | //status = "false" 120 | ctl.Data["json"] = map[string]string{"status": err.Error()} 121 | ctl.ServeJSON() 122 | return 123 | } else { 124 | //status = "ok" 125 | ctl.Data["json"] = users 126 | ctl.ServeJSON() 127 | } 128 | 129 | } 130 | func (ctl *COMPANYController) Deletecompany() { 131 | var status = "" 132 | ob := models.COMPANY{} 133 | 134 | beego.Debug(string(ctl.Ctx.Input.RequestBody)) 135 | err := json.Unmarshal(ctl.Ctx.Input.RequestBody, &ob) 136 | if err != nil { 137 | beego.Error(err) 138 | } 139 | err = models.DeleteCOMPANY(&ob) 140 | 141 | if err != nil { 142 | 143 | status = "false" 144 | ctl.Data["json"] = map[string]string{"status": err.Error()} 145 | ctl.ServeJSON() 146 | return 147 | } else { 148 | status = "ok" 149 | ctl.Data["json"] = map[string]string{"status": status} 150 | ctl.ServeJSON() 151 | } 152 | 153 | } 154 | -------------------------------------------------------------------------------- /controllers/enumcontrol.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/mikezss/skl-go/models" 6 | 7 | _ "fmt" 8 | 9 | "github.com/astaxie/beego" 10 | ) 11 | 12 | // Operations about Users 13 | type ENUMController struct { 14 | //beego.Controller 15 | BASEController 16 | } 17 | 18 | // @Title createUser 19 | // @Description create users 20 | // @Param body body models.User true "body for user content" 21 | // @Success 200 {int} models.User.Id 22 | // @Failure 403 body is empty 23 | // @router / [post] 24 | func (ctl *ENUMController) Saveenum() { 25 | var status = "" 26 | 27 | ob := models.ENUMANDITEM{} 28 | 29 | beego.Debug(string(ctl.Ctx.Input.RequestBody)) 30 | err := json.Unmarshal(ctl.Ctx.Input.RequestBody, &ob) 31 | if err != nil { 32 | beego.Error(err) 33 | } 34 | 35 | err = models.AddMultiENUM(ob.Enum, ob.Enumitem) 36 | 37 | if err != nil { 38 | 39 | status = "false" 40 | ctl.Data["json"] = map[string]string{"status": status, "result": err.Error()} 41 | ctl.ServeJSON() 42 | 43 | } else { 44 | status = "ok" 45 | ctl.Data["json"] = map[string]string{"status": status} 46 | ctl.ServeJSON() 47 | } 48 | } 49 | 50 | // @Title createUser 51 | // @Description create users 52 | // @Param body body models.User true "body for user content" 53 | // @Success 200 {int} models.User.Id 54 | // @Failure 403 body is empty 55 | // @router / [post] 56 | func (ctl *ENUMController) Getenum() { 57 | var status = "" 58 | 59 | ob, err := models.GetAllENUM() 60 | 61 | if err != nil { 62 | 63 | status = "false" 64 | ctl.Data["json"] = map[string]string{"status": status, "result": err.Error()} 65 | ctl.ServeJSON() 66 | 67 | } else { 68 | status = "ok" 69 | ctl.Data["json"] = ob 70 | ctl.ServeJSON() 71 | } 72 | } 73 | 74 | // @Title createUser 75 | // @Description create users 76 | // @Param body body models.User true "body for user content" 77 | // @Success 200 {int} models.User.Id 78 | // @Failure 403 body is empty 79 | // @router / [post] 80 | func (ctl *ENUMController) Getenumoptions() { 81 | var status = "" 82 | 83 | ob, err := models.GetAllENUMoptions() 84 | 85 | if err != nil { 86 | 87 | status = "false" 88 | ctl.Data["json"] = map[string]string{"status": status, "result": err.Error()} 89 | ctl.ServeJSON() 90 | 91 | } else { 92 | status = "ok" 93 | ctl.Data["json"] = ob 94 | ctl.ServeJSON() 95 | } 96 | } 97 | 98 | // @Title createUser 99 | // @Description create users 100 | // @Param body body models.User true "body for user content" 101 | // @Success 200 {int} models.User.Id 102 | // @Failure 403 body is empty 103 | // @router / [post] 104 | func (ctl *ENUMController) Getenumbyid() { 105 | var status = "" 106 | ob := models.ENUM{} 107 | 108 | beego.Debug(string(ctl.Ctx.Input.RequestBody)) 109 | err := json.Unmarshal(ctl.Ctx.Input.RequestBody, &ob) 110 | if err != nil { 111 | beego.Error(err) 112 | } 113 | ob2, err := models.GetENUMBYID(ob) 114 | 115 | if err != nil { 116 | 117 | status = "false" 118 | ctl.Data["json"] = map[string]string{"status": status, "result": err.Error()} 119 | ctl.ServeJSON() 120 | 121 | } else { 122 | status = "ok" 123 | ctl.Data["json"] = ob2 124 | ctl.ServeJSON() 125 | } 126 | 127 | } 128 | 129 | // @Title createUser 130 | // @Description create users 131 | // @Param body body models.User true "body for user content" 132 | // @Success 200 {int} models.User.Id 133 | // @Failure 403 body is empty 134 | // @router / [post] 135 | func (ctl *ENUMController) Getenumitem() { 136 | var status = "" 137 | ob := models.ENUM{} 138 | 139 | beego.Debug(string(ctl.Ctx.Input.RequestBody)) 140 | err := json.Unmarshal(ctl.Ctx.Input.RequestBody, &ob) 141 | if err != nil { 142 | beego.Error(err) 143 | } 144 | expenseitem, err := models.GetAllENUMITEM(ob) 145 | 146 | if err != nil { 147 | 148 | status = "false" 149 | ctl.Data["json"] = map[string]string{"status": status, "result": err.Error()} 150 | ctl.ServeJSON() 151 | 152 | } else { 153 | status = "ok" 154 | ctl.Data["json"] = expenseitem 155 | ctl.ServeJSON() 156 | } 157 | 158 | } 159 | 160 | // @Title createUser 161 | // @Description create users 162 | // @Param body body models.User true "body for user content" 163 | // @Success 200 {int} models.User.Id 164 | // @Failure 403 body is empty 165 | // @router / [post] 166 | func (ctl *ENUMController) Getenumitemoptions() { 167 | var status = "" 168 | ob := models.ENUM{} 169 | 170 | beego.Debug(string(ctl.Ctx.Input.RequestBody)) 171 | err := json.Unmarshal(ctl.Ctx.Input.RequestBody, &ob) 172 | if err != nil { 173 | beego.Error(err) 174 | } 175 | expenseitem, err := models.GetAllENUMITEMoptions(ob) 176 | 177 | if err != nil { 178 | 179 | status = "false" 180 | ctl.Data["json"] = map[string]string{"status": status, "result": err.Error()} 181 | ctl.ServeJSON() 182 | 183 | } else { 184 | status = "ok" 185 | ctl.Data["json"] = expenseitem 186 | ctl.ServeJSON() 187 | } 188 | 189 | } 190 | 191 | // @Title createUser 192 | // @Description create users 193 | // @Param body body models.User true "body for user content" 194 | // @Success 200 {int} models.User.Id 195 | // @Failure 403 body is empty 196 | // @router / [post] 197 | func (ctl *ENUMController) Deleteenumbyid() { 198 | var status = "" 199 | ob := models.ENUM{} 200 | 201 | beego.Debug(string(ctl.Ctx.Input.RequestBody)) 202 | err := json.Unmarshal(ctl.Ctx.Input.RequestBody, &ob) 203 | if err != nil { 204 | beego.Error(err) 205 | } 206 | err = models.DeleteENUM(&ob) 207 | 208 | if err != nil { 209 | 210 | status = "false" 211 | ctl.Data["json"] = map[string]string{"status": status, "result": err.Error()} 212 | ctl.ServeJSON() 213 | 214 | } else { 215 | status = "ok" 216 | ctl.Data["json"] = map[string]string{"status": status} 217 | ctl.ServeJSON() 218 | } 219 | 220 | } 221 | -------------------------------------------------------------------------------- /controllers/enumsearchcontrol.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | "encoding/json" 5 | 6 | "github.com/mikezss/skl-go/models" 7 | 8 | _ "fmt" 9 | 10 | "github.com/astaxie/beego" 11 | ) 12 | 13 | // Operations about Users 14 | type ENUMSEARCHController struct { 15 | //beego.Controller 16 | BASEController 17 | } 18 | 19 | // @Title createUser 20 | // @Description create users 21 | // @Param body body models.User true "body for user content" 22 | // @Success 200 {int} models.User.Id 23 | // @Failure 403 body is empty 24 | // @router / [post] 25 | func (ctl *ENUMSEARCHController) Getenumsearchbypageindex() { 26 | var status = "" 27 | ob := models.ENUMSEARCH{} 28 | ob2 := make([]models.ENUMSEARCHITEM, 0) 29 | 30 | beego.Debug(string(ctl.Ctx.Input.RequestBody)) 31 | err := json.Unmarshal(ctl.Ctx.Input.RequestBody, &ob) 32 | if err != nil { 33 | beego.Error(err) 34 | } 35 | ob2, err = models.Getenumsearchbypageindex(ob) 36 | 37 | if err != nil { 38 | 39 | status = "false" 40 | ctl.Data["json"] = map[string]string{"status": status, "result": err.Error()} 41 | ctl.ServeJSON() 42 | 43 | } else { 44 | status = "ok" 45 | ctl.Data["json"] = ob2 46 | ctl.ServeJSON() 47 | } 48 | } 49 | 50 | // @Title createUser 51 | // @Description create users 52 | // @Param body body models.User true "body for user content" 53 | // @Success 200 {int} models.User.Id 54 | // @Failure 403 body is empty 55 | // @router / [post] 56 | func (ctl *ENUMSEARCHController) Getenumsearchcount() { 57 | var err error 58 | fif := models.ENUMSEARCH{} 59 | 60 | beego.Debug(string(ctl.Ctx.Input.RequestBody)) 61 | err = json.Unmarshal(ctl.Ctx.Input.RequestBody, &fif) 62 | if err != nil { 63 | beego.Error(err) 64 | } 65 | ob := models.PAGE{} 66 | ob, err = models.Getenumsearchcount(fif) 67 | 68 | if err != nil { 69 | 70 | ctl.Data["json"] = map[string]string{"status": err.Error()} 71 | ctl.ServeJSON() 72 | return 73 | } else { 74 | 75 | ctl.Data["json"] = ob 76 | ctl.ServeJSON() 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /controllers/logincontrol.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | "encoding/json" 5 | _ "fmt" 6 | "github.com/mikezss/skl-go/models" 7 | "time" 8 | 9 | "github.com/astaxie/beego" 10 | ) 11 | 12 | // Operations about Users 13 | type LOGINController struct { 14 | //beego.Controller 15 | BASEController 16 | } 17 | type Userpassword struct { 18 | UserName string `json:"userName"` 19 | Password string `json:"password"` 20 | } 21 | 22 | // @Title createUser 23 | // @Description create users 24 | // @Param body body models.User true "body for user content" 25 | // @Success 200 {int} models.User.Id 26 | // @Failure 403 body is empty 27 | // @router / [post] 28 | func (ctl *LOGINController) Login() { 29 | var status = "" 30 | var ob Userpassword 31 | beego.Debug(string(ctl.Ctx.Input.RequestBody)) 32 | err := json.Unmarshal(ctl.Ctx.Input.RequestBody, &ob) 33 | if err != nil { 34 | beego.Error(err) 35 | } 36 | 37 | beego.Debug(ob.UserName) 38 | beego.Debug(ob.Password) 39 | ip := ctl.Ctx.Request.RemoteAddr 40 | companycode := "19000500" 41 | isok := models.Checklogin("19000500", ob.UserName, ob.Password) 42 | 43 | //isok = true 44 | if !isok { 45 | 46 | status = "false" 47 | ctl.Data["json"] = map[string]string{"status": status, "result": err.Error()} 48 | ctl.ServeJSON() 49 | return 50 | } else { 51 | 52 | ctl.CruSession.Set("PROFILE", models.PROFILE{Userid: ob.UserName, Username: ob.UserName, Companycode: companycode, Loginip: ip, Logintime: time.Now()}) 53 | 54 | status = "ok" 55 | ctl.Data["json"] = map[string]string{"status": status} 56 | ctl.ServeJSON() 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module skl-go 2 | 3 | go 1.13 4 | 5 | require ( 6 | github.com/Unknwon/goconfig v0.0.0-20190425194916-3dba17dd7b9e // indirect 7 | github.com/astaxie/beego v1.12.0 // indirect 8 | github.com/beego/i18n v0.0.0-20161101132742-e9308947f407 // indirect 9 | github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0 // indirect 10 | github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 // indirect 11 | github.com/gorilla/websocket v1.4.1 // indirect 12 | github.com/lib/pq v1.2.0 // indirect 13 | github.com/mattn/go-oci8 v0.0.0-20191007070605-96a3284b269c // indirect 14 | github.com/mattn/go-sqlite3 v1.11.0 // indirect 15 | github.com/mikezss/skl-go v0.0.0-20190712052048-3c09e65be8f9 // indirect 16 | github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect 17 | github.com/tealeg/xlsx v1.0.5 // indirect 18 | github.com/tidwall/gjson v1.3.2 // indirect 19 | golang.org/x/text v0.3.2 // indirect 20 | ) 21 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= 2 | github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM= 3 | github.com/Unknwon/goconfig v0.0.0-20190425194916-3dba17dd7b9e h1:ZaFHdRwv6wJQMYsg5qITIsqWRqZRvUETiq0xxrl+8fc= 4 | github.com/Unknwon/goconfig v0.0.0-20190425194916-3dba17dd7b9e/go.mod h1:wngxua9XCNjvHjDiTiV26DaKDT+0c63QR6H5hjVUUxw= 5 | github.com/astaxie/beego v1.12.0 h1:MRhVoeeye5N+Flul5PoVfD9CslfdoH+xqC/xvSQ5u2Y= 6 | github.com/astaxie/beego v1.12.0/go.mod h1:fysx+LZNZKnvh4GED/xND7jWtjCR6HzydR2Hh2Im57o= 7 | github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ= 8 | github.com/beego/i18n v0.0.0-20161101132742-e9308947f407 h1:WtJfx5HqASTQp7HfiZldnin8KQV2futplF3duGp5PGc= 9 | github.com/beego/i18n v0.0.0-20161101132742-e9308947f407/go.mod h1:KLeFCpAMq2+50NkXC8iiJxLLiiTfTqrGtKEVm+2fk7s= 10 | github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU= 11 | github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= 12 | github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= 13 | github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= 14 | github.com/couchbase/go-couchbase v0.0.0-20181122212707-3e9b6e1258bb/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U= 15 | github.com/couchbase/gomemcached v0.0.0-20181122193126-5125a94a666c/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c= 16 | github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= 17 | github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY= 18 | github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0 h1:epsH3lb7KVbXHYk7LYGN5EiE0MxcevHU85CKITJ0wUY= 19 | github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= 20 | github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= 21 | github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= 22 | github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= 23 | github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= 24 | github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= 25 | github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= 26 | github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= 27 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 28 | github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= 29 | github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= 30 | github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 31 | github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= 32 | github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= 33 | github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 34 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 35 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 36 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 37 | github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= 38 | github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= 39 | github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= 40 | github.com/mattn/go-oci8 v0.0.0-20191007070605-96a3284b269c h1:+TiwAY1LgD8AOB9ualbvIihU48uSAtIp56GTNAEq43I= 41 | github.com/mattn/go-oci8 v0.0.0-20191007070605-96a3284b269c/go.mod h1:/M9VLO+lUPmxvoOK2PfWRZ8mTtB4q1Hy9lEGijv9Nr8= 42 | github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= 43 | github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q= 44 | github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= 45 | github.com/mikezss/skl-go v0.0.0-20190712052048-3c09e65be8f9 h1:IkU4qf9Yiq+WPGJf+EZLe2f+SC4Aa2MVzJF6Ir2pv+Y= 46 | github.com/mikezss/skl-go v0.0.0-20190712052048-3c09e65be8f9/go.mod h1:AHI8xid6GHUhLtW1G+c4ppMdhRXm+WfAgAZ2dv9In4c= 47 | github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= 48 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 49 | github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo= 50 | github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg= 51 | github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= 52 | github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg= 53 | github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA= 54 | github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= 55 | github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= 56 | github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE= 57 | github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM= 58 | github.com/tidwall/gjson v1.3.2 h1:+7p3qQFaH3fOMXAJSrdZwGKcOO/lYdGS0HqGhPqDdTI= 59 | github.com/tidwall/gjson v1.3.2/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= 60 | github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= 61 | github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= 62 | github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= 63 | github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= 64 | github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= 65 | golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85 h1:et7+NAX3lLIk5qUCTA9QelBjGE/NkhzYw/mhnr0s7nI= 66 | golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 67 | golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c h1:Vj5n4GlwjmQteupaxJ9+0FNOmBrHfq7vN4btdGoDZgI= 68 | golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 69 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 70 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 71 | golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= 72 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 73 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 74 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 75 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 76 | gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= 77 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 78 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | _ "github.com/mikezss/skl-go/routers" 5 | 6 | _ "os" 7 | 8 | "github.com/astaxie/beego" 9 | "github.com/astaxie/beego/config" 10 | _ "github.com/astaxie/beego/context" 11 | "github.com/astaxie/beego/orm" 12 | "github.com/astaxie/beego/plugins/cors" 13 | "github.com/beego/i18n" 14 | _ "github.com/go-sql-driver/mysql" 15 | _ "github.com/lib/pq" 16 | _ "github.com/mattn/go-sqlite3" 17 | 18 | "fmt" 19 | "log" 20 | "github.com/mikezss/skl-go/controllers" 21 | "github.com/mikezss/skl-go/models" 22 | "strings" 23 | ) 24 | 25 | func main() { 26 | if beego.BConfig.RunMode == "dev" { 27 | beego.BConfig.WebConfig.DirectoryIndex = true 28 | beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger" 29 | } 30 | beego.AddFuncMap("Calculate", models.Calculate) 31 | beego.AddFuncMap("Unescaped", models.Unescaped) 32 | beego.AddFuncMap("Unescapedjs", models.Unescapedjs) 33 | beego.AddFuncMap("UnescapedJSStr", models.UnescapedJSStr) 34 | beego.AddFuncMap("Tofirstupper", models.Tofirstupper) 35 | beego.AddFuncMap("Tolower", models.Tolower) 36 | beego.AddFuncMap("Replace", models.Replace) 37 | beego.AddFuncMap("Toupper", models.Toupper) 38 | beego.AddFuncMap("Mod", models.Mod) 39 | beego.AddFuncMap("OutputFN", models.OutputFN) 40 | 41 | beego.Run() 42 | } 43 | func init() { 44 | dbtype := registerDB() 45 | createTable(dbtype) 46 | 47 | orm.Debug = true 48 | 49 | //静态文件处理 50 | beego.SetStaticPath("/static", "static") 51 | beego.SetStaticPath("/file", "file") 52 | //beego.SetViewsPath("/views") 53 | /*CORP,增加一个跨域的header:*/ 54 | //context.NewOutput().Header("Access-Control-Allow-Origin", "*") 55 | // beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{ 56 | // AllowOrigins: []string{"http://*"}, 57 | // AllowMethods: []string{"PUT", "PATCH"}, 58 | // AllowHeaders: []string{"Origin"}, 59 | // ExposeHeaders: []string{"Content-Length"}, 60 | // AllowCredentials: true, 61 | // })) 62 | beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{ 63 | AllowAllOrigins: true, 64 | AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, 65 | AllowHeaders: []string{"Origin", "Authorization", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type"}, 66 | ExposeHeaders: []string{"Content-Length", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type"}, 67 | AllowCredentials: true, 68 | })) 69 | //settingLocales() 70 | beego.AddFuncMap("i18n", i18n.Tr) 71 | beego.BConfig.WebConfig.Session.SessionOn = true 72 | beego.BConfig.WebConfig.Session.SessionGCMaxLifetime = 3600 73 | 74 | } 75 | func registerDB() string { 76 | iniconf, err := config.NewConfig("ini", "conf/myconf.ini") 77 | if err != nil { 78 | log.Fatal(err) 79 | } 80 | dbtype := iniconf.String("dbtype") 81 | fmt.Println("dbtype:-->" + dbtype) 82 | datasourcename := "" 83 | ds := make([]string, 0) 84 | switch dbtype { 85 | case "sqlite3": 86 | //oa.db 87 | 88 | datasourcename = iniconf.String(dbtype + "::dbname") 89 | 90 | orm.RegisterDriver(dbtype, orm.DRSqlite) 91 | 92 | case "mysql": 93 | 94 | ds = append(ds, iniconf.String(dbtype+"::username")+":") 95 | ds = append(ds, iniconf.String(dbtype+"::password")+"@tcp(") 96 | ds = append(ds, iniconf.String(dbtype+"::hostname")+":") 97 | ds = append(ds, iniconf.String(dbtype+"::port")+")/") 98 | ds = append(ds, iniconf.String(dbtype+"::dbname")+"?charset=utf8&loc=Asia%2FShanghai&parseTime=true") 99 | 100 | datasourcename = strings.Join(ds, "") 101 | fmt.Println(datasourcename) 102 | //datasourcename:-->root:root@tcp(localhost:3306)/skl-ticket?charset=utf8 103 | //tcp:localhost:3306*mydb/root/rootroot 104 | orm.RegisterDriver("mysql", orm.DRMySQL) 105 | 106 | case "postgres": 107 | //tcp:localhost:5432*mydb/postgres/postgres 108 | 109 | ds = append(ds, "user=") 110 | ds = append(ds, iniconf.String(dbtype+"::username")+" ") 111 | ds = append(ds, "password=") 112 | ds = append(ds, iniconf.String(dbtype+"::password")+" ") 113 | ds = append(ds, "dbname=") 114 | ds = append(ds, iniconf.String(dbtype+"::dbname")+" ") 115 | ds = append(ds, "host=") 116 | ds = append(ds, iniconf.String(dbtype+"::hostname")+" ") 117 | ds = append(ds, "port=") 118 | ds = append(ds, iniconf.String(dbtype+"::port")+" ") 119 | ds = append(ds, "sslmode=disable") 120 | 121 | datasourcename = strings.Join(ds, "") 122 | fmt.Println(datasourcename) 123 | orm.RegisterDriver(dbtype, orm.DRPostgres) 124 | 125 | } 126 | fmt.Println("datasourcename:-->" + datasourcename) 127 | orm.RegisterDataBase("default", dbtype, datasourcename) 128 | //orm.RegisterDataBase("default", driverName, dataSource, maxIdle, maxOpen) 129 | return "default" 130 | } 131 | 132 | //自动建表 133 | func createTable(dbtype string) { 134 | name := dbtype //数据库别名 135 | force := false //不强制建数据库 136 | verbose := true //打印建表过程 137 | err := orm.RunSyncdb(name, force, verbose) //建表 138 | if err != nil { 139 | beego.Error(err) 140 | } 141 | iniconf, err := config.NewConfig("ini", "conf/myconf.ini") 142 | if err != nil { 143 | log.Fatal(err) 144 | } 145 | dbtype2 := iniconf.String("dbtype") 146 | fmt.Println("dbtype:-->" + dbtype2) 147 | 148 | inittable := iniconf.String("inittable") 149 | fmt.Println("inittable:-->" + inittable) 150 | 151 | if inittable == "true" { 152 | initTable(dbtype2) 153 | } 154 | 155 | } 156 | 157 | // 158 | func initTable(dbtype string) { 159 | cctl := &controllers.COMMONController{} 160 | filepath := cctl.GetCurrentDirectory() + "/" + dbtype + ".sql" 161 | s, err := cctl.Readfile2string(filepath, "GBK") 162 | if err != nil { 163 | fmt.Println(err) 164 | return 165 | } 166 | fmt.Println(s) 167 | sqlarr := strings.Split(s, ";") 168 | o := orm.NewOrm() 169 | //err = o.Begin() 170 | 171 | for _, sql := range sqlarr { 172 | fmt.Println(sql) 173 | _, err = o.Raw(sql).Exec() 174 | 175 | if err != nil { 176 | fmt.Println(err) 177 | //o.Rollback() 178 | continue 179 | } 180 | } 181 | //o.Commit() 182 | } 183 | func startWebsocketServer() { 184 | ws := models.NewWebsocketServer() 185 | go ws.Run() 186 | } 187 | -------------------------------------------------------------------------------- /models/cmn_group_tbmodel.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "errors" 5 | "fmt" 6 | _ "strconv" 7 | "time" 8 | 9 | "github.com/astaxie/beego/orm" 10 | ) 11 | 12 | //Adminid int64 `orm:"pk;auto"` //主键,自动增长 13 | //Remark string `orm:"size(5000)"` 14 | //Created time.Time `orm:"index"` 15 | 16 | type CMN_GROUP_TB struct { 17 | Groupid string `orm:"pk;column(groupid)"` 18 | Parentid string `orm:"column(parentid)"` 19 | Groupname string `orm:"column(groupname)"` 20 | Grouplevel string `orm:"column(grouplevel)"` 21 | Remark string `orm:"column(remark);null"` 22 | } 23 | type CMN_GROUPROLE_TB struct { 24 | Groupid string 25 | Roleid string 26 | } 27 | type group struct { 28 | Groupid string 29 | } 30 | type Parentgroupid struct { 31 | Groupid string `json:"Parentid"` 32 | Groupname string `json:"Parentname"` 33 | } 34 | 35 | func (u *CMN_GROUP_TB) TableName() string { 36 | return "cmn_group_tb" 37 | } 38 | 39 | type CMN_USERGROUP_TB struct { 40 | Userid string 41 | Groupid string 42 | Expiredtime time.Time 43 | Username string 44 | Groupname string 45 | } 46 | 47 | func AddMultiCMN_GROUPROLE_TB(groupid string, u []CMN_GROUPROLE_TB) (err error) { 48 | o := orm.NewOrm() 49 | err = o.Begin() 50 | sql := "delete from cmn_grouprole_tb where groupid=?" 51 | dbtype := Getdbtype() 52 | sql = ConvertSQL(sql, dbtype) 53 | _, err = o.Raw(sql, groupid).Exec() 54 | 55 | if err != nil { 56 | o.Rollback() 57 | return err 58 | } 59 | sql = "insert into cmn_grouprole_tb(groupid,roleid) values(?,?)" 60 | sql = ConvertSQL(sql, dbtype) 61 | for _, grouprole := range u { 62 | _, err = o.Raw(sql, groupid, grouprole.Roleid).Exec() 63 | if err != nil { 64 | o.Rollback() 65 | return err 66 | } 67 | } 68 | 69 | err = o.Commit() 70 | 71 | return err 72 | } 73 | func AddCMN_GROUP_TB(u CMN_GROUP_TB) error { 74 | o := orm.NewOrm() 75 | err := o.Begin() 76 | _, err = o.Delete(&u) 77 | if err != nil { 78 | //fmt.Println(err) 79 | o.Rollback() 80 | return err 81 | } 82 | //_, err = o.Insert(&u) 83 | insertsql := "insert into cmn_group_tb(groupid,parentid,groupname,grouplevel,remark) values(?,?,?,?,?)" 84 | //_, err = o.InsertMulti(1, &u) 85 | insertsql = ConvertSQL(insertsql, Getdbtype()) 86 | _, err = o.Raw(insertsql, u.Groupid, u.Parentid, u.Groupname, u.Grouplevel, u.Remark).Exec() 87 | if err != nil { 88 | fmt.Println(err) 89 | o.Rollback() 90 | return err 91 | } 92 | err = o.Commit() 93 | 94 | return err 95 | } 96 | 97 | func AddMultiCMN_GROUP_TB(u []CMN_GROUP_TB) error { 98 | o := orm.NewOrm() 99 | err := o.Begin() 100 | //_, err = o.InsertMulti(len(u), &u) 101 | insertsql := "insert into cmn_group_tb(groupid,parentid,groupname,grouplevel,remark) values(?,?,?,?,?)" 102 | //_, err = o.InsertMulti(1, &u) 103 | insertsql = ConvertSQL(insertsql, Getdbtype()) 104 | for _, u1 := range u { 105 | _, err = o.Raw(insertsql, u1.Groupid, u1.Parentid, u1.Groupname, u1.Grouplevel, u1.Remark).Exec() 106 | if err != nil { 107 | fmt.Println(err) 108 | o.Rollback() 109 | return err 110 | } 111 | } 112 | err = o.Commit() 113 | return err 114 | } 115 | 116 | func GetAllCMN_GROUP_TB() (admins []CMN_GROUP_TB, err error) { 117 | admins = make([]CMN_GROUP_TB, 0) 118 | o := orm.NewOrm() 119 | 120 | sql := "select * from cmn_group_tb order by parentid " 121 | 122 | _, err = o.Raw(sql).QueryRows(&admins) 123 | 124 | return admins, err 125 | } 126 | 127 | func GetCMN_GROUP_TB(u *CMN_GROUP_TB) (admins []CMN_GROUP_TB, err error) { 128 | admins = make([]CMN_GROUP_TB, 0) 129 | o := orm.NewOrm() 130 | sql := "select * from cmn_group_tb where 1=1 " 131 | 132 | if u.Groupid != "" { 133 | sql = sql + " and groupid='" + u.Groupid + "'" 134 | } 135 | 136 | if u.Parentid != "" { 137 | sql = sql + " and parentid='" + u.Parentid + "'" 138 | } 139 | 140 | if u.Groupname != "" { 141 | sql = sql + " and groupname='" + u.Groupname + "'" 142 | } 143 | 144 | if u.Grouplevel != "" { 145 | sql = sql + " and grouplevel='" + u.Grouplevel + "'" 146 | } 147 | 148 | if u.Remark != "" { 149 | sql = sql + " and remark='" + u.Remark + "'" 150 | } 151 | 152 | _, err = o.Raw(sql).QueryRows(&admins) 153 | 154 | return admins, err 155 | } 156 | func GetCMN_GROUPROLE_TB(u CMN_GROUP_TB) (admins []CMN_GROUPROLE_TB, err error) { 157 | admins = make([]CMN_GROUPROLE_TB, 0) 158 | o := orm.NewOrm() 159 | sql := "select groupid,roleid from cmn_grouprole_tb where groupid=? " 160 | sql = ConvertSQL(sql, Getdbtype()) 161 | _, err = o.Raw(sql, u.Groupid).QueryRows(&admins) 162 | 163 | return admins, err 164 | } 165 | 166 | func DeleteCMN_GROUP_TB(u CMN_GROUP_TB) error { 167 | 168 | o := orm.NewOrm() 169 | 170 | err := o.Begin() 171 | _, err = o.Delete(&u) 172 | 173 | if err != nil { 174 | fmt.Println(err) 175 | err = o.Rollback() 176 | } else { 177 | err = o.Commit() 178 | } 179 | return err 180 | 181 | } 182 | 183 | func UpdateCMN_GROUP_TB(u CMN_GROUP_TB) error { 184 | 185 | o := orm.NewOrm() 186 | 187 | err := o.Begin() 188 | _, err = o.Update(&u) 189 | 190 | if err != nil { 191 | fmt.Println(err) 192 | err = o.Rollback() 193 | } else { 194 | err = o.Commit() 195 | } 196 | return err 197 | 198 | } 199 | func Getparentgroupids() (parentids []Parentgroupid, err error) { 200 | parentids = make([]Parentgroupid, 0) 201 | o := orm.NewOrm() 202 | 203 | sql := "select groupid,groupname from cmn_group_tb order by parentid " 204 | 205 | _, err = o.Raw(sql).QueryRows(&parentids) 206 | 207 | return parentids, err 208 | } 209 | func DeleteCMN_GROUPROLE_TB(u CMN_GROUP_TB) (err error) { 210 | 211 | o := orm.NewOrm() 212 | err = o.Begin() 213 | sql := "delete from cmn_grouprole_tb where groupid=? " 214 | sql = ConvertSQL(sql, Getdbtype()) 215 | _, err = o.Raw(sql, u.Groupid).Exec() 216 | if err != nil { 217 | fmt.Println(err) 218 | o.Rollback() 219 | return err 220 | } 221 | err = o.Commit() 222 | 223 | return err 224 | } 225 | func GetGroupbyid(mt CMN_GROUP_TB) (admin CMN_GROUP_TB, err error) { 226 | 227 | o := orm.NewOrm() 228 | 229 | sql := "select * from cmn_group_tb where groupid=?" 230 | sql = ConvertSQL(sql, Getdbtype()) 231 | err = o.Raw(sql, mt.Groupid).QueryRow(&admin) 232 | 233 | return admin, err 234 | } 235 | func DeleteGroupbyid(mt CMN_GROUP_TB) (err error) { 236 | 237 | o := orm.NewOrm() 238 | err = o.Begin() 239 | if err != nil { 240 | fmt.Println(err) 241 | o.Rollback() 242 | return err 243 | } 244 | _, err = o.Delete(&mt) 245 | if err != nil { 246 | fmt.Println(err) 247 | o.Rollback() 248 | return err 249 | } 250 | 251 | err = o.Commit() 252 | 253 | return err 254 | } 255 | func AddMultiCMN_USERGROUP_TB(u []CMN_USERGROUP_TB) error { 256 | o := orm.NewOrm() 257 | err := o.Begin() 258 | sql := "delete from cmn_usergroup_tb where groupid=?" 259 | dbtype := Getdbtype() 260 | sql = ConvertSQL(sql, dbtype) 261 | _, err = o.Raw(sql, u[0].Groupid).Exec() 262 | if err != nil { 263 | o.Rollback() 264 | return err 265 | } 266 | sql = "insert into cmn_usergroup_tb(userid,groupid,expireddate) values(?,?,?)" 267 | sql = ConvertSQL(sql, dbtype) 268 | for _, orgrole := range u { 269 | _, err = o.Raw(sql, orgrole.Userid, orgrole.Groupid, time.Now()).Exec() 270 | if err != nil { 271 | o.Rollback() 272 | return err 273 | } 274 | } 275 | 276 | err = o.Commit() 277 | 278 | return err 279 | } 280 | func GetCMN_USERGROUP_TB(u CMN_GROUP_TB) (admins []CMN_USERGROUP_TB, err error) { 281 | admins = make([]CMN_USERGROUP_TB, 0) 282 | o := orm.NewOrm() 283 | sql := "select * from cmn_usergroup_tb where groupid=? " 284 | sql = ConvertSQL(sql, Getdbtype()) 285 | _, err = o.Raw(sql, u.Groupid).QueryRows(&admins) 286 | 287 | return admins, err 288 | } 289 | func GetAllGroupoptions() (admins []OPTIONS, err error) { 290 | 291 | admins = make([]OPTIONS, 0) 292 | o := orm.NewOrm() 293 | 294 | sql := "select a.groupid as value,a.groupname as label from cmn_group_tb a order by grouplevel" 295 | 296 | _, err = o.Raw(ConvertSQL(sql, Getdbtype())).QueryRows(&admins) 297 | if err != nil { 298 | fmt.Println(err) 299 | } 300 | fmt.Println(admins) 301 | return admins, err 302 | } 303 | -------------------------------------------------------------------------------- /models/cmn_lang_tbmodel.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "encoding/json" 5 | _ "errors" 6 | "fmt" 7 | "os" 8 | "regexp" 9 | "strconv" 10 | "strings" 11 | _ "time" 12 | 13 | "github.com/astaxie/beego/orm" 14 | _ "golang.org/x/text/encoding/simplifiedchinese" 15 | _ "golang.org/x/text/encoding/traditionalchinese" 16 | _ "golang.org/x/text/transform" 17 | ) 18 | 19 | //Adminid int64 `orm:"pk;auto"` //主键,自动增长 20 | //Remark string `orm:"size(5000)"` 21 | //Created time.Time `orm:"index"` 22 | 23 | type CMN_LANG_TB struct { 24 | Langid string `orm:"pk;column(langid)"` 25 | Chinese string `orm:"column(chinese);null"` 26 | Tchinese string `orm:"column(tchinese);null"` 27 | English string `orm:"column(english);null"` 28 | Japanese string `orm:"column(jpanese);null"` 29 | } 30 | type LANG struct { 31 | Langid string 32 | Langname string 33 | } 34 | type LANGPAGEINDEX struct { 35 | Langid string 36 | Langname string 37 | Pageindex int 38 | Pagesize int 39 | } 40 | type PROJECTPATH struct { 41 | Godirectory string 42 | Ngdirectory string 43 | } 44 | 45 | func (u *CMN_LANG_TB) TableName() string { 46 | return "cmn_lang_tb" 47 | } 48 | 49 | func AddCMN_LANG_TB(u *CMN_LANG_TB) error { 50 | o := orm.NewOrm() 51 | err := o.Begin() 52 | _, err = o.Insert(u) 53 | 54 | if err != nil { 55 | fmt.Println(err) 56 | o.Rollback() 57 | } else { 58 | err = o.Commit() 59 | } 60 | return err 61 | } 62 | 63 | func AddMultiCMN_LANG_TB(u []CMN_LANG_TB) error { 64 | o := orm.NewOrm() 65 | err := o.Begin() 66 | 67 | //_, err = o.InsertMulti(len(u), &u) 68 | sql := "select count(1) as ncount from cmn_lang_tb where langid=?" 69 | updatesql := "update cmn_lang_tb set chinese=?,tchinese=?,english=?,jpanese=? where langid=?" 70 | insertsql := "insert into cmn_lang_tb(langid,chinese,tchinese,english,jpanese) values(?,?,?,?,?)" 71 | //_, err = o.InsertMulti(1, &u) 72 | insertsql = ConvertSQL(insertsql, Getdbtype()) 73 | for _, u1 := range u { 74 | ncount := 0 75 | err = o.Raw(sql, u1.Langid).QueryRow(&ncount) 76 | if ncount > 0 { 77 | _, err = o.Raw(updatesql, u1.Chinese, u1.Tchinese, u1.English, u1.Japanese, u1.Langid).Exec() 78 | if err != nil { 79 | fmt.Println(err) 80 | o.Rollback() 81 | return err 82 | } 83 | } else { 84 | _, err = o.Raw(insertsql, u1.Langid, u1.Chinese, u1.Tchinese, u1.English, u1.Japanese).Exec() 85 | if err != nil { 86 | fmt.Println(err) 87 | o.Rollback() 88 | return err 89 | } 90 | } 91 | 92 | } 93 | err = o.Commit() 94 | return err 95 | } 96 | 97 | func GetAllCMN_LANG_TB() (admins []CMN_LANG_TB, err error) { 98 | admins = make([]CMN_LANG_TB, 0) 99 | o := orm.NewOrm() 100 | 101 | sql := "select * from cmn_lang_tb order by langid " 102 | 103 | _, err = o.Raw(sql).QueryRows(&admins) 104 | 105 | return admins, err 106 | } 107 | func GetAllCMN_LANG_TBbypageindex(l LANGPAGEINDEX) (admins []CMN_LANG_TB, err error) { 108 | dbtype := Getdbtype() 109 | admins = make([]CMN_LANG_TB, 0) 110 | o := orm.NewOrm() 111 | 112 | sql := "select * from cmn_lang_tb where 1=1 " 113 | if l.Langid != "" { 114 | sql = sql + " and langid like '%" + l.Langid + "%'" 115 | } 116 | if l.Langname != "" { 117 | sql = sql + " and (chinese like '%" + l.Langname + "%'" 118 | sql = sql + " or tchinese like '%" + l.Langname + "%'" 119 | sql = sql + " or english like '%" + l.Langname + "%'" 120 | sql = sql + " or jpanese like '%" + l.Langname + "%')" 121 | } 122 | var limitstr string = " limit " 123 | if dbtype == "postgres" { 124 | limitstr = limitstr + strconv.Itoa(l.Pagesize) + " offset " + strconv.Itoa((l.Pageindex-1)*l.Pagesize) 125 | 126 | } else if dbtype == "mysql" { 127 | limitstr = limitstr + strconv.Itoa((l.Pageindex-1)*l.Pagesize) + "," + strconv.Itoa(l.Pagesize) 128 | 129 | } else { 130 | limitstr = limitstr + strconv.Itoa((l.Pageindex-1)*l.Pagesize) + "," + strconv.Itoa(l.Pagesize) 131 | 132 | } 133 | sql = sql + limitstr 134 | _, err = o.Raw(ConvertSQL(sql, dbtype)).QueryRows(&admins) 135 | 136 | return admins, err 137 | } 138 | func GetAllCMN_LANG_TBcount(l LANG) (page PAGE, err error) { 139 | 140 | o := orm.NewOrm() 141 | 142 | sql := "select count(1) as total from cmn_lang_tb where 1=1 " 143 | if l.Langid != "" { 144 | sql = sql + " and langid like '%" + l.Langid + "%'" 145 | } 146 | if l.Langname != "" { 147 | sql = sql + " and (chinese like '%" + l.Langname + "%'" 148 | sql = sql + " or tchinese like '%" + l.Langname + "%'" 149 | sql = sql + " or english like '%" + l.Langname + "%'" 150 | sql = sql + " or jpanese like '%" + l.Langname + "%')" 151 | } 152 | 153 | err = o.Raw(sql).QueryRow(&page) 154 | 155 | return page, err 156 | } 157 | 158 | func GetCMN_LANG_TB(u *CMN_LANG_TB) (admins []CMN_LANG_TB, err error) { 159 | admins = make([]CMN_LANG_TB, 0) 160 | o := orm.NewOrm() 161 | sql := "select langid,langname from cmn_lang_tb where 1=1 " 162 | 163 | if u.Langid != "" { 164 | sql = sql + " and langid like '%" + u.Langid + "%'" 165 | } 166 | 167 | if u.Chinese != "" { 168 | sql = sql + " and chinese like '%" + u.Chinese + "%'" 169 | } 170 | if u.Tchinese != "" { 171 | sql = sql + " and tchinese like '%" + u.Tchinese + "%'" 172 | } 173 | if u.English != "" { 174 | sql = sql + " and english like '%" + u.English + "%'" 175 | } 176 | if u.Japanese != "" { 177 | sql = sql + " and jpanese like '%" + u.Japanese + "%'" 178 | } 179 | 180 | _, err = o.Raw(sql).QueryRows(&admins) 181 | 182 | return admins, err 183 | } 184 | 185 | func DeleteCMN_LANG_TB(u *CMN_LANG_TB) error { 186 | 187 | o := orm.NewOrm() 188 | 189 | err := o.Begin() 190 | _, err = o.Delete(u) 191 | 192 | if err != nil { 193 | fmt.Println(err) 194 | o.Rollback() 195 | } else { 196 | err = o.Commit() 197 | } 198 | return err 199 | 200 | } 201 | 202 | func UpdateCMN_LANG_TB(u *CMN_LANG_TB) error { 203 | 204 | o := orm.NewOrm() 205 | 206 | err := o.Begin() 207 | _, err = o.Update(u) 208 | 209 | if err != nil { 210 | fmt.Println(err) 211 | o.Rollback() 212 | } else { 213 | err = o.Commit() 214 | } 215 | return err 216 | } 217 | func Updatelangjson(u2 []CMN_LANG_TB) error { 218 | project, _ := GetProjectpath() 219 | ngpath := project.Ngdirectory 220 | enjsonpath := ngpath + "/src/assets/i18n/English.json" 221 | zhjsonpath := ngpath + "/src/assets/i18n/Chinese.json" 222 | jpjsonpath := ngpath + "/src/assets/i18n/Japanese.json" 223 | tzhjsonpath := ngpath + "/src/assets/i18n/Tchinese.json" 224 | f, err := os.OpenFile(enjsonpath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) 225 | defer f.Close() 226 | if err != nil { 227 | fmt.Println(err) 228 | return err 229 | } 230 | filecontent := "" 231 | filecontent = filecontent + "{" 232 | u, err2 := GetAllCMN_LANG_TB() 233 | if err2 != nil { 234 | fmt.Println("WriteString") 235 | fmt.Println(err2) 236 | return err2 237 | } 238 | for idx, clt := range u { 239 | if idx < len(u)-1 { 240 | filecontent = filecontent + "\"" + clt.Langid + "\":\"" + clt.English + "\",\n" 241 | } else { 242 | filecontent = filecontent + "\"" + clt.Langid + "\":\"" + clt.English + "\"\n" 243 | } 244 | 245 | } 246 | filecontent = filecontent + "}\r\n" 247 | _, err = f.WriteString(filecontent) 248 | if err != nil { 249 | fmt.Println("WriteString") 250 | fmt.Println(err) 251 | return err 252 | } 253 | 254 | f1, err1 := os.OpenFile(zhjsonpath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) 255 | defer f1.Close() 256 | if err1 != nil { 257 | fmt.Println(err1) 258 | return err1 259 | } 260 | filecontent = "" 261 | filecontent = filecontent + "{" 262 | 263 | for idx, clt := range u { 264 | if idx < len(u)-1 { 265 | filecontent = filecontent + "\"" + clt.Langid + "\":\"" + ConvertGBK2unicode(clt.Chinese) + "\",\n" 266 | } else { 267 | filecontent = filecontent + "\"" + clt.Langid + "\":\"" + ConvertGBK2unicode(clt.Chinese) + "\"\n" 268 | } 269 | } 270 | filecontent = filecontent + "}\r\n" 271 | _, err1 = f1.WriteString(filecontent) 272 | if err1 != nil { 273 | fmt.Println("WriteString") 274 | fmt.Println(err1) 275 | return err1 276 | } 277 | f2, err2 := os.OpenFile(jpjsonpath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) 278 | defer f2.Close() 279 | if err2 != nil { 280 | fmt.Println(err2) 281 | return err2 282 | } 283 | filecontent = "" 284 | filecontent = filecontent + "{" 285 | 286 | for idx, clt := range u { 287 | if idx < len(u)-1 { 288 | filecontent = filecontent + "\"" + clt.Langid + "\":\"" + ConvertGBK2unicode(clt.Japanese) + "\",\n" 289 | } else { 290 | filecontent = filecontent + "\"" + clt.Langid + "\":\"" + ConvertGBK2unicode(clt.Japanese) + "\"\n" 291 | } 292 | } 293 | filecontent = filecontent + "}\r\n" 294 | _, err2 = f2.WriteString(filecontent) 295 | if err2 != nil { 296 | fmt.Println("WriteString") 297 | fmt.Println(err2) 298 | return err2 299 | } 300 | f3, err3 := os.OpenFile(tzhjsonpath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) 301 | defer f3.Close() 302 | if err3 != nil { 303 | fmt.Println(err3) 304 | return err3 305 | } 306 | filecontent = "" 307 | filecontent = filecontent + "{" 308 | 309 | for idx, clt := range u { 310 | if idx < len(u)-1 { 311 | filecontent = filecontent + "\"" + clt.Langid + "\":\"" + ConvertGBK2unicode(clt.Tchinese) + "\",\n" 312 | } else { 313 | filecontent = filecontent + "\"" + clt.Langid + "\":\"" + ConvertGBK2unicode(clt.Tchinese) + "\"\n" 314 | } 315 | } 316 | filecontent = filecontent + "}\r\n" 317 | _, err3 = f3.WriteString(filecontent) 318 | if err3 != nil { 319 | fmt.Println("WriteString") 320 | fmt.Println(err3) 321 | return err3 322 | } 323 | return nil 324 | } 325 | func Loadlangjson() error { 326 | 327 | project, _ := GetProjectpath() 328 | ngpath := project.Ngdirectory 329 | enjsonpath := ngpath + "/src/assets/i18n/English.json" 330 | zhjsonpath := ngpath + "/src/assets/i18n/Chinese.json" 331 | jpjsonpath := ngpath + "/src/assets/i18n/Japanese.json" 332 | tzhjsonpath := ngpath + "/src/assets/i18n/Tchinese.json" 333 | data, err := Readfile2string(enjsonpath, "utf8") 334 | if err != nil { 335 | return err 336 | } 337 | reg := regexp.MustCompile(`\{|\}|\"|\"`) 338 | data = reg.ReplaceAllString(data, "") 339 | dataarr := strings.Split(data, ",") 340 | clbarr := make([]CMN_LANG_TB, 0) 341 | for _, data1 := range dataarr { 342 | fmt.Print(data1) 343 | data1arr := strings.Split(data1, ":") 344 | clb := CMN_LANG_TB{Langid: strings.TrimSpace(data1arr[0]), English: strings.TrimSpace(data1arr[1])} 345 | clbarr = append(clbarr, clb) 346 | } 347 | err = InsertorUpdatelang(clbarr, "english") 348 | 349 | data, err = Readfile2string(jpjsonpath, "utf8") 350 | if err != nil { 351 | return err 352 | } 353 | reg = regexp.MustCompile(`\{|\}|\"|\"`) 354 | data = reg.ReplaceAllString(data, "") 355 | dataarr = strings.Split(data, ",") 356 | clbarr = make([]CMN_LANG_TB, 0) 357 | for _, data1 := range dataarr { 358 | data1arr := strings.Split(data1, ":") 359 | context := Convertunicode2GBK(data1arr[1]) 360 | fmt.Print("context------->" + context) 361 | clb := CMN_LANG_TB{Langid: strings.TrimSpace(data1arr[0]), Japanese: context} 362 | clbarr = append(clbarr, clb) 363 | } 364 | err = InsertorUpdatelang(clbarr, "jpanese") 365 | 366 | data, err = Readfile2string(tzhjsonpath, "utf8") 367 | if err != nil { 368 | return err 369 | } 370 | reg = regexp.MustCompile(`\{|\}|\"|\"`) 371 | data = reg.ReplaceAllString(data, "") 372 | dataarr = strings.Split(data, ",") 373 | clbarr = make([]CMN_LANG_TB, 0) 374 | for _, data1 := range dataarr { 375 | data1arr := strings.Split(data1, ":") 376 | context := Convertunicode2GBK(data1arr[1]) 377 | fmt.Print("context------->" + context) 378 | clb := CMN_LANG_TB{Langid: strings.TrimSpace(data1arr[0]), Tchinese: context} 379 | clbarr = append(clbarr, clb) 380 | } 381 | err = InsertorUpdatelang(clbarr, "tchinese") 382 | 383 | data, err = Readfile2string(zhjsonpath, "utf8") 384 | if err != nil { 385 | return err 386 | } 387 | 388 | reg = regexp.MustCompile(`\{|\}|\"|\"`) 389 | data = reg.ReplaceAllString(data, "") 390 | dataarr = strings.Split(data, ",") 391 | clbarr = make([]CMN_LANG_TB, 0) 392 | for _, data1 := range dataarr { 393 | data1arr := strings.Split(data1, ":") 394 | context := Convertunicode2GBK(data1arr[1]) 395 | fmt.Print("context------->" + context) 396 | clb := CMN_LANG_TB{Langid: strings.TrimSpace(data1arr[0]), Chinese: context} 397 | clbarr = append(clbarr, clb) 398 | } 399 | err = InsertorUpdatelang(clbarr, "chinese") 400 | 401 | return err 402 | 403 | } 404 | func InsertorUpdatelang(cltarr []CMN_LANG_TB, langtype string) (err error) { 405 | 406 | o := orm.NewOrm() 407 | err = o.Begin() 408 | sql := "select count(1) as ncount from cmn_lang_tb where langid=?" 409 | sql = ConvertSQL(sql, Getdbtype()) 410 | updatesql := "update cmn_lang_tb set " + langtype + "=? where langid=?" 411 | insertsql := "insert into cmn_lang_tb (langid," + langtype + ") values(?,?)" 412 | for _, clt := range cltarr { 413 | ncount := 0 414 | err = o.Raw(sql, clt.Langid).QueryRow(&ncount) 415 | if ncount > 0 { 416 | switch langtype { 417 | case "chinese": 418 | _, err = o.Raw(updatesql, clt.Chinese, clt.Langid).Exec() 419 | if err != nil { 420 | fmt.Println(err) 421 | o.Rollback() 422 | return err 423 | } 424 | case "english": 425 | _, err = o.Raw(updatesql, clt.English, clt.Langid).Exec() 426 | if err != nil { 427 | fmt.Println(err) 428 | o.Rollback() 429 | return err 430 | } 431 | case "jpanese": 432 | _, err = o.Raw(updatesql, clt.Japanese, clt.Langid).Exec() 433 | if err != nil { 434 | fmt.Println(err) 435 | o.Rollback() 436 | return err 437 | } 438 | case "tchinese": 439 | _, err = o.Raw(updatesql, clt.Tchinese, clt.Langid).Exec() 440 | if err != nil { 441 | fmt.Println(err) 442 | o.Rollback() 443 | return err 444 | } 445 | } 446 | } else { 447 | switch langtype { 448 | case "chinese": 449 | _, err = o.Raw(insertsql, clt.Langid, clt.Chinese).Exec() 450 | if err != nil { 451 | fmt.Println(err) 452 | o.Rollback() 453 | return err 454 | } 455 | case "english": 456 | _, err = o.Raw(insertsql, clt.Langid, clt.English).Exec() 457 | if err != nil { 458 | fmt.Println(err) 459 | o.Rollback() 460 | return err 461 | } 462 | case "jpanese": 463 | _, err = o.Raw(insertsql, clt.Langid, clt.Japanese).Exec() 464 | if err != nil { 465 | fmt.Println(err) 466 | o.Rollback() 467 | return err 468 | } 469 | case "tchinese": 470 | _, err = o.Raw(insertsql, clt.Langid, clt.Tchinese).Exec() 471 | if err != nil { 472 | fmt.Println(err) 473 | o.Rollback() 474 | return err 475 | } 476 | } 477 | } 478 | } 479 | err = o.Commit() 480 | return err 481 | } 482 | func Convertunicode2GBK(unicodestr string) string { 483 | sUnicodev := strings.Split(strings.TrimSpace(unicodestr), "\\u") 484 | var context string 485 | for _, v := range sUnicodev { 486 | v1 := "" 487 | v2 := "" 488 | if len(v) < 1 { 489 | continue 490 | } 491 | if len(v) > 4 { 492 | v1 = v[0:4] 493 | v2 = v[4:] 494 | } else { 495 | v1 = v 496 | v2 = "" 497 | } 498 | 499 | temp, err := strconv.ParseInt(v1, 16, 32) 500 | if err != nil { 501 | panic(err) 502 | } 503 | context += fmt.Sprintf("%c", temp) + v2 504 | } 505 | return context 506 | } 507 | func ConvertGBK2unicode(gbkstr string) string { 508 | textQuoted := strconv.QuoteToASCII(gbkstr) 509 | textUnquoted := textQuoted[1 : len(textQuoted)-1] 510 | return textUnquoted 511 | } 512 | func SAVEPROJECTPATH(u PROJECTPATH) error { 513 | o := orm.NewOrm() 514 | err := o.Begin() 515 | 516 | updatesql := "update dev_component_tb set godirectory=?,ngdirectory=? where componentlevel='0'" 517 | 518 | updatesql = ConvertSQL(updatesql, Getdbtype()) 519 | 520 | _, err = o.Raw(updatesql, u.Godirectory, u.Ngdirectory).Exec() 521 | if err != nil { 522 | fmt.Println(err) 523 | o.Rollback() 524 | return err 525 | } 526 | 527 | err = o.Commit() 528 | return err 529 | } 530 | func GETPROJECTPATH() (u PROJECTPATH, err error) { 531 | o := orm.NewOrm() 532 | sql := "select godirectory,ngdirectory from dev_component_tb where componentlevel='0'" 533 | 534 | sql = ConvertSQL(sql, Getdbtype()) 535 | 536 | err = o.Raw(sql).QueryRow(&u) 537 | if err != nil { 538 | fmt.Println(err) 539 | o.Rollback() 540 | return u, err 541 | } 542 | return u, nil 543 | } 544 | -------------------------------------------------------------------------------- /models/cmn_modual_tbmodel.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "errors" 5 | "fmt" 6 | _ "strconv" 7 | _ "time" 8 | 9 | "github.com/astaxie/beego/orm" 10 | ) 11 | 12 | //Adminid int64 `orm:"pk;auto"` //主键,自动增长 13 | //Remark string `orm:"size(5000)"` 14 | //Created time.Time `orm:"index"` 15 | type CMN_MODUAL_TB struct { 16 | Modualid string `orm:"pk;column(modualid)"` 17 | Modualname string `orm:"column(modualname)"` 18 | Parentid string `orm:"column(parentid)"` 19 | Url string `orm:"column(url);null"` 20 | Remark string `orm:"column(remark);null"` 21 | Displayno int64 `orm:"column(displayno);default(1)"` 22 | } 23 | type CMN_MODUALTEMPLATE_TB struct { 24 | Modualid string `orm:"pk;column(modualid)"` 25 | Flowtemplateid string `orm:"column(flowtemplateid)"` 26 | Tablename string `orm:"column(tablename)"` 27 | } 28 | 29 | func (u *CMN_MODUALTEMPLATE_TB) TableName() string { 30 | return "cmn_modualtemplate_tb" 31 | } 32 | 33 | func (u *CMN_MODUAL_TB) TableName() string { 34 | return "cmn_modual_tb" 35 | } 36 | 37 | func SaveModual(mt CMN_MODUAL_TB) (err error) { 38 | 39 | o := orm.NewOrm() 40 | err = o.Begin() 41 | if err != nil { 42 | fmt.Println(err) 43 | o.Rollback() 44 | return err 45 | } 46 | _, err = o.Delete(&mt) 47 | if err != nil { 48 | fmt.Println(err) 49 | o.Rollback() 50 | return err 51 | } 52 | //_, err = o.Insert(&mt) 53 | insertsql := "insert into cmn_modual_tb(modualid,modualname,parentid,url,remark,displayno) values(?,?,?,?,?,?)" 54 | //_, err = o.InsertMulti(1, &u) 55 | insertsql = ConvertSQL(insertsql, Getdbtype()) 56 | _, err = o.Raw(insertsql, mt.Modualid, mt.Modualname, mt.Parentid, mt.Url, mt.Remark, mt.Displayno).Exec() 57 | if err != nil { 58 | fmt.Println(err) 59 | o.Rollback() 60 | return err 61 | } 62 | err = o.Commit() 63 | return err 64 | } 65 | 66 | func GetAllModual() (admins []CMN_MODUAL_TB, err error) { 67 | admins = make([]CMN_MODUAL_TB, 0) 68 | o := orm.NewOrm() 69 | 70 | sql := "select * from cmn_modual_tb order by displayno" 71 | 72 | _, err = o.Raw(sql).QueryRows(&admins) 73 | 74 | return admins, err 75 | } 76 | func GetAllModualoptions() (admins []OPTIONS, err error) { 77 | admins = make([]OPTIONS, 0) 78 | o := orm.NewOrm() 79 | 80 | sql := "select modualid as value,modualname as label from cmn_modual_tb order by displayno" 81 | 82 | _, err = o.Raw(sql).QueryRows(&admins) 83 | 84 | return admins, err 85 | } 86 | 87 | func GetModualbyid(mt CMN_MODUAL_TB) (admin CMN_MODUAL_TB, err error) { 88 | 89 | o := orm.NewOrm() 90 | 91 | sql := "select * from cmn_modual_tb where modualid=? order by displayno" 92 | sql = ConvertSQL(sql, Getdbtype()) 93 | err = o.Raw(sql, mt.Modualid).QueryRow(&admin) 94 | 95 | return admin, err 96 | } 97 | func DeleteModualbyid(mt CMN_MODUAL_TB) (err error) { 98 | 99 | o := orm.NewOrm() 100 | err = o.Begin() 101 | if err != nil { 102 | fmt.Println(err) 103 | o.Rollback() 104 | return err 105 | } 106 | _, err = o.Delete(&mt) 107 | if err != nil { 108 | fmt.Println(err) 109 | o.Rollback() 110 | return err 111 | } 112 | err = o.Commit() 113 | 114 | return err 115 | } 116 | func SaveModualtemplate(mt CMN_MODUALTEMPLATE_TB) (err error) { 117 | 118 | o := orm.NewOrm() 119 | err = o.Begin() 120 | if err != nil { 121 | fmt.Println(err) 122 | o.Rollback() 123 | return err 124 | } 125 | _, err = o.Delete(&mt) 126 | if err != nil { 127 | fmt.Println(err) 128 | o.Rollback() 129 | return err 130 | } 131 | _, err = o.Insert(&mt) 132 | if err != nil { 133 | fmt.Println(err) 134 | o.Rollback() 135 | return err 136 | } 137 | err = o.Commit() 138 | return err 139 | } 140 | func DeleteModualtemplatebyid(mt CMN_MODUALTEMPLATE_TB) (err error) { 141 | 142 | o := orm.NewOrm() 143 | err = o.Begin() 144 | if err != nil { 145 | fmt.Println(err) 146 | o.Rollback() 147 | return err 148 | } 149 | _, err = o.Delete(&mt) 150 | if err != nil { 151 | fmt.Println(err) 152 | o.Rollback() 153 | return err 154 | } 155 | err = o.Commit() 156 | 157 | return err 158 | } 159 | func GetModualtemplatebyid(mt CMN_MODUALTEMPLATE_TB) (admin CMN_MODUALTEMPLATE_TB, err error) { 160 | 161 | o := orm.NewOrm() 162 | 163 | sql := "select * from cmn_modualtemplate_tb where modualid=?" 164 | sql = ConvertSQL(sql, Getdbtype()) 165 | err = o.Raw(sql, mt.Modualid).QueryRow(&admin) 166 | 167 | return admin, err 168 | } 169 | -------------------------------------------------------------------------------- /models/cmn_org_tbmodel.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "errors" 5 | "fmt" 6 | "strconv" 7 | _ "time" 8 | 9 | "github.com/astaxie/beego/orm" 10 | ) 11 | 12 | //Adminid int64 `orm:"pk;auto"` //主键,自动增长 13 | //Remark string `orm:"size(5000)"` 14 | //Created time.Time `orm:"index"` 15 | type CMN_ORG_TB struct { 16 | Orgid string `orm:"pk;column(orgid)"` 17 | Orgname string `orm:"column(orgname)"` 18 | Parentid string `orm:"column(parentid)"` 19 | Orgtype string `orm:"column(orgtype);null"` 20 | Orglevel string `orm:"column(orglevel)"` 21 | Url string `orm:"column(url);null"` 22 | Remark string `orm:"column(remark);null"` 23 | } 24 | type CMN_ORGLEADER_TB struct { 25 | Orgid string 26 | Userid string 27 | Leadertype string 28 | } 29 | type CMN_ORGANDLEADER_TB struct { 30 | Org CMN_ORG_TB 31 | Orgleader []CMN_ORGLEADER_TB 32 | } 33 | type CMN_ORGROLE_TB struct { 34 | Orgid string 35 | Roleid string 36 | } 37 | 38 | func (u *CMN_ORG_TB) TableName() string { 39 | return "cmn_org_tb" 40 | } 41 | 42 | func SaveOrg(mt CMN_ORG_TB, orglds []CMN_ORGLEADER_TB) (err error) { 43 | 44 | o := orm.NewOrm() 45 | err = o.Begin() 46 | if err != nil { 47 | fmt.Println(err) 48 | o.Rollback() 49 | return err 50 | } 51 | _, err = o.Delete(&mt) 52 | if err != nil { 53 | fmt.Println(err) 54 | o.Rollback() 55 | return err 56 | } 57 | 58 | m, _, _ := GetOrgbyid(CMN_ORG_TB{Orgid: mt.Parentid}) 59 | orglevel, err := strconv.Atoi(m.Orglevel) 60 | if err != nil { 61 | fmt.Println(err) 62 | o.Rollback() 63 | return err 64 | } 65 | strorglevel := strconv.Itoa(orglevel + 1) 66 | mt.Orglevel = strorglevel 67 | 68 | //_, err = o.Insert(&mt) 69 | insertsql := "insert into cmn_org_tb(orgid,orgname,parentid,orgtype,orglevel,url,remark) values(?,?,?,?,?,?,?)" 70 | //_, err = o.InsertMulti(1, &u) 71 | insertsql = ConvertSQL(insertsql, Getdbtype()) 72 | _, err = o.Raw(insertsql, mt.Orgid, mt.Orgname, mt.Parentid, mt.Orgtype, mt.Orglevel, mt.Url, mt.Remark).Exec() 73 | if err != nil { 74 | fmt.Println(err) 75 | o.Rollback() 76 | return err 77 | } 78 | dbtype := Getdbtype() 79 | deletesql := "delete from cmn_orgleader_tb where orgid=?" 80 | deletesql = ConvertSQL(deletesql, dbtype) 81 | _, err = o.Raw(deletesql, mt.Orgid).Exec() 82 | if err != nil { 83 | fmt.Println(err) 84 | o.Rollback() 85 | return err 86 | } 87 | sql := "insert into cmn_orgleader_tb(orgid,userid,leadertype) values(?,?,?)" 88 | sql = ConvertSQL(sql, dbtype) 89 | for _, orgld := range orglds { 90 | _, err = o.Raw(sql, orgld.Orgid, orgld.Userid, orgld.Leadertype).Exec() 91 | if err != nil { 92 | fmt.Println(err) 93 | o.Rollback() 94 | return err 95 | } 96 | } 97 | 98 | err = o.Commit() 99 | return err 100 | } 101 | 102 | func GetAllOrg() (admins []CMN_ORG_TB, err error) { 103 | dbtype := Getdbtype() 104 | admins = make([]CMN_ORG_TB, 0) 105 | o := orm.NewOrm() 106 | //getleadertitle(orgid,orgname) as 107 | sql := "select a.orgid,a.parentid,a.orgtype,a.orglevel,a.remark,a.url,(case when CONCAT(a.orgname,'(',a.orgid,')',GROUP_CONCAT(DISTINCT c.username order by b.leadertype SEPARATOR ',') ) is null then CONCAT(a.orgname,'(',a.orgid,')') else CONCAT(a.orgname,'(',a.orgid,')',GROUP_CONCAT(DISTINCT c.username order by b.leadertype SEPARATOR ',')) end) as orgname from cmn_org_tb a left join cmn_orgleader_tb b on a.orgid=b.orgid left join cmn_user_tb c on b.userid=c.userid group by a.orgid" 108 | if dbtype == "postgres" { 109 | sql = "select a.orgid,a.parentid,a.orgtype,a.orglevel,a.remark,a.url,(case when CONCAT(a.orgname,'(',a.orgid,')',array_to_string(group_concat(c.username),',') ) is null then CONCAT(a.orgname,'(',a.orgid,')') else CONCAT(a.orgname,'(',a.orgid,')',array_to_string(group_concat(c.username),',')) end) as orgname from cmn_org_tb a left join cmn_orgleader_tb b on a.orgid=b.orgid left join cmn_user_tb c on b.userid=c.userid group by a.orgid" 110 | } 111 | //GROUP_CONCAT(DISTINCT a ORDER BY a DESC SEPARATOR ‘-‘) 112 | if dbtype == "sqlite3" { 113 | sql = "select a.orgid,a.parentid,a.orgtype,a.orglevel,a.remark,a.url,(case when a.orgname||'('||a.orgid||')'||GROUP_CONCAT(DISTINCT c.username) is null then a.orgname||'('||a.orgid||')' else a.orgname||'('||a.orgid||')'||GROUP_CONCAT(DISTINCT c.username ) end) as orgname from cmn_org_tb a left join cmn_orgleader_tb b on a.orgid=b.orgid left join cmn_user_tb c on b.userid=c.userid group by a.orgid" 114 | } 115 | _, err = o.Raw(sql).QueryRows(&admins) 116 | if err != nil { 117 | fmt.Println(err) 118 | } 119 | fmt.Println(admins) 120 | return admins, err 121 | } 122 | 123 | func GetAllOrgoptions() (admins []OPTIONS, err error) { 124 | dbtype := Getdbtype() 125 | admins = make([]OPTIONS, 0) 126 | o := orm.NewOrm() 127 | //getleadertitle(orgid,orgname) as 128 | sql := "select a.orgid as value,(case when CONCAT(a.orgname,'(',a.orgid,')',GROUP_CONCAT(DISTINCT c.username order by b.leadertype SEPARATOR ',') ) is null then CONCAT(a.orgname,'(',a.orgid,')') else CONCAT(a.orgname,'(',a.orgid,')',GROUP_CONCAT(DISTINCT c.username order by b.leadertype SEPARATOR ',')) end) as label from cmn_org_tb a left join cmn_orgleader_tb b on a.orgid=b.orgid left join cmn_user_tb c on b.userid=c.userid group by a.orgid" 129 | if dbtype == "postgres" { 130 | sql = "select a.orgid as value,(case when CONCAT(a.orgname,'(',a.orgid,')',array_to_string(group_concat(c.username),',') ) is null then CONCAT(a.orgname,'(',a.orgid,')') else CONCAT(a.orgname,'(',a.orgid,')',array_to_string(group_concat(c.username),',')) end) as label from cmn_org_tb a left join cmn_orgleader_tb b on a.orgid=b.orgid left join cmn_user_tb c on b.userid=c.userid group by a.orgid" 131 | } 132 | //GROUP_CONCAT(DISTINCT a ORDER BY a DESC SEPARATOR ‘-‘) 133 | if dbtype == "sqlite3" { 134 | sql = "select a.orgid as value,(case when a.orgname||'('||a.orgid||')'||GROUP_CONCAT(DISTINCT c.username) is null then a.orgname||'('||a.orgid||')' else a.orgname||'('||a.orgid||')'||GROUP_CONCAT(DISTINCT c.username ) end) as label from cmn_org_tb a left join cmn_orgleader_tb b on a.orgid=b.orgid left join cmn_user_tb c on b.userid=c.userid group by a.orgid" 135 | } 136 | _, err = o.Raw(sql).QueryRows(&admins) 137 | if err != nil { 138 | fmt.Println(err) 139 | } 140 | fmt.Println(admins) 141 | return admins, err 142 | } 143 | 144 | func GetOrgbyid(mt CMN_ORG_TB) (admin CMN_ORG_TB, admins []CMN_ORGLEADER_TB, err error) { 145 | admins = make([]CMN_ORGLEADER_TB, 0) 146 | o := orm.NewOrm() 147 | dbtype := Getdbtype() 148 | sql := "select * from cmn_org_tb where orgid=?" 149 | sql = ConvertSQL(sql, dbtype) 150 | err = o.Raw(sql, mt.Orgid).QueryRow(&admin) 151 | 152 | sql = "select * from cmn_orgleader_tb where orgid=?" 153 | sql = ConvertSQL(sql, dbtype) 154 | _, err = o.Raw(sql, mt.Orgid).QueryRows(&admins) 155 | 156 | return admin, admins, err 157 | } 158 | func DeleteOrgbyid(mt CMN_ORG_TB) (err error) { 159 | 160 | o := orm.NewOrm() 161 | err = o.Begin() 162 | if err != nil { 163 | fmt.Println(err) 164 | o.Rollback() 165 | return err 166 | } 167 | _, err = o.Delete(&mt) 168 | if err != nil { 169 | fmt.Println(err) 170 | o.Rollback() 171 | return err 172 | } 173 | deletesql := "delete from cmn_orgleader_tb where orgid=?" 174 | deletesql = ConvertSQL(deletesql, Getdbtype()) 175 | _, err = o.Raw(deletesql, mt.Orgid).Exec() 176 | if err != nil { 177 | fmt.Println(err) 178 | o.Rollback() 179 | return err 180 | } 181 | err = o.Commit() 182 | 183 | return err 184 | } 185 | func AddMultiCMN_ORGROLE_TB(orgid string, u []CMN_ORGROLE_TB) (err error) { 186 | o := orm.NewOrm() 187 | err = o.Begin() 188 | sql := "delete from cmn_orgrole_tb where orgid=?" 189 | dbtype := Getdbtype() 190 | sql = ConvertSQL(sql, dbtype) 191 | _, err = o.Raw(sql, orgid).Exec() 192 | 193 | if err != nil { 194 | o.Rollback() 195 | return err 196 | } 197 | sql = "insert into cmn_orgrole_tb(orgid,roleid) values(?,?)" 198 | sql = ConvertSQL(sql, dbtype) 199 | for _, orgrole := range u { 200 | _, err = o.Raw(sql, orgrole.Orgid, orgrole.Roleid).Exec() 201 | if err != nil { 202 | o.Rollback() 203 | return err 204 | } 205 | } 206 | 207 | err = o.Commit() 208 | 209 | return err 210 | } 211 | func GetCMN_ORGROLE_TB(u CMN_ORG_TB) (admins []CMN_ORGROLE_TB, err error) { 212 | admins = make([]CMN_ORGROLE_TB, 0) 213 | o := orm.NewOrm() 214 | sql := "select orgid,roleid from cmn_orgrole_tb where 1=1 " 215 | 216 | if u.Orgid != "" { 217 | sql = sql + " and orgid='" + u.Orgid + "'" 218 | } 219 | 220 | _, err = o.Raw(sql).QueryRows(&admins) 221 | 222 | return admins, err 223 | } 224 | func DeleteCMN_ORGROLE_TB(u CMN_ORG_TB) (err error) { 225 | 226 | o := orm.NewOrm() 227 | err = o.Begin() 228 | sql := "delete from cmn_orgrole_tb where orgid=? " 229 | sql = ConvertSQL(sql, Getdbtype()) 230 | _, err = o.Raw(sql, u.Orgid).Exec() 231 | if err != nil { 232 | fmt.Println(err) 233 | o.Rollback() 234 | return err 235 | } 236 | err = o.Commit() 237 | 238 | return err 239 | } 240 | -------------------------------------------------------------------------------- /models/cmn_role_tbmodel.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "errors" 5 | "fmt" 6 | "strconv" 7 | _ "time" 8 | 9 | "github.com/astaxie/beego/orm" 10 | ) 11 | 12 | //Adminid int64 `orm:"pk;auto"` //主键,自动增长 13 | //Remark string `orm:"size(5000)"` 14 | //Created time.Time `orm:"index"` 15 | type CMN_ROLE_TB struct { 16 | Roleid string `orm:"pk;column(roleid)"` 17 | Rolename string `orm:"column(rolename)"` 18 | Parentid string `orm:"column(parentid)"` 19 | Rolelevel string `orm:"column(rolelevel)"` 20 | Remark string `orm:"column(remark);null"` 21 | } 22 | type CMN_ROLEPRIVILEGE_TB struct { 23 | Roleid string 24 | Modualid string 25 | } 26 | 27 | func (u *CMN_ROLE_TB) TableName() string { 28 | return "cmn_role_tb" 29 | } 30 | 31 | func SaveRole(mt CMN_ROLE_TB) (err error) { 32 | 33 | o := orm.NewOrm() 34 | err = o.Begin() 35 | if err != nil { 36 | fmt.Println(err) 37 | o.Rollback() 38 | return err 39 | } 40 | _, err = o.Delete(&mt) 41 | if err != nil { 42 | fmt.Println(err) 43 | o.Rollback() 44 | return err 45 | } 46 | 47 | m, _ := GetRolebyid(CMN_ROLE_TB{Roleid: mt.Parentid}) 48 | rolelevel, err := strconv.Atoi(m.Rolelevel) 49 | if err != nil { 50 | fmt.Println(err) 51 | o.Rollback() 52 | return err 53 | } 54 | strrolelevel := strconv.Itoa(rolelevel + 1) 55 | mt.Rolelevel = strrolelevel 56 | 57 | //_, err = o.Insert(&mt) 58 | insertsql := "insert into cmn_role_tb(roleid,rolename,parentid,rolelevel,remark) values(?,?,?,?,?)" 59 | //_, err = o.InsertMulti(1, &u) 60 | insertsql = ConvertSQL(insertsql, Getdbtype()) 61 | _, err = o.Raw(insertsql, mt.Roleid, mt.Rolename, mt.Parentid, mt.Rolelevel, mt.Remark).Exec() 62 | if err != nil { 63 | fmt.Println(err) 64 | o.Rollback() 65 | return err 66 | } 67 | err = o.Commit() 68 | return err 69 | } 70 | 71 | func GetAllRole() (admins []CMN_ROLE_TB, err error) { 72 | admins = make([]CMN_ROLE_TB, 0) 73 | o := orm.NewOrm() 74 | 75 | sql := "select * from cmn_role_tb" 76 | 77 | _, err = o.Raw(sql).QueryRows(&admins) 78 | 79 | return admins, err 80 | } 81 | func GetAllRoleoptions() (admins []OPTIONS, err error) { 82 | admins = make([]OPTIONS, 0) 83 | o := orm.NewOrm() 84 | 85 | sql := "select roleid as value,rolename as label from cmn_role_tb" 86 | 87 | _, err = o.Raw(sql).QueryRows(&admins) 88 | 89 | return admins, err 90 | } 91 | 92 | func GetRolebyid(mt CMN_ROLE_TB) (admin CMN_ROLE_TB, err error) { 93 | 94 | o := orm.NewOrm() 95 | 96 | sql := "select * from cmn_role_tb where roleid=?" 97 | sql = ConvertSQL(sql, Getdbtype()) 98 | err = o.Raw(sql, mt.Roleid).QueryRow(&admin) 99 | 100 | return admin, err 101 | } 102 | func DeleteRolebyid(mt CMN_ROLE_TB) (err error) { 103 | 104 | o := orm.NewOrm() 105 | err = o.Begin() 106 | if err != nil { 107 | fmt.Println(err) 108 | o.Rollback() 109 | return err 110 | } 111 | _, err = o.Delete(&mt) 112 | if err != nil { 113 | fmt.Println(err) 114 | o.Rollback() 115 | return err 116 | } 117 | 118 | err = o.Commit() 119 | 120 | return err 121 | } 122 | func AddMultiCMN_ROLEPRIVILEGE_TB(roleid string, u []CMN_ROLEPRIVILEGE_TB) error { 123 | o := orm.NewOrm() 124 | err := o.Begin() 125 | if err != nil { 126 | fmt.Println(err) 127 | o.Rollback() 128 | return err 129 | } 130 | dbtype := Getdbtype() 131 | sql := "delete from cmn_roleprivilege_tb where roleid=?" 132 | sql = ConvertSQL(sql, dbtype) 133 | _, err = o.Raw(sql, roleid).Exec() 134 | if err != nil { 135 | o.Rollback() 136 | return err 137 | } 138 | sql = "insert into cmn_roleprivilege_tb values(?,?)" 139 | sql = ConvertSQL(sql, dbtype) 140 | for _, rolerole := range u { 141 | _, err = o.Raw(sql, roleid, rolerole.Modualid).Exec() 142 | if err != nil { 143 | err = o.Rollback() 144 | return err 145 | } 146 | } 147 | 148 | err = o.Commit() 149 | 150 | return err 151 | } 152 | func GetCMN_ROLEPRIVILEGE_TB(roleid string) (admins []CMN_ROLEPRIVILEGE_TB, err error) { 153 | admins = make([]CMN_ROLEPRIVILEGE_TB, 0) 154 | o := orm.NewOrm() 155 | sql := "select roleid,modualid from cmn_roleprivilege_tb where 1=1 " 156 | 157 | if roleid != "" { 158 | sql = sql + " and roleid='" + roleid + "'" 159 | } 160 | 161 | _, err = o.Raw(sql).QueryRows(&admins) 162 | 163 | return admins, err 164 | } 165 | func DeleteCMN_ROLEPRIVILEGE_TB(roleid string) (err error) { 166 | 167 | o := orm.NewOrm() 168 | err = o.Begin() 169 | if err != nil { 170 | fmt.Println(err) 171 | o.Rollback() 172 | return err 173 | } 174 | sql := "delete from cmn_roleprivilege_tb where roleid=?" 175 | sql = ConvertSQL(sql, Getdbtype()) 176 | _, err = o.Raw(sql, roleid).Exec() 177 | if err != nil { 178 | o.Rollback() 179 | return err 180 | } 181 | err = o.Commit() 182 | return err 183 | } 184 | func AddMultiCMN_USERROLE_TBbyrole(u []CMN_USERROLE_TB) error { 185 | o := orm.NewOrm() 186 | err := o.Begin() 187 | sql := "delete from cmn_userrole_tb where roleid=?" 188 | dbtype := Getdbtype() 189 | sql = ConvertSQL(sql, dbtype) 190 | _, err = o.Raw(sql, u[0].Roleid).Exec() 191 | if err != nil { 192 | o.Rollback() 193 | return err 194 | } 195 | if u[0].Userid != "" { 196 | sql = "insert into cmn_userrole_tb(userid,roleid) values(?,?)" 197 | sql = ConvertSQL(sql, dbtype) 198 | for _, orgrole := range u { 199 | _, err = o.Raw(sql, orgrole.Userid, orgrole.Roleid).Exec() 200 | if err != nil { 201 | o.Rollback() 202 | return err 203 | } 204 | } 205 | } 206 | err = o.Commit() 207 | 208 | return err 209 | } 210 | func GetCMN_USERROLE_TBbyroleid(u CMN_USERROLE_TB) (admins []CMN_USERROLE_TB, err error) { 211 | admins = make([]CMN_USERROLE_TB, 0) 212 | o := orm.NewOrm() 213 | sql := "select * from cmn_userrole_tb where roleid=? " 214 | sql = ConvertSQL(sql, Getdbtype()) 215 | _, err = o.Raw(sql, u.Roleid).QueryRows(&admins) 216 | 217 | return admins, err 218 | } 219 | -------------------------------------------------------------------------------- /models/companymodel.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "errors" 5 | "fmt" 6 | _ "strconv" 7 | 8 | "github.com/astaxie/beego/orm" 9 | ) 10 | 11 | //Adminid int64 `orm:"pk;auto"` //主键,自动增长 12 | //Remark string `orm:"size(5000)"` 13 | //Created time.Time `orm:"index"` 14 | //{{Unescapedjs .uppercomponentname}} 15 | type COMPANY struct { 16 | Companycode string `orm:"pk;column(companycode)"` 17 | Companyname string `orm:"column(companyname)"` 18 | Companyshortname string `orm:"column(companyshortname)"` 19 | Manager string `orm:"column(manager)"` 20 | Telphone string `orm:"column(telphone)"` 21 | Fax string `orm:"column(fax)"` 22 | Email string `orm:"column(email)"` 23 | Address string `orm:"column(address)"` 24 | Postcode string `orm:"column(postcode)"` 25 | Companytype string `orm:"column(companytype)"` 26 | Exportflag string `orm:"column(exportflag)"` 27 | } 28 | 29 | func (u *COMPANY) TableName() string { 30 | return "skl_company_tb" 31 | } 32 | 33 | func AddCOMPANY(u *COMPANY) error { 34 | o := orm.NewOrm() 35 | err := o.Begin() 36 | _, err = o.Insert(u) 37 | 38 | if err != nil { 39 | fmt.Println(err) 40 | o.Rollback() 41 | } else { 42 | err = o.Commit() 43 | } 44 | return err 45 | } 46 | 47 | func AddMultiCOMPANY(u []COMPANY) error { 48 | o := orm.NewOrm() 49 | err := o.Begin() 50 | //_, err = o.Delete(&u) 51 | deletesql := "delete from skl_company_tb" 52 | _, err = o.Raw(deletesql).Exec() 53 | 54 | if err != nil { 55 | fmt.Println(err) 56 | o.Rollback() 57 | return err 58 | } 59 | //_, err = o.InsertMulti(len(u), &u) 60 | insertsql := "insert into skl_company_tb(companycode,companyname,companyshortname,manager,telphone,fax,email,address,postcode,companytype,exportflag) values(?,?,?,?,?,?,?,?,?,?,?)" 61 | //_, err = o.InsertMulti(1, &u) 62 | insertsql = ConvertSQL(insertsql, Getdbtype()) 63 | for _, u1 := range u { 64 | _, err = o.Raw(insertsql, u1.Companycode, u1.Companyname, u1.Companyshortname, u1.Manager, u1.Telphone, u1.Fax, u1.Email, u1.Address, u1.Postcode, u1.Companytype, u1.Exportflag).Exec() 65 | if err != nil { 66 | fmt.Println(err) 67 | o.Rollback() 68 | return err 69 | } 70 | } 71 | err = o.Commit() 72 | return err 73 | } 74 | 75 | func GetAllCOMPANY() (admins []COMPANY, err error) { 76 | admins = make([]COMPANY, 0) 77 | o := orm.NewOrm() 78 | 79 | sql := "select * from skl_company_tb" 80 | 81 | _, err = o.Raw(sql).QueryRows(&admins) 82 | 83 | return admins, err 84 | } 85 | func GetAllCOMPANYoptions() (admins []OPTIONS, err error) { 86 | admins = make([]OPTIONS, 0) 87 | o := orm.NewOrm() 88 | 89 | sql := "select companycode as value,companyname as label from skl_company_tb" 90 | 91 | _, err = o.Raw(sql).QueryRows(&admins) 92 | 93 | return admins, err 94 | } 95 | 96 | func GetCOMPANY(u *COMPANY) (admins []COMPANY, err error) { 97 | admins = make([]COMPANY, 0) 98 | o := orm.NewOrm() 99 | sql := "select * from skl_company_tb where 1=1 " 100 | 101 | _, err = o.Raw(sql).QueryRows(&admins) 102 | 103 | return admins, err 104 | } 105 | 106 | func DeleteCOMPANY(u *COMPANY) error { 107 | 108 | o := orm.NewOrm() 109 | 110 | err := o.Begin() 111 | _, err = o.Delete(u) 112 | 113 | if err != nil { 114 | fmt.Println(err) 115 | o.Rollback() 116 | } else { 117 | err = o.Commit() 118 | } 119 | return err 120 | 121 | } 122 | 123 | func UpdateCOMPANY(u *COMPANY) error { 124 | 125 | o := orm.NewOrm() 126 | 127 | err := o.Begin() 128 | _, err = o.Update(u) 129 | 130 | if err != nil { 131 | fmt.Println(err) 132 | o.Rollback() 133 | } else { 134 | err = o.Commit() 135 | } 136 | return err 137 | 138 | } 139 | -------------------------------------------------------------------------------- /models/createtreemodel.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "errors" 5 | "fmt" 6 | _ "strconv" 7 | _ "time" 8 | 9 | _ "github.com/astaxie/beego/orm" 10 | _ "github.com/beego/i18n" 11 | ) 12 | 13 | //Adminid int64 `orm:"pk;auto"` //主键,自动增长 14 | //Remark string `orm:"size(5000)"` 15 | //Created time.Time `orm:"index"` 16 | //var json string = "" 17 | 18 | type Node struct { 19 | Key string 20 | Parentid string 21 | Title string 22 | Url string 23 | Checked string 24 | Childrens []string 25 | Orgtype string 26 | Orglevel string 27 | Rolelevel string 28 | Grouplevel string 29 | } 30 | type Json struct { 31 | Treejson string 32 | } 33 | 34 | func CreateModualTreeJson() string { 35 | json := Json{} 36 | m := make(map[string]Node) 37 | 38 | orgs, _ := GetAllModual() 39 | orgs2 := orgs 40 | //fmt.Println(orgs) 41 | 42 | for _, org := range orgs { 43 | //fmt.Println("parentid:" + org.Parentid) 44 | //childorgs, _ := Getchildrenorgids(org.Orgid) 45 | childorgs := make([]string, 0) 46 | for _, org21 := range orgs2 { 47 | if org21.Parentid == org.Modualid { 48 | childorgs = append(childorgs, org21.Modualid) 49 | //处理过的移除,减少下次循环反而更慢,估计和slice收缩有关 50 | //orgs2 = Remove2(orgs2, idx, idx) 51 | } 52 | 53 | } 54 | fmt.Println(childorgs) 55 | if childorgs != nil && len(childorgs) > 0 { 56 | node := Node{Key: org.Modualid, Parentid: org.Parentid, Title: org.Modualname, Url: org.Url, Checked: "false", Childrens: childorgs} 57 | m[org.Modualid] = node 58 | } else { 59 | node := Node{Key: org.Modualid, Parentid: org.Parentid, Title: org.Modualname, Url: org.Url, Checked: "false"} 60 | m[org.Modualid] = node 61 | } 62 | 63 | } 64 | fmt.Println(m) 65 | 66 | return "[" + Addnode(&json, m, "root") + "]" 67 | 68 | } 69 | func CreateModualTreeJsonForuser(user CMN_USER_TB) string { 70 | json := Json{} 71 | m := make(map[string]Node) 72 | 73 | orgs, _ := GetALLCMN_USERROLEMODUAL_TB(user) 74 | orgs2 := orgs 75 | //fmt.Println(orgs) 76 | 77 | for _, org := range orgs { 78 | //fmt.Println("parentid:" + org.Parentid) 79 | //childorgs, _ := Getchildrenorgids(org.Orgid) 80 | childorgs := make([]string, 0) 81 | for _, org21 := range orgs2 { 82 | if org21.Parentid == org.Modualid { 83 | childorgs = append(childorgs, org21.Modualid) 84 | //处理过的移除,减少下次循环反而更慢,估计和slice收缩有关 85 | //orgs2 = Remove2(orgs2, idx, idx) 86 | } 87 | 88 | } 89 | fmt.Println(childorgs) 90 | if childorgs != nil && len(childorgs) > 0 { 91 | node := Node{Key: org.Modualid, Parentid: org.Parentid, Title: org.Modualname, Url: org.Url, Checked: "true", Childrens: childorgs} 92 | m[org.Modualid] = node 93 | } else { 94 | node := Node{Key: org.Modualid, Parentid: org.Parentid, Title: org.Modualname, Url: org.Url, Checked: "true"} 95 | m[org.Modualid] = node 96 | } 97 | 98 | } 99 | fmt.Println(m) 100 | 101 | return "[" + Addnode(&json, m, "root") + "]" 102 | 103 | } 104 | func CreateOrgTreeJson() string { 105 | json := Json{} 106 | m := make(map[string]Node) 107 | 108 | orgs, _ := GetAllOrg() 109 | orgs2 := orgs 110 | //fmt.Println(orgs) 111 | 112 | for _, org := range orgs { 113 | //fmt.Println("parentid:" + org.Parentid) 114 | //childorgs, _ := Getchildrenorgids(org.Orgid) 115 | childorgs := make([]string, 0) 116 | for _, org21 := range orgs2 { 117 | if org21.Parentid == org.Orgid { 118 | childorgs = append(childorgs, org21.Orgid) 119 | //处理过的移除,减少下次循环反而更慢,估计和slice收缩有关 120 | //orgs2 = Remove2(orgs2, idx, idx) 121 | } 122 | 123 | } 124 | fmt.Println(childorgs) 125 | if childorgs != nil && len(childorgs) > 0 { 126 | node := Node{Key: org.Orgid, Parentid: org.Parentid, Title: org.Orgname, Checked: "false", Childrens: childorgs, Orgtype: org.Orgtype, Orglevel: org.Orglevel} 127 | m[org.Orgid] = node 128 | } else { 129 | node := Node{Key: org.Orgid, Parentid: org.Parentid, Title: org.Orgname, Checked: "false", Orgtype: org.Orgtype, Orglevel: org.Orglevel} 130 | m[org.Orgid] = node 131 | } 132 | 133 | } 134 | fmt.Println(m) 135 | 136 | return "[" + Addnode(&json, m, "root") + "]" 137 | 138 | } 139 | func CreateRoleTreeJson() string { 140 | json := Json{} 141 | m := make(map[string]Node) 142 | 143 | orgs, _ := GetAllRole() 144 | orgs2 := orgs 145 | //fmt.Println(orgs) 146 | 147 | for _, org := range orgs { 148 | //fmt.Println("parentid:" + org.Parentid) 149 | //childorgs, _ := Getchildrenorgids(org.Orgid) 150 | childorgs := make([]string, 0) 151 | for _, org21 := range orgs2 { 152 | if org21.Parentid == org.Roleid { 153 | childorgs = append(childorgs, org21.Roleid) 154 | //处理过的移除,减少下次循环反而更慢,估计和slice收缩有关 155 | //orgs2 = Remove2(orgs2, idx, idx) 156 | } 157 | 158 | } 159 | fmt.Println(childorgs) 160 | if childorgs != nil && len(childorgs) > 0 { 161 | node := Node{Key: org.Roleid, Parentid: org.Parentid, Title: org.Rolename, Checked: "false", Childrens: childorgs, Rolelevel: org.Rolelevel} 162 | m[org.Roleid] = node 163 | } else { 164 | node := Node{Key: org.Roleid, Parentid: org.Parentid, Title: org.Rolename, Checked: "false", Rolelevel: org.Rolelevel} 165 | m[org.Roleid] = node 166 | } 167 | 168 | } 169 | fmt.Println(m) 170 | 171 | return "[" + Addnode(&json, m, "root") + "]" 172 | 173 | } 174 | func CreateRolePrivilegeTreeJson(roleprivilege []CMN_ROLEPRIVILEGE_TB) string { 175 | json := Json{} 176 | m := make(map[string]Node) 177 | 178 | orgs, _ := GetAllModual() 179 | orgs2 := orgs 180 | 181 | for _, org := range orgs { 182 | 183 | childorgs := make([]string, 0) 184 | for _, org21 := range orgs2 { 185 | if org21.Parentid == org.Modualid { 186 | childorgs = append(childorgs, org21.Modualid) 187 | //处理过的移除,减少下次循环反而更慢,估计和slice收缩有关 188 | //orgs2 = Remove2(orgs2, idx, idx) 189 | } 190 | 191 | } 192 | fmt.Println(childorgs) 193 | if childorgs != nil && len(childorgs) > 0 { 194 | node := Node{Key: org.Modualid, Parentid: org.Parentid, Title: org.Modualname, Url: org.Url, Checked: "false", Childrens: childorgs} 195 | m[org.Modualid] = node 196 | } else { 197 | node := Node{Key: org.Modualid, Parentid: org.Parentid, Title: org.Modualname, Url: org.Url, Checked: "false"} 198 | m[org.Modualid] = node 199 | } 200 | 201 | } 202 | fmt.Println(m) 203 | for _, grprole := range roleprivilege { 204 | //map里面的元素不可寻址,不能用m[grprole.Roleid].Checked = "true"这种方法赋值 205 | //m[grprole.Roleid].Checked = "true" 206 | p := m[grprole.Modualid] 207 | p.Checked = "true" 208 | m[grprole.Modualid] = p 209 | } 210 | 211 | return "[" + Addnode(&json, m, "root") + "]" 212 | 213 | } 214 | func CreateOrgRoleTreeJson(orgrole []CMN_ORGROLE_TB) string { 215 | json := Json{} 216 | m := make(map[string]Node) 217 | 218 | orgs, _ := GetAllRole() 219 | orgs2 := orgs 220 | 221 | for _, org := range orgs { 222 | 223 | childorgs := make([]string, 0) 224 | for _, org21 := range orgs2 { 225 | if org21.Parentid == org.Roleid { 226 | childorgs = append(childorgs, org21.Roleid) 227 | //处理过的移除,减少下次循环反而更慢,估计和slice收缩有关 228 | //orgs2 = Remove2(orgs2, idx, idx) 229 | } 230 | 231 | } 232 | fmt.Println(childorgs) 233 | if childorgs != nil && len(childorgs) > 0 { 234 | node := Node{Key: org.Roleid, Parentid: org.Parentid, Title: org.Rolename, Checked: "false", Childrens: childorgs} 235 | m[org.Roleid] = node 236 | } else { 237 | node := Node{Key: org.Roleid, Parentid: org.Parentid, Title: org.Rolename, Checked: "false"} 238 | m[org.Roleid] = node 239 | } 240 | 241 | } 242 | fmt.Println(m) 243 | for _, grprole := range orgrole { 244 | //map里面的元素不可寻址,不能用m[grprole.Roleid].Checked = "true"这种方法赋值 245 | //m[grprole.Roleid].Checked = "true" 246 | p := m[grprole.Roleid] 247 | p.Checked = "true" 248 | m[grprole.Roleid] = p 249 | } 250 | 251 | return "[" + Addnode(&json, m, "root") + "]" 252 | 253 | } 254 | func CreateGroupTreeJson() string { 255 | json := Json{} 256 | m := make(map[string]Node) 257 | 258 | orgs, _ := GetAllCMN_GROUP_TB() 259 | orgs2 := orgs 260 | //fmt.Println(orgs) 261 | 262 | for _, org := range orgs { 263 | //fmt.Println("parentid:" + org.Parentid) 264 | //childorgs, _ := Getchildrenorgids(org.Orgid) 265 | childorgs := make([]string, 0) 266 | for _, org21 := range orgs2 { 267 | if org21.Parentid == org.Groupid { 268 | childorgs = append(childorgs, org21.Groupid) 269 | //处理过的移除,减少下次循环反而更慢,估计和slice收缩有关 270 | //orgs2 = Remove2(orgs2, idx, idx) 271 | } 272 | 273 | } 274 | fmt.Println(childorgs) 275 | if childorgs != nil && len(childorgs) > 0 { 276 | node := Node{Key: org.Groupid, Parentid: org.Parentid, Title: org.Groupname, Checked: "false", Childrens: childorgs, Grouplevel: org.Grouplevel} 277 | m[org.Groupid] = node 278 | } else { 279 | node := Node{Key: org.Groupid, Parentid: org.Parentid, Title: org.Groupname, Checked: "false", Grouplevel: org.Grouplevel} 280 | m[org.Groupid] = node 281 | } 282 | 283 | } 284 | fmt.Println(m) 285 | 286 | return "[" + Addnode(&json, m, "root") + "]" 287 | 288 | } 289 | func CreateGroupRoleTreeJson(grouprole []CMN_GROUPROLE_TB) string { 290 | json := Json{} 291 | m := make(map[string]Node) 292 | 293 | orgs, _ := GetAllRole() 294 | orgs2 := orgs 295 | 296 | for _, org := range orgs { 297 | 298 | childorgs := make([]string, 0) 299 | for _, org21 := range orgs2 { 300 | if org21.Parentid == org.Roleid { 301 | childorgs = append(childorgs, org21.Roleid) 302 | //处理过的移除,减少下次循环反而更慢,估计和slice收缩有关 303 | //orgs2 = Remove2(orgs2, idx, idx) 304 | } 305 | 306 | } 307 | fmt.Println(childorgs) 308 | if childorgs != nil && len(childorgs) > 0 { 309 | node := Node{Key: org.Roleid, Parentid: org.Parentid, Title: org.Rolename, Checked: "false", Childrens: childorgs} 310 | m[org.Roleid] = node 311 | } else { 312 | node := Node{Key: org.Roleid, Parentid: org.Parentid, Title: org.Rolename, Checked: "false"} 313 | m[org.Roleid] = node 314 | } 315 | 316 | } 317 | fmt.Println(m) 318 | for _, grprole := range grouprole { 319 | //map里面的元素不可寻址,不能用m[grprole.Roleid].Checked = "true"这种方法赋值 320 | //m[grprole.Roleid].Checked = "true" 321 | p := m[grprole.Roleid] 322 | p.Checked = "true" 323 | m[grprole.Roleid] = p 324 | } 325 | 326 | return "[" + Addnode(&json, m, "root") + "]" 327 | 328 | } 329 | func CreateUserRoleTreeJson(userrole []CMN_USERROLE_TB) string { 330 | json := Json{} 331 | m := make(map[string]Node) 332 | 333 | orgs, _ := GetAllRole() 334 | orgs2 := orgs 335 | 336 | for _, org := range orgs { 337 | 338 | childorgs := make([]string, 0) 339 | for _, org21 := range orgs2 { 340 | if org21.Parentid == org.Roleid { 341 | childorgs = append(childorgs, org21.Roleid) 342 | //处理过的移除,减少下次循环反而更慢,估计和slice收缩有关 343 | //orgs2 = Remove2(orgs2, idx, idx) 344 | } 345 | 346 | } 347 | fmt.Println(childorgs) 348 | if childorgs != nil && len(childorgs) > 0 { 349 | node := Node{Key: org.Roleid, Parentid: org.Parentid, Title: org.Rolename, Checked: "false", Childrens: childorgs} 350 | m[org.Roleid] = node 351 | } else { 352 | node := Node{Key: org.Roleid, Parentid: org.Parentid, Title: org.Rolename, Checked: "false"} 353 | m[org.Roleid] = node 354 | } 355 | 356 | } 357 | fmt.Println(m) 358 | for _, grprole := range userrole { 359 | //map里面的元素不可寻址,不能用m[grprole.Roleid].Checked = "true"这种方法赋值 360 | //m[grprole.Roleid].Checked = "true" 361 | p := m[grprole.Roleid] 362 | p.Checked = "true" 363 | m[grprole.Roleid] = p 364 | } 365 | 366 | return "[" + Addnode(&json, m, "root") + "]" 367 | 368 | } 369 | 370 | func Addnode(json *Json, m2 map[string]Node, id string) string { 371 | 372 | n := m2[id] 373 | json.Treejson = json.Treejson + "{" 374 | json.Treejson = json.Treejson + "\"key\":\"" + n.Key + "\"," 375 | json.Treejson = json.Treejson + "\"title\":\"" + n.Title + "\"," 376 | json.Treejson = json.Treejson + "\"isChecked\":" + n.Checked + "," 377 | json.Treejson = json.Treejson + "\"checked\":" + n.Checked 378 | if n.Url != "" { 379 | json.Treejson = json.Treejson + ",\"isLeaf\":true" 380 | json.Treejson = json.Treejson + ",\"url\":\"" + n.Url + "\"\r\n" 381 | 382 | } 383 | if n.Orgtype != "" { 384 | json.Treejson = json.Treejson + ",\"orgtype\":\"" + n.Orgtype + "\"\r\n" 385 | 386 | } 387 | if n.Orglevel != "" { 388 | json.Treejson = json.Treejson + ",\"orglevel\":\"" + n.Orglevel + "\"\r\n" 389 | 390 | } 391 | if n.Rolelevel != "" { 392 | json.Treejson = json.Treejson + ",\"rolelevel\":\"" + n.Rolelevel + "\"\r\n" 393 | 394 | } 395 | 396 | if n.Childrens != nil { 397 | if len(n.Childrens) > 0 { 398 | json.Treejson = json.Treejson + ",\"children\":[\r\n" 399 | 400 | for i := 0; i < len(n.Childrens)+1; i++ { 401 | if i == len(n.Childrens) { 402 | 403 | json.Treejson = json.Treejson + "]}" 404 | 405 | break 406 | } else { 407 | if i > 0 && i <= len(n.Childrens)-1 { 408 | 409 | json.Treejson = json.Treejson + "," 410 | 411 | } 412 | Addnode(json, m2, n.Childrens[i]) 413 | 414 | } 415 | } 416 | } 417 | } else { 418 | json.Treejson = json.Treejson + "}\r\n" 419 | 420 | } 421 | return json.Treejson 422 | 423 | } 424 | -------------------------------------------------------------------------------- /models/datasourcemodel.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "errors" 5 | "fmt" 6 | _ "strconv" 7 | 8 | "github.com/astaxie/beego/orm" 9 | ) 10 | 11 | //Adminid int64 `orm:"pk;auto"` //主键,自动增长 12 | //Remark string `orm:"size(5000)"` 13 | //Created time.Time `orm:"index"` 14 | type DATASOURCE struct { 15 | Datasource string `orm:"pk;column(datasource)"` 16 | Datasourcename string `orm:"column(datasourcename)"` 17 | Dbtype string `orm:"column(dbtype)"` 18 | Ip string `orm:"column(ip)"` 19 | Port int `orm:"column(port)"` 20 | Schema string `orm:"column(schema)"` 21 | Username string `orm:"column(username)"` 22 | Password string `orm:"column(password)"` 23 | Sourcetargettype string `orm:"column(sourcetargettype)"` 24 | } 25 | 26 | func (u *DATASOURCE) TableName() string { 27 | return "skl_datasource_tb" 28 | } 29 | 30 | func AddMultiDATASOURCE(u DATASOURCE) (err error) { 31 | o := orm.NewOrm() 32 | err = o.Begin() 33 | 34 | _, err = o.Delete(&u) 35 | if err != nil { 36 | fmt.Println(err) 37 | o.Rollback() 38 | return err 39 | } 40 | _, err = o.Insert(&u) 41 | if err != nil { 42 | fmt.Println(err) 43 | o.Rollback() 44 | return err 45 | } 46 | 47 | err = o.Commit() 48 | 49 | return err 50 | } 51 | 52 | func GetAllDATASOURCE() (admins []DATASOURCE, err error) { 53 | admins = make([]DATASOURCE, 0) 54 | o := orm.NewOrm() 55 | 56 | sql := "select * from skl_datasource_tb" 57 | 58 | _, err = o.Raw(sql).QueryRows(&admins) 59 | 60 | return admins, err 61 | } 62 | func GetAllMYSQLDATASOURCE() (admins []DATASOURCE, err error) { 63 | admins = make([]DATASOURCE, 0) 64 | o := orm.NewOrm() 65 | 66 | sql := "select * from skl_datasource_tb where dbtype='mysql'" 67 | 68 | _, err = o.Raw(sql).QueryRows(&admins) 69 | 70 | return admins, err 71 | } 72 | func GetAllORACLEDATASOURCE() (admins []DATASOURCE, err error) { 73 | admins = make([]DATASOURCE, 0) 74 | o := orm.NewOrm() 75 | 76 | sql := "select * from skl_datasource_tb where dbtype='oracle'" 77 | 78 | _, err = o.Raw(sql).QueryRows(&admins) 79 | 80 | return admins, err 81 | } 82 | 83 | func GetDATASOURCEBYID(e DATASOURCE) (admin DATASOURCE, err error) { 84 | 85 | o := orm.NewOrm() 86 | 87 | sql := "select * from skl_datasource_tb where datasource=?" 88 | sql = ConvertSQL(sql, Getdbtype()) 89 | err = o.Raw(sql, e.Datasource).QueryRow(&admin) 90 | 91 | return admin, err 92 | } 93 | func DeleteDATASOURCE(u *DATASOURCE) error { 94 | 95 | o := orm.NewOrm() 96 | 97 | err := o.Begin() 98 | _, err = o.Delete(u) 99 | 100 | if err != nil { 101 | fmt.Println(err) 102 | o.Rollback() 103 | return err 104 | } 105 | 106 | err = o.Commit() 107 | 108 | return err 109 | } 110 | func GetAllDATASOURCEoptions() (admins []OPTIONS, err error) { 111 | admins = make([]OPTIONS, 0) 112 | o := orm.NewOrm() 113 | 114 | sql := "select datasource as value,datasourcename as label from skl_datasource_tb" 115 | 116 | _, err = o.Raw(sql).QueryRows(&admins) 117 | 118 | return admins, err 119 | } 120 | func GetDATASOURCEoptionsbytype(ds DATASOURCE) (admins []OPTIONS, err error) { 121 | admins = make([]OPTIONS, 0) 122 | o := orm.NewOrm() 123 | 124 | sql := "select datasource as value,datasourcename as label from skl_datasource_tb where sourcetargettype=?" 125 | 126 | _, err = o.Raw(sql, ds.Sourcetargettype).QueryRows(&admins) 127 | 128 | return admins, err 129 | } 130 | -------------------------------------------------------------------------------- /models/datasourcetablefieldchildmodel.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "errors" 5 | "fmt" 6 | "strconv" 7 | 8 | "github.com/astaxie/beego/orm" 9 | ) 10 | 11 | //Adminid int64 `orm:"pk;auto"` //主键,自动增长 12 | //Remark string `orm:"size(5000)"` 13 | //Created time.Time `orm:"index"` 14 | //{{Unescapedjs .uppercomponentname}} 15 | type DATASOURCETABLEFIELDCHILD struct { 16 | Id int64 `orm:"pk;auto"` //主键,自动增长 17 | Datasource string `orm:"column(datasource);size(150)"` 18 | Tablename string `orm:"column(tablename);size(150)"` 19 | Fieldname string `orm:"column(fieldname);size(150)"` 20 | Childfieldname string `orm:"column(childfieldname);size(150)"` 21 | Fieldtype string `orm:"column(fieldtype)"` 22 | Fieldlength int `orm:"column(fieldlength)"` 23 | Isprimary string `orm:"column(isprimary);default(0)"` 24 | Isnull string `orm:"column(isnull);default(0)"` 25 | Defaultvalue string `orm:"column(defaultvalue)"` 26 | Isauto string `orm:"column(isauto);default(0)"` 27 | Isparent string `orm:"column(isparent);default(0)"` 28 | Comment string `orm:"column(comment);"` //备注 29 | } 30 | 31 | func (u *DATASOURCETABLEFIELDCHILD) TableName() string { 32 | return "skl_datasourcetablefieldchild_tb" 33 | } 34 | 35 | // 多字段唯一键 36 | func (u *DATASOURCETABLEFIELDCHILD) TableUnique() [][]string { 37 | return [][]string{ 38 | []string{"Datasource", "Tablename", "Fieldname", "Childfieldname"}, 39 | } 40 | } 41 | func AddDATASOURCETABLEFIELDCHILD(u *DATASOURCETABLEFIELDCHILD) error { 42 | o := orm.NewOrm() 43 | err := o.Begin() 44 | _, err = o.Insert(u) 45 | 46 | if err != nil { 47 | fmt.Println(err) 48 | o.Rollback() 49 | } else { 50 | err = o.Commit() 51 | } 52 | return err 53 | } 54 | 55 | func AddMultiDATASOURCETABLEFIELDCHILD(u []DATASOURCETABLEFIELDCHILD) error { 56 | o := orm.NewOrm() 57 | err := o.Begin() 58 | 59 | sql := "select count(1) as ncount from skl_datasourcetablefieldchild_tb where datasource=? and tablename=? and fieldname=? and childfieldname=?" 60 | updatesql := "update skl_datasourcetablefieldchild_tb set tablename=?,fieldname=?,childfieldname=?,fieldtype=?,fieldlength=?,isprimary=?,isnull=?,defaultvalue=?,isauto=?,isparent=? where datasource=? and tablename=? and fieldname=? and childfieldname=?" 61 | 62 | insertsql := "insert into skl_datasourcetablefieldchild_tb(datasource,tablename,fieldname,childfieldname,fieldtype,fieldlength,isprimary,isnull,defaultvalue,isauto,isparent) values(?,?,?,?,?,?,?,?,?,?,?)" 63 | 64 | insertsql = ConvertSQL(insertsql, Getdbtype()) 65 | for _, u1 := range u { 66 | ncount := 0 67 | err = o.Raw(sql, u1.Datasource, u1.Tablename, u1.Fieldname, u1.Childfieldname).QueryRow(&ncount) 68 | if ncount > 0 { 69 | _, err = o.Raw(updatesql, u1.Tablename, u1.Fieldname, u1.Childfieldname, u1.Fieldtype, u1.Fieldlength, u1.Isprimary, u1.Isnull, u1.Defaultvalue, u1.Isauto, u1.Isparent, u1.Datasource, u1.Tablename, u1.Fieldname, u1.Childfieldname).Exec() 70 | if err != nil { 71 | fmt.Println(err) 72 | o.Rollback() 73 | return err 74 | } 75 | } else { 76 | _, err = o.Raw(insertsql, u1.Datasource, u1.Tablename, u1.Fieldname, u1.Childfieldname, u1.Fieldtype, u1.Fieldlength, u1.Isprimary, u1.Isnull, u1.Defaultvalue, u1.Isauto, u1.Isparent).Exec() 77 | if err != nil { 78 | fmt.Println(err) 79 | o.Rollback() 80 | return err 81 | } 82 | } 83 | 84 | } 85 | err = o.Commit() 86 | return err 87 | } 88 | 89 | func GetAllDATASOURCETABLEFIELDCHILD() (admins []DATASOURCETABLEFIELDCHILD, err error) { 90 | admins = make([]DATASOURCETABLEFIELDCHILD, 0) 91 | o := orm.NewOrm() 92 | 93 | sql := "select * from skl_datasourcetablefieldchild_tb" 94 | 95 | _, err = o.Raw(sql).QueryRows(&admins) 96 | 97 | return admins, err 98 | } 99 | 100 | //获得数据条数 101 | func Getdatasourcetablefieldchildcount() (page PAGE, err error) { 102 | o := orm.NewOrm() 103 | sql := "SELECT count(1) as total from skl_datasourcetablefieldchild_tb a" 104 | err = o.Raw(ConvertSQL(sql, Getdbtype())).QueryRow(&page) 105 | return page, err 106 | } 107 | 108 | //获得分页数据 109 | func Getdatasourcetablefieldchildbypageindex(l PAGE) (admins []DATASOURCETABLEFIELDCHILD, err error) { 110 | dbtype := Getdbtype() 111 | admins = make([]DATASOURCETABLEFIELDCHILD, 0) 112 | o := orm.NewOrm() 113 | 114 | sql := "select * from skl_datasourcetablefieldchild_tb where 1=1 " 115 | 116 | var limitstr string = " limit " 117 | if dbtype == "postgres" { 118 | limitstr = limitstr + strconv.Itoa(l.Pagesize) + " offset " + strconv.Itoa((l.Pageindex-1)*l.Pagesize) 119 | 120 | } else if dbtype == "mysql" { 121 | limitstr = limitstr + strconv.Itoa((l.Pageindex-1)*l.Pagesize) + "," + strconv.Itoa(l.Pagesize) 122 | 123 | } else { 124 | limitstr = limitstr + strconv.Itoa((l.Pageindex-1)*l.Pagesize) + "," + strconv.Itoa(l.Pagesize) 125 | 126 | } 127 | sql = sql + limitstr 128 | 129 | _, err = o.Raw(sql).QueryRows(&admins) 130 | 131 | return admins, err 132 | } 133 | 134 | func GetAllDATASOURCETABLEFIELDCHILDoptions() (admins []OPTIONS, err error) { 135 | admins = make([]OPTIONS, 0) 136 | o := orm.NewOrm() 137 | 138 | sql := "select * from skl_datasourcetablefieldchild_tb" 139 | 140 | _, err = o.Raw(sql).QueryRows(&admins) 141 | 142 | return admins, err 143 | } 144 | 145 | func GetDATASOURCETABLEFIELDCHILD(u *DATASOURCETABLEFIELDCHILD) (admins []DATASOURCETABLEFIELDCHILD, err error) { 146 | admins = make([]DATASOURCETABLEFIELDCHILD, 0) 147 | o := orm.NewOrm() 148 | sql := "select * from skl_datasourcetablefieldchild_tb where 1=1 " 149 | 150 | _, err = o.Raw(sql).QueryRows(&admins) 151 | 152 | return admins, err 153 | } 154 | func GetDATASOURCETABLEFIELDCHILDbyid(u *DATASOURCETABLEFIELDCHILD) (admins []DATASOURCETABLEFIELDCHILD, err error) { 155 | admins = make([]DATASOURCETABLEFIELDCHILD, 0) 156 | o := orm.NewOrm() 157 | sql := "select * from skl_datasourcetablefieldchild_tb where id=? " 158 | 159 | _, err = o.Raw(sql, u.Id).QueryRows(&admins) 160 | 161 | return admins, err 162 | } 163 | func GetDATASOURCETABLEFIELDCHILDbyfield(u *DATASOURCETABLEFIELDCHILD) (admins []DATASOURCETABLEFIELDCHILD, err error) { 164 | admins = make([]DATASOURCETABLEFIELDCHILD, 0) 165 | o := orm.NewOrm() 166 | sql := "select * from skl_datasourcetablefieldchild_tb where datasource=? and tablename=? and fieldname=? " 167 | 168 | _, err = o.Raw(sql, u.Datasource, u.Tablename, u.Fieldname).QueryRows(&admins) 169 | 170 | return admins, err 171 | } 172 | 173 | func DeleteDATASOURCETABLEFIELDCHILD(u *DATASOURCETABLEFIELDCHILD) error { 174 | 175 | o := orm.NewOrm() 176 | 177 | err := o.Begin() 178 | _, err = o.Delete(u) 179 | 180 | if err != nil { 181 | fmt.Println(err) 182 | o.Rollback() 183 | } else { 184 | err = o.Commit() 185 | } 186 | return err 187 | 188 | } 189 | 190 | func UpdateDATASOURCETABLEFIELDCHILD(u *DATASOURCETABLEFIELDCHILD) error { 191 | 192 | o := orm.NewOrm() 193 | 194 | err := o.Begin() 195 | _, err = o.Update(u) 196 | 197 | if err != nil { 198 | fmt.Println(err) 199 | o.Rollback() 200 | } else { 201 | err = o.Commit() 202 | } 203 | return err 204 | 205 | } 206 | func GetmetaDATASOURCETABLEFIELDCHILD(dstf DATASOURCETABLEFIELDCHILDSEARCH) (err error) { 207 | admins := make([]DATASOURCETABLEFIELDCHILD, 0) 208 | 209 | ds, _ := GetDATASOURCEBYID(DATASOURCE{Datasource: dstf.Datasource}) 210 | 211 | switch ds.Dbtype { 212 | case "mongodb": 213 | sourcemongoconn, err := GetMongoConn(ds) 214 | 215 | if err == nil { 216 | fieldinfomap, err := sourcemongoconn.Getcollectionfieldinfochild(ds.Schema, dstf.Tablename, dstf.Fieldname, dstf.Maptype) 217 | if err != nil { 218 | fmt.Println(err) 219 | Getlog().Error("sourcemongoconn.Getcollectionfieldinfochild()==>" + err.Error()) 220 | return err 221 | } 222 | //fmt.Println(fieldinfomap) 223 | for key, value := range fieldinfomap { 224 | admins = append(admins, DATASOURCETABLEFIELDCHILD{Datasource: dstf.Datasource, Tablename: dstf.Tablename, Fieldname: dstf.Fieldname, Childfieldname: key, Fieldtype: value.Fieldtype, Fieldlength: value.Fieldlength, Isprimary: value.Isprimary, Isauto: value.Isauto, Isnull: value.Isnull, Isparent: value.Isparent, Defaultvalue: value.Defaultvalue}) 225 | } 226 | 227 | err = AddMultiDATASOURCETABLEFIELDCHILD(admins) 228 | if err != nil { 229 | fmt.Println(err) 230 | Getlog().Error("AddDATASOURCETABLEFIELDCHILD()==>" + err.Error()) 231 | return err 232 | } 233 | 234 | } else { 235 | 236 | //defer sourcemongoconn.Session.Close() 237 | fmt.Println(err) 238 | Getlog().Error("GetMongoConn()==>" + err.Error()) 239 | return err 240 | } 241 | break 242 | 243 | } 244 | 245 | return nil 246 | } 247 | -------------------------------------------------------------------------------- /models/datasourcetablefieldchildsearchmodel.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "errors" 5 | _ "fmt" 6 | "strconv" 7 | 8 | "github.com/astaxie/beego/orm" 9 | ) 10 | 11 | type DATASOURCETABLEFIELDCHILDSEARCH struct { 12 | Sourcetargettype string 13 | Datasource string 14 | Tablename string 15 | Fieldname string 16 | Pageindex int 17 | Pagesize int 18 | Maptype string 19 | } 20 | 21 | type DATASOURCETABLEFIELDCHILDSEARCHITEM struct { 22 | Id int64 23 | Sourcetargettype string 24 | Datasource string 25 | Tablename string 26 | Fieldname string 27 | Childfieldname string 28 | Edit string 29 | Delete string 30 | Pageindex int 31 | Pagesize int 32 | } 33 | 34 | //获得数据条数 35 | func Getdatasourcetablefieldchildsearchcount(u DATASOURCETABLEFIELDCHILDSEARCH) (page PAGE, err error) { 36 | 37 | o := orm.NewOrm() 38 | 39 | sql := "SELECT count(1) as total from skl_datasourcetablefieldchild_tb a inner join skl_datasource_tb b on a.datasource=b.datasource where 1=1 " 40 | 41 | if u.Sourcetargettype != "" { 42 | sql = sql + " and b.sourcetargettype='" + u.Sourcetargettype + "'" 43 | } 44 | if u.Datasource != "" { 45 | sql = sql + " and a.datasource='" + u.Datasource + "'" 46 | } 47 | if u.Tablename != "" { 48 | sql = sql + " and a.tablename='" + u.Tablename + "'" 49 | } 50 | if u.Fieldname != "" { 51 | sql = sql + " and a.fieldname='" + u.Fieldname + "'" 52 | } 53 | 54 | err = o.Raw(ConvertSQL(sql, Getdbtype())).QueryRow(&page) 55 | 56 | return page, err 57 | } 58 | 59 | //获得分页数据 60 | func Getdatasourcetablefieldchildsearchbypageindex(u DATASOURCETABLEFIELDCHILDSEARCH) (admins []DATASOURCETABLEFIELDCHILDSEARCHITEM, err error) { 61 | dbtype := Getdbtype() 62 | admins = make([]DATASOURCETABLEFIELDCHILDSEARCHITEM, 0) 63 | o := orm.NewOrm() 64 | 65 | sql := "SELECT a.* from skl_datasourcetablefieldchild_tb a inner join skl_datasource_tb b on a.datasource=b.datasource where 1=1 " 66 | 67 | if u.Sourcetargettype != "" { 68 | sql = sql + " and b.sourcetargettype='" + u.Sourcetargettype + "'" 69 | } 70 | if u.Datasource != "" { 71 | sql = sql + " and a.datasource='" + u.Datasource + "'" 72 | } 73 | if u.Tablename != "" { 74 | sql = sql + " and a.tablename='" + u.Tablename + "'" 75 | } 76 | if u.Fieldname != "" { 77 | sql = sql + " and a.fieldname='" + u.Fieldname + "'" 78 | } 79 | 80 | var limitstr string = " limit " 81 | if dbtype == "postgres" { 82 | limitstr = limitstr + strconv.Itoa(u.Pagesize) + " offset " + strconv.Itoa((u.Pageindex-1)*u.Pagesize) 83 | 84 | } else if dbtype == "mysql" { 85 | limitstr = limitstr + strconv.Itoa((u.Pageindex-1)*u.Pagesize) + "," + strconv.Itoa(u.Pagesize) 86 | 87 | } else { 88 | limitstr = limitstr + strconv.Itoa((u.Pageindex-1)*u.Pagesize) + "," + strconv.Itoa(u.Pagesize) 89 | 90 | } 91 | sql = sql + limitstr 92 | _, err = o.Raw(ConvertSQL(sql, dbtype)).QueryRows(&admins) 93 | 94 | return admins, err 95 | } 96 | -------------------------------------------------------------------------------- /models/datasourcetablefieldmodel.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "errors" 5 | "fmt" 6 | "strconv" 7 | 8 | "github.com/astaxie/beego/orm" 9 | ) 10 | 11 | //Adminid int64 `orm:"pk;auto"` //主键,自动增长 12 | //Remark string `orm:"size(5000)"` 13 | //Created time.Time `orm:"index"` 14 | //{{Unescapedjs .uppercomponentname}} 15 | type DATASOURCETABLEFIELD struct { 16 | Id int64 `orm:"pk;auto"` //主键,自动增长 17 | Datasource string `orm:"column(datasource)"` //数据源 18 | Tablename string `orm:"column(tablename)"` //表名 19 | Fieldname string `orm:"column(fieldname)"` //字段名 20 | Fieldtype string `orm:"column(fieldtype)"` // 字段类型 21 | Isauto string `orm:"column(isauto);default(0)"` //是否自增 22 | Fieldlength int `orm:"column(fieldlength)"` //字段长度 23 | Isprimary string `orm:"column(isprimary);default(0)"` //是否主键 24 | Isnull string `orm:"column(isnull);default(0)"` //是否为空 25 | Defaultvalue string `orm:"column(defaultvalue)"` //缺省值 26 | Isparent string `orm:"column(isparent);default(0)"` //是否为父,适用于mongodb的嵌套 27 | Comment string `orm:"column(comment);"` //备注 28 | } 29 | 30 | func (u *DATASOURCETABLEFIELD) TableName() string { 31 | return "skl_datasourcetablefield_tb" 32 | } 33 | 34 | // 多字段唯一键 35 | func (u *DATASOURCETABLEFIELD) TableUnique() [][]string { 36 | return [][]string{ 37 | []string{"Datasource", "Tablename", "Fieldname"}, 38 | } 39 | } 40 | 41 | func AddDATASOURCETABLEFIELD(u *DATASOURCETABLEFIELD) error { 42 | o := orm.NewOrm() 43 | err := o.Begin() 44 | _, err = o.Insert(u) 45 | 46 | if err != nil { 47 | fmt.Println(err) 48 | o.Rollback() 49 | } else { 50 | err = o.Commit() 51 | } 52 | return err 53 | } 54 | 55 | func AddMultiDATASOURCETABLEFIELD(u []DATASOURCETABLEFIELD) error { 56 | ds, err := GetDATASOURCEBYID(DATASOURCE{Datasource: u[0].Datasource}) 57 | if err != nil { 58 | return err 59 | } 60 | 61 | o := orm.NewOrm() 62 | err = o.Begin() 63 | if err != nil { 64 | return err 65 | } 66 | truncatesql := "delete from skl_datasourcetablefield_tb where datasource=? and tablename=?" 67 | sql := "select count(1) as ncount from skl_datasourcetablefield_tb where datasource=? and tablename=? and fieldname=?" 68 | updatesql := "update skl_datasourcetablefield_tb set datasource=?,tablename=?,fieldname=?,fieldtype=?,fieldlength=?,isprimary=?,isnull=?,defaultvalue=?,isauto=?,isparent=? where datasource=? and tablename=? and fieldname=?" 69 | 70 | insertsql := "insert into skl_datasourcetablefield_tb(datasource,tablename,fieldname,fieldtype,fieldlength,isprimary,isnull,defaultvalue,isauto,isparent) values(?,?,?,?,?,?,?,?,?,?)" 71 | 72 | insertsql = ConvertSQL(insertsql, Getdbtype()) 73 | if ds.Sourcetargettype == "source" { 74 | for _, u1 := range u { 75 | if u1.Fieldtype == "longtext" { 76 | u1.Fieldlength = 0 77 | } 78 | if u1.Isauto == "" { 79 | u1.Isauto = "0" 80 | } 81 | if u1.Isnull == "" { 82 | u1.Isnull = "0" 83 | } 84 | if u1.Isparent == "" { 85 | u1.Isparent = "0" 86 | } 87 | if u1.Isprimary == "" { 88 | u1.Isprimary = "0" 89 | } 90 | 91 | ncount := 0 92 | err = o.Raw(sql, u1.Datasource, u1.Tablename, u1.Fieldname).QueryRow(&ncount) 93 | if err != nil { 94 | return err 95 | } 96 | if ncount > 0 { 97 | _, err = o.Raw(updatesql, u1.Datasource, u1.Tablename, u1.Fieldname, u1.Fieldtype, u1.Fieldlength, u1.Isprimary, u1.Isnull, u1.Defaultvalue, u1.Isauto, u1.Isparent, u1.Datasource, u1.Tablename, u1.Fieldname).Exec() 98 | if err != nil { 99 | fmt.Println(err) 100 | Getlog().Error(updatesql + "==>" + err.Error()) 101 | o.Rollback() 102 | return err 103 | } 104 | } else { 105 | _, err = o.Raw(insertsql, u1.Datasource, u1.Tablename, u1.Fieldname, u1.Fieldtype, u1.Fieldlength, u1.Isprimary, u1.Isnull, u1.Defaultvalue, u1.Isauto, u1.Isparent).Exec() 106 | if err != nil { 107 | fmt.Println(err) 108 | Getlog().Error(insertsql + "==>" + err.Error()) 109 | o.Rollback() 110 | return err 111 | } 112 | } 113 | 114 | } 115 | } else { 116 | _, err = o.Raw(truncatesql, u[0].Datasource, u[0].Tablename).Exec() 117 | if err != nil { 118 | Getlog().Error(truncatesql + "==>" + err.Error()) 119 | o.Rollback() 120 | return err 121 | } 122 | for _, u1 := range u { 123 | if u1.Fieldtype == "longtext" { 124 | u1.Fieldlength = 0 125 | } 126 | if u1.Isauto == "" { 127 | u1.Isauto = "0" 128 | } 129 | if u1.Isnull == "" { 130 | u1.Isnull = "0" 131 | } 132 | if u1.Isparent == "" { 133 | u1.Isparent = "0" 134 | } 135 | if u1.Isprimary == "" { 136 | u1.Isprimary = "0" 137 | } 138 | 139 | _, err = o.Raw(insertsql, u1.Datasource, u1.Tablename, u1.Fieldname, u1.Fieldtype, u1.Fieldlength, u1.Isprimary, u1.Isnull, u1.Defaultvalue, u1.Isauto, u1.Isparent).Exec() 140 | if err != nil { 141 | fmt.Println(err) 142 | Getlog().Error(insertsql + "==>" + err.Error()) 143 | o.Rollback() 144 | return err 145 | } 146 | 147 | } 148 | 149 | } 150 | err = o.Commit() 151 | return err 152 | } 153 | 154 | func GetAllDATASOURCETABLEFIELD() (admins []DATASOURCETABLEFIELD, err error) { 155 | admins = make([]DATASOURCETABLEFIELD, 0) 156 | o := orm.NewOrm() 157 | 158 | sql := "select * from skl_datasourcetablefield_tb" 159 | 160 | _, err = o.Raw(sql).QueryRows(&admins) 161 | 162 | return admins, err 163 | } 164 | func GetAllDATASOURCETABLEFIELDbydatasourcetable(u DATASOURCETABLE) (admins []DATASOURCETABLEFIELD, err error) { 165 | admins = make([]DATASOURCETABLEFIELD, 0) 166 | o := orm.NewOrm() 167 | 168 | sql := "select * from skl_datasourcetablefield_tb where datasource=? and tablename=?" 169 | 170 | _, err = o.Raw(sql, u.Datasource, u.Tablename).QueryRows(&admins) 171 | 172 | return admins, err 173 | } 174 | func GetDATASOURCETABLEFIELDBYID(e DATASOURCETABLEFIELD) (admins []DATASOURCETABLEFIELD, err error) { 175 | 176 | admins = make([]DATASOURCETABLEFIELD, 0) 177 | o := orm.NewOrm() 178 | 179 | sql := "select * from skl_datasourcetablefield_tb where id=?" 180 | 181 | _, err = o.Raw(sql, e.Id).QueryRows(&admins) 182 | 183 | return admins, err 184 | } 185 | 186 | //获得数据条数 187 | func Getdatasourcetablefieldcount() (page PAGE, err error) { 188 | o := orm.NewOrm() 189 | sql := "SELECT count(1) as total from skl_datasourcetablefield_tb a" 190 | err = o.Raw(ConvertSQL(sql, Getdbtype())).QueryRow(&page) 191 | return page, err 192 | } 193 | 194 | //获得分页数据 195 | func Getdatasourcetablefieldbypageindex(l PAGE) (admins []DATASOURCETABLEFIELD, err error) { 196 | dbtype := Getdbtype() 197 | admins = make([]DATASOURCETABLEFIELD, 0) 198 | o := orm.NewOrm() 199 | 200 | sql := "select * from skl_datasourcetablefield_tb where 1=1 " 201 | 202 | var limitstr string = " limit " 203 | if dbtype == "postgres" { 204 | limitstr = limitstr + strconv.Itoa(l.Pagesize) + " offset " + strconv.Itoa((l.Pageindex-1)*l.Pagesize) 205 | 206 | } else if dbtype == "mysql" { 207 | limitstr = limitstr + strconv.Itoa((l.Pageindex-1)*l.Pagesize) + "," + strconv.Itoa(l.Pagesize) 208 | 209 | } else { 210 | limitstr = limitstr + strconv.Itoa((l.Pageindex-1)*l.Pagesize) + "," + strconv.Itoa(l.Pagesize) 211 | 212 | } 213 | sql = sql + limitstr 214 | 215 | _, err = o.Raw(sql).QueryRows(&admins) 216 | 217 | return admins, err 218 | } 219 | 220 | func GetAllDATASOURCETABLEFIELDoptions(u *DATASOURCETABLEFIELD) (admins []OPTIONS, err error) { 221 | admins = make([]OPTIONS, 0) 222 | o := orm.NewOrm() 223 | 224 | sql := "select fieldname as value,fieldname as label from skl_datasourcetablefield_tb where datasource=? and tablename=?" 225 | 226 | _, err = o.Raw(sql, u.Datasource, u.Tablename).QueryRows(&admins) 227 | 228 | return admins, err 229 | } 230 | 231 | func GetDATASOURCETABLEFIELD(u *DATASOURCETABLEFIELD) (admins []DATASOURCETABLEFIELD, err error) { 232 | admins = make([]DATASOURCETABLEFIELD, 0) 233 | o := orm.NewOrm() 234 | sql := "select * from skl_datasourcetablefield_tb where 1=1 " 235 | 236 | _, err = o.Raw(sql).QueryRows(&admins) 237 | 238 | return admins, err 239 | } 240 | 241 | func DeleteDATASOURCETABLEFIELD(u *DATASOURCETABLEFIELD) error { 242 | 243 | o := orm.NewOrm() 244 | 245 | err := o.Begin() 246 | _, err = o.Delete(u) 247 | 248 | if err != nil { 249 | fmt.Println(err) 250 | o.Rollback() 251 | } else { 252 | err = o.Commit() 253 | } 254 | return err 255 | 256 | } 257 | 258 | func UpdateDATASOURCETABLEFIELD(u *DATASOURCETABLEFIELD) error { 259 | 260 | o := orm.NewOrm() 261 | 262 | err := o.Begin() 263 | _, err = o.Update(u) 264 | 265 | if err != nil { 266 | fmt.Println(err) 267 | o.Rollback() 268 | } else { 269 | err = o.Commit() 270 | } 271 | return err 272 | } 273 | 274 | //convert []DATASOURCETABLEFIELD==>map["datasource"_"tablename"][]DATASOURCETABLEFIELD 275 | func ConvertField2map(admins []DATASOURCETABLEFIELD) (fieldmap map[string][]DATASOURCETABLEFIELD, err error) { 276 | fieldmap = make(map[string][]DATASOURCETABLEFIELD, 0) 277 | for _, admin := range admins { 278 | fieldmapkey := admin.Datasource + "&" + admin.Tablename 279 | _, ok := fieldmap[fieldmapkey] 280 | if !ok { 281 | dtfarr := make([]DATASOURCETABLEFIELD, 0) 282 | dtfarr = append(dtfarr, admin) 283 | fieldmap[fieldmapkey] = dtfarr 284 | 285 | } else { 286 | fieldmap[fieldmapkey] = append(fieldmap[fieldmapkey], admin) 287 | } 288 | } 289 | 290 | return fieldmap, err 291 | } 292 | 293 | //convert []DATASOURCETABLEFIELD==>map["datasource"_"tablename"][]DATASOURCETABLEFIELD 294 | func ConvertFieldchild2map(admins []DATASOURCETABLEFIELDCHILD) (fieldmap map[string][]DATASOURCETABLEFIELDCHILD, err error) { 295 | fieldmap = make(map[string][]DATASOURCETABLEFIELDCHILD, 0) 296 | for _, admin := range admins { 297 | fieldmapkey := admin.Datasource + "&" + admin.Tablename + "&" + admin.Fieldname 298 | _, ok := fieldmap[fieldmapkey] 299 | if !ok { 300 | dtfarr := make([]DATASOURCETABLEFIELDCHILD, 0) 301 | dtfarr = append(dtfarr, admin) 302 | fieldmap[fieldmapkey] = dtfarr 303 | 304 | } else { 305 | fieldmap[fieldmapkey] = append(fieldmap[fieldmapkey], admin) 306 | } 307 | } 308 | 309 | return fieldmap, err 310 | } 311 | 312 | //获得表字段数组 ==>['a','b','c'...] 313 | func GetDATASOURCETABLEFIELDARR(datasource, tablename string) (admins []string, err error) { 314 | admins = make([]string, 0) 315 | o := orm.NewOrm() 316 | 317 | sql := "select fieldname from skl_datasourcetablefield_tb where datasource=? and tablename=?" 318 | 319 | _, err = o.Raw(sql, datasource, tablename).QueryRows(&admins) 320 | 321 | return admins, err 322 | } 323 | 324 | //获得表字段数组 ==>['a','b','c'...] 325 | func GetDATASOURCETABLEFIELDCHILDARR(datasource, tablename string, fieldname string) (admins []string, err error) { 326 | admins = make([]string, 0) 327 | o := orm.NewOrm() 328 | 329 | sql := "select fieldname from skl_datasourcetablefieldchild_tb where datasource=? and tablename=? and fieldname=?" 330 | 331 | _, err = o.Raw(sql, datasource, tablename, fieldname).QueryRows(&admins) 332 | 333 | return admins, err 334 | } 335 | func GetmetaDATASOURCETABLEFIELDbydatasource(datasource string) (err error) { 336 | 337 | dsarr, err := GetDATASOURCETABLEBYdatasource(datasource) 338 | if err != nil { 339 | Getlog().Error("GetsourceDATASOURCETABLE()==>" + err.Error()) 340 | return err 341 | } 342 | 343 | datacount := len(dsarr) 344 | //500万以上时,启动1000个协程,每个协程处理5000条以上的数据 345 | var ndataOrGoroutineCount int //每个协程处理的数据条数或需要启动的协程数 346 | isThousandGoroutineMode := true //true时,1000协程模式;false时非1000协程模式 347 | 348 | dividDataCount := 1000 349 | maxGoroutine := 100 350 | singleGoroutineDataCount := 10 351 | if datacount >= dividDataCount { 352 | ndataOrGoroutineCount = datacount / maxGoroutine 353 | 354 | } else { //dividDataCount以下时,启动n个协程,每个协程处理singleGoroutineDataCount条数据 355 | ndataOrGoroutineCount = datacount / singleGoroutineDataCount 356 | isThousandGoroutineMode = false 357 | } 358 | var dividedsourcedatamap []DATASOURCETABLE 359 | if isThousandGoroutineMode { 360 | 361 | for i := 1; i <= maxGoroutine; i++ { 362 | startcount := ndataOrGoroutineCount * (i) 363 | endcount := ndataOrGoroutineCount * (i + 1) 364 | if i == maxGoroutine { 365 | dividedsourcedatamap = dsarr[startcount:] 366 | go dividDatasourcetablefieldToTarget(dividedsourcedatamap) 367 | } else { 368 | dividedsourcedatamap = dsarr[startcount:endcount] 369 | go dividDatasourcetablefieldToTarget(dividedsourcedatamap) 370 | } 371 | 372 | } 373 | } else { 374 | 375 | for i := 0; i <= ndataOrGoroutineCount; i++ { 376 | startcount := singleGoroutineDataCount * (i) 377 | endcount := singleGoroutineDataCount * (i + 1) 378 | if i == ndataOrGoroutineCount { 379 | dividedsourcedatamap = dsarr[startcount:] 380 | go dividDatasourcetablefieldToTarget(dividedsourcedatamap) 381 | } else { 382 | dividedsourcedatamap = dsarr[startcount:endcount] 383 | go dividDatasourcetablefieldToTarget(dividedsourcedatamap) 384 | } 385 | 386 | } 387 | } 388 | //mongodb支持同时处理100个,受连接限制 389 | //dschan := make(chan DATASOURCE, 100) 390 | //本地mysql支持同时处理100个,受连接限制 391 | //adminschan := make(chan []DATASOURCETABLEFIELD, 100) 392 | 393 | //支持同时处理100个数据源表 394 | 395 | return err 396 | } 397 | func GetmetaDATASOURCETABLEFIELD() (err error) { 398 | 399 | dsarr, err := GetAllDATASOURCETABLE() 400 | if err != nil { 401 | Getlog().Error("GetAllDATASOURCETABLE()==>" + err.Error()) 402 | return err 403 | } 404 | datacount := len(dsarr) 405 | //500万以上时,启动1000个协程,每个协程处理5000条以上的数据 406 | var ndataOrGoroutineCount int //每个协程处理的数据条数或需要启动的协程数 407 | isThousandGoroutineMode := true //true时,1000协程模式;false时非1000协程模式 408 | 409 | dividDataCount := 1000 410 | maxGoroutine := 100 411 | singleGoroutineDataCount := 10 412 | if datacount >= dividDataCount { 413 | ndataOrGoroutineCount = datacount / maxGoroutine 414 | 415 | } else { //dividDataCount以下时,启动n个协程,每个协程处理singleGoroutineDataCount条数据 416 | ndataOrGoroutineCount = datacount / singleGoroutineDataCount 417 | isThousandGoroutineMode = false 418 | } 419 | var dividedsourcedatamap []DATASOURCETABLE 420 | if isThousandGoroutineMode { 421 | 422 | for i := 1; i <= maxGoroutine; i++ { 423 | startcount := ndataOrGoroutineCount * (i) 424 | endcount := ndataOrGoroutineCount * (i + 1) 425 | if i == maxGoroutine { 426 | dividedsourcedatamap = dsarr[startcount:] 427 | go dividDatasourcetablefieldToTarget(dividedsourcedatamap) 428 | } else { 429 | dividedsourcedatamap = dsarr[startcount:endcount] 430 | go dividDatasourcetablefieldToTarget(dividedsourcedatamap) 431 | } 432 | 433 | } 434 | } else { 435 | 436 | for i := 0; i <= ndataOrGoroutineCount; i++ { 437 | startcount := singleGoroutineDataCount * (i) 438 | endcount := singleGoroutineDataCount * (i + 1) 439 | if i == ndataOrGoroutineCount { 440 | dividedsourcedatamap = dsarr[startcount:] 441 | go dividDatasourcetablefieldToTarget(dividedsourcedatamap) 442 | } else { 443 | dividedsourcedatamap = dsarr[startcount:endcount] 444 | go dividDatasourcetablefieldToTarget(dividedsourcedatamap) 445 | } 446 | 447 | } 448 | } 449 | //mongodb支持同时处理100个,受连接限制 450 | //dschan := make(chan DATASOURCE, 100) 451 | //本地mysql支持同时处理100个,受连接限制 452 | //adminschan := make(chan []DATASOURCETABLEFIELD, 100) 453 | 454 | //支持同时处理100个数据源表 455 | 456 | return err 457 | } 458 | func GetmetaDATASOURCETABLEFIELDbydstable(dstable DATASOURCETABLE) (err error) { 459 | admins := make([]DATASOURCETABLEFIELD, 0) 460 | ds2, err := GetDATASOURCETABLEBYID(dstable) 461 | if err != nil { 462 | Getlog().Error("GetDATASOURCETABLEBYID()==>" + err.Error()) 463 | return err 464 | } 465 | ds3, err := GetDATASOURCEBYID(DATASOURCE{Datasource: dstable.Datasource}) 466 | if err != nil { 467 | Getlog().Error("GetDATASOURCEBYID()==>" + err.Error()) 468 | return err 469 | } 470 | 471 | optionsarr, err := GetAllDATASOURCETABLEFIELDoptions(&DATASOURCETABLEFIELD{Datasource: ds2.Datasource, Tablename: ds2.Tablename}) 472 | if err != nil { 473 | fmt.Println(err) 474 | Getlog().Error("GetAllDATASOURCETABLEFIELDoptions()==>" + err.Error()) 475 | 476 | return err 477 | } 478 | //fmt.Println(len(optionsarr)) 479 | //目标表或未同步时才进行同步 480 | if ds3.Sourcetargettype == "target" || len(optionsarr) < 1 { 481 | ds, _ := GetDATASOURCEBYID(DATASOURCE{Datasource: ds2.Datasource}) 482 | //fmt.Println(ds) 483 | switch ds.Dbtype { 484 | case "mongodb": 485 | sourcemongoconn, err := GetMongoConn(ds) 486 | 487 | if err == nil { 488 | fieldinfomap, err := sourcemongoconn.Getcollectionfieldinfo(ds.Schema, ds2.Tablename) 489 | if err != nil { 490 | fmt.Println(err) 491 | Getlog().Error("sourcemongoconn.Getcollectionfieldinfo()==>" + err.Error()) 492 | 493 | return err 494 | } 495 | for key, value := range fieldinfomap { 496 | admins = append(admins, DATASOURCETABLEFIELD{Datasource: ds2.Datasource, Tablename: ds2.Tablename, Fieldname: key, Fieldtype: value.Fieldtype, Fieldlength: value.Fieldlength, Isprimary: value.Isprimary, Isauto: value.Isauto, Isnull: value.Isnull, Isparent: value.Isparent, Defaultvalue: value.Defaultvalue}) 497 | } 498 | 499 | err = AddMultiDATASOURCETABLEFIELD(admins) 500 | if err != nil { 501 | fmt.Println(err) 502 | Getlog().Error("AddMultiDATASOURCETABLEFIELD()==>" + err.Error()) 503 | return err 504 | 505 | } 506 | 507 | } else { 508 | 509 | //defer sourcemongoconn.Session.Close() 510 | fmt.Println(err) 511 | Getlog().Error("GetMongoConn()==>" + err.Error()) 512 | 513 | } 514 | break 515 | case "mysql": 516 | 517 | mysqladmins, err := Getmysqltablefields(ds, ds2.Tablename) 518 | if err != nil { 519 | fmt.Println(err) 520 | Getlog().Error("Getmysqltablefields()==>" + err.Error()) 521 | return err 522 | 523 | } 524 | if len(mysqladmins) > 0 { 525 | 526 | err = AddMultiDATASOURCETABLEFIELD(mysqladmins) 527 | if err != nil { 528 | fmt.Println(err) 529 | Getlog().Error("AddMultiDATASOURCETABLEFIELD()==>" + err.Error()) 530 | return err 531 | 532 | } 533 | } 534 | break 535 | case "sqlserver": 536 | 537 | mysqladmins, err := Getmssqltablefields(ds, ds2.Tablename) 538 | if err != nil { 539 | fmt.Println(err) 540 | Getlog().Error("Getmssqltablefields()==>" + err.Error()) 541 | return err 542 | 543 | } 544 | if len(mysqladmins) > 0 { 545 | 546 | err = AddMultiDATASOURCETABLEFIELD(mysqladmins) 547 | if err != nil { 548 | fmt.Println(err) 549 | Getlog().Error("AddMultiDATASOURCETABLEFIELD()==>" + err.Error()) 550 | return err 551 | 552 | } 553 | } 554 | break 555 | case "oracle": 556 | 557 | mysqladmins, err := Getoracletablefields(ds, ds2.Tablename) 558 | if err != nil { 559 | fmt.Println(err) 560 | Getlog().Error("Getoracletablefields()==>" + err.Error()) 561 | return err 562 | 563 | } 564 | if len(mysqladmins) > 0 { 565 | 566 | err = AddMultiDATASOURCETABLEFIELD(mysqladmins) 567 | if err != nil { 568 | fmt.Println(err) 569 | Getlog().Error("AddMultiDATASOURCETABLEFIELD()==>" + err.Error()) 570 | return err 571 | 572 | } 573 | } 574 | break 575 | } 576 | 577 | } 578 | 579 | return nil 580 | } 581 | func dividDatasourcetablefieldToTarget(dsarr []DATASOURCETABLE) { 582 | 583 | for _, ds2 := range dsarr { 584 | 585 | optionsarr, err := GetAllDATASOURCETABLEFIELDoptions(&DATASOURCETABLEFIELD{Datasource: ds2.Datasource, Tablename: ds2.Tablename}) 586 | if err != nil { 587 | fmt.Println(err) 588 | Getlog().Error("GetAllDATASOURCETABLEFIELDoptions()==>" + err.Error()) 589 | return 590 | } 591 | //fmt.Println(len(optionsarr)) 592 | if len(optionsarr) < 1 { 593 | ds, _ := GetDATASOURCEBYID(DATASOURCE{Datasource: ds2.Datasource}) 594 | //fmt.Println(ds) 595 | switch ds.Dbtype { 596 | case "mongodb": 597 | sourcemongoconn, err := GetMongoConn(ds) 598 | 599 | if err == nil { 600 | fieldinfomap, err := sourcemongoconn.Getcollectionfieldinfo(ds.Schema, ds2.Tablename) 601 | if err != nil { 602 | fmt.Println(err) 603 | Getlog().Error("sourcemongoconn.Getcollectionfieldinfo()==>" + err.Error()) 604 | 605 | } 606 | admins := make([]DATASOURCETABLEFIELD, 0) 607 | for key, value := range fieldinfomap { 608 | admins = append(admins, DATASOURCETABLEFIELD{Datasource: ds2.Datasource, Tablename: ds2.Tablename, Fieldname: key, Fieldtype: value.Fieldtype, Fieldlength: value.Fieldlength, Isprimary: value.Isprimary, Isauto: value.Isauto, Isnull: value.Isnull, Isparent: value.Isparent, Defaultvalue: value.Defaultvalue}) 609 | } 610 | if len(admins) > 0 { 611 | err = AddMultiDATASOURCETABLEFIELD(admins) 612 | if err != nil { 613 | fmt.Println(err) 614 | Getlog().Error("AddMultiDATASOURCETABLEFIELD()==>" + err.Error()) 615 | 616 | } 617 | } 618 | 619 | } else { 620 | 621 | //defer sourcemongoconn.Session.Close() 622 | fmt.Println(err) 623 | Getlog().Error("GetMongoConn()==>" + err.Error()) 624 | 625 | } 626 | break 627 | case "mysql": 628 | 629 | mysqladmins, err := Getmysqltablefields(ds, ds2.Tablename) 630 | if err != nil { 631 | fmt.Println(err) 632 | Getlog().Error("Getmysqltablefields()==>" + err.Error()) 633 | 634 | } 635 | if len(mysqladmins) > 0 { 636 | 637 | err = AddMultiDATASOURCETABLEFIELD(mysqladmins) 638 | if err != nil { 639 | fmt.Println(err) 640 | Getlog().Error("AddMultiDATASOURCETABLEFIELD()==>" + err.Error()) 641 | 642 | } 643 | } 644 | break 645 | case "sqlserver": 646 | 647 | mysqladmins, err := Getmssqltablefields(ds, ds2.Tablename) 648 | if err != nil { 649 | fmt.Println(err) 650 | Getlog().Error("Getmssqltablefields()==>" + err.Error()) 651 | 652 | } 653 | if len(mysqladmins) > 0 { 654 | 655 | err = AddMultiDATASOURCETABLEFIELD(mysqladmins) 656 | if err != nil { 657 | fmt.Println(err) 658 | Getlog().Error("AddMultiDATASOURCETABLEFIELD()==>" + err.Error()) 659 | 660 | } 661 | } 662 | break 663 | case "oracle": 664 | 665 | mysqladmins, err := Getoracletablefields(ds, ds2.Tablename) 666 | if err != nil { 667 | fmt.Println(err) 668 | Getlog().Error("Getoracletablefields()==>" + err.Error()) 669 | 670 | } 671 | if len(mysqladmins) > 0 { 672 | 673 | err = AddMultiDATASOURCETABLEFIELD(mysqladmins) 674 | if err != nil { 675 | fmt.Println(err) 676 | Getlog().Error("AddMultiDATASOURCETABLEFIELD()==>" + err.Error()) 677 | 678 | } 679 | } 680 | break 681 | } 682 | 683 | } //if 684 | } //for 685 | } 686 | -------------------------------------------------------------------------------- /models/datasourcetablemodel.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "errors" 5 | "fmt" 6 | "regexp" 7 | "strconv" 8 | 9 | "github.com/astaxie/beego/orm" 10 | ) 11 | 12 | //Adminid int64 `orm:"pk;auto"` //主键,自动增长 13 | //Remark string `orm:"size(5000)"` 14 | //Created time.Time `orm:"index"` 15 | //{{Unescapedjs .uppercomponentname}} 16 | type DATASOURCETABLE struct { 17 | Id int64 `orm:"pk;auto"` //主键,自动增长 18 | Datasource string `orm:"column(datasource)"` 19 | Tablename string `orm:"column(tablename)"` 20 | } 21 | 22 | func (u *DATASOURCETABLE) TableName() string { 23 | return "skl_datasourcetable_tb" 24 | } 25 | 26 | // 多字段唯一键 27 | func (u *DATASOURCETABLE) TableUnique() [][]string { 28 | return [][]string{ 29 | []string{"Datasource", "Tablename"}, 30 | } 31 | } 32 | 33 | func AddDATASOURCETABLE(u *DATASOURCETABLE) error { 34 | o := orm.NewOrm() 35 | err := o.Begin() 36 | _, err = o.Insert(u) 37 | 38 | if err != nil { 39 | fmt.Println(err) 40 | o.Rollback() 41 | } else { 42 | err = o.Commit() 43 | } 44 | return err 45 | } 46 | 47 | func AddMultiDATASOURCETABLE(u []DATASOURCETABLE) error { 48 | o := orm.NewOrm() 49 | err := o.Begin() 50 | 51 | sql := "select count(1) as ncount from skl_datasourcetable_tb where datasource=? and tablename=?" 52 | updatesql := "update skl_datasourcetable_tb set datasource=?,tablename=? where datasource=? and tablename=?" 53 | 54 | insertsql := "insert into skl_datasourcetable_tb(datasource,tablename) values(?,?)" 55 | 56 | insertsql = ConvertSQL(insertsql, Getdbtype()) 57 | for _, u1 := range u { 58 | ncount := 0 59 | err = o.Raw(sql, u1.Datasource, u1.Tablename).QueryRow(&ncount) 60 | if ncount > 0 { 61 | _, err = o.Raw(updatesql, u1.Datasource, u1.Tablename, u1.Datasource, u1.Tablename).Exec() 62 | if err != nil { 63 | fmt.Println(err) 64 | o.Rollback() 65 | return err 66 | } 67 | } else { 68 | _, err = o.Raw(insertsql, u1.Datasource, u1.Tablename).Exec() 69 | if err != nil { 70 | fmt.Println(err) 71 | o.Rollback() 72 | return err 73 | } 74 | } 75 | 76 | } 77 | err = o.Commit() 78 | return err 79 | } 80 | 81 | func GetDATASOURCETABLEBYID(e DATASOURCETABLE) (admin DATASOURCETABLE, err error) { 82 | 83 | o := orm.NewOrm() 84 | 85 | sql := "select * from skl_datasourcetable_tb where datasource=? and tablename=?" 86 | sql = ConvertSQL(sql, Getdbtype()) 87 | err = o.Raw(sql, e.Datasource, e.Tablename).QueryRow(&admin) 88 | 89 | return admin, err 90 | } 91 | func GetDATASOURCETABLEBYdatasource(datasource string) (admins []DATASOURCETABLE, err error) { 92 | admins = make([]DATASOURCETABLE, 0) 93 | o := orm.NewOrm() 94 | 95 | sql := "select * from skl_datasourcetable_tb where datasource=?" 96 | sql = ConvertSQL(sql, Getdbtype()) 97 | _, err = o.Raw(sql, datasource).QueryRows(&admins) 98 | 99 | return admins, err 100 | } 101 | 102 | func GetAllDATASOURCETABLE() (admins []DATASOURCETABLE, err error) { 103 | admins = make([]DATASOURCETABLE, 0) 104 | o := orm.NewOrm() 105 | 106 | sql := "select * from skl_datasourcetable_tb" 107 | 108 | _, err = o.Raw(sql).QueryRows(&admins) 109 | 110 | return admins, err 111 | } 112 | func GetsourceDATASOURCETABLE() (admins []DATASOURCETABLE, err error) { 113 | admins = make([]DATASOURCETABLE, 0) 114 | o := orm.NewOrm() 115 | 116 | sql := "select a.* from skl_datasourcetable_tb a inner join skl_datasource_tb b on a.datasource=b.datasource where sourcetargettype='source'" 117 | 118 | _, err = o.Raw(sql).QueryRows(&admins) 119 | 120 | return admins, err 121 | } 122 | 123 | //获得数据条数 124 | func Getdatasourcetablecount() (page PAGE, err error) { 125 | o := orm.NewOrm() 126 | sql := "SELECT count(1) as total from skl_datasourcetable_tb a" 127 | err = o.Raw(ConvertSQL(sql, Getdbtype())).QueryRow(&page) 128 | return page, err 129 | } 130 | 131 | //获得分页数据 132 | func Getdatasourcetablebypageindex(l PAGE) (admins []DATASOURCETABLE, err error) { 133 | dbtype := Getdbtype() 134 | admins = make([]DATASOURCETABLE, 0) 135 | o := orm.NewOrm() 136 | 137 | sql := "select * from skl_datasourcetable_tb where 1=1 " 138 | 139 | var limitstr string = " limit " 140 | if dbtype == "postgres" { 141 | limitstr = limitstr + strconv.Itoa(l.Pagesize) + " offset " + strconv.Itoa((l.Pageindex-1)*l.Pagesize) 142 | 143 | } else if dbtype == "mysql" { 144 | limitstr = limitstr + strconv.Itoa((l.Pageindex-1)*l.Pagesize) + "," + strconv.Itoa(l.Pagesize) 145 | 146 | } else { 147 | limitstr = limitstr + strconv.Itoa((l.Pageindex-1)*l.Pagesize) + "," + strconv.Itoa(l.Pagesize) 148 | 149 | } 150 | sql = sql + limitstr 151 | 152 | _, err = o.Raw(sql).QueryRows(&admins) 153 | 154 | return admins, err 155 | } 156 | 157 | func GetAllDATASOURCETABLEoptions(u *DATASOURCE) (admins []OPTIONS, err error) { 158 | admins = make([]OPTIONS, 0) 159 | o := orm.NewOrm() 160 | 161 | sql := "select tablename as value,tablename as label from skl_datasourcetable_tb where datasource=?" 162 | 163 | _, err = o.Raw(sql, u.Datasource).QueryRows(&admins) 164 | 165 | return admins, err 166 | } 167 | 168 | func GetDATASOURCETABLE(u *DATASOURCETABLE) (admins []DATASOURCETABLE, err error) { 169 | admins = make([]DATASOURCETABLE, 0) 170 | o := orm.NewOrm() 171 | sql := "select * from skl_datasourcetable_tb where 1=1 " 172 | 173 | _, err = o.Raw(sql).QueryRows(&admins) 174 | 175 | return admins, err 176 | } 177 | 178 | func DeleteDATASOURCETABLE(u *DATASOURCETABLE) error { 179 | 180 | o := orm.NewOrm() 181 | 182 | err := o.Begin() 183 | _, err = o.Delete(u) 184 | 185 | if err != nil { 186 | fmt.Println(err) 187 | o.Rollback() 188 | } else { 189 | err = o.Commit() 190 | } 191 | return err 192 | 193 | } 194 | 195 | func UpdateDATASOURCETABLE(u *DATASOURCETABLE) error { 196 | 197 | o := orm.NewOrm() 198 | 199 | err := o.Begin() 200 | _, err = o.Update(u) 201 | 202 | if err != nil { 203 | fmt.Println(err) 204 | o.Rollback() 205 | } else { 206 | err = o.Commit() 207 | } 208 | return err 209 | 210 | } 211 | func GetmetaDATASOURCETABLE() (err error) { 212 | reg := regexp.MustCompile(`.*copy$`) 213 | reg2 := regexp.MustCompile(`.*[0-9]{8}.*`) 214 | admins := make([]DATASOURCETABLE, 0) 215 | dsarr, err := GetAllDATASOURCE() 216 | if err != nil { 217 | fmt.Println(err) 218 | Getlog().Error("GetAllDATASOURCE==>" + err.Error()) 219 | return err 220 | } 221 | for _, ds := range dsarr { 222 | switch ds.Dbtype { 223 | case "mongodb": 224 | Getlog().Debug("ds.Dbtype==>" + ds.Dbtype) 225 | sourcemongoconn, err := GetMongoConn(ds) 226 | var tablenamesarr []string 227 | if err == nil { 228 | tablenamesarr, err = sourcemongoconn.Getcollectionnames(ds.Schema) 229 | if err != nil { 230 | fmt.Println(err) 231 | Getlog().Error("sourcemongoconn.Getcollectionnames(ds.Schema)==>" + err.Error()) 232 | return err 233 | } 234 | Getlog().Debug("sourcemongoconn.Getcollectionnames==>" + orm.ToStr(tablenamesarr)) 235 | for _, tablename := range tablenamesarr { 236 | if reg.MatchString(tablename) || reg2.MatchString(tablename) { 237 | continue 238 | } 239 | admins = append(admins, DATASOURCETABLE{Datasource: ds.Datasource, Tablename: tablename}) 240 | } 241 | err = AddMultiDATASOURCETABLE(admins) 242 | if err != nil { 243 | fmt.Println(err) 244 | Getlog().Error("AddMultiDATASOURCETABLE(admins)==>" + err.Error()) 245 | return err 246 | } 247 | } else { 248 | fmt.Println(err) 249 | Getlog().Error("GetMongoConn(ds)==>" + err.Error()) 250 | return err 251 | } 252 | break 253 | case "mysql": 254 | admins, err = Getmysqltablenames(ds) 255 | if err != nil { 256 | fmt.Println(err) 257 | Getlog().Error("Getmysqltablenames(ds)==>" + err.Error()) 258 | return err 259 | } 260 | Getlog().Debug("Getmysqltablenames==>" + orm.ToStr(admins)) 261 | err = AddMultiDATASOURCETABLE(admins) 262 | if err != nil { 263 | fmt.Println(err) 264 | Getlog().Error("AddMultiDATASOURCETABLE(admins)==>" + err.Error()) 265 | return err 266 | } 267 | break 268 | } 269 | } 270 | 271 | return err 272 | } 273 | func GetmetaDATASOURCETABLEbydatasource(ds2 DATASOURCE) (err error) { 274 | reg := regexp.MustCompile(`.*copy$`) 275 | reg2 := regexp.MustCompile(`.*[0-9]{8}.*`) 276 | admins := make([]DATASOURCETABLE, 0) 277 | ds, err := GetDATASOURCEBYID(ds2) 278 | if err != nil { 279 | fmt.Println(err) 280 | Getlog().Error("GetDATASOURCEBYID==>" + err.Error()) 281 | return err 282 | } 283 | switch ds.Dbtype { 284 | case "mongodb": 285 | sourcemongoconn, err := GetMongoConn(ds) 286 | var tablenamesarr []string 287 | if err == nil { 288 | tablenamesarr, err = sourcemongoconn.Getcollectionnames(ds.Schema) 289 | if err != nil { 290 | fmt.Println(err) 291 | return err 292 | } 293 | Getlog().Debug("sourcemongoconn.Getcollectionnames==>" + orm.ToStr(tablenamesarr)) 294 | for _, tablename := range tablenamesarr { 295 | if reg.MatchString(tablename) || reg2.MatchString(tablename) { 296 | continue 297 | } 298 | admins = append(admins, DATASOURCETABLE{Datasource: ds.Datasource, Tablename: tablename}) 299 | } 300 | err = AddMultiDATASOURCETABLE(admins) 301 | if err != nil { 302 | fmt.Println(err) 303 | Getlog().Error("AddMultiDATASOURCETABLE==>" + err.Error()) 304 | return err 305 | } 306 | } else { 307 | fmt.Println(err) 308 | return err 309 | } 310 | break 311 | case "mysql": 312 | admins, err = Getmysqltablenames(ds) 313 | if err != nil { 314 | fmt.Println(err) 315 | Getlog().Error("Getmysqltablenames==>" + err.Error()) 316 | return err 317 | } 318 | Getlog().Debug("Getmysqltablenames==>" + orm.ToStr(admins)) 319 | err = AddMultiDATASOURCETABLE(admins) 320 | if err != nil { 321 | fmt.Println(err) 322 | Getlog().Error("AddMultiDATASOURCETABLE==>" + err.Error()) 323 | return err 324 | } 325 | break 326 | case "oracle": 327 | admins, err = Getoracletablenames2(ds) 328 | if err != nil { 329 | fmt.Println(err) 330 | Getlog().Error("Getoracletablenames==>" + err.Error()) 331 | return err 332 | } 333 | Getlog().Debug("Getoracletablenames==>" + orm.ToStr(admins)) 334 | err = AddMultiDATASOURCETABLE(admins) 335 | if err != nil { 336 | fmt.Println(err) 337 | Getlog().Error("AddMultiDATASOURCETABLE==>" + err.Error()) 338 | return err 339 | } 340 | break 341 | case "sqlserver": 342 | admins, err = Getmssqltablenames(ds) 343 | if err != nil { 344 | fmt.Println(err) 345 | Getlog().Error("Getmssqltablenames==>" + err.Error()) 346 | return err 347 | } 348 | Getlog().Debug("Getmssqltablenames==>" + orm.ToStr(admins)) 349 | err = AddMultiDATASOURCETABLE(admins) 350 | if err != nil { 351 | fmt.Println(err) 352 | Getlog().Error("AddMultiDATASOURCETABLE==>" + err.Error()) 353 | return err 354 | } 355 | break 356 | } 357 | 358 | return err 359 | } 360 | -------------------------------------------------------------------------------- /models/enummodel.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "errors" 5 | "fmt" 6 | _ "strconv" 7 | 8 | "github.com/astaxie/beego/orm" 9 | ) 10 | 11 | //Adminid int64 `orm:"pk;auto"` //主键,自动增长 12 | //Remark string `orm:"size(5000)"` 13 | //Created time.Time `orm:"index"` 14 | type ENUM struct { 15 | Enumcode string `orm:"pk;column(enumcode)"` 16 | Enumname string `orm:"column(enumname)"` 17 | } 18 | type ENUMITEM struct { 19 | Id int64 `orm:"pk;auto"` 20 | Enumcode string `orm:"column(enumcode)"` 21 | Value string `orm:"column(value)"` 22 | Label string `orm:"column(label)"` 23 | } 24 | type ENUMANDITEM struct { 25 | Enum ENUM 26 | Enumitem []ENUMITEM 27 | } 28 | 29 | func (u *ENUM) TableName() string { 30 | return "skl_enum_tb" 31 | } 32 | 33 | // 多字段唯一键 34 | func (u *ENUMITEM) TableUnique() [][]string { 35 | return [][]string{ 36 | []string{"Enumcode", "Value"}, 37 | } 38 | } 39 | func (u *ENUMITEM) TableName() string { 40 | return "skl_enumitem_tb" 41 | } 42 | 43 | func AddMultiENUM(u ENUM, u2 []ENUMITEM) (err error) { 44 | o := orm.NewOrm() 45 | err = o.Begin() 46 | 47 | _, err = o.Delete(&u) 48 | if err != nil { 49 | fmt.Println(err) 50 | o.Rollback() 51 | return err 52 | } 53 | _, err = o.Insert(&u) 54 | if err != nil { 55 | fmt.Println(err) 56 | o.Rollback() 57 | return err 58 | } 59 | 60 | sql := "delete from skl_enumitem_tb where enumcode=?" 61 | sql = ConvertSQL(sql, Getdbtype()) 62 | _, err = o.Raw(sql, u.Enumcode).Exec() 63 | if err != nil { 64 | fmt.Println(err) 65 | o.Rollback() 66 | return err 67 | } 68 | //_, err = o.InsertMulti(len(u2), &u2) 69 | sql = "insert into skl_enumitem_tb(enumcode,value,label) values(?,?,?)" 70 | sql = ConvertSQL(sql, Getdbtype()) 71 | for _, u3 := range u2 { 72 | _, err = o.Raw(sql, u.Enumcode, u3.Value, u3.Label).Exec() 73 | if err != nil { 74 | fmt.Println(err) 75 | o.Rollback() 76 | return err 77 | } 78 | } 79 | 80 | err = o.Commit() 81 | 82 | return err 83 | } 84 | 85 | func GetAllENUM() (admins []ENUM, err error) { 86 | admins = make([]ENUM, 0) 87 | o := orm.NewOrm() 88 | 89 | sql := "select * from skl_enum_tb" 90 | 91 | _, err = o.Raw(sql).QueryRows(&admins) 92 | 93 | return admins, err 94 | } 95 | func GetAllENUMoptions() (admins []OPTIONS, err error) { 96 | admins = make([]OPTIONS, 0) 97 | o := orm.NewOrm() 98 | 99 | sql := "select enumcode as value,enumname as label from skl_enum_tb" 100 | 101 | _, err = o.Raw(sql).QueryRows(&admins) 102 | 103 | return admins, err 104 | } 105 | 106 | func GetENUMBYID(e ENUM) (admin ENUM, err error) { 107 | 108 | o := orm.NewOrm() 109 | 110 | sql := "select * from skl_enum_tb where enumcode=?" 111 | sql = ConvertSQL(sql, Getdbtype()) 112 | err = o.Raw(sql, e.Enumcode).QueryRow(&admin) 113 | 114 | return admin, err 115 | } 116 | func GetAllENUMITEM(e ENUM) (admins []ENUMITEM, err error) { 117 | admins = make([]ENUMITEM, 0) 118 | o := orm.NewOrm() 119 | 120 | sql := "select * from skl_enumitem_tb where enumcode=?" 121 | sql = ConvertSQL(sql, Getdbtype()) 122 | _, err = o.Raw(sql, e.Enumcode).QueryRows(&admins) 123 | 124 | return admins, err 125 | } 126 | func GetAllENUMITEMoptions(e ENUM) (admins []OPTIONS, err error) { 127 | admins = make([]OPTIONS, 0) 128 | o := orm.NewOrm() 129 | 130 | sql := "select * from skl_enumitem_tb where enumcode=?" 131 | sql = ConvertSQL(sql, Getdbtype()) 132 | _, err = o.Raw(sql, e.Enumcode).QueryRows(&admins) 133 | 134 | return admins, err 135 | } 136 | func DeleteENUM(u *ENUM) error { 137 | 138 | o := orm.NewOrm() 139 | 140 | err := o.Begin() 141 | _, err = o.Delete(u) 142 | 143 | if err != nil { 144 | fmt.Println(err) 145 | o.Rollback() 146 | return err 147 | } 148 | sql := "delete from skl_enumitem_tb where enumcode=?" 149 | sql = ConvertSQL(sql, Getdbtype()) 150 | _, err = o.Raw(sql, u.Enumcode).Exec() 151 | if err != nil { 152 | fmt.Println(err) 153 | o.Rollback() 154 | return err 155 | } 156 | err = o.Commit() 157 | 158 | return err 159 | } 160 | func GetENUM(e ENUM) (admin ENUM, err error) { 161 | 162 | o := orm.NewOrm() 163 | 164 | sql := "select * from skl_enum_tb where enumcode=?" 165 | sql = ConvertSQL(sql, Getdbtype()) 166 | err = o.Raw(sql, e.Enumcode).QueryRow(&admin) 167 | 168 | return admin, err 169 | } 170 | -------------------------------------------------------------------------------- /models/enumsearchmodel.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "errors" 5 | _ "fmt" 6 | "strconv" 7 | 8 | "github.com/astaxie/beego/orm" 9 | ) 10 | 11 | type ENUMSEARCH struct { 12 | Enumcode string 13 | Enumname string 14 | Pageindex int 15 | Pagesize int 16 | } 17 | 18 | type ENUMSEARCHITEM struct { 19 | Enumcode string 20 | Enumname string 21 | Pageindex int 22 | Pagesize int 23 | } 24 | 25 | //获得数据条数 26 | func Getenumsearchcount(u ENUMSEARCH) (page PAGE, err error) { 27 | 28 | o := orm.NewOrm() 29 | 30 | sql := "SELECT count(1) as total from skl_enum_tb a where 1=1 " 31 | if u.Enumcode != "" { 32 | sql = sql + " and enumcode like '%" + u.Enumcode + "%'" 33 | } 34 | if u.Enumname != "" { 35 | sql = sql + " and enumname like '%" + u.Enumname + "%'" 36 | } 37 | 38 | err = o.Raw(ConvertSQL(sql, Getdbtype())).QueryRow(&page) 39 | 40 | return page, err 41 | } 42 | 43 | //获得分页数据 44 | func Getenumsearchbypageindex(u ENUMSEARCH) (admins []ENUMSEARCHITEM, err error) { 45 | dbtype := Getdbtype() 46 | admins = make([]ENUMSEARCHITEM, 0) 47 | o := orm.NewOrm() 48 | 49 | sql := "SELECT a.* from skl_enum_tb a where 1=1 " 50 | 51 | if u.Enumcode != "" { 52 | sql = sql + " and enumcode like '%" + u.Enumcode + "%'" 53 | } 54 | if u.Enumname != "" { 55 | sql = sql + " and enumname like '%" + u.Enumname + "%'" 56 | } 57 | sql = sql + " order by enumcode " 58 | var limitstr string = " limit " 59 | if dbtype == "postgres" { 60 | limitstr = limitstr + strconv.Itoa(u.Pagesize) + " offset " + strconv.Itoa((u.Pageindex-1)*u.Pagesize) 61 | 62 | } else if dbtype == "mysql" { 63 | limitstr = limitstr + strconv.Itoa((u.Pageindex-1)*u.Pagesize) + "," + strconv.Itoa(u.Pagesize) 64 | 65 | } else { 66 | limitstr = limitstr + strconv.Itoa((u.Pageindex-1)*u.Pagesize) + "," + strconv.Itoa(u.Pagesize) 67 | 68 | } 69 | sql = sql + limitstr 70 | _, err = o.Raw(ConvertSQL(sql, dbtype)).QueryRows(&admins) 71 | 72 | return admins, err 73 | } 74 | -------------------------------------------------------------------------------- /models/init.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "github.com/astaxie/beego/orm" 5 | ) 6 | 7 | // 需要在init中注册定义的model 8 | func init() { 9 | 10 | orm.RegisterModel(new(CMN_USER_TB)) 11 | orm.RegisterModel(new(FLOWTEMPLATE)) 12 | orm.RegisterModel(new(FLOWTEMPLATEITEM)) 13 | orm.RegisterModel(new(CMN_MODUAL_TB)) 14 | orm.RegisterModel(new(CMN_ORG_TB)) 15 | orm.RegisterModel(new(CMN_ROLE_TB)) 16 | orm.RegisterModel(new(CMN_GROUP_TB)) 17 | orm.RegisterModel(new(FITASKPREVIEW)) 18 | orm.RegisterModel(new(FITASK)) 19 | orm.RegisterModel(new(FIFLOW)) 20 | orm.RegisterModel(new(CMN_MODUALTEMPLATE_TB)) 21 | orm.RegisterModel(new(FISTATUS)) 22 | orm.RegisterModel(new(ORGVARY)) 23 | orm.RegisterModel(new(CMN_LANG_TB)) 24 | orm.RegisterModel(new(ENUM)) 25 | orm.RegisterModel(new(ENUMITEM)) 26 | orm.RegisterModel(new(COMPANY)) 27 | } 28 | -------------------------------------------------------------------------------- /models/log.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "github.com/astaxie/beego/logs" 5 | ) 6 | 7 | var ticketlog *logs.BeeLogger 8 | 9 | func Getlog() *logs.BeeLogger { 10 | if ticketlog == nil { 11 | ticketlog = logs.NewLogger() 12 | ticketlog.SetLogFuncCallDepth(4) 13 | //ticketlog.SetLogger(logs.AdapterConsole, `{"level":1,"color":true}`) 14 | //ticketlog.SetLogger(logs.AdapterFile, `{"filename":"ticket.log","daily":true,"maxdays":60,"color":true}`) 15 | ticketlog.SetLogger(logs.AdapterMultiFile, `{"filename":"ticket.log","separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"]}`) 16 | //ticketlog.Async() 17 | //ticketlog.Async(1e3) 18 | } 19 | return ticketlog 20 | } 21 | -------------------------------------------------------------------------------- /models/mongoconn.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "errors" 5 | 6 | "fmt" 7 | "log" 8 | _ "reflect" 9 | "strconv" 10 | "strings" 11 | "time" 12 | 13 | "github.com/astaxie/beego/config" 14 | "github.com/astaxie/beego/orm" 15 | "github.com/globalsign/mgo" 16 | "github.com/globalsign/mgo/bson" 17 | ) 18 | 19 | const OplogNS = "oplog.rs" 20 | 21 | var con *MongoConn 22 | 23 | type MongoConn struct { 24 | Session *mgo.Session 25 | URL string 26 | } 27 | 28 | type Result struct { 29 | Key string 30 | Value string 31 | Type string 32 | } 33 | 34 | type COLLECTIONINFO struct { 35 | Dbname string 36 | Collectionname string 37 | Ncount int 38 | Elements []bson.DocElem 39 | } 40 | 41 | func GetMongoConn(ds DATASOURCE) (*MongoConn, error) { 42 | var err error 43 | var c1 *MongoConn 44 | if con == nil { 45 | c1, err = newMongoConn(ds) 46 | if err == nil { 47 | con = c1 48 | } 49 | 50 | } 51 | return con, err 52 | } 53 | 54 | func newMongoConn(ds DATASOURCE) (*MongoConn, error) { 55 | mode := "strong" 56 | url := "" 57 | 58 | hostname := ds.Ip 59 | port := ds.Port 60 | username := ds.Username 61 | password := ds.Password 62 | if username != "" { 63 | url = "mongodb://" + username + ":" + password + "@" + hostname + ":" + strconv.Itoa(port) 64 | } else { 65 | url = "mongodb://" + hostname + ":" + strconv.Itoa(port) 66 | } 67 | session, err := mgo.Dial(url) 68 | if err != nil { 69 | Getlog().Error("Connect to %s failed=>" + url + err.Error()) 70 | return nil, err 71 | } 72 | // maximum pooled connections. the overall established sockets 73 | // should be lower than this value(will block otherwise) 74 | session.SetPoolLimit(256) 75 | session.SetSocketTimeout(10 * time.Minute) 76 | 77 | if err := session.Ping(); err != nil { 78 | Getlog().Error("session.Ping=>" + url + err.Error()) 79 | return nil, err 80 | } 81 | 82 | // Switch the session to a eventually behavior. In that case session 83 | // may read for any secondary node. default mode is mgo.Strong 84 | switch mode { 85 | case "primary": 86 | session.SetMode(mgo.Primary, true) 87 | break 88 | case "secondary": 89 | session.SetMode(mgo.SecondaryPreferred, true) 90 | break 91 | default: 92 | session.SetMode(mgo.Strong, true) 93 | break 94 | 95 | } 96 | 97 | log.Printf("New session to %s successfully", url) 98 | return &MongoConn{Session: session, URL: url}, nil 99 | } 100 | 101 | func (conn *MongoConn) Close() { 102 | log.Printf("Close session with %s", conn.URL) 103 | conn.Session.Close() 104 | } 105 | 106 | func (conn *MongoConn) IsGood() bool { 107 | if err := conn.Session.Ping(); err != nil { 108 | return false 109 | } 110 | 111 | return true 112 | } 113 | func (conn *MongoConn) HasOplogNs() bool { 114 | if ns, err := conn.Session.DB("local").CollectionNames(); err == nil { 115 | for _, table := range ns { 116 | if table == OplogNS { 117 | return true 118 | } 119 | } 120 | } 121 | return false 122 | } 123 | 124 | func (conn *MongoConn) Getdatabasenames() (databases []string, err error) { 125 | if databases, err = conn.Session.DatabaseNames(); err != nil { 126 | Getlog().Error("Couldn't get databases from remote server==>" + err.Error()) 127 | return nil, err 128 | } 129 | return databases, nil 130 | } 131 | 132 | //获得指定schema所有的collection名,3.0以上才能获得 133 | func (conn *MongoConn) Getcollectionnames(databasename string) (collectionnames []string, err error) { 134 | //collectionnames = make([]map[string]interface{}, 0) 135 | //query := conn.Session.DB(databasename).C("system.namespaces").Find(nil) 136 | //err = query.All(&collectionnames) 137 | collectionnames, err = conn.Session.DB(databasename).CollectionNames() 138 | if err != nil { 139 | Getlog().Error("Couldn't get collections from database==>" + databasename + err.Error()) 140 | return nil, err 141 | } 142 | 143 | return collectionnames, nil 144 | } 145 | 146 | // 147 | func (conn *MongoConn) Getcollectionnames2(databasename string) (collectionnames []map[string]interface{}, err error) { 148 | collectionnames = make([]map[string]interface{}, 0) 149 | query := conn.Session.DB(databasename).C("tap.system.namespaces").Find(nil) 150 | 151 | err = query.All(&collectionnames) 152 | //collectionnames, err = conn.Session.DB(databasename).CollectionNames() 153 | if err != nil { 154 | Getlog().Error("Couldn't get collections from database==>" + databasename + err.Error()) 155 | return nil, err 156 | } 157 | 158 | return collectionnames, nil 159 | } 160 | 161 | //获得指定schema指定collection的数据条数 162 | func (conn *MongoConn) Getcollectionrows(databasename string, collectionname string) (cltinf COLLECTIONINFO, err error) { 163 | 164 | var ncount int 165 | 166 | ncount, err = conn.Session.DB(databasename).C(collectionname).Count() 167 | 168 | if err != nil { 169 | Getlog().Error("Couldn't get collections rows from database,collection==>" + databasename + collectionname + err.Error()) 170 | ncount = -1 171 | } 172 | cltinf = COLLECTIONINFO{Dbname: databasename, Collectionname: collectionname, Ncount: ncount} 173 | 174 | return cltinf, err 175 | 176 | } 177 | 178 | //获得指定schema指定collection的所有数据 179 | //返回数据为[]map[string]interface{} 180 | func (conn *MongoConn) Getcollectiondatas(databasename string, collectionname string) (result []map[string]interface{}, err error) { 181 | result = make([]map[string]interface{}, 0) 182 | query := conn.Session.DB(databasename).C(collectionname).Find(nil) 183 | 184 | err = query.All(&result) 185 | if err != nil { 186 | fmt.Println(err) 187 | return nil, err 188 | } 189 | 190 | return result, nil 191 | 192 | } 193 | 194 | //获得collection的所有key,不包含子key 195 | func (conn *MongoConn) Getcollectionkeys(databasename string, collectionname string) (keys []string, err error) { 196 | keys = make([]string, 0) 197 | datas, err := conn.Getcollectiondatas(databasename, collectionname) 198 | 199 | if err != nil { 200 | fmt.Println(err) 201 | return nil, err 202 | } 203 | for idx, datamap := range datas { 204 | if idx > 100000 { 205 | break 206 | } 207 | for key, _ := range datamap { 208 | // fmt.Println(reflect.TypeOf(value)) 209 | if !Isinarry(keys, key) { 210 | keys = append(keys, key) 211 | } 212 | 213 | } 214 | 215 | } 216 | 217 | return keys, nil 218 | 219 | } 220 | 221 | //通过mapreduce获得collection的所有key,不包含子key 222 | // mr = db.runCommand({ 223 | // "mapreduce" : "my_collection", 224 | // "map" : function() { 225 | // for (var key in this) { emit(key, null); } 226 | // }, 227 | // "reduce" : function(key, stuff) { return null; }, 228 | // "out": "my_collection" + "_keys" 229 | // }) 230 | 231 | // job := &mgo.MapReduce{ 232 | // Map: "function() { emit(this.n, 1) }", 233 | // Reduce: "function(key, values) { return Array.sum(values) }", 234 | // } 235 | // _, err := collection.Find(nil).MapReduce(job, &result) 236 | // if err != nil { 237 | // return err 238 | // } 239 | func (conn *MongoConn) Getcollectionkeysbymapreduce(databasename string, collectionname string) (keys []string, err error) { 240 | keys = make([]string, 0) 241 | 242 | job := &mgo.MapReduce{ 243 | Map: "function() { for (var key in this) { emit(key, null);} }", 244 | Reduce: "function(key, value) { return Array.sum(key); }", 245 | Out: "_keys", 246 | } 247 | //result := make([]map[string]interface{}, 0) 248 | var rsult2 interface{} 249 | _, err = conn.Session.DB(databasename).C(collectionname).Find(nil).MapReduce(job, &rsult2) 250 | if err != nil { 251 | return nil, err 252 | } 253 | fmt.Println(rsult2) 254 | //db[mr.result].distinct("_id") 255 | // for key, value := range result { 256 | // fmt.Println(key) 257 | // fmt.Println(value) 258 | // } 259 | return keys, nil 260 | 261 | } 262 | 263 | //获得collection的字段信息,包括 264 | //字段名称、字段类型、字段长度、是否主键、是否允许为空、是否为父、是否自动增长 265 | func (conn *MongoConn) Getcollectionfieldinfo(databasename string, collectionname string) (fieldinfomap map[string]DATASOURCETABLEFIELD, err error) { 266 | mongodbkeys := getmongodbkeys() 267 | fieldinfomap = make(map[string]DATASOURCETABLEFIELD, 0) 268 | datas, err := conn.Getcollectiondatas(databasename, collectionname) 269 | 270 | if err != nil { 271 | fmt.Println(err) 272 | return nil, err 273 | } 274 | // Getlog().Debug("conn.Getcollectiondatas==>" + orm.ToStr(datas)) 275 | for i := 0; i < len(datas); i++ { 276 | 277 | datamap := datas[i] 278 | 279 | for key, value := range datamap { 280 | _, ok := fieldinfomap[key] 281 | if !ok { 282 | isprimary := "0" 283 | isauto := "0" 284 | isnull := "1" 285 | isparent := "0" 286 | fieldlength := 255 287 | fieldtype := "" 288 | fieldtype = Getfieldtype(value) 289 | if fieldtype == "Array" { 290 | isparent = "1" 291 | } 292 | if strings.Contains(mongodbkeys, key) { 293 | isprimary = "1" 294 | isauto = "1" 295 | isnull = "0" 296 | } 297 | 298 | dtf := DATASOURCETABLEFIELD{Datasource: databasename, Tablename: collectionname, Fieldname: key, Fieldtype: fieldtype, Isprimary: isprimary, Isnull: isnull, Isparent: isparent, Isauto: isauto, Fieldlength: fieldlength} 299 | fieldinfomap[key] = dtf 300 | } 301 | 302 | } 303 | 304 | } 305 | 306 | return fieldinfomap, nil 307 | 308 | } 309 | 310 | //获得collection的字段信息,包括 311 | //字段名称、字段类型、字段长度、是否主键、是否允许为空、是否为父、是否自动增长 312 | func (conn *MongoConn) Getcollectionfieldinfochild(databasename string, collectionname string, fieldname string, maptype string) (fieldinfomap map[string]DATASOURCETABLEFIELDCHILD, err error) { 313 | mongodbkeys := getmongodbkeys() 314 | fieldinfomap = make(map[string]DATASOURCETABLEFIELDCHILD, 0) 315 | datas, err := conn.Getcollectiondatasbyfieldnames(databasename, collectionname, fieldname) 316 | //fmt.Println("len(datas)==>") 317 | //fmt.Println(len(datas)) 318 | if err != nil { 319 | fmt.Println(err) 320 | return nil, err 321 | } 322 | for i := 0; i < len(datas); i++ { 323 | 324 | datamap := datas[i] 325 | 326 | for key, value := range datamap { 327 | //fmt.Println(key) 328 | //fmt.Println(value) 329 | if key != fieldname { 330 | continue 331 | } 332 | if maptype == "map" { 333 | valuemap := value.(map[string]interface{}) 334 | for key2, value2 := range valuemap { 335 | _, ok := fieldinfomap[key2] 336 | if !ok { 337 | isprimary := "0" 338 | isauto := "0" 339 | isnull := "1" 340 | isparent := "0" 341 | fieldlength := 255 342 | fieldtype := "" 343 | fieldtype = Getfieldtype(value2) 344 | if fieldtype == "Array" { 345 | isparent = "1" 346 | } 347 | if strings.Contains(mongodbkeys, key2) { 348 | isprimary = "1" 349 | isauto = "0" 350 | isnull = "0" 351 | } 352 | 353 | dtf := DATASOURCETABLEFIELDCHILD{Datasource: databasename, Tablename: collectionname, Fieldname: fieldname, Childfieldname: key2, Fieldtype: fieldtype, Isprimary: isprimary, Isnull: isnull, Isparent: isparent, Isauto: isauto, Fieldlength: fieldlength} 354 | fieldinfomap[key2] = dtf 355 | } 356 | } 357 | } else if maptype == "maparray" { 358 | valuemap := value.([]interface{}) 359 | // for _, valuemap2 := range valuemap { 360 | // valuemap3 := valuemap2.(map[string]interface{}) 361 | // for key3, value3 := range valuemap3 { 362 | // _, ok := fieldinfomap[key3] 363 | // if !ok { 364 | // isprimary := "0" 365 | // isauto := "0" 366 | // isnull := "1" 367 | // isparent := "0" 368 | // fieldlength := 255 369 | // fieldtype := "" 370 | // fieldtype = Getfieldtype(value3) 371 | // if fieldtype == "Array" { 372 | // isparent = "1" 373 | // } 374 | // if key3 == "_id" || key3 == "idNo" || key3 == "key" { 375 | // isprimary = "1" 376 | // isauto = "0" 377 | // isnull = "0" 378 | // } 379 | 380 | // dtf := DATASOURCETABLEFIELDCHILD{Datasource: databasename, Tablename: collectionname, Fieldname: fieldname, Childfieldname: key3, Fieldtype: fieldtype, Isprimary: isprimary, Isnull: isnull, Isparent: isparent, Isauto: isauto, Fieldlength: fieldlength} 381 | // fieldinfomap[key3] = dtf 382 | // } 383 | // } 384 | // } 385 | loopfieldnames(databasename, collectionname, fieldname, &fieldinfomap, valuemap) 386 | } 387 | 388 | } 389 | 390 | } 391 | 392 | return fieldinfomap, nil 393 | 394 | } 395 | 396 | //获得mongodb的版本号 OK 397 | func (conn *MongoConn) GetDBVersion() (string, error) { 398 | var result bson.M 399 | err := conn.Session.Run(bson.D{{"buildInfo", 1}}, &result) 400 | if err != nil { 401 | return "", err 402 | } 403 | 404 | if version, ok := result["version"]; ok { 405 | if s, ok := version.(string); ok { 406 | return s, nil 407 | } 408 | return "", fmt.Errorf("version type assertion error[%v]", version) 409 | } 410 | return "", fmt.Errorf("version not found") 411 | } 412 | 413 | //获得collection的索引 414 | func (conn *MongoConn) Getcollectionindexs(databasename string, collectionname string) (index []mgo.Index, err error) { 415 | 416 | index, err = conn.Session.DB(databasename).C(collectionname).Indexes() 417 | 418 | if err != nil { 419 | Getlog().Error("Couldn't get collections indexs from database,collection" + databasename + collectionname + err.Error()) 420 | return nil, err 421 | } 422 | 423 | return index, nil 424 | 425 | } 426 | 427 | //判断字符串数组中是否包含指定字符串 428 | func Isinarry(target []string, source string) bool { 429 | for _, t := range target { 430 | if t == source { 431 | return true 432 | } 433 | } 434 | return false 435 | } 436 | 437 | //获得指定key的数据,如fieldnames为'a','b','c',获得a b c列数据 438 | func (conn *MongoConn) Getcollectiondatasbyfieldnames(databasename string, collectionname string, fieldnames string, fdt ...FromDatasourceTableinfo2) (result []map[string]interface{}, err error) { 439 | result = make([]map[string]interface{}, 0) 440 | 441 | // only获得 name field数据 442 | 443 | projection := bson.D{} 444 | fieldnamesarr := strings.Split(fieldnames, ",") 445 | for _, fieldname := range fieldnamesarr { 446 | fieldname2 := strings.Split(fieldname, ".") 447 | if len(fieldname2) > 1 { 448 | if fieldname2[1] == "" || fieldname2[1] == "no" { 449 | projection = append(projection, bson.DocElem{Name: fieldname2[0], Value: 1}) 450 | } else { 451 | projection = append(projection, bson.DocElem{Name: fieldname, Value: 1}) 452 | } 453 | } else { 454 | projection = append(projection, bson.DocElem{Name: fieldname, Value: 1}) 455 | } 456 | 457 | } 458 | iniconf, err := config.NewConfig("ini", "conf/myconf.ini") 459 | if err != nil { 460 | 461 | return nil, err 462 | } 463 | limitDataCountFortest := iniconf.DefaultInt("parameters::limitDataCountFortest", 0) 464 | var query *mgo.Query 465 | filter := "" 466 | if fdt != nil { 467 | if len(fdt) > 0 { 468 | filter, err = Getfromdatasourcefilter(fdt[0]) 469 | 470 | if err != nil { 471 | Getlog().Error("Getfromdatasourcefilter(fdt[0])==>" + err.Error()) 472 | return nil, err 473 | } 474 | 475 | } 476 | 477 | } 478 | 479 | if filter != "" { 480 | filterc := bson.D{} 481 | filterarr := strings.Split(filter, ",") 482 | for _, filtea := range filterarr { 483 | filterc = append(filterc, bson.DocElem{Name: "key", Value: filtea}) 484 | } 485 | if limitDataCountFortest == 0 { 486 | query = conn.Session.DB(databasename).C(collectionname).Find(filterc).Select(projection) 487 | } else { 488 | query = conn.Session.DB(databasename).C(collectionname).Find(filterc).Select(projection).Limit(limitDataCountFortest) 489 | } 490 | } else { 491 | if limitDataCountFortest == 0 { 492 | query = conn.Session.DB(databasename).C(collectionname).Find(nil).Select(projection) 493 | } else { 494 | query = conn.Session.DB(databasename).C(collectionname).Find(nil).Select(projection).Limit(limitDataCountFortest) 495 | } 496 | } 497 | 498 | err = query.All(&result) 499 | 500 | if err != nil { 501 | Getlog().Error("query.All(&result)==>" + err.Error()) 502 | return nil, err 503 | } 504 | //fmt.Println(result) 505 | return result, nil 506 | } 507 | 508 | //获得指定key的数据,如fieldnames为'a','b','c',获得a b c列数据 509 | func (conn *MongoConn) Getcollectionchilddatasbyfieldnames(databasename string, collectionname string, parentfieldname, childfieldnames string) (result []map[string]interface{}, err error) { 510 | result = make([]map[string]interface{}, 0) 511 | 512 | projection := bson.D{} 513 | childfieldnamesarr := strings.Split(childfieldnames, ",") 514 | for _, childfieldname := range childfieldnamesarr { 515 | projection = append(projection, bson.DocElem{Name: parentfieldname + "." + childfieldname, Value: 1}) 516 | } 517 | iniconf, err := config.NewConfig("ini", "conf/myconf.ini") 518 | if err != nil { 519 | 520 | return nil, err 521 | } 522 | limitDataCountFortest := iniconf.DefaultInt("parameters::limitDataCountFortest", 0) 523 | var query *mgo.Query 524 | 525 | if limitDataCountFortest == 0 { 526 | query = conn.Session.DB(databasename).C(collectionname).Find(nil).Select(projection) 527 | 528 | } else { 529 | query = conn.Session.DB(databasename).C(collectionname).Find(nil).Select(projection).Limit(limitDataCountFortest) 530 | 531 | } 532 | 533 | err = query.All(&result) 534 | 535 | if err != nil { 536 | fmt.Println(err) 537 | return nil, err 538 | } 539 | return result, nil 540 | } 541 | 542 | //获得指定key的一行数据,如fieldnames为'a','b','c',获得a b c列数据 543 | func (conn *MongoConn) Getcollectiondatasbyfieldnamesonerow(databasename string, collectionname string, fieldnames string) (result []orm.Params, err error) { 544 | result = make([]orm.Params, 0) 545 | bm := make(bson.M, 0) 546 | fieldnamearr := strings.Split(fieldnames, ",") 547 | for _, fieldname := range fieldnamearr { 548 | bm[fieldname] = 1 549 | } 550 | // only获得 name field数据 551 | //err := collection.Find(nil).Select(bson.M{"name": 1}).One(&result) 552 | query := conn.Session.DB(databasename).C(collectionname).Find(nil).Select(bm).Limit(1) 553 | 554 | err = query.All(&result) 555 | if err != nil { 556 | fmt.Println(err) 557 | return nil, err 558 | } 559 | 560 | return result, nil 561 | 562 | } 563 | 564 | //获得一行数据 565 | func (conn *MongoConn) Getcollectiondatasrow(databasename string, collectionname string) (result []orm.Params, err error) { 566 | result = make([]orm.Params, 0) 567 | query := conn.Session.DB(databasename).C(collectionname).Find(nil).Limit(1) 568 | 569 | err = query.All(&result) 570 | if err != nil { 571 | fmt.Println(err) 572 | return nil, err 573 | } 574 | 575 | return result, nil 576 | 577 | } 578 | func loopfieldnames(databasename, collectionname, fieldname string, fieldinfomap *map[string]DATASOURCETABLEFIELDCHILD, value interface{}) { 579 | mongodbkeys := getmongodbkeys() 580 | valuemap := value.([]interface{}) 581 | for _, valuemap2 := range valuemap { 582 | valuemap3 := valuemap2.(map[string]interface{}) 583 | for key3, value3 := range valuemap3 { 584 | _, ok := (*fieldinfomap)[key3] 585 | if !ok { 586 | isprimary := "0" 587 | isauto := "0" 588 | isnull := "1" 589 | isparent := "0" 590 | fieldlength := 255 591 | fieldtype := "" 592 | fieldtype = Getfieldtype(value3) 593 | if fieldtype == "Array" { 594 | isparent = "1" 595 | } 596 | if strings.Contains(mongodbkeys, key3) { 597 | isprimary = "1" 598 | isauto = "0" 599 | isnull = "0" 600 | } 601 | 602 | dtf := DATASOURCETABLEFIELDCHILD{Datasource: databasename, Tablename: collectionname, Fieldname: fieldname, Childfieldname: key3, Fieldtype: fieldtype, Isprimary: isprimary, Isnull: isnull, Isparent: isparent, Isauto: isauto, Fieldlength: fieldlength} 603 | (*fieldinfomap)[key3] = dtf 604 | if fieldtype == "Array" && key3 == "fieldname" { 605 | fmt.Println("loop Array==>" + key3) 606 | //fmt.Println(value3) 607 | loopfieldnames(databasename, collectionname, fieldname, fieldinfomap, value3) 608 | } 609 | } 610 | } 611 | } 612 | } 613 | func getmongodbkeys() string { 614 | iniconf, err := config.NewConfig("ini", "conf/myconf.ini") 615 | if err != nil { 616 | Getlog().Error(err.Error()) 617 | return "" 618 | } 619 | return iniconf.String("parameters::mongodbkeys") 620 | 621 | } 622 | 623 | //filterkey:Country;fieldnames: subCatalogs.displayEN,subCatalogs.displayZH 624 | //filterkey:Country;fieldnames: subCatalogs.displayEN,subCatalogs.subCatalogs.displayEN,subCatalogs.subCatalogs.displayZH 625 | //filterkey:Country;fieldnames: subCatalogs.subCatalogs.displayEN,subCatalogs.subCatalogs.subCatalogs.displayEN,subCatalogs.subCatalogs.subCatalogs.displayZH 626 | //通过key获得数据 627 | func (conn *MongoConn) Getcollectiondataforregion(databasename, collectionname, filterkey string, fieldnames string) (result []map[string]interface{}, err error) { 628 | 629 | projection := bson.D{} 630 | fieldnamesarr := strings.Split(fieldnames, ",") 631 | for _, fieldname := range fieldnamesarr { 632 | 633 | projection = append(projection, bson.DocElem{Name: fieldname, Value: 1}) 634 | 635 | } 636 | var query *mgo.Query 637 | 638 | filterc := bson.D{} 639 | 640 | filterc = append(filterc, bson.DocElem{Name: "key", Value: filterkey}) 641 | 642 | query = conn.Session.DB(databasename).C(collectionname).Find(filterc).Select(projection) 643 | 644 | err = query.All(&result) 645 | 646 | if err != nil { 647 | fmt.Println(err) 648 | return nil, err 649 | } 650 | //fmt.Println(result) 651 | return result, nil 652 | } 653 | 654 | //filterkey:Country;fieldnames: subCatalogs.displayEN,subCatalogs.displayZH 655 | //filterkey:Country;fieldnames: subCatalogs.displayEN,subCatalogs.subCatalogs.displayEN,subCatalogs.subCatalogs.displayZH 656 | //filterkey:Country;fieldnames: subCatalogs.subCatalogs.displayEN,subCatalogs.subCatalogs.subCatalogs.displayEN,subCatalogs.subCatalogs.subCatalogs.displayZH 657 | //获得父子表数据 658 | func (conn *MongoConn) Getcollectiondataforparentchild(databasename, collectionname, fieldnames string, filterkey ...interface{}) (result []map[string]interface{}, err error) { 659 | 660 | projection := bson.D{} 661 | fieldnamesarr := strings.Split(fieldnames, ",") 662 | for _, fieldname := range fieldnamesarr { 663 | 664 | projection = append(projection, bson.DocElem{Name: fieldname, Value: 1}) 665 | 666 | } 667 | var query *mgo.Query 668 | if filterkey != nil { 669 | 670 | if len(filterkey) > 0 { 671 | 672 | filterc := bson.D{} 673 | 674 | filterc = append(filterc, bson.DocElem{Name: "key", Value: filterkey[0].(string)}) 675 | 676 | query = conn.Session.DB(databasename).C(collectionname).Find(filterc).Select(projection) 677 | } 678 | } else { 679 | query = conn.Session.DB(databasename).C(collectionname).Find(nil).Select(projection) 680 | } 681 | 682 | err = query.All(&result) 683 | 684 | if err != nil { 685 | fmt.Println(err) 686 | return nil, err 687 | } 688 | //fmt.Println(result) 689 | return result, nil 690 | } 691 | -------------------------------------------------------------------------------- /models/mssqlconn.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "fmt" 5 | 6 | "database/sql" 7 | _ "log" 8 | _ "net/url" 9 | 10 | _ "github.com/astaxie/beego/orm" 11 | _ "github.com/denisenkom/go-mssqldb" 12 | ) 13 | 14 | func newMssqlConn(ds DATASOURCE) (db *sql.DB, err error) { 15 | 16 | // query := url.Values{} 17 | // //query.Add("app name", "MyAppName") 18 | 19 | // u := &url.URL{ 20 | // Scheme: "sqlserver", 21 | // User: url.UserPassword(ds.Username, ds.Password), 22 | // Host: fmt.Sprintf("%s:%d", ds.Ip, ds.Port), 23 | // Path: ds.Schema, // if connecting to an instance instead of a port 24 | // RawQuery: query.Encode(), 25 | // } 26 | // var conn *mssql.Connector 27 | // conn, err = mssql.NewConnector(u.String()) 28 | // if err != nil { 29 | // return nil, err 30 | // } 31 | // db = sql.OpenDB(conn) 32 | //db, err := sql.Open("sqlserver", u.String()) 33 | //db.SetMaxOpenConns(200) 34 | //db.SetMaxIdleConns(50) 35 | connString := fmt.Sprintf("server=%s;port%d;database=%s;user id=%s;password=%s", ds.Ip, ds.Port, ds.Schema, ds.Username, ds.Password) 36 | db, err = sql.Open("mssql", connString) 37 | if err != nil { 38 | return nil, err 39 | } 40 | //`sqlserver://username:password@host/instance?param1=value¶m2=value` 41 | 42 | return db, nil 43 | } 44 | func Getmssqltablenames(ds DATASOURCE) (tablenames []DATASOURCETABLE, err error) { 45 | tablenames = make([]DATASOURCETABLE, 0) 46 | sql := "SELECT '" + ds.Datasource + "' as datasource,name as tablename FROM sysobjects where xtype='U'" 47 | db, err := newMssqlConn(ds) 48 | if err != nil { 49 | Getlog().Error("Getalltablenames()==>" + err.Error()) 50 | return nil, err 51 | } 52 | 53 | rows, err := db.Query(sql) 54 | if err != nil { 55 | Getlog().Error("db.Query(sql)==>" + err.Error()) 56 | return nil, err 57 | } 58 | for rows.Next() { 59 | dst := DATASOURCETABLE{} 60 | err = rows.Scan(&dst.Datasource, &dst.Tablename) 61 | if err != nil { 62 | Getlog().Error("rows.Scan(&dst.Datasource, &dst.Tablename)==>" + err.Error()) 63 | return nil, err 64 | } 65 | tablenames = append(tablenames, dst) 66 | } 67 | 68 | return tablenames, nil 69 | } 70 | func Getmssqltablefields(ds DATASOURCE, tablename string) (fieldsmap []DATASOURCETABLEFIELD, err error) { 71 | fieldsmap = make([]DATASOURCETABLEFIELD, 0) 72 | sql := "SELECT '" + ds.Datasource + "' as datasource,a.name as tablename,b.name as fieldname " 73 | sql = sql + ",c.name as fieldtype,b.isnullable as isnull " 74 | sql = sql + ",(case d.keyno when '1' then '1' else '0' end ) as isprimary,b.length as fieldlength " 75 | sql = sql + " from sysobjects a " 76 | sql = sql + " inner join syscolumns b on a.id=b.id " 77 | sql = sql + " inner join SYSTYPES c on b.xtype=c.xtype " 78 | sql = sql + " left join sysindexkeys d on d.id=a.id and b.colid=d.colid " 79 | sql = sql + " where a.name =?" 80 | db, err := newMssqlConn(ds) 81 | if err != nil { 82 | Getlog().Error("newMssqlConn()==>" + err.Error()) 83 | return nil, err 84 | } 85 | rows, err := db.Query(sql, tablename) 86 | if err != nil { 87 | Getlog().Error("db.Query(sql)==>" + err.Error()) 88 | return nil, err 89 | } 90 | for rows.Next() { 91 | dst := DATASOURCETABLEFIELD{} 92 | err = rows.Scan(&dst.Datasource, &dst.Tablename, &dst.Fieldname, &dst.Fieldtype, &dst.Isnull, &dst.Isprimary, &dst.Fieldlength) 93 | if err != nil { 94 | Getlog().Error("rows.Scan(&dst.Datasource, &dst.Tablename)==>" + err.Error()) 95 | return nil, err 96 | } 97 | fieldsmap = append(fieldsmap, dst) 98 | } 99 | 100 | return fieldsmap, nil 101 | } 102 | func Getmssqltabledatacount(ds DATASOURCE, tablename string) (ncount int, err error) { 103 | countsql := "select count(1) as ncount from " + tablename 104 | db, err := newMssqlConn(ds) 105 | if err != nil { 106 | Getlog().Error("newMssqlConn()==>" + err.Error()) 107 | return 0, err 108 | } 109 | rows, err := db.Query(countsql) 110 | if err != nil { 111 | Getlog().Error("db.Query(sql)==>" + err.Error()) 112 | return 0, err 113 | } 114 | for rows.Next() { 115 | err = rows.Scan(&ncount) 116 | if err != nil { 117 | Getlog().Error("rows.Scan()==>" + err.Error()) 118 | return 0, err 119 | } 120 | } 121 | return ncount, nil 122 | 123 | } 124 | -------------------------------------------------------------------------------- /models/mysqlconn.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "fmt" 5 | 6 | "database/sql" 7 | _ "log" 8 | "strconv" 9 | "strings" 10 | _ "sync" 11 | "time" 12 | 13 | "github.com/astaxie/beego/config" 14 | 15 | "github.com/astaxie/beego/orm" 16 | _ "github.com/go-sql-driver/mysql" 17 | ) 18 | 19 | func GetMysqlConn(ds DATASOURCE) (db *sql.DB, err error) { 20 | db, err = orm.GetDB(ds.Datasource) 21 | if err != nil { 22 | Getlog().Error("orm.GetDB()==>" + err.Error()) 23 | 24 | } 25 | Getlog().Debug("orm.GetDB()==>ok") 26 | return db, nil 27 | } 28 | func NewMysqlConn(ds DATASOURCE) error { 29 | 30 | sb := make([]string, 0) 31 | sb = append(sb, ds.Username+":") 32 | sb = append(sb, ds.Password+"@tcp(") 33 | sb = append(sb, ds.Ip+":") 34 | sb = append(sb, strconv.Itoa(ds.Port)+")/") 35 | sb = append(sb, ds.Schema+"?charset=utf8&loc=Asia%2FShanghai&parseTime=true") 36 | 37 | datasourcename := strings.Join(sb, "") 38 | fmt.Println(datasourcename) 39 | //datasourcename:-->root:root@tcp(localhost:3306)/skl-ticket?charset=utf8 40 | //tcp:localhost:3306*mydb/root/rootroot 41 | // err := orm.RegisterDriver("mysql", orm.DRMySQL) 42 | // if err != nil { 43 | // log.Fatal(err) 44 | // } 45 | 46 | err := orm.RegisterDataBase(ds.Datasource, "mysql", datasourcename) 47 | if err != nil { 48 | 49 | return err 50 | } 51 | iniconf, err := config.NewConfig("ini", "conf/myconf.ini") 52 | if err != nil { 53 | return err 54 | } 55 | maxOpenConns := iniconf.DefaultInt("parameters::maxOpenConns", 150) 56 | maxIdleConns := iniconf.DefaultInt("parameters::maxIdleConns", 100) 57 | orm.SetMaxOpenConns(ds.Datasource, maxOpenConns) 58 | orm.SetMaxIdleConns(ds.Datasource, maxIdleConns) 59 | location, err := time.LoadLocation("Asia/Shanghai") 60 | if err != nil { 61 | 62 | return err 63 | } 64 | err = orm.SetDataBaseTZ(ds.Datasource, location) 65 | if err != nil { 66 | 67 | return err 68 | } 69 | //orm.DefaultTimeLoc = location 70 | return nil 71 | 72 | } 73 | func Getmysqltablenames(ds DATASOURCE) (tablenames []DATASOURCETABLE, err error) { 74 | tablenames = make([]DATASOURCETABLE, 0) 75 | sql := "SELECT '" + ds.Datasource + "' as datasource,table_name as tablename FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_schema = DATABASE() and table_name not REGEXP '.*_copy.*' and table_name not REGEXP '.*[0-9]{8}.*' " 76 | db, err := GetMysqlConn(ds) 77 | if err != nil { 78 | Getlog().Error("Getalltablenames()==>" + err.Error()) 79 | return nil, err 80 | } 81 | o, err := orm.NewOrmWithDB("mysql", ds.Datasource, db) 82 | if err != nil { 83 | Getlog().Error("orm.NewOrmWithDB()==>" + err.Error()) 84 | return nil, err 85 | } 86 | _, err = o.Raw(sql).QueryRows(&tablenames) 87 | 88 | if err != nil { 89 | Getlog().Error("o.Raw(sql).QueryRows()==>" + err.Error()) 90 | return nil, err 91 | } 92 | 93 | return tablenames, nil 94 | } 95 | func Getmysqltablefields(ds DATASOURCE, tablename string) (fieldsmap []DATASOURCETABLEFIELD, err error) { 96 | sql := "SELECT '" + ds.Datasource + "' as datasource,TABLE_NAME as tablename,COLUMN_NAME as fieldname " 97 | sql = sql + ",DATA_TYPE as fieldtype,case IS_NULLABLE when 'YES' then '1' else '0' end as Isnull ,COLUMN_COMMENT as comment,COLUMN_DEFAULT as defaultvalue " 98 | sql = sql + ",case COLUMN_KEY when 'PRI' then '1' else '0' end as isprimary,CHARACTER_MAXIMUM_LENGTH as fieldlength " 99 | sql = sql + " FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = ?" 100 | db, err := GetMysqlConn(ds) 101 | if err != nil { 102 | Getlog().Error("GetMysqlConn()==>" + err.Error()) 103 | return nil, err 104 | } 105 | o, err := orm.NewOrmWithDB("mysql", ds.Datasource, db) 106 | if err != nil { 107 | Getlog().Error("orm.NewOrmWithDB()==>" + err.Error()) 108 | return nil, err 109 | } 110 | 111 | fieldsmap = make([]DATASOURCETABLEFIELD, 0) 112 | _, err = o.Raw(sql, tablename).QueryRows(&fieldsmap) 113 | 114 | if err != nil { 115 | Getlog().Error("o.Raw(sql).QueryRows()==>" + err.Error()) 116 | return nil, err 117 | } 118 | 119 | return fieldsmap, nil 120 | } 121 | func Getmysqltabledatacount(ds DATASOURCE, tablename string) (ncount int, err error) { 122 | countsql := "select count(1) as ncount from " + tablename 123 | db, err := GetMysqlConn(ds) 124 | if err != nil { 125 | Getlog().Error("GetMysqlConn()==>" + err.Error()) 126 | return 0, err 127 | } 128 | rows, err := db.Query(countsql) 129 | if err != nil { 130 | Getlog().Error("db.Query(sql)==>" + err.Error()) 131 | return 0, err 132 | } 133 | for rows.Next() { 134 | err = rows.Scan(&ncount) 135 | if err != nil { 136 | Getlog().Error("rows.Scan()==>" + err.Error()) 137 | return 0, err 138 | } 139 | } 140 | return ncount, nil 141 | 142 | } 143 | -------------------------------------------------------------------------------- /models/oracleconn.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "fmt" 5 | 6 | "database/sql" 7 | _ "log" 8 | "strconv" 9 | "strings" 10 | _ "sync" 11 | "time" 12 | 13 | "github.com/astaxie/beego/config" 14 | "github.com/astaxie/beego/orm" 15 | _ "github.com/mattn/go-oci8" 16 | ) 17 | 18 | func GetOracleConn2(ds DATASOURCE) (db *sql.DB, err error) { 19 | connString := fmt.Sprintf("%s/%s@%s:%d/%s", ds.Username, ds.Password, ds.Ip, ds.Port, ds.Schema) 20 | Getlog().Debug("connString==>" + orm.ToStr(connString)) 21 | db, err = sql.Open("goracle", connString) 22 | if err != nil { 23 | Getlog().Error("sql.Open('goracle', connString)==>" + err.Error()) 24 | return nil, err 25 | } 26 | err = db.Ping() 27 | if err != nil { 28 | Getlog().Error("db.Ping==>" + err.Error()) 29 | return nil, err 30 | } 31 | Getlog().Debug("GetOracleConn2 db==>ok" + orm.ToStr(db)) 32 | return db, nil 33 | } 34 | 35 | func GetOracleConn(ds DATASOURCE) (db *sql.DB, err error) { 36 | db, err = orm.GetDB(ds.Datasource) 37 | if err != nil { 38 | Getlog().Error("orm.GetOracleConn()==>" + err.Error()) 39 | 40 | } 41 | Getlog().Debug("orm.GetOracleConn()==>ok") 42 | return db, nil 43 | } 44 | func NewOracleConn(ds DATASOURCE) error { 45 | 46 | sb := make([]string, 0) 47 | sb = append(sb, ds.Username+"/") 48 | sb = append(sb, ds.Password+"@") 49 | sb = append(sb, ds.Ip+":") 50 | sb = append(sb, strconv.Itoa(ds.Port)+"/") 51 | sb = append(sb, ds.Schema) 52 | 53 | datasourcename := strings.Join(sb, "") 54 | fmt.Println(datasourcename) 55 | 56 | err := orm.RegisterDriver("oci8", orm.DROracle) 57 | if err != nil { 58 | Getlog().Error("orm.RegisterDriver()==>" + err.Error()) 59 | } 60 | 61 | err = orm.RegisterDataBase(ds.Datasource, "oci8", datasourcename) 62 | if err != nil { 63 | 64 | return err 65 | } 66 | iniconf, err := config.NewConfig("ini", "conf/myconf.ini") 67 | if err != nil { 68 | return err 69 | } 70 | maxOpenConns := iniconf.DefaultInt("parameters::maxOpenConns", 150) 71 | maxIdleConns := iniconf.DefaultInt("parameters::maxIdleConns", 100) 72 | orm.SetMaxOpenConns(ds.Datasource, maxOpenConns) 73 | orm.SetMaxIdleConns(ds.Datasource, maxIdleConns) 74 | location, err := time.LoadLocation("Asia/Shanghai") 75 | if err != nil { 76 | 77 | return err 78 | } 79 | err = orm.SetDataBaseTZ(ds.Datasource, location) 80 | if err != nil { 81 | 82 | return err 83 | } 84 | //orm.DefaultTimeLoc = location 85 | return nil 86 | 87 | } 88 | 89 | func Getoracletablenames(ds DATASOURCE) (tablenames []DATASOURCETABLE, err error) { 90 | tablenames = make([]DATASOURCETABLE, 0) 91 | sql := "SELECT '" + ds.Datasource + "' as datasource,table_name as tablename FROM USER_TABLES where not REGEXP_LIKE (table_name, '.*_COPY.*' ) and not REGEXP_LIKE(table_name, '.*[0-9]{8}.*') " 92 | db, err := GetOracleConn(ds) 93 | 94 | if err != nil { 95 | Getlog().Error("GetOracleConn()==>" + err.Error()) 96 | return nil, err 97 | } 98 | Getlog().Debug("oracle db==>" + orm.ToStr(db)) 99 | o, err := orm.NewOrmWithDB("oci8", ds.Datasource, db) 100 | if err != nil { 101 | Getlog().Error("orm.NewOrmWithDB()==>" + err.Error()) 102 | return nil, err 103 | } 104 | Getlog().Debug("oracle orm==>" + orm.ToStr(o)) 105 | _, err = o.Raw(sql).QueryRows(&tablenames) 106 | 107 | if err != nil { 108 | Getlog().Error("o.Raw(sql).QueryRows()==>" + err.Error()) 109 | return nil, err 110 | } 111 | 112 | return tablenames, nil 113 | } 114 | func Getoracletablenames2(ds DATASOURCE) (tablenames []DATASOURCETABLE, err error) { 115 | tablenames = make([]DATASOURCETABLE, 0) 116 | sql := "SELECT '" + ds.Datasource + "' as datasource,table_name as tablename FROM USER_TABLES where not REGEXP_LIKE (table_name, '.*_COPY.*' ) and not REGEXP_LIKE(table_name, '.*[0-9]{8}.*') " 117 | db, err := GetOracleConn(ds) 118 | 119 | if err != nil { 120 | Getlog().Error("GetOracleConn()==>" + err.Error()) 121 | return nil, err 122 | } 123 | rows, err := db.Query(sql) 124 | if err != nil { 125 | Getlog().Error("db.Query(sql)==>" + err.Error()) 126 | return nil, err 127 | } 128 | for rows.Next() { 129 | dst := DATASOURCETABLE{} 130 | err = rows.Scan(&dst.Datasource, &dst.Tablename) 131 | if err != nil { 132 | Getlog().Error("rows.Scan(&dst.Datasource, &dst.Tablename)==>" + err.Error()) 133 | return nil, err 134 | } 135 | tablenames = append(tablenames, dst) 136 | } 137 | 138 | return tablenames, nil 139 | } 140 | 141 | func Getoracletablefields(ds DATASOURCE, tablename string) (fieldsmap []DATASOURCETABLEFIELD, err error) { 142 | //SELECT column_name,data_type,data_length,nullable FROM ALL_TAB_COLUMNS WHERE TABLE_NAME='CMN_TEST_TB' 143 | sql := "SELECT '" + ds.Datasource + "' as datasource,a.TABLE_NAME as tablename,a.COLUMN_NAME as fieldname " 144 | sql = sql + ",DATA_TYPE as fieldtype,case NULLABLE when 'Y' then '1' else '0' end as isnull " 145 | sql = sql + ", DATA_LENGTH as fieldlength, (case c.UNIQUENESS when 'UNIQUE' then '1' else '0' end ) as isprimary " 146 | sql = sql + " FROM ALL_TAB_COLUMNS a " 147 | sql = sql + " left join USER_IND_COLUMNS b on a.TABLE_NAME=b.TABLE_NAME and a.COLUMN_NAME=b.COLUMN_NAME " 148 | sql = sql + " left join USER_INDEXES c on b.TABLE_NAME=c.TABLE_NAME and b.INDEX_NAME=c.INDEX_NAME " 149 | sql = sql + " WHERE a.TABLE_NAME =:s_tablename" 150 | 151 | db, err := GetOracleConn(ds) 152 | if err != nil { 153 | Getlog().Error("GetOracleConn()==>" + err.Error()) 154 | return nil, err 155 | } 156 | // o, err := orm.NewOrmWithDB("oci8", ds.Datasource, db) 157 | // if err != nil { 158 | // Getlog().Error("orm.NewOrmWithDB()==>" + err.Error()) 159 | // return nil, err 160 | // } 161 | 162 | fieldsmap = make([]DATASOURCETABLEFIELD, 0) 163 | // _, err = o.Raw(sql, strings.ToUpper(tablename)).QueryRows(&fieldsmap) 164 | 165 | // if err != nil { 166 | // Getlog().Error("o.Raw(sql).QueryRows()==>" + err.Error()) 167 | // return nil, err 168 | // } 169 | s_tablename := strings.ToUpper(tablename) 170 | rows, err := db.Query(sql, s_tablename) 171 | if err != nil { 172 | Getlog().Error("db.Query==>" + err.Error()) 173 | return nil, err 174 | } 175 | for rows.Next() { 176 | dst := DATASOURCETABLEFIELD{} 177 | err = rows.Scan(&dst.Datasource, &dst.Tablename, &dst.Fieldname, &dst.Fieldtype, &dst.Isnull, &dst.Fieldlength, &dst.Isprimary) 178 | if err != nil { 179 | Getlog().Error("rows.Scan(&dst.Datasource, &dst.Tablename,...)==>" + err.Error()) 180 | return nil, err 181 | } 182 | dst.Fieldtype = strings.ToLower(dst.Fieldtype) 183 | fieldsmap = append(fieldsmap, dst) 184 | } 185 | Getlog().Debug("fieldsmap==>" + orm.ToStr(fieldsmap)) 186 | return fieldsmap, nil 187 | } 188 | func Getoracletabledatacount(ds DATASOURCE, tablename string) (ncount int, err error) { 189 | countsql := "select count(1) as ncount from " + tablename 190 | db, err := GetOracleConn(ds) 191 | if err != nil { 192 | Getlog().Error("GetOracleConn()==>" + err.Error()) 193 | return 0, err 194 | } 195 | rows, err := db.Query(countsql) 196 | if err != nil { 197 | Getlog().Error("db.Query(sql)==>" + err.Error()) 198 | return 0, err 199 | } 200 | for rows.Next() { 201 | err = rows.Scan(&ncount) 202 | if err != nil { 203 | Getlog().Error("rows.Scan()==>" + err.Error()) 204 | return 0, err 205 | } 206 | } 207 | return ncount, nil 208 | 209 | } 210 | -------------------------------------------------------------------------------- /models/websocketclient.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "bytes" 5 | 6 | "encoding/json" 7 | _ "errors" 8 | "time" 9 | 10 | "github.com/gorilla/websocket" 11 | ) 12 | 13 | const ( 14 | // Time allowed to write a message to the peer. 15 | writeWait = 10 * time.Second 16 | 17 | // Time allowed to read the next pong message from the peer. 18 | pongWait = 60 * time.Second 19 | 20 | // Send pings to peer with this period. Must be less than pongWait. 21 | pingPeriod = (pongWait * 9) / 10 22 | 23 | // Maximum message size allowed from peer. 24 | maxMessageSize = 512 25 | ) 26 | 27 | var ( 28 | newline = []byte{'\n'} 29 | space = []byte{' '} 30 | ) 31 | 32 | type WebsocketClient struct { 33 | Ws *WebsocketServer 34 | 35 | // The websocket connection. 36 | Conn *websocket.Conn 37 | 38 | // Buffered channel of outbound messages. 39 | Send chan []byte 40 | 41 | // Buffered channel of inbound messages. 42 | Recieve chan []byte 43 | } 44 | 45 | func (c *WebsocketClient) ReadMessage() { 46 | Getlog().Debug("ReadMessage() start==>") 47 | //c.Conn.SetReadLimit(maxMessageSize) 48 | //c.Conn.SetReadDeadline(time.Now().Add(pongWait)) 49 | //c.Conn.SetPongHandler(func(string) error { c.conn.SetReadDeadline(time.Now().Add(pongWait)); return nil }) 50 | for { 51 | messagetype, message, err := c.Conn.ReadMessage() 52 | if err != nil { 53 | if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) { 54 | Getlog().Error("c.Conn.ReadMessage()==>" + err.Error()) 55 | } 56 | break 57 | } 58 | if messagetype == websocket.CloseMessage { 59 | 60 | c.Ws.Unregister <- c 61 | c.Conn.Close() 62 | break 63 | 64 | } 65 | 66 | message = bytes.TrimSpace(bytes.Replace(message, newline, space, -1)) 67 | c.Ws.Broadcast <- message 68 | } 69 | } 70 | func (c *WebsocketClient) WriteMessage() { 71 | Getlog().Debug("WriteMessage() start==>") 72 | ticker := time.NewTicker(pingPeriod) 73 | defer func() { 74 | ticker.Stop() 75 | c.Conn.Close() 76 | }() 77 | for { 78 | select { 79 | case message, ok := <-c.Send: 80 | c.Conn.SetWriteDeadline(time.Now().Add(writeWait)) 81 | if !ok { 82 | // The hub closed the channel. 83 | c.Conn.WriteMessage(websocket.CloseMessage, []byte{}) 84 | return 85 | } 86 | 87 | w, err := c.Conn.NextWriter(websocket.TextMessage) 88 | if err != nil { 89 | Getlog().Error("c.Conn.NextWriter(websocket.TextMessage)==>" + err.Error()) 90 | return 91 | } 92 | _, err = w.Write(message) 93 | if err != nil { 94 | Getlog().Error("w.Write(message)==>" + err.Error()) 95 | sdm := SynDataMessage{} 96 | err = json.Unmarshal(message, sdm) 97 | c.Ws.Unreaddatamessage = append(c.Ws.Unreaddatamessage, &sdm) 98 | 99 | } 100 | 101 | // Add queued chat messages to the current websocket message. 102 | n := len(c.Send) 103 | for i := 0; i < n; i++ { 104 | _, err := w.Write(<-c.Send) 105 | if err != nil { 106 | Getlog().Error("w.Write(<-c.Send)==>" + err.Error()) 107 | sdm := SynDataMessage{} 108 | err = json.Unmarshal(message, sdm) 109 | c.Ws.Unreaddatamessage = append(c.Ws.Unreaddatamessage, &sdm) 110 | } 111 | } 112 | 113 | if err := w.Close(); err != nil { 114 | Getlog().Error("w.Close==>" + err.Error()) 115 | return 116 | } 117 | case <-ticker.C: 118 | c.Conn.SetWriteDeadline(time.Now().Add(writeWait)) 119 | if err := c.Conn.WriteMessage(websocket.PingMessage, nil); err != nil { 120 | Getlog().Error("c.Conn.WriteMessage==>" + err.Error()) 121 | return 122 | } 123 | } 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /models/websocketserver.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | _ "bytes" 5 | 6 | "encoding/json" 7 | _ "errors" 8 | _ "strconv" 9 | "strings" 10 | 11 | _ "github.com/gorilla/websocket" 12 | ) 13 | 14 | const ( 15 | OpenWebsocket = 1 // 16 | CloseWebsocket = 2 // 17 | ReceivedMessage = 3 // 18 | SendedMessage = 4 // 19 | ) 20 | 21 | var ws *WebsocketServer 22 | 23 | type SynDataMessage struct { 24 | Messagetype int `json:"Messagetype"` 25 | Ip string `json:"Ip"` 26 | Message DATAMOVEAPPLYITEM 27 | } 28 | type WebsocketServer struct { 29 | // Registered clients. 30 | Clients map[*WebsocketClient]bool 31 | 32 | // Inbound messages from the clients. 33 | Broadcast chan []byte 34 | 35 | // Register requests from the clients. 36 | Register chan *WebsocketClient 37 | 38 | // Unregister requests from clients. 39 | Unregister chan *WebsocketClient 40 | 41 | //unread data message 42 | Unreaddatamessage []*SynDataMessage 43 | 44 | //指定IP data message 45 | Datamessage chan *SynDataMessage 46 | } 47 | 48 | func NewWebsocketServer() *WebsocketServer { 49 | Getlog().Debug("NewWebsocketServer() start==>") 50 | if ws == nil { 51 | ws = &WebsocketServer{ 52 | Clients: make(map[*WebsocketClient]bool), 53 | Broadcast: make(chan []byte), 54 | Register: make(chan *WebsocketClient), 55 | Unregister: make(chan *WebsocketClient), 56 | Unreaddatamessage: make([]*SynDataMessage, 0), 57 | Datamessage: make(chan *SynDataMessage), 58 | } 59 | return ws 60 | } else { 61 | return ws 62 | } 63 | 64 | } 65 | func GetWebsocketServer() *WebsocketServer { 66 | Getlog().Debug("GetWebsocketServer() start==>") 67 | if ws == nil { 68 | return NewWebsocketServer() 69 | } else { 70 | return ws 71 | } 72 | } 73 | func (ws *WebsocketServer) Run() { 74 | Getlog().Debug("Run() start==>") 75 | for { 76 | select { 77 | case client := <-ws.Register: 78 | ws.Clients[client] = true 79 | case client := <-ws.Unregister: 80 | if _, ok := ws.Clients[client]; ok { 81 | delete(ws.Clients, client) 82 | close(client.Send) 83 | } 84 | case message := <-ws.Broadcast: 85 | for client, _ := range ws.Clients { 86 | select { 87 | case client.Send <- message: 88 | default: 89 | close(client.Send) 90 | delete(ws.Clients, client) 91 | } 92 | } 93 | 94 | case datamessage := <-ws.Datamessage: 95 | isclientconn := false 96 | for client := range ws.Clients { 97 | ip := client.Conn.RemoteAddr().String() 98 | //Getlog().Debug("ip==>" + ip) 99 | //Getlog().Debug("datamessage.Ip==>" + datamessage.Ip) 100 | iparr := strings.Split(ip, ":") 101 | dataiparr := strings.Split(datamessage.Ip, ":") 102 | //Getlog().Debug("iparr0==>" + iparr[0]) 103 | //Getlog().Debug("dataiparr0==>" + dataiparr[0]) 104 | if iparr[0] == dataiparr[0] { 105 | isclientconn = true 106 | databyte, err := json.Marshal(datamessage) 107 | if err != nil { 108 | client.Send <- []byte(err.Error()) 109 | } 110 | client.Send <- databyte 111 | break 112 | } 113 | 114 | } 115 | if !isclientconn { 116 | ws.Unreaddatamessage = append(ws.Unreaddatamessage, datamessage) 117 | } 118 | } 119 | 120 | } 121 | } 122 | func (ws *WebsocketServer) PushUnreaddatamessage(wc *WebsocketClient) { 123 | Getlog().Debug("PushUnreaddatamessage start==>") 124 | for idx, datamessage := range ws.Unreaddatamessage { 125 | databyte, err := json.Marshal(datamessage) 126 | if err != nil { 127 | Getlog().Error("json.Marshal(datamessage)==>" + err.Error()) 128 | continue 129 | } 130 | wc.Send <- databyte 131 | if idx < len(ws.Unreaddatamessage)-1 { 132 | ws.Unreaddatamessage = append(ws.Unreaddatamessage[:idx], ws.Unreaddatamessage[idx+1:]...) 133 | } else { 134 | ws.Unreaddatamessage = ws.Unreaddatamessage[:idx] 135 | } 136 | 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /mysql.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikezss/skl-go/2a0036e998c4e501ae9dab9c40bd8b622da23be6/mysql.sql -------------------------------------------------------------------------------- /mysql_function.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikezss/skl-go/2a0036e998c4e501ae9dab9c40bd8b622da23be6/mysql_function.sql -------------------------------------------------------------------------------- /postgres.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikezss/skl-go/2a0036e998c4e501ae9dab9c40bd8b622da23be6/postgres.sql -------------------------------------------------------------------------------- /postgres_function.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikezss/skl-go/2a0036e998c4e501ae9dab9c40bd8b622da23be6/postgres_function.sql -------------------------------------------------------------------------------- /routers/router.go: -------------------------------------------------------------------------------- 1 | // @APIVersion 1.0.0 2 | // @Title beego Test API 3 | // @Description beego has a very cool tools to autogenerate documents for your API 4 | // @Contact astaxie@gmail.com 5 | // @TermsOfServiceUrl http://beego.me/ 6 | // @License Apache 2.0 7 | // @LicenseUrl http://www.apache.org/licenses/LICENSE-2.0.html 8 | package routers 9 | 10 | import ( 11 | "github.com/mikezss/skl-go/controllers" 12 | 13 | "github.com/astaxie/beego" 14 | ) 15 | 16 | func init() { 17 | beego.AutoRouter(&controllers.LOGINController{}) 18 | beego.AutoRouter(&controllers.MASTERController{}) 19 | beego.AutoRouter(&controllers.FLOWController{}) 20 | beego.AutoRouter(&controllers.COMMONController{}) 21 | beego.AutoRouter(&controllers.ENUMController{}) 22 | beego.AutoRouter(&controllers.COMPANYController{}) 23 | beego.AutoRouter(&controllers.ENUMSEARCHController{}) 24 | } 25 | -------------------------------------------------------------------------------- /sqlite3.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikezss/skl-go/2a0036e998c4e501ae9dab9c40bd8b622da23be6/sqlite3.sql -------------------------------------------------------------------------------- /swagger/swagger.json: -------------------------------------------------------------------------------- 1 | { 2 | "swagger": "2.0", 3 | "info": { 4 | "title": "beego Test API", 5 | "description": "beego has a very cool tools to autogenerate documents for your API", 6 | "version": "1.0.0", 7 | "termsOfService": "http://beego.me/", 8 | "contact": { 9 | "email": "astaxie@gmail.com" 10 | }, 11 | "license": { 12 | "name": "Apache 2.0", 13 | "url": "http://www.apache.org/licenses/LICENSE-2.0.html" 14 | } 15 | }, 16 | "paths": null, 17 | "definitions": { 18 | "models.Object": { 19 | "title": "Object", 20 | "type": "object", 21 | "properties": { 22 | "ObjectId": { 23 | "type": "string" 24 | }, 25 | "PlayerName": { 26 | "type": "string" 27 | }, 28 | "Score": { 29 | "type": "integer", 30 | "format": "int64" 31 | } 32 | } 33 | }, 34 | "models.Profile": { 35 | "title": "Profile", 36 | "type": "object", 37 | "properties": { 38 | "Address": { 39 | "type": "string" 40 | }, 41 | "Age": { 42 | "type": "integer", 43 | "format": "int64" 44 | }, 45 | "Email": { 46 | "type": "string" 47 | }, 48 | "Gender": { 49 | "type": "string" 50 | } 51 | } 52 | }, 53 | "models.User": { 54 | "title": "User", 55 | "type": "object", 56 | "properties": { 57 | "Id": { 58 | "type": "string" 59 | }, 60 | "Password": { 61 | "type": "string" 62 | }, 63 | "Profile": { 64 | "$ref": "#/definitions/models.Profile" 65 | }, 66 | "Username": { 67 | "type": "string" 68 | } 69 | } 70 | } 71 | } 72 | } -------------------------------------------------------------------------------- /swagger/swagger.yml: -------------------------------------------------------------------------------- 1 | swagger: "2.0" 2 | info: 3 | title: beego Test API 4 | description: beego has a very cool tools to autogenerate documents for your API 5 | version: 1.0.0 6 | termsOfService: http://beego.me/ 7 | contact: 8 | email: astaxie@gmail.com 9 | license: 10 | name: Apache 2.0 11 | url: http://www.apache.org/licenses/LICENSE-2.0.html 12 | paths: {} 13 | definitions: 14 | models.Object: 15 | title: Object 16 | type: object 17 | properties: 18 | ObjectId: 19 | type: string 20 | PlayerName: 21 | type: string 22 | Score: 23 | type: integer 24 | format: int64 25 | models.Profile: 26 | title: Profile 27 | type: object 28 | properties: 29 | Address: 30 | type: string 31 | Age: 32 | type: integer 33 | format: int64 34 | Email: 35 | type: string 36 | Gender: 37 | type: string 38 | models.User: 39 | title: User 40 | type: object 41 | properties: 42 | Id: 43 | type: string 44 | Password: 45 | type: string 46 | Profile: 47 | $ref: '#/definitions/models.Profile' 48 | Username: 49 | type: string 50 | -------------------------------------------------------------------------------- /tests/default_test.go: -------------------------------------------------------------------------------- 1 | package test 2 | 3 | import ( 4 | "net/http" 5 | "net/http/httptest" 6 | "testing" 7 | "runtime" 8 | "path/filepath" 9 | _ "github.com/mikezss/skl-go/routers" 10 | 11 | "github.com/astaxie/beego" 12 | . "github.com/smartystreets/goconvey/convey" 13 | ) 14 | 15 | func init() { 16 | _, file, _, _ := runtime.Caller(1) 17 | apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".." + string(filepath.Separator)))) 18 | beego.TestBeegoInit(apppath) 19 | } 20 | 21 | // TestGet is a sample to run an endpoint test 22 | func TestGet(t *testing.T) { 23 | r, _ := http.NewRequest("GET", "/v1/object", nil) 24 | w := httptest.NewRecorder() 25 | beego.BeeApp.Handlers.ServeHTTP(w, r) 26 | 27 | beego.Trace("testing", "TestGet", "Code[%d]\n%s", w.Code, w.Body.String()) 28 | 29 | Convey("Subject: Test Station Endpoint\n", t, func() { 30 | Convey("Status Code Should Be 200", func() { 31 | So(w.Code, ShouldEqual, 200) 32 | }) 33 | Convey("The Result Should Not Be Empty", func() { 34 | So(w.Body.Len(), ShouldBeGreaterThan, 0) 35 | }) 36 | }) 37 | } 38 | 39 | -------------------------------------------------------------------------------- /util/email.go: -------------------------------------------------------------------------------- 1 | package email 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | 7 | "github.com/astaxie/beego/config" 8 | "github.com/go-gomail/gomail" 9 | ) 10 | 11 | type Email struct { 12 | to string "to" 13 | cc string "cc" 14 | subject string "subject" 15 | msg string "msg" 16 | attach string "attach" 17 | } 18 | 19 | func NewEmail(to, cc, subject, msg, attach string) *Email { 20 | return &Email{to: to, cc: cc, subject: subject, msg: msg, attach: attach} 21 | } 22 | 23 | func SendMimeEmail(email *Email) error { 24 | iniconf, err := config.NewConfig("ini", "conf/myconf.ini") 25 | if err != nil { 26 | fmt.Println(err) 27 | } 28 | HOST := iniconf.String("mailhost") 29 | USER := iniconf.String("mailuser") 30 | PASSWORD := iniconf.String("mailpwd") 31 | SERVER_ADDR := iniconf.String("mailhostaddress") 32 | 33 | d := gomail.NewDialer(SERVER_ADDR, 25, USER, PASSWORD) 34 | m := gomail.NewMessage() 35 | m.SetHeader("From", USER) 36 | sendTo := strings.Split(email.to, ";") 37 | m.SetHeader("To", sendTo) 38 | cc := strings.Split(email.to, ";") 39 | m.SetAddressHeader("Cc", cc) 40 | m.SetHeader("Subject", email.subject) 41 | m.SetBody("text/html", email.msg) 42 | m.Attach(email.attach) 43 | 44 | // Send the email to Bob, Cora and Dan. 45 | if err := d.DialAndSend(m); err != nil { 46 | panic(err) 47 | return err 48 | } 49 | return nil 50 | } 51 | --------------------------------------------------------------------------------