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,
Blog: &giteeUser.Blog,
Email: &giteeUser.Email,
Gender: &enum.Male,
}
addUser, err := userService.AddUser(user)
if err != nil {

View File

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

View File

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

View File

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

View File

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

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 (
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

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/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=

View File

@@ -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"` // 创建时间

View File

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

View File

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

View File

@@ -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) // 注册鉴权路由

View File

@@ -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 更新用户

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
}