diff --git a/main.go b/main.go index f2b68a5..bd069c7 100644 --- a/main.go +++ b/main.go @@ -13,15 +13,15 @@ func init() { } func main() { + // 加载配置 + config.SetupConfig() + // 初始化数据库 err := dao.Conn() if err != nil { golog.Fatal("数据库初始化失败: ", err) } - // 加载配置 - config.SetupConfig() - // 启动服务 app := router.Router() app.Run(iris.Addr(":8080")) diff --git a/model/user.go b/model/user.go index 4b0fdd7..4a00262 100644 --- a/model/user.go +++ b/model/user.go @@ -2,6 +2,9 @@ package model import ( "drive-linked/pkg/dao" + "fmt" + "github.com/jmoiron/sqlx" + "strings" ) type User struct { @@ -15,18 +18,22 @@ type User struct { Roles string `json:"roles"` } -func (user *User) GetByName(name string) (err error) { - err = dao.DB.Get(user, "SELECT * FROM users WHERE name=?", name) - if err != nil { - return err - } - return nil -} +func (user *User) GetWithConditions(conditions *map[string]interface{}) error { + // 支持多条件查询 + //TODO:分离多条件查询部分,有利于代码复用 + var where []string + var values []interface{} -func (user *User) GetByEmail(email string) (err error) { - err = dao.DB.Get(user, "SELECT * FROM users WHERE email=?", email) + for k, v := range *conditions { + values = append(values, v) + where = append(where, fmt.Sprintf(`"%s" = %s`, k, "?")) + } + + exec := sqlx.Rebind(sqlx.QUESTION, `SELECT * FROM users WHERE `+strings.Join(where, "AND")+" LIMIT 1") + err := dao.DB.Get(user, exec, values...) if err != nil { return err } + return nil } diff --git a/model/user_test.go b/model/user_test.go index 82c7089..0acd68f 100644 --- a/model/user_test.go +++ b/model/user_test.go @@ -1,30 +1,22 @@ package model import ( - "database/sql" "drive-linked/pkg/dao" "testing" ) -func init() { - err := dao.Conn() - if err != nil { - return - } -} +func TestUser_GetWithConditions(t *testing.T) { + dao.Conn() -func TestUser_GetUser(t *testing.T) { var user User // 存在的用户 - err := user.GetByName("eigeen") + conditions := &map[string]interface{}{ + "name": "eigeen", + "email": "375109735@qq.com", + } + err := user.GetWithConditions(conditions) if err != nil { t.Error(err) } t.Log(user) - - // 不存在的用户 - err = user.GetByName("unknown_user") - if err != sql.ErrNoRows { - t.Error(err) - } } diff --git a/pkg/common/token.go b/pkg/common/token.go index 118d0ba..01a4268 100644 --- a/pkg/common/token.go +++ b/pkg/common/token.go @@ -3,7 +3,6 @@ package common import ( "drive-linked/config" "github.com/golang-jwt/jwt/v4" - "strings" "time" ) @@ -13,16 +12,8 @@ type JwtClaims struct { } //TODO:token解密验证 -func ValidateLogin(authorization string) error { - // 取出Bearer后的内容 - var tokenString string - if auths := strings.Split(authorization, " "); len(auths) > 1 { - tokenString = auths[1] - } else { - return jwt.ErrInvalidKey - } - - token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { +func VerifyToken(authorization string) error { + token, err := jwt.Parse(authorization, func(token *jwt.Token) (interface{}, error) { return []byte(config.Cfg.Security.Jwt.Secret), nil }) diff --git a/pkg/common/token_test.go b/pkg/common/token_test.go index e26455a..ba51c51 100644 --- a/pkg/common/token_test.go +++ b/pkg/common/token_test.go @@ -19,7 +19,7 @@ func TestValidateLogin(t *testing.T) { config.SetupConfig() tokenString, _ := NewToken("eigeen") - err := ValidateLogin(tokenString) + err := VerifyToken(tokenString) if err == nil { t.Log("验证通过") } else { diff --git a/pkg/controller/usersController.go b/pkg/controller/usersController.go deleted file mode 100644 index 5aecee2..0000000 --- a/pkg/controller/usersController.go +++ /dev/null @@ -1,38 +0,0 @@ -package controller - -import ( - "drive-linked/pkg/dto" - "drive-linked/pkg/service" - "encoding/json" - "github.com/kataras/iris/v12" - "io/ioutil" - "net/http" -) - -func UserProfile(ctx iris.Context) { - serv := service.NewUsersService(ctx) - - switch ctx.Request().Method { - // GET - case http.MethodGet: - serv.GetOneUser(ctx.Params().GetString("name"), service.MethodUserName) - return - // POST - case http.MethodPost: - //TODO:错误处理 - body, err := ioutil.ReadAll(ctx.Request().Body) - if err != nil { - return - } - - var req dto.QueryUserParams - err = json.Unmarshal(body, &req) - if err != nil { - return - } - - serv.GetOneUser(req.Value, req.Method) - return - } - -} diff --git a/pkg/dao/sentences.go b/pkg/dao/sentences.go new file mode 100644 index 0000000..19bfcc7 --- /dev/null +++ b/pkg/dao/sentences.go @@ -0,0 +1,37 @@ +package dao + +import ( + "fmt" + "strings" +) + +type Conditions *map[string]interface{} + +//TODO:未完成的sql语句构建器 +type QuerySql struct { + Table string + Tail string + Conditions Conditions + Rebind int + body string +} + +func (b *QuerySql) Build() { + + if b.Conditions == nil { + + } + var where []string + var values []interface{} + + for k, v := range *b.Conditions { + values = append(values, v) + where = append(where, fmt.Sprintf(`"%s"=%s`, k, "?")) + } + + b.body = "SELECT * FROM " + b.Table + " WHERE " + strings.Join(where, "AND") +} + +func (b *QuerySql) String() { + +} diff --git a/pkg/dto/response.go b/pkg/dto/response.go index 1623739..5f31802 100644 --- a/pkg/dto/response.go +++ b/pkg/dto/response.go @@ -2,6 +2,7 @@ package dto import ( "drive-linked/pkg/serializer" + "github.com/kataras/golog" "github.com/kataras/iris/v12" "net/http" ) @@ -10,21 +11,18 @@ type Response struct { Ctx iris.Context } +const errJsonUnmarshalMsg = "{\"code\":500,\"msg\":\"Json解析错误,请联系管理员\",\"data\":null}" + func NewResponse(ctx iris.Context) *Response { return &Response{Ctx: ctx} } -const errJsonUnmarshalMsg = "{\"code\":500,\"msg\":\"Json解析错误,请联系管理员\",\"data\":null}" - // 成功 统一处理 func (r *Response) Success(data interface{}) { - res := serializer.Response{ - Code: 200, - Msg: "", - Data: data, - } - _, err := r.Ctx.JSON(res) + resp := serializer.ResponseSerial{Code: http.StatusOK, Data: data} + _, err := r.Ctx.JSON(resp) if err != nil { + golog.Error("Json解析错误: ", resp) r.Ctx.Write([]byte(errJsonUnmarshalMsg)) return } @@ -32,12 +30,8 @@ func (r *Response) Success(data interface{}) { // 失败 统一处理 func (r *Response) Error(code int, msg string) { - res := serializer.Response{ - Code: code, - Msg: msg, - Data: nil, - } - _, err := r.Ctx.JSON(res) + resp := serializer.ResponseSerial{Code: code, Msg: msg} + _, err := r.Ctx.JSON(resp) if err != nil { r.Ctx.Write([]byte(errJsonUnmarshalMsg)) return diff --git a/pkg/middleware/auth.go b/pkg/middleware/verify.go similarity index 67% rename from pkg/middleware/auth.go rename to pkg/middleware/verify.go index ebd0312..37abf82 100644 --- a/pkg/middleware/auth.go +++ b/pkg/middleware/verify.go @@ -4,14 +4,23 @@ import ( "drive-linked/pkg/common" "drive-linked/pkg/dto" "github.com/kataras/iris/v12" + "strings" ) func SignRequired(ctx iris.Context) { auth := ctx.GetHeader("Authorization") //TODO:更详细的判断,包括请求格式是否正确 + // 取出Bearer后的内容 + var tokenString string + if auths := strings.Split(auth, " "); len(auths) > 1 { + tokenString = auths[1] + } else { + ctx.Skip() + } + // 验证token - err := common.ValidateLogin(auth) + err := common.VerifyToken(tokenString) if err == nil { ctx.Values().Set("logged_in", true) ctx.Next() diff --git a/pkg/serializer/response.go b/pkg/serializer/response.go index 4574c5c..092ef14 100644 --- a/pkg/serializer/response.go +++ b/pkg/serializer/response.go @@ -1,8 +1,6 @@ package serializer -import "net/http" - -type Response struct { +type ResponseSerial struct { Code int `json:"code"` Msg string `json:"msg"` Data interface{} `json:"data"` @@ -10,17 +8,9 @@ type Response struct { /* 自定义错误码 -10000 用户操作 +40000 业务逻辑错误 +50000 服务器操作 */ const ( - ErrNoUser = 10001 + ErrNoUser = 40001 ) - -func Success(data interface{}) Response { - r := Response{ - Code: http.StatusOK, - Msg: "", - Data: data, - } - return r -} diff --git a/pkg/service/controller/usersController.go b/pkg/service/controller/usersController.go new file mode 100644 index 0000000..46994eb --- /dev/null +++ b/pkg/service/controller/usersController.go @@ -0,0 +1,20 @@ +package controller + +import ( + "drive-linked/pkg/service" + "github.com/kataras/iris/v12" +) + +func UserProfile(ctx iris.Context) { + serv := service.NewUsersService(ctx) + + // 获取所有查询条件参数 + var conditions map[string]interface{} + for _, field := range service.UserConditions { + if ctx.Params().GetString(field) != "" { + conditions[field] = ctx.Params().GetString(field) + } + } + serv.GetOneUser(&conditions) + ctx.Next() +} diff --git a/pkg/service/users.go b/pkg/service/users.go index c59b756..319442b 100644 --- a/pkg/service/users.go +++ b/pkg/service/users.go @@ -13,26 +13,20 @@ type UsersService struct { Ctx iris.Context } -const ( - MethodUserName = "name" - MethodUserEmail = "email" +var ( + UserConditions = [...]string{"id", "name", "email", "nickname"} ) func NewUsersService(ctx iris.Context) *UsersService { return &UsersService{Ctx: ctx} } -func (serv *UsersService) GetOneUser(field, method string) { +func (serv *UsersService) GetOneUser(conditions *map[string]interface{}) { var err error resp := dto.NewResponse(serv.Ctx) user := &model.User{} - switch method { - case MethodUserName: - err = user.GetByName(field) - case MethodUserEmail: - err = user.GetByEmail(field) - } + err = user.GetWithConditions(conditions) switch err { case nil: diff --git a/router/router.go b/router/router.go index c7dc997..ccfe3f3 100644 --- a/router/router.go +++ b/router/router.go @@ -1,8 +1,8 @@ package router import ( - "drive-linked/pkg/controller" "drive-linked/pkg/middleware" + "drive-linked/pkg/service/controller" "github.com/kataras/iris/v12" ) @@ -20,8 +20,7 @@ func Router() *iris.Application { // 需要登录 users.Use(middleware.SignRequired) // 用户详细信息 - users.Get("/profile/{name:string}", controller.UserProfile) - users.Post("/profile", controller.UserProfile) + users.Get("/profile", controller.UserProfile) }) return app }