This commit is contained in:
2024-07-19 13:37:16 +08:00
parent ec88138888
commit dfda2e2425
11 changed files with 313 additions and 30 deletions
+102 -1
View File
@@ -1,12 +1,18 @@
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"hepa-calc-api/api/dao"
"hepa-calc-api/api/model"
"hepa-calc-api/api/requests"
"hepa-calc-api/api/responses"
"hepa-calc-api/api/service"
"hepa-calc-api/extend/weChat"
"hepa-calc-api/global"
"hepa-calc-api/utils"
"strconv"
"time"
)
type Login struct{}
@@ -29,6 +35,18 @@ func (r *Login) LoginPhone(c *gin.Context) {
// LoginWx 微信授权登录
func (r *Login) LoginWx(c *gin.Context) {
userService := service.UserService{}
// 处理用户头像
avatar, err := userService.HandleUserAvatar("https://thirdwx.qlogo.cn/mmopen/vi_32/dzhWq43iaB5GyJJUbajibSQtIt6d4Y9QPk5ImB1C14fPk6AOtcgaPztUzjKwb9kmPtqNpyCal5cEyw0YyTr1QEbdtHiaOViay4RgSpdm2XaduXA/132")
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
fmt.Println(avatar)
responses.Ok(c)
return
loginRequest := requests.LoginRequest{}
req := loginRequest.LoginWx
if err := c.ShouldBind(&req); err != nil {
@@ -42,5 +60,88 @@ func (r *Login) LoginWx(c *gin.Context) {
return
}
responses.Ok(c)
// 获取微信网页授权access_token
webAccessToken, err := weChat.GetWebAccessToken(req.Code)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
fmt.Println(webAccessToken)
// 网页授权拉取用户信息
userInfo, err := weChat.GetUserInfo(webAccessToken.AccessToken, webAccessToken.OpenId)
if err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
fmt.Println(userInfo)
// 检测用户信息
userDao := dao.UserDao{}
maps := make(map[string]interface{})
maps["open_id"] = webAccessToken.OpenId
user, _ := userDao.GetUser(maps)
// 新用户处理方式
if user == nil {
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
userService := service.UserService{}
// 处理用户头像
avatar, err := userService.HandleUserAvatar(userInfo.HeadImgUrl)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
// 新增用户
user := &model.User{
UserName: userInfo.Nickname,
Mobile: "",
RegisterSource: req.Source,
OpenId: userInfo.OpenId,
UnionId: userInfo.UnionId,
Age: nil,
Sex: userInfo.Sex,
Avatar: avatar,
IsMember: 0,
MemberExpireDate: nil,
LoginAt: model.LocalTime(time.Now()),
LoginIp: req.LoginIp,
}
user, err = userDao.AddUser(tx, user)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
// 获取app用户信息
var result *string
if result == nil {
// 新增app用户信息
}
tx.Commit()
}
// 下发token
token := &utils.Token{
UserId: fmt.Sprintf("%d", user.UserId),
}
// 生成jwt
jwt, err := token.NewJWT()
if err != nil {
responses.FailWithMessage("登陆失败", c)
return
}
responses.OkWithData(jwt, c)
}
+4 -3
View File
@@ -4,6 +4,7 @@ import (
"fmt"
"hepa-calc-api/api/model"
"hepa-calc-api/utils"
"time"
)
// UserDto 用户表
@@ -19,7 +20,7 @@ type UserDto struct {
Sex uint `json:"sex"` // 性别(0:未知 1:男 2:女)
Avatar string `json:"avatar"` // 头像
IsMember int `json:"is_member"` // 是否会员(0:否 1:是)
MemberExpireDate model.LocalTime `json:"member_expire_date"` // 会员到期时间(非会员时为null)
MemberExpireDate *time.Time `json:"member_expire_date"` // 会员到期时间(非会员时为null)
LoginAt model.LocalTime `json:"login_at"` // 登陆时间
LoginIp string `json:"login_ip"` // 登陆ip
CreatedAt model.LocalTime `json:"created_at"` // 创建时间
@@ -34,8 +35,8 @@ func GetUserDto(m *model.User) *UserDto {
Mobile: m.Mobile,
UserStatus: m.UserStatus,
RegisterSource: m.RegisterSource,
Age: m.Age,
Sex: m.Sex,
Age: *m.Age,
Sex: uint(m.Sex),
Avatar: utils.AddOssDomain(m.Avatar),
IsMember: m.IsMember,
MemberExpireDate: m.MemberExpireDate,
+14 -14
View File
@@ -8,20 +8,20 @@ import (
// User 用户表
type User struct {
UserId int64 `gorm:"column:user_id;type:bigint(19);primary_key;comment:用户id" json:"user_id"`
UserName string `gorm:"column:user_name;type:varchar(200);comment:用户名称" json:"user_name"`
Mobile string `gorm:"column:mobile;type:varchar(20);comment:手机号;NOT NULL" json:"mobile"`
UserStatus int `gorm:"column:user_status;type:tinyint(1);default:1;comment:状态(1:正常 2:禁用)" json:"user_status"`
RegisterSource int `gorm:"column:register_source;type:tinyint(1);default:1;comment:注册来源(1app注册 2:公众号注册)" json:"register_source"`
OpenId string `gorm:"column:open_id;type:varchar(100);comment:用户微信标识" json:"open_id"`
UnionId string `gorm:"column:union_id;type:varchar(100);comment:微信开放平台标识" json:"union_id"`
Age uint `gorm:"column:age;type:int(10) unsigned;comment:年龄" json:"age"`
Sex uint `gorm:"column:sex;type:tinyint(1) unsigned;default:0;comment:性别(0:未知 1:男 2:女)" json:"sex"`
Avatar string `gorm:"column:avatar;type:varchar(255);comment:头像" json:"avatar"`
IsMember int `gorm:"column:is_member;type:tinyint(1);default:0;comment:是否会员(0:否 1:是)" json:"is_member"`
MemberExpireDate LocalTime `gorm:"column:member_expire_date;type:datetime;comment:会员到期时间(非会员时为null" json:"member_expire_date"`
LoginAt LocalTime `gorm:"column:login_at;type:datetime;comment:登陆时间" json:"login_at"`
LoginIp string `gorm:"column:login_ip;type:varchar(255);comment:登陆ip" json:"login_ip"`
UserId int64 `gorm:"column:user_id;type:bigint(19);primary_key;comment:用户id" json:"user_id"`
UserName string `gorm:"column:user_name;type:varchar(200);comment:用户名称" json:"user_name"`
Mobile string `gorm:"column:mobile;type:varchar(20);comment:手机号;NOT NULL" json:"mobile"`
UserStatus int `gorm:"column:user_status;type:tinyint(1);default:1;comment:状态(1:正常 2:禁用)" json:"user_status"`
RegisterSource int `gorm:"column:register_source;type:tinyint(1);default:1;comment:注册来源(1app注册 2:公众号注册)" json:"register_source"`
OpenId string `gorm:"column:open_id;type:varchar(100);comment:用户微信标识" json:"open_id"`
UnionId string `gorm:"column:union_id;type:varchar(100);comment:微信开放平台标识" json:"union_id"`
Age *uint `gorm:"column:age;type:int(10) unsigned;comment:年龄" json:"age"`
Sex int `gorm:"column:sex;type:tinyint(1) unsigned;default:0;comment:性别(0:未知 1:男 2:女)" json:"sex"`
Avatar string `gorm:"column:avatar;type:varchar(255);comment:头像" json:"avatar"`
IsMember int `gorm:"column:is_member;type:tinyint(1);default:0;comment:是否会员(0:否 1:是)" json:"is_member"`
MemberExpireDate *time.Time `gorm:"column:member_expire_date;type:datetime;comment:会员到期时间(非会员时为null" json:"member_expire_date"`
LoginAt LocalTime `gorm:"column:login_at;type:datetime;comment:登陆时间" json:"login_at"`
LoginIp string `gorm:"column:login_ip;type:varchar(255);comment:登陆ip" json:"login_ip"`
Model
}
+3 -1
View File
@@ -6,5 +6,7 @@ type LoginRequest struct {
// LoginWx 微信授权登录
type LoginWx struct {
Code string `json:"code" form:"code" label:"授权码"`
Code string `json:"code" form:"code" label:"授权码"`
Source int `json:"source" form:"source" label:"来源(1app 2:公众号)"`
LoginIp string `json:"login_ip" form:"login_ip" label:"登录ip"`
}
+2 -5
View File
@@ -78,11 +78,8 @@ func publicRouter(r *gin.Engine, api controller.Api) {
// 手机号登录
loginGroup.POST("/phone", api.Login.LoginPhone)
wxGroup := loginGroup.Group("/wx")
{
// 微信授权登录
wxGroup.POST("", api.Login.LoginWx)
}
// 微信授权登录
loginGroup.POST("/wx", api.Login.LoginWx)
}
// 验证码
+37
View File
@@ -1,4 +1,41 @@
package service
import (
"fmt"
"hepa-calc-api/extend/aliyun"
"hepa-calc-api/utils"
"math/rand"
"time"
)
type UserService struct {
}
// HandleUserAvatar 处理用户头像
func (r *UserService) HandleUserAvatar(wxAvatar string) (avatar string, err error) {
if wxAvatar == "" {
return "", nil
}
// 下载文件到内存
ram, err := aliyun.GetObjectToRAM(wxAvatar)
if err != nil {
return "", err
}
// 设置文件名字
now := time.Now()
dateTimeString := now.Format("20060102150405") // 当前时间字符串
rand.New(rand.NewSource(time.Now().UnixNano())) // 设置随机数
ossPath := "/test/医生账户" + dateTimeString + fmt.Sprintf("%d", rand.Intn(9000)+1000) + ".png"
// 上传oss
_, err = aliyun.PutObjectByte(ossPath, []byte(ram))
if err != nil {
return "", err
}
ossPath = utils.AddOssDomain("/" + ossPath)
return ossPath, nil
}