diff --git a/internal/api/v1/cpuser_req.go b/internal/api/v1/cpuser_req.go index 36db9c5..26ad214 100644 --- a/internal/api/v1/cpuser_req.go +++ b/internal/api/v1/cpuser_req.go @@ -42,3 +42,25 @@ type CpUserUpdatePasswordReq struct { Id int64 `json:"id"` NewPassword string `json:"newPassword"` } + +type CpUserAuthorizeDeviceReq struct { + g.Meta `path:"/user/authorizeDevice" method:"post" tags:"CpUser" summary:"授权设备"` + Id int64 `json:"id"` +} + +type CpUserAuthorizeSuccessReq struct { + g.Meta `path:"/user/authorizeSuccess" method:"post" tags:"CpUser" summary:"授权成功" auth:"false"` + DataKey string `json:"dataKey"` + Data string `json:"data"` +} + +type CpUserAuthorizeConfirmReq struct { + g.Meta `path:"/user/authorizeConfirm" method:"post" tags:"CpUser" summary:"授权确认"` + Id int64 `json:"id"` + DataKey string `json:"dataKey"` +} + +type CpUserAuthorizeRandomReq struct { + g.Meta `path:"/user/authorizeRandom" method:"post" tags:"CpUser" summary:"随机设备码"` + Id int64 `json:"id"` +} diff --git a/internal/controller/cpdaily/cpuser_ctrlV1.go b/internal/controller/cpdaily/cpuser_ctrlV1.go index b1ab317..fa55bd8 100644 --- a/internal/controller/cpdaily/cpuser_ctrlV1.go +++ b/internal/controller/cpdaily/cpuser_ctrlV1.go @@ -43,3 +43,21 @@ func (c CpUserCtrlV1) SchoolList(ctx context.Context, req *v1.CpSchoolListReq) ( defer utils.Pass(&err) return service.Global.CpUser.SchoolList(ctx, req), nil } +func (c CpUserCtrlV1) AuthorizeDevice(ctx context.Context, req *v1.CpUserAuthorizeDeviceReq) (res *utils.Response[any], err error) { + defer utils.Pass(&err) + return service.Global.CpUser.AuthorizeDevice(ctx, req), nil +} + +func (c CpUserCtrlV1) AuthorizeDeviceSuccess(ctx context.Context, req *v1.CpUserAuthorizeSuccessReq) (res *utils.Response[any], err error) { + defer utils.Pass(&err) + return service.Global.CpUser.AuthorizeDeviceSuccess(ctx, req), nil +} +func (c CpUserCtrlV1) AuthorizeConfirm(ctx context.Context, req *v1.CpUserAuthorizeConfirmReq) (res *utils.Response[any], err error) { + defer utils.Pass(&err) + return service.Global.CpUser.AuthorizeConfirm(ctx, req), nil +} + +func (c CpUserCtrlV1) AuthorizeRandom(ctx context.Context, req *v1.CpUserAuthorizeRandomReq) (res *utils.Response[any], err error) { + defer utils.Pass(&err) + return service.Global.CpUser.AuthorizeRandom(ctx, req), nil +} diff --git a/internal/controller/cpdaily/i_cpuser_ctrl.go b/internal/controller/cpdaily/i_cpuser_ctrl.go index 91ea9cd..19cfb64 100644 --- a/internal/controller/cpdaily/i_cpuser_ctrl.go +++ b/internal/controller/cpdaily/i_cpuser_ctrl.go @@ -19,6 +19,10 @@ type ICpUserCtrlV1 interface { Delete(ctx context.Context, req *v1.CpUserDeleteReq) (*utils.Response[any], error) // 修改密码 UpdatePassword(ctx context.Context, req *v1.CpUserUpdatePasswordReq) (*utils.Response[any], error) - // todo 授权设备 - //AuthorizeDevice(ctx context.Context, req *v1.CpUserAuthorizeDeviceReq) (*utils.Response[any], error) + // 授权设备 + AuthorizeDevice(ctx context.Context, req *v1.CpUserAuthorizeDeviceReq) (*utils.Response[any], error) + // 验证授权是否成功 + AuthorizeConfirm(ctx context.Context, req *v1.CpUserAuthorizeConfirmReq) (*utils.Response[any], error) + // 随机授权 + AuthorizeRandom(ctx context.Context, req *v1.CpUserAuthorizeRandomReq) (res *utils.Response[any], err error) } diff --git a/internal/cst/redis.go b/internal/cst/redis.go index 3f4a1b2..5b3b610 100644 --- a/internal/cst/redis.go +++ b/internal/cst/redis.go @@ -1,13 +1,15 @@ package cst const ( - RedisUserInfo = "userinfo:" - RedisVerifyCode = "verifycode:" - RedisCpUserLogin = "cpuserlogin:" + RedisUserInfo = "userinfo:" + RedisVerifyCode = "verifycode:" + RedisCpUserLogin = "cpuserlogin:" + RedisCpUserAuthorize = "cpuser:authorize:" ) var ( - RedisUserInfoExpire = int64(86400) - RedisVerifyCodeExpire = int64(86400) - RedisCpUserLoginExpire = int64(180) + RedisUserInfoExpire = int64(86400) + RedisVerifyCodeExpire = int64(86400) + RedisCpUserLoginExpire = int64(180) + RedisCpUserAuthorizeExpire = int64(1800) ) diff --git a/internal/framework/schedule/scanner.go b/internal/framework/schedule/scanner.go index 0a08dc0..34a8b91 100644 --- a/internal/framework/schedule/scanner.go +++ b/internal/framework/schedule/scanner.go @@ -163,7 +163,9 @@ func (ts *TaskScanner) scanCpdailyTask() { } }) - g.Log().Warningf(ts.ctx, "以下任务ID已过期,重置了下次执行时间: %v", strings.Join(expiredIDs, ", ")) + if len(expiredIDs) > 0 { + g.Log().Warningf(ts.ctx, "以下任务ID已过期,重置了下次执行时间: %v", strings.Join(expiredIDs, ", ")) + } for _, task := range expiredTasks { nextExecuteAt := utils.GetCpdailyNextExecuteTime(task) diff --git a/internal/middleware/auth_handler.go b/internal/middleware/auth_handler.go index 5e8fcea..014158c 100644 --- a/internal/middleware/auth_handler.go +++ b/internal/middleware/auth_handler.go @@ -18,6 +18,16 @@ import ( ) func AuthHandler(r *ghttp.Request) { + handler := r.GetServeHandler() + if !utils.IsController(handler) { + r.Middleware.Next() + return + } + authTag := handler.GetMetaTag("auth") + if authTag == "false" { + r.Middleware.Next() + return + } token := r.Request.Header.Get(cst.AuthorizationKey) if token == "" || !strings.HasPrefix(token, "Bearer ") { r.Response.ClearBuffer() diff --git a/internal/middleware/permission_handler.go b/internal/middleware/permission_handler.go index 5579da5..ec453e0 100644 --- a/internal/middleware/permission_handler.go +++ b/internal/middleware/permission_handler.go @@ -1,9 +1,10 @@ package middleware import ( - "github.com/gogf/gf/v2/net/ghttp" "likedream-goframe/internal/cst" "likedream-goframe/internal/utils" + + "github.com/gogf/gf/v2/net/ghttp" ) func PermissionHandler(r *ghttp.Request) { @@ -17,6 +18,11 @@ func PermissionHandler(r *ghttp.Request) { r.Middleware.Next() return } + authTag := handler.GetMetaTag("auth") + if authTag == "false" { + r.Middleware.Next() + return + } value := r.GetCtx().Value(cst.CtxPermissionList) permissionList := value.([]string) if utils.IsAdmin(permissionList) { diff --git a/internal/service/cpdaily/cpuser.go b/internal/service/cpdaily/cpuser.go index 6f84e59..a790d5b 100644 --- a/internal/service/cpdaily/cpuser.go +++ b/internal/service/cpdaily/cpuser.go @@ -6,6 +6,7 @@ import ( v1 "likedream-goframe/internal/api/v1" "likedream-goframe/internal/application/cpdaily/login" "likedream-goframe/internal/application/cpdaily/school" + "likedream-goframe/internal/cst" "likedream-goframe/internal/db" "likedream-goframe/internal/ent" "likedream-goframe/internal/ent/cpschool" @@ -13,6 +14,8 @@ import ( "likedream-goframe/internal/ent/sysuser" "likedream-goframe/internal/framework/redis" "likedream-goframe/internal/utils" + "strconv" + "time" "github.com/samber/oops" ) @@ -120,3 +123,51 @@ func (v CpUserServiceV1) SchoolList(ctx context.Context, req *v1.CpSchoolListReq schoolList := db.Global.CpSchool.Query().Where(cpschool.NameContains(req.Name)).Limit(5).AllX(ctx) return utils.SuccessWithData(schoolList) } + +func (v CpUserServiceV1) AuthorizeDevice(ctx context.Context, req *v1.CpUserAuthorizeDeviceReq) *utils.Response[any] { + user := utils.GetUserInfoFromCtx(ctx) + cpUser := db.Global.CpUser.Query().Where(cpuser.ID(req.Id), cpuser.HasSysuserWith(sysuser.ID(user.ID))).FirstX(ctx) + if cpUser == nil { + return utils.FailParam("用户不存在") + } + client := redis.GetClient() + dataKey := utils.UUID() + client.Set(ctx, cst.RedisCpUserAuthorize+dataKey, cpUser.ID, time.Duration(cst.RedisCpUserAuthorizeExpire)*time.Second) + return utils.SuccessWithData[any](map[string]string{ + "dataKey": dataKey, + }) +} + +func (v CpUserServiceV1) AuthorizeDeviceSuccess(ctx context.Context, req *v1.CpUserAuthorizeSuccessReq) *utils.Response[any] { + cpUserId := redis.GetClient().Get(ctx, cst.RedisCpUserAuthorize+req.DataKey).Val() + if cpUserId == "" { + return utils.Fail(400, "缓存过期,请重新扫码授权!") + } + id, _ := strconv.ParseInt(cpUserId, 10, 64) + db.Global.CpUser.UpdateOneID(id).SetMobileCode(req.Data).SetMobileType(cpuser.MobileTypeAuthorize).ExecX(ctx) + redis.GetClient().Del(ctx, cst.RedisCpUserAuthorize+req.DataKey) + return utils.SuccessWithMsg("授权成功") +} + +func (v CpUserServiceV1) AuthorizeConfirm(ctx context.Context, req *v1.CpUserAuthorizeConfirmReq) *utils.Response[any] { + user := utils.GetUserInfoFromCtx(ctx) + cpUser := db.Global.CpUser.Query().Where(cpuser.ID(req.Id), cpuser.HasSysuserWith(sysuser.ID(user.ID))).FirstX(ctx) + if cpUser == nil { + return utils.FailParam("用户不存在") + } + val := redis.GetClient().Exists(ctx, cst.RedisCpUserAuthorize+req.DataKey).Val() + if val != 0 || cpUser.MobileType == cpuser.MobileTypeRandom { + return utils.Fail(400, "暂未授权") + } + return utils.SuccessWithMsg("已确认授权") +} + +func (v CpUserServiceV1) AuthorizeRandom(ctx context.Context, req *v1.CpUserAuthorizeRandomReq) *utils.Response[any] { + user := utils.GetUserInfoFromCtx(ctx) + cpUser := db.Global.CpUser.Query().Where(cpuser.ID(req.Id), cpuser.HasSysuserWith(sysuser.ID(user.ID))).FirstX(ctx) + if cpUser == nil { + return utils.FailParam("用户不存在") + } + db.Global.CpUser.UpdateOne(cpUser).SetMobileCode(utils.UUID()).SetMobileType(cpuser.MobileTypeRandom).ExecX(ctx) + return utils.SuccessWithMsg("已改为随机设备码") +}