201 lines
6.5 KiB
Go
201 lines
6.5 KiB
Go
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
|
||
}
|