Pārlūkot izejas kodu

feat: 用户登录接口

double.huang 4 gadi atpakaļ
vecāks
revīzija
737ae96312

+ 2 - 2
etc/i2bill-api.yaml

@@ -12,8 +12,8 @@ Transform:
       - 47.103.219.158:30019
     Key: transform.rpc
 Weixin:
-  Appid: wxf8e794856efe5590
-  Secret: 9a75377da9afde4c666e1c3eb00d2598
+  Appid: wxb8a763ab9e81d0cb
+  Secret: 95dc14b89d32fe91709bba8916f30f74
 JwtAuth:
   AccessSecret: 6hy789iu87
   AccessExpire: 604800

+ 10 - 0
go.sum

@@ -1,4 +1,5 @@
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+git.i2edu.net/i2/go-zero v1.0.0 h1:tB6YOQ4PwOkZwIrzXV+fv6rZajohZbdsBTLw+PHjo3E=
 git.i2edu.net/i2/go-zero v1.0.0/go.mod h1:a9idDtfMmMXrZIHyDg6XnYjWuCpKG0I6zv6Vo9Fpncc=
 git.i2edu.net/i2/go-zero v1.0.1-0.20210616091154-7fac117e009f h1:zD6rIG7+PhJwYXuQbHyw1pn/z5oUXzrUg9bo9F9+b5k=
 git.i2edu.net/i2/go-zero v1.0.1-0.20210616091154-7fac117e009f/go.mod h1:a9idDtfMmMXrZIHyDg6XnYjWuCpKG0I6zv6Vo9Fpncc=
@@ -40,6 +41,7 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee
 github.com/coreos/go-systemd/v22 v22.0.0 h1:XJIw/+VlJ+87J+doOxznsAWIdmWuViOVhkQamW5YV28=
 github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
 github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -49,6 +51,7 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumC
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4 h1:qk/FSDDxo05wdJH28W+p5yivv7LuLYLRXPPD8KQCtZs=
 github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/emicklei/proto v1.9.0 h1:l0QiNT6Qs7Yj0Mb4X6dnWBQer4ebei2BFcgQLbGqUDc=
 github.com/emicklei/proto v1.9.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@@ -56,6 +59,7 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
+github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
 github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
 github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
@@ -128,6 +132,7 @@ github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplb
 github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/iancoleman/strcase v0.1.2/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
+github.com/iancoleman/strcase v0.1.3 h1:dJBk1m2/qjL1twPLf68JND55vvivMupZ4wIzE8CTdBw=
 github.com/iancoleman/strcase v0.1.3/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
@@ -155,6 +160,7 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8=
 github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
@@ -212,6 +218,7 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So
 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
@@ -237,13 +244,16 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1
 github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6 h1:lYIiVDtZnyTWlNwiAxLj0bbpTcx1BWCFhXjfsvmPdNc=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU=
 github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 h1:zzrxE1FKn5ryBNl9eKOeqQ58Y/Qpo3Q9QNxKHX5uzzQ=
 github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb h1:ZkM6LRnq40pR1Ox0hTHlnpkcOTuFIDQpZ1IN8rKKhX0=
 github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ=
+github.com/zeromicro/antlr v0.0.1 h1:CQpIn/dc0pUjgGQ81y98s/NGOm2Hfru2NNio2I9mQgk=
 github.com/zeromicro/antlr v0.0.1/go.mod h1:nfpjEwFR6Q4xGDJMcZnCL9tEfQRgszMwu3rDz2Z+p5M=
 go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg=
 go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=

+ 3 - 2
i2bill.api

