├── .gitattributes ├── .github └── workflows │ └── go.yml ├── .gitignore ├── LICENSE ├── README.md ├── action ├── api.go ├── base.go ├── group.go ├── im.go ├── imws.go ├── project.go ├── sort.go └── user.go ├── apidoc.sql ├── app.go ├── base ├── base.go └── config.go ├── conf.yaml ├── dao ├── ApiDao.go ├── GroupDao.go ├── ImMsgDao.go ├── ProjectDao.go ├── SortDao.go ├── UserDao.go └── UserProjectDao.go ├── img ├── 14097a569cf76d0d7b205ac87876b54f.jpg ├── 7d5a1bae1a055c1ebb4ee44a86801fee.jpg ├── 9bbda18374df39a11dced12b3176741c.jpeg └── cc26f7322eb7f9a1fa64872308351cac.jpg ├── middle └── index.go ├── models ├── apidoc_api.go ├── apidoc_project.go ├── apidoc_sort.go ├── apidoc_user.go ├── apidoc_user_project.go ├── im_group.go ├── im_group_mumber.go └── im_msg.go ├── redispool └── redispool.go └── xrom_mysql └── client.go /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/workflows/go.yml: -------------------------------------------------------------------------------- 1 | name: apidoc 2 | on: [push] 3 | jobs: 4 | 5 | build: 6 | name: Build 7 | runs-on: ubuntu-latest 8 | steps: 9 | 10 | - name: Set up Go 1.13 11 | uses: actions/setup-go@v1 12 | with: 13 | go-version: 1.13 14 | id: go 15 | 16 | - name: Check out code into the Go module directory 17 | uses: actions/checkout@v2 18 | 19 | - name: Get dependencies 20 | run: | 21 | go get -v -t -d ./... 22 | if [ -f Gopkg.toml ]; then 23 | curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh 24 | dep ensure 25 | fi 26 | - name: Build apidoc 27 | run: go build -v -o app . 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, build with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | *.idea 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 雨竹 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 | # apidocserver 2 | 3 | golang 1.10   echo 3.3   redis 3.0.5   mysql 8.0 4 | 5 | #### 测试地址: 6 | http://apidoc.amagic.top 7 | 8 | #### 账号密码: 9 | admin 10 | 123456 11 | 12 | 13 | #### Build Setup 14 | 本项目用redis保存了用户的登录token 15 | 本项目采用MySql保存基础数据 16 | 你可以在conf.yaml文件中配置redis和MySql的基础信息 17 | 18 | 19 | go build app.go 20 | 21 | #### 需要下载库 22 | web框架:go get github.com/labstack/echo 23 | xorm:go get github.com/go-xorm/xorm 24 | mysql驱动:go get github.com/go-sql-driver/mysql 25 | redis库:go get github.com/garyburd/redigo/redis 26 | websocket库:go get github.com/gorilla/websocket 27 | yaml解析库:go get github.com/kylelemons/go-gypsy/yaml 28 | 29 | 30 | 31 | #### Contact me: 32 | * Author : [@aixinaxc][1] 33 | * Blog:[aixianxc-blog][2] 34 | 35 | [1]: http://www.amagic.top/ 36 | [2]: https://blog.csdn.net/aixinaxc/ 37 | -------------------------------------------------------------------------------- /action/api.go: -------------------------------------------------------------------------------- 1 | package action 2 | 3 | import ( 4 | "apidocserver/base" 5 | "apidocserver/dao" 6 | "crypto/md5" 7 | "encoding/hex" 8 | "github.com/labstack/echo" 9 | "io" 10 | "os" 11 | ) 12 | 13 | //获得api列表 14 | func ApiList(c echo.Context) error { 15 | projectId := c.FormValue("project_id") 16 | if projectId == "" { 17 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataLoss, 0, nil)) 18 | } 19 | api := dao.ApiContentList(projectId) 20 | if api == nil { 21 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataError, 0, nil)) 22 | } 23 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataSuccess, 0, api)) 24 | } 25 | 26 | //获得api内容 27 | func ApiContent(c echo.Context) error { 28 | apiId := c.FormValue("api_id") 29 | if apiId == "" { 30 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataLoss, 0, nil)) 31 | } 32 | api := dao.ApiContent(apiId) 33 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataSuccess, 1, api)) 34 | } 35 | 36 | //Api 保存 37 | func ApiSvae(c echo.Context) error { 38 | apiId := c.FormValue("api_id") 39 | projectId := c.FormValue("project_id") 40 | sortId := c.FormValue("sort_id") 41 | apiName := c.FormValue("api_name") 42 | apiEditContent := c.FormValue("api_edit_content") 43 | apiShowContent := c.FormValue("api_show_content") 44 | if projectId == "" || sortId == "" || apiName == "" || apiEditContent == "" || apiShowContent == "" { 45 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataLoss, 0, nil)) 46 | } 47 | r := dao.ApiSvae(apiId, sortId, projectId, apiName, apiEditContent, apiShowContent) 48 | 49 | if r == "error" { 50 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataError, 0, nil)) 51 | } 52 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataSuccess, 1, r)) 53 | } 54 | 55 | //删除API 56 | func ApiDelete(c echo.Context) error { 57 | apiId := c.FormValue("api_id") 58 | if apiId == "" { 59 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataLoss, 0, nil)) 60 | } 61 | r := dao.ApiDelete(apiId) 62 | if r == "error" { 63 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataError, 0, nil)) 64 | } 65 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataSuccess, 0, nil)) 66 | } 67 | 68 | //上传文件 69 | func FileUpload(c echo.Context) error { 70 | 71 | file, err := c.FormFile("file") 72 | if err != nil { 73 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataError, 0, nil)) 74 | } 75 | src, err := file.Open() 76 | if err != nil { 77 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataError, 0, nil)) 78 | } 79 | defer src.Close() 80 | 81 | md5 := md5.New() 82 | io.Copy(md5,src) 83 | MD5Str := hex.EncodeToString(md5.Sum(nil)) 84 | src.Seek(0,0) 85 | // Destination 86 | fileName := "upload/" + MD5Str 87 | dst, err := os.Create(fileName) 88 | if err != nil { 89 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataError, 0, nil)) 90 | } 91 | defer dst.Close() 92 | // Copy 93 | if _, err = io.Copy(dst, src); err != nil { 94 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataError, 0, nil)) 95 | } 96 | return c.JSON(200, base.RetunMsgFunc(base.CodeDataSuccess, 0, fileName)) 97 | } 98 | -------------------------------------------------------------------------------- /action/base.go: -------------------------------------------------------------------------------- 1 | package action 2 | 3 | import ( 4 | "github.com/labstack/echo" 5 | "apidocserver/dao" 6 | "apidocserver/base" 7 | "crypto/md5" 8 | "encoding/hex" 9 | "fmt" 10 | "apidocserver/redispool" 11 | ) 12 | 13 | func Login(c echo.Context) error { 14 | username := c.FormValue("username") 15 | password := c.FormValue("password") 16 | if username == "" || password == "" { 17 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataLoss,0,nil)) 18 | } 19 | password = password + base.MD5 20 | pass := md5.New() 21 | pass.Write([]byte(password)) // 需要加密的字符串为buf.String() 22 | user := dao.FindUser(username,hex.EncodeToString(pass.Sum(nil))) 23 | if user.UserUsername != "" { 24 | uuid := base.UniqueId() 25 | fmt.Println(uuid) 26 | userMap,_ := base.Struct2Map(user) 27 | userMap["Token"] = uuid 28 | redispool.RedisSETString(user.UserId + "_ticket",uuid,0) 29 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,1,userMap)) 30 | } 31 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataEmpty,0,nil)) 32 | } 33 | 34 | func Logout(c echo.Context) error { 35 | userId := c.FormValue("user_id") 36 | if userId == "" { 37 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,0,nil)) 38 | } 39 | redispool.RedisDel(userId+"token") 40 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,0,nil)) 41 | } -------------------------------------------------------------------------------- /action/group.go: -------------------------------------------------------------------------------- 1 | package action 2 | 3 | import ( 4 | "github.com/labstack/echo" 5 | "apidocserver/dao" 6 | "apidocserver/base" 7 | ) 8 | 9 | //获得群组列表 10 | func GroupList(c echo.Context) error{ 11 | userId := c.FormValue("user_id") 12 | groupList := dao.GroupListByUserId(userId) 13 | if groupList == nil { 14 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataError,0,nil)) 15 | } 16 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,0,groupList)) 17 | } 18 | -------------------------------------------------------------------------------- /action/im.go: -------------------------------------------------------------------------------- 1 | package action 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/labstack/echo" 7 | "apidocserver/base" 8 | "apidocserver/dao" 9 | ) 10 | 11 | func MsgList(c echo.Context) error { 12 | userFromId := c.FormValue("msg_from_id") 13 | userToId := c.FormValue("msg_to_id") 14 | startTime := c.FormValue("start_time") 15 | endTime := c.FormValue("end_time") 16 | msgType := c.FormValue("msg_type") 17 | pageNum := c.FormValue("page_num") 18 | pageSize := c.FormValue("page_size") 19 | if userFromId == "" || userToId == "" { 20 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataError,0,nil)) 21 | } 22 | fmt.Println("userFromId:",userFromId) 23 | fmt.Println("userToId:",userToId) 24 | fmt.Println("startTime:",startTime) 25 | fmt.Println("endTime:",endTime) 26 | msg,count,err := dao.MsgList(userFromId,userToId,startTime,endTime,msgType,pageNum,pageSize) 27 | if err != nil { 28 | fmt.Println("数据查询错误:",err) 29 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataError,0,nil)) 30 | } 31 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,count,msg)) 32 | } 33 | -------------------------------------------------------------------------------- /action/imws.go: -------------------------------------------------------------------------------- 1 | package action 2 | 3 | import ( 4 | "fmt" 5 | "github.com/labstack/echo" 6 | "encoding/json" 7 | "github.com/gorilla/websocket" 8 | "net/http" 9 | "sync" 10 | "apidocserver/models" 11 | "apidocserver/xrom_mysql" 12 | "io/ioutil" 13 | ) 14 | 15 | var CH_NUM = 1000 16 | 17 | var ( 18 | upgrader1 = websocket.Upgrader{ 19 | ReadBufferSize: 1024, 20 | WriteBufferSize: 1024, 21 | CheckOrigin: func(r *http.Request) bool { 22 | return true 23 | }, 24 | } 25 | ) 26 | var imMap = make(map[string]*websocket.Conn) 27 | var channel = make(chan models.Msg ,CH_NUM) 28 | var mutex sync.Mutex 29 | 30 | func IMSever(c echo.Context) error { 31 | ws, err := upgrader1.Upgrade(c.Response(), c.Request(), nil) 32 | if err != nil { 33 | c.Logger().Error("连接错误:",err) 34 | return err 35 | } 36 | defer ws.Close() 37 | for { 38 | _, msg, err := ws.ReadMessage() 39 | if err!=nil{ 40 | c.Logger().Error("读取消息错误:",err) 41 | return err 42 | } 43 | fmt.Println(string(msg)) 44 | go analysis(c,msg,ws) 45 | } 46 | return nil 47 | } 48 | 49 | func analysis(c echo.Context,msg []byte,ws *websocket.Conn) error { 50 | var imMsg models.ImMsg 51 | err := json.Unmarshal(msg,&imMsg) 52 | if err != nil{ 53 | c.Logger().Error("json解析错误:",err) 54 | return err 55 | } 56 | if imMsg.MsgFromId == "" || imMsg.MsgType == "" { 57 | c.Logger().Error("msgFromId为空或者msgtype为空") 58 | m := "msgFromId为空或者msgtype为空" 59 | MsgHandle(c,imMsg.MsgFromId,imMsg.MsgId,[]byte(m)) 60 | return nil 61 | } 62 | if imMsg.MsgContentType == "im_img" { 63 | fileSave(imMsg.MsgContent.FileName,imMsg.MsgContent.File) 64 | imMsg.MsgContent.File = nil 65 | } 66 | if imMsg.MsgType == "client" { 67 | imMap[imMsg.MsgFromId] = ws 68 | MsgHandle(c,imMsg.MsgFromId,imMsg.MsgId,msg) 69 | //fmt.Println("连接成功",imMsg.MsgFromId) 70 | }else if imMsg.MsgType == "p2p" { 71 | c.Logger().Error("消息:",imMsg) 72 | //把接收的数据插入表中 73 | xrom_mysql.InsertXORMMsg(imMsg) 74 | //把数据发送出去 75 | //MsgHandle(c,imMsg.MsgFromId,imMsg.MsgId,msg) 76 | if ok := imMap[imMsg.MsgToId] != nil;ok { 77 | MsgHandle(c,imMsg.MsgToId,imMsg.MsgId,msg) 78 | } 79 | }else if imMsg.MsgType == "group" { 80 | //把接收的数据插入表中 81 | xrom_mysql.InsertXORMMsg(imMsg) 82 | groups := xrom_mysql.FindXROMMsg("SELECT * FROM im_group_mumber WHERE group_id = '" + imMsg.MsgToId +"'") 83 | if groups != nil { 84 | for _,group := range groups { 85 | fmt.Println("待发送用户为:",string(group["user_id"])) 86 | if string(group["user_id"]) != imMsg.MsgFromId { 87 | MsgHandle(c,string(group["user_id"]),imMsg.MsgId,msg) 88 | } 89 | } 90 | } 91 | } else if imMsg.MsgType == "logout" { 92 | 93 | } 94 | return nil 95 | } 96 | 97 | func MsgHandle(c echo.Context,toId string,msgId string,msg []byte) { 98 | var newMsg models.Msg 99 | newMsg.Id = toId 100 | newMsg.MsgId = msgId 101 | newMsg.Msg = msg 102 | channel <- newMsg 103 | Broadcast(c,<-channel) 104 | } 105 | 106 | //发送信息 107 | func Broadcast(c echo.Context,m models.Msg) error { 108 | if ok := imMap[m.Id] != nil;ok { 109 | mutex.Lock() 110 | err := imMap[m.Id].WriteMessage(websocket.TextMessage,m.Msg) 111 | if err != nil { 112 | mutex.Unlock() 113 | c.Logger().Error("发送信息错误") 114 | //fmt.Println("发送信息错误") 115 | delete(imMap,m.Id) 116 | return err 117 | } 118 | c.Logger().Debug("发送成功") 119 | //fmt.Println("发送成功") 120 | mutex.Unlock() 121 | }else { 122 | //保存离线消息,从redis取出未发送的消息,然后在重新填入 123 | /*var msgIds string 124 | ids := redispool.RedisGET("msg_"+m.Id) 125 | fmt.Println("离线消息保存ids",ids) 126 | if ids == nil{ 127 | msgIds = m.MsgId 128 | }else{ 129 | msgIds = string(ids) + "," + m.MsgId 130 | } 131 | redispool.RedisSETString("msg_"+m.Id,msgIds,0)*/ 132 | } 133 | return nil 134 | } 135 | 136 | func fileSave(fileName string,data []byte) { 137 | err := ioutil.WriteFile("./img/"+fileName, data, 0666) //buffer输出到jpg文件中(不做处理,直接写到文件) 138 | if err != nil { 139 | fmt.Println("文件保存err:",err) 140 | } 141 | } -------------------------------------------------------------------------------- /action/project.go: -------------------------------------------------------------------------------- 1 | package action 2 | 3 | import ( 4 | "github.com/labstack/echo" 5 | "apidocserver/dao" 6 | "apidocserver/base" 7 | "fmt" 8 | ) 9 | 10 | //项目列表 11 | func ProjectList(c echo.Context) error { 12 | userId := c.FormValue("userId") 13 | projects,total := dao.ProjectList(userId) 14 | if projects == nil || len(projects) == 0 { 15 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataEmpty,0,nil)) 16 | } 17 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,total,projects)) 18 | } 19 | 20 | // 编辑项目 21 | func ProjectSave(c echo.Context) error { 22 | userId := c.FormValue("user_id") 23 | projectId := c.FormValue("project_id") 24 | projectName := c.FormValue("project_name") 25 | fmt.Println("projectsave:",userId,projectId,projectName) 26 | if userId == "" || projectName == ""{ 27 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataLoss,0,nil)) 28 | } 29 | pId := dao.ProjectSave(userId,projectId,projectName) 30 | if pId == "error"{ 31 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataError,0,nil)) 32 | } 33 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,1,pId)) 34 | } 35 | 36 | //删除项目project 37 | func ProjectDelete(c echo.Context) error { 38 | projectId := c.FormValue("project_id") 39 | fmt.Println("peojectId",projectId) 40 | r := dao.ProjectDelete(projectId) 41 | if r == "error" { 42 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataError,0,nil)) 43 | } 44 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,0,nil)) 45 | } -------------------------------------------------------------------------------- /action/sort.go: -------------------------------------------------------------------------------- 1 | package action 2 | 3 | import ( 4 | "github.com/labstack/echo" 5 | "apidocserver/dao" 6 | "apidocserver/base" 7 | "strconv" 8 | ) 9 | 10 | //分类分页列表 11 | func SortPList(c echo.Context) error{ 12 | projectId := c.FormValue("project_id") 13 | pageNum := c.FormValue("page_num") 14 | pageSize := c.FormValue("page_size") 15 | if projectId == "" { 16 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataLoss,0,nil)) 17 | } 18 | pS,of := base.Offer(pageNum,pageSize) 19 | sorts,count := dao.SortPList(pS,of,projectId) 20 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,count,sorts)) 21 | } 22 | 23 | //分类列表 24 | func SortList(c echo.Context) error{ 25 | projectId := c.FormValue("project_id") 26 | if projectId == "" { 27 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataLoss,0,nil)) 28 | } 29 | sort := dao.SortList(projectId) 30 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,1,sort)) 31 | } 32 | 33 | //侧边栏列表 34 | func SortApiList(c echo.Context) error{ 35 | projectId := c.FormValue("project_id") 36 | if projectId == "" { 37 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataLoss,0,nil)) 38 | } 39 | sort := dao.SortList(projectId) 40 | api := dao.ApiList(projectId) 41 | m := make(map[string]interface{},0) 42 | m["sort"] = sort 43 | m["api"] = api 44 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,1,m)) 45 | } 46 | 47 | //分类保存 48 | func SortSave(c echo.Context) error{ 49 | sortId := c.FormValue("sort_id") 50 | projectId := c.FormValue("project_id") 51 | sortName := c.FormValue("sort_name") 52 | sortPid := c.FormValue("sort_pid") 53 | sortSeq := c.FormValue("sort_seq") 54 | iSortSeq,err := strconv.Atoi(sortSeq) 55 | if err != nil || projectId == "" || sortName == ""{ 56 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataLoss,0,nil)) 57 | } 58 | r := dao.SortSave(sortId,projectId,sortName,sortPid,iSortSeq) 59 | if r == "error" { 60 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataError,0,nil)) 61 | } 62 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,1,r)) 63 | } 64 | 65 | //分类删除 66 | func SortDelete(c echo.Context) error{ 67 | sortId := c.FormValue("sort_id") 68 | r := dao.SortDelete(sortId) 69 | if r == "error" { 70 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataError,0,nil)) 71 | } 72 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,0,nil)) 73 | } -------------------------------------------------------------------------------- /action/user.go: -------------------------------------------------------------------------------- 1 | package action 2 | 3 | import ( 4 | "github.com/labstack/echo" 5 | "apidocserver/dao" 6 | "apidocserver/base" 7 | "crypto/md5" 8 | "encoding/hex" 9 | ) 10 | 11 | func UserList(c echo.Context) error { 12 | pageNum := c.FormValue("page_num") 13 | pageSize := c.FormValue("page_size") 14 | pS,of := base.Offer(pageNum,pageSize) 15 | users,count := dao.UserList(pS,of) 16 | if users == nil { 17 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataError,0,nil)) 18 | } 19 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,count,users)) 20 | } 21 | 22 | func UserSave(c echo.Context) error { 23 | userId := c.FormValue("userId") 24 | username := c.FormValue("username") 25 | password := c.FormValue("password") 26 | if username == "" || password == "" { 27 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataLoss,0,nil)) 28 | } 29 | user := dao.FindUserName(username) 30 | if user.UserUsername != "" { 31 | return c.JSON(200,base.RetunMsgFunc(base.CodeUserHas,0,nil)) 32 | } 33 | password = password + base.MD5 34 | pass := md5.New() 35 | pass.Write([]byte(password)) // 需要加密的字符串为buf.String() 36 | r := dao.UserSave(userId,username,hex.EncodeToString(pass.Sum(nil))) 37 | if r == "error" { 38 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataError,0,nil)) 39 | } 40 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,1,r)) 41 | } 42 | 43 | 44 | //删除API 45 | func UserDelete(c echo.Context) error { 46 | userId := c.FormValue("userId") 47 | r := dao.UserDelete(userId) 48 | if r == "error" { 49 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataError,0,nil)) 50 | } 51 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,0,nil)) 52 | } 53 | 54 | //用户和项目绑定 55 | func UserProjectSave(c echo.Context) error { 56 | userId := c.FormValue("userId") 57 | projectIds := c.FormValue("project_ids") 58 | if projectIds == "" { 59 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataLoss,0,nil)) 60 | } 61 | r := dao.UserProjectSave(userId,projectIds) 62 | if r == "error" { 63 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataError,0,nil)) 64 | } 65 | return c.JSON(200,base.RetunMsgFunc(base.CodeDataSuccess,0,nil)) 66 | } -------------------------------------------------------------------------------- /apidoc.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : 192.168.2.150 5 | Source Server Version : 50624 6 | Source Host : 192.168.2.150:3306 7 | Source Database : apidoc 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50624 11 | File Encoding : 65001 12 | 13 | Date: 2018-10-19 04:32:35 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for apidoc_api 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `apidoc_api`; 22 | CREATE TABLE `apidoc_api` ( 23 | `api_id` varchar(64) NOT NULL COMMENT 'api 的id', 24 | `sort_id` varchar(64) DEFAULT '0' COMMENT '分类id', 25 | `project_id` varchar(64) DEFAULT '0' COMMENT '项目id', 26 | `api_name` varchar(255) DEFAULT NULL COMMENT 'api的名称', 27 | `api_edit_content` text COMMENT 'api的编辑内容', 28 | `api_show_content` text COMMENT 'api的展示内容', 29 | `api_state` int(1) DEFAULT '1' COMMENT '状态(1正常,2冻结,3删除)', 30 | `created_at` int(13) DEFAULT '0' COMMENT '创建时间', 31 | `updated_at` int(13) DEFAULT '0' COMMENT '更新时间', 32 | PRIMARY KEY (`api_id`) 33 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='api表'; 34 | 35 | -- ---------------------------- 36 | -- Records of apidoc_api 37 | -- ---------------------------- 38 | INSERT INTO `apidoc_api` VALUES ('141869d51380344edfc33af9cb867417', '1', '1', '测试2', '### 请求类型: get\n\n### 请求路径: http://127.0.0.1/login\n\n### 请求参数:\n|字段名|字段类型|备注|\n|-|-|-|\n|test|varchar(255)|测试|\n|name|varchar(255)|名称|\n|age|int|年龄|\n\n### 返回数据:\n```\n{\n \"code\":200,\n \"msg\":\"OK\",\n \"total\":5,\n \"data\":[\n {\n \"project_id\":\"1\",\n \"project_name\":\"测试项目\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n },\n {\n \"project_id\":\"2\",\n \"project_name\":\"测试项目2\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n }\n ]\n}\n```', '

