✨ 授权设备

This commit is contained in:
sugarBecomer
2025-11-02 14:46:53 +08:00
parent 02ec22b80b
commit 1561b515c9
8 changed files with 125 additions and 10 deletions
+22
View File
@@ -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"`
}
@@ -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
}
+6 -2
View File
@@ -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)
}
+8 -6
View File
@@ -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)
)
+3 -1
View File
@@ -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)
+10
View File
@@ -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()
+7 -1
View File
@@ -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) {
+51
View File
@@ -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("已改为随机设备码")
}