feat:完善项目信息

This commit is contained in:
henry
2022-01-07 16:12:43 +08:00
parent 657fdc5750
commit 2bf3c01702
21 changed files with 379 additions and 129 deletions

View File

@ -10,7 +10,42 @@ import (
type Auth struct{}
type authForm struct {
ParentID string `json:"parent_id" form:"parent_id"`
Kind int `json:"kind" form:"kind" binding:"required"`
Name string `json:"name" form:"name" binding:"required"`
Auth string `json:"auth" form:"auth" binding:"required"`
Sort int `json:"sort" form:"sort"`
Remark string `json:"remark" form:"remark"`
}
func (*Auth) Index(c *gin.Context) {
data, err := auth.NewInstance()(api.GetSession()(c).(*session.Admin)).Index()
api.APIResponse(err, data)(c)
}
func (*Auth) Add(c *gin.Context) {
form := &struct {
RoleID string `json:"role_id" form:"role_id" binding:"required"`
AuthIDs []string `json:"auth_ids" form:"auth_ids" binding:"required"`
}{}
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
}
func (*Auth) Edit(c *gin.Context) {
form := &struct {
RoleID string `json:"role_id" form:"role_id" binding:"required"`
AuthIDs []string `json:"auth_ids" form:"auth_ids" binding:"required"`
}{}
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
}
func (*Auth) Delete(c *gin.Context) {
}

View File

@ -4,7 +4,6 @@ import (
"SciencesServer/app/api/admin/controller/department"
"SciencesServer/app/basic/api"
"SciencesServer/app/session"
"github.com/gin-gonic/gin"
)
@ -13,14 +12,21 @@ type Department struct{}
type departmentForm struct {
ParentID string `json:"parent_id" form:"parent_id"`
Name string `json:"name" form:"name" binding:"required"`
Contact string `json:"contact" form:"contact_title"`
Contact string `json:"contact" form:"contact"`
ContactMobile string `json:"contact_mobile" form:"contact_mobile"`
Status int `json:"status" form:"status" binding:"required"`
Remark string `json:"remark" form:"remark"`
}
func (a *Department) Index(c *gin.Context) {
data, err := department.NewInstance()(api.GetSession()(c).(*session.Admin)).Index()
form := &struct {
FilterID string `json:"filter_id" form:"filter_id"`
}{}
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
data, err := department.NewInstance()(api.GetSession()(c).(*session.Admin)).Index((&api.IDStringForm{ID: form.FilterID}).Convert())
api.APIResponse(err, data)(c)
}

View File

@ -19,7 +19,7 @@ type (
Link string `json:"path" form:"path"`
Component string `json:"component" form:"component"`
Icon string `json:"icon" form:"icon"`
Auth int `json:"auth" form:"auth"`
Auth string `json:"auth" form:"auth"`
Sort int `json:"sort" form:"sort"`
IsCache int `json:"is_cache" form:"is_cache"`
Hidden int `json:"hidden" form:"hidden"`

View File

@ -107,38 +107,48 @@ func (a *Tenant) MemberBind(c *gin.Context) {
func (a *Tenant) Menu(c *gin.Context) {
form := &struct {
TenantID uint64 `json:"tenant_id" form:"tenant_id" binding:"required"`
TenantID string `json:"tenant_id" form:"tenant_id" binding:"required"`
}{}
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
data, err := tenant.NewMenu()(api.GetSession()(c).(*session.Admin)).List(form.TenantID)
data, err := tenant.NewMenu()(api.GetSession()(c).(*session.Admin)).List((&api.IDStringForm{ID: form.TenantID}).Convert())
api.APIResponse(err, data)(c)
}
func (a *Tenant) MenuBind(c *gin.Context) {
form := &struct {
TenantID uint64 `json:"tenant_id" form:"tenant_id" binding:"required"`
MenuIDs []uint64 `json:"menu_ids" form:"menu_ids" binding:"required"`
TenantID string `json:"tenant_id" form:"tenant_id" binding:"required"`
MenuIDs []string `json:"menu_ids" form:"menu_ids" binding:"required"`
}{}
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
err := tenant.NewMenu()(api.GetSession()(c).(*session.Admin)).Bind(form.TenantID, form.MenuIDs)
menuIDs := make([]uint64, 0)
for _, v := range form.MenuIDs {
menuIDs = append(menuIDs, (&api.IDStringForm{ID: v}).Convert())
}
err := tenant.NewMenu()(api.GetSession()(c).(*session.Admin)).Bind((&api.IDStringForm{ID: form.TenantID}).Convert(), menuIDs)
api.APIResponse(err)(c)
}
func (a *Tenant) AuthBind(c *gin.Context) {
form := &struct {
TenantID uint64 `json:"tenant_id" form:"tenant_id" binding:"required"`
AuthIDs []uint64 `json:"auth_ids" form:"auth_ids" binding:"required"`
TenantID string `json:"tenant_id" form:"tenant_id" binding:"required"`
AuthIDs []string `json:"auth_ids" form:"auth_ids" binding:"required"`
}{}
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)
return
}
err := tenant.NewAuth()(api.GetSession()(c).(*session.Admin)).Bind(form.TenantID, form.AuthIDs)
authIDs := make([]uint64, 0)
for _, v := range form.AuthIDs {
authIDs = append(authIDs, (&api.IDStringForm{ID: v}).Convert())
}
err := tenant.NewAuth()(api.GetSession()(c).(*session.Admin)).Bind((&api.IDStringForm{ID: form.TenantID}).Convert(), authIDs)
api.APIResponse(err)(c)
}

View File

@ -11,12 +11,14 @@ import (
type User struct{}
type userForm struct {
Account string `json:"account" form:"account" binding:"required"`
Account string `json:"account" form:"account"`
Name string `json:"name" form:"name" binding:"required"`
Mobile string `json:"mobile" form:"mobile" binding:"required"`
Gender int `json:"gender" form:"gender" binding:"required"`
Status int `json:"status" form:"status" binding:"required"`
DepartmentID string `json:"department_id" form:"department_id"`
RoleIDs []string `json:"role_ids" form:"role_ids"`
Email string `json:"email" form:"email"`
Remark string `json:"remark" form:"remark"`
}
@ -81,8 +83,8 @@ func (a *User) Add(c *gin.Context) {
return
}
err := user.NewInstance()(api.GetSession()(c).(*session.Admin)).Add(&user.InstanceForm{
Account: form.Account, Name: form.Name, Mobile: form.Mobile, Password: form.Password,
Remark: form.Remark, Gender: form.Gender, DepartmentID: form.departmentInfo(), RoleIDs: form.RoleInfo(),
Account: form.Account, Name: form.Name, Mobile: form.Mobile, Password: form.Password, Status: form.Status,
Email: form.Email, Remark: form.Remark, Gender: form.Gender, DepartmentID: form.departmentInfo(), RoleIDs: form.RoleInfo(),
})
api.APIResponse(err)(c)
}
@ -97,8 +99,8 @@ func (a *User) Edit(c *gin.Context) {
return
}
err := user.NewInstance()(api.GetSession()(c).(*session.Admin)).Edit(&user.InstanceForm{
ID: form.Convert(), Account: form.Account, Name: form.Name, Mobile: form.Mobile,
Remark: form.Remark, Gender: form.Gender, DepartmentID: form.departmentInfo(), RoleIDs: form.RoleInfo(),
ID: form.Convert(), Account: form.Account, Name: form.Name, Mobile: form.Mobile, Status: form.Status,
Email: form.Email, Remark: form.Remark, Gender: form.Gender, DepartmentID: form.departmentInfo(), RoleIDs: form.RoleInfo(),
})
api.APIResponse(err)(c)
}
@ -107,7 +109,7 @@ func (a *User) Password(c *gin.Context) {
form := &struct {
api.IDStringForm
Password string `json:"password" form:"password" binding:"required"`
RepeatPwd string `json:"repeat_pwd" form:"repeat_pwd" binding:"required"`
RepeatPwd string `json:"repeat_pwd" form:"repeat_pwd"`
}{}
if err := api.Bind(form)(c); err != nil {
api.APIFailure(err.(error))(c)

View File

@ -4,19 +4,26 @@ import (
"SciencesServer/app/api/admin/model"
model2 "SciencesServer/app/common/model"
"SciencesServer/app/session"
"errors"
)
type Instance struct{ *session.Admin }
type InstanceHandle func(session *session.Admin) *Instance
type InstanceParams struct {
ID, ParentID uint64
Kind, Sort int
Name, Auth, Remark string
}
// Index 列表信息
func (c *Instance) Index() ([]*Tree, error) {
mSysAuth := model.NewSysAuth()
where := []*model2.ModelWhereOrder{
&model2.ModelWhereOrder{Order: model2.NewOrder("sort", model2.OrderModeToAsc)},
&model2.ModelWhereOrder{Order: model2.NewOrder("parent_id", model2.OrderModeToAsc)},
&model2.ModelWhereOrder{Order: model2.NewOrder("sort", model2.OrderModeToDesc)},
}
out := make([]*model2.SysAuth, 0)
@ -26,6 +33,44 @@ func (c *Instance) Index() ([]*Tree, error) {
return tree(out, 0), nil
}
// Form 数据操作
func (c *Instance) Form(params *InstanceParams) error {
mSysAuth := model.NewSysAuth()
if params.ID > 0 {
mSysAuth.ID = params.ID
if isExist, err := model2.First(mSysAuth.SysAuth); err != nil {
return err
} else if !isExist {
return errors.New("操作错误,权限信息不存在")
}
}
mSysAuth.ParentID = params.ParentID
mSysAuth.Kind = model2.SysAuthKind(params.Kind)
mSysAuth.Name = params.Name
mSysAuth.Auth = params.Auth
mSysAuth.Sort = params.Sort
mSysAuth.Remark = params.Remark
if mSysAuth.ID > 0 {
return model2.Updates(mSysAuth.SysAuth, mSysAuth.SysAuth)
}
return model2.Create(mSysAuth.SysAuth)
}
func (c *Instance) Delete(id uint64) error {
mSysAuth := model.NewSysAuth()
mSysAuth.ID = id
err := model2.Delete(mSysAuth.SysAuth)
if err != nil {
return err
}
return nil
}
func NewInstance() InstanceHandle {
return func(session *session.Admin) *Instance {
return &Instance{Admin: session}

View File

@ -49,18 +49,26 @@ func (c *Instance) tree(src []*model2.SysDepartment, parentID uint64) []*Instanc
return out
}
func (c *Instance) Index() ([]*InstanceTreeInfo, error) {
func (c *Instance) Index(filterID uint64) ([]*InstanceTreeInfo, error) {
mSysDepartment := model.NewSysDepartment()
out := make([]*model2.SysDepartment, 0)
if err := model2.Scan(mSysDepartment.SysDepartment, &out, &model2.ModelWhereOrder{
where := []*model2.ModelWhereOrder{
&model2.ModelWhereOrder{
Where: model2.NewWhere("tenant_id", c.TenantID),
Order: model2.NewOrder("parent_id", model2.OrderModeToAsc)},
&model2.ModelWhereOrder{
Order: model2.NewOrder("id", model2.OrderModeToDesc)}); err != nil {
Order: model2.NewOrder("id", model2.OrderModeToAsc)},
}
if filterID > 0 {
where = append(where, &model2.ModelWhereOrder{Where: model2.NewWhereCondition("id", "!=", filterID)},
&model2.ModelWhereOrder{Where: model2.NewWhereCondition("parent_id", "!=", filterID)})
}
if err := model2.Scan(mSysDepartment.SysDepartment, &out, where...); err != nil {
return nil, err
}
return c.tree(out, 0), nil
}
@ -73,7 +81,7 @@ func (c *Instance) Select() ([]*InstanceTreeInfo, error) {
Where: model2.NewWhere("tenant_id", c.TenantID),
Order: model2.NewOrder("parent_id", model2.OrderModeToAsc)}, &model2.ModelWhereOrder{
Where: model2.NewWhere("status", 1),
Order: model2.NewOrder("id", model2.OrderModeToDesc)}); err != nil {
Order: model2.NewOrder("id", model2.OrderModeToAsc)}); err != nil {
return nil, err
}
return c.tree(out, 0), nil

View File

@ -17,8 +17,8 @@ type (
// InstanceParams 菜单参数
InstanceParams struct {
ID, ParentID uint64
Kind, Auth int
Name, Link, Component, Icon string
Kind int
Name, Link, Auth, Component, Icon string
Sort, IsCache, IsHidden, Status int
Remark string
}
@ -50,7 +50,7 @@ func (c *Instance) Form(params *InstanceParams) error {
IsHidden: model2.SysMenuHiddenStatus(params.IsHidden),
Icon: params.Icon,
},
Auth: model2.SysMenuAuth(params.Auth),
Auth: params.Auth,
Sort: params.Sort,
Status: model2.SysMenuStatus(params.Status),
Remark: params.Remark,
@ -72,7 +72,7 @@ func (c *Instance) Form(params *InstanceParams) error {
out.Link = params.Link
out.Component = params.Component
out.Icon = params.Icon
out.Auth = model2.SysMenuAuth(params.Auth)
out.Auth = params.Auth
out.IsCache = model2.SysMenuCacheStatus(params.IsCache)
out.IsHidden = model2.SysMenuHiddenStatus(params.IsHidden)
out.Sort = params.Sort

View File

@ -25,7 +25,7 @@ type (
}
// InstanceBasicInfo 角色基本信息
InstanceBasicInfo struct {
ID uint64 `json:"id"`
ID string `json:"id"`
Name string `json:"name"`
}
)
@ -77,12 +77,20 @@ func (c *Instance) Select() ([]*InstanceBasicInfo, error) {
Order: model2.NewOrder("id", model2.OrderModeToDesc),
},
}
out := make([]*InstanceBasicInfo, 0)
out := make([]*model2.SysRole, 0)
if err := model2.Scan(mSysRole.SysRole, &out, where...); err != nil {
return nil, err
}
return out, nil
list := make([]*InstanceBasicInfo, 0)
for _, v := range out {
list = append(list, &InstanceBasicInfo{
ID: v.GetEncodeID(),
Name: v.Name,
})
}
return list, nil
}
// Form 数据操作
@ -152,11 +160,10 @@ func (c *Instance) Delete(id uint64) error {
return err
}
go utils.TryCatch(func() {
permission := service.NewPermission(
if _, err = service.NewPermission(
service.WithAuthTenant(fmt.Sprintf("%d", mSysRole.TenantID)),
service.WithAuthRoles([]string{fmt.Sprintf("%d", id)}),
)
if _, err = permission.RemoveRolePolicy(); err != nil {
).RemoveSingleRolePolicy(); err != nil {
logger.ErrorF("Casbin 删除租户【%d】下角色【%d】权限信息错误%v", mSysRole.TenantID, id, err)
return
}

View File

@ -6,8 +6,6 @@ import (
model2 "SciencesServer/app/common/model"
"SciencesServer/app/session"
"SciencesServer/serve/orm"
"errors"
"gorm.io/gorm"
)
@ -24,16 +22,7 @@ func (c *Menu) Index(roleID uint64) ([]*menu2.TreeChecked, error) {
// Bind 绑定菜单
func (c *Menu) Bind(roleID uint64, menuIDs []uint64) error {
if len(menuIDs) > 0 {
var count int64
mSysMenu := model.NewSysMenu()
if err := model2.Count(mSysMenu.SysMenu, &count, model2.NewWhereIn("id", menuIDs),
model2.NewWhere("auth", model2.SysMenuAuthForSystem)); err != nil {
return err
} else if count > 0 {
return errors.New("不可设置超管菜单")
}
}
mSysRoleMenu := model.NewSysRoleMenu()
@ -54,9 +43,7 @@ func (c *Menu) Bind(roleID uint64, menuIDs []uint64) error {
if _, has := mark[v]; has {
continue
}
menus = append(menus, &model2.SysRoleMenu{
ModelTenant: model2.ModelTenant{TenantID: c.TenantID}, RoleID: roleID, MenuID: v,
})
menus = append(menus, &model2.SysRoleMenu{RoleID: roleID, MenuID: v})
mark[v] = v
}
if err = model2.Creates(mSysRoleMenu.SysRoleMenu, menus, tx); err != nil {

View File

@ -3,12 +3,11 @@ package tenant
import (
"SciencesServer/app/api/admin/controller/menu"
"SciencesServer/app/api/admin/model"
model3 "SciencesServer/app/api/enterprise/model"
model2 "SciencesServer/app/common/model"
"SciencesServer/app/service"
"SciencesServer/app/session"
"SciencesServer/serve/orm"
"errors"
"fmt"
"gorm.io/gorm"
)
@ -16,6 +15,16 @@ type Menu struct{ *session.Admin }
type MenuHandle func(session *session.Admin) *Menu
func (c *Menu) auth(tenantID string, roleIDs []string, request []*service.AuthRequest) error {
permission := service.NewPermission(
service.WithAuthTenant(tenantID),
service.WithAuthRoles(roleIDs),
service.WithAuthRequest(request),
)
_, err := permission.RemoveRolePolicies()
return err
}
// List 菜单列表
func (c *Menu) List(tenantID uint64) ([]*menu.TreeChecked, error) {
mSysMenu := model.NewSysMenu()
@ -24,60 +33,112 @@ func (c *Menu) List(tenantID uint64) ([]*menu.TreeChecked, error) {
// Bind 绑定菜单
func (c *Menu) Bind(tenantID uint64, menuIDs []uint64) error {
if len(menuIDs) > 0 {
var count int64
mSysMenu := model3.NewSysMenu()
if err := model2.Count(mSysMenu.SysMenu, &count, model2.NewWhereIn("id", menuIDs),
model2.NewWhere("auth", model2.SysMenuAuthForSystem)); err != nil {
return err
} else if count > 0 {
return errors.New("不可设置超管菜单")
}
}
// 查询菜单信息
mSysTenantMenu := model.NewSysTenantMenu()
// 当前租户的信息
out := make([]*model2.SysTenantMenu, 0)
return orm.GetDB().Transaction(func(tx *gorm.DB) error {
// TODO先全部删除后期考虑局部删除
err := model2.DeleteWhere(mSysTenantMenu.SysTenantMenu, []*model2.ModelWhere{model2.NewWhere("tenant_id", tenantID)}, tx)
err := model2.ScanFields(mSysTenantMenu.SysTenantMenu, &out, []string{"id", "menu_id"})
if err != nil {
return err
}
// 租户角色的菜单
_menus := make(map[uint64]uint64, 0)
// 应保存的菜单
insertMenus := make([]*model2.SysTenantMenu, 0)
// 应删除的菜单
deleteMenuIDs := make([]uint64, 0)
for _, v := range menuIDs {
_menus[v] = v
}
return orm.GetDB().Transaction(func(tx *gorm.DB) error {
// 无菜单信息
if len(_menus) <= 0 {
for _, v := range out {
deleteMenuIDs = append(deleteMenuIDs, v.MenuID)
}
goto NEXT
}
// 租户原本含有菜单信息
for _, v := range out {
_, has := _menus[v.MenuID]
if !has {
deleteMenuIDs = append(deleteMenuIDs, v.MenuID)
continue
}
delete(_menus, v.MenuID)
}
for k := range _menus {
insertMenus = append(insertMenus, &model2.SysTenantMenu{
ModelTenant: model2.ModelTenant{TenantID: tenantID},
MenuID: k,
})
}
if len(insertMenus) > 0 {
if err = model2.Creates(mSysTenantMenu.SysTenantMenu, insertMenus); err != nil {
return err
}
}
NEXT:
// 删除操作
if len(deleteMenuIDs) <= 0 {
return nil
}
// 删除租户的菜单信息
if err = model2.DeleteWhere(mSysTenantMenu.SysTenantMenu, []*model2.ModelWhere{model2.NewWhere("tenant_id", tenantID),
model2.NewWhereIn("menu_id", deleteMenuIDs)}, tx); err != nil {
return err
}
// 查询租户下所有角色信息
mSysRole := model.NewSysRole()
roleIDs := make([]uint64, 0)
if err = model2.Pluck(mSysRole.SysRole, "id", &roleIDs, model2.NewWhere("tenant_id", tenantID)); err != nil {
return err
}
// 删除租户下角色的菜单
mSysRoleMenu := model.NewSysRoleMenu()
if len(menuIDs) <= 0 {
if err = model2.DeleteWhere(mSysRoleMenu.SysRoleMenu, []*model2.ModelWhere{model2.NewWhere("tenant_id", tenantID)}, tx); err != nil {
if err = model2.DeleteWhere(mSysRoleMenu.SysRoleMenu, []*model2.ModelWhere{
model2.NewWhereIn("role_id", roleIDs), model2.NewWhereIn("menu_id", deleteMenuIDs),
}, tx); err != nil {
return err
}
return nil
}
menus := make([]*model2.SysTenantMenu, 0)
// 查询菜单信息,关闭角色的权限信息
mSysMenu := model.NewSysMenu()
mark := make(map[uint64]uint64, 0)
menus := make([]*model2.SysMenu, 0)
for _, v := range menuIDs {
if _, has := mark[v]; has {
if err = model2.ScanFields(mSysMenu.SysMenu, &menus, []string{"kind", "auth"},
&model2.ModelWhereOrder{Where: model2.NewWhereIn("id", deleteMenuIDs)}); err != nil {
return err
}
// 同步权限
_roleIDs := make([]string, 0)
for _, v := range roleIDs {
_roleIDs = append(_roleIDs, fmt.Sprintf("%d", v))
}
request := make([]*service.AuthRequest, 0)
for _, v := range menus {
if v.Kind == model2.SysMenuKindForCatalogue || v.Auth == "" {
continue
}
menus = append(menus, &model2.SysTenantMenu{
ModelTenant: model2.ModelTenant{TenantID: tenantID}, MenuID: v,
mSysMenu.Auth = v.Auth
request = append(request, &service.AuthRequest{
Url: mSysMenu.FilterAuth(),
Method: "*",
})
mark[v] = v
}
if err = model2.Creates(mSysTenantMenu.SysTenantMenu, menus, tx); err != nil {
return err
}
// 删除租户下角色不存在的菜单
if err = model2.DeleteWhere(mSysRoleMenu.SysRoleMenu, []*model2.ModelWhere{
model2.NewWhere("tenant_id", tenantID),
model2.NewWhereNotIn("menu_id", menuIDs),
}); err != nil {
return err
}
return nil
return c.auth(fmt.Sprintf("%d", tenantID), _roleIDs, request)
})
}

View File

@ -26,11 +26,14 @@ type (
InstanceInfo struct {
ID string `json:"id"`
InstanceUserInfo
Account string `json:"account"`
Gender model2.GenderKind `json:"gender"`
IsAdmin model2.SysUserAdministrator `json:"is_admin"`
Status model2.SysUserStatus `json:"status"`
Department *InstanceDepartmentInfo `json:"department"`
Role *InstanceRoleInfo `json:"role"`
//Role *InstanceRoleInfo `json:"role"`
RoleIDs []string `json:"role_ids"`
Remark string `json:"remark"`
CreatedAt time.Time `json:"created_at"`
}
// InstanceUserInfo 用户信息
@ -56,8 +59,8 @@ type (
// InstanceForm 表单信息
type InstanceForm struct {
ID uint64
Account, Name, Mobile, Password, Remark string
Gender int
Account, Name, Mobile, Password, Email, Remark string
Gender, Status int
DepartmentID uint64
RoleIDs []uint64
}
@ -171,7 +174,10 @@ func (c *Instance) Index(name, mobile string, departmentIDs []uint64, status, pa
InstanceUserInfo: InstanceUserInfo{
UID: v.UUIDString(), Avatar: v.Avatar, Name: v.Name, Email: v.Email, Mobile: v.Mobile,
},
Gender: v.Gender.Gender, IsAdmin: v.IsAdmin, Status: v.Status, CreatedAt: v.CreatedAt,
Account: v.Account, Gender: v.Gender.Gender, IsAdmin: v.IsAdmin, Status: v.Status, CreatedAt: v.CreatedAt,
//Role: make([]*InstanceRoleInfo, 0),
RoleIDs: make([]string, 0),
Remark: v.Remark,
}
if v.DepartmentID > 0 {
@ -188,11 +194,11 @@ func (c *Instance) Index(name, mobile string, departmentIDs []uint64, status, pa
obj.ID = utils.StringToUnit64(v)
roleIDs = append(roleIDs, obj.GetEncodeID())
}
roles := &InstanceRoleInfo{
IDs: roleIDs,
Names: strings.Split(v.RoleNames, "&&"),
}
data.Role = roles
//roles := &InstanceRoleInfo{
// IDs: roleIDs,
//Names: strings.Split(v.RoleNames, "&&"),
//}
data.RoleIDs = roleIDs
}
list = append(list, data)
}
@ -201,7 +207,7 @@ func (c *Instance) Index(name, mobile string, departmentIDs []uint64, status, pa
// Add 添加用户
func (c *Instance) Add(params *InstanceForm) error {
if utils.ValidateMobile(params.Mobile) {
if !utils.ValidateMobile(params.Mobile) {
return errors.New("操作错误,手机号码格式错误")
}
mSysUser := model.NewSysUser()
@ -213,15 +219,18 @@ func (c *Instance) Add(params *InstanceForm) error {
if err != nil {
return err
} else if count > 0 {
return errors.New("操作错误,当前手机号码已注册")
}
return orm.GetDB().Transaction(func(tx *gorm.DB) error {
mSysUser.TenantID = c.TenantID
mSysUser.Account = params.Account
mSysUser.Name = params.Name
mSysUser.Mobile = params.Mobile
mSysUser.Email = params.Email
mSysUser.Gender.Gender = model2.GenderKind(params.Gender)
mSysUser.Password = params.Password
mSysUser.Status = model2.SysUserStatus(params.Status)
mSysUser.Remark = params.Remark
if err = model2.Create(mSysUser.SysUser, tx); err != nil {
@ -250,7 +259,7 @@ func (c *Instance) Edit(params *InstanceForm) error {
return errors.New("操作错误,无权限操作")
}
if mSysUser.Mobile != params.Mobile {
if utils.ValidateMobile(params.Mobile) {
if !utils.ValidateMobile(params.Mobile) {
return errors.New("操作错误,手机号码格式错误")
}
var count int64
@ -263,8 +272,8 @@ func (c *Instance) Edit(params *InstanceForm) error {
}
mSysUser.Mobile = params.Mobile
}
mSysUser.Account = params.Account
mSysUser.Name = params.Name
mSysUser.Email = params.Email
mSysUser.Gender.Gender = model2.GenderKind(params.Gender)
mSysUser.Remark = params.Remark
@ -280,10 +289,11 @@ func (c *Instance) Edit(params *InstanceForm) error {
}
func (c *Instance) Password(id uint64, password, repeatPwd string) error {
if password != repeatPwd {
return errors.New("操作错误,两次密码输入不一致")
}
//if password != repeatPwd {
// return errors.New("操作错误,两次密码输入不一致")
//}
mSysUser := model.NewSysUser()
mSysUser.ID = id
isExist, err := model2.FirstField(mSysUser.SysUser, []string{"id", "uuid", "is_admin"})

View File

@ -4,6 +4,7 @@ import (
"SciencesServer/app/common/model"
"SciencesServer/serve/orm"
"fmt"
"strings"
)
type SysMenu struct {
@ -16,6 +17,10 @@ type SysMenuScene struct {
SceneID uint64 `json:"scene_id"` // 场景(租户,角色)
}
func (m *SysMenu) FilterAuth() string {
return "/" + strings.ReplaceAll(m.Auth, ":", "/")
}
// Recursion 递归查询子菜单
func (m *SysMenu) Recursion(id uint64) {
//SELECT

View File

@ -38,7 +38,8 @@ func (m *SysUser) GetByAccountOrMobile(account string, tenantID uint64) (bool, e
db := orm.GetDB().Table(m.TableName()).
Select("id", "uuid", "tenant_id", "name", "mobile", "password", "salt", "is_admin", "status").
Where("tenant_id = ?", tenantID).
Where("(account = ? OR mobile = ?)", account, account).
//Where("(email = ? OR mobile = ?)", account, account).
Where("mobile = ?", account).
Where("is_deleted = ?", model.DeleteStatusForNot)
if err := db.First(m.SysUser).Error; err != nil {
@ -50,6 +51,23 @@ func (m *SysUser) GetByAccountOrMobile(account string, tenantID uint64) (bool, e
return true, nil
}
func (m *SysUser) CheckByAccountOrMobile(account string, tenantID uint64) (bool, error) {
db := orm.GetDB().Table(m.TableName()).
Where("tenant_id = ?", tenantID).
Where("(account = ? OR mobile = ?)", account, account).
Where("is_deleted = ?", model.DeleteStatusForNot)
var count int64
if err := db.Count(&count).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return false, nil
}
return false, err
}
return true, nil
}
// Users 用户信息
func (m *SysUser) Users(page, pageSize int, count *int64, where ...*model.ModelWhere) ([]*SysUserInfo, error) {
db := orm.GetDB().Table(m.TableName()+" AS u").

View File

@ -48,8 +48,8 @@ func mysql() *gorm.DB {
orm.WithMaxOpenConns(2000),
orm.WithMaxLifetime(1000),
orm.WithMysqlOption(&logic.Mysql{
User: "appuser", Password: "ABCabc01!", Host: "192.168.0.188", Port: 3306,
DBName: "sciences", Parameters: "charset=utf8mb4,utf8&parseTime=True&loc=Local",
Username: "appuser", Password: "ABCabc01!", Host: "192.168.0.188", Port: 3306,
Database: "sciences", Parameters: "charset=utf8mb4,utf8&parseTime=True&loc=Local",
}),
).Init()
return instance.Engine

View File

@ -6,7 +6,7 @@ type SysDepartment struct {
ModelTenant
ParentID uint64 `gorm:"column:parent_id;type:int;default:0;comment:父级ID" json:"-"`
Name string `gorm:"column:name;type:varchar(20);default:'';comment:部门名称" json:"name"`
Contact string `gorm:"column:contact_name;type:varchar(20);default:'';comment:联系人" json:"contact_name"`
Contact string `gorm:"column:contact;type:varchar(20);default:'';comment:联系人" json:"contact"`
ContactMobile string `gorm:"column:contact_mobile;type:varchar(15);default:'';comment:联系方式" json:"contact_mobile"`
Status int `gorm:"column:status;type:tinyint(1);default:1;comment:状态1正常2禁用" json:"status"`
Remark string `gorm:"column:remark;type:varchar(255);default:'';comment:备注信息" json:"remark"`

View File

@ -3,7 +3,7 @@ package model
type SysMenu struct {
Model
SysMenuBasic
Auth SysMenuAuth `gorm:"column:auth;type:tinyint(1);default:0;comment:查看权限0通用1超管" json:"-"`
Auth string `gorm:"column:auth;type:varchar(100);default:'';comment:权限/路由" json:"auth"`
Sort int `gorm:"column:sort;type:tinyint(3);default:0;comment:排序,数值越大,优先排序" json:"sort"`
Remark string `gorm:"column:remark;type:varchar(255);default:'';comment:菜单备注" json:"remark"`
Status SysMenuStatus `gorm:"column:status;type:tinyint(1);default:1;comment:状态" json:"status"`
@ -34,16 +34,6 @@ const (
SysMenuKindForEvent
)
// SysMenuAuth 菜单权限
type SysMenuAuth int
const (
// SysMenuAuthForOrdinary 普通权限
SysMenuAuthForOrdinary SysMenuAuth = iota
// SysMenuAuthForSystem 系统权限
SysMenuAuthForSystem
)
// SysMenuStatus 菜单状态
type SysMenuStatus int

View File

@ -2,7 +2,6 @@ package model
type SysRoleMenu struct {
Model
ModelTenant
RoleID uint64 `gorm:"column:role_id;type:int;default:0;comment:角色ID" json:"-"`
MenuID uint64 `gorm:"column:menu_id;type:int;default:0;comment:菜单ID" json:"-"`
ModelDeleted

View File

@ -168,8 +168,28 @@ func (this *Permission) AddPolicies() (bool, error) {
return auth.enforcer.AddPolicies(rules)
}
// RemoveRolePolicy 删除角色的所有规则
func (this *Permission) RemoveRolePolicy() (bool, error) {
// RemoveRolePolicies 删除角色指定规则
func (this *Permission) RemoveRolePolicies() (bool, error) {
if len(this.roles) <= 0 {
return false, errors.New("not role")
}
rules := make([][]string, 0)
tenantFormat := this.tenantFormat()
for _, v := range this.roleFormat() {
for _, request := range this.request {
rules = append(rules, []string{
v, tenantFormat, request.Url, request.Method,
})
}
}
return auth.enforcer.RemovePolicies(rules)
}
// RemoveSingleRolePolicy 删除角色的所有规则
func (this *Permission) RemoveSingleRolePolicy() (bool, error) {
if len(this.roles) <= 0 {
return false, errors.New("not role")
}

47
app/service/auth_test.go Normal file
View File

@ -0,0 +1,47 @@
package service
import (
"SciencesServer/app/common/model"
"SciencesServer/serve/orm"
"SciencesServer/serve/orm/logic"
"gorm.io/gorm"
"testing"
)
func mysql() *gorm.DB {
instance := orm.NewInstance(
orm.WithDebug(false),
orm.WithDBMode("mysql"),
orm.WithTablePrefix(""),
orm.WithSingularTable(false),
orm.WithMaxIdleConns(3600),
orm.WithMaxOpenConns(2000),
orm.WithMaxLifetime(1000),
orm.WithMysqlOption(&logic.Mysql{
Username: "appuser", Password: "ABCabc01", Host: "192.168.0.188", Port: 3306,
Database: "sciences", Parameters: "charset=utf8mb4,utf8&parseTime=True&loc=Local",
}),
).Init()
return instance.Engine
}
func TestNewPermission(t *testing.T) {
mysql := mysql()
NewAuth().Register()("mysql", mysql, model.NewSysAuthRule().TableName())
permission := NewPermission(
WithAuthTenant("0"),
WithAuthUser("123"),
WithAuthRoles([]string{"1", "2"}),
WithAuthRequest([]*AuthRequest{&AuthRequest{
Url: "/admin/123",
Method: "*",
}}),
)
//status, err := permission.AddPolicies()
//status, err := permission.AddRoleForUser()
//status, err := permission.RemoveRolePolicies()
status, err := permission.Enforce()
t.Log(status)
t.Log(err)
}

View File

@ -4,6 +4,6 @@ import "testing"
func TestSha256String(t *testing.T) {
//t.Log(Md5String("9f735e0df9a1ddc702bf0a1a7b83033f9f7153a00c29de82cedadc9957289b05"))
t.Log(HASHIDEncode(123))
t.Log(HASHIDEncode(2))
t.Log(HASHIDDecode("lV5OBJ"))
}