diff --git a/api/oauth_api/gitee_api.go b/api/oauth_api/gitee_api.go index 12cf741..c324f50 100644 --- a/api/oauth_api/gitee_api.go +++ b/api/oauth_api/gitee_api.go @@ -214,6 +214,7 @@ func (OAuthAPI) GiteeCallback(c *gin.Context) { Avatar: &giteeUser.AvatarURL, Blog: &giteeUser.Blog, Email: &giteeUser.Email, + Gender: &enum.Male, } addUser, err := userService.AddUser(user) if err != nil { diff --git a/api/oauth_api/github_api.go b/api/oauth_api/github_api.go index fbd5bcf..b45b93e 100644 --- a/api/oauth_api/github_api.go +++ b/api/oauth_api/github_api.go @@ -224,6 +224,7 @@ func (OAuthAPI) Callback(c *gin.Context) { Avatar: &gitHubUser.AvatarURL, Blog: &gitHubUser.Blog, Email: &gitHubUser.Email, + Gender: &enum.Male, } addUser, err := userService.AddUser(user) if err != nil { diff --git a/api/oauth_api/qq_api.go b/api/oauth_api/qq_api.go index 92605e1..b85b353 100644 --- a/api/oauth_api/qq_api.go +++ b/api/oauth_api/qq_api.go @@ -260,14 +260,12 @@ func (OAuthAPI) QQCallback(c *gin.Context) { // 第一次登录,创建用户 uid := idgen.NextId() uidStr := strconv.FormatInt(uid, 10) - location := qqUserInfo.Province + "|" + qqUserInfo.City user := model.ScaAuthUser{ UID: &uidStr, Username: &authQQme.OpenID, Nickname: &qqUserInfo.Nickname, Avatar: &qqUserInfo.FigureurlQq1, Gender: &qqUserInfo.Gender, - Location: &location, } addUser, err := userService.AddUser(user) if err != nil { diff --git a/api/oauth_api/wechat_api.go b/api/oauth_api/wechat_api.go index e64287f..1e88628 100644 --- a/api/oauth_api/wechat_api.go +++ b/api/oauth_api/wechat_api.go @@ -9,6 +9,7 @@ import ( "github.com/ArtisanCloud/PowerWeChat/v3/src/kernel/messages" models2 "github.com/ArtisanCloud/PowerWeChat/v3/src/kernel/models" "github.com/ArtisanCloud/PowerWeChat/v3/src/officialAccount/server/handlers/models" + "github.com/DanPlayer/randomname" ginI18n "github.com/gin-contrib/i18n" "github.com/gin-gonic/gin" "github.com/yitter/idgenerator-go/idgen" @@ -179,9 +180,17 @@ func wechatLoginHandler(openId string, clientId string) bool { uid := idgen.NextId() uidStr := strconv.FormatInt(uid, 10) + avatar, err := utils.GenerateAvatar(uidStr) + name := randomname.GenerateName() + if err != nil { + global.LOG.Errorln(err) + return false + } createUser := model.ScaAuthUser{ UID: &uidStr, Username: &openId, + Avatar: &avatar, + Nickname: &name, } // 异步添加用户 @@ -193,7 +202,7 @@ func wechatLoginHandler(openId string, clientId string) bool { errChan <- err return } - addUserChan <- &addUser + addUserChan <- addUser }() var addUser *model.ScaAuthUser diff --git a/api/user_api/user_api.go b/api/user_api/user_api.go index 80d451e..71012d8 100644 --- a/api/user_api/user_api.go +++ b/api/user_api/user_api.go @@ -2,6 +2,7 @@ package user_api import ( "errors" + "github.com/DanPlayer/randomname" ginI18n "github.com/gin-contrib/i18n" "github.com/gin-gonic/gin" "github.com/mssola/useragent" @@ -198,9 +199,19 @@ func (UserAPI) PhoneLogin(c *gin.Context) { uid := idgen.NextId() uidStr := strconv.FormatInt(uid, 10) + + avatar, err := utils.GenerateAvatar(uidStr) + if err != nil { + global.LOG.Errorln(err) + return + } + name := randomname.GenerateName() createUser := model.ScaAuthUser{ - UID: &uidStr, - Phone: &phone, + UID: &uidStr, + Phone: &phone, + Avatar: &avatar, + Nickname: &name, + Gender: &enum.Male, } errChan := make(chan error) @@ -214,13 +225,13 @@ func (UserAPI) PhoneLogin(c *gin.Context) { if err != nil { return err } - handelUserLogin(addUser, autoLogin, c) + handelUserLogin(*addUser, autoLogin, c) return nil }) errChan <- err }() - err := <-errChan + err = <-errChan close(errChan) if err != nil { diff --git a/common/enum/gender.go b/common/enum/gender.go new file mode 100644 index 0000000..28f8c06 --- /dev/null +++ b/common/enum/gender.go @@ -0,0 +1,6 @@ +package enum + +var ( + Male = "男" + Female = "女" +) diff --git a/go.mod b/go.mod index 6dbff23..699e06e 100644 --- a/go.mod +++ b/go.mod @@ -39,6 +39,7 @@ require ( require ( filippo.io/edwards25519 v1.1.0 // indirect github.com/ArtisanCloud/PowerSocialite/v3 v3.0.7 // indirect + github.com/DanPlayer/randomname v1.0.1 // indirect github.com/KyleBanks/depth v1.2.1 // indirect github.com/bytedance/sonic v1.12.0 // indirect github.com/bytedance/sonic/loader v0.2.0 // indirect diff --git a/go.sum b/go.sum index 8c62cd7..de6ff1b 100644 --- a/go.sum +++ b/go.sum @@ -26,6 +26,8 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.1.0 h1:HCc0+LpPfpC github.com/AzureAD/microsoft-authentication-library-for-go v1.1.0/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/DanPlayer/randomname v1.0.1 h1:BY7WkgB0gsjESNsqG7NADD5KSlWYAglCiRDKMJ9Q1Zo= +github.com/DanPlayer/randomname v1.0.1/go.mod h1:3baqzjkyc22BGUIAGK+maXF8I6vTcO+XF/tvXaZAU3E= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= diff --git a/model/sca_auth_user.go b/model/sca_auth_user.go index 1443b57..9107b48 100644 --- a/model/sca_auth_user.go +++ b/model/sca_auth_user.go @@ -17,7 +17,7 @@ type ScaAuthUser struct { Phone *string `gorm:"column:phone;type:varchar(32);comment:电话" json:"phone"` // 电话 Password *string `gorm:"column:password;type:varchar(64);comment:密码" json:"-"` // 密码 Gender *string `gorm:"column:gender;type:varchar(32);comment:性别" json:"gender"` // 性别 - Avatar *string `gorm:"column:avatar;type:varchar(255);comment:头像" json:"avatar"` // 头像 + Avatar *string `gorm:"column:avatar;type:longtext;comment:头像" json:"avatar"` // 头像 Status *int64 `gorm:"column:status;type:tinyint(4);default:0;comment:状态 0 正常 1 封禁" json:"status"` // 状态 0 正常 1 封禁 Introduce *string `gorm:"column:introduce;type:varchar(255);comment:介绍" json:"introduce"` // 介绍 CreatedTime *time.Time `gorm:"column:created_time;type:datetime;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_time"` // 创建时间 diff --git a/router/modules/oauth_router.go b/router/modules/oauth_router.go index 9d4b852..11b1004 100644 --- a/router/modules/oauth_router.go +++ b/router/modules/oauth_router.go @@ -12,25 +12,42 @@ func OauthRouter(router *gin.RouterGroup) { { wechatRouter := group.Group("/wechat") { - wechatRouter.GET("/get_temp_qrcode", oauth.GetTempQrCode) //wechatRouter.GET("/callback", oauth.CallbackVerify) wechatRouter.POST("/callback", oauth.CallbackNotify) } githubRouter := group.Group("/github") { - githubRouter.GET("/get_url", oauth.GetRedirectUrl) githubRouter.GET("/callback", oauth.Callback) } giteeRouter := group.Group("/gitee") { - giteeRouter.GET("/get_url", oauth.GetGiteeRedirectUrl) giteeRouter.GET("/callback", oauth.GiteeCallback) } qqRouter := group.Group("/qq") { - qqRouter.GET("/get_url", oauth.GetQQRedirectUrl) qqRouter.GET("/callback", oauth.QQCallback) } + } +} +func OauthRouterAuth(router *gin.RouterGroup) { + group := router.Group("/oauth") + { + wechatRouter := group.Group("/wechat") + { + wechatRouter.GET("/get_temp_qrcode", oauth.GetTempQrCode) + } + githubRouter := group.Group("/github") + { + githubRouter.GET("/get_url", oauth.GetRedirectUrl) + } + giteeRouter := group.Group("/gitee") + { + giteeRouter.GET("/get_url", oauth.GetGiteeRedirectUrl) + } + qqRouter := group.Group("/qq") + { + qqRouter.GET("/get_url", oauth.GetQQRedirectUrl) + } group.GET("/get_device", oauth.GetUserLoginDevice) } } diff --git a/router/modules/permission_router.go b/router/modules/permission_router.go index 0638b8e..243676a 100644 --- a/router/modules/permission_router.go +++ b/router/modules/permission_router.go @@ -11,6 +11,6 @@ func PermissionRouter(router *gin.RouterGroup) { group := router.Group("/auth/permission") { group.POST("/add", permissionApi.AddPermissions) - group.GET("/get_user_permissions", permissionApi.GetUserPermissions) + group.POST("/get_user_permissions", permissionApi.GetUserPermissions) } } diff --git a/router/router.go b/router/router.go index ad1a14d..7f3140d 100644 --- a/router/router.go +++ b/router/router.go @@ -33,17 +33,17 @@ func InitRouter() *gin.Engine { // 国际化设置 router.Use(middleware.I18n()) - websocketRouter := router.Group("api") + noMiddlewareRouter := router.Group("api") { - modules.WebsocketRouter(websocketRouter) // 注册websocket路由 + modules.WebsocketRouter(noMiddlewareRouter) // 注册websocket路由 + modules.OauthRouter(noMiddlewareRouter) // 注册oauth路由 } publicGroup := router.Group("api") // 不需要鉴权的路由组 publicGroup.Use(middleware.SecurityHeaders()) { modules.ClientRouter(publicGroup) // 注册客户端路由 modules.SwaggerRouter(publicGroup) // 注册swagger路由 - - modules.OauthRouter(publicGroup) + modules.OauthRouterAuth(publicGroup) modules.CaptchaRouter(publicGroup) // 注册验证码路由 modules.SmsRouter(publicGroup) // 注册短信验证码路由 modules.UserRouter(publicGroup) // 注册鉴权路由 diff --git a/service/user_service/user_service.go b/service/user_service/user_service.go index 1cdcfe0..443e535 100644 --- a/service/user_service/user_service.go +++ b/service/user_service/user_service.go @@ -42,16 +42,16 @@ func (UserService) QueryUserById(id *int64) (model.ScaAuthUser, error) { } // AddUser 添加用户 -func (UserService) AddUser(user model.ScaAuthUser) (model.ScaAuthUser, error) { +func (UserService) AddUser(user model.ScaAuthUser) (*model.ScaAuthUser, error) { if err := global.DB.Create(&user).Error; err != nil { - return model.ScaAuthUser{}, err + return &model.ScaAuthUser{}, err } // 查询创建后的用户信息 var createdUser model.ScaAuthUser if err := global.DB.First(&createdUser, user.ID).Error; err != nil { - return model.ScaAuthUser{}, err + return &model.ScaAuthUser{}, err } - return createdUser, nil + return &createdUser, nil } // UpdateUser 更新用户 diff --git a/utils/generate_avatar.go b/utils/generate_avatar.go new file mode 100644 index 0000000..f48116c --- /dev/null +++ b/utils/generate_avatar.go @@ -0,0 +1,54 @@ +package utils + +import ( + "encoding/base64" + "errors" + "io" + "net/http" + "time" +) + +// 获取网络图片 +var client = &http.Client{ + Timeout: 5 * time.Second, // 超时时间 +} + +// GenerateAvatar 用于生成用户头像 +func GenerateAvatar(userId string) (baseImg string, err error) { + + path := "https://api.multiavatar.com/" + userId + ".png" + + // 创建请求 + request, err := http.NewRequest("GET", path, nil) + if err != nil { + return "", errors.New("image request error") + } + + // 发送请求并获取响应 + respImg, err := client.Do(request) + if err != nil { + return "", errors.New("failed to fetch image") + } + defer func(Body io.ReadCloser) { + err := Body.Close() + if err != nil { + return + } + }(respImg.Body) + + // 读取图片数据 + imgByte, err := io.ReadAll(respImg.Body) + if err != nil { + return "", errors.New("failed to read image data") + } + + // 判断文件类型,生成一个前缀 + mimeType := http.DetectContentType(imgByte) + switch mimeType { + case "image/png": + baseImg = "data:image/png;base64," + base64.StdEncoding.EncodeToString(imgByte) + default: + return "", errors.New("unsupported image type") + } + return baseImg, nil +}