add user errcode

This commit is contained in:
Havoc412 2024-10-17 14:49:50 +08:00
parent 45d72de8e5
commit 818d1f0019
9 changed files with 59 additions and 28 deletions

View File

@ -3,6 +3,7 @@ package errcode
const (
ErrGeneral = (iota + 1) * 100000
ErrAnimal
ErrUser
)
const (

View File

@ -8,6 +8,7 @@ func init() {
ErrMsg = make(msg)
GeneralMsgInit(ErrMsg)
AnimalMsgInit(ErrMsg)
UserMsgInit(ErrMsg)
}
func GeneralMsgInit(m msg) {

View File

@ -0,0 +1,9 @@
package errcode
const (
ErrWeixinApi = iota + ErrUser
)
func UserMsgInit(m msg) {
m[ErrWeixinApi] = "微信接口调用失败"
}

View File

@ -8,11 +8,9 @@ import (
userstoken "catface/app/service/users/token"
"catface/app/service/weixin"
"catface/app/utils/response"
"fmt"
"time"
"github.com/gin-gonic/gin"
)
type Users struct {
@ -157,28 +155,30 @@ func (u *Users) WeixinLogin(context *gin.Context) {
userIp := context.ClientIP() // INFO 通过上下文获取 IP 信息。
// 1. 访问 微信 API 获取 openid
openId, err := weixin.Code2Session(code)
weixinRes, err := weixin.Code2Session(code)
if err != nil {
// 解析微信登录成功,返回用户信息
fmt.Println(err) // TODO 换成 LOG
response.Fail(context, consts.CurdLoginFailCode, consts.CurdLoginFailMsg, "")
response.Fail(context, consts.CurdLoginFailCode, consts.CurdLoginFailMsg, err)
return
}
// 2. 执行 CURD
if UsersModel, err := curd.CreateUserFactory().WeixinLogin(openId, userName, userAvatar) {
if userId > 0 {
user, err := model.CreateUserFactory("mysql").WeixinLogin(weixinRes.OpenId, weixinRes.SessionKey, userName, userAvatar, userIp)
if err == nil && user != nil {
if user.Id > 0 {
// 3. 生成 token
token, err := userstoken.CreateUserFactory().GenerateToken(userId, userName, "", 0)
token, err := userstoken.CreateUserFactory().GenerateToken(user.Id, userName, "", 0)
if err != nil {
response.Fail(context, consts.CurdLoginFailCode, consts.CurdLoginFailMsg, "")
response.Fail(context, consts.CurdLoginFailCode, consts.CurdLoginFailMsg, err)
return
}
// 4. 返回 token
res := gin.H{
"userId": UsersModel.userId,
"permission": UsersModel.Permission
"userId": user.Id,
"permission": user.Permission,
"token": token,
}
response.Success(context, consts.CurdStatusOkMsg, res)
}
} else {
response.Fail(context, consts.CurdLoginFailCode, consts.CurdLoginFailMsg, "")

View File

@ -10,9 +10,9 @@ import (
)
type WeixinLogin struct {
Code string `json:"code"`
UserName string `json:"user_name"`
UserAvatar string `json:"user_avatar"` // INFO 本地缓存,不确定 url 的类型。
Code string `form:"code" json:"code"`
UserName string `form:"user_name" json:"user_name"`
UserAvatar string `form:"user_avatar" json:"user_avatar"` // INFO 本地缓存,不确定 url 的类型。
}
func (w WeixinLogin) CheckParams(context *gin.Context) {
@ -25,7 +25,7 @@ func (w WeixinLogin) CheckParams(context *gin.Context) {
// INFO 该函数主要是将本结构体的字段(成员)按照 consts.ValidatorPrefix+ json标签对应的 键 => 值 形式绑定在上下文,便于下一步(控制器)可以直接通过 context.Get(键) 获取相关值
extraAddBindDataContext := data_transfer.DataAddContext(w, consts.ValidatorPrefix, context)
if extraAddBindDataContext == nil {
response.ErrorSystem(context, "userLogin表单验证器json化失败", "")
response.ErrorSystem(context, "userWeixinLogin表单验证器json化失败", "")
} else {
// 验证完成,调用控制器,并将验证器成员(字段)递给控制器,保持上下文数据一致性
(&web.Users{}).WeixinLogin(extraAddBindDataContext)

View File

@ -313,14 +313,14 @@ func (u *UsersModel) DelTokenCacheFromRedis(userId int64) {
* @description
* @return {*}
*/
func (u *UsersModel) WeixinLogin(openId string, name string, avatar string) (temp *UsersModel, err error) {
func (u *UsersModel) WeixinLogin(openId, sessionKey, name, avatar, ip string) (temp *UsersModel, err error) {
db := u.DB
var user UsersModel
if result := db.Where("open_id = ?", openId).First(&user); result.Error != nil {
temp = &user
} else if result.Error == gorm.ErrRecordNotFound {
newUser := UsersModel{OpenId: openId, UserName: name, UserAvatar: avatar}
newUser := UsersModel{OpenId: openId, UserName: name, UserAvatar: avatar, LastLoginIp: ip, SessionKey: sessionKey}
if err := db.Create(&newUser).Error; err != nil {
return nil, err
}

View File

@ -2,12 +2,20 @@ package weixin
import (
"catface/app/global/variable"
"encoding/json"
"fmt"
"io"
"net/http"
)
func Code2Session(js_code string) (string, error) {
type Response struct {
OpenId string `json:"openid"`
SessionKey string `json:"session_key"`
Errcode int `json:"errcode"`
Errmsg string `json:"errmsg"`
}
func Code2Session(js_code string) (*Response, error) {
appid := variable.ConfigYml.GetString("Weixin.AppId")
appSecret := variable.ConfigYml.GetString("Weixin.AppSecret")
grantType := variable.ConfigYml.GetString("Weixin.Code2Session.GrantType")
@ -17,23 +25,32 @@ func Code2Session(js_code string) (string, error) {
// 创建一个新的HTTP请求
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return "", fmt.Errorf("error creating request: %v", err)
return nil, fmt.Errorf("error creating request: %v", err)
}
// 发送HTTP请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return "", fmt.Errorf("error sending request: %v", err)
return nil, fmt.Errorf("error sending request: %v", err)
}
defer resp.Body.Close()
// 读取响应体
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", fmt.Errorf("error reading response body: %v", err)
return nil, fmt.Errorf("error reading response body: %v", err)
}
// 返回响应体
return string(body), nil
// 解析响应体。
var response Response
if err := json.Unmarshal(body, &response); err != nil {
return nil, fmt.Errorf("error parsing response body: %v", err)
}
// check Success
if response.Errcode != 0 {
return nil, fmt.Errorf("error code: %d, error message: %s", response.Errcode, response.Errmsg)
}
return &response, nil
}

View File

@ -142,10 +142,10 @@ Captcha:
captchaValue: "captcha_value" #验证码值提交时的键名
length: 4 # 验证码生成时的长度
WeixinServer:
Weixin:
AppId: "wxe1ff76a57cc6eed3"
AppSecret: "46a3557653462da34c6e69f17a472c7c"
Code2Session:
grant_type: "authorization_code" # 主要就是想避免硬编码。
GrantType: "authorization_code" # 主要就是想避免硬编码。

View File

@ -3,10 +3,12 @@ package routers
import (
"catface/app/global/consts"
"catface/app/global/variable"
// "catface/app/http/controller/captcha" // 验证码组件
// "catface/app/http/middleware/authorization"
"catface/app/http/middleware/cors"
validatorFactory "catface/app/http/validator/core/factory"
// TODO validatorFactory "catface/app/http/validator/core/factory"
"catface/app/utils/gin_release"
"net/http"
@ -77,6 +79,7 @@ func InitWebRouter() *gin.Engine {
// 【不需要token】中间件验证的路由 用户注册、登录
noAuth := backend.Group("users")
{
noAuth.POST("weixinlogin", validatorFactory.Create(consts.ValidatorPrefix+"UsersWeixinLogin"))
// 关于路由的第二个参数用法说明
// 1.编写一个表单参数验证器结构体,参见代码: app/http/validator/web/users/register.go
// 2.将以上表单参数验证器注册,遵守 键 =》值 格式注册即可 app/http/validator/common/register_validator/web_register_validator.go 20行就是注册时候的键 consts.ValidatorPrefix+"UsersRegister"