请求类型: get

\n

请求路径: http://127.0.0.1/login

\n

请求参数:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
字段名字段类型备注
testvarchar(255)测试
namevarchar(255)名称
ageint年龄
\n

返回数据:

\n
{\n    "code":200,\n    "msg":"OK",\n    "total":5,\n    "data":[\n        {\n            "project_id":"1",\n            "project_name":"测试项目",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        },\n        {\n            "project_id":"2",\n            "project_name":"测试项目2",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        }\n    ]\n}\n
\n', '1', '1537249382', '0'); 39 | INSERT INTO `apidoc_api` VALUES ('440dbd346fd5ea44ff0ef74b45b1e3dd', '1', '1', '测试22', '### 请求类型: get\n\n### 请求路径: http://127.0.0.1/login\n\n### 请求参数:\n|字段名|字段类型|备注|\n|-|-|-|\n|test|varchar(255)|测试|\n|name|varchar(255)|名称|\n|age|int|年龄|\n\n### 返回数据:\n```\n{\n \"code\":200,\n \"msg\":\"OK\",\n \"total\":5,\n \"data\":[\n {\n \"project_id\":\"1\",\n \"project_name\":\"测试项目\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n },\n {\n \"project_id\":\"2\",\n \"project_name\":\"测试项目2\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n }\n ]\n}\n```', '

