Эх сурвалжийг харах

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

pixel 5 жил өмнө
parent
commit
211b1f2db0
46 өөрчлөгдсөн 576 нэмэгдсэн , 338 устгасан
  1. 1 1
      QMPlusServer/config/config.go
  2. 7 7
      QMPlusServer/controller/api/exa_fileUploadAndDownload.go
  3. 17 17
      QMPlusServer/controller/api/sys_api.go
  4. 5 5
      QMPlusServer/controller/api/sys_authority.go
  5. 48 0
      QMPlusServer/controller/api/sys_casbin.go
  6. 13 13
      QMPlusServer/controller/api/sys_menu.go
  7. 12 12
      QMPlusServer/controller/api/sys_user.go
  8. 3 3
      QMPlusServer/controller/api/sys_workFlow.go
  9. 14 14
      QMPlusServer/docs/docs.go
  10. 3 2
      QMPlusServer/go.mod
  11. 0 26
      QMPlusServer/init/initRouter/initRouter.go
  12. 28 0
      QMPlusServer/init/initRouter/init_router.go
  13. 2 2
      QMPlusServer/init/qmlog/qmlog.go
  14. 0 20
      QMPlusServer/init/registTable/registTable.go
  15. 21 0
      QMPlusServer/init/registTable/regist_table.go
  16. 0 6
      QMPlusServer/log/api.log.2019-11-01-08-00.log
  17. 9 10
      QMPlusServer/main.go
  18. 31 0
      QMPlusServer/middleware/casbin_rcba.go
  19. 1 17
      QMPlusServer/middleware/jwt.go
  20. 26 0
      QMPlusServer/middleware/loadtls.go
  21. 0 36
      QMPlusServer/model/dbModel/api_authority.go
  22. 0 18
      QMPlusServer/model/dbModel/application.go
  23. 7 7
      QMPlusServer/model/dbModel/exa_fileUploadAndDownload.go
  24. 0 1
      QMPlusServer/model/dbModel/exampleExcel.go
  25. 23 12
      QMPlusServer/model/sysModel/sys_api.go
  26. 35 0
      QMPlusServer/model/sysModel/sys_api_authority.go
  27. 9 8
      QMPlusServer/model/sysModel/sys_authority.go
  28. 17 17
      QMPlusServer/model/sysModel/sys_base_menu.go
  29. 92 0
      QMPlusServer/model/sysModel/sys_casbin.go
  30. 13 13
      QMPlusServer/model/sysModel/sys_menu_authority.go
  31. 21 23
      QMPlusServer/model/sysModel/sys_user.go
  32. 9 9
      QMPlusServer/model/sysModel/sys_worfFlow.go
  33. 2 2
      QMPlusServer/model/sysModel/sys_workFlowProcess.go
  34. 4 2
      QMPlusServer/router/exp_fileUploadAndDownload.go
  35. 3 2
      QMPlusServer/router/sys_api.go
  36. 3 2
      QMPlusServer/router/sys_authority.go
  37. 2 1
      QMPlusServer/router/sys_base.go
  38. 18 0
      QMPlusServer/router/sys_casbin.go
  39. 3 2
      QMPlusServer/router/sys_menu.go
  40. 1 1
      QMPlusServer/router/sys_user.go
  41. 15 0
      QMPlusServer/router/sys_workflow.go
  42. 0 14
      QMPlusServer/router/workflow.go
  43. 0 0
      QMPlusServer/static/dbconfig/config.json
  44. 14 0
      QMPlusServer/static/rbacmodel/rbac_model.conf
  45. 35 0
      QMPlusVuePage/src/api/casbin.js
  46. 9 13
      QMPlusVuePage/src/view/superAdmin/authority/authority.vue

+ 1 - 1
QMPlusServer/config/config.go

