package app_server import ( "encoding/json" "errors" "fmt" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-print/dao" "git.rosy.net.cn/jx-print/globals" "git.rosy.net.cn/jx-print/model" wxLogin "git.rosy.net.cn/jx-print/model/app_model" "git.rosy.net.cn/jx-print/services/api" "github.com/gin-gonic/gin" "io/ioutil" "net/http" "net/url" "strconv" "strings" "time" ) type UserLogin struct { } // WxLogin 授权登录 func (u *UserLogin) WxLogin(ctx *gin.Context, param *wxLogin.WxLoginReq) (*model.User, error) { openObj, err := api.WeixinMiniAPI.SNSCode2Session(param.Code) if err != nil { return nil, err } // 检查用户是否存在 users, err := dao.GetUsers(globals.GetDB(), "", "", param.Phone, openObj.OpenID) if err != nil { return nil, err } if len(users) > 1 { return nil, errors.New("数据异常,用户电话不唯一,联系管理员") } var userObj *model.User timeNow := time.Now() switch len(users) { case 0: // 用户不存在,创建并返回用户 userBase := &model.User{ CreatedAt: &timeNow, UpdatedAt: &timeNow, LastOperator: "系统新增", DeletedAt: &utils.DefaultTimeValue, UserID: utils.GetUUID(), Password: "", Name: param.NickName, Mobile: param.Phone, Email: "", Avatar: param.HeadUrl, Status: 1, Type: 1, Company: "", CityCode: 0, DistrictCode: 0, Address: "", IDCardNo: "", Remark: "", LastLoginAt: &timeNow, LastLoginIP: ctx.ClientIP(), LastLoginType: model.OrderOriginWxMini, OpenId: openObj.OpenID, UnionId: openObj.UnionID, } if err := dao.CreateUserWx(userBase); err != nil { return nil, err } userObj = userBase case 1: // 用户使用电话号码登录,未使用微信登录 if users[0].OpenId == "" { users[0].Name = param.NickName users[0].Avatar = param.HeadUrl users[0].OpenId = openObj.OpenID users[0].UnionId = openObj.UnionID // 用户存在,判断用户 users[0].UpdatedAt = &timeNow users[0].LastOperator = users[0].Name users[0].LastLoginIP = ctx.ClientIP() if err := dao.UpdateUserWx(users[0], []string{"updated_at", "last_operator", "last_login_ip", "name", "avatar", "open_id", "union_id"}); err != nil { return nil, err } } else { // 用户存在,判断用户 users[0].UpdatedAt = &timeNow users[0].LastOperator = users[0].Name users[0].LastLoginIP = ctx.ClientIP() if err := dao.UpdateUserWx(users[0], []string{"updated_at", "last_operator", "last_login_ip"}); err != nil { return nil, err } } userObj = users[0] } return userObj, err } // MobileLogin 短信验证登录 func (u *UserLogin) MobileLogin(ctx *gin.Context, param *wxLogin.MobileLogin) (*model.User, error) { // 校验用户信息 isHave, err := SendVerifyCodeServer.VerifySecret(param.Phone, param.BizId, param.Code) if err != nil { return nil, err } if !isHave { return nil, errors.New("验证码错误") } // 检查用户是否存在 users, err := dao.GetUsers(globals.GetDB(), "", "", param.Phone, "") if err != nil { return nil, err } var userObj *model.User timeNow := time.Now() switch len(users) { case 1: // 用户存在 userObj = users[0] case 0: // 用户不存在 // 用户不存在,创建并返回用户 userBase := &model.User{ CreatedAt: &timeNow, UpdatedAt: &timeNow, LastOperator: "系统新增", DeletedAt: &utils.DefaultTimeValue, UserID: utils.GetUUID(), Password: "", Name: "手机用户_" + param.Phone, Mobile: param.Phone, Email: "", Avatar: "", Status: 1, Type: 1, Company: "", CityCode: 0, DistrictCode: 0, Address: "", IDCardNo: "", Remark: "", LastLoginAt: &timeNow, LastLoginIP: ctx.ClientIP(), LastLoginType: model.OrderOriginMobile, OpenId: "", UnionId: "", } if err := dao.CreateUserWx(userBase); err != nil { return nil, err } userObj = userBase } return userObj, nil } // GetUserPhoneNum 解密用户手机号 func (u *UserLogin) GetUserPhoneNum(param *wxLogin.WeChatPhoneNumberParam) (string, bool, error) { phone, err := api.WeixinMiniAPI.SNSGetUserPhone(param.Code) if err != nil { return "", false, err } // 检查用户是否存在 users, err := dao.GetUsers(globals.GetDB(), "", "", phone, "") if err != nil { return "", false, err } if len(users) != 1 { return phone, false, nil } isRegion := false if users[0].OpenId != "" { isRegion = true } return phone, isRegion, nil } // Jxc4UserToken 全局变量,缓存菜市管理系统token var Jxc4UserToken = map[string]string{"token": "", "expirationTime": ""} // GetJxc4Token 获取京西菜市token func (u *UserLogin) GetJxc4Token() (string, error) { if Jxc4UserToken["token"] != "" && Jxc4UserToken["expirationTime"] != "" { timeBegin, _ := strconv.ParseInt(Jxc4UserToken["expirationTime"], 10, 64) timeNow := time.Now().Unix() if timeBegin-timeNow > 0 { // 没过期 return Jxc4UserToken["token"], nil } } //TODO 参数为登录菜市管理系统的管理员用户账号:目前账号为 15141938808 密码111111 params := map[string]interface{}{"authType": "localpass", "authIDType": "mobile", "authID": "15141938808", "authSecret": "96e79218965eb72c92a549dd5a330112"} retVal := make(url.Values) for k, v := range params { retVal.Set(k, fmt.Sprint(v)) } strings.NewReader(utils.Map2URLValues(params).Encode()) resp, err := http.Post("https://www.jxc4.com/v2/auth2/Login", "application/x-www-form-urlencoded", strings.NewReader(retVal.Encode())) if err != nil { return "", err } defer resp.Body.Close() bodyResp, err := ioutil.ReadAll(resp.Body) if err != nil { return "", err } jxc4User := &model.AutoGenerated{} if err := json.Unmarshal(bodyResp, jxc4User); err != nil { return "", err } Jxc4UserToken["token"] = jxc4User.Data.Token Jxc4UserToken["expirationTime"] = strconv.FormatInt(time.Now().Unix(), 64) return jxc4User.Data.Token, nil }