Files
zmkgC/internal/app/wxApplet/controller/wx_login.go
2025-07-07 20:11:59 +08:00

201 lines
6.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package controller
import (
"context"
"fmt"
"os"
"path/filepath"
"strings"
"github.com/gogf/gf/v2/crypto/gmd5"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/util/grand"
"github.com/medivhzhan/weapp/v3"
"github.com/medivhzhan/weapp/v3/auth"
"github.com/tiger1103/gfast/v3/api/v1/common/coryCommon"
"github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet"
systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller"
"github.com/tiger1103/gfast/v3/internal/app/system/dao"
"github.com/tiger1103/gfast/v3/internal/app/system/model/do"
"github.com/tiger1103/gfast/v3/internal/app/system/model/entity"
se "github.com/tiger1103/gfast/v3/internal/app/system/service"
wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao"
wxModel "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do"
"github.com/tiger1103/gfast/v3/internal/app/wxApplet/service"
"github.com/tiger1103/gfast/v3/library/libUtils"
"github.com/tiger1103/gfast/v3/library/liberr"
)
type WXLoginController struct {
systemController.BaseController
}
var WXLogin = new(WXLoginController)
func (e *WXLoginController) BusLogin(ctx context.Context, req *wxApplet.LoginReq) (res *wxApplet.LoginRes, err error) {
res = &wxApplet.LoginRes{}
err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
err = g.Try(ctx, func(ctx context.Context) {
appId, err := g.Cfg().Get(gctx.New(), "wx.appId")
if err != nil {
return
}
appSecret, err := g.Cfg().Get(gctx.New(), "wx.appSecret")
if err != nil {
return
}
sdk := weapp.NewClient(appId.String(), appSecret.String())
cli := sdk.NewAuth()
//// 登录凭证校验
rsp, err := cli.Code2Session(&auth.Code2SessionRequest{
Appid: appId.String(),
Secret: appSecret.String(),
JsCode: req.Code,
GrantType: "authorization_code",
})
if err != nil {
return
}
if rsp.ErrCode != 0 {
err = rsp.GetResponseError()
return
}
user := wxApplet.BusConstructionUserAddReq{}
user.Openid = rsp.Openid
res.Openid = user.Openid
value, err := dao.BusConstructionUser.Ctx(ctx).Where("openid=?", user.Openid).Fields("head_icon").Value()
if err != nil {
return
}
result := 0
if value != nil {
result = 1
}
// 上传微信头像
str, err := coryCommon.UploadFileTwo(ctx, req.HeadIcon, coryCommon.Helmet)
if err != nil {
liberr.ErrIsNil(ctx, err)
return
}
replace := strings.Replace(str, "resource/public", "/wxfile", 1)
// 删除以前的头像
if strings.Contains(value.String(), "/wxfile/") {
s := strings.Replace(value.String(), "/wxfile/", coryCommon.GetCWD()+"/resource/public/", 1)
os.Remove(filepath.ToSlash(s))
}
if result == 0 {
// user.HeadIcon = req.HeadIcon
//user.NickName = req.NickName
//user.HeadIcon = replace
_, err := service.BusConstructionUser().Add(ctx, &user)
if err != nil {
return
}
} else {
_, err = dao.BusConstructionUser.Ctx(ctx).Data(g.Map{
//"head_icon": req.HeadIcon,
"nick_name": req.NickName,
"head_icon": replace,
}).Where("openid=?", user.Openid).Update()
if err != nil {
return
}
}
res.Token = gettoken(ctx, user.Openid, user)
return
})
return err
})
return
}
//func gettoken(ctx context.Context, openid string, user wxApplet.BusConstructionUserAddReq) string {
// key := gmd5.MustEncryptString(openid)
// token, err := se.GfToken().GenerateToken(ctx, key+key, user)
// fmt.Println("创建的token", token)
// fmt.Println(err)
// token = "Bearer " + token
// fmt.Println("更改的-----", token)
// return token
//}
func gettoken(ctx context.Context, openid string, user wxApplet.BusConstructionUserAddReq) string {
encryptedKey := gmd5.MustEncryptString(openid)
key := openid + "-" + encryptedKey
authToken, _ := se.GfToken().GenerateToken(ctx, key, user)
return "Bearer " + authToken
}
// IsBindApp 是否绑定 App
func (e *WXLoginController) IsBindApp(ctx context.Context, req *wxApplet.IsBindAppReq) (*wxApplet.IsBindAppRes, error) {
exist, err := dao.BusConstructionUser.Ctx(ctx).As("bcu").
InnerJoin("sys_user AS su", `bcu.user_name COLLATE utf8mb4_general_ci = su.user_name COLLATE utf8mb4_general_ci
AND bcu.phone COLLATE utf8mb4_general_ci = su.mobile COLLATE utf8mb4_general_ci`).
Where("bcu.openid", req.Openid).
Count()
if err != nil {
return nil, err
}
// 如果已绑定 App 则返回 1否则返回 0
if exist > 0 {
return &wxApplet.IsBindAppRes{IsBind: 1}, nil
}
return &wxApplet.IsBindAppRes{IsBind: 0}, nil
}
// AppletBindApp 小程序绑定 App
func (e *WXLoginController) AppletBindApp(ctx context.Context, req *wxApplet.AppletBindAppReq) (*wxApplet.AppletBindAppRes, error) {
// 获取小程序用户信息
busConstructUser := entity.BusConstructionUser{}
if err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Openid, req.Openid).Scan(&busConstructUser); err != nil {
return nil, err
}
// 判断当前用户的手机号和用户名是否为空
if busConstructUser.Phone == "" || busConstructUser.UserName == "" {
return nil, fmt.Errorf("当前用户的手机号和用户名为空")
}
exist, err := dao.SysUser.Ctx(ctx).Where(dao.SysUser.Columns().UserNickname, busConstructUser.UserName).
Where(dao.SysUser.Columns().Mobile, busConstructUser.Phone).Count()
if err != nil {
return nil, err
}
// 判断是否已绑定 App
if exist > 0 {
return nil, fmt.Errorf("当前用户已经绑定了 App")
}
passwordSalt := grand.S(10) // 密码盐值
encryptedPassword := libUtils.EncryptPassword(req.Password, passwordSalt) // 加密密码
err = g.Try(ctx, func(ctx context.Context) {
// 创建用户
userId, err := dao.SysUser.Ctx(ctx).InsertAndGetId(do.SysUser{
UserName: busConstructUser.UserName, // 用户名
UserNickname: busConstructUser.NickName, // 用户昵称
Mobile: busConstructUser.Phone, // 手机号
UserPassword: encryptedPassword, // 密码
UserSalt: passwordSalt, // 密码盐
Sex: busConstructUser.Sex, // 性别
})
liberr.ErrIsNil(ctx, err, "创建用户失败")
// 关联后台项目
_, err = wxDao.SysUserProjectRelevancy.Ctx(ctx).Insert(wxModel.SysUserProjectRelevancy{
UserId: userId, // 用户 ID
ProjectId: busConstructUser.ProjectId, // 项目 ID
})
liberr.ErrIsNil(ctx, err, "关联后台管理项目失败")
})
return nil, nil
}