From b98ad2af2cfb0ada793afc20411864964b505c69 Mon Sep 17 00:00:00 2001 From: liangzai <2440983361@qq.com> Date: Tue, 17 Jun 2025 23:46:01 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=B8=89=E7=AB=AF=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=B7=E8=81=94=E9=80=9A=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=B8=B4=E6=97=B6=E7=94=A8=E6=88=B7=202=E3=80=81?= =?UTF-8?q?=E9=80=82=E9=85=8D=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/main/api/etc/user-api.yaml | 3 + .../logic/user/wxminiauthlogic copy.go | 167 +++++++ app/main/model/userTempModel.go | 27 ++ app/main/model/userTempModel_gen.go | 407 ++++++++++++++++++ 4 files changed, 604 insertions(+) create mode 100644 app/main/api/etc/user-api.yaml create mode 100644 app/main/api/internal/logic/user/wxminiauthlogic copy.go create mode 100644 app/main/model/userTempModel.go create mode 100644 app/main/model/userTempModel_gen.go diff --git a/app/main/api/etc/user-api.yaml b/app/main/api/etc/user-api.yaml new file mode 100644 index 0000000..406c7c8 --- /dev/null +++ b/app/main/api/etc/user-api.yaml @@ -0,0 +1,3 @@ +Name: user-api +Host: 0.0.0.0 +Port: 8888 diff --git a/app/main/api/internal/logic/user/wxminiauthlogic copy.go b/app/main/api/internal/logic/user/wxminiauthlogic copy.go new file mode 100644 index 0000000..e95b035 --- /dev/null +++ b/app/main/api/internal/logic/user/wxminiauthlogic copy.go @@ -0,0 +1,167 @@ +package user + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "qnc-server/app/main/model" + jwtx "qnc-server/common/jwt" + "qnc-server/common/xerr" + "time" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/sqlx" + + "qnc-server/app/main/api/internal/svc" + "qnc-server/app/main/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type WxMiniAuthLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewWxMiniAuthLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WxMiniAuthLogic { + return &WxMiniAuthLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *WxMiniAuthLogic) WxMiniAuth(req *types.WXMiniAuthReq) (resp *types.WXMiniAuthResp, err error) { + // 1. 获取session_key和openid + sessionKeyResp, err := l.GetSessionKey(req.Code) + if err != nil { + return nil, err + } + + // 2. 查找用户授权信息 + userAuth, err := l.svcCtx.UserAuthModel.FindOneByAuthTypeAuthKey(l.ctx, model.UserAuthTypeWxMiniOpenID, sessionKeyResp.Openid) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询用户授权失败: %v", err) + } + + // 3. 处理用户信息 + var user *model.User + if userAuth != nil { + // 已存在用户,直接登录 + user, err = l.svcCtx.UserModel.FindOne(l.ctx, userAuth.UserId) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询用户信息失败: %v", err) + } + } else { + userTemp, err := l.svcCtx.UserTempModel.FindOneByAuthTypeAuthKey(l.ctx, model.UserAuthTypeWxMiniOpenID, sessionKeyResp.Openid) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询用户临时信息失败: %v", err) + } + if userTemp == nil { + userTemp.AuthType = model.UserAuthTypeWxMiniOpenID + userTemp.AuthKey = sessionKeyResp.Openid + user, err = l.svcCtx.UserModel.Insert(l.ctx, userTemp) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建用户信息失败: %v", err) + } + userAuth = &model.UserAuth{ + UserId: user.Id, + AuthKey: sessionKeyResp.Openid, + AuthType: model.UserAuthTypeWxMiniOpenID, + } + // 新用户,创建用户记录 + user = &model.User{} + if transErr := l.svcCtx.UserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 插入用户基本信息 + insertResult, err := l.svcCtx.UserModel.Insert(ctx, session, user) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建新用户失败: %v", err) + } + lastId, err := insertResult.LastInsertId() + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取新用户ID失败: %v", err) + } + user.Id = lastId + + // 创建用户授权信息 + userAuth = &model.UserAuth{ + UserId: user.Id, + AuthKey: sessionKeyResp.Openid, + AuthType: model.UserAuthTypeWxMiniOpenID, + } + if _, err := l.svcCtx.UserAuthModel.Insert(ctx, session, userAuth); err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建用户授权失败: %v", err) + } + return nil + }); transErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建新用户事务失败: %v", transErr) + } + } + + // 4. 生成JWT Token + token, err := jwtx.GenerateJwtToken(user.Id, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成JWT token失败: %v", err) + } + + // 5. 返回登录结果 + now := time.Now().Unix() + return &types.WXMiniAuthResp{ + AccessToken: token, + AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, + RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, + }, nil +} + +// SessionKeyResp 小程序登录返回结构 +type SessionKeyResp struct { + Openid string `json:"openid"` + SessionKey string `json:"session_key"` + Unionid string `json:"unionid,omitempty"` + ErrCode int `json:"errcode,omitempty"` + ErrMsg string `json:"errmsg,omitempty"` +} + +// GetSessionKey 通过code获取小程序的session_key和openid +func (l *WxMiniAuthLogic) GetSessionKey(code string) (*SessionKeyResp, error) { + appID := l.svcCtx.Config.WechatMini.AppID + appSecret := l.svcCtx.Config.WechatMini.AppSecret + + url := fmt.Sprintf("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", + appID, appSecret, code) + + resp, err := http.Get(url) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取session_key失败: %v", err) + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "读取响应失败: %v", err) + } + + var sessionKeyResp SessionKeyResp + if err = json.Unmarshal(body, &sessionKeyResp); err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "解析响应失败: %v", err) + } + + // 检查微信返回的错误码 + if sessionKeyResp.ErrCode != 0 { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), + "微信接口返回错误: errcode=%d, errmsg=%s", + sessionKeyResp.ErrCode, sessionKeyResp.ErrMsg) + } + + // 验证必要字段 + if sessionKeyResp.Openid == "" || sessionKeyResp.SessionKey == "" { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), + "微信接口返回数据不完整: openid=%s, session_key=%s", + sessionKeyResp.Openid, sessionKeyResp.SessionKey) + } + + return &sessionKeyResp, nil +} diff --git a/app/main/model/userTempModel.go b/app/main/model/userTempModel.go new file mode 100644 index 0000000..bcb7978 --- /dev/null +++ b/app/main/model/userTempModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ UserTempModel = (*customUserTempModel)(nil) + +type ( + // UserTempModel is an interface to be customized, add more methods here, + // and implement the added methods in customUserTempModel. + UserTempModel interface { + userTempModel + } + + customUserTempModel struct { + *defaultUserTempModel + } +) + +// NewUserTempModel returns a model for the database table. +func NewUserTempModel(conn sqlx.SqlConn, c cache.CacheConf) UserTempModel { + return &customUserTempModel{ + defaultUserTempModel: newUserTempModel(conn, c), + } +} diff --git a/app/main/model/userTempModel_gen.go b/app/main/model/userTempModel_gen.go new file mode 100644 index 0000000..9879bd8 --- /dev/null +++ b/app/main/model/userTempModel_gen.go @@ -0,0 +1,407 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "qnc-server/common/globalkey" +) + +var ( + userTempFieldNames = builder.RawFieldNames(&UserTemp{}) + userTempRows = strings.Join(userTempFieldNames, ",") + userTempRowsExpectAutoSet = strings.Join(stringx.Remove(userTempFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + userTempRowsWithPlaceHolder = strings.Join(stringx.Remove(userTempFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheQncUserTempIdPrefix = "cache:qnc:userTemp:id:" + cacheQncUserTempAuthTypeAuthKeyPrefix = "cache:qnc:userTemp:authType:authKey:" +) + +type ( + userTempModel interface { + Insert(ctx context.Context, session sqlx.Session, data *UserTemp) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*UserTemp, error) + FindOneByAuthTypeAuthKey(ctx context.Context, authType string, authKey string) (*UserTemp, error) + Update(ctx context.Context, session sqlx.Session, data *UserTemp) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *UserTemp) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *UserTemp) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*UserTemp, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*UserTemp, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*UserTemp, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*UserTemp, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*UserTemp, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultUserTempModel struct { + sqlc.CachedConn + table string + } + + UserTemp struct { + Id int64 `db:"id"` + AuthKey string `db:"auth_key"` // 平台唯一id + AuthType string `db:"auth_type"` // 平台类型 + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + } +) + +func newUserTempModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultUserTempModel { + return &defaultUserTempModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`user_temp`", + } +} + +func (m *defaultUserTempModel) Insert(ctx context.Context, session sqlx.Session, data *UserTemp) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + qncUserTempAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheQncUserTempAuthTypeAuthKeyPrefix, data.AuthType, data.AuthKey) + qncUserTempIdKey := fmt.Sprintf("%s%v", cacheQncUserTempIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?)", m.table, userTempRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.AuthKey, data.AuthType, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.AuthKey, data.AuthType, data.DeleteTime, data.DelState, data.Version) + }, qncUserTempAuthTypeAuthKeyKey, qncUserTempIdKey) +} + +func (m *defaultUserTempModel) FindOne(ctx context.Context, id int64) (*UserTemp, error) { + qncUserTempIdKey := fmt.Sprintf("%s%v", cacheQncUserTempIdPrefix, id) + var resp UserTemp + err := m.QueryRowCtx(ctx, &resp, qncUserTempIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", userTempRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultUserTempModel) FindOneByAuthTypeAuthKey(ctx context.Context, authType string, authKey string) (*UserTemp, error) { + qncUserTempAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheQncUserTempAuthTypeAuthKeyPrefix, authType, authKey) + var resp UserTemp + err := m.QueryRowIndexCtx(ctx, &resp, qncUserTempAuthTypeAuthKeyKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `auth_type` = ? and `auth_key` = ? and del_state = ? limit 1", userTempRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, authType, authKey, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultUserTempModel) Update(ctx context.Context, session sqlx.Session, newData *UserTemp) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + qncUserTempAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheQncUserTempAuthTypeAuthKeyPrefix, data.AuthType, data.AuthKey) + qncUserTempIdKey := fmt.Sprintf("%s%v", cacheQncUserTempIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, userTempRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.AuthKey, newData.AuthType, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.AuthKey, newData.AuthType, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, qncUserTempAuthTypeAuthKeyKey, qncUserTempIdKey) +} + +func (m *defaultUserTempModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *UserTemp) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + qncUserTempAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheQncUserTempAuthTypeAuthKeyPrefix, data.AuthType, data.AuthKey) + qncUserTempIdKey := fmt.Sprintf("%s%v", cacheQncUserTempIdPrefix, data.Id) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, userTempRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.AuthKey, newData.AuthType, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.AuthKey, newData.AuthType, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, qncUserTempAuthTypeAuthKeyKey, qncUserTempIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultUserTempModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *UserTemp) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "UserTempModel delete err : %+v", err) + } + return nil +} + +func (m *defaultUserTempModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultUserTempModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultUserTempModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*UserTemp, error) { + + builder = builder.Columns(userTempRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*UserTemp + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultUserTempModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*UserTemp, error) { + + builder = builder.Columns(userTempRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*UserTemp + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultUserTempModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*UserTemp, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(userTempRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*UserTemp + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultUserTempModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*UserTemp, error) { + + builder = builder.Columns(userTempRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*UserTemp + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultUserTempModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*UserTemp, error) { + + builder = builder.Columns(userTempRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*UserTemp + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultUserTempModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultUserTempModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultUserTempModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + qncUserTempAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheQncUserTempAuthTypeAuthKeyPrefix, data.AuthType, data.AuthKey) + qncUserTempIdKey := fmt.Sprintf("%s%v", cacheQncUserTempIdPrefix, id) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, qncUserTempAuthTypeAuthKeyKey, qncUserTempIdKey) + return err +} +func (m *defaultUserTempModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheQncUserTempIdPrefix, primary) +} +func (m *defaultUserTempModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", userTempRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultUserTempModel) tableName() string { + return m.table +}