提交 211b1f2d 编写于 作者: Mr.奇淼('s avatar Mr.奇淼(

后台格式规范化 引入casbin做鉴权

上级 718c6e65
......@@ -22,7 +22,7 @@ var Dbconfig Config
func init() {
v := viper.New()
v.SetConfigName("config") // 设置配置文件名 (不带后缀)
v.AddConfigPath("./config/dbconfig/") // 第一个搜索路径
v.AddConfigPath("./static/dbconfig/") // 第一个搜索路径
v.SetConfigType("json")
err := v.ReadInConfig() // 搜索路径,并读取配置数据
if err != nil {
......
......@@ -9,7 +9,7 @@ import (
"strings"
)
// @Tags FileUploadAndDownload
// @Tags ExaFileUploadAndDownload
// @Summary 上传文件示例
// @Security ApiKeyAuth
// @accept multipart/form-data
......@@ -28,7 +28,7 @@ func UploadFile(c *gin.Context) {
servers.ReportFormat(c, false, fmt.Sprintf("接收返回值失败,%v", err), gin.H{})
} else {
//修改数据库后得到修改后的user并且返回供前端使用
var file dbModel.FileUploadAndDownload
var file dbModel.ExaFileUploadAndDownload
file.Url = filePath
file.Name = header.Filename
s := strings.Split(file.Name, ".")
......@@ -44,15 +44,15 @@ func UploadFile(c *gin.Context) {
}
}
// @Tags FileUploadAndDownload
// @Tags ExaFileUploadAndDownload
// @Summary 删除文件
// @Security ApiKeyAuth
// @Produce application/json
// @Param data body dbModel.FileUploadAndDownload true "传入文件里面id即可"
// @Param data body dbModel.ExaFileUploadAndDownload true "传入文件里面id即可"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"返回成功"}"
// @Router /fileUploadAndDownload/deleteFile [post]
func DeleteFile(c *gin.Context) {
var file dbModel.FileUploadAndDownload
var file dbModel.ExaFileUploadAndDownload
_ = c.ShouldBind(&file)
err, f := file.FindFile()
if err != nil {
......@@ -72,7 +72,7 @@ func DeleteFile(c *gin.Context) {
}
}
// @Tags FileUploadAndDownload
// @Tags ExaFileUploadAndDownload
// @Summary 分页文件列表
// @Security ApiKeyAuth
// @accept application/json
......@@ -83,7 +83,7 @@ func DeleteFile(c *gin.Context) {
func GetFileList(c *gin.Context) {
var pageInfo modelInterface.PageInfo
_ = c.BindJSON(&pageInfo)
err, list, total := new(dbModel.FileUploadAndDownload).GetInfoList(pageInfo)
err, list, total := new(dbModel.ExaFileUploadAndDownload).GetInfoList(pageInfo)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
} else {
......
......@@ -4,8 +4,8 @@ import (
"fmt"
"github.com/gin-gonic/gin"
"main/controller/servers"
"main/model/dbModel"
"main/model/modelInterface"
"main/model/sysModel"
)
type CreateApiParams struct {
......@@ -17,7 +17,7 @@ type DeleteApiParams struct {
ID uint `json:"id"`
}
// @Tags Api
// @Tags SysApi
// @Summary 创建基础api
// @Security ApiKeyAuth
// @accept application/json
......@@ -26,7 +26,7 @@ type DeleteApiParams struct {
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /api/createApi [post]
func CreateApi(c *gin.Context) {
var api dbModel.Api
var api sysModel.SysApi
_ = c.BindJSON(&api)
err := api.CreateApi()
if err != nil {
......@@ -36,16 +36,16 @@ func CreateApi(c *gin.Context) {
}
}
// @Tags Api
// @Tags SysApi
// @Summary 删除指定api
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body dbModel.Api true "删除api"
// @Param data body sysModel.SysApi true "删除api"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /api/deleteApi [post]
func DeleteApi(c *gin.Context) {
var a dbModel.Api
var a sysModel.SysApi
_ = c.BindJSON(&a)
err := a.DeleteApi()
if err != nil {
......@@ -60,7 +60,7 @@ type AuthAndPathIn struct {
ApiIds []uint `json:"apiIds"`
}
// @Tags Api
// @Tags SysApi
// @Summary 创建api和角色关系
// @Security ApiKeyAuth
// @accept application/json
......@@ -71,7 +71,7 @@ type AuthAndPathIn struct {
func SetAuthAndApi(c *gin.Context) {
var authAndPathIn AuthAndPathIn
_ = c.BindJSON(&authAndPathIn)
err := new(dbModel.ApiAuthority).SetAuthAndApi(authAndPathIn.AuthorityId, authAndPathIn.ApiIds)
err := new(sysModel.SysApiAuthority).SetAuthAndApi(authAndPathIn.AuthorityId, authAndPathIn.ApiIds)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("添加失败:%v", err), gin.H{})
} else {
......@@ -81,7 +81,7 @@ func SetAuthAndApi(c *gin.Context) {
//条件搜索后端看此api
// @Tags Api
// @Tags SysApi
// @Summary 分页获取API列表
// @Security ApiKeyAuth
// @accept application/json
......@@ -92,12 +92,12 @@ func SetAuthAndApi(c *gin.Context) {
func GetApiList(c *gin.Context) {
// 此结构体仅本方法使用
type searchParams struct {
dbModel.Api
sysModel.SysApi
modelInterface.PageInfo
}
var sp searchParams
_ = c.ShouldBindJSON(&sp)
err, list, total := sp.Api.GetInfoList(sp.PageInfo)
err, list, total := sp.SysApi.GetInfoList(sp.PageInfo)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
} else {
......@@ -111,7 +111,7 @@ func GetApiList(c *gin.Context) {
}
}
// @Tags Api
// @Tags SysApi
// @Summary 根据id获取api
// @Security ApiKeyAuth
// @accept application/json
......@@ -122,7 +122,7 @@ func GetApiList(c *gin.Context) {
func GetApiById(c *gin.Context) {
var idInfo GetById
_ = c.BindJSON(&idInfo)
err, api := new(dbModel.Api).GetApiById(idInfo.Id)
err, api := new(sysModel.SysApi).GetApiById(idInfo.Id)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
} else {
......@@ -133,7 +133,7 @@ func GetApiById(c *gin.Context) {
}
}
// @Tags Api
// @Tags SysApi
// @Summary 创建基础api
// @Security ApiKeyAuth
// @accept application/json
......@@ -142,7 +142,7 @@ func GetApiById(c *gin.Context) {
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /api/updataApi [post]
func UpdataApi(c *gin.Context) {
var api dbModel.Api
var api sysModel.SysApi
_ = c.BindJSON(&api)
err := api.UpdataApi()
if err != nil {
......@@ -152,7 +152,7 @@ func UpdataApi(c *gin.Context) {
}
}
// @Tags Api
// @Tags SysApi
// @Summary 获取所有的Api 不分页
// @Security ApiKeyAuth
// @accept application/json
......@@ -160,7 +160,7 @@ func UpdataApi(c *gin.Context) {
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /api/getAllApis [post]
func GetAllApis(c *gin.Context) {
err, apis := new(dbModel.Api).GetAllApis()
err, apis := new(sysModel.SysApi).GetAllApis()
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
} else {
......
......@@ -4,8 +4,8 @@ import (
"fmt"
"github.com/gin-gonic/gin"
"main/controller/servers"
"main/model/dbModel"
"main/model/modelInterface"
"main/model/sysModel"
)
type CreateAuthorityPatams struct {
......@@ -22,7 +22,7 @@ type CreateAuthorityPatams struct {
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /authority/createAuthority [post]
func CreateAuthority(c *gin.Context) {
var auth dbModel.Authority
var auth sysModel.SysAuthority
_ = c.ShouldBind(&auth)
err, authBack := auth.CreateAuthority()
if err != nil {
......@@ -49,7 +49,7 @@ type DeleteAuthorityPatams struct {
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /authority/deleteAuthority [post]
func DeleteAuthority(c *gin.Context) {
var a dbModel.Authority
var a sysModel.SysAuthority
_ = c.BindJSON(&a)
//删除角色之前需要判断是否有用户正在使用此角色
err := a.DeleteAuthority()
......@@ -71,7 +71,7 @@ func DeleteAuthority(c *gin.Context) {
func GetAuthorityList(c *gin.Context){
var pageInfo modelInterface.PageInfo
_ = c.BindJSON(&pageInfo)
err, list, total := new(dbModel.Authority).GetInfoList(pageInfo)
err, list, total := new(sysModel.SysAuthority).GetInfoList(pageInfo)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
} else {
......@@ -100,7 +100,7 @@ type GetAuthorityId struct {
func GetAuthAndApi(c *gin.Context){
var idInfo GetAuthorityId
_ = c.BindJSON(&idInfo)
err,apis := new(dbModel.ApiAuthority).GetAuthAndApi(idInfo.AuthorityId)
err,apis := new(sysModel.SysApiAuthority).GetAuthAndApi(idInfo.AuthorityId)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
} else {
......
package api
import (
"fmt"
"github.com/gin-gonic/gin"
"main/controller/servers"
"main/model/sysModel"
)
type CasbinInReceive struct {
AuthorityId string `json:"authorityId"`
Paths []string `json:paths`
}
// @Tags casbin
// @Summary 更改角色api权限
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body api.CreateAuthorityPatams true "更改角色api权限"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /casbin/casbinPUpdata [post]
func CasbinPUpdata(c *gin.Context){
var cmr CasbinInReceive
_ = c.ShouldBind(&cmr)
err := new(sysModel.CasbinModel).CasbinPUpdata(cmr.AuthorityId,cmr.Paths)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("添加规则失败,%v", err), gin.H{})
} else {
servers.ReportFormat(c, true, "添加规则成功", gin.H{})
}
}
// @Tags casbin
// @Summary 获取权限列表
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body api.CreateAuthorityPatams true "获取权限列表"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /casbin/getPolicyPathByAuthorityId [post]
func GetPolicyPathByAuthorityId(c *gin.Context){
var cmr CasbinInReceive
_ = c.ShouldBind(&cmr)
paths := new(sysModel.CasbinModel).GetPolicyPathByAuthorityId(cmr.AuthorityId)
servers.ReportFormat(c, true, "获取规则成功", gin.H{"paths":paths})
}
......@@ -5,7 +5,7 @@ import (
"github.com/gin-gonic/gin"
"main/controller/servers"
"main/middleware"
"main/model/dbModel"
"main/model/sysModel"
"main/model/modelInterface"
)
......@@ -19,7 +19,7 @@ import (
func GetMenu(c *gin.Context) {
claims, _ := c.Get("claims")
waitUse := claims.(*middleware.CustomClaims)
err, menus := new(dbModel.Menu).GetMenuTree(waitUse.AuthorityId)
err, menus := new(sysModel.SysMenu).GetMenuTree(waitUse.AuthorityId)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("获取失败:%v", err), gin.H{"menus": menus})
} else {
......@@ -38,7 +38,7 @@ func GetMenu(c *gin.Context) {
func GetMenuList(c *gin.Context) {
var pageInfo modelInterface.PageInfo
_ = c.BindJSON(&pageInfo)
err, menuList, total := new(dbModel.BaseMenu).GetInfoList(pageInfo)
err, menuList, total := new(sysModel.SysBaseMenu).GetInfoList(pageInfo)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
} else {
......@@ -56,11 +56,11 @@ func GetMenuList(c *gin.Context) {
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body dbModel.BaseMenu true "新增菜单"
// @Param data body sysModel.SysBaseMenu true "新增菜单"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /menu/addBaseMenu [post]
func AddBaseMenu(c *gin.Context) {
var addMenu dbModel.BaseMenu
var addMenu sysModel.SysBaseMenu
_ = c.BindJSON(&addMenu)
err := addMenu.AddBaseMenu()
if err != nil {
......@@ -78,7 +78,7 @@ func AddBaseMenu(c *gin.Context) {
// @Success 200 {string} json "{"success":true,"data":{},"msg":"返回成功"}"
// @Router /menu/getBaseMenuTree [post]
func GetBaseMenuTree(c *gin.Context) {
err, menus := new(dbModel.BaseMenu).GetBaseMenuTree()
err, menus := new(sysModel.SysBaseMenu).GetBaseMenuTree()
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("获取失败:%v", err), gin.H{"menus": menus})
} else {
......@@ -87,7 +87,7 @@ func GetBaseMenuTree(c *gin.Context) {
}
type AddMenuAuthorityInfo struct {
Menus []dbModel.BaseMenu
Menus []sysModel.SysBaseMenu
AuthorityId string
}
......@@ -102,7 +102,7 @@ type AddMenuAuthorityInfo struct {
func AddMenuAuthority(c *gin.Context) {
var addMenuAuthorityInfo AddMenuAuthorityInfo
_ = c.BindJSON(&addMenuAuthorityInfo)
err := new(dbModel.Menu).AddMenuAuthority(addMenuAuthorityInfo.Menus, addMenuAuthorityInfo.AuthorityId)
err := new(sysModel.SysMenu).AddMenuAuthority(addMenuAuthorityInfo.Menus, addMenuAuthorityInfo.AuthorityId)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("添加失败,%v", err), gin.H{})
} else {
......@@ -125,7 +125,7 @@ type AuthorityIdInfo struct {
func GetMenuAuthority(c *gin.Context) {
var authorityIdInfo AuthorityIdInfo
_ = c.BindJSON(&authorityIdInfo)
err, menus := new(dbModel.Menu).GetMenuAuthority(authorityIdInfo.AuthorityId)
err, menus := new(sysModel.SysMenu).GetMenuAuthority(authorityIdInfo.AuthorityId)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("获取失败:%v", err), gin.H{"menus": menus})
} else {
......@@ -148,7 +148,7 @@ type IdInfo struct {
func DeleteBaseMenu(c *gin.Context) {
var idInfo IdInfo
_ = c.BindJSON(&idInfo)
err := new(dbModel.BaseMenu).DeleteBaseMenu(idInfo.Id)
err := new(sysModel.SysBaseMenu).DeleteBaseMenu(idInfo.Id)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("删除失败:%v", err), gin.H{})
} else {
......@@ -161,11 +161,11 @@ func DeleteBaseMenu(c *gin.Context) {
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body dbModel.BaseMenu true "更新菜单"
// @Param data body sysModel.SysBaseMenu true "更新菜单"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /menu/updataBaseMen [post]
func UpdataBaseMenu(c *gin.Context) {
var menu dbModel.BaseMenu
var menu sysModel.SysBaseMenu
_ = c.BindJSON(&menu)
err := menu.UpdataBaseMenu()
if err != nil {
......@@ -190,7 +190,7 @@ type GetById struct {
func GetBaseMenuById(c *gin.Context) {
var idInfo GetById
_ = c.BindJSON(&idInfo)
err, menu := new(dbModel.BaseMenu).GetBaseMenuById(idInfo.Id)
err, menu := new(sysModel.SysBaseMenu).GetBaseMenuById(idInfo.Id)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("查询失败:%v", err), gin.H{})
} else {
......
......@@ -7,7 +7,7 @@ import (
uuid "github.com/satori/go.uuid"
"main/controller/servers"
"main/middleware"
"main/model/dbModel"
"main/model/sysModel"
"main/model/modelInterface"
"mime/multipart"
"time"
......@@ -33,7 +33,7 @@ func Regist(c *gin.Context) {
var R RegistAndLoginStuct
_ = c.BindJSON(&R)
U := &dbModel.User{Username: R.Username, Password: R.Password}
U := &sysModel.SysUser{Username: R.Username, Password: R.Password}
err, user := U.Regist()
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("%v", err), gin.H{
......@@ -55,7 +55,7 @@ func Regist(c *gin.Context) {
func Login(c *gin.Context) {
var L RegistAndLoginStuct
_ = c.BindJSON(&L)
U := &dbModel.User{Username: L.Username, Password: L.Password}
U := &sysModel.SysUser{Username: L.Username, Password: L.Password}
if err, user := U.Login(); err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("用户名密码错误或%v", err), gin.H{})
} else {
......@@ -64,7 +64,7 @@ func Login(c *gin.Context) {
}
//登录以后签发jwt
func tokenNext(c *gin.Context, user dbModel.User) {
func tokenNext(c *gin.Context, user sysModel.SysUser) {
j := &middleware.JWT{
[]byte("qmPlus"), // 唯一签名
}
......@@ -93,7 +93,7 @@ type ChangePasswordStutrc struct {
NewPassword string `json:"newPassword"`
}
// @Tags User
// @Tags SysUser
// @Summary 用户修改密码
// @Security ApiKeyAuth
// @Produce application/json
......@@ -103,7 +103,7 @@ type ChangePasswordStutrc struct {
func ChangePassword(c *gin.Context) {
var params ChangePasswordStutrc
_ = c.BindJSON(&params)
U := &dbModel.User{Username: params.Username, Password: params.Password}
U := &sysModel.SysUser{Username: params.Username, Password: params.Password}
if err, _ := U.ChangePassword(params.NewPassword); err != nil {
servers.ReportFormat(c, false, "修改失败,请检查用户名密码", gin.H{})
} else {
......@@ -115,7 +115,7 @@ type UserHeaderImg struct {
HeaderImg multipart.File `json:"headerImg"`
}
// @Tags User
// @Tags SysUser
// @Summary 用户上传头像
// @Security ApiKeyAuth
// @accept multipart/form-data
......@@ -141,7 +141,7 @@ func UploadHeaderImg(c *gin.Context) {
servers.ReportFormat(c, false, fmt.Sprintf("接收返回值失败,%v", err), gin.H{})
} else {
//修改数据库后得到修改后的user并且返回供前端使用
err, user := new(dbModel.User).UploadHeaderImg(uuid, filePath)
err, user := new(sysModel.SysUser).UploadHeaderImg(uuid, filePath)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("修改数据库链接失败,%v", err), gin.H{})
} else {
......@@ -151,7 +151,7 @@ func UploadHeaderImg(c *gin.Context) {
}
}
// @Tags User
// @Tags SysUser
// @Summary 分页获取用户列表
// @Security ApiKeyAuth
// @accept application/json
......@@ -162,7 +162,7 @@ func UploadHeaderImg(c *gin.Context) {
func GetUserList(c *gin.Context) {
var pageInfo modelInterface.PageInfo
_ = c.BindJSON(&pageInfo)
err, list, total := new(dbModel.User).GetInfoList(pageInfo)
err, list, total := new(sysModel.SysUser).GetInfoList(pageInfo)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("获取数据失败,%v", err), gin.H{})
} else {
......@@ -180,7 +180,7 @@ type SetUserAuth struct {
AuthorityId string `json:"authorityId"`
}
// @Tags User
// @Tags SysUser
// @Summary 设置用户权限
// @Security ApiKeyAuth
// @accept application/json
......@@ -191,7 +191,7 @@ type SetUserAuth struct {
func SetUserAuthority(c *gin.Context) {
var sua SetUserAuth
_ = c.BindJSON(&sua)
err := new(dbModel.User).SetUserAuthority(sua.UUID, sua.AuthorityId)
err := new(sysModel.SysUser).SetUserAuthority(sua.UUID, sua.AuthorityId)
if err != nil {
servers.ReportFormat(c, false, fmt.Sprintf("修改失败,%v", err), gin.H{})
} else {
......
......@@ -4,17 +4,17 @@ import (
"fmt"
"github.com/gin-gonic/gin"
"main/controller/servers"
"main/model/dbModel"
"main/model/sysModel"
)
// @Tags workflow
// @Summary 注册工作流
// @Produce application/json
// @Param data body dbModel.Workflow true "注册工作流接口"
// @Param data body sysModel.SysWorkflow true "注册工作流接口"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"注册成功"}"
// @Router /workflow/createWorkFlow [post]
func CreateWorkFlow(c *gin.Context) {
var wk dbModel.Workflow
var wk sysModel.SysWorkflow
_ = c.ShouldBind(&wk)
err := wk.Create()
if err != nil {
......
......@@ -40,7 +40,7 @@ var doc = `{
"application/json"
],
"tags": [
"Api"
"SysApi"
],
"summary": "创建基础api",
"parameters": [
......@@ -79,7 +79,7 @@ var doc = `{
"application/json"
],
"tags": [
"Api"
"SysApi"
],
"summary": "删除指定api",
"parameters": [
......@@ -90,7 +90,7 @@ var doc = `{
"required": true,
"schema": {
"type": "object",
"$ref": "#/definitions/dbModel.Api"
"$ref": "#/definitions/dbModel.SysApi"
}
}
],
......@@ -118,7 +118,7 @@ var doc = `{
"application/json"
],
"tags": [
"Api"
"SysApi"
],
"summary": "获取所有的Api 不分页",
"responses": {
......@@ -145,7 +145,7 @@ var doc = `{
"application/json"
],
"tags": [
"Api"
"SysApi"
],
"summary": "根据id获取api",
"parameters": [
......@@ -184,7 +184,7 @@ var doc = `{
"application/json"
],
"tags": [
"Api"
"SysApi"
],
"summary": "分页获取API列表",
"parameters": [
......@@ -223,7 +223,7 @@ var doc = `{
"application/json"
],
"tags": [
"Api"
"SysApi"
],
"summary": "创建api和角色关系",
"parameters": [
......@@ -262,7 +262,7 @@ var doc = `{
"application/json"
],
"tags": [
"Api"
"SysApi"
],
"summary": "创建基础api",
"parameters": [
......@@ -641,7 +641,7 @@ var doc = `{
"required": true,
"schema": {
"type": "object",
"$ref": "#/definitions/dbModel.BaseMenu"
"$ref": "#/definitions/dbModel.SysBaseMenu"
}
}
],
......@@ -908,7 +908,7 @@ var doc = `{
"required": true,
"schema": {
"type": "object",
"$ref": "#/definitions/dbModel.BaseMenu"
"$ref": "#/definitions/dbModel.SysBaseMenu"
}
}
],
......@@ -1121,7 +1121,7 @@ var doc = `{
"menus": {
"type": "array",
"items": {
"$ref": "#/definitions/dbModel.BaseMenu"
"$ref": "#/definitions/dbModel.SysBaseMenu"
}
}
}
......@@ -1238,7 +1238,7 @@ var doc = `{
}
}
},
"dbModel.Api": {
"dbModel.SysApi": {
"type": "object",
"properties": {
"description": {
......@@ -1252,13 +1252,13 @@ var doc = `{
}
}
},
"dbModel.BaseMenu": {
"dbModel.SysBaseMenu": {
"type": "object",
"properties": {
"children": {
"type": "array",
"items": {
"$ref": "#/definitions/dbModel.BaseMenu"
"$ref": "#/definitions/dbModel.SysBaseMenu"
}
},
"component": {
......
......@@ -4,6 +4,8 @@ go 1.12
require (
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc
github.com/casbin/casbin v1.9.1
github.com/casbin/gorm-adapter v1.0.0
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect
github.com/fsnotify/fsnotify v1.4.7
......@@ -18,12 +20,11 @@ require (
github.com/qiniu/x v7.0.8+incompatible // indirect
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
github.com/satori/go.uuid v1.2.0
github.com/shamsher31/goimgext v1.0.0 // indirect
github.com/shamsher31/goimgtype v1.0.0
github.com/sirupsen/logrus v1.2.0
github.com/spf13/viper v1.4.0
github.com/swaggo/gin-swagger v1.2.0
github.com/swaggo/swag v1.5.1
github.com/tebeka/strftime v0.1.3 // indirect
github.com/unrolled/secure v1.0.6
qiniupkg.com/x v7.0.8+incompatible // indirect
)
......@@ -12,15 +12,17 @@ import (
//初始化总路由
func InitRouter() *gin.Engine {
var Router = gin.Default()
//Router.Use(middleware.LoadTls()) // 打开就能玩https了
Router.Use(middleware.Logger()) // 如果不需要日志 请关闭这里
Router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
//Router.Use(middleware.Logger())
router.InitUserRouter(Router) // 注册用户路由
router.InitBaseRouter(Router) // 注册基础功能路由
router.InitMenuRouter(Router) // 注册menu路由
router.InitAuthorityRouter(Router) // 注册角色路由
router.InitApiRouter(Router) // 注册功能api路由
router.InitFileUploadAndDownloadRouter(Router) // 文件上传下载功能路由
router.InitWorkflowRouter(Router) // 工作流相关路由
router.InitUserRouter(Router) // 注册用户路由
router.InitBaseRouter(Router) // 注册基础功能路由 不做鉴权
router.InitMenuRouter(Router) // 注册menu路由
router.InitAuthorityRouter(Router) // 注册角色路由
router.InitApiRouter(Router) // 注册功能api路由
router.InitFileUploadAndDownloadRouter(Router) // 文件上传下载功能路由
router.InitWorkflowRouter(Router) // 工作流相关路由
router.InitCasbinRouter(Router)
return Router
}
......@@ -11,9 +11,8 @@ import (
)
var QMLog = logrus.New()
//禁止logrus的输出
func InitLog() {
func InitLog() *logrus.Logger{
src, err := os.OpenFile(os.DevNull, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
if err != nil {
fmt.Println("err", err)
......@@ -33,4 +32,5 @@ func InitLog() {
}
lfHook := lfshook.NewHook(writeMap, &logrus.JSONFormatter{})
QMLog.AddHook(lfHook)
return QMLog
}
......@@ -3,18 +3,19 @@ package registTable
import (
"github.com/jinzhu/gorm"
"main/model/dbModel"
"main/model/sysModel"
)
//注册数据库表专用
func RegistTable(db *gorm.DB) {
db.AutoMigrate(dbModel.User{},
dbModel.Authority{},
dbModel.Menu{},
dbModel.Api{},
dbModel.ApiAuthority{},
dbModel.BaseMenu{},
dbModel.FileUploadAndDownload{},
dbModel.Workflow{},
dbModel.WorkflowStepInfo{},
db.AutoMigrate(sysModel.SysUser{},
sysModel.SysAuthority{},
sysModel.SysMenu{},
sysModel.SysApi{},
sysModel.SysApiAuthority{},
sysModel.SysBaseMenu{},
dbModel.ExaFileUploadAndDownload{},
sysModel.SysWorkflow{},
sysModel.SysWorkflowStepInfo{},
)
}
{"level":"info","msg":"| 200 | 960.2µs | ::1 | GET /swagger/index.html ||","time":"2019-11-01T14:04:16+08:00"}
{"level":"info","msg":"| 304 | 0s | ::1 | GET /swagger/swagger-ui.css ||","time":"2019-11-01T14:04:16+08:00"}
{"level":"info","msg":"| 304 | 0s | ::1 | GET /swagger/swagger-ui-bundle.js ||","time":"2019-11-01T14:04:16+08:00"}
{"level":"info","msg":"| 304 | 0s | ::1 | GET /swagger/swagger-ui-standalone-preset.js ||","time":"2019-11-01T14:04:16+08:00"}
{"level":"info","msg":"| 200 | 998.3µs | ::1 | GET /swagger/doc.json ||","time":"2019-11-01T14:04:17+08:00"}
{"level":"info","msg":"| 200 | 0s | ::1 | GET /swagger/favicon-32x32.png ||","time":"2019-11-01T14:04:17+08:00"}
......@@ -11,6 +11,7 @@ import (
"time"
)
// @title Swagger Example API
// @version 0.0.1
// @description This is a sample Server pets
......@@ -18,13 +19,15 @@ import (
// @in header
// @name x-token
// @BasePath /
func main() {
qmlog.InitLog()
registTable.RegistTable(qmsql.InitMysql(config.Dbconfig.Admin))
defer qmsql.DEFAULTDB.Close()
Router := initRouter.InitRouter()
qmlog.QMLog.Info("服务器开启") // 日志测试代码
func main() {
qmlog.InitLog() // 初始化日志
db:=qmsql.InitMysql(config.Dbconfig.Admin) // 链接初始化数据库
registTable.RegistTable(db) //注册数据库表
defer qmsql.DEFAULTDB.Close() // 程序结束前关闭数据库链接
Router := initRouter.InitRouter() //注册路由
qmlog.QMLog.Info("服务器开启") // 日志测试代码
//Router.RunTLS(":443","ssl.pem", "ssl.key") // https支持 需要添加中间件
s := &http.Server{
Addr: ":8888",
Handler: Router,
......@@ -41,7 +44,3 @@ func main() {
`, s.Addr)
_ = s.ListenAndServe()
}
func run(server *http.Server) {
}
package middleware
import (
"fmt"
"github.com/gin-gonic/gin"
"main/controller/servers"
"main/model/sysModel"
)
//拦截器
func CasbinHandler() gin.HandlerFunc {
return func(c *gin.Context) {
claims, _ := c.Get("claims")
waitUse := claims.(*CustomClaims)
//获取请求的URI
obj := c.Request.URL.RequestURI()
//获取请求方法
act := c.Request.Method
//获取用户的角色
sub := waitUse.AuthorityId
e:=sysModel.Casbin()
//判断策略中是否存在
if e.Enforce(sub, obj, act) {
c.Next()
} else {
servers.ReportFormat(c, false, fmt.Sprintf("权限不足"), gin.H{})
c.Abort()
return
}
}
}
......@@ -2,22 +2,13 @@ package middleware
import (
"errors"
"fmt"
"github.com/dgrijalva/jwt-go"
"github.com/gin-gonic/gin"
uuid "github.com/satori/go.uuid"
"main/controller/servers"
"main/init/qmsql"
"time"
)
type SqlRes struct {
Path string
AuthorityId string
ApiId uint
Id uint
}
func JWTAuth() gin.HandlerFunc {
return func(c *gin.Context) {
// 我们这里jwt鉴权取头部信息 x-token 登录时回返回token信息 这里前端需要把token存储到cookie或者本地localSstorage中 不过需要跟后端协商过期时间 可以约定刷新令牌或者重新登录
......@@ -46,15 +37,8 @@ func JWTAuth() gin.HandlerFunc {
c.Abort()
return
}
var sqlRes SqlRes
row := qmsql.DEFAULTDB.Raw("SELECT apis.path,api_authorities.authority_id,api_authorities.api_id,apis.id FROM apis INNER JOIN api_authorities ON api_authorities.api_id = apis.id WHERE apis.path = ? AND api_authorities.authority_id = ?", c.Request.RequestURI, claims.AuthorityId)
err = row.Scan(&sqlRes).Error
if fmt.Sprintf("%v", err) == "record not found" {
servers.ReportFormat(c, false, "没有Api操作权限", gin.H{})
c.Abort()
return
}
c.Set("claims", claims)
c.Next()
}
}
......
package middleware
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/unrolled/secure"
)
// 用https把这个中间件在router里面use一下就好
func LoadTls() gin.HandlerFunc {
return func(c *gin.Context) {
middleware := secure.New(secure.Options{
SSLRedirect: true,
SSLHost: "localhost:443",
})
err := middleware.Process(c.Writer, c.Request)
if err != nil {
//如果出现错误,请不要继续。
fmt.Println(err)
return
}
// 继续往下处理
c.Next()
}
}
package dbModel
import (
"github.com/jinzhu/gorm"
"time"
)
//申请model 工作流实例
type Application struct {
gorm.Model
WorkFlowID string // 所属工作流ID
WorkFlowStepInfoID string // 当前节点ID
ApplicationName string // 申请人姓名
ApplicationCause string // 请假原因
ApplicationStartData time.Time // 请假开始日期
ApplicationEndData time.Time // 请假开始日期
}
......@@ -7,7 +7,7 @@ import (
"main/model/modelInterface"
)
type FileUploadAndDownload struct {
type ExaFileUploadAndDownload struct {
gorm.Model
Name string `json:"name"`
Url string `json:"url"`
......@@ -15,30 +15,30 @@ type FileUploadAndDownload struct {
Key string `json:"key"`
}
func (f *FileUploadAndDownload) Upload() error {
func (f *ExaFileUploadAndDownload) Upload() error {
err := qmsql.DEFAULTDB.Create(f).Error
return err
}
func (f *FileUploadAndDownload) DeleteFile() error {
func (f *ExaFileUploadAndDownload) DeleteFile() error {
err := qmsql.DEFAULTDB.Where("id = ?", f.ID).Delete(f).Error
return err
}
func (f *FileUploadAndDownload) FindFile() (error, FileUploadAndDownload) {
var file FileUploadAndDownload
func (f *ExaFileUploadAndDownload) FindFile() (error, ExaFileUploadAndDownload) {
var file ExaFileUploadAndDownload
err := qmsql.DEFAULTDB.Where("id = ?", f.ID).First(&file).Error
return err, file
}
// 分页获取数据 需要分页实现这个接口即可
func (f *FileUploadAndDownload) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
func (f *ExaFileUploadAndDownload) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
// 封装分页方法 调用即可 传入 当前的结构体和分页信息
err, db, total := servers.PagingServer(f, info)
if err != nil {
return
} else {
var fileLists []FileUploadAndDownload
var fileLists []ExaFileUploadAndDownload
err = db.Order("updated_at desc").Find(&fileLists).Error
return err, fileLists, total
}
......
package dbModel
package sysModel
import (
"github.com/jinzhu/gorm"
......@@ -8,15 +8,15 @@ import (
"main/model/modelInterface"
)
type Api struct {
type SysApi struct {
gorm.Model
Path string `json:"path"`
Description string `json:"description"`
Group string `json:"group"`
}
func (a *Api) CreateApi() (err error) {
findOne := qmsql.DEFAULTDB.Where("path = ?", a.Path).Find(&Menu{}).Error
func (a *SysApi) CreateApi() (err error) {
findOne := qmsql.DEFAULTDB.Where("path = ?", a.Path).Find(&SysMenu{}).Error
if findOne == nil {
return errors.New("存在相同api")
} else {
......@@ -25,36 +25,47 @@ func (a *Api) CreateApi() (err error) {
return err
}
func (a *Api) DeleteApi() (err error) {
func (a *SysApi) DeleteApi() (err error) {
err = qmsql.DEFAULTDB.Delete(a).Error
err = qmsql.DEFAULTDB.Where("api_id = ?", a.ID).Unscoped().Delete(&ApiAuthority{}).Error
err = qmsql.DEFAULTDB.Where("api_id = ?", a.ID).Unscoped().Delete(&SysApiAuthority{}).Error
return err
}
func (a *Api) UpdataApi() (err error) {
err = qmsql.DEFAULTDB.Save(a).Error
func (a *SysApi) UpdataApi() (err error) {
var oldA SysApi
err = qmsql.DEFAULTDB.Where("id = ?", a.ID).First(&oldA).Error
if(err!=nil){
return err
}else{
err = new(CasbinModel).CasbinApiUpdata(oldA.Path,a.Path)
if(err!=nil){
return err
}else{
err = qmsql.DEFAULTDB.Save(a).Error
}
}
return err
}
func (a *Api) GetApiById(id float64) (err error, api Api) {
func (a *SysApi) GetApiById(id float64) (err error, api SysApi) {
err = qmsql.DEFAULTDB.Where("id = ?", id).First(&api).Error
return
}
// 获取所有api信息
func (a *Api) GetAllApis() (err error, apis []Api) {
func (a *SysApi) GetAllApis() (err error, apis []SysApi) {
err = qmsql.DEFAULTDB.Find(&apis).Error
return
}
// 分页获取数据 需要分页实现这个接口即可
func (a *Api) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
func (a *SysApi) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
// 封装分页方法 调用即可 传入 当前的结构体和分页信息
err, db, total := servers.PagingServer(a, info)
if err != nil {
return
} else {
var apiList []Api
var apiList []SysApi
err = db.Order("group", true).Where("path LIKE ?", "%"+a.Path+"%").Find(&apiList).Error
return err, apiList, total
}
......
package dbModel
package sysModel
import (
"github.com/jinzhu/gorm"
"main/init/qmsql"
)
type ApiAuthority struct {
type SysApiAuthority struct {
gorm.Model
AuthorityId string
Authority Authority `gorm:"ForeignKey:AuthorityId;AssociationForeignKey:AuthorityId"` //其实没有关联的必要
Authority SysAuthority `gorm:"ForeignKey:AuthorityId;AssociationForeignKey:AuthorityId"` //其实没有关联的必要
ApiId uint
Api Api
Api SysApi
}
//创建角色api关联关系
func (a *ApiAuthority) SetAuthAndApi(authId string, apisid []uint) (err error) {
err = qmsql.DEFAULTDB.Where("authority_id = ?", authId).Unscoped().Delete(&ApiAuthority{}).Error
func (a *SysApiAuthority) SetAuthAndApi(authId string, apisid []uint) (err error) {
for _, v := range apisid {
err = qmsql.DEFAULTDB.Create(&ApiAuthority{AuthorityId: authId, ApiId: v}).Error
err = qmsql.DEFAULTDB.Create(&SysApiAuthority{AuthorityId: authId, ApiId: v}).Error
if err != nil {
return err
}
......@@ -26,8 +25,8 @@ func (a *ApiAuthority) SetAuthAndApi(authId string, apisid []uint) (err error) {
}
// 获取角色api关联关系
func (a *ApiAuthority) GetAuthAndApi(authId string) (err error,apiIds []uint) {
var apis []ApiAuthority
func (a *SysApiAuthority) GetAuthAndApi(authId string) (err error,apiIds []uint) {
var apis []SysApiAuthority
err = qmsql.DEFAULTDB.Where("authority_id = ?", authId).Find(&apis).Error
for _, v := range apis {
apiIds = append(apiIds,v.ApiId)
......
package dbModel
package sysModel
import (
"github.com/jinzhu/gorm"
......@@ -8,23 +8,24 @@ import (
"main/model/modelInterface"
)
type Authority struct {
type SysAuthority struct {
gorm.Model
AuthorityId string `json:"authorityId" gorm:"not null;unique"`
AuthorityName string `json:"authorityName"`
}
// 创建角色
func (a *Authority) CreateAuthority() (err error, authority *Authority) {
func (a *SysAuthority) CreateAuthority() (err error, authority *SysAuthority) {
err = qmsql.DEFAULTDB.Create(a).Error
return err, a
}
// 删除角色
func (a *Authority) DeleteAuthority() (err error) {
err = qmsql.DEFAULTDB.Where("authority_id = ?", a.AuthorityId).Find(&User{}).Error
func (a *SysAuthority) DeleteAuthority() (err error) {
err = qmsql.DEFAULTDB.Where("authority_id = ?", a.AuthorityId).Find(&SysUser{}).Error
if err != nil {
err = qmsql.DEFAULTDB.Where("authority_id = ?", a.AuthorityId).Delete(a).Error
err = qmsql.DEFAULTDB.Where("authority_id = ?", a.AuthorityId).First(a).Delete(a).Error
new(CasbinModel).clearCasbin(0,a.AuthorityId)
} else {
err = errors.New("此角色有用户正在使用禁止删除")
}
......@@ -34,13 +35,13 @@ func (a *Authority) DeleteAuthority() (err error) {
// 分页获取数据 需要分页实现这个接口即可
func (a *Authority) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
func (a *SysAuthority) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
// 封装分页方法 调用即可 传入 当前的结构体和分页信息
err, db, total := servers.PagingServer(a, info)
if err != nil {
return
} else {
var authority []Authority
var authority []SysAuthority
err = db.Find(&authority).Error
return err, authority, total
}
......
package dbModel
package sysModel
import (
"fmt"
......@@ -9,7 +9,7 @@ import (
"main/model/modelInterface"
)
type BaseMenu struct {
type SysBaseMenu struct {
gorm.Model
MenuLevel uint `json:"-"`
ParentId string `json:"parentId"`
......@@ -18,12 +18,12 @@ type BaseMenu struct {
Hidden bool `json:"hidden"`
Component string `json:"component"`
Meta `json:"meta"`
NickName string `json:"nickName"`
Children []BaseMenu `json:"children"`
NickName string `json:"nickName"`
Children []SysBaseMenu `json:"children"`
}
func (b *BaseMenu) AddBaseMenu() (err error) {
findOne := qmsql.DEFAULTDB.Where("name = ?", b.Name).Find(&BaseMenu{}).Error
func (b *SysBaseMenu) AddBaseMenu() (err error) {
findOne := qmsql.DEFAULTDB.Where("name = ?", b.Name).Find(&SysBaseMenu{}).Error
if findOne != nil {
b.NickName = b.Title
err = qmsql.DEFAULTDB.Create(b).Error
......@@ -33,18 +33,18 @@ func (b *BaseMenu) AddBaseMenu() (err error) {
return err
}
func (b *BaseMenu) DeleteBaseMenu(id float64) (err error) {
err = qmsql.DEFAULTDB.Where("parent_id = ?", id).First(&BaseMenu{}).Error
func (b *SysBaseMenu) DeleteBaseMenu(id float64) (err error) {
err = qmsql.DEFAULTDB.Where("parent_id = ?", id).First(&SysBaseMenu{}).Error
if err != nil {
err = qmsql.DEFAULTDB.Where("id = ?", id).Delete(&b).Error
err = qmsql.DEFAULTDB.Where("menu_id = ?", id).Unscoped().Delete(&Menu{}).Error
err = qmsql.DEFAULTDB.Where("menu_id = ?", id).Unscoped().Delete(&SysMenu{}).Error
} else {
return errors.New("此菜单存在子菜单不可删除")
}
return err
}
func (b *BaseMenu) UpdataBaseMenu() (err error) {
func (b *SysBaseMenu) UpdataBaseMenu() (err error) {
upDataMap := make(map[string]interface{})
upDataMap["parent_id"] = b.ParentId
upDataMap["path"] = b.Path
......@@ -53,31 +53,31 @@ func (b *BaseMenu) UpdataBaseMenu() (err error) {
upDataMap["component"] = b.Component
upDataMap["title"] = b.Title
upDataMap["icon"] = b.Icon
err = qmsql.DEFAULTDB.Where("id = ?", b.ID).Find(&BaseMenu{}).Updates(upDataMap).Error
err1 := qmsql.DEFAULTDB.Where("menu_id = ?", b.ID).Find(&[]Menu{}).Updates(upDataMap).Error
err = qmsql.DEFAULTDB.Where("id = ?", b.ID).Find(&SysBaseMenu{}).Updates(upDataMap).Error
err1 := qmsql.DEFAULTDB.Where("menu_id = ?", b.ID).Find(&[]SysMenu{}).Updates(upDataMap).Error
fmt.Printf("菜单修改时候,关联菜单err:%v", err1)
return err
}
func (b *BaseMenu) GetBaseMenuById(id float64) (err error, menu BaseMenu) {
func (b *SysBaseMenu) GetBaseMenuById(id float64) (err error, menu SysBaseMenu) {
err = qmsql.DEFAULTDB.Where("id = ?", id).First(&menu).Error
return
}
func (b *BaseMenu) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
func (b *SysBaseMenu) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
// 封装分页方法 调用即可 传入 当前的结构体和分页信息
err, db, total := servers.PagingServer(b, info)
if err != nil {
return
} else {
var menuList []BaseMenu
var menuList []SysBaseMenu
err = db.Find(&menuList).Error
return err, menuList, total
}
}
//获取基础路由树
func (m *BaseMenu) GetBaseMenuTree() (err error, menus []BaseMenu) {
func (m *SysBaseMenu) GetBaseMenuTree() (err error, menus []SysBaseMenu) {
err = qmsql.DEFAULTDB.Where(" parent_id = ?", 0).Find(&menus).Error
for i := 0; i < len(menus); i++ {
err = getBaseChildrenList(&menus[i])
......@@ -85,7 +85,7 @@ func (m *BaseMenu) GetBaseMenuTree() (err error, menus []BaseMenu) {
return err, menus
}
func getBaseChildrenList(menu *BaseMenu) (err error) {
func getBaseChildrenList(menu *SysBaseMenu) (err error) {
err = qmsql.DEFAULTDB.Where("parent_id = ?", menu.ID).Find(&menu.Children).Error
for i := 0; i < len(menu.Children); i++ {
err = getBaseChildrenList(&menu.Children[i])
......
package sysModel
import (
"errors"
"github.com/casbin/casbin"
gormadapter "github.com/casbin/gorm-adapter"
"main/init/qmsql"
"strings"
)
type CasbinModel struct {
ID uint `json:"id" gorm:"column:_id"`
Ptype string `json:"ptype" gorm:"column:ptype"`
AuthorityId string `json:"rolename" gorm:"column:v0"`
Path string `json:"path" gorm:"column:v1"`
Method string `json:"method" gorm:"column:v2"`
}
// 更新权限
func (c *CasbinModel) CasbinPUpdata(AuthorityId string,Paths []string)error{
c.clearCasbin(0,AuthorityId)
for _,v:=range Paths{
cm:= CasbinModel{
ID: 0,
Ptype: "p",
AuthorityId: AuthorityId,
Path: v,
Method: "POST",
}
addflag := c.AddCasbin(cm)
if(addflag == false){
return errors.New("存在相同api,添加失败,请联系管理员")
}
}
return nil
}
// API更新随动
func (c *CasbinModel) CasbinApiUpdata(oldPath string,newPath string)error{
var cs []CasbinModel
err := qmsql.DEFAULTDB.Table("casbin_rule").Where("v1 = ?",oldPath).Find(&cs).Update("v1", newPath).Error
return err
}
//添加权限
func (c *CasbinModel) AddCasbin(cm CasbinModel) bool {
e := Casbin()
return e.AddPolicy( cm.AuthorityId, cm.Path, cm.Method)
}
//获取权限列表
func (c *CasbinModel) GetPolicyPathByAuthorityId(AuthorityId string)[]string {
e := Casbin()
var pathList []string
list := e.GetFilteredPolicy(0, AuthorityId)
for _,v:=range list{
pathList = append(pathList, v[1])
}
return pathList
}
//清除匹配的权限
func (c *CasbinModel) clearCasbin(v int,p string) bool {
e := Casbin()
return e.RemoveFilteredPolicy(v,p)
}
// 自定义规则函数
func ParamsMatch(key1 string, key2 string) bool {
k1arr := strings.Split(key1,"?")
return k1arr[0] == key2
}
// 自定义规则函数
func ParamsMatchFunc(args ...interface{}) (interface{}, error) {
name1 := args[0].(string)
name2 := args[1].(string)
return (bool)(ParamsMatch(name1, name2)), nil
}
//持久化到数据库 引入自定义规则
func Casbin() *casbin.Enforcer {
a := gormadapter.NewAdapterByDB(qmsql.DEFAULTDB)
e := casbin.NewEnforcer("./static/rbacmodel/rbac_model.conf", a)
e.AddFunction("ParamsMatch", ParamsMatchFunc)
e.LoadPolicy()
return e
}
package dbModel
package sysModel
import (
"fmt"
......@@ -6,11 +6,11 @@ import (
)
// menu需要构建的点有点多 这里关联关系表直接把所有数据拿过来 用代码实现关联 后期实现主外键模式
type Menu struct {
BaseMenu
MenuId string `json:"menuId"`
AuthorityId string `json:"-"`
Children []Menu `json:"children"`
type SysMenu struct {
SysBaseMenu
MenuId string `json:"menuId"`
AuthorityId string `json:"-"`
Children []SysMenu `json:"children"`
}
type Meta struct {
......@@ -19,11 +19,11 @@ type Meta struct {
}
// 为角色增加menu树
func (m *Menu) AddMenuAuthority(menus []BaseMenu, authorityId string) (err error) {
var menu Menu
qmsql.DEFAULTDB.Where("authority_id = ? ", authorityId).Unscoped().Delete(&Menu{})
func (m *SysMenu) AddMenuAuthority(menus []SysBaseMenu, authorityId string) (err error) {
var menu SysMenu
qmsql.DEFAULTDB.Where("authority_id = ? ", authorityId).Unscoped().Delete(&SysMenu{})
for _, v := range menus {
menu.BaseMenu = v
menu.SysBaseMenu = v
menu.AuthorityId = authorityId
menu.MenuId = fmt.Sprintf("%v", v.ID)
menu.ID = 0
......@@ -36,13 +36,13 @@ func (m *Menu) AddMenuAuthority(menus []BaseMenu, authorityId string) (err error
}
// 查看当前角色树
func (m *Menu) GetMenuAuthority(authorityId string) (err error, menus []Menu) {
func (m *SysMenu) GetMenuAuthority(authorityId string) (err error, menus []SysMenu) {
err = qmsql.DEFAULTDB.Where("authority_id = ?", authorityId).Find(&menus).Error
return err, menus
}
//获取动态路由树
func (m *Menu) GetMenuTree(authorityId string) (err error, menus []Menu) {
func (m *SysMenu) GetMenuTree(authorityId string) (err error, menus []SysMenu) {
err = qmsql.DEFAULTDB.Where("authority_id = ? AND parent_id = ?", authorityId, 0).Find(&menus).Error
for i := 0; i < len(menus); i++ {
err = getChildrenList(&menus[i])
......@@ -50,7 +50,7 @@ func (m *Menu) GetMenuTree(authorityId string) (err error, menus []Menu) {
return err, menus
}
func getChildrenList(menu *Menu) (err error) {
func getChildrenList(menu *SysMenu) (err error) {
err = qmsql.DEFAULTDB.Where("authority_id = ? AND parent_id = ?", menu.AuthorityId, menu.MenuId).Find(&menu.Children).Error
for i := 0; i < len(menu.Children); i++ {
err = getChildrenList(&menu.Children[i])
......
package dbModel
package sysModel
import (
"github.com/jinzhu/gorm"
......@@ -10,17 +10,15 @@ import (
"main/tools"
)
type User struct {
type SysUser struct {
gorm.Model
UUID uuid.UUID `json:"uuid"`
Username string `json:"userName"`
Password string `json:"-"`
NickName string `json:"nickName" gorm:"default:'QMPlusUser'"`
HeaderImg string `json:"headerImg" gorm:"default:'http://www.henrongyi.top/avatar/lufu.jpg'"`
Authority Authority `json:"authority" gorm:"ForeignKey:AuthorityId;AssociationForeignKey:AuthorityId"`
AuthorityId string `json:"-" gorm:"default:888"`
//Propertie // 多余属性自行添加
//PropertieId uint // 自动关联 Propertie 的Id 附加属性过多 建议创建一对一关系
UUID uuid.UUID `json:"uuid"`
Username string `json:"userName"`
Password string `json:"-"`
NickName string `json:"nickName" gorm:"default:'QMPlusUser'"`
HeaderImg string `json:"headerImg" gorm:"default:'http://www.henrongyi.top/avatar/lufu.jpg'"`
Authority SysAuthority `json:"authority" gorm:"ForeignKey:AuthorityId;AssociationForeignKey:AuthorityId"`
AuthorityId string `json:"-" gorm:"default:888"`
}
//type Propertie struct {
......@@ -28,8 +26,8 @@ type User struct {
//}
//注册接口model方法
func (u *User) Regist() (err error, userInter *User) {
var user User
func (u *SysUser) Regist() (err error, userInter *SysUser) {
var user SysUser
//判断用户名是否注册
findErr := qmsql.DEFAULTDB.Where("username = ?", u.Username).First(&user).Error
//err为nil表明读取到了 不能注册
......@@ -45,8 +43,8 @@ func (u *User) Regist() (err error, userInter *User) {
}
//修改用户密码
func (u *User) ChangePassword(newPassword string) (err error, userInter *User) {
var user User
func (u *SysUser) ChangePassword(newPassword string) (err error, userInter *SysUser) {
var user SysUser
//后期修改jwt+password模式
u.Password = tools.MD5V(u.Password)
err = qmsql.DEFAULTDB.Where("username = ? AND password = ?", u.Username, u.Password).First(&user).Update("password", tools.MD5V(newPassword)).Error
......@@ -54,14 +52,14 @@ func (u *User) ChangePassword(newPassword string) (err error, userInter *User) {
}
//用户更新接口
func (u *User) SetUserAuthority(uuid uuid.UUID, AuthorityId string) (err error) {
err = qmsql.DEFAULTDB.Where("uuid = ?", uuid).First(&User{}).Update("authority_id", AuthorityId).Error
func (u *SysUser) SetUserAuthority(uuid uuid.UUID, AuthorityId string) (err error) {
err = qmsql.DEFAULTDB.Where("uuid = ?", uuid).First(&SysUser{}).Update("authority_id", AuthorityId).Error
return err
}
//用户登录
func (u *User) Login() (err error, userInter *User) {
var user User
func (u *SysUser) Login() (err error, userInter *SysUser) {
var user SysUser
u.Password = tools.MD5V(u.Password)
err = qmsql.DEFAULTDB.Where("username = ? AND password = ?", u.Username, u.Password).First(&user).Error
err = qmsql.DEFAULTDB.Where("authority_id = ?", user.AuthorityId).First(&user.Authority).Error
......@@ -69,20 +67,20 @@ func (u *User) Login() (err error, userInter *User) {
}
// 用户头像上传更新地址
func (u *User) UploadHeaderImg(uuid uuid.UUID, filePath string) (err error, userInter *User) {
var user User
func (u *SysUser) UploadHeaderImg(uuid uuid.UUID, filePath string) (err error, userInter *SysUser) {
var user SysUser
err = qmsql.DEFAULTDB.Where("uuid = ?", uuid).First(&user).Update("header_img", filePath).First(&user).Error
return err, &user
}
// 分页获取数据 需要分页实现这个接口即可
func (u *User) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
func (u *SysUser) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) {
// 封装分页方法 调用即可 传入 当前的结构体和分页信息
err, db, total := servers.PagingServer(u, info)
if err != nil {
return
} else {
var userList []User
var userList []SysUser
err = db.Preload("Authority").Find(&userList).Error
return err, userList, total
}
......
package dbModel
package sysModel
import (
"github.com/jinzhu/gorm"
......@@ -6,18 +6,18 @@ import (
)
//工作流属性表
type Workflow struct {
type SysWorkflow struct {
gorm.Model
WorkflowNickName string `json:"workflowNickName"` // 工作流名称
WorkflowName string `json:"workflowName"` // 工作流英文id
WorkflowDescription string `json:"workflowDescription"` // 工作流描述
WorkflowStep []WorkflowStepInfo `json:"workflowStep"` // 工作流步骤
WorkflowNickName string `json:"workflowNickName"` // 工作流名称
WorkflowName string `json:"workflowName"` // 工作流英文id
WorkflowDescription string `json:"workflowDescription"` // 工作流描述
WorkflowStepInfo []SysWorkflowStepInfo `json:"workflowStep"` // 工作流步骤
}
// 工作流状态表
type WorkflowStepInfo struct {
type SysWorkflowStepInfo struct {
gorm.Model
WorkflowID uint `json:"workflowID"` // 所属工作流ID
SysWorkflowID uint `json:"workflowID"` // 所属工作流ID
IsStrat bool `json:"isStrat"` // 是否是开始流节点
StepName string `json:"stepName"` // 工作流名称
StepNo float64 `json:"stepNo"` // 步骤id (第几步)
......@@ -26,7 +26,7 @@ type WorkflowStepInfo struct {
}
//创建工作流
func (wk *Workflow) Create() error {
func (wk *SysWorkflow) Create() error {
err := qmsql.DEFAULTDB.Create(&wk).Error
return err
}
package dbModel
package sysModel
import "github.com/jinzhu/gorm"
// 工作流流转表
type WorkFlowProcess struct {
type SysWorkFlowProcess struct {
gorm.Model
ApplicationID uint // 当前工作流所属申请的ID
CurrentNode string // 当前进度节点
......
......@@ -3,14 +3,16 @@ package router
import (
"github.com/gin-gonic/gin"
"main/controller/api"
"main/middleware"
)
func InitFileUploadAndDownloadRouter(Router *gin.Engine) {
FileUploadAndDownloadGroup := Router.Group("fileUploadAndDownload")
func InitFileUploadAndDownloadRouter(Router *gin.Engine)(R gin.IRoutes) {
FileUploadAndDownloadGroup := Router.Group("fileUploadAndDownload").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
//.Use(middleware.JWTAuth())
{
FileUploadAndDownloadGroup.POST("/upload", api.UploadFile) // 上传文件
FileUploadAndDownloadGroup.POST("/getFileList", api.GetFileList) // 获取上传文件列表
FileUploadAndDownloadGroup.POST("/deleteFile", api.DeleteFile) // 删除指定文件
}
return FileUploadAndDownloadGroup
}
......@@ -6,8 +6,8 @@ import (
"main/middleware"
)
func InitApiRouter(Router *gin.Engine) {
ApiRouter := Router.Group("api").Use(middleware.JWTAuth())
func InitApiRouter(Router *gin.Engine)(R gin.IRoutes) {
ApiRouter := Router.Group("api").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
{
ApiRouter.POST("createApi", api.CreateApi) //创建Api
ApiRouter.POST("deleteApi", api.DeleteApi) //删除Api
......@@ -18,4 +18,5 @@ func InitApiRouter(Router *gin.Engine) {
ApiRouter.POST("getAllApis",api.GetAllApis) // 获取所有api
ApiRouter.POST("getAuthAndApi",api.GetAuthAndApi) // 获取api和auth关系
}
return ApiRouter
}
......@@ -6,11 +6,12 @@ import (
"main/middleware"
)
func InitAuthorityRouter(Router *gin.Engine) {
AuthorityRouter := Router.Group("authority").Use(middleware.JWTAuth())
func InitAuthorityRouter(Router *gin.Engine)(R gin.IRoutes) {
AuthorityRouter := Router.Group("authority").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
{
AuthorityRouter.POST("createAuthority", api.CreateAuthority) //创建角色
AuthorityRouter.POST("deleteAuthority", api.DeleteAuthority) //删除角色
AuthorityRouter.POST("getAuthorityList",api.GetAuthorityList) //获取角色列表
}
return AuthorityRouter
}
......@@ -5,10 +5,11 @@ import (
"main/controller/api"
)
func InitBaseRouter(Router *gin.Engine) {
func InitBaseRouter(Router *gin.Engine)(R gin.IRoutes) {
BaseRouter := Router.Group("base")
{
BaseRouter.POST("regist", api.Regist)
BaseRouter.POST("login", api.Login)
}
return BaseRouter
}
package router
import (
"github.com/gin-gonic/gin"
"main/controller/api"
"main/middleware"
)
func InitCasbinRouter(Router *gin.Engine)(R gin.IRoutes) {
BaseRouter := Router.Group("casbin").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
{
BaseRouter.POST("casbinPUpdata", api.CasbinPUpdata)
BaseRouter.POST("getPolicyPathByAuthorityId", api.GetPolicyPathByAuthorityId)
}
return BaseRouter
}
......@@ -6,8 +6,8 @@ import (
"main/middleware"
)
func InitMenuRouter(Router *gin.Engine) {
MenuRouter := Router.Group("menu").Use(middleware.JWTAuth())
func InitMenuRouter(Router *gin.Engine)(R gin.IRoutes) {
MenuRouter := Router.Group("menu").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
{
MenuRouter.POST("getMenu", api.GetMenu) //获取菜单树
MenuRouter.POST("getMenuList", api.GetMenuList) // 分页获取基础menu列表
......@@ -19,4 +19,5 @@ func InitMenuRouter(Router *gin.Engine) {
MenuRouter.POST("updataBaseMenu", api.UpdataBaseMenu) // 更新菜单
MenuRouter.POST("getBaseMenuById", api.GetBaseMenuById) //根据id获取菜单
}
return MenuRouter
}
......@@ -7,7 +7,7 @@ import (
)
func InitUserRouter(Router *gin.Engine) {
UserRouter := Router.Group("user").Use(middleware.JWTAuth())
UserRouter := Router.Group("user").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
{
UserRouter.POST("changePassword", api.ChangePassword) // 修改密码
UserRouter.POST("uploadHeaderImg", api.UploadHeaderImg) //上传头像
......
......@@ -3,12 +3,13 @@ package router
import (
"github.com/gin-gonic/gin"
"main/controller/api"
"main/middleware"
)
func InitWorkflowRouter(Router *gin.Engine) {
WorkflowRouter := Router.Group("workflow")
//.Use(middleware.JWTAuth())
func InitWorkflowRouter(Router *gin.Engine)(R gin.IRoutes) {
WorkflowRouter := Router.Group("workflow").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
{
WorkflowRouter.POST("createWorkFlow", api.CreateWorkFlow) // 创建工作流
}
return WorkflowRouter
}
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && ParamsMatch(r.obj, p.obj) && r.act == p.act
import service from '@/utils/request'
// @Tags authority
// @Summary 更改角色api权限
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body api.CreateAuthorityPatams true "更改角色api权限"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /casbin/casbinPUpdata [post]
export const casbinPUpdata = (data) => {
return service({
url: "/casbin/casbinPUpdata",
method: 'post',
data
})
}
// @Tags casbin
// @Summary 获取权限列表
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body api.CreateAuthorityPatams true "获取权限列表"
// @Success 200 {string} json "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /casbin/getPolicyPathByAuthorityId [post]
export const getPolicyPathByAuthorityId = (data) => {
return service({
url: "/casbin/getPolicyPathByAuthorityId",
method: 'post',
data
})
}
\ No newline at end of file
......@@ -68,7 +68,7 @@
:props="apiDefaultProps"
default-expand-all
highlight-current
node-key="ID"
node-key="path"
ref="apiTree"
show-checkbox
v-if="apiDialogFlag"
......@@ -91,6 +91,7 @@ import {
} from '@/api/authority'
import { getBaseMenuTree, addMenuAuthority, getMenuAuthority } from '@/api/menu'
import { getAllApis, getAuthAndApi, setAuthAndApi } from '@/api/api'
import { casbinPUpdata,getPolicyPathByAuthorityId } from '@/api/casbin'
import infoList from '@/components/mixins/infoList'
export default {
name: 'Authority',
......@@ -234,24 +235,19 @@ export default {
},
// 关联用户api关系
async addAuthApi(row) {
const res = await getAuthAndApi({ authorityId: row.authorityId })
const res = await getPolicyPathByAuthorityId({ authorityId: row.authorityId })
this.activeUserId = row.authorityId
this.apiTreeIds = res.data.apis || []
this.apiTreeIds = res.data.paths || []
this.apiDialogFlag = true
},
// 关联关系确定
async authApiEnter() {
const checkArr = this.$refs.apiTree.getCheckedKeys(true)
const res = await setAuthAndApi({
authorityId: this.activeUserId,
apiIds: checkArr
})
if (res.success) {
this.$message({
type: 'success',
message: '添加成功!'
})
const res = await casbinPUpdata({ authorityId: this.activeUserId,paths:checkArr})
if(res.success){
this.$message({type:"success",message:res.msg})
this.closeDialog()
}
this.closeDialog()
}
},
async created() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册