✨ init user created with avatar
This commit is contained in:
@@ -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 {
|
||||
|
@@ -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 {
|
||||
|
@@ -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 {
|
||||
|
@@ -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
|
||||
|
@@ -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
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 (
|
||||
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
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/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=
|
||||
|
@@ -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"` // 创建时间
|
||||
|
@@ -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)
|
||||
}
|
||||
}
|
||||
|
@@ -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)
|
||||
}
|
||||
}
|
||||
|
@@ -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) // 注册鉴权路由
|
||||
|
@@ -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
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