@@ -42,12 +42,13 @@ type ResUserInfo {
 }
 
 type authLoginBody {
-	Code     string      `json:"code"`
-	UserInfo ResUserInfo `json:"userInfo"`
+	Code string `json:"code"`
+	// UserInfo ResUserInfo `json:"userInfo"`
 }
 
 type AuthUserInfo {
 	ID       int64  `json:"id"`
+	Mobile   string `json:"mobile"`
 	UserName string `json:"username"`
 	NickName string `json:"nickname"`
 	Gender   int64  `json:"gender"`

+ 3 - 4
internal/handler/loginbyweixinhandler.go

@@ -17,13 +17,12 @@ func LoginByWeixinHandler(ctx *svc.ServiceContext) http.HandlerFunc {
 			httpx.Error(w, err)
 			return
 		}
-
 		l := logic.NewLoginByWeixinLogic(r.Context(), ctx)
-		AuthResponse, err := l.LoginByWeixin(req)
+		res, err := l.LoginByWeixin(req)
 		if err != nil {
-			httpx.Error(w, err)
+			httpx.OkJson(w, utils.ReturnHTTPFail(err))
 		} else {
-			httpx.OkJson(w, utils.ReturnHTTPSuccess(AuthResponse))
+			httpx.OkJson(w, utils.ReturnHTTPSuccess(res))
 		}
 	}
 }

+ 46 - 69
internal/logic/loginbyweixinlogic.go

@@ -2,21 +2,16 @@ package logic
 
 import (
 	"context"
-	"crypto/sha1"
-	"encoding/base64"
-	"encoding/hex"
-	"encoding/json"
-	"errors"
 	"fmt"
 	"time"
 
 	"git.i2edu.net/i2/go-zero/core/logx"
 	"git.i2edu.net/i2/go-zero/core/stores/sqlc"
+	"git.i2edu.net/i2/go-zero/core/stores/sqlx"
 	"git.i2edu.net/i2/i2-bill-api/internal/svc"
 	"git.i2edu.net/i2/i2-bill-api/internal/types"
 	"git.i2edu.net/i2/i2-bill-api/internal/utils"
 	"git.i2edu.net/i2/i2-bill-api/model"
-	"git.i2edu.net/i2/i2-bill-erp/transformclient"
 	"github.com/dgrijalva/jwt-go"
 )
 
