diff --git a/api/game/v1/game.go b/api/game/v1/game.go index f48384c..28a4d9a 100644 --- a/api/game/v1/game.go +++ b/api/game/v1/game.go @@ -1,6 +1,8 @@ package v1 -import "github.com/gogf/gf/v2/frame/g" +import ( + "github.com/gogf/gf/v2/frame/g" +) type ListReq struct { g.Meta `path:"/game" method:"get" tags:"Game" summary:"(系统、商户门店后台、PC)获取游戏列表"` diff --git a/api/upload/upload.go b/api/upload/upload.go index ce6062e..14ce77d 100644 --- a/api/upload/upload.go +++ b/api/upload/upload.go @@ -12,4 +12,6 @@ import ( type IUploadV1 interface { Upload(ctx context.Context, req *v1.UploadReq) (res *v1.UploadRes, err error) + UploadGameImg(ctx context.Context, req *v1.UploadGameImgReq) (res *v1.UploadGameImgRes, err error) + UploadUserImg(ctx context.Context, req *v1.UploadUserImgReq) (res *v1.UploadUserImgRes, err error) } diff --git a/api/upload/v1/upload.go b/api/upload/v1/upload.go index c826d30..e1394a4 100644 --- a/api/upload/v1/upload.go +++ b/api/upload/v1/upload.go @@ -12,3 +12,20 @@ type UploadReq struct { type UploadRes struct { Url string `json:"url"` } + +type UploadGameImgReq struct { + g.Meta `path:"/upload/game" method:"post" tags:"WEB" summary:"上传游戏图标文件"` + File *ghttp.UploadFile `json:"file"` +} +type UploadGameImgRes struct { + Url string `json:"url"` +} + +type UploadUserImgReq struct { + g.Meta `path:"/upload/user" method:"post" tags:"WEB" summary:"上传用户头像文件"` + File *ghttp.UploadFile `json:"file"` +} + +type UploadUserImgRes struct { + Url string `json:"url"` +} diff --git a/internal/controller/wx/wx_v1_we_chat_event.go b/internal/controller/wx/wx_v1_we_chat_event.go index ae86c0b..82616f1 100644 --- a/internal/controller/wx/wx_v1_we_chat_event.go +++ b/internal/controller/wx/wx_v1_we_chat_event.go @@ -7,6 +7,7 @@ import ( "server/internal/consts" "server/internal/model" "server/internal/service" + "server/utility/wechat" "strings" "github.com/gogf/gf/v2/encoding/gjson" @@ -18,13 +19,18 @@ func (c *ControllerV1) WeChatEvent(ctx context.Context, req *v1.WeChatEventReq) glog.Infof(ctx, "【微信事件】收到事件 | event=%s, msgType=%s, eventKey=%s, fromUserName=%s, toUserName=%s, createTime=%d", req.Event, req.MsgType, req.EventKey, req.FromUserName, req.ToUserName, req.CreateTime, ) + unionid, err := wechat.GetWeChatClient().GetUserUnionId(ctx, req.FromUserName) + if err != nil { + glog.Errorf(ctx, "【微信事件】获取用户信息失败 | error=%s", err.Error()) + return nil, nil + } switch req.MsgType { case "event": switch req.Event { case "subscribe": key := strings.TrimPrefix(req.EventKey, "qrscene_") split := strings.Split(req.EventKey, "_") - out, err := service.User().Login(ctx, &model.UserLoginIn{OpenId: req.FromUserName, StoreCode: split[0]}) + out, err := service.User().Login(ctx, &model.UserLoginIn{OpenId: unionid, StoreCode: split[0]}) if err != nil { return nil, err } @@ -34,7 +40,7 @@ func (c *ControllerV1) WeChatEvent(ctx context.Context, req *v1.WeChatEventReq) return nil, nil case "SCAN": split := strings.Split(req.EventKey, "_") - out, err := service.User().Login(ctx, &model.UserLoginIn{OpenId: req.FromUserName, StoreCode: split[0]}) + out, err := service.User().Login(ctx, &model.UserLoginIn{OpenId: unionid, StoreCode: split[0]}) if err != nil { return nil, err } diff --git a/internal/logic/upload/upload.go b/internal/logic/upload/upload.go index 0d447f8..00110d7 100644 --- a/internal/logic/upload/upload.go +++ b/internal/logic/upload/upload.go @@ -55,3 +55,65 @@ func (s *sUpload) Upload(ctx context.Context, in *model.UploadIn) (res *model.Up Url: uploadRes.Url, }, nil } + +func (s *sUpload) UploadGameImg(ctx context.Context, in *model.UploadIn) (res *model.UploadOut, err error) { + // 判断文件格式 + fileType := in.File.Header.Get("Content-Type") + if !strings.HasPrefix(fileType, "image/") { + return nil, gerror.New("图片格式错误") + } + //判断图片大小 + if in.File.Size > 10*1024*1024 { + return nil, gerror.New("图片大小最多10M") + } + // 获取图片后缀 + exit := strings.Split(fileType, "/")[1] + // 文件名称 + fileName := strings.ToLower("gameImg/" + grand.Letters(32) + "." + exit) + // 开始上传图片 + client, ok := oss.GetClient("aliyun") + if !ok { + return nil, ecode.Fail.Sub("未配置OSS") + } + uploadRes, err := client.UploadFile(ctx, &model.OssUploadFileInput{ + Filename: fileName, + File: in.File, + }) + if err != nil { + return nil, err + } + return &model.UploadOut{ + Url: uploadRes.Url, + }, nil +} + +func (s *sUpload) UploadUserImg(ctx context.Context, in *model.UploadIn) (res *model.UploadOut, err error) { + // 判断文件格式 + fileType := in.File.Header.Get("Content-Type") + if !strings.HasPrefix(fileType, "image/") { + return nil, gerror.New("图片格式错误") + } + //判断图片大小 + if in.File.Size > 10*1024*1024 { + return nil, gerror.New("图片大小最多10M") + } + // 获取图片后缀 + exit := strings.Split(fileType, "/")[1] + // 文件名称 + fileName := strings.ToLower("userImg/" + grand.Letters(32) + "." + exit) + // 开始上传图片 + client, ok := oss.GetClient("aliyun") + if !ok { + return nil, ecode.Fail.Sub("未配置OSS") + } + uploadRes, err := client.UploadFile(ctx, &model.OssUploadFileInput{ + Filename: fileName, + File: in.File, + }) + if err != nil { + return nil, err + } + return &model.UploadOut{ + Url: uploadRes.Url, + }, nil +} diff --git a/internal/service/upload.go b/internal/service/upload.go index 15d80d3..5e255eb 100644 --- a/internal/service/upload.go +++ b/internal/service/upload.go @@ -13,6 +13,8 @@ import ( type ( IUpload interface { Upload(ctx context.Context, in *model.UploadIn) (res *model.UploadOut, err error) + UploadGameImg(ctx context.Context, in *model.UploadIn) (res *model.UploadOut, err error) + UploadUserImg(ctx context.Context, in *model.UploadIn) (res *model.UploadOut, err error) } ) diff --git a/utility/myCasbin/casbin.go b/utility/myCasbin/casbin.go index e7a26bd..75d8ef4 100644 --- a/utility/myCasbin/casbin.go +++ b/utility/myCasbin/casbin.go @@ -51,6 +51,7 @@ func init() { { // 上传图片 enforcer.AddPolicy("user", "/x/upload/image", "POST", "上传图片") + enforcer.AddPolicy("user", "/x/upload/user", "POST", "上传头像图片") // enforcer.AddPolicy("user", "/x/user", "PUT", "修改个人信息") @@ -90,6 +91,7 @@ func init() { { // admin enforcer.AddPolicy("admin", "/x/admin/info", "GET", "获取管理员用户信息") + enforcer.AddPolicy("admin", "/x/upload/game", "POST", "管理员上传游戏图标") // role enforcer.AddPolicy("admin", "/x/role", "GET", "管理员获取角色列表") diff --git a/utility/wechat/wechat.go b/utility/wechat/wechat.go index 3970e5e..6c8b2dd 100644 --- a/utility/wechat/wechat.go +++ b/utility/wechat/wechat.go @@ -170,6 +170,25 @@ func (c *weChatClient) GetToken() string { return c.Token } -func (c *weChatClient) GetUserUnionId(openid string) (unionId string, err error) { - return +func (c *weChatClient) GetUserUnionId(ctx context.Context, openid string) (unionId string, err error) { + + // TODO 获取唯一UnionId + //result := struct { + // UnionId string `json:"unionid"` + //}{} + // + //resp, err := resty.New().R(). + // SetQueryParams(g.MapStrStr{"access_token": c.accessToken}).SetQueryParam("openid", openid). + // SetResult(&result). + // Get("https://api.weixin.qq.com/cgi-bin/user/info") + // + //if err != nil { + // glog.Errorf(ctx, "发起 get ticket 请求出现异常: %+v", err) + // return "", ecode.Fail.Sub("发起 get ticket 请求出现异常") + //} + //if resp.StatusCode() != 200 { + // glog.Errorf(ctx, "获取微信 ticket 响应异常: %+v", resp.Status()) + // return "", ecode.Fail.Sub("获取微信 ticket 失败") + //} + return openid, nil }