From e40f9987db2cde2e767efffe11cc1f414ca38302 Mon Sep 17 00:00:00 2001 From: chy <2463300564@qq.com> Date: Fri, 6 Jun 2025 15:48:05 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BF=AE=E6=94=B9=E5=A4=B4?= =?UTF-8?q?=E5=83=8F=E3=80=81=E6=98=B5=E7=A7=B0=E3=80=81=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=B7=E3=80=81=E8=8E=B7=E5=8F=96=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=AF=A6=E7=BB=86=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/user/user.go | 4 + api/user/v1/user.go | 47 +++++++++++ internal/cmd/cmd.go | 2 + internal/consts/redis.go | 12 +-- .../controller/user/user_v1_bind_phone.go | 26 +++++++ .../controller/user/user_v1_get_phone_code.go | 24 ++++++ internal/controller/user/user_v1_info.go | 35 +++++++++ internal/controller/user/user_v1_update.go | 24 ++++++ internal/logic/user/user.go | 78 +++++++++++++++++-- internal/model/user.go | 37 ++++++++- internal/service/user.go | 4 +- utility/myCasbin/casbin.go | 6 ++ 12 files changed, 280 insertions(+), 19 deletions(-) create mode 100644 internal/controller/user/user_v1_bind_phone.go create mode 100644 internal/controller/user/user_v1_get_phone_code.go create mode 100644 internal/controller/user/user_v1_info.go create mode 100644 internal/controller/user/user_v1_update.go diff --git a/api/user/user.go b/api/user/user.go index 72154d4..c513c2a 100644 --- a/api/user/user.go +++ b/api/user/user.go @@ -12,4 +12,8 @@ import ( type IUserV1 interface { List(ctx context.Context, req *v1.ListReq) (res *v1.ListRes, err error) + Info(ctx context.Context, req *v1.InfoReq) (res *v1.InfoRes, err error) + Update(ctx context.Context, req *v1.UpdateReq) (res *v1.UpdateRes, err error) + BindPhone(ctx context.Context, req *v1.BindPhoneReq) (res *v1.BindPhoneRes, err error) + GetPhoneCode(ctx context.Context, req *v1.GetPhoneCodeReq) (res *v1.GetPhoneCodeRes, err error) } diff --git a/api/user/v1/user.go b/api/user/v1/user.go index 32b8114..c120555 100644 --- a/api/user/v1/user.go +++ b/api/user/v1/user.go @@ -11,3 +11,50 @@ type ListRes struct { List interface{} `json:"list"` Total int `json:"total"` } + +type InfoReq struct { + g.Meta `path:"/user/info" method:"get" tags:"User" summary:"获取用户信息"` + OpenId string `json:"openId" v:"required#OpenId不能为空" dc:"OpenId"` +} + +type InfoRes struct { + Id int `json:"id"` + WxOpenId string `json:"wxOpenId"` + Username string `json:"username"` + Nickname string `json:"nickname"` + Avatar string `json:"avatar"` + Email string `json:"email"` + PhoneNumber string `json:"phoneNumber"` + WxPopenId string `json:"wxPopenId"` + QQPopenId string `json:"qqPopenId"` + RoleId int `json:"roleId"` +} + +type UpdateReq struct { + g.Meta `path:"/user" method:"put" tags:"User" summary:"更新用户头像,昵称"` + Avatar string `json:"avatar" v:"required#头像不能为空" dc:"头像"` + Nickname string `json:"nickname" v:"required#昵称不能为空" dc:"昵称"` +} + +type UpdateRes struct { + Success bool `json:"success" dc:"是否成功"` +} + +type BindPhoneReq struct { + g.Meta `path:"/user/bindPhone" method:"post" tags:"User" summary:"绑定手机号"` + Phone string `json:"phone" v:"required#手机号不能为空" dc:"手机号"` + Code string `json:"code" v:"required#验证码不能为空" dc:"验证码"` +} + +type BindPhoneRes struct { + Success bool `json:"success" dc:"是否成功"` +} + +type GetPhoneCodeReq struct { + g.Meta `path:"/user/getPhoneCode" method:"post" tags:"User" summary:"获取手机验证码"` + Phone string `json:"phone" v:"required#手机号不能为空" dc:"手机号"` +} + +type GetPhoneCodeRes struct { + Success bool `json:"success" dc:"是否成功"` +} diff --git a/internal/cmd/cmd.go b/internal/cmd/cmd.go index 4ae9b96..a6ec496 100644 --- a/internal/cmd/cmd.go +++ b/internal/cmd/cmd.go @@ -12,6 +12,7 @@ import ( "server/internal/controller/rewardType" "server/internal/controller/role" "server/internal/controller/upload" + "server/internal/controller/user" "server/internal/controller/wx" "server/internal/middleware" ) @@ -40,6 +41,7 @@ var ( merchant.NewV1(), rewardType.NewV1(), feedback.NewV1(), + user.NewV1(), ) }) }) diff --git a/internal/consts/redis.go b/internal/consts/redis.go index e8564c6..2d3383b 100644 --- a/internal/consts/redis.go +++ b/internal/consts/redis.go @@ -1,13 +1,7 @@ package consts -// Redis key 前缀 +// 用户 const ( - // 用户相关 - UserCode = "user:code:" // 用户验证码 - UserToken = "user:token:" // 用户token - UserInfo = "user:info:" // 用户信息 - - // 系统相关 - SystemConfig = "system:config" // 系统配置 - SystemCache = "system:cache:" // 系统缓存 + UserBindPhoneKey = "user:bindPhone:%d" + UserCodeExpire = 5 * 60 ) diff --git a/internal/controller/user/user_v1_bind_phone.go b/internal/controller/user/user_v1_bind_phone.go new file mode 100644 index 0000000..2868817 --- /dev/null +++ b/internal/controller/user/user_v1_bind_phone.go @@ -0,0 +1,26 @@ +package user + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "server/internal/model" + "server/internal/service" + + "server/api/user/v1" +) + +func (c *ControllerV1) BindPhone(ctx context.Context, req *v1.BindPhoneReq) (res *v1.BindPhoneRes, err error) { + + id := g.RequestFromCtx(ctx).GetCtxVar("id").Int64() + + out, err := service.User().BindPhone(ctx, &model.UserBindPhoneIn{ + PhoneCode: req.Code, + Phone: req.Phone, + Id: id, + }) + + if err != nil { + return nil, err + } + return &v1.BindPhoneRes{Success: out.Success}, nil +} diff --git a/internal/controller/user/user_v1_get_phone_code.go b/internal/controller/user/user_v1_get_phone_code.go new file mode 100644 index 0000000..49bb725 --- /dev/null +++ b/internal/controller/user/user_v1_get_phone_code.go @@ -0,0 +1,24 @@ +package user + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "server/internal/model" + "server/internal/service" + + "server/api/user/v1" +) + +func (c *ControllerV1) GetPhoneCode(ctx context.Context, req *v1.GetPhoneCodeReq) (res *v1.GetPhoneCodeRes, err error) { + + id := g.RequestFromCtx(ctx).GetCtxVar("id").Int64() + out, err := service.User().Code(ctx, &model.GetPhoneCodeIn{ + Phone: req.Phone, + Id: id, + }) + + if err != nil { + return nil, err + } + return &v1.GetPhoneCodeRes{Success: out.Success}, nil +} diff --git a/internal/controller/user/user_v1_info.go b/internal/controller/user/user_v1_info.go new file mode 100644 index 0000000..da0ef70 --- /dev/null +++ b/internal/controller/user/user_v1_info.go @@ -0,0 +1,35 @@ +package user + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "server/internal/model" + "server/internal/service" + + "server/api/user/v1" +) + +func (c *ControllerV1) Info(ctx context.Context, req *v1.InfoReq) (res *v1.InfoRes, err error) { + + id := g.RequestFromCtx(ctx).GetCtxVar("id").Int64() + out, err := service.User().Info(ctx, &model.UserInfoIn{ + OpenId: req.OpenId, + Id: int(id), + }) + if err != nil { + return nil, err + } + + return &v1.InfoRes{ + Avatar: out.Avatar, + Email: out.Email, + Id: int(out.Id), + Nickname: out.Nickname, + PhoneNumber: out.PhoneNumber, + QQPopenId: out.QQPopenId, + RoleId: int(out.RoleId), + Username: out.Username, + WxOpenId: out.WxOpenId, + WxPopenId: out.WxPopenId, + }, nil +} diff --git a/internal/controller/user/user_v1_update.go b/internal/controller/user/user_v1_update.go new file mode 100644 index 0000000..dfe4d1f --- /dev/null +++ b/internal/controller/user/user_v1_update.go @@ -0,0 +1,24 @@ +package user + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "server/internal/model" + "server/internal/service" + + "server/api/user/v1" +) + +func (c *ControllerV1) Update(ctx context.Context, req *v1.UpdateReq) (res *v1.UpdateRes, err error) { + + id := g.RequestFromCtx(ctx).GetCtxVar("id").Int64() + out, err := service.User().Update(ctx, &model.UserUpdateIn{ + Id: id, + Nickname: req.Nickname, + Avatar: req.Avatar, + }) + if err != nil { + return nil, err + } + return &v1.UpdateRes{Success: out.Success}, nil +} diff --git a/internal/logic/user/user.go b/internal/logic/user/user.go index 4d1a7f4..1886245 100644 --- a/internal/logic/user/user.go +++ b/internal/logic/user/user.go @@ -2,6 +2,8 @@ package internal import ( "context" + "fmt" + "github.com/gogf/gf/v2/frame/g" "server/internal/consts" "server/internal/dao" "server/internal/model" @@ -115,21 +117,83 @@ func (s *sUser) Info(ctx context.Context, in *model.UserInfoIn) (out *model.User return nil, ecode.Fail.Sub("查找用户失败") } out = &model.UserInfoOut{ - Id: user.Id, + Id: user.Id, + WxOpenId: user.WxOpenId, + Username: user.Username, + Nickname: user.Nickname, + Avatar: user.Avatar, + Email: user.Email, + PhoneNumber: user.PhoneNumber, + WxPopenId: user.WxPopenId, + QQPopenId: user.QqPopenId, + RoleId: user.RoleId, } - return + return out, nil } -func (s *sUser) Code(ctx context.Context, in *model.UserCodeIn) (out *model.UserCodeOut, err error) { - return +func (s *sUser) Code(ctx context.Context, in *model.GetPhoneCodeIn) (out *model.GetPhoneCodeOut, err error) { + // TODO 短信平台获取验证码 + code := "9999" + + // 存入 redis + err = g.Redis().SetEX(ctx, fmt.Sprintf(consts.UserBindPhoneKey, in.Id), code, consts.UserCodeExpire) + + if err != nil { + return nil, ecode.Fail.Sub("设置验证码失败") + } + + return &model.GetPhoneCodeOut{ + Success: true, + }, nil } func (s *sUser) Update(ctx context.Context, in *model.UserUpdateIn) (out *model.UpdateOut, err error) { - return + + exist, err := dao.Users.Ctx(ctx).Where(do.Users{Id: in.Id}).Exist() + if err != nil { + return nil, ecode.Fail.Sub("该用户不存在") + } + + if !exist { + return nil, ecode.Params.Sub("用户不存在") + } + + _, err = dao.Users.Ctx(ctx).Where(do.Users{Id: in.Id}).Update(do.Users{ + Nickname: in.Nickname, + Avatar: in.Avatar, + }) + if err != nil { + return nil, ecode.Fail.Sub("更新用户信息失败") + } + + return &model.UpdateOut{ + Success: true, + }, nil } -func (s *sUser) BindPhone(ctx context.Context, in *model.UserBindPhoneIn) (out *model.UpdateOut, err error) { +func (s *sUser) BindPhone(ctx context.Context, in *model.UserBindPhoneIn) (out *model.UserBindPhoneOut, err error) { // 绑定手机号,需要验证入参和缓存中的验证码时候相同 - return + value, err := g.Redis().Get(ctx, fmt.Sprintf(consts.UserBindPhoneKey, in.Id)) + if err != nil { + return nil, ecode.Fail.Sub("获取失败") + } + + if value.IsEmpty() { + return nil, ecode.Fail.Sub("验证码已过期") + } + + if value.String() != in.PhoneCode { + return nil, ecode.Fail.Sub("验证码错误") + } + + _, err = dao.Users.Ctx(ctx).Where(do.Users{Id: in.Id}).Update(do.Users{ + PhoneNumber: in.Phone, + }) + if err != nil { + return nil, ecode.Fail.Sub("绑定手机号失败") + } + return &model.UserBindPhoneOut{ + Success: true, + }, nil } func (s *sUser) List(ctx context.Context, in *model.UserListIn) (out *model.UserListOut, err error) { diff --git a/internal/model/user.go b/internal/model/user.go index be1aa35..58c69ae 100644 --- a/internal/model/user.go +++ b/internal/model/user.go @@ -73,10 +73,26 @@ type UserInfoIn struct { OpenId string } type UserInfoOut struct { - Id int64 + Id int64 + WxOpenId string + Username string + Nickname string + Avatar string + Email string + PhoneNumber string + WxPopenId string + QQPopenId string + RoleId int64 } type UserBindPhoneIn struct { + Id int64 + Phone string + PhoneCode string +} + +type UserBindPhoneOut struct { + Success bool } type UserListIn struct { @@ -98,3 +114,22 @@ type UserCodeIn struct { type UserCodeOut struct { } + +type UserUpdateImgIn struct { + Id int64 + Nickname string + Avatar string +} + +type UserUpdateImgOut struct { + Success bool +} + +type GetPhoneCodeIn struct { + Id int64 + Phone string +} + +type GetPhoneCodeOut struct { + Success bool +} diff --git a/internal/service/user.go b/internal/service/user.go index 98e9689..25517fc 100644 --- a/internal/service/user.go +++ b/internal/service/user.go @@ -15,9 +15,9 @@ type ( Login(ctx context.Context, in *model.UserLoginIn) (out *model.UserLoginOut, err error) WeChatLogin(ctx context.Context, in *model.WeChatLogin) (out *model.WeChatLoginOut, err error) Info(ctx context.Context, in *model.UserInfoIn) (out *model.UserInfoOut, err error) - Code(ctx context.Context, in *model.UserCodeIn) (out *model.UserCodeOut, err error) + Code(ctx context.Context, in *model.GetPhoneCodeIn) (out *model.GetPhoneCodeOut, err error) Update(ctx context.Context, in *model.UserUpdateIn) (out *model.UpdateOut, err error) - BindPhone(ctx context.Context, in *model.UserBindPhoneIn) (out *model.UpdateOut, err error) + BindPhone(ctx context.Context, in *model.UserBindPhoneIn) (out *model.UserBindPhoneOut, err error) List(ctx context.Context, in *model.UserListIn) (out *model.UserListOut, err error) } ) diff --git a/utility/myCasbin/casbin.go b/utility/myCasbin/casbin.go index 7b8b1df..77389df 100644 --- a/utility/myCasbin/casbin.go +++ b/utility/myCasbin/casbin.go @@ -47,6 +47,12 @@ func init() { // 上传图片 enforcer.AddPolicy("user", "/x/upload/image", "POST", "上传图片") + // + enforcer.AddPolicy("user", "/x/user", "PUT", "修改个人信息") + enforcer.AddPolicy("user", "/x/user/getPhoneCode", "POST", "获取验证码") + enforcer.AddPolicy("user", "/x/user/bindPhone", "POST", "绑定手机号") + enforcer.AddPolicy("user", "/x/user/info", "GET", "查询用户个人信息") + // 反馈信息 enforcer.AddPolicy("user", "/x/feedback", "GET", "获取反馈信息列表") enforcer.AddPolicy("user", "/x/feedback", "POST", "添加反馈信息")