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 | |||
|  | } |