✨ init user created with avatar
This commit is contained in:
@@ -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 {
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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
|
||||||
|
@@ -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
6
common/enum/gender.go
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package enum
|
||||||
|
|
||||||
|
var (
|
||||||
|
Male = "男"
|
||||||
|
Female = "女"
|
||||||
|
)
|
1
go.mod
1
go.mod
@@ -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
2
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/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=
|
||||||
|
@@ -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"` // 创建时间
|
||||||
|
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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) // 注册鉴权路由
|
||||||
|
@@ -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
54
utils/generate_avatar.go
Normal 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
|
||||||
|
}
|
Reference in New Issue
Block a user