├── .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\ntest | \nvarchar(255) | \n测试 | \n
\n\nname | \nvarchar(255) | \n名称 | \n
\n\nage | \nint | \n年龄 | \n
\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
\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\ntest | \nvarchar(255) | \n测试 | \n
\n\nname | \nvarchar(255) | \n名称 | \n
\n\nage | \nint | \n年龄 | \n
\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
\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\ntest | \nvarchar(255) | \n测试 | \n
\n\nname | \nvarchar(255) | \n名称 | \n
\n\nage | \nint | \n年龄 | \n
\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
\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\ntest | \nvarchar(255) | \n测试 | \n
\n\nname | \nvarchar(255) | \n名称 | \n
\n\nage | \nint | \n年龄 | \n
\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
\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\ntest | \nvarchar(255) | \n测试 | \n
\n\nname | \nvarchar(255) | \n名称 | \n
\n\nage | \nint | \n年龄 | \n
\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
\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\ntest | \nvarchar(255) | \n测试 | \n
\n\nname | \nvarchar(255) | \n名称 | \n
\n\nage | \nint | \n年龄 | \n
\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
\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\ntest | \nvarchar(255) | \n测试 | \n
\n\nname | \nvarchar(255) | \n名称 | \n
\n\nage | \nint | \n年龄 | \n
\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
\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\ntest | \nvarchar(255) | \n测试 | \n
\n\nname | \nvarchar(255) | \n名称 | \n
\n\nage | \nint | \n年龄 | \n
\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
\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\ntest | \nvarchar(255) | \n测试 | \n
\n\nname | \nvarchar(255) | \n名称 | \n
\n\nage | \nint | \n年龄 | \n
\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
\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 |
--------------------------------------------------------------------------------