新增 web 后台菜单、新增角色表

This commit is contained in:
2025-06-03 13:33:35 +08:00
parent fdc9cc3463
commit bcd274c750
13 changed files with 544 additions and 29 deletions

View File

@ -4,56 +4,85 @@ import (
"context"
"encoding/json"
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/glog"
"io"
"os"
v1 "server/api/wx/v1"
"server/internal/model"
"server/utility/ecode"
"server/utility/wechat"
"time"
"os"
"server/api/auth/v1"
"github.com/gogf/gf/v2/frame/g"
)
func (c *ControllerV1) WeChatLogin(ctx context.Context, req *v1.WeChatLoginReq) (res *v1.WeChatLoginRes, err error) {
// 1、根据 uuid 构建redis 存入数据接口
cache := struct {
Token string `json:"token"`
OpenID string `json:"openid"`
}{
Token: "",
OpenID: "",
glog.Infof(ctx, "收到微信登录请求SceneId: %s", req.SceneId)
loginLimitKey := fmt.Sprintf("wx:login:limit:%s", req.SceneId)
// 检查登录限制
va, err := g.Redis().Get(ctx, loginLimitKey)
if err != nil {
glog.Errorf(ctx, "Redis 获取登录限制失败: %v", err)
return nil, ecode.Fail.Sub("获取登录限制失败")
}
marshal, err := json.Marshal(cache)
if err != nil {
glog.Errorf(ctx, "反序列化数据出现异常")
return nil, ecode.Fail.Sub("反序列化数据出现异常")
if !va.IsEmpty() {
glog.Warningf(ctx, "SceneId %s 登录请求过于频繁", req.SceneId)
return nil, ecode.InvalidOperation.Sub("请勿重复请求登录二维码")
}
// 2、存入 redis
_, err = g.Redis().Do(ctx, "SETEX", fmt.Sprintf("login_status:%s", req.UUID), 300, marshal)
if err != nil {
glog.Errorf(ctx, "写入 Redis 异常:%v", err)
return nil, ecode.Fail.Sub("写入 Redis 登录状态失败")
if err = g.Redis().SetEX(ctx, loginLimitKey, 1, 60); err != nil {
glog.Errorf(ctx, "Redis 设置登录限制失败: %v", err)
return nil, ecode.Fail.Sub("登录频率限制设置失败")
}
// 3、开始获取图片
weChatClient := wechat.GetWeChatClient()
ticket, err := weChatClient.GetTicket(req.UUID)
client := wechat.GetWeChatClient()
ticket, err := client.GetTicket(fmt.Sprintf("%s", req.SceneId))
if err != nil {
return nil, ecode.Fail.Sub("微信登录获取 ticket 错误")
glog.Errorf(ctx, "获取微信 ticket 失败: %v", err)
return nil, err
}
imagePath, err := weChatClient.GetQrCode(ticket, req.UUID+".jpg")
qrCode, err := client.GetQrCode(ticket)
if err != nil {
return nil, ecode.Fail.Sub("微信登录获取二维码错误")
glog.Errorf(ctx, "生成二维码失败: %v", err)
return nil, err
}
imageData, err := os.ReadFile(imagePath)
file, err := os.Open(qrCode)
if err != nil {
return nil, ecode.Fail.Sub("读取二维码图片失败")
glog.Errorf(ctx, "二维码文件打开失败: %v", err)
return nil, ecode.Fail.Sub("二维码文件打开失败")
}
defer os.Remove(imagePath)
defer func() {
file.Close()
os.Remove(qrCode)
}()
imgBytes, err := io.ReadAll(file)
if err != nil {
glog.Errorf(ctx, "读取二维码失败: %v", err)
return nil, ecode.Fail.Sub("二维码读取失败")
}
resp := g.RequestFromCtx(ctx).Response
resp.Header().Set("Content-Type", "image/jpeg")
resp.Write(imageData)
resp.Write(imgBytes)
loginCache := model.LoginCache{
Status: 0,
CreatedAt: time.Now(),
}
data, err := json.Marshal(loginCache)
if err == nil {
_ = g.Redis().SetEX(ctx, fmt.Sprintf("wx:login:cache:%s", req.SceneId), data, 60)
glog.Infof(ctx, "SceneId %s 登录缓存已写入 Redis", req.SceneId)
} else {
glog.Warningf(ctx, "SceneId %s登录缓存序列化失败: %v", req.SceneId, err)
}
glog.Infof(ctx, "SceneId %s 登录二维码已返回", req.SceneId)
return nil, nil
}