diff --git a/README.md b/README.md index 8ec40ae..07fc732 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,7 @@ rustdesk: | RUSTDESK_API_GORM_TYPE | 数据库类型sqlite或者mysql,默认sqlite | sqlite | | RUSTDESK_API_GORM_MAX_IDLE_CONNS | 数据库最大空闲连接数 | 10 | | RUSTDESK_API_GORM_MAX_OPEN_CONNS | 数据库最大打开连接数 | 100 | +| RUSTDESK_PERSONAL | 是否启用个人版API, 1:启用,0:不启用; 默认启用 | 1 | | -----MYSQL配置----- | -----数据库类型为sqlite时不用填----- | ---------- | | RUSTDESK_API_MYSQL_USERNAME | mysql用户名 | root | | RUSTDESK_API_MYSQL_PASSWORD | mysql密码 | 111111 | diff --git a/cmd/apimain.go b/cmd/apimain.go index ec32dbb..3768cbf 100644 --- a/cmd/apimain.go +++ b/cmd/apimain.go @@ -157,7 +157,7 @@ func ApiInitValidator() { } func DatabaseAutoUpdate() { - version := 103 + version := 126 db := global.DB diff --git a/conf/config.yaml b/conf/config.yaml index 547b83a..363d715 100644 --- a/conf/config.yaml +++ b/conf/config.yaml @@ -17,6 +17,7 @@ rustdesk: relay-server: "192.168.1.66:21117" api-server: "http://192.168.1.66:21114" key: "123456789" + personal: 1 logger: path: "./runtime/log.txt" level: "warn" #trace,debug,info,warn,error,fatal diff --git a/config/rustdesk.go b/config/rustdesk.go index d3ffdf5..10f865d 100644 --- a/config/rustdesk.go +++ b/config/rustdesk.go @@ -5,4 +5,5 @@ type Rustdesk struct { RelayServer string `mapstructure:"relay-server"` ApiServer string `mapstructure:"api-server"` Key string `mapstructure:"key"` + Personal int `mapstructure:"personal"` } diff --git a/docs/admin/admin_docs.go b/docs/admin/admin_docs.go index 7d179ff..e1e407a 100644 --- a/docs/admin/admin_docs.go +++ b/docs/admin/admin_docs.go @@ -2266,7 +2266,7 @@ const docTemplateadmin = `{ "alias": { "type": "string" }, - "force_always_relay": { + "forceAlwaysRelay": { "type": "boolean" }, "hash": { @@ -2434,8 +2434,7 @@ const docTemplateadmin = `{ "type": "object", "required": [ "color", - "name", - "user_id" + "name" ], "properties": { "color": { diff --git a/docs/admin/admin_swagger.json b/docs/admin/admin_swagger.json index f0a5677..c1cf17a 100644 --- a/docs/admin/admin_swagger.json +++ b/docs/admin/admin_swagger.json @@ -2259,7 +2259,7 @@ "alias": { "type": "string" }, - "force_always_relay": { + "forceAlwaysRelay": { "type": "boolean" }, "hash": { @@ -2427,8 +2427,7 @@ "type": "object", "required": [ "color", - "name", - "user_id" + "name" ], "properties": { "color": { diff --git a/docs/admin/admin_swagger.yaml b/docs/admin/admin_swagger.yaml index 5b0dc56..4145945 100644 --- a/docs/admin/admin_swagger.yaml +++ b/docs/admin/admin_swagger.yaml @@ -16,7 +16,7 @@ definitions: properties: alias: type: string - force_always_relay: + forceAlwaysRelay: type: boolean hash: type: string @@ -141,7 +141,6 @@ definitions: required: - color - name - - user_id type: object admin.UserForm: properties: diff --git a/docs/api/api_docs.go b/docs/api/api_docs.go index ecd463d..f2b7312 100644 --- a/docs/api/api_docs.go +++ b/docs/api/api_docs.go @@ -155,14 +155,14 @@ const docTemplateapi = `{ } } }, - "/ab/personal": { + "/ab/peer/add/{id}": { "post": { "security": [ { "BearerAuth": [] } ], - "description": "个人信息", + "description": "添加地址", "consumes": [ "application/json" ], @@ -170,9 +170,52 @@ const docTemplateapi = `{ "application/json" ], "tags": [ - "用户" + "地址[Personal]" ], - "summary": "个人信息", + "summary": "添加地址", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.ErrorResponse" + } + } + } + } + }, + "/ab/peers": { + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "地址", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "地址[Personal]" + ], + "summary": "地址列表", "parameters": [ { "description": "string valid", @@ -199,6 +242,181 @@ const docTemplateapi = `{ } } }, + "/ab/personal": { + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "个人地址", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "地址[Personal]" + ], + "summary": "个人地址", + "parameters": [ + { + "description": "string valid", + "name": "string", + "in": "body", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.Response" + } + } + } + } + }, + "/ab/settings": { + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "设置", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "地址[Personal]" + ], + "summary": "设置", + "parameters": [ + { + "description": "string valid", + "name": "string", + "in": "body", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.Response" + } + } + } + } + }, + "/ab/shared/profiles": { + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "共享", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "地址[Personal]" + ], + "summary": "共享地址簿", + "parameters": [ + { + "description": "string valid", + "name": "string", + "in": "body", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.Response" + } + } + } + } + }, + "/ab/tags/{id}": { + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "标签", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "地址[Personal]" + ], + "summary": "标签", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/model.TagList" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.ErrorResponse" + } + } + } + } + }, "/api": { "get": { "security": [ @@ -389,35 +607,6 @@ const docTemplateapi = `{ } } }, - "/oauth/login": { - "get": { - "description": "WebOauthLogin", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Oauth" - ], - "summary": "WebOauthLogin", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, "/oidc/auth": { "post": { "description": "OidcAuth", @@ -882,6 +1071,26 @@ const docTemplateapi = `{ } } }, + "model.TagList": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/model.Tag" + } + }, + "page": { + "type": "integer" + }, + "page_size": { + "type": "integer" + }, + "total": { + "type": "integer" + } + } + }, "response.DataResponse": { "type": "object", "properties": { diff --git a/docs/api/api_swagger.json b/docs/api/api_swagger.json index cb5b075..14b681e 100644 --- a/docs/api/api_swagger.json +++ b/docs/api/api_swagger.json @@ -148,14 +148,14 @@ } } }, - "/ab/personal": { + "/ab/peer/add/{id}": { "post": { "security": [ { "BearerAuth": [] } ], - "description": "个人信息", + "description": "添加地址", "consumes": [ "application/json" ], @@ -163,9 +163,52 @@ "application/json" ], "tags": [ - "用户" + "地址[Personal]" ], - "summary": "个人信息", + "summary": "添加地址", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.ErrorResponse" + } + } + } + } + }, + "/ab/peers": { + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "地址", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "地址[Personal]" + ], + "summary": "地址列表", "parameters": [ { "description": "string valid", @@ -192,6 +235,181 @@ } } }, + "/ab/personal": { + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "个人地址", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "地址[Personal]" + ], + "summary": "个人地址", + "parameters": [ + { + "description": "string valid", + "name": "string", + "in": "body", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.Response" + } + } + } + } + }, + "/ab/settings": { + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "设置", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "地址[Personal]" + ], + "summary": "设置", + "parameters": [ + { + "description": "string valid", + "name": "string", + "in": "body", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.Response" + } + } + } + } + }, + "/ab/shared/profiles": { + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "共享", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "地址[Personal]" + ], + "summary": "共享地址簿", + "parameters": [ + { + "description": "string valid", + "name": "string", + "in": "body", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/response.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.Response" + } + } + } + } + }, + "/ab/tags/{id}": { + "post": { + "security": [ + { + "BearerAuth": [] + } + ], + "description": "标签", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "地址[Personal]" + ], + "summary": "标签", + "parameters": [ + { + "type": "string", + "description": "id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/model.TagList" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.ErrorResponse" + } + } + } + } + }, "/api": { "get": { "security": [ @@ -382,35 +600,6 @@ } } }, - "/oauth/login": { - "get": { - "description": "WebOauthLogin", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Oauth" - ], - "summary": "WebOauthLogin", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, "/oidc/auth": { "post": { "description": "OidcAuth", @@ -875,6 +1064,26 @@ } } }, + "model.TagList": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/model.Tag" + } + }, + "page": { + "type": "integer" + }, + "page_size": { + "type": "integer" + }, + "total": { + "type": "integer" + } + } + }, "response.DataResponse": { "type": "object", "properties": { diff --git a/docs/api/api_swagger.yaml b/docs/api/api_swagger.yaml index 9106e51..60879af 100644 --- a/docs/api/api_swagger.yaml +++ b/docs/api/api_swagger.yaml @@ -103,6 +103,19 @@ definitions: user_id: type: integer type: object + model.TagList: + properties: + list: + items: + $ref: '#/definitions/model.Tag' + type: array + page: + type: integer + page_size: + type: integer + total: + type: integer + type: object response.DataResponse: properties: data: {} @@ -216,11 +229,38 @@ paths: summary: 标签添加 tags: - 地址 - /ab/personal: + /ab/peer/add/{id}: post: consumes: - application/json - description: 个人信息 + description: 添加地址 + parameters: + - description: id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + type: string + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.ErrorResponse' + security: + - BearerAuth: [] + summary: 添加地址 + tags: + - 地址[Personal] + /ab/peers: + post: + consumes: + - application/json + description: 地址 parameters: - description: string valid in: body @@ -240,9 +280,117 @@ paths: $ref: '#/definitions/response.Response' security: - BearerAuth: [] - summary: 个人信息 + summary: 地址列表 tags: - - 用户 + - 地址[Personal] + /ab/personal: + post: + consumes: + - application/json + description: 个人地址 + parameters: + - description: string valid + in: body + name: string + schema: + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.Response' + security: + - BearerAuth: [] + summary: 个人地址 + tags: + - 地址[Personal] + /ab/settings: + post: + consumes: + - application/json + description: 设置 + parameters: + - description: string valid + in: body + name: string + schema: + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.Response' + security: + - BearerAuth: [] + summary: 设置 + tags: + - 地址[Personal] + /ab/shared/profiles: + post: + consumes: + - application/json + description: 共享 + parameters: + - description: string valid + in: body + name: string + schema: + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/response.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.Response' + security: + - BearerAuth: [] + summary: 共享地址簿 + tags: + - 地址[Personal] + /ab/tags/{id}: + post: + consumes: + - application/json + description: 标签 + parameters: + - description: id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/model.TagList' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.ErrorResponse' + security: + - BearerAuth: [] + summary: 标签 + tags: + - 地址[Personal] /api: get: consumes: @@ -366,25 +514,6 @@ paths: summary: OauthCallback tags: - Oauth - /oauth/login: - get: - consumes: - - application/json - description: WebOauthLogin - produces: - - application/json - responses: - "200": - description: OK - schema: - type: string - "500": - description: Internal Server Error - schema: - type: string - summary: WebOauthLogin - tags: - - Oauth /oidc/auth: post: consumes: diff --git a/http/controller/api/ab.go b/http/controller/api/ab.go index 6d19408..e34e436 100644 --- a/http/controller/api/ab.go +++ b/http/controller/api/ab.go @@ -1,14 +1,17 @@ package api import ( + "Gwen/global" requstform "Gwen/http/request/api" "Gwen/http/response" "Gwen/http/response/api" "Gwen/model" "Gwen/service" "encoding/json" + "fmt" "github.com/gin-gonic/gin" "net/http" + "strconv" ) type Ab struct { @@ -118,7 +121,7 @@ func (a *Ab) Tags(c *gin.Context) { } // TagAdd -// @Tags 地址 +// @Tags 地址[Personal] // @Summary 标签添加 // @Description 标签 // @Accept json @@ -133,14 +136,359 @@ func (a *Ab) TagAdd(c *gin.Context) { if err != nil { response.Error(c, "参数错误") return - } - //u := service.AllService.UserService.CurUser(c) - - //err = service.AllService.TagService.UpdateTags(t.Name, t.Color, user.Id) - //if err != nil { - // response.Error(c, "操作失败") - // return - //} - c.JSON(http.StatusOK, "") + u := service.AllService.UserService.CurUser(c) + tag := service.AllService.TagService.InfoByUserIdAndName(u.Id, t.Name) + if tag != nil && tag.Id != 0 { + response.Error(c, "已存在") + return + } + t.UserId = u.Id + err = service.AllService.TagService.Create(t) + if err != nil { + response.Error(c, "操作失败") + return + } + c.String(http.StatusOK, "") +} + +// TagRename +// @Tags 地址[Personal] +// @Summary 标签重命名 +// @Description 标签 +// @Accept json +// @Produce json +// @Success 200 {string} string +// @Failure 500 {object} response.ErrorResponse +// @Router /ab/tag/rename/{guid} [put] +// @Security BearerAuth +func (a *Ab) TagRename(c *gin.Context) { + t := &requstform.TagRenameForm{} + err := c.ShouldBindJSON(t) + if err != nil { + response.Error(c, "参数错误") + return + } + u := service.AllService.UserService.CurUser(c) + tag := service.AllService.TagService.InfoByUserIdAndName(u.Id, t.Old) + if tag == nil || tag.Id == 0 { + response.Error(c, "参数错误") + return + } + ntag := service.AllService.TagService.InfoByUserIdAndName(u.Id, t.New) + if ntag != nil && ntag.Id != 0 { + response.Error(c, "已存在") + return + } + tag.Name = t.New + err = service.AllService.TagService.Update(tag) + if err != nil { + response.Error(c, "操作失败") + return + } + c.String(http.StatusOK, "") +} + +// TagUpdate +// @Tags 地址[Personal] +// @Summary 标签修改颜色 +// @Description 标签 +// @Accept json +// @Produce json +// @Success 200 {string} string +// @Failure 500 {object} response.ErrorResponse +// @Router /ab/tag/update/{guid} [put] +// @Security BearerAuth +func (a *Ab) TagUpdate(c *gin.Context) { + t := &requstform.TagColorForm{} + err := c.ShouldBindJSON(t) + if err != nil { + response.Error(c, "参数错误") + return + } + u := service.AllService.UserService.CurUser(c) + tag := service.AllService.TagService.InfoByUserIdAndName(u.Id, t.Name) + if tag == nil || tag.Id == 0 { + response.Error(c, "参数错误") + return + } + tag.Color = t.Color + err = service.AllService.TagService.Update(tag) + if err != nil { + response.Error(c, "操作失败") + return + } + c.String(http.StatusOK, "") +} + +// TagDel +// @Tags 地址[Personal] +// @Summary 标签删除 +// @Description 标签 +// @Accept json +// @Produce json +// @Success 200 {string} string +// @Failure 500 {object} response.ErrorResponse +// @Router /ab/tag/{guid} [delete] +// @Security BearerAuth +func (a *Ab) TagDel(c *gin.Context) { + t := &[]string{} + err := c.ShouldBind(t) + if err != nil { + response.Error(c, "参数错误") + return + } + //fmt.Println(t) + u := service.AllService.UserService.CurUser(c) + for _, name := range *t { + tag := service.AllService.TagService.InfoByUserIdAndName(u.Id, name) + if tag == nil || tag.Id == 0 { + response.Error(c, "参数错误") + return + } + err = service.AllService.TagService.Delete(tag) + if err != nil { + response.Error(c, "操作失败") + return + } + } + c.String(http.StatusOK, "") +} + +// Personal +// @Tags 地址[Personal] +// @Summary 个人地址 +// @Description 个人地址 +// @Accept json +// @Produce json +// @Param string body string false "string valid" +// @Success 200 {object} response.Response +// @Failure 500 {object} response.Response +// @Router /ab/personal [post] +// @Security BearerAuth +func (a *Ab) Personal(c *gin.Context) { + user := service.AllService.UserService.CurUser(c) + /** + guid = json['guid'] ?? '', + name = json['name'] ?? '', + owner = json['owner'] ?? '', + note = json['note'] ?? '', + rule = json['rule'] ?? 0; + */ + if global.Config.Rustdesk.Personal == 1 { + guid := strconv.Itoa(int(user.GroupId)) + "-" + strconv.Itoa(int(user.Id)) + //如果返回了guid,后面的请求会有变化 + c.JSON(http.StatusOK, gin.H{ + "guid": guid, + "name": user.Username, + "rule": 0, + }) + } else { + c.JSON(http.StatusOK, nil) + } + +} + +// Settings +// @Tags 地址[Personal] +// @Summary 设置 +// @Description 设置 +// @Accept json +// @Produce json +// @Param string body string false "string valid" +// @Success 200 {object} response.Response +// @Failure 500 {object} response.Response +// @Router /ab/settings [post] +// @Security BearerAuth +func (a *Ab) Settings(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "max_peer_one_ab": 0, //最大peer数,0表示不限制 + }) +} + +// SharedProfiles +// @Tags 地址[Personal] +// @Summary 共享地址簿 +// @Description 共享 +// @Accept json +// @Produce json +// @Param string body string false "string valid" +// @Success 200 {object} response.Response +// @Failure 500 {object} response.Response +// @Router /ab/shared/profiles [post] +// @Security BearerAuth +func (a *Ab) SharedProfiles(c *gin.Context) { + //AbProfile.fromJson(Map json) + //: guid = json['guid'] ?? '', + // name = json['name'] ?? '', + // owner = json['owner'] ?? '', + // note = json['note'] ?? '', + // rule = json['rule'] ?? 0; + //暂时没必要返回数据,可能是为了共享地址簿 + /*item := map[string]interface{}{ + "guid": "1", + "name": "admin", + "owner": "admin", + "note": "admin11", + "rule": 0, + } + item2 := map[string]interface{}{ + "guid": "2", + "name": "admin2", + "owner": "admin2", + "note": "admin22", + "rule": 0, + } + c.JSON(http.StatusOK, gin.H{ + "total": 2, + "data": []interface{}{item, item2}, + })*/ + + c.JSON(http.StatusOK, gin.H{ + "total": 0, + "data": nil, + }) +} + +// Peers +// @Tags 地址[Personal] +// @Summary 地址列表 +// @Description 地址 +// @Accept json +// @Produce json +// @Param string body string false "string valid" +// @Success 200 {object} response.Response +// @Failure 500 {object} response.Response +// @Router /ab/peers [post] +// @Security BearerAuth +func (a *Ab) Peers(c *gin.Context) { + user := service.AllService.UserService.CurUser(c) + al := service.AllService.AddressBookService.ListByUserId(user.Id, 1, 1000) + c.JSON(http.StatusOK, gin.H{ + "total": al.Total, + "data": al.AddressBooks, + "licensed_devices": 99999, + }) +} + +// PTags +// @Tags 地址[Personal] +// @Summary 标签 +// @Description 标签 +// @Accept json +// @Produce json +// @Param id path string true "id" +// @Success 200 {object} model.TagList +// @Failure 500 {object} response.ErrorResponse +// @Router /ab/tags/{guid} [post] +// @Security BearerAuth +func (a *Ab) PTags(c *gin.Context) { + user := service.AllService.UserService.CurUser(c) + + tags := service.AllService.TagService.ListByUserId(user.Id) + c.JSON(http.StatusOK, tags.Tags) +} + +// PeerAdd +// @Tags 地址[Personal] +// @Summary 添加地址 +// @Description 添加地址 +// @Accept json +// @Produce json +// @Param id path string true "id" +// @Success 200 {string} string +// @Failure 500 {object} response.ErrorResponse +// @Router /ab/peer/add/{guid} [post] +// @Security BearerAuth +func (a *Ab) PeerAdd(c *gin.Context) { + // forceAlwaysRelay永远是字符串"false",真是坑 + //f := &gin.H{} + f := &requstform.PersonalAddressBookForm{} + err := c.ShouldBindJSON(f) + if err != nil { + response.Error(c, "参数错误"+err.Error()) + return + } + fmt.Println(f) + u := service.AllService.UserService.CurUser(c) + f.UserId = u.Id + ab := f.ToAddressBook() + err = service.AllService.AddressBookService.AddAddressBook(ab) + if err != nil { + response.Error(c, "操作失败") + return + } + c.String(http.StatusOK, "") +} + +// PeerDel +// @Tags 地址[Personal] +// @Summary 删除地址 +// @Description 删除地址 +// @Accept json +// @Produce json +// @Param id path string true "id" +// @Success 200 {string} string +// @Failure 500 {object} response.ErrorResponse +// @Router /ab/peer/add/{guid} [delete] +// @Security BearerAuth +func (a *Ab) PeerDel(c *gin.Context) { + f := &[]string{} + err := c.ShouldBind(f) + if err != nil { + response.Error(c, "参数错误") + return + } + u := service.AllService.UserService.CurUser(c) + for _, id := range *f { + ab := service.AllService.AddressBookService.InfoByUserIdAndId(u.Id, id) + if ab == nil || ab.RowId == 0 { + response.Error(c, "参数错误") + return + } + err = service.AllService.AddressBookService.Delete(ab) + if err != nil { + response.Error(c, "操作失败") + return + } + } + + c.String(http.StatusOK, "") +} + +// PeerUpdate +// @Tags 地址[Personal] +// @Summary 更新地址 +// @Description 更新地址 +// @Accept json +// @Produce json +// @Param id path string true "id" +// @Success 200 {string} string +// @Failure 500 {object} response.ErrorResponse +// @Router /ab/peer/update/{guid} [put] +// @Security BearerAuth +func (a *Ab) PeerUpdate(c *gin.Context) { + //f := &gin.H{} + f := &requstform.PersonalAddressBookForm{} + err := c.ShouldBindJSON(f) + if err != nil { + response.Error(c, "参数错误") + return + } + fmt.Println(f) + //return + u := service.AllService.UserService.CurUser(c) + ab := service.AllService.AddressBookService.InfoByUserIdAndId(u.Id, f.Id) + if ab == nil || ab.RowId == 0 { + response.Error(c, "参数错误") + return + } + nab := f.ToAddressBook() + nab.RowId = ab.RowId + err = service.AllService.AddressBookService.Update(nab) + if err != nil { + response.Error(c, "操作失败") + return + } + c.String(http.StatusOK, "") } diff --git a/http/controller/api/ouath.go b/http/controller/api/ouath.go index b586566..698c2c4 100644 --- a/http/controller/api/ouath.go +++ b/http/controller/api/ouath.go @@ -264,16 +264,3 @@ func (o *Oauth) OauthCallback(c *gin.Context) { c.String(http.StatusInternalServerError, "授权配置错误,请联系管理员") } - -// WebOauthLogin -// @Tags Oauth -// @Summary WebOauthLogin -// @Description WebOauthLogin -// @Accept json -// @Produce json -// @Success 200 {string} string -// @Failure 500 {string} string -// @Router /oauth/login [get] -func (o *Oauth) WebOauthLogin(c *gin.Context) { - -} diff --git a/http/controller/api/user.go b/http/controller/api/user.go index b89071f..2d5c3e8 100644 --- a/http/controller/api/user.go +++ b/http/controller/api/user.go @@ -3,7 +3,6 @@ package api import ( apiResp "Gwen/http/response/api" "Gwen/service" - "fmt" "github.com/gin-gonic/gin" "net/http" ) @@ -42,33 +41,3 @@ func (u *User) Info(c *gin.Context) { up := (&apiResp.UserPayload{}).FromUser(user) c.JSON(http.StatusOK, up) } - -// Personal -// @Tags 用户 -// @Summary 个人信息 -// @Description 个人信息 -// @Accept json -// @Produce json -// @Param string body string false "string valid" -// @Success 200 {object} response.Response -// @Failure 500 {object} response.Response -// @Router /ab/personal [post] -// @Security BearerAuth -func (u *User) Personal(c *gin.Context) { - //打印全部body - fmt.Println(c.Request.Body) - - /** - guid = json['guid'] ?? '', - name = json['name'] ?? '', - owner = json['owner'] ?? '', - note = json['note'] ?? '', - rule = json['rule'] ?? 0; - */ - //如果返回了guid,后面的请求会有变化 - c.JSON(http.StatusOK, gin.H{ - //"guid": "123456", - //"name": "admindddd", - //"rule": 1, - }) -} diff --git a/http/controller/web/index.go b/http/controller/web/index.go index cec09cf..462b9db 100644 --- a/http/controller/web/index.go +++ b/http/controller/web/index.go @@ -8,6 +8,10 @@ import ( type Index struct { } +func (i *Index) Index(c *gin.Context) { + c.Redirect(302, "/_admin/") +} + func (i *Index) ConfigJs(c *gin.Context) { apiServer := global.Config.Rustdesk.ApiServer diff --git a/http/request/admin/addressBook.go b/http/request/admin/addressBook.go index 5a25fbc..546495f 100644 --- a/http/request/admin/addressBook.go +++ b/http/request/admin/addressBook.go @@ -16,7 +16,7 @@ type AddressBookForm struct { Tags []string `json:"tags"` Hash string `json:"hash"` UserId uint `json:"user_id"` - ForceAlwaysRelay bool `json:"force_always_relay"` + ForceAlwaysRelay bool `json:"forceAlwaysRelay"` RdpPort string `json:"rdp_port"` RdpUsername string `json:"rdp_username"` Online bool `json:"online"` diff --git a/http/request/api/peer.go b/http/request/api/peer.go index 00955e4..72105e8 100644 --- a/http/request/api/peer.go +++ b/http/request/api/peer.go @@ -35,3 +35,39 @@ func (pf *PeerForm) ToPeer() *model.Peer { Version: pf.Version, } } + +// PersonalAddressBookForm 个人地址簿表单 +type PersonalAddressBookForm struct { + model.AddressBook + ForceAlwaysRelay string `json:"forceAlwaysRelay"` +} + +func (pabf *PersonalAddressBookForm) ToAddressBook() *model.AddressBook { + return &model.AddressBook{ + RowId: pabf.RowId, + Id: pabf.Id, + Username: pabf.Username, + Password: pabf.Password, + Hostname: pabf.Hostname, + Alias: pabf.Alias, + Platform: pabf.Platform, + Tags: pabf.Tags, + Hash: pabf.Hash, + UserId: pabf.UserId, + ForceAlwaysRelay: pabf.ForceAlwaysRelay == "true", + RdpPort: pabf.RdpPort, + RdpUsername: pabf.RdpUsername, + Online: pabf.Online, + LoginName: pabf.LoginName, + SameServer: pabf.SameServer, + } +} + +type TagRenameForm struct { + Old string `json:"old"` + New string `json:"new"` +} +type TagColorForm struct { + Name string `json:"name"` + Color uint `json:"color"` +} diff --git a/http/response/api/peer.go b/http/response/api/peer.go index 3ad06a4..92cf623 100644 --- a/http/response/api/peer.go +++ b/http/response/api/peer.go @@ -59,16 +59,13 @@ func (gpp *GroupPeerPayload) FromAddressBook(a *model.AddressBook, username stri gpp.UserName = username } -//func (gpp *GroupPeerPayload) FromPeer(p *model.Peer) { -// gpp.Id = p.Id -// gpp.Info = &PeerPayloadInfo{ -// DeviceName: p.Hostname, -// Os: p.Os, -// Username: p.Username, -// } -// gpp.Note = "" -// if p.User.Id != 0 { -// //gpp.User = p.User.Username -// gpp.UserName = p.User.Username -// } -//} +func (gpp *GroupPeerPayload) FromPeer(p *model.Peer) { + gpp.Id = p.Id + gpp.Info = &PeerPayloadInfo{ + DeviceName: p.Hostname, + Os: p.Os, + Username: p.Username, + } + gpp.Note = "" + gpp.UserName = p.User.Username +} diff --git a/http/router/api.go b/http/router/api.go index 03cda2f..8e20ee3 100644 --- a/http/router/api.go +++ b/http/router/api.go @@ -74,7 +74,38 @@ func ApiInit(g *gin.Engine) { //更新地址 frg.POST("/ab", ab.UpAb) } - + PersonalRoutes(frg) //访问静态文件 g.StaticFS("/upload", http.Dir(global.Config.Gin.ResourcesPath+"/public/upload")) } + +func PersonalRoutes(frg *gin.RouterGroup) { + { + ab := &api.Ab{} + frg.POST("/ab/personal", ab.Personal) + //[method:POST] [uri:/api/ab/settings] Request + frg.POST("/ab/settings", ab.Settings) + // [method:POST] [uri:/api/ab/shared/profiles?current=1&pageSize=100] + frg.POST("/ab/shared/profiles", ab.SharedProfiles) + //[method:POST] [uri:/api/ab/peers?current=1&pageSize=100&ab=1] + frg.POST("/ab/peers", ab.Peers) + // [method:POST] [uri:/api/ab/tags/1] + frg.POST("/ab/tags/:guid", ab.PTags) + //[method:POST] api/ab/peer/add/1 + frg.POST("/ab/peer/add/:guid", ab.PeerAdd) + //[method:DELETE] [uri:/api/ab/peer/1] + frg.DELETE("/ab/peer/:guid", ab.PeerDel) + //[method:PUT] [uri:/api/ab/peer/update/1] + frg.PUT("/ab/peer/update/:guid", ab.PeerUpdate) + //[method:POST] [uri:/api/ab/tag/add/1] + frg.POST("/ab/tag/add/:guid", ab.TagAdd) + //[method:PUT] [uri:/api/ab/tag/rename/1] + frg.PUT("/ab/tag/rename/:guid", ab.TagRename) + //[method:PUT] [uri:/api/ab/tag/update/1] + frg.PUT("/ab/tag/update/:guid", ab.TagUpdate) + //[method:DELETE] [uri:/api/ab/tag/1] + frg.DELETE("/ab/tag/:guid", ab.TagDel) + + } + +} diff --git a/http/router/router.go b/http/router/router.go index 2d108cb..79677e1 100644 --- a/http/router/router.go +++ b/http/router/router.go @@ -9,6 +9,7 @@ import ( func WebInit(g *gin.Engine) { i := &web.Index{} + g.GET("/", i.Index) g.GET("/webclient-config/index.js", i.ConfigJs) g.StaticFS("/webclient", http.Dir(global.Config.Gin.ResourcesPath+"/web")) g.StaticFS("/_admin", http.Dir(global.Config.Gin.ResourcesPath+"/admin")) diff --git a/service/addressBook.go b/service/addressBook.go index f4fdf75..90f6233 100644 --- a/service/addressBook.go +++ b/service/addressBook.go @@ -9,11 +9,17 @@ import ( type AddressBookService struct { } -func (s *AddressBookService) Info(id uint) *model.AddressBook { +func (s *AddressBookService) Info(id string) *model.AddressBook { p := &model.AddressBook{} global.DB.Where("id = ?", id).First(p) return p } + +func (s *AddressBookService) InfoByUserIdAndId(userid uint, id string) *model.AddressBook { + p := &model.AddressBook{} + global.DB.Where("user_id = ? and id = ?", userid, id).First(p) + return p +} func (s *AddressBookService) InfoByRowId(id uint) *model.AddressBook { p := &model.AddressBook{} global.DB.Where("row_id = ?", id).First(p) diff --git a/service/tag.go b/service/tag.go index 881776b..b4ba77a 100644 --- a/service/tag.go +++ b/service/tag.go @@ -14,6 +14,11 @@ func (s *TagService) Info(id uint) *model.Tag { global.DB.Where("id = ?", id).First(p) return p } +func (s *TagService) InfoByUserIdAndName(userid uint, name string) *model.Tag { + p := &model.Tag{} + global.DB.Where("user_id = ? and name = ?", userid, name).First(p) + return p +} func (s *TagService) ListByUserId(userId uint) (res *model.TagList) { res = s.List(1, 1000, func(tx *gorm.DB) {