@@ -35,49 +30,57 @@ func NewLoginByWeixinLogic(ctx context.Context, svcCtx *svc.ServiceContext) Logi
 }
 
 func (l *LoginByWeixinLogic) LoginByWeixin(req types.AuthLoginBody) (*types.AuthResponse, error) {
-	alb := req
-	userInfo, err := l.Login(alb.Code, alb.UserInfo)
+	alb, rtnInfo := req, types.AuthResponse{}
+	userInfo, err := l.Login(alb.Code)
 	if err != nil {
 		return nil, err
 	}
-
-	// l.svcCtx.RdCli.GetCache()
-	resp, err := l.svcCtx.Transformer.GetUser(l.ctx, &transformclient.Request{
-		Id: "0909",
+	err = l.svcCtx.SqlConn.Transact(func(session sqlx.Session) error {
+		var user model.User
+		err := session.QueryRow(&user, fmt.Sprintf("select %s from user where `weixin_openid` = ? limit 1", model.UserRows), userInfo.OpenID)
+		if err == sqlc.ErrNotFound {
+			user.Username = utils.GetUUID()
+			user.Password = ""
+			user.RegisterTime = utils.GetTimestamp()
+			user.RegisterIp = ""
+			user.Mobile = ""
+			user.WeixinOpenid = userInfo.OpenID
+			user.Avatar = userInfo.AvatarUrl
+			user.Gender = userInfo.Gender
+			user.Nickname = userInfo.NickName
+			_, err = session.Exec(fmt.Sprintf("insert into user (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", model.UserRowsExpectAutoSet), user.Mobile, user.Avatar, user.WeixinOpenid, user.Password, user.Birthday, user.RegisterTime, user.LastLoginTime, user.Nickname, user.Username, user.Gender, user.UserLevelId, user.RegisterIp, user.LastLoginIp)
+			if err != nil {
+				return err
+			}
+			err = session.QueryRow(&user, fmt.Sprintf("select %s from user where `weixin_openid` = ? limit 1", model.UserRows), userInfo.OpenID)
+			if err != nil {
+				return err
+			}
+		}
+
+		rtnInfo.UserInfo.ID = user.Id
+		rtnInfo.UserInfo.UserName = user.Username
+		rtnInfo.UserInfo.NickName = user.Nickname
+		rtnInfo.UserInfo.Mobile = user.Mobile
+		rtnInfo.UserInfo.Gender = user.Gender
+		rtnInfo.UserInfo.Avatar = user.Avatar
+		rtnInfo.UserInfo.Birthday = user.Birthday
+
+		user.LastLoginIp = ""
+		user.LastLoginTime = utils.GetTimestamp()
+		_, err = session.Exec(fmt.Sprintf("update user set %s where `id` = ?", model.UserRowsWithPlaceHolder), user.Mobile, user.Avatar, user.WeixinOpenid, user.Password, user.Birthday, user.RegisterTime, user.LastLoginTime, user.Nickname, user.Username, user.Gender, user.UserLevelId, user.RegisterIp, user.LastLoginIp, user.Id)
+		if err != nil {
+			return err
+		}
+		return nil
 	})
 	if err != nil {
 		return nil, err
 	}
-	fmt.Println(resp.Roles)
-
-	user, err := l.svcCtx.UserModel.FindOneByWeiXinOpenId(userInfo.OpenID)
-	if err == sqlc.ErrNotFound {
-		newuser := model.User{Username: utils.GetUUID(), Password: "", RegisterTime: utils.GetTimestamp(),
-			RegisterIp: "", Mobile: "", WeixinOpenid: userInfo.OpenID, Avatar: userInfo.AvatarUrl, Gender: userInfo.Gender,
-			Nickname: userInfo.NickName}
-		l.svcCtx.UserModel.Insert(newuser)
-		user, _ = l.svcCtx.UserModel.FindOneByWeiXinOpenId(userInfo.OpenID)
-	}
-
-	rtnInfo := types.AuthResponse{}
-	rtnInfo.UserInfo.ID = user.Id
-	rtnInfo.UserInfo.UserName = user.Username
-	rtnInfo.UserInfo.NickName = user.Nickname
-	rtnInfo.UserInfo.Gender = user.Gender
-	rtnInfo.UserInfo.Avatar = user.Avatar
-	rtnInfo.UserInfo.Birthday = user.Birthday
-
-	user.LastLoginIp = ""
-	user.LastLoginTime = utils.GetTimestamp()
-
-	if err := l.svcCtx.UserModel.Update(*user); err == nil {
-		return nil, err
-	}
-
 	var accessExpire = l.svcCtx.Config.JwtAuth.AccessExpire
 	now := time.Now().Unix()
 	payloads := map[string]interface{}{
-		"user_id": user.Id,
+		"user_id": rtnInfo.UserInfo.ID,
 	}
 	accessToken, err := l.CreateJWT(now, l.svcCtx.Config.JwtAuth.AccessSecret, payloads, accessExpire)
 	if err != nil {
@@ -94,17 +97,14 @@ func (l *LoginByWeixinLogic) CreateJWT(iat int64, secretKey string, payloads map
 	for k, v := range payloads {
 		claims[k] = v
 	}
-
 	token := jwt.New(jwt.SigningMethodHS256)
 	token.Claims = claims
 	return token.SignedString([]byte(secretKey))
 }
 
-func (l *LoginByWeixinLogic) Login(code string, fullUserInfo types.ResUserInfo) (*types.WXUserInfo, error) {
-
+func (l *LoginByWeixinLogic) Login(code string) (*types.WXUserInfo, error) {
 	secret := l.svcCtx.Config.Weixin.Secret
 	appid := l.svcCtx.Config.Weixin.Appid
-
 	req := utils.Get("https://api.weixin.qq.com/sns/jscode2session")
 	req.Param("grant_type", "authorization_code")
 	req.Param("js_code", code)
@@ -114,36 +114,13 @@ func (l *LoginByWeixinLogic) Login(code string, fullUserInfo types.ResUserInfo)
 	var res types.WXLoginResponse
 	req.ToJSON(&res)
 
-	s := sha1.New()
-	s.Write([]byte(fullUserInfo.RawData + res.SessionKey))
-	sha1 := s.Sum(nil)
-	sha1hash := hex.EncodeToString(sha1)
-
-	if fullUserInfo.Signature != sha1hash {
-		return nil, errors.New("signature err")
-	}
-	userinfo, err := l.DecryptUserInfoData(res.SessionKey, fullUserInfo.EncryptedData, fullUserInfo.IV)
-
+	userinfo, err := l.DecryptUserInfoData(res.SessionKey)
+	userinfo.OpenID = res.OpenID
 	return userinfo, err
 
 }
 
-func (l *LoginByWeixinLogic) DecryptUserInfoData(sessionKey string, encryptedData string, iv string) (*types.WXUserInfo, error) {
-
-	sk, _ := base64.StdEncoding.DecodeString(sessionKey)
-	ed, _ := base64.StdEncoding.DecodeString(encryptedData)
-	i, _ := base64.StdEncoding.DecodeString(iv)
-
-	decryptedData, err := utils.AesCBCDecrypt(ed, sk, i)
-
-	if err != nil {
-		return nil, err
-	}
-
+func (l *LoginByWeixinLogic) DecryptUserInfoData(sessionKey string) (*types.WXUserInfo, error) {
 	var wxuserinfo types.WXUserInfo
-	err = json.Unmarshal(decryptedData, &wxuserinfo)
-	if err != nil {
-		return nil, err
-	}
 	return &wxuserinfo, nil
 }

+ 3 - 1
internal/svc/servicecontext.go

@@ -73,6 +73,7 @@ func (wc *Wechat) GetQrCode(scene, page string) (string, error) {
 
 type ServiceContext struct {
 	Config      config.Config
+	SqlConn     sqlx.SqlConn
 	UserModel   model.UserModel
 	RdCli       RdCli
 	Wechat      *Wechat
@@ -82,9 +83,10 @@ type ServiceContext struct {
 func NewServiceContext(c config.Config) *ServiceContext {
 	svc := &ServiceContext{
 		Config:      c,
+		SqlConn:     sqlx.NewMysql(c.DataSource),
 		Transformer: transformclient.NewTransform(zrpc.MustNewClient(c.Transform)),
-		UserModel:   model.NewUserModel(sqlx.NewMysql(c.DataSource), c.Cache),
 	}
+	svc.UserModel = model.NewUserModel(svc.SqlConn, c.Cache)
 	svc.RdCli = svc.UserModel.CacheStorage()
 	svc.Wechat = &Wechat{
 		RdCli: svc.RdCli,

+ 2 - 2
internal/types/types.go

@@ -36,12 +36,12 @@ type ResUserInfo struct {
 }
 
 type AuthLoginBody struct {
-	Code     string      `json:"code"`
-	UserInfo ResUserInfo `json:"userInfo"`
+	Code string `json:"code"`
 }
 
 type AuthUserInfo struct {
 	ID       int64  `json:"id"`
+	Mobile   string `json:"mobile"`
 	UserName string `json:"username"`
 	NickName string `json:"nickname"`
 	Gender   int64  `json:"gender"`

+ 8 - 0
internal/utils/resp.go

@@ -14,3 +14,11 @@ func ReturnHTTPSuccess(val interface{}) HTTPData {
 	}
 	return rtndata
 }
+
+func ReturnHTTPFail(err error) HTTPData {
+	rtndata := HTTPData{
+		ErrNo:  500,
+		ErrMsg: err.Error(),
+	}
+	return rtndata
+}

+ 10 - 10
model/usermodel.go

@@ -14,10 +14,10 @@ import (
 )
 
 var (
-	userFieldNames          = builderx.RawFieldNames(&User{})
-	userRows                = strings.Join(userFieldNames, ",")
-	userRowsExpectAutoSet   = strings.Join(stringx.Remove(userFieldNames, "`id`", "`create_time`", "`update_time`"), ",")
-	userRowsWithPlaceHolder = strings.Join(stringx.Remove(userFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?"
+	UserFieldNames          = builderx.RawFieldNames(&User{})
+	UserRows                = strings.Join(UserFieldNames, ",")
+	UserRowsExpectAutoSet   = strings.Join(stringx.Remove(UserFieldNames, "`id`", "`create_time`", "`update_time`"), ",")
+	UserRowsWithPlaceHolder = strings.Join(stringx.Remove(UserFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?"
 
 	cacheUserIdPrefix           = "cache:user:id:"
 	cacheUserUsernamePrefix     = "cache:user:username:"
@@ -73,7 +73,7 @@ func NewUserModel(conn sqlx.SqlConn, c cache.CacheConf) UserModel {
 func (m *defaultUserModel) Insert(data User) (sql.Result, error) {
 	userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, data.Username)
 	ret, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
-		query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, userRowsExpectAutoSet)
+		query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, UserRowsExpectAutoSet)
 		return conn.Exec(query, data.Mobile, data.Avatar, data.WeixinOpenid, data.Password, data.Birthday, data.RegisterTime, data.LastLoginTime, data.Nickname, data.Username, data.Gender, data.UserLevelId, data.RegisterIp, data.LastLoginIp)
 	}, userUsernameKey)
 	return ret, err
@@ -83,7 +83,7 @@ func (m *defaultUserModel) FindOne(id int64) (*User, error) {
 	userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, id)
 	var resp User
 	err := m.QueryRow(&resp, userIdKey, func(conn sqlx.SqlConn, v interface{}) error {
-		query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", userRows, m.table)
+		query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", UserRows, m.table)
 		return conn.QueryRow(v, query, id)
 	})
 	switch err {
@@ -100,7 +100,7 @@ func (m *defaultUserModel) FindOneByWeiXinOpenId(id string) (*User, error) {
 	userIdKey := fmt.Sprintf("%s%v", cacheUserWeiXinOpenIdPrefix, id)
 	var resp User
 	err := m.QueryRow(&resp, userIdKey, func(conn sqlx.SqlConn, v interface{}) error {
-		query := fmt.Sprintf("select %s from %s where `weixin_openid` = ? limit 1", userRows, m.table)
+		query := fmt.Sprintf("select %s from %s where `weixin_openid` = ? limit 1", UserRows, m.table)
 		return conn.QueryRow(v, query, id)
 	})
 	switch err {
@@ -117,7 +117,7 @@ func (m *defaultUserModel) FindOneByUsername(username string) (*User, error) {
 	userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, username)
 	var resp User
 	err := m.QueryRowIndex(&resp, userUsernameKey, m.formatPrimary, func(conn sqlx.SqlConn, v interface{}) (i interface{}, e error) {
-		query := fmt.Sprintf("select %s from %s where `username` = ? limit 1", userRows, m.table)
+		query := fmt.Sprintf("select %s from %s where `username` = ? limit 1", UserRows, m.table)
 		if err := conn.QueryRow(&resp, query, username); err != nil {
 			return nil, err
 		}
@@ -137,7 +137,7 @@ func (m *defaultUserModel) Update(data User) error {
 	userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, data.Id)
 	userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, data.Username)
 	_, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
-		query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, userRowsWithPlaceHolder)
+		query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, UserRowsWithPlaceHolder)
 		return conn.Exec(query, data.Mobile, data.Avatar, data.WeixinOpenid, data.Password, data.Birthday, data.RegisterTime, data.LastLoginTime, data.Nickname, data.Username, data.Gender, data.UserLevelId, data.RegisterIp, data.LastLoginIp, data.Id)
 	}, userIdKey, userUsernameKey)
 	return err
@@ -163,7 +163,7 @@ func (m *defaultUserModel) formatPrimary(primary interface{}) string {
 }
 
 func (m *defaultUserModel) queryPrimary(conn sqlx.SqlConn, v, primary interface{}) error {
-	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", userRows, m.table)
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", UserRows, m.table)
 	return conn.QueryRow(v, query, primary)
 }