init user created with avatar

This commit is contained in:
landaiqing
2024-09-09 23:10:24 +08:00
parent cd60d98e86
commit 258e3fce60
14 changed files with 121 additions and 21 deletions

View File

@@ -214,6 +214,7 @@ func (OAuthAPI) GiteeCallback(c *gin.Context) {
Avatar: &giteeUser.AvatarURL, Avatar: &giteeUser.AvatarURL,
Blog: &giteeUser.Blog, Blog: &giteeUser.Blog,
Email: &giteeUser.Email, Email: &giteeUser.Email,
Gender: &enum.Male,
} }
addUser, err := userService.AddUser(user) addUser, err := userService.AddUser(user)
if err != nil { if err != nil {

View File

@@ -224,6 +224,7 @@ func (OAuthAPI) Callback(c *gin.Context) {
Avatar: &gitHubUser.AvatarURL, Avatar: &gitHubUser.AvatarURL,
Blog: &gitHubUser.Blog, Blog: &gitHubUser.Blog,
Email: &gitHubUser.Email, Email: &gitHubUser.Email,
Gender: &enum.Male,
} }
addUser, err := userService.AddUser(user) addUser, err := userService.AddUser(user)
if err != nil { if err != nil {

View File

@@ -260,14 +260,12 @@ func (OAuthAPI) QQCallback(c *gin.Context) {
// 第一次登录,创建用户 // 第一次登录,创建用户
uid := idgen.NextId() uid := idgen.NextId()
uidStr := strconv.FormatInt(uid, 10) uidStr := strconv.FormatInt(uid, 10)
location := qqUserInfo.Province + "|" + qqUserInfo.City
user := model.ScaAuthUser{ user := model.ScaAuthUser{
UID: &uidStr, UID: &uidStr,
Username: &authQQme.OpenID, Username: &authQQme.OpenID,
Nickname: &qqUserInfo.Nickname, Nickname: &qqUserInfo.Nickname,
Avatar: &qqUserInfo.FigureurlQq1, Avatar: &qqUserInfo.FigureurlQq1,
Gender: &qqUserInfo.Gender, Gender: &qqUserInfo.Gender,
Location: &location,
} }
addUser, err := userService.AddUser(user) addUser, err := userService.AddUser(user)
if err != nil { if err != nil {

View File

@@ -9,6 +9,7 @@ import (
"github.com/ArtisanCloud/PowerWeChat/v3/src/kernel/messages" "github.com/ArtisanCloud/PowerWeChat/v3/src/kernel/messages"
models2 "github.com/ArtisanCloud/PowerWeChat/v3/src/kernel/models" models2 "github.com/ArtisanCloud/PowerWeChat/v3/src/kernel/models"
"github.com/ArtisanCloud/PowerWeChat/v3/src/officialAccount/server/handlers/models" "github.com/ArtisanCloud/PowerWeChat/v3/src/officialAccount/server/handlers/models"
"github.com/DanPlayer/randomname"
ginI18n "github.com/gin-contrib/i18n" ginI18n "github.com/gin-contrib/i18n"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/yitter/idgenerator-go/idgen" "github.com/yitter/idgenerator-go/idgen"
@@ -179,9 +180,17 @@ func wechatLoginHandler(openId string, clientId string) bool {
uid := idgen.NextId() uid := idgen.NextId()
uidStr := strconv.FormatInt(uid, 10) 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{ createUser := model.ScaAuthUser{
UID: &uidStr, UID: &uidStr,
Username: &openId, Username: &openId,
Avatar: &avatar,
Nickname: &name,
} }
// 异步添加用户 // 异步添加用户
@@ -193,7 +202,7 @@ func wechatLoginHandler(openId string, clientId string) bool {
errChan <- err errChan <- err
return return
} }
addUserChan <- &addUser addUserChan <- addUser
}() }()
var addUser *model.ScaAuthUser var addUser *model.ScaAuthUser

View File

@@ -2,6 +2,7 @@ package user_api
import ( import (
"errors" "errors"
"github.com/DanPlayer/randomname"
ginI18n "github.com/gin-contrib/i18n" ginI18n "github.com/gin-contrib/i18n"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/mssola/useragent" "github.com/mssola/useragent"
@@ -198,9 +199,19 @@ func (UserAPI) PhoneLogin(c *gin.Context) {
uid := idgen.NextId() uid := idgen.NextId()
uidStr := strconv.FormatInt(uid, 10) uidStr := strconv.FormatInt(uid, 10)
avatar, err := utils.GenerateAvatar(uidStr)
if err != nil {
global.LOG.Errorln(err)
return
}
name := randomname.GenerateName()
createUser := model.ScaAuthUser{ createUser := model.ScaAuthUser{
UID: &uidStr, UID: &uidStr,
Phone: &phone, Phone: &phone,
Avatar: &avatar,
Nickname: &name,
Gender: &enum.Male,
} }
errChan := make(chan error) errChan := make(chan error)
@@ -214,13 +225,13 @@ func (UserAPI) PhoneLogin(c *gin.Context) {
if err != nil { if err != nil {
return err return err
} }
handelUserLogin(addUser, autoLogin, c) handelUserLogin(*addUser, autoLogin, c)
return nil return nil
}) })
errChan <- err errChan <- err
}() }()
err := <-errChan err = <-errChan
close(errChan) close(errChan)
if err != nil { if err != nil {

6
common/enum/gender.go Normal file
View File

@@ -0,0 +1,6 @@
package enum
var (
Male = "男"
Female = "女"
)

1
go.mod
View File

@@ -39,6 +39,7 @@ require (
require ( require (
filippo.io/edwards25519 v1.1.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect
github.com/ArtisanCloud/PowerSocialite/v3 v3.0.7 // 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/KyleBanks/depth v1.2.1 // indirect
github.com/bytedance/sonic v1.12.0 // indirect github.com/bytedance/sonic v1.12.0 // indirect
github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/bytedance/sonic/loader v0.2.0 // indirect

2
go.sum
View File

@@ -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/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 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= 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 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=

View File

@@ -17,7 +17,7 @@ type ScaAuthUser struct {
Phone *string `gorm:"column:phone;type:varchar(32);comment:电话" json:"phone"` // 电话 Phone *string `gorm:"column:phone;type:varchar(32);comment:电话" json:"phone"` // 电话
Password *string `gorm:"column:password;type:varchar(64);comment:密码" json:"-"` // 密码 Password *string `gorm:"column:password;type:varchar(64);comment:密码" json:"-"` // 密码
Gender *string `gorm:"column:gender;type:varchar(32);comment:性别" json:"gender"` // 性别 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 封禁 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"` // 介绍 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"` // 创建时间 CreatedTime *time.Time `gorm:"column:created_time;type:datetime;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_time"` // 创建时间

View File

@@ -12,25 +12,42 @@ func OauthRouter(router *gin.RouterGroup) {
{ {
wechatRouter := group.Group("/wechat") wechatRouter := group.Group("/wechat")
{ {
wechatRouter.GET("/get_temp_qrcode", oauth.GetTempQrCode)
//wechatRouter.GET("/callback", oauth.CallbackVerify) //wechatRouter.GET("/callback", oauth.CallbackVerify)
wechatRouter.POST("/callback", oauth.CallbackNotify) wechatRouter.POST("/callback", oauth.CallbackNotify)
} }
githubRouter := group.Group("/github") githubRouter := group.Group("/github")
{ {
githubRouter.GET("/get_url", oauth.GetRedirectUrl)
githubRouter.GET("/callback", oauth.Callback) githubRouter.GET("/callback", oauth.Callback)
} }
giteeRouter := group.Group("/gitee") giteeRouter := group.Group("/gitee")
{ {
giteeRouter.GET("/get_url", oauth.GetGiteeRedirectUrl)
giteeRouter.GET("/callback", oauth.GiteeCallback) giteeRouter.GET("/callback", oauth.GiteeCallback)
} }
qqRouter := group.Group("/qq") qqRouter := group.Group("/qq")
{ {
qqRouter.GET("/get_url", oauth.GetQQRedirectUrl)
qqRouter.GET("/callback", oauth.QQCallback) 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) group.GET("/get_device", oauth.GetUserLoginDevice)
} }
} }

View File

@@ -11,6 +11,6 @@ func PermissionRouter(router *gin.RouterGroup) {
group := router.Group("/auth/permission") group := router.Group("/auth/permission")
{ {
group.POST("/add", permissionApi.AddPermissions) group.POST("/add", permissionApi.AddPermissions)
group.GET("/get_user_permissions", permissionApi.GetUserPermissions) group.POST("/get_user_permissions", permissionApi.GetUserPermissions)
} }
} }

View File

@@ -33,17 +33,17 @@ func InitRouter() *gin.Engine {
// 国际化设置 // 国际化设置
router.Use(middleware.I18n()) 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 := router.Group("api") // 不需要鉴权的路由组
publicGroup.Use(middleware.SecurityHeaders()) publicGroup.Use(middleware.SecurityHeaders())
{ {
modules.ClientRouter(publicGroup) // 注册客户端路由 modules.ClientRouter(publicGroup) // 注册客户端路由
modules.SwaggerRouter(publicGroup) // 注册swagger路由 modules.SwaggerRouter(publicGroup) // 注册swagger路由
modules.OauthRouterAuth(publicGroup)
modules.OauthRouter(publicGroup)
modules.CaptchaRouter(publicGroup) // 注册验证码路由 modules.CaptchaRouter(publicGroup) // 注册验证码路由
modules.SmsRouter(publicGroup) // 注册短信验证码路由 modules.SmsRouter(publicGroup) // 注册短信验证码路由
modules.UserRouter(publicGroup) // 注册鉴权路由 modules.UserRouter(publicGroup) // 注册鉴权路由

View File

@@ -42,16 +42,16 @@ func (UserService) QueryUserById(id *int64) (model.ScaAuthUser, error) {
} }
// AddUser 添加用户 // 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 { if err := global.DB.Create(&user).Error; err != nil {
return model.ScaAuthUser{}, err return &model.ScaAuthUser{}, err
} }
// 查询创建后的用户信息 // 查询创建后的用户信息
var createdUser model.ScaAuthUser var createdUser model.ScaAuthUser
if err := global.DB.First(&createdUser, user.ID).Error; err != nil { 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 更新用户 // UpdateUser 更新用户

54
utils/generate_avatar.go Normal file
View File

@@ -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
}