kobe6258 8 сар өмнө
parent
commit
4804443783

+ 9 - 4
common/component/cache/redis.go

@@ -70,11 +70,16 @@ func (r *RedisCache) GetHSetWithContext(ctx context.Context, key string) map[str
 	value, _ := r.redisTemplate.HGetAll(ctx, key).Result()
 	return value
 }
-func (r *RedisCache) SetHSet(key string, val string, timeout time.Duration) error {
-	return r.SetHSetWithContext(context.Background(), key, val, timeout)
+
+func (r *RedisCache) SetHSet(key string, timeout time.Duration, val ...interface{}) error {
+	return r.SetHSetWithContext(context.Background(), key, timeout, val...)
 }
-func (r *RedisCache) SetHSetWithContext(ctx context.Context, key string, val string, timeout time.Duration) error {
-	return r.redisTemplate.HSet(ctx, key, val).Err()
+func (r *RedisCache) SetHSetWithContext(ctx context.Context, key string, timeout time.Duration, val ...interface{}) error {
+	err := r.redisTemplate.HSet(ctx, key, val...).Err()
+	if err != nil {
+		return err
+	}
+	return r.redisTemplate.Expire(ctx, key, timeout).Err()
 }
 
 // GetString  获取一个值

+ 4 - 0
common/exception/exc_enums.go

@@ -29,7 +29,9 @@ const (
 	SMSCodeAlreadySent
 	SMSCodeExpired
 	SMSCodeError
+	GetAreaCodesFailed
 	AnalystNotFound
+	IllegalAreaCode
 )
 
 // UserErrCode 用户
@@ -82,6 +84,8 @@ var ErrorMap = map[int]string{
 	SMSCodeExpired:        "验证码已过期",
 	SMSCodeError:          "验证码错误",
 	AnalystNotFound:       "研究员不存在",
+	GetAreaCodesFailed:    "获取手机区号失败",
+	IllegalAreaCode:       "无效的区号",
 	//用户
 	TemplateUserNotFound:     "临时用户记录不存在",
 	TemplateUserCreateFailed: "创建临时用户失败",

+ 4 - 0
common/utils/redis/key_generator.go

@@ -7,6 +7,10 @@ const (
 	LoginTokenPrefix = "login:token:"
 )
 
+const (
+	ValidAreaCode = "areaCode:valid:list"
+)
+
 func GenerateSmsKey(mobile string) string {
 	return fmt.Sprint(SmsKeyPrefix, mobile)
 }

+ 111 - 4
controllers/user/auth_controller.go

@@ -1,7 +1,9 @@
 package user
 
 import (
+	"eta_mini_ht_api/common/component/config"
 	logger "eta_mini_ht_api/common/component/log"
+	"eta_mini_ht_api/common/contants"
 	"eta_mini_ht_api/common/exception"
 	authUtils "eta_mini_ht_api/common/utils/auth"
 	"eta_mini_ht_api/controllers"
@@ -12,11 +14,14 @@ type AuthController struct {
 	controllers.BaseController
 }
 
+const ChinaAreaCode = "86"
+
 // LoginReq  获取验证码请求
 type LoginReq struct {
 	Code       string `json:"code"`
 	VerifyCode string `json:"verify_code"`
 	Mobile     string `json:"mobile"`
+	AreaCode   string `json:"area_code"`
 }
 
 // Login 小程序登录接口
@@ -30,7 +35,12 @@ func (a *AuthController) Login() {
 		result = a.InitWrapData("登录失败")
 		loginReq := new(LoginReq)
 		a.GetPostParams(loginReq)
-		if !authUtils.IsValidMobile(loginReq.Mobile) {
+		if loginReq.AreaCode == "" || !checkValidAreaCode(loginReq.AreaCode) {
+			a.FailedResult("登录失败", result)
+			err = exception.New(exception.IllegalAreaCode)
+			return
+		}
+		if loginReq.AreaCode == ChinaAreaCode && !authUtils.IsValidMobile(loginReq.Mobile) {
 			a.FailedResult("登录失败", result)
 			err = exception.New(exception.IllegalPhoneNumber)
 			return
@@ -65,7 +75,8 @@ type LoginResp struct {
 
 // SmsCodeReq 获取验证码请求
 type SmsCodeReq struct {
-	Mobile string `json:"mobile"`
+	Mobile   string `json:"mobile"`
+	AreaCode string `json:"area_code"`
 }
 
 // SMSCode 小程序手机验证码接口
@@ -79,11 +90,15 @@ func (a *AuthController) SMSCode() {
 		result = a.InitWrapData("发送短信失败")
 		mobile := new(SmsCodeReq)
 		a.GetPostParams(mobile)
+		if mobile.AreaCode == "" || !checkValidAreaCode(mobile.AreaCode) {
+			a.FailedResult("登录失败", result)
+			err = exception.New(exception.IllegalAreaCode)
+			return
+		}
 		phoneNum := mobile.Mobile
-		if !authUtils.IsValidMobile(phoneNum) {
+		if mobile.AreaCode == ChinaAreaCode && !authUtils.IsValidMobile(phoneNum) {
 			return result, exception.New(exception.IllegalPhoneNumber)
 		}
-		//
 		//发送短息
 		err = auth.SendSMSCode(phoneNum)
 		if err != nil {
@@ -97,3 +112,95 @@ func (a *AuthController) SMSCode() {
 		return result, nil
 	})
 }
+
+type RefreshTokenRes struct {
+	Token string `json:"token"`
+}
+
+// RefreshToken 更新token
+// @Summary 更新token
+// @Success 200 {object} controllers.BaseResponse
+// @Description 更新token
+// @router /refreshToken [get]
+func (a *AuthController) RefreshToken(code string) {
+	controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
+		result = a.InitWrapData("刷新token失败")
+		if code == "" {
+			logger.Error("code不能为空")
+			return result, exception.New(exception.WeChatCodeEmpty)
+		}
+		//刷新token
+		token, err := auth.RefreshToken(code)
+		if err != nil {
+			logger.Error("刷新token失败:%v", err)
+			a.FailedResult("刷新token失败", result)
+			return
+		}
+		a.SuccessResult("刷新token成功", RefreshTokenRes{
+			Token: token,
+		}, result)
+		return
+	})
+}
+
+// AreaCodes 小程序手机验证码接口
+// @Summary 获取手机验证码
+// @Param   mobile   body    SmsCodeReq  true        "小程序手机验证码接口"
+// @Success 200 {object} controllers.BaseResponse
+// @Description 用户发送手机验证码
+// @router /areaCodes [get]
+func (a *AuthController) AreaCodes() {
+	controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
+		result = a.InitWrapData("获取区号失败")
+		list, err := auth.GetAreaCodes()
+		if err != nil {
+			a.FailedResult("获取区号失败", result)
+		}
+		a.SuccessResult("获取区号成功", list, result)
+		return
+	})
+}
+
+type WXAppidResp struct {
+	AppId string
+}
+
+// WXAppid 获取APPID
+// @Summary 获取APPID
+// @Success 200 {object} controllers.BaseResponse
+// @Description 获取APPID
+// @router /wxAppid [get]
+func (a *AuthController) WXAppid() {
+	controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
+		result = a.InitWrapData("获取AppId失败")
+		appid := config.GetConfig(contants.WECHAT).(*config.WechatConfig).GetAppid()
+		if err != nil {
+			a.FailedResult("获取AppId失败", result)
+		}
+		a.SuccessResult("获取AppId成功", WXAppidResp{
+			AppId: appid,
+		}, result)
+		return
+	})
+}
+
+// Test 获取APPID
+// @Success 200 {object} controllers.BaseResponse
+// @Description 获取APPID
+// @router /test [get]
+func (a *AuthController) Test() {
+	auth.GetValidAreaCodes()
+}
+
+func checkValidAreaCode(areaCode string) bool {
+	list := auth.GetValidAreaCodes()
+	if areaCode == "" || len(list) == 0 {
+		return false
+	}
+	for _, code := range list {
+		if areaCode == code {
+			return true
+		}
+	}
+	return false
+}

+ 26 - 0
controllers/user/user_controller.go

@@ -180,3 +180,29 @@ func (u *UserController) FollowingAnalysts(analystId int) {
 		return
 	})
 }
+
+type UserProfileReq struct {
+	UserName string `json:"userName"`
+	Mobile   string `json:"mobile"`
+}
+
+// Profile  获取用户信息
+// @Summary 获取用户信息
+// @Description 获取用户信息
+// @Success 200 {object} controllers.BaseResponse
+// @router /profile [get]
+func (u *UserController) Profile() {
+	controllers.Wrap(&u.BaseController, func() (result *controllers.WrapData, err error) {
+		result = u.InitWrapData("获取用户信息详情失败")
+		userInfo := u.Data["user"].(user.User)
+		u.SuccessResult("获取研究员详情成功", covertToUserProfile(userInfo), result)
+		return
+	})
+}
+
+func covertToUserProfile(user user.User) UserProfileReq {
+	return UserProfileReq{
+		UserName: user.Username,
+		Mobile:   user.Mobile,
+	}
+}

+ 42 - 0
domian/user/area_code_service.go

@@ -0,0 +1,42 @@
+package user
+
+import (
+	logger "eta_mini_ht_api/common/component/log"
+	"eta_mini_ht_api/models/user"
+)
+
+type AreaCodeDTO struct {
+	CodeName  string `json:"code_name"`
+	CodeValue string `json:"code_value"`
+}
+
+func GetAreaCodes() (areaCodes []AreaCodeDTO, err error) {
+	list, err := user.GetAreaCodes()
+	if err != nil {
+		logger.Error("获取手机区号失败:%v", err)
+		return
+	}
+	for _, areaCode := range list {
+		areaCodes = append(areaCodes, convertToAreaCodeDTO(areaCode))
+	}
+	return
+}
+
+func GetValidAreaCodes() (areaCodes []AreaCodeDTO, err error) {
+	list, err := user.GetValidAreaCodes()
+	if err != nil {
+		logger.Error("获取手机区号失败:%v", err)
+		return
+	}
+	for _, areaCode := range list {
+		areaCodes = append(areaCodes, convertToAreaCodeDTO(areaCode))
+	}
+	return
+}
+
+func convertToAreaCodeDTO(areaCode user.AreaCode) AreaCodeDTO {
+	return AreaCodeDTO{
+		CodeName:  areaCode.CodeName,
+		CodeValue: areaCode.CodeValue,
+	}
+}

+ 10 - 0
domian/user/user_serivce.go

@@ -33,6 +33,7 @@ func convertUserDTO(user userDao.TemplateUser) UserDTO {
 		Id:       user.Id,
 		Username: user.Username,
 		Mobile:   user.Mobile,
+		OpenId:   user.OpenId,
 	}
 }
 func GetUserByMobile(mobile string) (UserDTO, error) {
@@ -59,6 +60,15 @@ func RegisterTemplateUser(dto *UserDTO) (err error) {
 	return
 }
 
+func GetTemplateUserByOpenId(openId string) (user UserDTO, err error) {
+	templateUser, err := userDao.GetUserByOpenId(openId)
+	if err != nil {
+		logger.Error("获取用户信息失败:%v", err)
+		return
+	}
+	user = convertUserDTO(templateUser)
+	return
+}
 func FeedBack(dto FeedbackDTO) (err error) {
 	feedBackEntity := userDao.FeedBack{
 		Message: dto.Message,

+ 1 - 0
main.go

@@ -31,6 +31,7 @@ func main() {
 	go func() {
 		//内存数据预热预加载
 		logger.Info("开始预加载数据")
+		
 	}()
 	logger.Info("初始化成功")
 	web.Run()

+ 9 - 1
middleware/auth_middleware.go

@@ -21,6 +21,7 @@ var (
 const (
 	ILLEGALUSER   = "用户信息异常"
 	UNAUTHORIZED  = "请重新登录"
+	TOKENEXPIRED  = "token过期"
 	FORBIDDEN     = "禁止访问"
 	NOTFOUND      = "未找到"
 	authorization = "Authorization"
@@ -67,7 +68,7 @@ func AuthMiddleware() web.FilterFunc {
 			redisToken := rd().GetString(redis.GenerateTokenKey(info.Mobile))
 			if redisToken != parts[1] {
 				logger.Error("token无效:用户token已刷新")
-				_ = ctx.JSONResp(unAuthorized())
+				_ = ctx.JSONResp(tokenExpired())
 				return
 			}
 			//组装用户信息
@@ -92,6 +93,13 @@ func unAuthorized() controllers.BaseResponse {
 		ErrMsg: exception.GetMsg(exception.Unauthorized),
 	}
 }
+func tokenExpired() controllers.BaseResponse {
+	return controllers.BaseResponse{
+		Ret:    408,
+		Msg:    TOKENEXPIRED,
+		ErrMsg: exception.GetMsg(exception.Unauthorized),
+	}
+}
 func illegalUser() controllers.BaseResponse {
 	return controllers.BaseResponse{
 		Ret:    401,

+ 23 - 0
models/user/area_code.go

@@ -0,0 +1,23 @@
+package user
+
+import (
+	"eta_mini_ht_api/models"
+)
+
+type AreaCode struct {
+	CodeName  string `gorm:"type:varchar(10);default:null"`
+	CodeValue string `gorm:"type:varchar(10);default:null"`
+	Enable    bool   `gorm:"type:tinyint(1);default:1"`
+}
+
+func GetAreaCodes() (list []AreaCode, err error) {
+	db := models.Main()
+	err = db.Model(&AreaCode{}).Find(&list).Error
+	return
+}
+
+func GetValidAreaCodes() (list []AreaCode, err error) {
+	db := models.Main()
+	err = db.Model(&AreaCode{}).Where("enable = ?", true).Find(&list).Error
+	return
+}

+ 3 - 0
models/user/template_user.go

@@ -30,6 +30,9 @@ func (t *TemplateUser) BeforeCreate(tx *gorm.DB) (err error) {
 func GetUserByMobile(mobile string) (user TemplateUser, err error) {
 	return queryByColumn("mobile", mobile)
 }
+func GetUserByOpenId(openId string) (user TemplateUser, err error) {
+	return queryByColumn("open_id", openId)
+}
 
 func queryByColumn(column string, value string) (user TemplateUser, err error) {
 	err = models.Main().Unscoped().Where(column, value).First(&user).Error

+ 58 - 0
routers/commentsRouter.go

@@ -85,6 +85,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"],
+        beego.ControllerComments{
+            Method: "AreaCodes",
+            Router: `/areaCodes`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"],
         beego.ControllerComments{
             Method: "Login",
@@ -94,6 +103,17 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"],
+        beego.ControllerComments{
+            Method: "RefreshToken",
+            Router: `/refreshToken`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(
+				param.New("code"),
+			),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"],
         beego.ControllerComments{
             Method: "SMSCode",
@@ -103,6 +123,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"],
+        beego.ControllerComments{
+            Method: "Test",
+            Router: `/test`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:AuthController"],
+        beego.ControllerComments{
+            Method: "WXAppid",
+            Router: `/wxAppid`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:UserController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:UserController"],
         beego.ControllerComments{
             Method: "Get",
@@ -141,4 +179,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:UserController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:UserController"],
+        beego.ControllerComments{
+            Method: "FollowingAnalysts",
+            Router: `/followingAnalysts`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(
+				param.New("analystId"),
+			),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:UserController"] = append(beego.GlobalControllerRouter["eta_mini_ht_api/controllers/user:UserController"],
+        beego.ControllerComments{
+            Method: "Profile",
+            Router: `/profile`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
 }

+ 56 - 0
service/auth/auth_service.go

@@ -145,6 +145,62 @@ func Login(login LoginDTO) (token string, err error) {
 	return
 }
 
+func RefreshToken(code string) (token string, err error) {
+	//注册用户
+	var wechatInfo wechat.WxUser
+	//微信请求异常
+	wechatInfo, err = wx().Login(code)
+	//微信客户端的异常不做处理,已经是EtaError
+	if err != nil {
+		return
+	}
+	user, err := userService.GetTemplateUserByOpenId(wechatInfo.OpenId)
+	if err != nil {
+		err = exception.New(exception.TemplateUserNotFound)
+		return
+	}
+	token, err = jwt.CreateToken(user.OpenId, user.Mobile)
+	if err != nil {
+		err = exception.New(exception.GenerateTokenFailed)
+		return
+	}
+	err = rd().SetString(redis.GenerateTokenKey(user.Mobile), token, 90*24*60*60)
+	if err != nil {
+		err = exception.New(exception.GenerateTokenFailed)
+		return
+	}
+	return
+}
+func GetAreaCodes() (list []userService.AreaCodeDTO, err error) {
+	list, err = userService.GetAreaCodes()
+	if err != nil {
+		err = exception.New(exception.GetAreaCodesFailed)
+	}
+	return
+}
+
+func GetValidAreaCodes() (list []string) {
+	str := rd().GetString(redis.ValidAreaCode)
+	if str == "" {
+		codes, err := userService.GetValidAreaCodes()
+		if err != nil {
+			return []string{}
+		}
+		var validCodes []string
+		for _, code := range codes {
+			validCodes = append(validCodes, code.CodeValue)
+		}
+		err = rd().SetString(redis.ValidAreaCode, strings.Join(validCodes, ","), 60*60)
+		if err != nil {
+			logger.Error("设置Redis区号失败:%v", err)
+			list = validCodes
+		}
+		list = strings.Split(rd().GetString(redis.ValidAreaCode), ",")
+	} else {
+		list = strings.Split(str, ",")
+	}
+	return
+}
 func initUser(user wechat.WxUser, dto LoginDTO) userService.UserDTO {
 	username := generateRandomUsername(user.OpenId)
 	if stringUtils.IsBlank(username) {

+ 4 - 5
service/user/user_service.go

@@ -8,10 +8,10 @@ import (
 )
 
 type User struct {
-	Id       int
-	Username string
-	Mobile   string
-	OpenId   string
+	Id       int    `json:"id"`
+	Username string `json:"username"`
+	Mobile   string `json:"mobile"`
+	OpenId   string `json:"openId,omitempty"`
 }
 
 type AnalystDetail struct {
@@ -83,6 +83,5 @@ func convertToUser(userDTO userService.UserDTO) User {
 		Id:       userDTO.Id,
 		Username: userDTO.Username,
 		Mobile:   userDTO.Mobile,
-		OpenId:   userDTO.OpenId,
 	}
 }