@@ -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 {

+ 7 - 7
QMPlusServer/controller/api/fileUploadAndDownload.go → QMPlusServer/controller/api/exa_fileUploadAndDownload.go

@@ -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 {

+ 17 - 17
QMPlusServer/controller/api/api.go → QMPlusServer/controller/api/sys_api.go

@@ -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 {

+ 5 - 5
QMPlusServer/controller/api/authority.go → QMPlusServer/controller/api/sys_authority.go

@@ -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 {

+ 48 - 0
QMPlusServer/controller/api/sys_casbin.go

@@ -0,0 +1,48 @@
+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})
+}

+ 13 - 13
QMPlusServer/controller/api/menu.go → QMPlusServer/controller/api/sys_menu.go

@@ -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 {

+ 12 - 12
QMPlusServer/controller/api/user.go → QMPlusServer/controller/api/sys_user.go

@@ -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 {

+ 3 - 3
QMPlusServer/controller/api/workFlow.go → QMPlusServer/controller/api/sys_workFlow.go

@@ -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 {

+ 14 - 14
QMPlusServer/docs/docs.go

@@ -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": {

+ 3 - 2
QMPlusServer/go.mod

@@ -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
 )

+ 0 - 26
QMPlusServer/init/initRouter/initRouter.go

@@ -1,26 +0,0 @@
-package initRouter
-
-import (
-	"github.com/gin-gonic/gin"
-	"github.com/swaggo/gin-swagger"
-	"github.com/swaggo/gin-swagger/swaggerFiles"
-	_ "main/docs"
-	"main/middleware"
-	"main/router"
-)
-
-//初始化总路由
-func InitRouter() *gin.Engine {
-	var Router = gin.Default()
-	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)              // 工作流相关路由
-	return Router
-}

+ 28 - 0
QMPlusServer/init/initRouter/init_router.go

@@ -0,0 +1,28 @@
+package initRouter
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/swaggo/gin-swagger"
+	"github.com/swaggo/gin-swagger/swaggerFiles"
+	_ "main/docs"
+	"main/middleware"
+	"main/router"
+)
+
+//初始化总路由
+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.InitCasbinRouter(Router)
+	return Router
+}

+ 2 - 2
QMPlusServer/init/qmlog/qmlog.go

@@ -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
 }

+ 0 - 20
QMPlusServer/init/registTable/registTable.go

@@ -1,20 +0,0 @@
-package registTable
-
-import (
-	"github.com/jinzhu/gorm"
-	"main/model/dbModel"
-)
-
-//注册数据库表专用
-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{},
-	)
-}

+ 21 - 0
QMPlusServer/init/registTable/regist_table.go

@@ -0,0 +1,21 @@
+package registTable
+
+import (
+	"github.com/jinzhu/gorm"
+	"main/model/dbModel"
+	"main/model/sysModel"
+)
+
+//注册数据库表专用
+func RegistTable(db *gorm.DB) {
+	db.AutoMigrate(sysModel.SysUser{},
+		sysModel.SysAuthority{},
+		sysModel.SysMenu{},
+		sysModel.SysApi{},
+		sysModel.SysApiAuthority{},
+		sysModel.SysBaseMenu{},
+		dbModel.ExaFileUploadAndDownload{},
+		sysModel.SysWorkflow{},
+		sysModel.SysWorkflowStepInfo{},
+	)
+}

+ 0 - 6
QMPlusServer/log/api.log.2019-11-01-08-00.log

@@ -1,6 +0,0 @@
-{"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"}

+ 9 - 10
QMPlusServer/main.go

@@ -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) {
-
-}

+ 31 - 0
QMPlusServer/middleware/casbin_rcba.go

@@ -0,0 +1,31 @@
+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
+		}
+	}
+}

+ 1 - 17
QMPlusServer/middleware/jwt.go

@@ -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()
 	}
 }
 

+ 26 - 0
QMPlusServer/middleware/loadtls.go

@@ -0,0 +1,26 @@
+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()
+	}
+}

+ 0 - 36
QMPlusServer/model/dbModel/api_authority.go

@@ -1,36 +0,0 @@
-package dbModel
-
-import (
-	"github.com/jinzhu/gorm"
-	"main/init/qmsql"
-)
-
-type ApiAuthority struct {
-	gorm.Model
-	AuthorityId string
-	Authority   Authority `gorm:"ForeignKey:AuthorityId;AssociationForeignKey:AuthorityId"` //其实没有关联的必要
-	ApiId       uint
-	Api         Api
-}
-
-//创建角色api关联关系
-func (a *ApiAuthority) SetAuthAndApi(authId string, apisid []uint) (err error) {
-	err = qmsql.DEFAULTDB.Where("authority_id = ?", authId).Unscoped().Delete(&ApiAuthority{}).Error
-	for _, v := range apisid {
-		err = qmsql.DEFAULTDB.Create(&ApiAuthority{AuthorityId: authId, ApiId: v}).Error
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-// 获取角色api关联关系
-func (a *ApiAuthority) GetAuthAndApi(authId string) (err error,apiIds []uint) {
-	var apis []ApiAuthority
-	err = qmsql.DEFAULTDB.Where("authority_id = ?", authId).Find(&apis).Error
-	for _, v := range apis {
-		apiIds = append(apiIds,v.ApiId)
-	}
-	return nil,apiIds
-}

+ 0 - 18
QMPlusServer/model/dbModel/application.go

@@ -1,18 +0,0 @@
-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
QMPlusServer/model/dbModel/fileUploadAndDownload.go → QMPlusServer/model/dbModel/exa_fileUploadAndDownload.go

@@ -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
 	}

+ 0 - 1
QMPlusServer/model/dbModel/exampleExcel.go

@@ -1 +0,0 @@
-package dbModel

+ 23 - 12
QMPlusServer/model/dbModel/api.go → QMPlusServer/model/sysModel/sys_api.go

@@ -1,4 +1,4 @@
-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
 	}

