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

This commit is contained in:
pixel
2019-12-12 13:21:16 +08:00
parent effab2d2b0
commit 3f17e80944
46 changed files with 576 additions and 338 deletions

View File

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

View File

@@ -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 // 请假开始日期
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 // 当前进度节点