请求类型: get

\n

请求路径: http://127.0.0.1/login

\n

请求参数:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
字段名字段类型备注
testvarchar(255)测试
namevarchar(255)名称
ageint年龄
\n

返回数据:

\n
{\n    "code":200,\n    "msg":"OK",\n    "total":5,\n    "data":[\n        {\n            "project_id":"1",\n            "project_name":"测试项目",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        },\n        {\n            "project_id":"2",\n            "project_name":"测试项目2",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        }\n    ]\n}\n
\n', '1', '1537496150', '0'); 40 | INSERT INTO `apidoc_api` VALUES ('58abea630967791da4e78665891beb7f', '1', '1', '测试44', '### 请求类型: get\n\n### 请求路径: http://127.0.0.1/login\n\n### 请求参数:\n|字段名|字段类型|备注|\n|-|-|-|\n|test|varchar(255)|测试|\n|name|varchar(255)|名称|\n|age|int|年龄|\n\n### 返回数据:\n```\n{\n \"code\":200,\n \"msg\":\"OK\",\n \"total\":5,\n \"data\":[\n {\n \"project_id\":\"1\",\n \"project_name\":\"测试项目\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n },\n {\n \"project_id\":\"2\",\n \"project_name\":\"测试项目2\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n }\n ]\n}\n```', '

请求类型: get

\n

请求路径: http://127.0.0.1/login

\n

请求参数:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
字段名字段类型备注
testvarchar(255)测试
namevarchar(255)名称
ageint年龄
\n

返回数据:

\n
{\n    "code":200,\n    "msg":"OK",\n    "total":5,\n    "data":[\n        {\n            "project_id":"1",\n            "project_name":"测试项目",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        },\n        {\n            "project_id":"2",\n            "project_name":"测试项目2",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        }\n    ]\n}\n
\n', '1', '1537496175', '0'); 41 | INSERT INTO `apidoc_api` VALUES ('68140de37250b7b5b6cd550745cfd924', 'cae14b5d565f78a64787ed1437de2473', '2', '啦啦啦', '### 请求类型: post\n\n### 请求路径: http://127.0.0.1/login\n\n### 请求参数:\n|字段名|字段类型|备注|\n|-|-|-|\n|test|varchar(255)|测试|\n|name|varchar(255)|名称|\n|age|int|年龄|\n\n### 返回数据:\n```\n{\n \"code\":200,\n \"msg\":\"OK\",\n \"total\":5,\n \"data\":[\n {\n \"project_id\":\"1\",\n \"project_name\":\"测试项目\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n },\n {\n \"project_id\":\"2\",\n \"project_name\":\"测试项目2\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n }\n ]\n}\n```', '

请求类型: post

\n

请求路径: http://127.0.0.1/login

\n

请求参数:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
字段名字段类型备注
testvarchar(255)测试
namevarchar(255)名称
ageint年龄
\n

返回数据:

\n
{\n    "code":200,\n    "msg":"OK",\n    "total":5,\n    "data":[\n        {\n            "project_id":"1",\n            "project_name":"测试项目",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        },\n        {\n            "project_id":"2",\n            "project_name":"测试项目2",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        }\n    ]\n}\n
\n', '1', '1537932225', '0'); 42 | INSERT INTO `apidoc_api` VALUES ('80bb88bb5b8e29f908c11ad8a0303f25', '1', '1', '测试55', '### 请求类型: get\n\n### 请求路径: http://127.0.0.1/login\n\n### 请求参数:\n|字段名|字段类型|备注|\n|-|-|-|\n|test|varchar(255)|测试|\n|name|varchar(255)|名称|\n|age|int|年龄|\n\n### 返回数据:\n```\n{\n \"code\":200,\n \"msg\":\"OK\",\n \"total\":5,\n \"data\":[\n {\n \"project_id\":\"1\",\n \"project_name\":\"测试项目\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n },\n {\n \"project_id\":\"2\",\n \"project_name\":\"测试项目2\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n }\n ]\n}\n```', '

请求类型: get

\n

请求路径: http://127.0.0.1/login

\n

请求参数:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
字段名字段类型备注
testvarchar(255)测试
namevarchar(255)名称
ageint年龄
\n

返回数据:

\n
{\n    "code":200,\n    "msg":"OK",\n    "total":5,\n    "data":[\n        {\n            "project_id":"1",\n            "project_name":"测试项目",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        },\n        {\n            "project_id":"2",\n            "project_name":"测试项目2",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        }\n    ]\n}\n
\n', '1', '1537496190', '0'); 43 | INSERT INTO `apidoc_api` VALUES ('9daa355af458c8a126bab215a4a68d89', '1', '1', '测试11', '### 请求类型: get\n\n### 请求路径: http://127.0.0.1/login\n\n### 请求参数:\n|字段名|字段类型|备注|\n|-|-|-|\n|test|varchar(255)|测试|\n|name|varchar(255)|名称|\n|age|int|年龄|\n\n### 返回数据:\n```\n{\n \"code\":200,\n \"msg\":\"OK\",\n \"total\":5,\n \"data\":[\n {\n \"project_id\":\"1\",\n \"project_name\":\"测试项目\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n },\n {\n \"project_id\":\"2\",\n \"project_name\":\"测试项目2\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n }\n ]\n}\n```', '

请求类型: get

\n

请求路径: http://127.0.0.1/login

\n

请求参数:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
字段名字段类型备注
testvarchar(255)测试
namevarchar(255)名称
ageint年龄
\n

返回数据:

\n
{\n    "code":200,\n    "msg":"OK",\n    "total":5,\n    "data":[\n        {\n            "project_id":"1",\n            "project_name":"测试项目",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        },\n        {\n            "project_id":"2",\n            "project_name":"测试项目2",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        }\n    ]\n}\n
\n', '1', '1537496137', '0'); 44 | INSERT INTO `apidoc_api` VALUES ('c8949f4688484f6ad6fc0b6dbaebeb7c', '1', '1', '测试33', '### 请求类型: get\n\n### 请求路径: http://127.0.0.1/login\n\n### 请求参数:\n|字段名|字段类型|备注|\n|-|-|-|\n|test|varchar(255)|测试|\n|name|varchar(255)|名称|\n|age|int|年龄|\n\n### 返回数据:\n```\n{\n \"code\":200,\n \"msg\":\"OK\",\n \"total\":5,\n \"data\":[\n {\n \"project_id\":\"1\",\n \"project_name\":\"测试项目\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n },\n {\n \"project_id\":\"2\",\n \"project_name\":\"测试项目2\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n }\n ]\n}\n```', '