+ 35 - 0
QMPlusServer/model/sysModel/sys_api_authority.go

@@ -0,0 +1,35 @@
+package sysModel
+
+import (
+	"github.com/jinzhu/gorm"
+	"main/init/qmsql"
+)
+
+type SysApiAuthority struct {
+	gorm.Model
+	AuthorityId string
+	Authority   SysAuthority `gorm:"ForeignKey:AuthorityId;AssociationForeignKey:AuthorityId"` //其实没有关联的必要
+	ApiId       uint
+	Api         SysApi
+}
+
+//创建角色api关联关系
+func (a *SysApiAuthority) SetAuthAndApi(authId string, apisid []uint) (err error) {
+	for _, v := range apisid {
+		err = qmsql.DEFAULTDB.Create(&SysApiAuthority{AuthorityId: authId, ApiId: v}).Error
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+// 获取角色api关联关系
+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)
+	}
+	return nil,apiIds
+}

+ 9 - 8
QMPlusServer/model/dbModel/authority.go → QMPlusServer/model/sysModel/sys_authority.go

@@ -1,4 +1,4 @@
-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
 	}

+ 17 - 17
QMPlusServer/model/dbModel/baseMenu.go → QMPlusServer/model/sysModel/sys_base_menu.go

@@ -1,4 +1,4 @@
-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])

+ 92 - 0
QMPlusServer/model/sysModel/sys_casbin.go

@@ -0,0 +1,92 @@
+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
+}

+ 13 - 13
QMPlusServer/model/dbModel/menu_authority.go → QMPlusServer/model/sysModel/sys_menu_authority.go

@@ -1,4 +1,4 @@
-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])

+ 21 - 23
QMPlusServer/model/dbModel/user.go → QMPlusServer/model/sysModel/sys_user.go

@@ -1,4 +1,4 @@
-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
 	}

+ 9 - 9
QMPlusServer/model/dbModel/worfFlow.go → QMPlusServer/model/sysModel/sys_worfFlow.go

@@ -1,4 +1,4 @@
-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
 }

+ 2 - 2
QMPlusServer/model/dbModel/workFlowProcess.go → QMPlusServer/model/sysModel/sys_workFlowProcess.go

@@ -1,9 +1,9 @@
-package dbModel
+package sysModel
 
 import "github.com/jinzhu/gorm"
 
 // 工作流流转表
-type WorkFlowProcess struct {
+type SysWorkFlowProcess struct {
 	gorm.Model
 	ApplicationID  uint   // 当前工作流所属申请的ID
 	CurrentNode    string // 当前进度节点

+ 4 - 2
QMPlusServer/router/fileUploadAndDownload.go → QMPlusServer/router/exp_fileUploadAndDownload.go

@@ -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
 }

+ 3 - 2
QMPlusServer/router/api.go → QMPlusServer/router/sys_api.go

@@ -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
 }

+ 3 - 2
QMPlusServer/router/authority.go → QMPlusServer/router/sys_authority.go

@@ -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
 }

+ 2 - 1
QMPlusServer/router/base.go → QMPlusServer/router/sys_base.go

@@ -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
 }

+ 18 - 0
QMPlusServer/router/sys_casbin.go

@@ -0,0 +1,18 @@
+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
+}

+ 3 - 2
QMPlusServer/router/menu.go → QMPlusServer/router/sys_menu.go

@@ -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
 }

+ 1 - 1
QMPlusServer/router/user.go → QMPlusServer/router/sys_user.go

@@ -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)   //上传头像

+ 15 - 0
QMPlusServer/router/sys_workflow.go

@@ -0,0 +1,15 @@
+package router
+
+import (
+	"github.com/gin-gonic/gin"
+	"main/controller/api"
+	"main/middleware"
+)
+
+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
+}

+ 0 - 14
QMPlusServer/router/workflow.go

@@ -1,14 +0,0 @@
-package router
-
-import (
-	"github.com/gin-gonic/gin"
-	"main/controller/api"
-)
-
-func InitWorkflowRouter(Router *gin.Engine) {
-	WorkflowRouter := Router.Group("workflow")
-	//.Use(middleware.JWTAuth())
-	{
-		WorkflowRouter.POST("createWorkFlow", api.CreateWorkFlow) // 创建工作流
-	}
-}

+ 0 - 0
QMPlusServer/config/dbconfig/config.json → QMPlusServer/static/dbconfig/config.json


+ 14 - 0
QMPlusServer/static/rbacmodel/rbac_model.conf

@@ -0,0 +1,14 @@
+[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

+ 35 - 0
QMPlusVuePage/src/api/casbin.js

@@ -0,0 +1,35 @@
+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
+    })
+}

+ 9 - 13
QMPlusVuePage/src/view/superAdmin/authority/authority.vue

@@ -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() {