From c99261c12d8568384e309e48e0c8dab7e11d7efe Mon Sep 17 00:00:00 2001 From: ljw <84855512@qq.com> Date: Wed, 25 Sep 2024 22:41:57 +0800 Subject: [PATCH] add i18n --- .gitignore | 1 + README.md | 10 ++- README_EN.md | 10 ++- cmd/apimain.go | 95 ++++++++++++++++++++--- conf/config.yaml | 1 + config/config.go | 1 + docs/admin/admin_docs.go | 1 - docs/admin/admin_swagger.json | 1 - docs/admin/admin_swagger.yaml | 1 - global/global.go | 14 ++-- go.mod | 6 +- http/controller/admin/addressBook.go | 32 ++++---- http/controller/admin/group.go | 26 +++---- http/controller/admin/login.go | 6 +- http/controller/admin/loginLog.go | 12 +-- http/controller/admin/oauth.go | 58 ++++++++------ http/controller/admin/peer.go | 26 +++---- http/controller/admin/tag.go | 30 +++---- http/controller/admin/user.go | 40 +++++----- http/controller/api/ab.go | 71 ++++++++--------- http/controller/api/group.go | 4 +- http/controller/api/index.go | 2 +- http/controller/api/login.go | 8 +- http/controller/api/ouath.go | 83 +++++++++----------- http/controller/api/peer.go | 4 +- http/middleware/rustauth.go | 2 +- http/request/admin/user.go | 2 +- http/response/response.go | 48 ++++++++++++ resources/i18n/en.toml | 111 ++++++++++++++++++++++++++ resources/i18n/zh_CN.toml | 112 +++++++++++++++++++++++++++ service/oauth.go | 28 ++++--- 31 files changed, 604 insertions(+), 242 deletions(-) create mode 100644 resources/i18n/en.toml create mode 100644 resources/i18n/zh_CN.toml diff --git a/.gitignore b/.gitignore index ed75075..5472bee 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,6 @@ go.sum resources/* !resources/public/upload/.gitignore !resources/web +!resources/i18n release data \ No newline at end of file diff --git a/README.md b/README.md index 0deb929..e8e0d01 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ - 地址簿 - 群组 - 授权登录,支持`github`和`google`登录,支持`web后台`授权登录 + - i18n - Web Admin - 用户管理 - 设备管理 @@ -29,6 +30,7 @@ - 群组管理 - Oauth 管理 - 快速使用web client + - i18n - Web Client - 自动获取API server - 自动获取ID服务器和KEY @@ -72,9 +74,11 @@ ![pc_gr](docs/pc_gr.png) -### Web Admin: +### Web Admin: -***使用前后端分离,提供用户友好的管理界面,主要用来管理和展示。前端代码在[rustdesk-api-web](https://github.com/lejianwen/rustdesk-api-web)*** +** +*使用前后端分离,提供用户友好的管理界面,主要用来管理和展示。前端代码在[rustdesk-api-web](https://github.com/lejianwen/rustdesk-api-web) +*** ***后台访问地址是`http://[:port]/_admin/`初次安装管理员为用户名密码为`admin` `admin`,请即时更改密码*** @@ -117,6 +121,7 @@ * 参考`conf/config.yaml`配置文件,修改相关配置。如果`gorm.type`是`sqlite`,则不需要配置mysql相关配置。 ```yaml +lang: "en" gin: api-addr: "0.0.0.0:21114" mode: "release" @@ -144,6 +149,7 @@ rustdesk: | 变量名 | 说明 | 示例 | |-------------------------------------|--------------------------------------|-----------------------------| | TZ | 时区 | Asia/Shanghai | +| RUSTDESK_API_LANG | 语言 | `en`,`zh-CN` | | -----GIN配置----- | ---------- | ---------- | | RUSTDESK_API_GIN_TRUST_PROXY | 信任的代理IP列表,以`,`分割,默认信任所有 | 192.168.1.2,192.168.1.3 | | -----------GORM配置------------------ | ------------------------------------ | --------------------------- | diff --git a/README_EN.md b/README_EN.md index 46acd37..38ec6a8 100644 --- a/README_EN.md +++ b/README_EN.md @@ -20,6 +20,7 @@ desktop software that provides self-hosted solutions. - Address Book - Groups - Authorized login, supports `GitHub` and `Google` login, supports `web admin` authorized login + - i18n - Web Admin - User Management - Device Management @@ -28,6 +29,7 @@ desktop software that provides self-hosted solutions. - Group Management - OAuth Management - Quick access to web client + - i18n - Web Client - Automatically obtain API server - Automatically obtain ID server and KEY @@ -59,7 +61,8 @@ desktop software that provides self-hosted solutions. #### Login -- Added `GitHub` and `Google` login, which can be used after configuration in the admin panel. See the OAuth configuration section for details. +- Added `GitHub` and `Google` login, which can be used after configuration in the admin panel. See the OAuth + configuration section for details. - Added authorization login for the web admin panel. ![pc_login](docs/pc_login.png) @@ -122,6 +125,7 @@ installation are `admin` `admin`, please change the password immediately.*** not required. ```yaml +lang: "en" gin: api-addr: "0.0.0.0:21114" mode: "release" @@ -144,12 +148,14 @@ rustdesk: personal: 1 ``` -* Environment variables, with the prefix `RUSTDESK_API_RUSTDESK_PERSONAL`, will override the settings in the configuration file if +* Environment variables, with the prefix `RUSTDESK_API_RUSTDESK_PERSONAL`, will override the settings in the + configuration file if present. | Variable Name | Description | Example | |------------------------------------|-----------------------------------------------------------|--------------------------------| | TZ | timezone | Asia/Shanghai | +| RUSTDESK_API_LANG | Language | `en`,`zh-CN` | | ----- GIN Configuration ----- | --------------------------------------- | ------------------------------ | | RUSTDESK_API_GIN_TRUST_PROXY | Trusted proxy IPs, separated by commas. | 192.168.1.2,192.168.1.3 | | ----- GORM Configuration ----- | --------------------------------------- | ------------------------------ | diff --git a/cmd/apimain.go b/cmd/apimain.go index 3768cbf..26c59aa 100644 --- a/cmd/apimain.go +++ b/cmd/apimain.go @@ -12,12 +12,17 @@ import ( "Gwen/model" "Gwen/service" "fmt" + "github.com/BurntSushi/toml" + "github.com/gin-gonic/gin" "github.com/go-playground/locales/en" "github.com/go-playground/locales/zh_Hans_CN" ut "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" + en_translations "github.com/go-playground/validator/v10/translations/en" zh_translations "github.com/go-playground/validator/v10/translations/zh" "github.com/go-redis/redis/v8" + "github.com/nicksnyder/go-i18n/v2/i18n" + "golang.org/x/text/language" "reflect" ) @@ -98,6 +103,7 @@ func main() { //locker global.Lock = lock.NewLocal() + InitI18n() //gin http.ApiInit() @@ -105,15 +111,25 @@ func main() { func ApiInitValidator() { validate := validator.New() + + // 定义不同的语言翻译 enT := en.New() cn := zh_Hans_CN.New() + uni := ut.New(enT, cn) - trans, _ := uni.GetTranslator("cn") - err := zh_translations.RegisterDefaultTranslations(validate, trans) + + enTrans, _ := uni.GetTranslator("en") + zhTrans, _ := uni.GetTranslator("zh_Hans_CN") + + err := zh_translations.RegisterDefaultTranslations(validate, zhTrans) if err != nil { - //退出 panic(err) } + err = en_translations.RegisterDefaultTranslations(validate, enTrans) + if err != nil { + panic(err) + } + validate.RegisterTagNameFunc(func(field reflect.StructField) string { label := field.Tag.Get("label") if label == "" { @@ -122,10 +138,16 @@ func ApiInitValidator() { return label }) global.Validator.Validate = validate - global.Validator.VTrans = trans + global.Validator.UT = uni // 存储 Universal Translator + global.Validator.VTrans = zhTrans - global.Validator.ValidStruct = func(i interface{}) []string { + global.Validator.ValidStruct = func(ctx *gin.Context, i interface{}) []string { err := global.Validator.Validate.Struct(i) + lang := ctx.GetHeader("Accept-Language") + if lang == "" { + lang = global.Config.Lang + } + trans := getTranslatorForLang(lang) errList := make([]string, 0, 10) if err != nil { if _, ok := err.(*validator.InvalidValidationError); ok { @@ -133,14 +155,18 @@ func ApiInitValidator() { return errList } for _, err2 := range err.(validator.ValidationErrors) { - errList = append(errList, err2.Translate(global.Validator.VTrans)) + errList = append(errList, err2.Translate(trans)) } } return errList } - global.Validator.ValidVar = func(field interface{}, tag string) []string { + global.Validator.ValidVar = func(ctx *gin.Context, field interface{}, tag string) []string { err := global.Validator.Validate.Var(field, tag) - fmt.Println(err) + lang := ctx.GetHeader("Accept-Language") + if lang == "" { + lang = global.Config.Lang + } + trans := getTranslatorForLang(lang) errList := make([]string, 0, 10) if err != nil { if _, ok := err.(*validator.InvalidValidationError); ok { @@ -148,14 +174,29 @@ func ApiInitValidator() { return errList } for _, err2 := range err.(validator.ValidationErrors) { - errList = append(errList, err2.Translate(global.Validator.VTrans)) + errList = append(errList, err2.Translate(trans)) } } return errList } } - +func getTranslatorForLang(lang string) ut.Translator { + switch lang { + case "zh_CN": + fallthrough + case "zh-CN": + fallthrough + case "zh": + trans, _ := global.Validator.UT.GetTranslator("zh_Hans_CN") + return trans + case "en": + fallthrough + default: + trans, _ := global.Validator.UT.GetTranslator("en") + return trans + } +} func DatabaseAutoUpdate() { version := 126 @@ -251,3 +292,37 @@ func Migrate(version uint) { } } + +func InitI18n() { + bundle := i18n.NewBundle(language.English) + bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal) + bundle.LoadMessageFile(global.Config.Gin.ResourcesPath + "/i18n/en.toml") + bundle.LoadMessageFile(global.Config.Gin.ResourcesPath + "/i18n/zh_CN.toml") + global.Localizer = func(ctx *gin.Context) *i18n.Localizer { + lang := ctx.GetHeader("Accept-Language") + if lang == "" { + lang = global.Config.Lang + } + if lang == "en" { + return i18n.NewLocalizer(bundle, "en") + } else { + return i18n.NewLocalizer(bundle, lang, "en") + } + } + + //personUnreadEmails := localizer.MustLocalize(&i18n.LocalizeConfig{ + // DefaultMessage: &i18n.Message{ + // ID: "PersonUnreadEmails", + // }, + // PluralCount: 6, + // TemplateData: map[string]interface{}{ + // "Name": "LE", + // "PluralCount": 6, + // }, + //}) + //personUnreadEmails, err := global.Localizer.LocalizeMessage(&i18n.Message{ + // ID: "ParamsError", + //}) + //fmt.Println(err, personUnreadEmails) + +} diff --git a/conf/config.yaml b/conf/config.yaml index 363d715..21f2b71 100644 --- a/conf/config.yaml +++ b/conf/config.yaml @@ -1,3 +1,4 @@ +lang: "en" gin: api-addr: "0.0.0.0:21114" mode: "release" #release,debug,test diff --git a/config/config.go b/config/config.go index fd40c84..0b450cd 100644 --- a/config/config.go +++ b/config/config.go @@ -15,6 +15,7 @@ const ( ) type Config struct { + Lang string `mapstructure:"lang"` Gorm Gorm Mysql Mysql Gin Gin diff --git a/docs/admin/admin_docs.go b/docs/admin/admin_docs.go index a9aaa58..57cb674 100644 --- a/docs/admin/admin_docs.go +++ b/docs/admin/admin_docs.go @@ -2455,7 +2455,6 @@ const docTemplateadmin = `{ "type": "object", "required": [ "group_id", - "nickname", "status", "username" ], diff --git a/docs/admin/admin_swagger.json b/docs/admin/admin_swagger.json index face353..af3a13a 100644 --- a/docs/admin/admin_swagger.json +++ b/docs/admin/admin_swagger.json @@ -2448,7 +2448,6 @@ "type": "object", "required": [ "group_id", - "nickname", "status", "username" ], diff --git a/docs/admin/admin_swagger.yaml b/docs/admin/admin_swagger.yaml index 4facc11..7669578 100644 --- a/docs/admin/admin_swagger.yaml +++ b/docs/admin/admin_swagger.yaml @@ -165,7 +165,6 @@ definitions: type: string required: - group_id - - nickname - status - username type: object diff --git a/global/global.go b/global/global.go index 5459305..adf78cc 100644 --- a/global/global.go +++ b/global/global.go @@ -6,9 +6,11 @@ import ( "Gwen/lib/jwt" "Gwen/lib/lock" "Gwen/lib/upload" + "github.com/gin-gonic/gin" ut "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" "github.com/go-redis/redis/v8" + "github.com/nicksnyder/go-i18n/v2/i18n" "github.com/sirupsen/logrus" "github.com/spf13/viper" "gorm.io/gorm" @@ -23,11 +25,13 @@ var ( Cache cache.Handler Validator struct { Validate *validator.Validate + UT *ut.UniversalTranslator VTrans ut.Translator - ValidStruct func(interface{}) []string - ValidVar func(field interface{}, tag string) []string + ValidStruct func(*gin.Context, interface{}) []string + ValidVar func(ctx *gin.Context, field interface{}, tag string) []string } - Oss *upload.Oss - Jwt *jwt.Jwt - Lock lock.Locker + Oss *upload.Oss + Jwt *jwt.Jwt + Lock lock.Locker + Localizer func(ctx *gin.Context) *i18n.Localizer ) diff --git a/go.mod b/go.mod index e0ba8fc..0433ab4 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/swaggo/gin-swagger v1.6.0 github.com/swaggo/swag v1.16.3 golang.org/x/oauth2 v0.23.0 - golang.org/x/text v0.15.0 + golang.org/x/text v0.18.0 gorm.io/driver/mysql v1.5.7 gorm.io/driver/sqlite v1.5.6 gorm.io/gorm v1.25.7 @@ -67,9 +67,9 @@ require ( github.com/ugorji/go/codec v1.2.9 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect golang.org/x/crypto v0.23.0 // indirect - golang.org/x/net v0.21.0 // indirect + golang.org/x/net v0.25.0 // indirect golang.org/x/sys v0.25.0 // indirect - golang.org/x/tools v0.7.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/ini.v1 v1.63.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/http/controller/admin/addressBook.go b/http/controller/admin/addressBook.go index e16c6f8..ffb40f8 100644 --- a/http/controller/admin/addressBook.go +++ b/http/controller/admin/addressBook.go @@ -31,14 +31,14 @@ func (ct *AddressBook) Detail(c *gin.Context) { t := service.AllService.AddressBookService.InfoByRowId(uint(iid)) u := service.AllService.UserService.CurUser(c) if !service.AllService.UserService.IsAdmin(u) && t.UserId != u.Id { - response.Fail(c, 101, "无权限") + response.Fail(c, 101, response.TranslateMsg(c, "NoAccess")) return } if t.RowId > 0 { response.Success(c, t) return } - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) return } @@ -56,10 +56,10 @@ func (ct *AddressBook) Detail(c *gin.Context) { func (ct *AddressBook) Create(c *gin.Context) { f := &admin.AddressBookForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -71,7 +71,7 @@ func (ct *AddressBook) Create(c *gin.Context) { } err := service.AllService.AddressBookService.Create(t) if err != nil { - response.Fail(c, 101, "创建失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } response.Success(c, u) @@ -94,7 +94,7 @@ func (ct *AddressBook) Create(c *gin.Context) { func (ct *AddressBook) List(c *gin.Context) { query := &admin.AddressBookQuery{} if err := c.ShouldBindQuery(query); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } u := service.AllService.UserService.CurUser(c) @@ -123,27 +123,27 @@ func (ct *AddressBook) List(c *gin.Context) { func (ct *AddressBook) Update(c *gin.Context) { f := &admin.AddressBookForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return } if f.RowId == 0 { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")) return } t := f.ToAddressBook() u := service.AllService.UserService.CurUser(c) if !service.AllService.UserService.IsAdmin(u) && t.UserId != u.Id { - response.Fail(c, 101, "无权限") + response.Fail(c, 101, response.TranslateMsg(c, "NoAccess")) return } err := service.AllService.AddressBookService.Update(t) if err != nil { - response.Fail(c, 101, "更新失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } response.Success(c, nil) @@ -163,11 +163,11 @@ func (ct *AddressBook) Update(c *gin.Context) { func (ct *AddressBook) Delete(c *gin.Context) { f := &admin.AddressBookForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "系统错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } id := f.RowId - errList := global.Validator.ValidVar(id, "required,gt=0") + errList := global.Validator.ValidVar(c, id, "required,gt=0") if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -175,7 +175,7 @@ func (ct *AddressBook) Delete(c *gin.Context) { t := service.AllService.AddressBookService.InfoByRowId(f.RowId) u := service.AllService.UserService.CurUser(c) if !service.AllService.UserService.IsAdmin(u) && t.UserId != u.Id { - response.Fail(c, 101, "无权限") + response.Fail(c, 101, response.TranslateMsg(c, "NoAccess")) return } if u.Id > 0 { @@ -184,8 +184,8 @@ func (ct *AddressBook) Delete(c *gin.Context) { response.Success(c, nil) return } - response.Fail(c, 101, err.Error()) + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) } diff --git a/http/controller/admin/group.go b/http/controller/admin/group.go index ae87edf..2b189ee 100644 --- a/http/controller/admin/group.go +++ b/http/controller/admin/group.go @@ -31,7 +31,7 @@ func (ct *Group) Detail(c *gin.Context) { response.Success(c, u) return } - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) return } @@ -49,10 +49,10 @@ func (ct *Group) Detail(c *gin.Context) { func (ct *Group) Create(c *gin.Context) { f := &admin.GroupForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -60,7 +60,7 @@ func (ct *Group) Create(c *gin.Context) { u := f.ToGroup() err := service.AllService.GroupService.Create(u) if err != nil { - response.Fail(c, 101, "创建失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } response.Success(c, u) @@ -81,7 +81,7 @@ func (ct *Group) Create(c *gin.Context) { func (ct *Group) List(c *gin.Context) { query := &admin.PageQuery{} if err := c.ShouldBindQuery(query); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } res := service.AllService.GroupService.List(query.Page, query.PageSize, nil) @@ -102,14 +102,14 @@ func (ct *Group) List(c *gin.Context) { func (ct *Group) Update(c *gin.Context) { f := &admin.GroupForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } if f.Id == 0 { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -117,7 +117,7 @@ func (ct *Group) Update(c *gin.Context) { u := f.ToGroup() err := service.AllService.GroupService.Update(u) if err != nil { - response.Fail(c, 101, "更新失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } response.Success(c, nil) @@ -137,11 +137,11 @@ func (ct *Group) Update(c *gin.Context) { func (ct *Group) Delete(c *gin.Context) { f := &admin.GroupForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "系统错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } id := f.Id - errList := global.Validator.ValidVar(id, "required,gt=0") + errList := global.Validator.ValidVar(c, id, "required,gt=0") if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -153,8 +153,8 @@ func (ct *Group) Delete(c *gin.Context) { response.Success(c, nil) return } - response.Fail(c, 101, err.Error()) + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) } diff --git a/http/controller/admin/login.go b/http/controller/admin/login.go index 9ebfc19..f46a190 100644 --- a/http/controller/admin/login.go +++ b/http/controller/admin/login.go @@ -28,11 +28,11 @@ func (ct *Login) Login(c *gin.Context) { f := &admin.Login{} err := c.ShouldBindJSON(f) if err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -40,7 +40,7 @@ func (ct *Login) Login(c *gin.Context) { u := service.AllService.UserService.InfoByUsernamePassword(f.Username, f.Password) if u.Id == 0 { - response.Fail(c, 101, "用户名或密码错误") + response.Fail(c, 101, response.TranslateMsg(c, "UsernameOrPasswordError")) return } diff --git a/http/controller/admin/loginLog.go b/http/controller/admin/loginLog.go index 7f6c771..f653c17 100644 --- a/http/controller/admin/loginLog.go +++ b/http/controller/admin/loginLog.go @@ -33,7 +33,7 @@ func (ct *LoginLog) Detail(c *gin.Context) { response.Success(c, u) return } - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) return } @@ -53,7 +53,7 @@ func (ct *LoginLog) Detail(c *gin.Context) { func (ct *LoginLog) List(c *gin.Context) { query := &admin.LoginLogQuery{} if err := c.ShouldBindQuery(query); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } u := service.AllService.UserService.CurUser(c) @@ -82,11 +82,11 @@ func (ct *LoginLog) List(c *gin.Context) { func (ct *LoginLog) Delete(c *gin.Context) { f := &model.LoginLog{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "系统错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } id := f.Id - errList := global.Validator.ValidVar(id, "required,gt=0") + errList := global.Validator.ValidVar(c, id, "required,gt=0") if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -94,7 +94,7 @@ func (ct *LoginLog) Delete(c *gin.Context) { l := service.AllService.LoginLogService.InfoById(f.Id) u := service.AllService.UserService.CurUser(c) if !service.AllService.UserService.IsAdmin(u) && l.UserId != u.Id { - response.Fail(c, 101, "无权限") + response.Fail(c, 101, response.TranslateMsg(c, "NoAccess")) return } if l.Id > 0 { @@ -106,5 +106,5 @@ func (ct *LoginLog) Delete(c *gin.Context) { response.Fail(c, 101, err.Error()) return } - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) } diff --git a/http/controller/admin/oauth.go b/http/controller/admin/oauth.go index 5bb3f39..8a569a1 100644 --- a/http/controller/admin/oauth.go +++ b/http/controller/admin/oauth.go @@ -18,12 +18,12 @@ type Oauth struct { func (o *Oauth) Info(c *gin.Context) { code := c.Query("code") if code == "" { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")) return } v := service.AllService.OauthService.GetOauthCache(code) if v == nil { - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) return } response.Success(c, v) @@ -33,20 +33,20 @@ func (o *Oauth) ToBind(c *gin.Context) { f := &adminReq.BindOauthForm{} err := c.ShouldBindJSON(f) if err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } u := service.AllService.UserService.CurUser(c) utr := service.AllService.UserService.UserThirdInfo(u.Id, f.Op) if utr.Id > 0 { - response.Fail(c, 101, "已绑定过了") + response.Fail(c, 101, response.TranslateMsg(c, "OauthHasBindOtherUser")) return } err, code, url := service.AllService.OauthService.BeginAuth(f.Op) if err != nil { - response.Error(c, err.Error()) + response.Error(c, response.TranslateMsg(c, err.Error())) return } @@ -89,22 +89,22 @@ func (o *Oauth) BindConfirm(c *gin.Context) { j := &adminReq.OauthConfirmForm{} err := c.ShouldBindJSON(j) if err != nil { - response.Fail(c, 101, "参数错误"+err.Error()) + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } if j.Code == "" { - response.Fail(c, 101, "参数错误: code 不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")) return } v := service.AllService.OauthService.GetOauthCache(j.Code) if v == nil { - response.Fail(c, 101, "授权已过期") + response.Fail(c, 101, response.TranslateMsg(c, "OauthExpired")) return } u := service.AllService.UserService.CurUser(c) err = service.AllService.OauthService.BindGithubUser(v.ThirdOpenId, v.ThirdOpenId, u.Id) if err != nil { - response.Fail(c, 101, "绑定失败,请重试") + response.Fail(c, 101, response.TranslateMsg(c, "BindFail")) return } @@ -117,22 +117,30 @@ func (o *Oauth) Unbind(c *gin.Context) { f := &adminReq.UnBindOauthForm{} err := c.ShouldBindJSON(f) if err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } u := service.AllService.UserService.CurUser(c) utr := service.AllService.UserService.UserThirdInfo(u.Id, f.Op) if utr.Id == 0 { - response.Fail(c, 101, "未绑定") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) return } if f.Op == model.OauthTypeGithub { err = service.AllService.OauthService.UnBindGithubUser(u.Id) if err != nil { - response.Fail(c, 101, "解绑失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } } + if f.Op == model.OauthTypeGoogle { + err = service.AllService.OauthService.UnBindGoogleUser(u.Id) + if err != nil { + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) + return + } + } + response.Success(c, nil) } @@ -155,7 +163,7 @@ func (o *Oauth) Detail(c *gin.Context) { response.Success(c, u) return } - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) return } @@ -173,10 +181,10 @@ func (o *Oauth) Detail(c *gin.Context) { func (o *Oauth) Create(c *gin.Context) { f := &admin.OauthForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "参数错误"+err.Error()) + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -184,14 +192,14 @@ func (o *Oauth) Create(c *gin.Context) { ex := service.AllService.OauthService.InfoByOp(f.Op) if ex.Id > 0 { - response.Fail(c, 101, "已存在"+f.Op) + response.Fail(c, 101, response.TranslateMsg(c, "ItemExists")) return } u := f.ToOauth() err := service.AllService.OauthService.Create(u) if err != nil { - response.Fail(c, 101, "创建失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } response.Success(c, u) @@ -212,7 +220,7 @@ func (o *Oauth) Create(c *gin.Context) { func (o *Oauth) List(c *gin.Context) { query := &admin.PageQuery{} if err := c.ShouldBindQuery(query); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } res := service.AllService.OauthService.List(query.Page, query.PageSize, nil) @@ -233,14 +241,14 @@ func (o *Oauth) List(c *gin.Context) { func (o *Oauth) Update(c *gin.Context) { f := &admin.OauthForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } if f.Id == 0 { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -248,7 +256,7 @@ func (o *Oauth) Update(c *gin.Context) { u := f.ToOauth() err := service.AllService.OauthService.Update(u) if err != nil { - response.Fail(c, 101, "更新失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } response.Success(c, nil) @@ -268,11 +276,11 @@ func (o *Oauth) Update(c *gin.Context) { func (o *Oauth) Delete(c *gin.Context) { f := &admin.OauthForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "系统错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } id := f.Id - errList := global.Validator.ValidVar(id, "required,gt=0") + errList := global.Validator.ValidVar(c, id, "required,gt=0") if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -287,5 +295,5 @@ func (o *Oauth) Delete(c *gin.Context) { response.Fail(c, 101, err.Error()) return } - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) } diff --git a/http/controller/admin/peer.go b/http/controller/admin/peer.go index 8a1994d..cf060ab 100644 --- a/http/controller/admin/peer.go +++ b/http/controller/admin/peer.go @@ -31,7 +31,7 @@ func (ct *Peer) Detail(c *gin.Context) { response.Success(c, u) return } - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) return } @@ -49,10 +49,10 @@ func (ct *Peer) Detail(c *gin.Context) { func (ct *Peer) Create(c *gin.Context) { f := &admin.PeerForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -60,7 +60,7 @@ func (ct *Peer) Create(c *gin.Context) { u := f.ToPeer() err := service.AllService.PeerService.Create(u) if err != nil { - response.Fail(c, 101, "创建失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } response.Success(c, u) @@ -81,7 +81,7 @@ func (ct *Peer) Create(c *gin.Context) { func (ct *Peer) List(c *gin.Context) { query := &admin.PageQuery{} if err := c.ShouldBindQuery(query); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } res := service.AllService.PeerService.List(query.Page, query.PageSize, nil) @@ -102,14 +102,14 @@ func (ct *Peer) List(c *gin.Context) { func (ct *Peer) Update(c *gin.Context) { f := &admin.PeerForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } if f.RowId == 0 { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -117,7 +117,7 @@ func (ct *Peer) Update(c *gin.Context) { u := f.ToPeer() err := service.AllService.PeerService.Update(u) if err != nil { - response.Fail(c, 101, "更新失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } response.Success(c, nil) @@ -137,11 +137,11 @@ func (ct *Peer) Update(c *gin.Context) { func (ct *Peer) Delete(c *gin.Context) { f := &admin.PeerForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "系统错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } id := f.RowId - errList := global.Validator.ValidVar(id, "required,gt=0") + errList := global.Validator.ValidVar(c, id, "required,gt=0") if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -153,8 +153,8 @@ func (ct *Peer) Delete(c *gin.Context) { response.Success(c, nil) return } - response.Fail(c, 101, err.Error()) + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) } diff --git a/http/controller/admin/tag.go b/http/controller/admin/tag.go index 7adb3df..4956f07 100644 --- a/http/controller/admin/tag.go +++ b/http/controller/admin/tag.go @@ -30,14 +30,14 @@ func (ct *Tag) Detail(c *gin.Context) { t := service.AllService.TagService.InfoById(uint(iid)) u := service.AllService.UserService.CurUser(c) if !service.AllService.UserService.IsAdmin(u) && t.UserId != u.Id { - response.Fail(c, 101, "无权限") + response.Fail(c, 101, response.TranslateMsg(c, "NoAccess")) return } if t.Id > 0 { response.Success(c, t) return } - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) return } @@ -55,10 +55,10 @@ func (ct *Tag) Detail(c *gin.Context) { func (ct *Tag) Create(c *gin.Context) { f := &admin.TagForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -70,7 +70,7 @@ func (ct *Tag) Create(c *gin.Context) { } err := service.AllService.TagService.Create(t) if err != nil { - response.Fail(c, 101, "创建失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } response.Success(c, u) @@ -93,7 +93,7 @@ func (ct *Tag) Create(c *gin.Context) { func (ct *Tag) List(c *gin.Context) { query := &admin.TagQuery{} if err := c.ShouldBindQuery(query); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } u := service.AllService.UserService.CurUser(c) @@ -122,27 +122,27 @@ func (ct *Tag) List(c *gin.Context) { func (ct *Tag) Update(c *gin.Context) { f := &admin.TagForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return } if f.Id == 0 { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")) return } t := f.ToTag() u := service.AllService.UserService.CurUser(c) if !service.AllService.UserService.IsAdmin(u) && t.UserId != u.Id { - response.Fail(c, 101, "无权限") + response.Fail(c, 101, response.TranslateMsg(c, "NoAccess")) return } err := service.AllService.TagService.Update(t) if err != nil { - response.Fail(c, 101, "更新失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } response.Success(c, nil) @@ -162,11 +162,11 @@ func (ct *Tag) Update(c *gin.Context) { func (ct *Tag) Delete(c *gin.Context) { f := &admin.TagForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "系统错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } id := f.Id - errList := global.Validator.ValidVar(id, "required,gt=0") + errList := global.Validator.ValidVar(c, id, "required,gt=0") if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -174,7 +174,7 @@ func (ct *Tag) Delete(c *gin.Context) { t := service.AllService.TagService.InfoById(f.Id) u := service.AllService.UserService.CurUser(c) if !service.AllService.UserService.IsAdmin(u) && t.UserId != u.Id { - response.Fail(c, 101, "无权限") + response.Fail(c, 101, response.TranslateMsg(c, "NoAccess")) return } if u.Id > 0 { @@ -186,5 +186,5 @@ func (ct *Tag) Delete(c *gin.Context) { response.Fail(c, 101, err.Error()) return } - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) } diff --git a/http/controller/admin/user.go b/http/controller/admin/user.go index 18b03a3..82a6d64 100644 --- a/http/controller/admin/user.go +++ b/http/controller/admin/user.go @@ -33,7 +33,7 @@ func (ct *User) Detail(c *gin.Context) { response.Success(c, u) return } - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) return } @@ -51,10 +51,10 @@ func (ct *User) Detail(c *gin.Context) { func (ct *User) Create(c *gin.Context) { f := &admin.UserForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -62,7 +62,7 @@ func (ct *User) Create(c *gin.Context) { u := f.ToUser() err := service.AllService.UserService.Create(u) if err != nil { - response.Fail(c, 101, "创建失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } response.Success(c, u) @@ -84,7 +84,7 @@ func (ct *User) Create(c *gin.Context) { func (ct *User) List(c *gin.Context) { query := &admin.UserQuery{} if err := c.ShouldBindQuery(query); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } res := service.AllService.UserService.List(query.Page, query.PageSize, func(tx *gorm.DB) { @@ -109,14 +109,14 @@ func (ct *User) List(c *gin.Context) { func (ct *User) Update(c *gin.Context) { f := &admin.UserForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "参数错误:"+err.Error()) + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } if f.Id == 0 { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -124,7 +124,7 @@ func (ct *User) Update(c *gin.Context) { u := f.ToUser() err := service.AllService.UserService.Update(u) if err != nil { - response.Fail(c, 101, "更新失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } response.Success(c, nil) @@ -144,11 +144,11 @@ func (ct *User) Update(c *gin.Context) { func (ct *User) Delete(c *gin.Context) { f := &admin.UserForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "系统错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } id := f.Id - errList := global.Validator.ValidVar(id, "required,gt=0") + errList := global.Validator.ValidVar(c, id, "required,gt=0") if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -163,7 +163,7 @@ func (ct *User) Delete(c *gin.Context) { response.Fail(c, 101, err.Error()) return } - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) } // UpdatePassword 修改密码 @@ -180,22 +180,22 @@ func (ct *User) Delete(c *gin.Context) { func (ct *User) UpdatePassword(c *gin.Context) { f := &admin.UserPasswordForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return } u := service.AllService.UserService.InfoById(f.Id) if u.Id == 0 { - response.Fail(c, 101, "信息不存在") + response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound")) return } err := service.AllService.UserService.UpdatePassword(u, f.Password) if err != nil { - response.Fail(c, 101, "更新失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } response.Success(c, nil) @@ -237,11 +237,11 @@ func (ct *User) Current(c *gin.Context) { func (ct *User) ChangeCurPwd(c *gin.Context) { f := &admin.ChangeCurPasswordForm{} if err := c.ShouldBindJSON(f); err != nil { - response.Fail(c, 101, "参数错误") + response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error()) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Fail(c, 101, errList[0]) return @@ -249,12 +249,12 @@ func (ct *User) ChangeCurPwd(c *gin.Context) { u := service.AllService.UserService.CurUser(c) oldPwd := service.AllService.UserService.EncryptPassword(f.OldPassword) if u.Password != oldPwd { - response.Fail(c, 101, "旧密码错误") + response.Fail(c, 101, response.TranslateMsg(c, "OldPasswordError")) return } err := service.AllService.UserService.UpdatePassword(u, f.NewPassword) if err != nil { - response.Fail(c, 101, "更新失败") + response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } response.Success(c, nil) diff --git a/http/controller/api/ab.go b/http/controller/api/ab.go index e34e436..8f36d13 100644 --- a/http/controller/api/ab.go +++ b/http/controller/api/ab.go @@ -68,37 +68,30 @@ func (a *Ab) UpAb(c *gin.Context) { abf := &requstform.AddressBookForm{} err := c.ShouldBindJSON(&abf) if err != nil { - response.Error(c, "参数错误") + response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) return } abd := &requstform.AddressBookFormData{} err = json.Unmarshal([]byte(abf.Data), abd) if err != nil { - response.Error(c, "系统错误") + response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) + return + } + tc := map[string]uint{} + err = json.Unmarshal([]byte(abd.TagColors), &tc) + if err != nil { + response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) return } - - //fmt.Println(abd) - //for _, peer := range abd.Peers { - // fmt.Println(peer) - //} - user := service.AllService.UserService.CurUser(c) err = service.AllService.AddressBookService.UpdateAddressBook(abd.Peers, user.Id) if err != nil { - c.Abort() + response.Error(c, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } - tc := map[string]uint{} - err = json.Unmarshal([]byte(abd.TagColors), &tc) - if err != nil { - response.Error(c, "系统错误") - return - } else { - service.AllService.TagService.UpdateTags(user.Id, tc) - } + service.AllService.TagService.UpdateTags(user.Id, tc) c.JSON(http.StatusOK, nil) } @@ -134,19 +127,19 @@ func (a *Ab) TagAdd(c *gin.Context) { t := &model.Tag{} err := c.ShouldBindJSON(t) if err != nil { - response.Error(c, "参数错误") + response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) 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, "已存在") + response.Error(c, response.TranslateMsg(c, "ItemExists")) return } t.UserId = u.Id err = service.AllService.TagService.Create(t) if err != nil { - response.Error(c, "操作失败") + response.Error(c, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } c.String(http.StatusOK, "") @@ -166,24 +159,24 @@ func (a *Ab) TagRename(c *gin.Context) { t := &requstform.TagRenameForm{} err := c.ShouldBindJSON(t) if err != nil { - response.Error(c, "参数错误") + response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) 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, "参数错误") + response.Error(c, response.TranslateMsg(c, "ItemNotFound")) return } ntag := service.AllService.TagService.InfoByUserIdAndName(u.Id, t.New) if ntag != nil && ntag.Id != 0 { - response.Error(c, "已存在") + response.Error(c, response.TranslateMsg(c, "ItemExists")) return } tag.Name = t.New err = service.AllService.TagService.Update(tag) if err != nil { - response.Error(c, "操作失败") + response.Error(c, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } c.String(http.StatusOK, "") @@ -203,19 +196,19 @@ func (a *Ab) TagUpdate(c *gin.Context) { t := &requstform.TagColorForm{} err := c.ShouldBindJSON(t) if err != nil { - response.Error(c, "参数错误") + response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) 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, "参数错误") + response.Error(c, response.TranslateMsg(c, "ItemNotFound")) return } tag.Color = t.Color err = service.AllService.TagService.Update(tag) if err != nil { - response.Error(c, "操作失败") + response.Error(c, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } c.String(http.StatusOK, "") @@ -235,7 +228,7 @@ func (a *Ab) TagDel(c *gin.Context) { t := &[]string{} err := c.ShouldBind(t) if err != nil { - response.Error(c, "参数错误") + response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) return } //fmt.Println(t) @@ -243,12 +236,12 @@ func (a *Ab) TagDel(c *gin.Context) { for _, name := range *t { tag := service.AllService.TagService.InfoByUserIdAndName(u.Id, name) if tag == nil || tag.Id == 0 { - response.Error(c, "参数错误") + response.Error(c, response.TranslateMsg(c, "ItemNotFound")) return } err = service.AllService.TagService.Delete(tag) if err != nil { - response.Error(c, "操作失败") + response.Error(c, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } } @@ -406,7 +399,7 @@ func (a *Ab) PeerAdd(c *gin.Context) { f := &requstform.PersonalAddressBookForm{} err := c.ShouldBindJSON(f) if err != nil { - response.Error(c, "参数错误"+err.Error()) + response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) return } fmt.Println(f) @@ -415,7 +408,7 @@ func (a *Ab) PeerAdd(c *gin.Context) { ab := f.ToAddressBook() err = service.AllService.AddressBookService.AddAddressBook(ab) if err != nil { - response.Error(c, "操作失败") + response.Error(c, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } c.String(http.StatusOK, "") @@ -436,19 +429,19 @@ func (a *Ab) PeerDel(c *gin.Context) { f := &[]string{} err := c.ShouldBind(f) if err != nil { - response.Error(c, "参数错误") + response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) 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, "参数错误") + response.Error(c, response.TranslateMsg(c, "ItemNotFound")) return } err = service.AllService.AddressBookService.Delete(ab) if err != nil { - response.Error(c, "操作失败") + response.Error(c, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } } @@ -472,22 +465,22 @@ func (a *Ab) PeerUpdate(c *gin.Context) { f := &requstform.PersonalAddressBookForm{} err := c.ShouldBindJSON(f) if err != nil { - response.Error(c, "参数错误") + response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) return } - fmt.Println(f) + //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, "参数错误") + response.Error(c, response.TranslateMsg(c, "ItemNotFound")) return } nab := f.ToAddressBook() nab.RowId = ab.RowId err = service.AllService.AddressBookService.Update(nab) if err != nil { - response.Error(c, "操作失败") + response.Error(c, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } c.String(http.StatusOK, "") diff --git a/http/controller/api/group.go b/http/controller/api/group.go index 4965d29..eabc890 100644 --- a/http/controller/api/group.go +++ b/http/controller/api/group.go @@ -33,7 +33,7 @@ func (g *Group) Users(c *gin.Context) { if !*u.IsAdmin { gr := service.AllService.GroupService.InfoById(u.GroupId) if gr.Type != model.GroupTypeShare { - response.Error(c, "不是管理员也不在分享组") + response.Error(c, response.TranslateMsg(c, "NoAccess")) return } } @@ -77,7 +77,7 @@ func (g *Group) Peers(c *gin.Context) { if !*u.IsAdmin { gr := service.AllService.GroupService.InfoById(u.GroupId) if gr.Type != model.GroupTypeShare { - response.Error(c, "不是管理员也不在分享组") + response.Error(c, response.TranslateMsg(c, "NoAccess")) return } } diff --git a/http/controller/api/index.go b/http/controller/api/index.go index bb0ff08..e080542 100644 --- a/http/controller/api/index.go +++ b/http/controller/api/index.go @@ -37,7 +37,7 @@ func (i *Index) Index(c *gin.Context) { func (i *Index) Heartbeat(c *gin.Context) { //b := &gin.H{} //err := c.BindJSON(b) - //body : &map[id:ljwzhuwo modified_at:0 uuid:NGIxZTZjM2YtNmNkMy00YTMwLWFiNjQtMzQ0MTA0NGE5ZDgz ver:1.003e+06] + //body : &map[id:xxx modified_at:0 uuid:NGIxZTZjM2YtNmNkMy00YTMwLWFiNjQtMzQ0MTA0NGE5ZDgz ver:1.003e+06] //fmt.Println(b, err, c.Request.Header) //header : map[Accept:[*/*] Accept-Encoding:[gzip] Content-Length:[105] Content-Type:[application/json]] c.JSON(http.StatusOK, gin.H{}) diff --git a/http/controller/api/login.go b/http/controller/api/login.go index 088e45e..bf8b9d3 100644 --- a/http/controller/api/login.go +++ b/http/controller/api/login.go @@ -30,11 +30,11 @@ func (l *Login) Login(c *gin.Context) { err := c.ShouldBindJSON(f) //fmt.Println(f) if err != nil { - response.Error(c, "参数错误") + response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) return } - errList := global.Validator.ValidStruct(f) + errList := global.Validator.ValidStruct(c, f) if len(errList) > 0 { response.Error(c, errList[0]) return @@ -43,7 +43,7 @@ func (l *Login) Login(c *gin.Context) { u := service.AllService.UserService.InfoByUsernamePassword(f.Username, f.Password) if u.Id == 0 { - response.Error(c, "用户名或密码错误") + response.Error(c, response.TranslateMsg(c, "UsernameOrPasswordError")) return } @@ -95,7 +95,7 @@ func (l *Login) LoginOptions(c *gin.Context) { } common, err := json.Marshal(oidcItems) if err != nil { - response.Error(c, "参数错误") + response.Error(c, response.TranslateMsg(c, "SystemError")+err.Error()) return } var res []string diff --git a/http/controller/api/ouath.go b/http/controller/api/ouath.go index 698c2c4..fc37322 100644 --- a/http/controller/api/ouath.go +++ b/http/controller/api/ouath.go @@ -29,17 +29,17 @@ func (o *Oauth) OidcAuth(c *gin.Context) { f := &api.OidcAuthRequest{} err := c.ShouldBindJSON(&f) if err != nil { - response.Error(c, "参数错误") + response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) return } if f.Op != model.OauthTypeWebauth && f.Op != model.OauthTypeGoogle && f.Op != model.OauthTypeGithub { - response.Error(c, "参数错误") + response.Error(c, response.TranslateMsg(c, "ParamsError")) return } err, code, url := service.AllService.OauthService.BeginAuth(f.Op) if err != nil { - response.Error(c, err.Error()) + response.Error(c, response.TranslateMsg(c, err.Error())) return } @@ -72,12 +72,12 @@ func (o *Oauth) OidcAuthQuery(c *gin.Context) { q := &api.OidcAuthQuery{} err := c.ShouldBindQuery(q) if err != nil { - response.Error(c, "参数错误") + response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) return } v := service.AllService.OauthService.GetOauthCache(q.Code) if v == nil { - response.Error(c, "授权已过期,请重新授权") + response.Error(c, response.TranslateMsg(c, "OauthExpired")) return } if v.UserId == 0 { @@ -87,24 +87,20 @@ func (o *Oauth) OidcAuthQuery(c *gin.Context) { } u := service.AllService.UserService.InfoById(v.UserId) //fmt.Println("auth success u", u) - if u.Id > 0 { - service.AllService.OauthService.DeleteOauthCache(q.Code) - ut := service.AllService.UserService.Login(u, &model.LoginLog{ - UserId: u.Id, - Client: v.DeviceType, - Uuid: v.Uuid, - Ip: c.ClientIP(), - Type: model.LoginLogTypeOauth, - Platform: v.DeviceOs, - }) - c.JSON(http.StatusOK, apiResp.LoginRes{ - AccessToken: ut.Token, - Type: "access_token", - User: *(&apiResp.UserPayload{}).FromUser(u), - }) - return - } - response.Error(c, "用户不存在") + service.AllService.OauthService.DeleteOauthCache(q.Code) + ut := service.AllService.UserService.Login(u, &model.LoginLog{ + UserId: u.Id, + Client: v.DeviceType, + Uuid: v.Uuid, + Ip: c.ClientIP(), + Type: model.LoginLogTypeOauth, + Platform: v.DeviceOs, + }) + c.JSON(http.StatusOK, apiResp.LoginRes{ + AccessToken: ut.Token, + Type: "access_token", + User: *(&apiResp.UserPayload{}).FromUser(u), + }) } // OauthCallback 回调 @@ -119,7 +115,7 @@ func (o *Oauth) OidcAuthQuery(c *gin.Context) { func (o *Oauth) OauthCallback(c *gin.Context) { state := c.Query("state") if state == "" { - c.String(http.StatusInternalServerError, "state为空") + c.String(http.StatusInternalServerError, response.TranslateParamMsg(c, "ParamIsEmpty", "state")) return } @@ -127,7 +123,7 @@ func (o *Oauth) OauthCallback(c *gin.Context) { //从缓存中获取 v := service.AllService.OauthService.GetOauthCache(cacheKey) if v == nil { - c.String(http.StatusInternalServerError, "授权已过期,请重新授权") + c.String(http.StatusInternalServerError, response.TranslateMsg(c, "OauthExpired")) return } @@ -138,34 +134,34 @@ func (o *Oauth) OauthCallback(c *gin.Context) { code := c.Query("code") err, userData := service.AllService.OauthService.GithubCallback(code) if err != nil { - c.String(http.StatusInternalServerError, "授权失败:"+err.Error()) + c.String(http.StatusInternalServerError, response.TranslateMsg(c, "OauthFailed")+response.TranslateMsg(c, err.Error())) return } if ac == service.OauthActionTypeBind { //fmt.Println("bind", ty, userData) utr := service.AllService.OauthService.UserThirdInfo(ty, strconv.Itoa(userData.Id)) if utr.UserId > 0 { - c.String(http.StatusInternalServerError, "已经绑定其他账号") + c.String(http.StatusInternalServerError, response.TranslateMsg(c, "OauthHasBindOtherUser")) return } //绑定 u := service.AllService.UserService.InfoById(v.UserId) if u == nil { - c.String(http.StatusInternalServerError, "用户不存在") + c.String(http.StatusInternalServerError, response.TranslateMsg(c, "ItemNotFound")) return } //绑定github err = service.AllService.OauthService.BindGithubUser(strconv.Itoa(userData.Id), userData.Login, v.UserId) if err != nil { - c.String(http.StatusInternalServerError, "绑定失败") + c.String(http.StatusInternalServerError, response.TranslateMsg(c, "BindFail")) return } - c.String(http.StatusOK, "绑定成功") + c.String(http.StatusOK, response.TranslateMsg(c, "BindSuccess")) return } else if ac == service.OauthActionTypeLogin { //登录 if v.UserId != 0 { - c.String(http.StatusInternalServerError, "授权已经成功") + c.String(http.StatusInternalServerError, response.TranslateMsg(c, "OauthHasBeenSuccess")) return } u := service.AllService.UserService.InfoByGithubId(strconv.Itoa(userData.Id)) @@ -183,19 +179,16 @@ func (o *Oauth) OauthCallback(c *gin.Context) { //自动注册 u = service.AllService.UserService.RegisterByGithub(userData.Login, strconv.Itoa(userData.Id)) if u.Id == 0 { - c.String(http.StatusInternalServerError, "注册失败") + c.String(http.StatusInternalServerError, response.TranslateMsg(c, "OauthRegisterFailed")) return } } v.UserId = u.Id service.AllService.OauthService.SetOauthCache(cacheKey, v, 0) - c.String(http.StatusOK, "授权成功") + c.String(http.StatusOK, response.TranslateMsg(c, "OauthSuccess")) return } - //返回js - c.Header("Content-Type", "text/html; charset=utf-8") - c.String(http.StatusOK, "授权错误") } @@ -203,7 +196,7 @@ func (o *Oauth) OauthCallback(c *gin.Context) { code := c.Query("code") err, userData := service.AllService.OauthService.GoogleCallback(code) if err != nil { - c.String(http.StatusInternalServerError, "授权失败:"+err.Error()) + c.String(http.StatusInternalServerError, response.TranslateMsg(c, "OauthFailed")+response.TranslateMsg(c, err.Error())) return } //将空格替换成_ @@ -212,26 +205,26 @@ func (o *Oauth) OauthCallback(c *gin.Context) { //fmt.Println("bind", ty, userData) utr := service.AllService.OauthService.UserThirdInfo(ty, userData.Email) if utr.UserId > 0 { - c.String(http.StatusInternalServerError, "已经绑定其他账号") + c.String(http.StatusInternalServerError, response.TranslateMsg(c, "OauthHasBindOtherUser")) return } //绑定 u := service.AllService.UserService.InfoById(v.UserId) if u == nil { - c.String(http.StatusInternalServerError, "用户不存在") + c.String(http.StatusInternalServerError, response.TranslateMsg(c, "ItemNotFound")) return } //绑定 err = service.AllService.OauthService.BindGoogleUser(userData.Email, googleName, v.UserId) if err != nil { - c.String(http.StatusInternalServerError, "绑定失败") + c.String(http.StatusInternalServerError, response.TranslateMsg(c, "BindFail")) return } - c.String(http.StatusOK, "绑定成功") + c.String(http.StatusOK, response.TranslateMsg(c, "BindSuccess")) return } else if ac == service.OauthActionTypeLogin { if v.UserId != 0 { - c.String(http.StatusInternalServerError, "授权已经成功") + c.String(http.StatusInternalServerError, response.TranslateMsg(c, "OauthHasBeenSuccess")) return } u := service.AllService.UserService.InfoByGoogleEmail(userData.Email) @@ -250,17 +243,17 @@ func (o *Oauth) OauthCallback(c *gin.Context) { //自动注册 u = service.AllService.UserService.RegisterByGoogle(googleName, userData.Email) if u.Id == 0 { - c.String(http.StatusInternalServerError, "注册失败") + c.String(http.StatusInternalServerError, response.TranslateMsg(c, "OauthRegisterFailed")) return } } v.UserId = u.Id service.AllService.OauthService.SetOauthCache(cacheKey, v, 0) - c.String(http.StatusOK, "授权成功") + c.String(http.StatusOK, response.TranslateMsg(c, "OauthSuccess")) return } } - c.String(http.StatusInternalServerError, "授权配置错误,请联系管理员") + c.String(http.StatusInternalServerError, response.TranslateMsg(c, "SystemError")) } diff --git a/http/controller/api/peer.go b/http/controller/api/peer.go index 985ddd8..5a3347f 100644 --- a/http/controller/api/peer.go +++ b/http/controller/api/peer.go @@ -27,7 +27,7 @@ func (p *Peer) SysInfo(c *gin.Context) { f := &requstform.PeerForm{} err := c.ShouldBindBodyWith(f, binding.JSON) if err != nil { - response.Error(c, err.Error()) + response.Error(c, response.TranslateMsg(c, "ParamsError")+err.Error()) return } @@ -36,7 +36,7 @@ func (p *Peer) SysInfo(c *gin.Context) { pe = f.ToPeer() err = service.AllService.PeerService.Create(pe) if err != nil { - response.Error(c, err.Error()) + response.Error(c, response.TranslateMsg(c, "OperationFailed")+err.Error()) return } } diff --git a/http/middleware/rustauth.go b/http/middleware/rustauth.go index bc4639d..73ec713 100644 --- a/http/middleware/rustauth.go +++ b/http/middleware/rustauth.go @@ -7,7 +7,7 @@ import ( func RustAuth() gin.HandlerFunc { return func(c *gin.Context) { - + //fmt.Println(c.Request.Header) //获取HTTP_AUTHORIZATION token := c.GetHeader("Authorization") if token == "" { diff --git a/http/request/admin/user.go b/http/request/admin/user.go index 6e09796..405d8b4 100644 --- a/http/request/admin/user.go +++ b/http/request/admin/user.go @@ -8,7 +8,7 @@ type UserForm struct { Id uint `json:"id"` Username string `json:"username" validate:"required,gte=4,lte=10"` //Password string `json:"password" validate:"required,gte=4,lte=20"` - Nickname string `json:"nickname" validate:"required"` + Nickname string `json:"nickname"` Avatar string `json:"avatar"` GroupId uint `json:"group_id" validate:"required"` IsAdmin *bool `json:"is_admin" ` diff --git a/http/response/response.go b/http/response/response.go index 9f51c26..f56fd06 100644 --- a/http/response/response.go +++ b/http/response/response.go @@ -1,7 +1,10 @@ package response import ( + "Gwen/global" + "fmt" "github.com/gin-gonic/gin" + "github.com/nicksnyder/go-i18n/v2/i18n" "net/http" ) @@ -51,3 +54,48 @@ type ServerConfigResponse struct { RelayServer string `json:"relay_server"` ApiServer string `json:"api_server"` } + +func TranslateMsg(c *gin.Context, messageId string) string { + localizer := global.Localizer(c) + errMsg, err := localizer.LocalizeMessage(&i18n.Message{ + ID: messageId, + }) + if err != nil { + global.Logger.Warn("LocalizeMessage Error: " + err.Error()) + errMsg = messageId + } + return errMsg +} +func TranslateTempMsg(c *gin.Context, messageId string, templateData map[string]interface{}) string { + localizer := global.Localizer(c) + errMsg, err := localizer.Localize(&i18n.LocalizeConfig{ + DefaultMessage: &i18n.Message{ + ID: messageId, + }, + TemplateData: templateData, + }) + if err != nil { + global.Logger.Warn("LocalizeMessage Error: " + err.Error()) + errMsg = messageId + } + return errMsg +} +func TranslateParamMsg(c *gin.Context, messageId string, params ...string) string { + localizer := global.Localizer(c) + templateData := make(map[string]interface{}) + for i, v := range params { + k := fmt.Sprintf("P%d", i) + templateData[k] = v + } + errMsg, err := localizer.Localize(&i18n.LocalizeConfig{ + DefaultMessage: &i18n.Message{ + ID: messageId, + }, + TemplateData: templateData, + }) + if err != nil { + global.Logger.Warn("LocalizeMessage Error: " + err.Error()) + errMsg = messageId + } + return errMsg +} diff --git a/resources/i18n/en.toml b/resources/i18n/en.toml new file mode 100644 index 0000000..47fb5a5 --- /dev/null +++ b/resources/i18n/en.toml @@ -0,0 +1,111 @@ +[Test] +description = "test" +one = "test1 " +other = "Test2 {{.P0}}" + +[ParamsError] +description = "Params validation failed." +one = "Params validation failed." +other = "Params validation failed." + +[OperationFailed] +description = "OperationFailed." +one = "the operation failed." +other = "the operation failed." + +[OperationSuccess] +description = "OperationSuccess." +one = "the operation success." +other = "the operation success." + +[ItemExists] +description = "Item already exists." +one = "Item already exists." +other = "Item already exists." + +[ItemNotFound] +description = "Item not found." +one = "Item not found." +other = "Item not found." + +[NoAccess] +description = "No access." +one = "No access." +other = "No access." + +[UsernameOrPasswordError] +description = "Username or password error." +one = "Username or password error." +other = "Username or password error." + +[SystemError] +description = "System error." +one = "System error." +other = "System error." + +[ConfigNotFound] +description = "Config not found." +one = "Config not found." +other = "Config not found." + +[OauthExpired] +description = "Oauth expired." +one = "Oauth expired, please try again." +other = "Oauth expired,please try again." + +[OauthFailed] +description = "Oauth failed." +one = "Oauth failed." +other = "Oauth failed." + +[OauthHasBindOtherUser] +description = "Oauth has bind other user." +one = "Oauth has bind other user." +other = "Oauth has bind other user." + +[ParamIsEmpty] +description = "Param is empty." +one = "{{.P0}} is empty." +other = "{{.P0}} is empty." + +[BindFail] +description = "Bind fail." +one = "Bind fail." +other = "Bind fail." +[BindSuccess] +description = "Bind success." +one = "Bind success." +other = "Bind success." +[OauthHasBeenSuccess] +description = "Oauth has been success." +one = "Oauth has been success." +other = "Oauth has been success." +[OauthSuccess] +description = "Oauth success." +one = "Oauth success." +other = "Oauth success." +[OauthRegisterSuccess] +description = "Oauth register success." +one = "Oauth register success." +other = "Oauth register success." +[OauthRegisterFailed] +description = "Oauth register failed." +one = "Oauth register failed." +other = "Oauth register failed." +[GetOauthTokenError] +description = "Get oauth token error." +one = "Get oauth token error." +other = "Get oauth token error." +[GetOauthUserInfoError] +description = "Get oauth user info error." +one = "Get oauth user info error." +other = "Get oauth user info error." +[DecodeOauthUserInfoError] +description = "Decode oauth user info error." +one = "Decode oauth user info error." +other = "Decode oauth user info error." + +[OldPasswordError] +description = "Old password error." +one = "Old password error." +other = "Old password error." diff --git a/resources/i18n/zh_CN.toml b/resources/i18n/zh_CN.toml new file mode 100644 index 0000000..e96cf1d --- /dev/null +++ b/resources/i18n/zh_CN.toml @@ -0,0 +1,112 @@ +[Test] +description = "test" +one = "测试1 {{.P0}}" +other = "测试2 {{.P0}}" + +[ParamsError] +description = "Params validation failed." +one = "参数错误。" +other = "参数错误。" + +[OperationFailed] +description = "OperationFailed." +one = "操作失败。" +other = "操作失败。" + +[OperationSuccess] +description = "OperationSuccess." +one = "操作成功。" +other = "操作成功。" + +[ItemExists] +description = "Item already exists." +one = "数据已存在。" +other = "数据已存在。" + +[ItemNotFound] +description = "Item not found." +one = "数据不存在。" +other = "数据不存在。" + +[NoAccess] +description = "No access." +one = "无权限。" +other = "无权限。" + +[UsernameOrPasswordError] +description = "Username or password error." +one = "用户名或密码错误。" +other = "用户名或密码错误。" + +[SystemError] +description = "System error." +one = "系统错误。" +other = "系统错误。" + +[ConfigNotFound] +description = "Config not found." +one = "配置不存在。" +other = "配置不存在。" + +#授权过期 +[OauthExpired] +description = "Oauth expired." +one = "授权过期,请重新授权。" +other = "授权过期,请重新授权。" + +[OauthFailed] +description = "Oauth failed." +one = "授权失败。" +other = "授权失败。" + +[OauthHasBindOtherUser] +description = "Oauth has bind other user." +one = "授权已绑定其他用户。" +other = "授权已绑定其他用户。" + +[ParamIsEmpty] +description = "Param is empty." +one = "{{.P0}} 为空。" +other = "{{.P0}} 为空。" + +[BindFail] +description = "Bind fail." +one = "绑定失败。" +other = "绑定失败。" +[BindSuccess] +description = "Bind success." +one = "绑定成功。" +other = "绑定成功。" +[OauthHasBeenSuccess] +description = "Oauth has been success." +one = "授权已成功。" +other = "授权已成功。" +[OauthSuccess] +description = "Oauth success." +one = "授权成功。" +other = "授权成功。" +[OauthRegisterSuccess] +description = "Oauth register success." +one = "授权注册成功。" +other = "授权注册成功。" +[OauthRegisterFailed] +description = "Oauth register failed." +one = "授权注册失败。" +other = "授权注册失败。" +[GetOauthTokenError] +description = "Get oauth token error." +one = "获取授权token失败。" +other = "获取授权token失败。" +[GetOauthUserInfoError] +description = "Get oauth user info error." +one = "获取授权用户信息失败。" +other = "获取授权用户信息失败。" +[DecodeOauthUserInfoError] +description = "Decode oauth user info error." +one = "解析授权用户信息失败。" +other = "解析授权用户信息失败。" + +[OldPasswordError] +description = "Old password error." +one = "旧密码错误。" +other = "旧密码错误。" \ No newline at end of file diff --git a/service/oauth.go b/service/oauth.go index 47b9c34..889d4ae 100644 --- a/service/oauth.go +++ b/service/oauth.go @@ -133,7 +133,7 @@ func (os *OauthService) BeginAuth(op string) (error error, code, url string) { return err, code, conf.AuthCodeURL(code) } - return errors.New("op错误"), code, "" + return err, code, "" } // GetOauthConfig 获取配置 @@ -141,7 +141,7 @@ func (os *OauthService) GetOauthConfig(op string) (error, *oauth2.Config) { if op == model.OauthTypeGithub { g := os.InfoByOp(model.OauthTypeGithub) if g.Id == 0 || g.ClientId == "" || g.ClientSecret == "" || g.RedirectUrl == "" { - return errors.New("配置不存在"), nil + return errors.New("ConfigNotFound"), nil } return nil, &oauth2.Config{ ClientID: g.ClientId, @@ -154,7 +154,7 @@ func (os *OauthService) GetOauthConfig(op string) (error, *oauth2.Config) { if op == model.OauthTypeGoogle { g := os.InfoByOp(model.OauthTypeGoogle) if g.Id == 0 || g.ClientId == "" || g.ClientSecret == "" || g.RedirectUrl == "" { - return errors.New("配置不存在"), nil + return errors.New("ConfigNotFound"), nil } return nil, &oauth2.Config{ ClientID: g.ClientId, @@ -164,7 +164,7 @@ func (os *OauthService) GetOauthConfig(op string) (error, *oauth2.Config) { Scopes: []string{"https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email"}, } } - return errors.New("op错误"), nil + return errors.New("ConfigNotFound"), nil } func (os *OauthService) GithubCallback(code string) (error error, userData *GithubUserdata) { @@ -175,7 +175,7 @@ func (os *OauthService) GithubCallback(code string) (error error, userData *Gith token, err := oauthConfig.Exchange(context.Background(), code) if err != nil { global.Logger.Warn(fmt.Printf("oauthConfig.Exchange() failed: %s\n", err)) - error = errors.New("获取token失败") + error = errors.New("GetOauthTokenError") return } @@ -184,7 +184,7 @@ func (os *OauthService) GithubCallback(code string) (error error, userData *Gith resp, err := client.Get("https://api.github.com/user") if err != nil { global.Logger.Warn("failed getting user info: %s\n", err) - error = errors.New("获取user info失败") + error = errors.New("GetOauthUserInfoError") return } defer func(Body io.ReadCloser) { @@ -197,7 +197,7 @@ func (os *OauthService) GithubCallback(code string) (error error, userData *Gith // 在这里处理 GitHub 用户信息 if err = json.NewDecoder(resp.Body).Decode(&userData); err != nil { global.Logger.Warn("failed decoding user info: %s\n", err) - error = errors.New("解析user info失败") + error = errors.New("DecodeOauthUserInfoError") return } return @@ -208,7 +208,7 @@ func (os *OauthService) GoogleCallback(code string) (error error, userData *Goog token, err := oauthConfig.Exchange(context.Background(), code) if err != nil { global.Logger.Warn(fmt.Printf("oauthConfig.Exchange() failed: %s\n", err)) - error = errors.New("获取token失败") + error = errors.New("GetOauthTokenError") return } // 创建 HTTP 客户端,并将 access_token 添加到 Authorization 头中 @@ -216,7 +216,7 @@ func (os *OauthService) GoogleCallback(code string) (error error, userData *Goog resp, err := client.Get("https://www.googleapis.com/oauth2/v2/userinfo") if err != nil { global.Logger.Warn("failed getting user info: %s\n", err) - error = errors.New("获取user info失败: " + err.Error()) + error = errors.New("GetOauthUserInfoError") return } defer func(Body io.ReadCloser) { @@ -228,7 +228,7 @@ func (os *OauthService) GoogleCallback(code string) (error error, userData *Goog if err = json.NewDecoder(resp.Body).Decode(&userData); err != nil { global.Logger.Warn("failed decoding user info: %s\n", err) - error = errors.New("解析user info失败:" + err.Error()) + error = errors.New("DecodeOauthUserInfoError") return } return @@ -258,7 +258,13 @@ func (os *OauthService) BindOauthUser(thirdType, openid, username string, userId } func (os *OauthService) UnBindGithubUser(userid uint) error { - return global.DB.Where("user_id = ? and third_type = ?", userid, model.OauthTypeGithub).Delete(&model.UserThird{}).Error + return os.UnBindThird(model.OauthTypeGithub, userid) +} +func (os *OauthService) UnBindGoogleUser(userid uint) error { + return os.UnBindThird(model.OauthTypeGoogle, userid) +} +func (os *OauthService) UnBindThird(thirdType string, userid uint) error { + return global.DB.Where("user_id = ? and third_type = ?", userid, thirdType).Delete(&model.UserThird{}).Error } // InfoById 根据id取用户信息