delapp get menu

This commit is contained in:
suyl
2021-07-08 11:28:16 +08:00
parent 21737e5cd9
commit ace0d7e5f3
9 changed files with 143 additions and 65 deletions

View File

@@ -4,7 +4,6 @@ import (
"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/services" "git.rosy.net.cn/jx-print/services"
"git.rosy.net.cn/jx-print/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"net/http" "net/http"
) )
@@ -12,23 +11,14 @@ import (
//查询账号下的app GET //查询账号下的app GET
func GetApps(c *gin.Context) { func GetApps(c *gin.Context) {
var ( var (
b, ok bool tokenInfo *model.TokenInfo
token string
user *model.User
) )
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 token, b = checkToken(c); !b { if tokenInfo = checkToken(c); tokenInfo == nil {
return
}
if user, ok = utils.GetKet(token).(*model.User); !ok {
c.JSON(http.StatusOK, &CallBack{
Code: model.ErrCodeToken,
Desc: "token 过期或无效!",
})
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.GetApps(c, user) retVal, err = services.GetApps(c, tokenInfo.User.UserID)
return retVal, "", err return retVal, "", err
}) { }) {
return return
@@ -45,10 +35,8 @@ type AddAppParam struct {
//新建app POST //新建app POST
func AddApp(c *gin.Context) { func AddApp(c *gin.Context) {
var ( var (
tokenInfo *model.TokenInfo
err error err error
b, ok bool
token string
user *model.User
param = &AddAppParam{} param = &AddAppParam{}
) )
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())
@@ -60,18 +48,41 @@ func AddApp(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 token, b = checkToken(c); !b { if tokenInfo = checkToken(c); tokenInfo == nil {
return
}
if user, ok = utils.GetKet(token).(*model.User); !ok {
c.JSON(http.StatusOK, &CallBack{
Code: model.ErrCodeToken,
Desc: "token 过期或无效!",
})
return return
} }
if !callFunc(c, func() (retVal interface{}, errCode string, err error) { if !callFunc(c, func() (retVal interface{}, errCode string, err error) {
err = services.AddApp(c, param.Code, param.Name, param.Mobile, user.UserID) err = services.AddApp(c, param.Code, param.Name, param.Mobile, tokenInfo.User.UserID)
return retVal, "", err
}) {
return
}
return
}
//删除app POST
func DelApp(c *gin.Context) {
var (
err error
tokenInfo *model.TokenInfo
param = &struct {
AppID int `json:"app_id" form:"app_id" binding:"required"`
}{}
)
globals.SugarLogger.Debugf("Begin API :%s params: %v ip: %s", c.Request.URL, c.Params, c.ClientIP())
if err = c.Bind(&param); 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
}
if tokenInfo = checkToken(c); tokenInfo == nil {
return
}
if !callFunc(c, func() (retVal interface{}, errCode string, err error) {
err = services.DelApp(c, param.AppID, tokenInfo.User.UserID)
return retVal, "", err return retVal, "", err
}) { }) {
return return

View File

@@ -23,11 +23,14 @@ func init() {
globals.SugarLogger.Debugf("test init ...") globals.SugarLogger.Debugf("test init ...")
} }
func checkToken(c *gin.Context) (token string, b bool) { func checkToken(c *gin.Context) (tokenInfo *model.TokenInfo) {
var ( var (
cookie *http.Cookie cookie *http.Cookie
err error err error
ok bool
user *model.User
) )
tokenInfo = &model.TokenInfo{}
//验证token //验证token
//v2下的接口需要验证v1不需要 //v2下的接口需要验证v1不需要
if !strings.Contains(c.Request.URL.String(), "v1") { if !strings.Contains(c.Request.URL.String(), "v1") {
@@ -36,20 +39,21 @@ func checkToken(c *gin.Context) (token string, b bool) {
Desc: err.Error(), Desc: err.Error(),
Code: model.ErrCodeNormal, Code: model.ErrCodeNormal,
}) })
return "", false return nil
} else { } else {
token = cookie.Value tokenInfo.Token = cookie.Value
} }
if user := utils.GetKet(token); user == nil { if user, ok = utils.GetKet(tokenInfo.Token).(*model.User); !ok || user == nil {
err = fmt.Errorf("token过期或无效请重新登录") err = fmt.Errorf("token过期或无效请重新登录")
c.JSON(http.StatusOK, &CallBack{ c.JSON(http.StatusOK, &CallBack{
Desc: err.Error(), Desc: err.Error(),
Code: model.ErrCodeToken, Code: model.ErrCodeToken,
}) })
return "", false return nil
} }
tokenInfo.User = user
} }
return token, true return tokenInfo
} }
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 {

View File

@@ -1,6 +1,7 @@
package controllers package controllers
import ( import (
"encoding/json"
"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/services" "git.rosy.net.cn/jx-print/services"
@@ -34,7 +35,7 @@ func GetUsers(c *gin.Context) {
}) })
return return
} }
if _, b := checkToken(c); !b { if tokenInfo := checkToken(c); tokenInfo == nil {
return return
} }
if !callFunc(c, func() (retVal interface{}, errCode string, err error) { if !callFunc(c, func() (retVal interface{}, errCode string, err error) {
@@ -119,33 +120,31 @@ func Login(c *gin.Context) {
//自动登录获取token POST //自动登录获取token POST
func GetTokenInfo(c *gin.Context) { func GetTokenInfo(c *gin.Context) {
var ( var (
token string tokenInfo *model.TokenInfo
b bool
) )
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 token, b = checkToken(c); !b { if tokenInfo = checkToken(c); tokenInfo == nil {
return
}
if !callFunc(c, func() (retVal interface{}, errCode string, err error) {
retVal, err = services.GetTokenInfo(c, token)
return retVal, "", err
}) {
return return
} }
data, _ := json.Marshal(tokenInfo)
c.JSON(http.StatusOK, &CallBack{
Code: model.ErrCodeSuccess,
Data: string(data),
})
return return
} }
//登出删token POST //登出删token POST
func Logout(c *gin.Context) { func Logout(c *gin.Context) {
var ( var (
token string tokenInfo *model.TokenInfo
b bool
) )
if token, b = checkToken(c); !b { globals.SugarLogger.Debugf("Begin API :%s params: %v ip: %s", c.Request.URL, c.Params, c.ClientIP())
if tokenInfo = checkToken(c); tokenInfo == nil {
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, token) err = services.Logout(c, tokenInfo.Token)
return retVal, "", err return retVal, "", err
}) { }) {
return return
@@ -170,7 +169,7 @@ 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 { if tokenInfo := checkToken(c); tokenInfo == nil {
return return
} }
if !callFunc(c, func() (retVal interface{}, errCode string, err error) { if !callFunc(c, func() (retVal interface{}, errCode string, err error) {
@@ -181,3 +180,15 @@ func UpdateUser(c *gin.Context) {
} }
return return
} }
//获取菜单,文档 GET
func GetMenu(c *gin.Context) {
globals.SugarLogger.Debugf("Begin API :%s params: %v ip: %s", c.Request.URL, c.Params, c.ClientIP())
if !callFunc(c, func() (retVal interface{}, errCode string, err error) {
retVal, err = services.GetMenu(c)
return retVal, "", err
}) {
return
}
return
}

View File

@@ -5,13 +5,17 @@ import (
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"
) )
func GetApps(db *sqlx.DB, userID, mobile string) (apps []*model.Apps, err error) { func GetApps(db *sqlx.DB, id int, userID, mobile string) (apps []*model.Apps, err error) {
var sqlParams []interface{} var sqlParams []interface{}
sql := ` sql := `
SELECT * SELECT *
FROM apps FROM apps
WHERE 1 = 1 WHERE 1 = 1
` `
if id != 0 {
sql += " AND id = ?"
sqlParams = append(sqlParams, id)
}
if userID != "" { if userID != "" {
sql += " AND user_id = ?" sql += " AND user_id = ?"
sqlParams = append(sqlParams, userID) sqlParams = append(sqlParams, userID)

View File

@@ -57,3 +57,16 @@ func GetUserForLogin(db *sqlx.DB, name, password string) (user *model.User, err
} }
return user, err return user, err
} }
func GetMenus(db *sqlx.DB) (menus []*model.Menu, err error) {
var sqlParams []interface{}
sql := `
SELECT *
FROM menu
WHERE 1 = 1
`
if err = db.Select(&menus, sql, sqlParams...); err == nil {
return menus, err
}
return menus, err
}

View File

@@ -34,6 +34,11 @@ var (
} }
) )
type TokenInfo struct {
User *User
Token string `json:"token"`
}
type ModelIDCULD struct { type ModelIDCULD struct {
ID int `json:"id" db:"id"` ID int `json:"id" db:"id"`
CreatedAt *time.Time `json:"created_at" db:"created_at"` CreatedAt *time.Time `json:"created_at" db:"created_at"`
@@ -82,3 +87,18 @@ type Apps struct {
Status int `json:"status"` //状态 Status int `json:"status"` //状态
Mobile string `json:"mobile"` //手机号 Mobile string `json:"mobile"` //手机号
} }
type Menu 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"`
Name string `json:"name"` //功能名
URL string `json:"url" db:"url"` //路径
ImgURL string `json:"img_url" db:"img_url"` //图标
Level int `json:"level"` //级别
ParentID int `json:"parent_id" db:"parent_id"` //父功能ID
Color string `json:"color"` //颜色
Content string `json:"content"` //菜单内容
}

View File

@@ -17,6 +17,7 @@ func Init(r *gin.Engine) {
app := v2.Group("/app") app := v2.Group("/app")
app.GET("/getApps", controllers.GetApps) app.GET("/getApps", controllers.GetApps)
app.GET("/addApp", controllers.AddApp) app.GET("/addApp", controllers.AddApp)
app.GET("/delApp", controllers.DelApp)
//v1是不需要token的 //v1是不需要token的
v1 := r.Group("v1") v1 := r.Group("v1")
@@ -24,4 +25,5 @@ func Init(r *gin.Engine) {
userw.GET("/login", controllers.Login) userw.GET("/login", controllers.Login)
userw.GET("/refreshCode", controllers.RefreshCode) userw.GET("/refreshCode", controllers.RefreshCode)
userw.GET("/register", controllers.RegisterUser) userw.GET("/register", controllers.RegisterUser)
userw.GET("/getMenu", controllers.GetMenu)
} }

View File

@@ -11,14 +11,11 @@ import (
"time" "time"
) )
func GetApps(c *gin.Context, user *model.User) (apps []*model.Apps, err error) { func GetApps(c *gin.Context, userID string) (apps []*model.Apps, err error) {
if user == nil { if userID == "" {
return nil, fmt.Errorf("未获取到账号信息!")
}
if user.UserID == "" {
return nil, fmt.Errorf("账号信息有误,请重新登录!") return nil, fmt.Errorf("账号信息有误,请重新登录!")
} }
return dao.GetApps(globals.GetDB(), user.UserID, "") return dao.GetApps(globals.GetDB(), 0, userID, "")
} }
func AddApp(c *gin.Context, code, name, mobile, userID string) (err error) { func AddApp(c *gin.Context, code, name, mobile, userID string) (err error) {
@@ -35,10 +32,10 @@ func AddApp(c *gin.Context, code, name, mobile, userID string) (err error) {
} }
putils.DelKey(mobile) putils.DelKey(mobile)
if apps, _ := dao.GetApps(db, userID, ""); len(apps) > 2 { if apps, _ := dao.GetApps(db, 0, userID, ""); len(apps) > 2 {
return fmt.Errorf("同一个账号最多只能建3个app") return fmt.Errorf("同一个账号最多只能建3个app")
} }
if apps, _ := dao.GetApps(db, "", mobile); len(apps) > 0 { if apps, _ := dao.GetApps(db, 0, "", mobile); len(apps) > 0 {
return fmt.Errorf("同一个手机号只能建1个app") return fmt.Errorf("同一个手机号只能建1个app")
} }
apps := &model.Apps{ apps := &model.Apps{
@@ -55,3 +52,23 @@ func AddApp(c *gin.Context, code, name, mobile, userID string) (err error) {
err = dao.Insert(db, apps) err = dao.Insert(db, apps)
return err return err
} }
func DelApp(c *gin.Context, appID int, userID string) (err error) {
var (
db = globals.GetDB()
now = time.Now()
)
if appID == 0 {
return fmt.Errorf("参数错误appID :%v", appID)
}
if apps, err2 := dao.GetApps(db, appID, userID, ""); err2 != nil {
return err2
} else if len(apps) == 0 {
return fmt.Errorf("未查询到此应用app_id :%d, user_id: %s", appID, userID)
} else {
app := apps[0]
app.DeletedAt = &now
err = dao.Update(db, app, model.FieldDeletedAt)
}
return err
}

View File

@@ -92,14 +92,6 @@ func createToken(user *model.User) (token string) {
}, TokenTypeSep) }, TokenTypeSep)
} }
func GetTokenInfo(c *gin.Context, token string) (user *model.User, err error) {
result := putils.GetKet(token)
if user, ok := result.(*model.User); !ok {
return user, err
}
return user, err
}
func Logout(c *gin.Context, token string) (err error) { func Logout(c *gin.Context, token string) (err error) {
return putils.DelKey(token) return putils.DelKey(token)
} }
@@ -124,3 +116,7 @@ func UpdateUser(c *gin.Context, payload string) (err error) {
err = dao.UpdateDiff(db, userp, user) err = dao.UpdateDiff(db, userp, user)
return err return err
} }
func GetMenu(c *gin.Context) (menus []*model.Menu, err error) {
return dao.GetMenus(globals.GetDB())
}