请求类型: get

\n

请求路径: http://127.0.0.1/login

\n

请求参数:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
字段名字段类型备注
testvarchar(255)测试
namevarchar(255)名称
ageint年龄
\n

返回数据:

\n
{\n    "code":200,\n    "msg":"OK",\n    "total":5,\n    "data":[\n        {\n            "project_id":"1",\n            "project_name":"测试项目",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        },\n        {\n            "project_id":"2",\n            "project_name":"测试项目2",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        }\n    ]\n}\n
\n', '1', '1537496162', '0'); 45 | INSERT INTO `apidoc_api` VALUES ('d440f8fc5830b7c2f2bbfb1f602fa40c', '1', '1', '测试', '### 请求类型: get\n\n### 请求路径: http://127.0.0.1/login\n\n### 请求参数:\n|字段名|字段类型|备注|\n|-|-|-|\n|test|varchar(255)|测试|\n|name|varchar(255)|名称|\n|age|int|年龄|\n\n### 返回数据:\n```\n{\n \"code\":200,\n \"msg\":\"OK\",\n \"total\":5,\n \"data\":[\n {\n \"project_id\":\"1\",\n \"project_name\":\"测试项目\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n },\n {\n \"project_id\":\"2\",\n \"project_name\":\"测试项目2\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n }\n ]\n}\n```', '

请求类型: get

\n

请求路径: http://127.0.0.1/login

\n

请求参数:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
字段名字段类型备注
testvarchar(255)测试
namevarchar(255)名称
ageint年龄
\n

返回数据:

\n
{\n    "code":200,\n    "msg":"OK",\n    "total":5,\n    "data":[\n        {\n            "project_id":"1",\n            "project_name":"测试项目",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        },\n        {\n            "project_id":"2",\n            "project_name":"测试项目2",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        }\n    ]\n}\n
\n', '1', '1537249335', '0'); 46 | INSERT INTO `apidoc_api` VALUES ('e6a1849c79c7c330b0bd3ef473636fcc', '253d8c0b00f990b7548328b2de559a7b', '2', '测试1', '### 请求类型: get\n\n### 请求路径: http://127.0.0.1/login\n\n### 请求参数:\n|字段名|字段类型|备注|\n|-|-|-|\n|test|varchar(255)|测试|\n|name|varchar(255)|名称|\n|age|int|年龄|\n\n### 返回数据:\n```\n{\n \"code\":200,\n \"msg\":\"OK\",\n \"total\":5,\n \"data\":[\n {\n \"project_id\":\"1\",\n \"project_name\":\"测试项目\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n },\n {\n \"project_id\":\"2\",\n \"project_name\":\"测试项目2\",\n \"project_state\":1,\n \"created_at\":0,\n \"updated_at\":0\n }\n ]\n}\n```', '

请求类型: get

\n

请求路径: http://127.0.0.1/login

\n

请求参数:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
字段名字段类型备注
testvarchar(255)测试
namevarchar(255)名称
ageint年龄
\n

返回数据:

