This commit is contained in:
suyl
2021-07-07 18:07:12 +08:00
parent 4453ed80f5
commit ecbded38dc
9 changed files with 180 additions and 76 deletions

View File

@@ -0,0 +1,37 @@
package controllers
import (
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/model"
"git.rosy.net.cn/jx-print/services"
"git.rosy.net.cn/jx-print/utils"
"github.com/gin-gonic/gin"
"net/http"
)
//查询账号下的app GET
func GetApps(c *gin.Context) {
var (
b, ok bool
token string
user *model.User
)
globals.SugarLogger.Debugf("Begin API :%s params: %v ip: %s", c.Request.URL, c.Params, c.ClientIP())
if token, b = checkToken(c); !b {
return
}
if user, ok = utils.GetKet(token).(*model.User); !ok {
c.JSON(http.StatusOK, &CallBack{
Code: model.ErrCodeToken,
Desc: "token 过期或无效!",
})
return
}
if !callFunc(c, func() (retVal interface{}, errCode string, err error) {
retVal, err = services.GetApps(c, user)
return retVal, "", err
}) {
return
}
return
}

View File

@@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"git.rosy.net.cn/jx-print/globals" "git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/model" "git.rosy.net.cn/jx-print/model"
"git.rosy.net.cn/jx-print/utils"
"github.com/dchest/captcha" "github.com/dchest/captcha"
"github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@@ -22,35 +23,43 @@ func init() {
globals.SugarLogger.Debugf("test init ...") globals.SugarLogger.Debugf("test init ...")
} }
func checkToken(c *gin.Context) (token string, b bool) {
var (
cookie *http.Cookie
err error
)
//验证token
//v2下的接口需要验证v1不需要
if !strings.Contains(c.Request.URL.String(), "v1") {
if cookie, err = c.Request.Cookie("token"); err != nil {
c.JSON(http.StatusOK, &CallBack{
Desc: err.Error(),
Code: model.ErrCodeNormal,
})
return "", false
} else {
token = cookie.Value
}
if user := utils.GetKet(token); user == nil {
err = fmt.Errorf("token过期或无效请重新登录")
c.JSON(http.StatusOK, &CallBack{
Desc: err.Error(),
Code: model.ErrCodeToken,
})
return "", false
}
}
return token, true
}
func callFunc(c *gin.Context, worker func() (retVal interface{}, errCode string, err error)) bool { func callFunc(c *gin.Context, worker func() (retVal interface{}, errCode string, err error)) bool {
var ( var (
err error err error
callBack = &CallBack{ callBack = &CallBack{
Code: model.ErrCodeNormal, Code: model.ErrCodeNormal,
} }
token string
cookie *http.Cookie
result interface{} result interface{}
) )
//验证token
//v2下的接口需要验证v1不需要
if !strings.Contains(c.Request.URL.String(), "v1") {
if cookie, err = c.Request.Cookie("token"); err != nil {
callBack.Desc = err.Error()
c.JSON(http.StatusOK, callBack)
return false
} else {
token = cookie.Value
}
fmt.Println(token)
//if user := putils.GetKet(token); user == nil {
// err = fmt.Errorf("token过期或无效请重新登录")
// callBack.Desc = err.Error()
// callBack.Code = model.ErrCodeToken
// c.JSON(http.StatusOK, callBack)
// return false
//}
}
if result, _, err = worker(); err == nil { if result, _, err = worker(); err == nil {
if result != nil { if result != nil {
if data, err := json.Marshal(&result); err == nil { if data, err := json.Marshal(&result); err == nil {

View File

@@ -34,6 +34,9 @@ func GetUsers(c *gin.Context) {
}) })
return return
} }
if _, b := checkToken(c); !b {
return
}
if !callFunc(c, func() (retVal interface{}, errCode string, err error) { if !callFunc(c, func() (retVal interface{}, errCode string, err error) {
retVal, err = services.GetUsers(c, user.UserID, user.Name, user.Mobile) retVal, err = services.GetUsers(c, user.UserID, user.Name, user.Mobile)
return retVal, "", err return retVal, "", err
@@ -116,22 +119,15 @@ func Login(c *gin.Context) {
//自动登录获取token POST //自动登录获取token POST
func GetTokenInfo(c *gin.Context) { func GetTokenInfo(c *gin.Context) {
var ( var (
err error token string
user = &struct { b bool
Token string `json:"token" form:"token" binding:"required"`
}{}
) )
globals.SugarLogger.Debugf("Begin API :%s params: %v ip: %s", c.Request.URL, c.Params, c.ClientIP()) globals.SugarLogger.Debugf("Begin API :%s params: %v ip: %s", c.Request.URL, c.Params, c.ClientIP())
if err = c.Bind(&user); err != nil { if token, b = checkToken(c); !b {
c.JSON(http.StatusOK, &CallBack{
Code: model.ErrCodeNormal,
Desc: err.Error(),
})
globals.SugarLogger.Debugf("End API :%s error:%v:", c.Request.URL, err)
return return
} }
if !callFunc(c, func() (retVal interface{}, errCode string, err error) { if !callFunc(c, func() (retVal interface{}, errCode string, err error) {
retVal, err = services.GetTokenInfo(c, user.Token) retVal, err = services.GetTokenInfo(c, token)
return retVal, "", err return retVal, "", err
}) { }) {
return return
@@ -142,22 +138,14 @@ func GetTokenInfo(c *gin.Context) {
//登出删token POST //登出删token POST
func Logout(c *gin.Context) { func Logout(c *gin.Context) {
var ( var (
err error token string
user = &struct { b bool
Token string `json:"token" form:"token" binding:"required"`
}{}
) )
globals.SugarLogger.Debugf("Begin API :%s params: %v ip: %s", c.Request.URL, c.Params, c.ClientIP()) if token, b = checkToken(c); !b {
if err = c.Bind(&user); err != nil {
c.JSON(http.StatusOK, &CallBack{
Code: model.ErrCodeNormal,
Desc: err.Error(),
})
globals.SugarLogger.Debugf("End API :%s error:%v:", c.Request.URL, err)
return return
} }
if !callFunc(c, func() (retVal interface{}, errCode string, err error) { if !callFunc(c, func() (retVal interface{}, errCode string, err error) {
err = services.Logout(c, user.Token) err = services.Logout(c, token)
return retVal, "", err return retVal, "", err
}) { }) {
return return
@@ -182,6 +170,9 @@ func UpdateUser(c *gin.Context) {
globals.SugarLogger.Debugf("End API :%s error:%v:", c.Request.URL, err) globals.SugarLogger.Debugf("End API :%s error:%v:", c.Request.URL, err)
return return
} }
if _, b := checkToken(c); !b {
return
}
if !callFunc(c, func() (retVal interface{}, errCode string, err error) { if !callFunc(c, func() (retVal interface{}, errCode string, err error) {
err = services.UpdateUser(c, user.Payload) err = services.UpdateUser(c, user.Payload)
return retVal, "", err return retVal, "", err

23
dao/app_dao.go Normal file
View File

@@ -0,0 +1,23 @@
package dao
import (
"git.rosy.net.cn/jx-print/model"
"github.com/jmoiron/sqlx"
)
func GetApps(db *sqlx.DB, userID string) (apps []*model.Apps, err error) {
var sqlParams []interface{}
sql := `
SELECT *
FROM apps
WHERE 1 = 1
`
if userID != "" {
sql += " AND user_id = ?"
sqlParams = append(sqlParams, userID)
}
if err = db.Select(&apps, sql, sqlParams...); err == nil {
return apps, err
}
return apps, err
}

View File

@@ -30,6 +30,20 @@ func GetUsers(db *sqlx.DB, userID, name, mobile string) (users []*model.User, er
return users, err return users, err
} }
func GetUser(db *sqlx.DB, userID string) (user *model.User, err error) {
var users []*model.User
sql := `
SELECT *
FROM user
WHERE 1 = 1 AND user_id = ?
`
sqlParams := []interface{}{userID}
if err = db.Select(&users, sql, sqlParams...); err == nil {
return users[0], err
}
return users[0], err
}
func GetUserForLogin(db *sqlx.DB, name, password string) (user *model.User, err error) { func GetUserForLogin(db *sqlx.DB, name, password string) (user *model.User, err error) {
var users []*model.User var users []*model.User
sql := ` sql := `

View File

@@ -41,3 +41,43 @@ type ModelIDCULD struct {
LastOperator string `json:"last_operator" db:"last_operator"` LastOperator string `json:"last_operator" db:"last_operator"`
DeletedAt *time.Time `json:"deleted_at" db:"deleted_at"` DeletedAt *time.Time `json:"deleted_at" db:"deleted_at"`
} }
type User struct {
ID int `json:"id" db:"id"`
CreatedAt *time.Time `json:"created_at" db:"created_at"`
UpdatedAt *time.Time `json:"updated_at" db:"updated_at"`
LastOperator string `json:"last_operator" db:"last_operator"`
DeletedAt *time.Time `json:"deleted_at" db:"deleted_at"`
UserID string `json:"user_id" db:"user_id"` // 内部唯一标识
Password string `json:"password"` //密码
Name string `json:"name"` // 外部显示标识(当前可以重复)
Mobile string `json:"mobile"`
Email string `json:"email"`
Avatar string `json:"avatar"` // 头像
Status int8 `json:"status"`
Type int8 `json:"type"` // 用户类型
Company string `json:"company"` //公司名称
CityCode int `json:"city_code" db:"city_code"`
DistrictCode int `json:"district_code" db:"district_code"`
Address string `json:"address"`
IDCardNo string `json:"id_card_no" db:"id_card_no"` // 身份证号
Remark string `json:"remark"`
LastLoginAt *time.Time `json:"last_login_at" db:"last_login_at"`
LastLoginIP string `json:"last_login_ip" db:"last_login_ip"`
LastLoginType string `json:"last_login_type" db:"last_login_type"`
}
type Apps struct {
ID int `json:"id" db:"id"`
CreatedAt *time.Time `json:"created_at" db:"created_at"`
UpdatedAt *time.Time `json:"updated_at" db:"updated_at"`
LastOperator string `json:"last_operator" db:"last_operator"`
DeletedAt *time.Time `json:"deleted_at" db:"deleted_at"`
UserID string `json:"user_id" db:"user_id"` //属于哪个账号的
Name string `json:"name"` //应用名称
Type int `json:"type"` //应用类型
AppKey string `json:"app_key" db:"app_key"` //Key
Status int `json:"status"` //状态
}

View File

@@ -1,32 +0,0 @@
package model
import (
"time"
)
type User struct {
ID int `json:"id" db:"id"`
CreatedAt *time.Time `json:"created_at" db:"created_at"`
UpdatedAt *time.Time `json:"updated_at" db:"updated_at"`
LastOperator string `json:"last_operator" db:"last_operator"`
DeletedAt *time.Time `json:"deleted_at" db:"deleted_at"`
UserID string `json:"user_id" db:"user_id"` // 内部唯一标识
Password string `json:"password"` //密码
Name string `json:"name"` // 外部显示标识(当前可以重复)
Mobile string `json:"mobile"`
Email string `json:"email"`
Avatar string `json:"avatar"` // 头像
Status int8 `json:"status"`
Type int8 `json:"type"` // 用户类型
Company string `json:"company"` //公司名称
CityCode int `json:"city_code" db:"city_code"`
DistrictCode int `json:"district_code" db:"district_code"`
Address string `json:"address"`
IDCardNo string `json:"id_card_no" db:"id_card_no"` // 身份证号
Remark string `json:"remark"`
LastLoginAt *time.Time `json:"last_login_at" db:"last_login_at"`
LastLoginIP string `json:"last_login_ip" db:"last_login_ip"`
LastLoginType string `json:"last_login_type" db:"last_login_type"`
}

View File

@@ -13,6 +13,9 @@ func Init(r *gin.Engine) {
user.GET("/getTokenInfo", controllers.GetTokenInfo) user.GET("/getTokenInfo", controllers.GetTokenInfo)
user.GET("/logout", controllers.Logout) user.GET("/logout", controllers.Logout)
user.GET("/updateUser", controllers.UpdateUser) user.GET("/updateUser", controllers.UpdateUser)
//app
app := v2.Group("/app")
app.GET("/getApps", controllers.GetApps)
//v1是不需要token的 //v1是不需要token的
v1 := r.Group("v1") v1 := r.Group("v1")

19
services/app.go Normal file
View File

@@ -0,0 +1,19 @@
package services
import (
"fmt"
"git.rosy.net.cn/jx-print/dao"
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/model"
"github.com/gin-gonic/gin"
)
func GetApps(c *gin.Context, user *model.User) (apps []*model.Apps, err error) {
if user == nil {
return nil, fmt.Errorf("未获取到账号信息!")
}
if user.UserID == "" {
return nil, fmt.Errorf("账号信息有误,请重新登录!")
}
return dao.GetApps(globals.GetDB(), user.UserID)
}