\n
{\n    "code":200,\n    "msg":"OK",\n    "total":5,\n    "data":[\n        {\n            "project_id":"1",\n            "project_name":"测试项目",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        },\n        {\n            "project_id":"2",\n            "project_name":"测试项目2",\n            "project_state":1,\n            "created_at":0,\n            "updated_at":0\n        }\n    ]\n}\n
\n', '1', '1537853247', '0'); 47 | 48 | -- ---------------------------- 49 | -- Table structure for apidoc_project 50 | -- ---------------------------- 51 | DROP TABLE IF EXISTS `apidoc_project`; 52 | CREATE TABLE `apidoc_project` ( 53 | `project_id` varchar(64) NOT NULL COMMENT '项目id', 54 | `project_name` varchar(255) DEFAULT NULL COMMENT '项目名称', 55 | `project_state` int(1) DEFAULT '1' COMMENT '状态(1正常,2冻结,3删除)', 56 | `created_at` int(13) DEFAULT '0' COMMENT '创建时间', 57 | `updated_at` int(13) DEFAULT '0' COMMENT '更新时间', 58 | PRIMARY KEY (`project_id`) 59 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目表'; 60 | 61 | -- ---------------------------- 62 | -- Records of apidoc_project 63 | -- ---------------------------- 64 | INSERT INTO `apidoc_project` VALUES ('2', '测试项目2', '1', '0', '0'); 65 | INSERT INTO `apidoc_project` VALUES ('3d92f7981f0ad3892524391f5388c7cf', '测试项目7', '1', '1536715489', '0'); 66 | INSERT INTO `apidoc_project` VALUES ('40d647ea3d13de2492909d2713b0a849', '测试项目6', '1', '1536715273', '0'); 67 | INSERT INTO `apidoc_project` VALUES ('4495954a3c80f1b670c3faba7f948b15', '大家好大家好大家好大家好大家好', '1', '1539066759', '0'); 68 | INSERT INTO `apidoc_project` VALUES ('b743b68c6dbb6824ba9e19a5592a324d', '测试数据5', '1', '1536310398', '0'); 69 | INSERT INTO `apidoc_project` VALUES ('c14611b7fb00e43fd4013d8b3e4d7de6', '测试数据4', '1', '1536310166', '0'); 70 | INSERT INTO `apidoc_project` VALUES ('d4fc216036f928bb307cde968f6c899e', '测试项目x', '1', '1536310019', '1536889646'); 71 | 72 | -- ---------------------------- 73 | -- Table structure for apidoc_sort 74 | -- ---------------------------- 75 | DROP TABLE IF EXISTS `apidoc_sort`; 76 | CREATE TABLE `apidoc_sort` ( 77 | `sort_id` varchar(64) NOT NULL COMMENT '分类id', 78 | `sort_top_id` varchar(64) DEFAULT '0' COMMENT '分类最上级id (默认0)', 79 | `sort_pid` varchar(64) DEFAULT '0' COMMENT '分类上级id (默认0)', 80 | `project_id` varchar(64) DEFAULT '0' COMMENT '项目id', 81 | `sort_name` varchar(255) DEFAULT '无' COMMENT '分类名称', 82 | `sort_seq` int(11) DEFAULT '1000' COMMENT '分类排序', 83 | `status` int(1) DEFAULT '1' COMMENT '状态(1正常,2冻结,3删除)', 84 | `created_at` int(13) DEFAULT '0' COMMENT '创建时间', 85 | `updated_at` int(13) DEFAULT '0' COMMENT '更新时间', 86 | PRIMARY KEY (`sort_id`) 87 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分类表'; 88 | 89 | -- ---------------------------- 90 | -- Records of apidoc_sort 91 | -- ---------------------------- 92 | INSERT INTO `apidoc_sort` VALUES ('1', '0', '0', '1', '测试管理', '1000', '1', '0', '0'); 93 | INSERT INTO `apidoc_sort` VALUES ('2', '0', '0', '1', '其他管理', '1000', '1', '0', '0'); 94 | INSERT INTO `apidoc_sort` VALUES ('253d8c0b00f990b7548328b2de559a7b', '', '', '2', '测试分类', '0', '1', '1536903977', '0'); 95 | INSERT INTO `apidoc_sort` VALUES ('3bb85d952bb5a14c1faab9fbcd9e02f3', '', '', '1', '项目管理', '0', '1', '1536715863', '0'); 96 | INSERT INTO `apidoc_sort` VALUES ('5cc83eff13f87c3cf38df3d1398f6d72', '', '', '1', '测试1', '0', '1', '1537496094', '0'); 97 | INSERT INTO `apidoc_sort` VALUES ('7458b6cdbabe5f52a47f157884bdacbc', '', '', '1', '测试3', '0', '1', '1537496107', '0'); 98 | INSERT INTO `apidoc_sort` VALUES ('86a74b14bf9a59da22a85928bc29e466', '', '', '2', '大家好大家好大家好', '0', '1', '1537854653', '0'); 99 | INSERT INTO `apidoc_sort` VALUES ('cae14b5d565f78a64787ed1437de2473', '', '', '2', '测试', '0', '1', '1537853098', '0'); 100 | INSERT INTO `apidoc_sort` VALUES ('ec1ee2fbb0d42339d550936024706213', '', '', '1', '测试2', '0', '1', '1537496101', '0'); 101 | INSERT INTO `apidoc_sort` VALUES ('ffdf64719cc14afc05468abb7c4ae5a5', '', '', 'b743b68c6dbb6824ba9e19a5592a324d', '新填分类', '0', '1', '1537868098', '0'); 102 | 103 | -- ---------------------------- 104 | -- Table structure for apidoc_user 105 | -- ---------------------------- 106 | DROP TABLE IF EXISTS `apidoc_user`; 107 | CREATE TABLE `apidoc_user` ( 108 | `user_id` varchar(64) NOT NULL COMMENT '用户id', 109 | `user_username` varchar(255) DEFAULT NULL COMMENT '用户名', 110 | `user_password` varchar(255) DEFAULT NULL COMMENT '密码', 111 | `created_at` int(13) DEFAULT '0' COMMENT '创建时间', 112 | `updated_at` int(13) DEFAULT '0' COMMENT '修改时间', 113 | `user_state` int(1) DEFAULT '1' COMMENT '状态(1正常,2冻结,3删除)', 114 | PRIMARY KEY (`user_id`) 115 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; 116 | 117 | -- ---------------------------- 118 | -- Records of apidoc_user 119 | -- ---------------------------- 120 | INSERT INTO `apidoc_user` VALUES ('1', 'admin', '1ee40133a1d9cb7c52ae50845558c3f6', '0', '1536628262', '1'); 121 | INSERT INTO `apidoc_user` VALUES ('3ecd7ea7f3c8a77f9eb8d1c71003dd9e', 'kslamp', '1ee40133a1d9cb7c52ae50845558c3f6', '1536712161', '0', '1'); 122 | INSERT INTO `apidoc_user` VALUES ('97130659c466682c14e692c3db4e555d', 'hades', '1ee40133a1d9cb7c52ae50845558c3f6', '1536731453', '0', '1'); 123 | INSERT INTO `apidoc_user` VALUES ('fa562196c8c659bd3dd30dede7fc68cf', 'test', '1ee40133a1d9cb7c52ae50845558c3f6', '1536630488', '0', '1'); 124 | 125 | -- ---------------------------- 126 | -- Table structure for apidoc_user_project 127 | -- ---------------------------- 128 | DROP TABLE IF EXISTS `apidoc_user_project`; 129 | CREATE TABLE `apidoc_user_project` ( 130 | `user_id` varchar(64) DEFAULT '0' COMMENT '用户id', 131 | `project_id` varchar(64) DEFAULT '0' COMMENT '项目id' 132 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户项目表'; 133 | 134 | -- ---------------------------- 135 | -- Records of apidoc_user_project 136 | -- ---------------------------- 137 | INSERT INTO `apidoc_user_project` VALUES ('1', '1'); 138 | INSERT INTO `apidoc_user_project` VALUES ('1', '2'); 139 | INSERT INTO `apidoc_user_project` VALUES ('1', 'd4fc216036f928bb307cde968f6c899e'); 140 | INSERT INTO `apidoc_user_project` VALUES ('1', 'c14611b7fb00e43fd4013d8b3e4d7de6'); 141 | INSERT INTO `apidoc_user_project` VALUES ('1', 'b743b68c6dbb6824ba9e19a5592a324d'); 142 | INSERT INTO `apidoc_user_project` VALUES ('fa562196c8c659bd3dd30dede7fc68cf', '1'); 143 | INSERT INTO `apidoc_user_project` VALUES ('fa562196c8c659bd3dd30dede7fc68cf', '2'); 144 | INSERT INTO `apidoc_user_project` VALUES ('fa562196c8c659bd3dd30dede7fc68cf', 'd4fc216036f928bb307cde968f6c899e'); 145 | INSERT INTO `apidoc_user_project` VALUES ('1', '40d647ea3d13de2492909d2713b0a849'); 146 | INSERT INTO `apidoc_user_project` VALUES ('1', '3d92f7981f0ad3892524391f5388c7cf'); 147 | INSERT INTO `apidoc_user_project` VALUES ('1', '058e9375c2e893bb47bab15320e9640a'); 148 | INSERT INTO `apidoc_user_project` VALUES ('fa562196c8c659bd3dd30dede7fc68cf', '4495954a3c80f1b670c3faba7f948b15'); 149 | 150 | -------------------------------------------------------------------------------- /app.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/labstack/echo" 5 | "github.com/labstack/echo/middleware" 6 | "apidocserver/action" 7 | "apidocserver/base" 8 | "apidocserver/middle" 9 | ) 10 | 11 | func main() { 12 | e := echo.New() 13 | base.Config() 14 | e.Use(middleware.Logger()) 15 | e.Use(middleware.Recover()) 16 | e.Use(middleware.CORS()) 17 | e.Static("/", "") 18 | e.POST("/login", action.Login) 19 | e.GET("/logout", action.Logout) 20 | 21 | e.GET("/project/list", action.ProjectList,middle.LoginMiddle) 22 | e.POST("/project/save", action.ProjectSave,middle.LoginMiddle) 23 | e.GET("/project/delete", action.ProjectDelete,middle.LoginMiddle) 24 | 25 | e.GET("/sort/list", action.SortList,middle.LoginMiddle) 26 | e.GET("/sort/plist", action.SortPList,middle.LoginMiddle) 27 | e.GET("/sort/sort_api_list", action.SortApiList,middle.LoginMiddle) 28 | e.POST("/sort/save", action.SortSave,middle.LoginMiddle) 29 | e.GET("/sort/delete", action.SortDelete,middle.LoginMiddle) 30 | 31 | e.GET("/api/list", action.ApiList) 32 | e.GET("/api/content", action.ApiContent,middle.LoginMiddle) 33 | e.POST("/api/save", action.ApiSvae,middle.LoginMiddle) 34 | e.GET("/api/delete", action.ApiDelete,middle.LoginMiddle) 35 | e.POST("/api/upload", action.FileUpload) 36 | 37 | e.GET("/user/list", action.UserList,middle.LoginMiddle) 38 | e.POST("/user/save", action.UserSave,middle.LoginMiddle) 39 | e.GET("/user/delete", action.UserDelete,middle.LoginMiddle) 40 | e.POST("/user/user_project_save", action.UserProjectSave,middle.LoginMiddle) 41 | 42 | e.GET("/msg_list", action.MsgList) 43 | e.GET("/ws", action.IMSever) 44 | 45 | e.GET("/group/list",action.GroupList,middle.LoginMiddle) 46 | e.Logger.Fatal(e.Start(":9001")) 47 | } 48 | 49 | -------------------------------------------------------------------------------- /base/base.go: -------------------------------------------------------------------------------- 1 | package base 2 | 3 | import ( 4 | "time" 5 | "crypto/rand" 6 | "encoding/base64" 7 | "io" 8 | "crypto/md5" 9 | "encoding/hex" 10 | "reflect" 11 | "strconv" 12 | "fmt" 13 | ) 14 | 15 | const MD5 = "12qw12er34sd" 16 | 17 | const ( 18 | MysqlMaxLifetime = 10*60*1000 19 | MysqlMaxOpenConn = 50 20 | MysqlMaxIdleConn = 1000 21 | ) 22 | 23 | const ( 24 | RedisMaxIdle = 3 25 | RedisMaxActive = 5 26 | RedisMIdleTimeout = 240 * time.Second 27 | ) 28 | 29 | //分页 30 | func Offer(pageNum,pageSize string) (int,int) { 31 | pN,err:=strconv.Atoi(pageNum) 32 | if err!= nil{ 33 | fmt.Println("offer_err:",err) 34 | return 0,0 35 | } 36 | pS,err:=strconv.Atoi(pageSize) 37 | if err!= nil{ 38 | fmt.Println("offer_err:",err) 39 | return 0,0 40 | } 41 | of := (pN-1) * pS 42 | 43 | return pS,of 44 | } 45 | 46 | 47 | //生成32位md5字串 48 | func GetMd5String(s string) string { 49 | h := md5.New() 50 | h.Write([]byte(s)) 51 | return hex.EncodeToString(h.Sum(nil)) 52 | } 53 | 54 | //生成Guid字串 55 | func UniqueId() string { 56 | b := make([]byte, 48) 57 | 58 | if _, err := io.ReadFull(rand.Reader, b); err != nil { 59 | return "" 60 | } 61 | return GetMd5String(base64.URLEncoding.EncodeToString(b)) 62 | } 63 | 64 | //结构体转map 65 | func Struct2Map(obj interface{}) (data map[string]interface{}, err error) { 66 | data = make(map[string]interface{}) 67 | objT := reflect.TypeOf(obj) 68 | objV := reflect.ValueOf(obj) 69 | for i := 0; i < objT.NumField(); i++ { 70 | data[objT.Field(i).Name] = objV.Field(i).Interface() 71 | } 72 | err = nil 73 | return 74 | } 75 | 76 | 77 | /*type ReturnMsg struct { 78 | Code int `json:"code"` 79 | Msg string `json:"msg"` 80 | Total int64 `json:"total"` 81 | Data interface{} `json:"data"` 82 | } 83 | 84 | //返回200数据 85 | func (rm *ReturnMsg) Code200(t int64,d interface{}) { 86 | rm.Code = 200 87 | rm.Msg = "OK" 88 | rm.Total = t 89 | rm.Data = d 90 | } 91 | 92 | 93 | //返回517数据 94 | func (rm *ReturnMsg) Code517() { 95 | rm.Code = 517 96 | rm.Msg = "empty" 97 | rm.Total = 0 98 | rm.Data = nil 99 | } 100 | 101 | //返回400数据 102 | func (rm *ReturnMsg) Code400() { 103 | rm.Code = 400 104 | rm.Msg = "data loss" 105 | rm.Total = 0 106 | rm.Data = nil 107 | } 108 | 109 | //返回401数据 110 | func (rm *ReturnMsg) Code401() { 111 | rm.Code = 401 112 | rm.Msg = "error" 113 | rm.Total = 0 114 | rm.Data = nil 115 | } 116 | 117 | //返回402数据 118 | func (rm *ReturnMsg) Code402() { 119 | rm.Code = 402 120 | rm.Msg = "user not logged in" 121 | rm.Total = 0 122 | rm.Data = nil 123 | }*/ 124 | 125 | 126 | //--------Code返回码结构体 127 | type Code struct { 128 | Code int 129 | Msg string 130 | } 131 | 132 | //--------定义返回码,以及返回信息 133 | var ( 134 | CodeDataSuccess = Code{Code:200,Msg:"success"} 135 | CodeDataEmpty = Code{Code:517,Msg:"empty"} 136 | CodeDataLoss = Code{Code:400,Msg:"data loss"} 137 | CodeDataError = Code{Code:401,Msg:"data error"} 138 | CodeUserNotLogin = Code{Code:402,Msg:"user not logged in"} 139 | CodeUserHas = Code{Code:403,Msg:"user has"} 140 | ) 141 | 142 | 143 | 144 | //--------对需要返回的信息进行封装,方便对数据进行进一步处理 145 | type ReturnMsg struct { 146 | Code int `json:"code"` 147 | Msg string `json:"msg"` 148 | Total int64 `json:"total"` 149 | Data interface{} `json:"data"` 150 | } 151 | 152 | //--------对需要返回的信息进行赋值,并以结构体返回 153 | func RetunMsgFunc(code Code,total int64,data interface{}) *ReturnMsg { 154 | rm := new(ReturnMsg) 155 | rm.Code = code.Code 156 | rm.Msg = code.Msg 157 | rm.Total = total 158 | rm.Data = data 159 | return rm 160 | } -------------------------------------------------------------------------------- /base/config.go: -------------------------------------------------------------------------------- 1 | package base 2 | 3 | import ( 4 | "github.com/kylelemons/go-gypsy/yaml" 5 | "fmt" 6 | ) 7 | 8 | var RedisUrl string 9 | var RedisPassword string 10 | var MysqlUrl string 11 | 12 | 13 | func Config() { 14 | config, err := yaml.ReadFile("conf.yaml") 15 | if err != nil { 16 | fmt.Println("config:",err) 17 | return 18 | } 19 | RedisUrl,err = config.Get("RedisUrl") 20 | RedisPassword,err = config.Get("RedisPassword") 21 | MysqlUrl,err = config.Get("MysqlUrl") 22 | if err != nil{ 23 | fmt.Println("config-data:",err) 24 | } 25 | fmt.Println("redis_config:",RedisUrl,RedisPassword) 26 | fmt.Println("mysql_config:",MysqlUrl) 27 | } 28 | -------------------------------------------------------------------------------- /conf.yaml: -------------------------------------------------------------------------------- 1 | MysqlUrl : db:123456@tcp(192.168.1.150:3306)/apidoc?charset=utf8mb4 2 | RedisUrl : 127.0.0.1:6379 3 | RedisPassword : 123456 -------------------------------------------------------------------------------- /dao/ApiDao.go: -------------------------------------------------------------------------------- 1 | package dao 2 | 3 | import ( 4 | "fmt" 5 | "apidocserver/xrom_mysql" 6 | "apidocserver/models" 7 | "apidocserver/base" 8 | "time" 9 | ) 10 | 11 | 12 | //api列表 13 | func ApiContentList(projectId string) []models.ApidocApi { 14 | engine := xrom_mysql.Client() 15 | apis := make([]models.ApidocApi,0) 16 | err:= engine.Cols("api_id", "sort_id","api_show_content","api_edit_content","api_name").Asc("created_at").Where("project_id = ? ",projectId).Find(&apis) 17 | if err!=nil { 18 | fmt.Println(err) 19 | return nil 20 | } 21 | return apis 22 | } 23 | 24 | //api列表 25 | func ApiList(projectId string) []models.ApidocApi { 26 | engine := xrom_mysql.Client() 27 | apis := make([]models.ApidocApi,0) 28 | err:= engine.Cols("api_id", "sort_id","api_name").Asc("created_at").Where("project_id = ? ",projectId).Find(&apis) 29 | if err!=nil { 30 | fmt.Println(err) 31 | return nil 32 | } 33 | return apis 34 | } 35 | 36 | //api保存 37 | func ApiSvae(apiId string,sortId string,projectId string,apiName string,apiEditContent string,apiShowContent string) string { 38 | engine := xrom_mysql.Client() 39 | api := new(models.ApidocApi) 40 | api.SortId = sortId 41 | api.ProjectId = projectId 42 | api.ApiName = apiName 43 | api.ApiEditContent = apiEditContent 44 | api.ApiShowContent = apiShowContent 45 | if apiId == "" { 46 | api.ApiId = base.UniqueId() 47 | api.ApiState = 1 48 | api.CreatedAt = int(time.Now().Unix()) 49 | _,err := engine.Insert(api) 50 | if err != nil { 51 | fmt.Println("sort_save:",err) 52 | return "error" 53 | } 54 | return api.ApiId 55 | }else { 56 | api.UpdatedAt = int(time.Now().Unix()) 57 | _, err := engine.Id(apiId).Update(api) 58 | if err != nil { 59 | fmt.Println("sort_save:",err) 60 | return "error" 61 | } 62 | return apiId 63 | } 64 | 65 | } 66 | 67 | func ApiContent(apiId string) models.ApidocApi { 68 | engine := xrom_mysql.Client() 69 | api := new(models.ApidocApi) 70 | b,err := engine.Where("api_id = ? ",apiId).Get(api) 71 | fmt.Println(b,err) 72 | return *api 73 | } 74 | 75 | func ApiDelete(apiId string) string { 76 | engine := xrom_mysql.Client() 77 | api := new(models.ApidocApi) 78 | b,err := engine.Id(apiId).Delete(api) 79 | fmt.Println(b,err) 80 | if err != nil { 81 | return "error" 82 | } 83 | return "" 84 | } -------------------------------------------------------------------------------- /dao/GroupDao.go: -------------------------------------------------------------------------------- 1 | package dao 2 | 3 | import ( 4 | "apidocserver/xrom_mysql" 5 | "apidocserver/models" 6 | ) 7 | 8 | //获取用户群组 9 | func GroupListByUserId(userId string) []models.ImGroup { 10 | engine := xrom_mysql.Client() 11 | groups := make([]models.ImGroup,0) 12 | engine.Join("INNER", "im_group_mumber", "im_group.group_id = im_group_mumber.group_id").Where(" im_group_mumber.user_id = ?",userId).Find(&groups) 13 | return groups 14 | } -------------------------------------------------------------------------------- /dao/ImMsgDao.go: -------------------------------------------------------------------------------- 1 | package dao 2 | 3 | import ( 4 | "fmt" 5 | "apidocserver/models" 6 | "apidocserver/xrom_mysql" 7 | "apidocserver/base" 8 | ) 9 | //获得用户聊天列表 10 | //p2p 点对点单聊 11 | //group 群聊 12 | func MsgList(userFromId string,userToId string,startTime string,endTime string,msgType string, 13 | pageNum string,pageSize string) ([]models.ImMsg,int64,error) { 14 | sql := " 1 = 1 " 15 | if userFromId != "" && userToId!=""{ 16 | if msgType == "p2p" { 17 | sql = sql + " AND (msg_from_id = '" + userFromId +"' AND msg_to_id = '" + userToId + "') OR (msg_from_id = '" + userToId + "' AND msg_to_id = '" + userFromId + "')" 18 | }else if msgType == "group" { 19 | sql = sql + " AND msg_to_id = '" + userToId + "'" 20 | } 21 | } 22 | if startTime != "0" { 23 | sql = sql + " AND created_at >= " + startTime 24 | } 25 | if endTime != "0" { 26 | sql = sql + " AND created_at < " + endTime 27 | } 28 | fmt.Println("sql:",sql) 29 | msg := make([]models.ImMsg, 0) 30 | engine := xrom_mysql.Client() 31 | if engine == nil { 32 | fmt.Println("mysql连接失败") 33 | return nil,0,nil 34 | } 35 | var err error 36 | var count int64 37 | if userFromId == "" && userToId == "" && startTime == "" && endTime == ""{ 38 | err = engine.Asc("created_at").Find(&msg) 39 | }else { 40 | m := new(models.ImMsg) 41 | count, err = engine.Where(sql).Count(m) 42 | if pageNum == "0" || pageSize == "0"{ 43 | err = engine.Where(sql).Asc("created_at").Find(&msg) 44 | }else { 45 | pS,of := base.Offer(pageNum,pageSize) 46 | if err!=nil { 47 | fmt.Println("获取数量错误:",err) 48 | } 49 | err = engine.Where(sql).Asc("created_at").Limit(pS,of).Find(&msg) 50 | } 51 | 52 | } 53 | return msg,count,err 54 | } 55 | 56 | 57 | -------------------------------------------------------------------------------- /dao/ProjectDao.go: -------------------------------------------------------------------------------- 1 | package dao 2 | 3 | import ( 4 | "apidocserver/models" 5 | "apidocserver/xrom_mysql" 6 | "fmt" 7 | "apidocserver/base" 8 | "time" 9 | ) 10 | //获得项目列表 11 | func ProjectList(userId string) ([]models.ApidocProject,int64) { 12 | engine := xrom_mysql.Client() 13 | projects := make([]models.ApidocProject,0) 14 | var err error 15 | if userId == "" { 16 | err = engine.Asc("created_at").Find(&projects) 17 | }else { 18 | sql := "SELECT p.* FROM apidoc_project AS p,apidoc_user_project AS up WHERE p.project_id = up.project_id AND up.user_id = ? ORDER BY created_at ASC" 19 | err = engine.SQL(sql,userId).Find(&projects) 20 | } 21 | 22 | if err!=nil { 23 | fmt.Println(err) 24 | return nil,0 25 | } 26 | t := int64(len(projects)) 27 | return projects,t 28 | } 29 | 30 | //编辑项目 31 | func ProjectSave(userId string,projectId string,projectName string) string { 32 | engine := xrom_mysql.Client() 33 | project := new(models.ApidocProject) 34 | if projectId == "" { 35 | project.ProjectId = base.UniqueId() 36 | project.ProjectName = projectName 37 | project.ProjectState = 1 38 | project.CreatedAt = int(time.Now().Unix()) 39 | 40 | userProject := new(models.ApidocUserProject) 41 | userProject.UserId = userId 42 | userProject.ProjectId = project.ProjectId 43 | session := engine.NewSession() 44 | defer session.Close() 45 | err := session.Begin() 46 | _, err = session.Insert(project) 47 | if err != nil { 48 | fmt.Println(err) 49 | session.Rollback() 50 | return "error" 51 | } 52 | _, err = session.Insert(userProject) 53 | if err != nil { 54 | fmt.Println(err) 55 | session.Rollback() 56 | return "error" 57 | } 58 | err = session.Commit() 59 | if err != nil { 60 | fmt.Println(err) 61 | return "error" 62 | } 63 | return project.ProjectId 64 | }else { 65 | project.ProjectName = projectName 66 | project.UpdatedAt = int(time.Now().Unix()) 67 | _, err := engine.Id(projectId).Update(project) 68 | if err != nil { 69 | fmt.Println("project_save:",err) 70 | return "error" 71 | } 72 | return projectId 73 | } 74 | } 75 | 76 | 77 | func ProjectDelete(projectId string) string { 78 | engine := xrom_mysql.Client() 79 | project := new(models.ApidocProject) 80 | b,err := engine.Id(projectId).Delete(project) 81 | fmt.Println(b,err) 82 | if err != nil { 83 | fmt.Println("ProjectDelete:",err) 84 | return "error" 85 | } 86 | return "" 87 | } -------------------------------------------------------------------------------- /dao/SortDao.go: -------------------------------------------------------------------------------- 1 | package dao 2 | 3 | import ( 4 | "fmt" 5 | "apidocserver/xrom_mysql" 6 | "apidocserver/base" 7 | "time" 8 | "apidocserver/models" 9 | ) 10 | 11 | //api分类列表 12 | func SortList(projectId string) []models.ApidocSort { 13 | engine := xrom_mysql.Client() 14 | sorts := make([]models.ApidocSort,0) 15 | err:= engine.Cols("sort_id", "sort_name","sort_pid").Desc("sort_seq").Where("project_id = ?",projectId).Find(&sorts) 16 | if err!=nil { 17 | fmt.Println(err) 18 | return nil 19 | } 20 | return sorts 21 | } 22 | 23 | //api分页列表 24 | func SortPList(pageSize int,offer int,projectId string) ([]models.ApidocSort,int64) { 25 | engine := xrom_mysql.Client() 26 | sorts := make([]models.ApidocSort,0) 27 | err:= engine.Desc("created_at").Where("project_id = ?",projectId).Limit(pageSize,offer).Find(&sorts) 28 | sort := new(models.ApidocSort) 29 | total, err := engine.Where("project_id = ?" ,projectId).Count(sort) 30 | if err!=nil { 31 | fmt.Println(err) 32 | return nil,0 33 | } 34 | return sorts,total 35 | } 36 | 37 | 38 | //保存api分类 39 | func SortSave(sortId string,projectId string,sortName string,sortPid string,sortSeq int) string { 40 | engine := xrom_mysql.Client() 41 | sort := new(models.ApidocSort) 42 | if sortId == "" { 43 | sort.SortId = base.UniqueId() 44 | sort.ProjectId = projectId 45 | sort.SortName = sortName 46 | sort.SortPid = sortPid 47 | sort.SortSeq = sortSeq 48 | sort.Status = 1 49 | sort.CreatedAt = int(time.Now().Unix()) 50 | _,err := engine.Insert(sort) 51 | if err != nil { 52 | fmt.Println("sort_save:",err) 53 | return "error" 54 | } 55 | return sort.SortId 56 | }else { 57 | sort.SortName = sortName 58 | sort.SortPid = sortPid 59 | sort.SortSeq = sortSeq 60 | sort.UpdatedAt = int(time.Now().Unix()) 61 | _, err := engine.Id(sortId).Update(sort) 62 | if err != nil { 63 | fmt.Println("sort_save:",err) 64 | return "error" 65 | } 66 | return sortId 67 | } 68 | } 69 | 70 | 71 | //删除目录 72 | func SortDelete(sortId string) string { 73 | engine := xrom_mysql.Client() 74 | sort := new(models.ApidocSort) 75 | b,err := engine.Id(sortId).Delete(sort) 76 | fmt.Println(b,err) 77 | if err != nil { 78 | return "error" 79 | } 80 | return "" 81 | } -------------------------------------------------------------------------------- /dao/UserDao.go: -------------------------------------------------------------------------------- 1 | package dao 2 | 3 | import ( 4 | "apidocserver/xrom_mysql" 5 | "apidocserver/models" 6 | "fmt" 7 | "apidocserver/base" 8 | "time" 9 | ) 10 | 11 | //获得用户列表 12 | func UserList(pageSize int,offer int) ([]models.ApidocUser,int64){ 13 | engine := xrom_mysql.Client() 14 | users := make([]models.ApidocUser,0) 15 | err:= engine.Cols("user_id", "user_username","created_at").Desc("created_at").Where("user_id <> '1' ").Limit(pageSize,offer).Find(&users) 16 | user := new(models.ApidocUser) 17 | total, err := engine.Where("user_id <> '1'").Count(user) 18 | if err!=nil { 19 | fmt.Println(err) 20 | return nil,0 21 | } 22 | return users,total 23 | } 24 | 25 | //根据用户名查找用户 26 | func FindUserName(username string) models.ApidocUser { 27 | engine := xrom_mysql.Client() 28 | user := new(models.ApidocUser) 29 | b,err := engine.Where("user_username = ?",username).Get(user) 30 | fmt.Println(b,err) 31 | return *user 32 | } 33 | 34 | 35 | //查找指定用户 36 | func FindUser(username string,password string) models.ApidocUser { 37 | engine := xrom_mysql.Client() 38 | user := new(models.ApidocUser) 39 | b,err := engine.Cols("user_id","user_username").Where("user_username = ? AND user_password = ?",username,password).Get(user) 40 | fmt.Println(b,err) 41 | return *user 42 | } 43 | 44 | //保存用户 45 | func UserSave(userId string,userName string,password string) string { 46 | engine := xrom_mysql.Client() 47 | user := new(models.ApidocUser) 48 | user.UserUsername = userName 49 | user.UserPassword = password 50 | if userId == "" { 51 | user.UserId = base.UniqueId() 52 | user.UserState = 1 53 | user.CreatedAt = int(time.Now().Unix()) 54 | _,err := engine.Insert(user) 55 | if err != nil { 56 | fmt.Println("sort_save:",err) 57 | return "error" 58 | } 59 | return user.UserId 60 | }else { 61 | user.UpdatedAt = int(time.Now().Unix()) 62 | _, err := engine.Id(userId).Update(user) 63 | if err != nil { 64 | fmt.Println("user_save:",err) 65 | return "error" 66 | } 67 | return userId 68 | } 69 | } 70 | 71 | //删除用户 72 | func UserDelete(userId string) string { 73 | engine := xrom_mysql.Client() 74 | user := new(models.ApidocUser) 75 | b,err := engine.Id(userId).Delete(user) 76 | fmt.Println(b,err) 77 | if err != nil { 78 | return "error" 79 | } 80 | return "" 81 | } -------------------------------------------------------------------------------- /dao/UserProjectDao.go: -------------------------------------------------------------------------------- 1 | package dao 2 | 3 | import ( 4 | "fmt" 5 | "apidocserver/xrom_mysql" 6 | "strings" 7 | "apidocserver/models" 8 | ) 9 | 10 | //获得用户项目关系 11 | func UserProjectList(userId string) []models.ApidocUserProject { 12 | engine := xrom_mysql.Client() 13 | userProjects := make([]models.ApidocUserProject,0) 14 | var err error 15 | if userId == "" { 16 | err= engine.Find(&userProjects) 17 | }else { 18 | err= engine.Where("user_id = ?",userId).Find(&userProjects) 19 | } 20 | if err!=nil { 21 | fmt.Println(err) 22 | return nil 23 | } 24 | return userProjects 25 | } 26 | 27 | //保存用户项目关系 28 | func UserProjectSave(userId string,projectIds string) string { 29 | projectIdArr := strings.Split(projectIds,",") 30 | engine := xrom_mysql.Client() 31 | userProject := new(models.ApidocUserProject) 32 | session := engine.NewSession() 33 | defer session.Close() 34 | err := session.Begin() 35 | _, err = session.Where("user_id = ?",userId).Delete(userProject) 36 | if err != nil { 37 | fmt.Println(err) 38 | session.Rollback() 39 | return "error" 40 | } 41 | for _,up := range projectIdArr { 42 | userProject1 := new(models.ApidocUserProject) 43 | userProject1.UserId = userId 44 | userProject1.ProjectId = up 45 | _, err = session.Insert(userProject1) 46 | if err != nil { 47 | fmt.Println(err) 48 | session.Rollback() 49 | return "error" 50 | } 51 | } 52 | err = session.Commit() 53 | if err != nil { 54 | fmt.Println(err) 55 | return "error" 56 | } 57 | return "" 58 | } 59 | -------------------------------------------------------------------------------- /img/14097a569cf76d0d7b205ac87876b54f.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aixinaxc/apidocserver/8a202ebb7fb3d712bfba14fe5d5c71ef32c67ba3/img/14097a569cf76d0d7b205ac87876b54f.jpg -------------------------------------------------------------------------------- /img/7d5a1bae1a055c1ebb4ee44a86801fee.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aixinaxc/apidocserver/8a202ebb7fb3d712bfba14fe5d5c71ef32c67ba3/img/7d5a1bae1a055c1ebb4ee44a86801fee.jpg -------------------------------------------------------------------------------- /img/9bbda18374df39a11dced12b3176741c.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aixinaxc/apidocserver/8a202ebb7fb3d712bfba14fe5d5c71ef32c67ba3/img/9bbda18374df39a11dced12b3176741c.jpeg -------------------------------------------------------------------------------- /img/cc26f7322eb7f9a1fa64872308351cac.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aixinaxc/apidocserver/8a202ebb7fb3d712bfba14fe5d5c71ef32c67ba3/img/cc26f7322eb7f9a1fa64872308351cac.jpg -------------------------------------------------------------------------------- /middle/index.go: -------------------------------------------------------------------------------- 1 | package middle 2 | 3 | import ( 4 | "github.com/labstack/echo" 5 | "apidocserver/base" 6 | "apidocserver/redispool" 7 | ) 8 | 9 | func LoginMiddle(next echo.HandlerFunc) echo.HandlerFunc { 10 | return func(c echo.Context) error { 11 | userId := c.FormValue("user_id") 12 | token := c.FormValue("token") 13 | if userId == "" || token == "" { 14 | return c.JSON(200,base.RetunMsgFunc(base.CodeUserNotLogin,0,nil)) 15 | } 16 | redisToken := redispool.RedisGET(userId + "_ticket") 17 | if redisToken == nil || string(redisToken) == "" || string(redisToken) != token { 18 | return c.JSON(200,base.RetunMsgFunc(base.CodeUserNotLogin,0,nil)) 19 | } 20 | return next(c) 21 | } 22 | } -------------------------------------------------------------------------------- /models/apidoc_api.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type ApidocApi struct { 4 | ApiId string `json:"api_id" xorm:"not null pk comment('api 的id') VARCHAR(64)"` 5 | SortId string `json:"sort_id" xorm:"default '0' comment('分类id') VARCHAR(64)"` 6 | ProjectId string `json:"project_id" xorm:"default '0' comment('项目id') VARCHAR(64)"` 7 | ApiName string `json:"api_name" xorm:"comment('api的名称') VARCHAR(255)"` 8 | ApiEditContent string `json:"api_edit_content" xorm:"comment('api的编辑内容') TEXT"` 9 | ApiShowContent string `json:"api_show_content" xorm:"comment('api的展示内容') TEXT"` 10 | ApiState int `json:"api_state" xorm:"default 1 comment('状态(1正常,2冻结,3删除)') INT(1)"` 11 | CreatedAt int `json:"created_at" xorm:"default 0 comment('创建时间') INT(13)"` 12 | UpdatedAt int `json:"updated_at" xorm:"default 0 comment('更新时间') INT(13)"` 13 | } 14 | -------------------------------------------------------------------------------- /models/apidoc_project.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type ApidocProject struct { 4 | ProjectId string `json:"project_id" xorm:"not null pk comment('项目id') VARCHAR(64)"` 5 | ProjectName string `json:"project_name" xorm:"comment('项目名称') VARCHAR(255)"` 6 | ProjectState int `json:"project_state" xorm:"default 1 comment('状态(1正常,2冻结,3删除)') INT(1)"` 7 | CreatedAt int `json:"created_at" xorm:"default 0 comment('创建时间') INT(13)"` 8 | UpdatedAt int `json:"updated_at" xorm:"default 0 comment('更新时间') INT(13)"` 9 | } 10 | -------------------------------------------------------------------------------- /models/apidoc_sort.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type ApidocSort struct { 4 | SortId string `json:"sort_id" xorm:"not null pk comment('分类id') VARCHAR(64)"` 5 | SortTopId string `json:"sort_top_id" xorm:"default '0' comment('分类最上级id (默认0)') VARCHAR(64)"` 6 | SortPid string `json:"sort_pid" xorm:"default '0' comment('分类上级id (默认0)') VARCHAR(64)"` 7 | ProjectId string `json:"project_id" xorm:"default '0' comment('项目id') VARCHAR(64)"` 8 | SortName string `json:"sort_name" xorm:"default '无' comment('分类名称') VARCHAR(255)"` 9 | SortSeq int `json:"sort_seq" xorm:"default 1000 comment('分类排序') INT(11)"` 10 | Status int `json:"status" xorm:"default 1 comment('状态(1正常,2冻结,3删除)') INT(1)"` 11 | CreatedAt int `json:"created_at" xorm:"default 0 comment('创建时间') INT(13)"` 12 | UpdatedAt int `json:"updated_at" xorm:"default 0 comment('更新时间') INT(13)"` 13 | } 14 | -------------------------------------------------------------------------------- /models/apidoc_user.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type ApidocUser struct { 4 | UserId string `json:"user_id" xorm:"not null pk comment('用户id') VARCHAR(64)"` 5 | UserUsername string `json:"user_username" xorm:"comment('用户名') VARCHAR(255)"` 6 | UserPassword string `json:"user_password" xorm:"comment('密码') VARCHAR(255)"` 7 | CreatedAt int `json:"created_at" xorm:"default 0 comment('创建时间') INT(13)"` 8 | UpdatedAt int `json:"updated_at" xorm:"default 0 comment('修改时间') INT(13)"` 9 | UserState int `json:"user_state" xorm:"default 1 comment('状态(1正常,2冻结,3删除)') INT(1)"` 10 | } 11 | -------------------------------------------------------------------------------- /models/apidoc_user_project.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type ApidocUserProject struct { 4 | UserId string `json:"user_id" xorm:"default '0' comment('用户id') VARCHAR(64)"` 5 | ProjectId string `json:"project_id" xorm:"default '0' comment('项目id') VARCHAR(64)"` 6 | } 7 | -------------------------------------------------------------------------------- /models/im_group.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type ImGroup struct { 4 | GroupId string `json:"group_id" xorm:"not null pk comment('群组id') VARCHAR(64)"` 5 | GroupName string `json:"group_name" xorm:"default '未知' comment('群组名称') VARCHAR(255)"` 6 | GroupIcon string `json:"group_icon" xorm:"comment('群组图标') VARCHAR(255)"` 7 | GroupDescription string `json:"group_description" xorm:"comment('描述') VARCHAR(255)"` 8 | GroupState int `json:"group_state" xorm:"default 1 comment('状态(1正常,2冻结,3删除)') INT(1)"` 9 | CreatedAt int `json:"created_at" xorm:"default 0 comment('创建时间') INT(13)"` 10 | UpdatedAt int `json:"updated_at" xorm:"default 0 comment('更新时间') INT(13)"` 11 | } 12 | -------------------------------------------------------------------------------- /models/im_group_mumber.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type ImGroupMumber struct { 4 | GroupMumberId string `json:"group_mumber_id" xorm:"not null pk comment('群组成员id') VARCHAR(64)"` 5 | GroupId string `json:"group_id" xorm:"default '0' comment('群组id') VARCHAR(64)"` 6 | UserId string `json:"user_id" xorm:"default '0' comment('用户id') VARCHAR(64)"` 7 | MumberType int `json:"mumber_type" xorm:"default 3 comment('成员类型(1群主,2管理员,3群员)') INT(1)"` 8 | MemberState int `json:"member_state" xorm:"default 1 comment('成员状态(1正常,2禁言)') INT(1)"` 9 | CreatedAt int `json:"created_at" xorm:"default 0 comment('创建时间') INT(13)"` 10 | UpdatedAt int `json:"updated_at" xorm:"default 0 comment('更新时间') INT(13)"` 11 | } 12 | -------------------------------------------------------------------------------- /models/im_msg.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type ImMsg struct { 4 | MsgId string `json:"msg_id" xorm:"not null pk comment('消息id') VARCHAR(64)"` 5 | MsgType string `json:"msg_type" xorm:"comment('消息类型(client:连接,p2p:一对一,group:群)') VARCHAR(10)"` 6 | MsgFromId string `json:"msg_from_id" xorm:"default '0' comment('消息来源id') VARCHAR(64)"` 7 | MsgFromContent Content `json:"msg_from_content" xorm:"json "` 8 | MsgToId string `json:"msg_to_id" xorm:"default '0' comment('消息接受人的id') VARCHAR(64)"` 9 | MsgToContent Content `json:"msg_to_content" xorm:"json "` 10 | MsgContent IMMsgContent `json:"msg_content" xorm:"json "` 11 | MsgContentType string `json:"msg_content_type" xorm:"comment('消息内容的类型(im_text,im_img,im_audio)') VARCHAR(10)"` 12 | MsgStatus string `json:"msg_status" xorm:"comment('消息状态') VARCHAR(10)"` 13 | Status int `json:"status" xorm:"default 1 comment('状态(1正常,2冻结,3删除)') INT(2)"` 14 | CreatedAt int `json:"created_at" xorm:"default 0 comment('创建时间') INT(11)"` 15 | } 16 | 17 | type Content struct { 18 | Id string `json:"id"` 19 | Name string `json:"name"` 20 | Icon string `json:"icon"` 21 | } 22 | 23 | type IMMsgContent struct{ 24 | Text string `json:"text"` 25 | FileName string `json:"file_name"` 26 | FileContent string `json:"file_content"` 27 | File []byte `json:"file"` 28 | Length int `json:"length"` 29 | } 30 | 31 | type Msg struct { 32 | Id string `json:"id"` 33 | MsgId string `json:"msg_id"` 34 | Msg []byte `json:"msg"` 35 | } -------------------------------------------------------------------------------- /redispool/redispool.go: -------------------------------------------------------------------------------- 1 | package redispool 2 | 3 | import ( 4 | "github.com/garyburd/redigo/redis" 5 | "time" 6 | "fmt" 7 | "apidocserver/base" 8 | ) 9 | 10 | 11 | 12 | func newPool() *redis.Pool { 13 | 14 | return &redis.Pool{ 15 | MaxIdle: base.RedisMaxIdle, 16 | MaxActive: base.RedisMaxActive, 17 | IdleTimeout: base.RedisMIdleTimeout, 18 | Dial: func() (redis.Conn, error) { 19 | c,err := redis.Dial("tcp",base.RedisUrl) 20 | if err != nil { 21 | return nil,err 22 | } 23 | //密码授权 24 | c.Do("AUTH", base.RedisPassword) 25 | /*if _,err := c.Do("api",password); err != nil{ 26 | c.Close() 27 | return nil,err 28 | }*/ 29 | return c,err 30 | }, 31 | TestOnBorrow: func(c redis.Conn, t time.Time) error { 32 | if time.Since(t) < time.Minute { 33 | return nil 34 | } 35 | _,err := c.Do("PING") 36 | return err 37 | }, 38 | } 39 | } 40 | 41 | func RedisSETString(key string,value interface{},t int32) string { 42 | pool := newPool() 43 | conn:= pool.Get() 44 | defer conn.Close() 45 | var d string 46 | var err error 47 | if t == 0 { 48 | d,err = redis.String(conn.Do("SET",key,value)) 49 | }else { 50 | d,err = redis.String(conn.Do("SET",key,value, "EX", t)) 51 | } 52 | if err != nil { 53 | fmt.Println("redis连接错误",err) 54 | return "" 55 | } 56 | return d 57 | } 58 | 59 | func RedisGET(key string) []byte{ 60 | pool := newPool() 61 | conn:= pool.Get() 62 | defer conn.Close() 63 | d,err := redis.Bytes(conn.Do("GET",key)) 64 | if err != nil { 65 | fmt.Println("redis错误",err) 66 | return nil 67 | } 68 | return d 69 | } 70 | 71 | func RedisDel(key string) { 72 | pool := newPool() 73 | conn:= pool.Get() 74 | defer conn.Close() 75 | _, err := conn.Do("DEL",key) 76 | if err != nil { 77 | fmt.Println(err) 78 | } 79 | } -------------------------------------------------------------------------------- /xrom_mysql/client.go: -------------------------------------------------------------------------------- 1 | package xrom_mysql 2 | 3 | import ( 4 | "github.com/go-xorm/xorm" 5 | _ "github.com/go-sql-driver/mysql" 6 | "fmt" 7 | "apidocserver/base" 8 | ) 9 | 10 | func Client() *xorm.Engine { 11 | engine,err := xorm.NewEngine("mysql",base.MysqlUrl) 12 | if err != nil { 13 | fmt.Println("mysql打开失败",err) 14 | } 15 | engine.SetConnMaxLifetime(base.MysqlMaxLifetime) 16 | engine.SetMaxOpenConns(base.MysqlMaxOpenConn) 17 | engine.SetMaxIdleConns(base.MysqlMaxIdleConn) 18 | engine.ShowSQL(false) 19 | err = engine.Ping() 20 | if err != nil { 21 | fmt.Println("mysql没有ping成功",err) 22 | return nil 23 | } 24 | return engine 25 | } 26 | 27 | func InsertXORMMsg(t interface{}) bool { 28 | engine := Client() 29 | if engine == nil { 30 | fmt.Println("mysql连接失败") 31 | return false 32 | } 33 | 34 | _,err := engine.Insert(t) 35 | if err != nil { 36 | fmt.Println("数据插入失败",err) 37 | return false 38 | } 39 | return true 40 | } 41 | 42 | func FindXROMMsg(sql string) []map[string][]byte { 43 | engine := Client() 44 | if engine == nil { 45 | fmt.Println("mysql连接失败") 46 | return nil 47 | } 48 | results,err := engine.Query(sql) 49 | if err != nil { 50 | fmt.Println("查询数据失败") 51 | return nil 52 | } 53 | return results 54 | } 55 | 56 | --------------------------------------------------------------------------------