Преглед изворни кода

Merge branch 'feature/权限管理' into develop

# Conflicts:
#	opms_admin/app/handler/user.go
#	opms_admin/app/service/sys_user.go
ZZH-wl пре 3 година
родитељ
комит
8863becd0d

+ 0 - 22
opms_admin/app/common/global/cache_key.go

@@ -1,22 +0,0 @@
-package global
-
-const (
-	// CachePrefix 缓存前缀
-	CachePrefix = "cacheOv2_"
-
-	// SysAuthMenu 缓存菜单KEY
-	SysAuthMenu = CachePrefix + "sysAuthMenu"
-	// SysDict 字典缓存菜单KEY
-	SysDict = CachePrefix + "sysDict"
-	// SysRole 角色缓存key
-	SysRole = CachePrefix + "sysRole"
-	// SysWebSet 站点配置缓存key
-	SysWebSet = CachePrefix + "sysWebSet"
-
-	// SysAuthTag 权限缓存TAG标签
-	SysAuthTag = CachePrefix + "sysAuthTag"
-	// SysDictTag 字典缓存标签
-	SysDictTag = CachePrefix + "sysDictTag"
-	// SysConfigTag 系统参数配置
-	SysConfigTag = CachePrefix + "sysConfigTag"
-)

+ 0 - 245
opms_admin/app/common/service/cache.go

@@ -1,245 +0,0 @@
-package service
-
-import (
-	"context"
-	"dashoo.cn/micro/app/common/global"
-	"fmt"
-	"github.com/gogf/gcache-adapter/adapter"
-	"github.com/gogf/gf/crypto/gmd5"
-	"github.com/gogf/gf/encoding/gjson"
-	"github.com/gogf/gf/frame/g"
-	"github.com/gogf/gf/os/gcache"
-	"github.com/gogf/gf/util/gconv"
-	"reflect"
-	"sync"
-	"time"
-)
-
-type cache struct {
-}
-
-type cacheTagService struct {
-	tagKey    interface{}
-	cache     *gcache.Cache
-	tagSetMux *sync.Mutex
-}
-
-var (
-	Cache     = new(cache)
-	userRedis = g.Cfg().GetBool("redis.open")
-	gChe      = gcache.New()
-)
-
-func (s *cache) New() *cacheTagService {
-	gChe.Ctx(context.Background())
-	if userRedis {
-		adapter := adapter.NewRedis(g.Redis())
-		gChe.SetAdapter(adapter)
-	}
-	return &cacheTagService{
-		cache:     gChe,
-		tagSetMux: new(sync.Mutex),
-	}
-}
-
-// 设置tag缓存的keys
-func (c *cacheTagService) cacheTagKey(key interface{}, tag interface{}) {
-	c.setTagKey(tag)
-	if c.tagKey != nil {
-		tagValue := []interface{}{key}
-		value, _ := c.cache.Get(c.tagKey)
-		if value != nil {
-			var keyValue []interface{}
-			//若是字符串
-			if kStr, ok := value.(string); ok {
-				js, err := gjson.DecodeToJson(kStr)
-				if err != nil {
-					g.Log().Error(err)
-					return
-				}
-				keyValue = gconv.SliceAny(js.Value())
-			} else {
-				keyValue = gconv.SliceAny(value)
-			}
-			for _, v := range keyValue {
-				if !reflect.DeepEqual(key, v) {
-					tagValue = append(tagValue, v)
-				}
-			}
-		}
-		c.cache.Set(c.tagKey, tagValue, 0)
-	}
-}
-
-// 获取带标签的键名
-func (c *cacheTagService) setTagKey(tag interface{}) {
-	if tag != nil {
-		c.tagKey = interface{}(fmt.Sprintf("%s_tag_%s", global.CachePrefix, gmd5.MustEncryptString(gconv.String(tag))))
-	}
-}
-
-// Set sets cache with <tagKey>-<value> pair, which is expired after <duration>.
-// It does not expire if <duration> <= 0.
-func (c *cacheTagService) Set(key interface{}, value interface{}, duration time.Duration, tag ...interface{}) {
-	c.tagSetMux.Lock()
-	if len(tag) > 0 {
-		c.cacheTagKey(key, tag[0])
-	}
-	err := c.cache.Set(key, value, duration)
-	if err != nil {
-		g.Log().Error(err)
-	}
-	c.tagSetMux.Unlock()
-}
-
-// SetIfNotExist sets cache with <tagKey>-<value> pair if <tagKey> does not exist in the cache,
-// which is expired after <duration>. It does not expire if <duration> <= 0.
-func (c *cacheTagService) SetIfNotExist(key interface{}, value interface{}, duration time.Duration, tag interface{}) bool {
-	c.tagSetMux.Lock()
-	defer c.tagSetMux.Unlock()
-	c.cacheTagKey(key, tag)
-	v, _ := c.cache.SetIfNotExist(key, value, duration)
-	return v
-}
-
-// Sets batch sets cache with tagKey-value pairs by <data>, which is expired after <duration>.
-//
-// It does not expire if <duration> <= 0.
-func (c *cacheTagService) Sets(data map[interface{}]interface{}, duration time.Duration, tag interface{}) {
-	c.tagSetMux.Lock()
-	if tag != nil {
-		for k, _ := range data {
-			c.cacheTagKey(k, tag)
-		}
-		c.cache.Sets(data, duration)
-	} else {
-		c.cache.Sets(data, duration)
-	}
-	c.tagSetMux.Unlock()
-}
-
-// Get returns the value of <tagKey>.
-// It returns nil if it does not exist or its value is nil.
-func (c *cacheTagService) Get(key interface{}) interface{} {
-	v, err := c.cache.Get(key)
-	if err != nil {
-		g.Log().Error(err)
-	}
-	return v
-}
-
-// GetOrSet returns the value of <tagKey>,
-// or sets <tagKey>-<value> pair and returns <value> if <tagKey> does not exist in the cache.
-// The tagKey-value pair expires after <duration>.
-//
-// It does not expire if <duration> <= 0.
-func (c *cacheTagService) GetOrSet(key interface{}, value interface{}, duration time.Duration, tag interface{}) interface{} {
-	c.tagSetMux.Lock()
-	defer c.tagSetMux.Unlock()
-	c.cacheTagKey(key, tag)
-	v, _ := c.cache.GetOrSet(key, value, duration)
-	return v
-}
-
-// GetOrSetFunc returns the value of <tagKey>, or sets <tagKey> with result of function <f>
-// and returns its result if <tagKey> does not exist in the cache. The tagKey-value pair expires
-// after <duration>. It does not expire if <duration> <= 0.
-func (c *cacheTagService) GetOrSetFunc(key interface{}, f func() (interface{}, error), duration time.Duration, tag interface{}) interface{} {
-	c.tagSetMux.Lock()
-	defer c.tagSetMux.Unlock()
-	c.cacheTagKey(key, tag)
-	v, _ := c.cache.GetOrSetFunc(key, f, duration)
-	return v
-}
-
-// GetOrSetFuncLock returns the value of <tagKey>, or sets <tagKey> with result of function <f>
-// and returns its result if <tagKey> does not exist in the cache. The tagKey-value pair expires
-// after <duration>. It does not expire if <duration> <= 0.
-//
-// Note that the function <f> is executed within writing mutex lock.
-func (c *cacheTagService) GetOrSetFuncLock(key interface{}, f func() (interface{}, error), duration time.Duration, tag interface{}) interface{} {
-	c.tagSetMux.Lock()
-	defer c.tagSetMux.Unlock()
-	c.cacheTagKey(key, tag)
-	v, _ := c.cache.GetOrSetFuncLock(key, f, duration)
-	return v
-}
-
-// Contains returns true if <tagKey> exists in the cache, or else returns false.
-func (c *cacheTagService) Contains(key interface{}) bool {
-	v, _ := c.cache.Contains(key)
-	return v
-}
-
-// Remove deletes the <tagKey> in the cache, and returns its value.
-func (c *cacheTagService) Remove(key interface{}) interface{} {
-	v, _ := c.cache.Remove(key)
-	return v
-}
-
-// Removes deletes <keys> in the cache.
-func (c *cacheTagService) Removes(keys []interface{}) {
-	c.cache.Remove(keys...)
-}
-
-// Remove deletes the <tag> in the cache, and returns its value.
-func (c *cacheTagService) RemoveByTag(tag interface{}) {
-	c.tagSetMux.Lock()
-	c.setTagKey(tag)
-	//删除tagKey 对应的 key和值
-	keys := c.Get(c.tagKey)
-	if keys != nil {
-		//如果是字符串
-		if kStr, ok := keys.(string); ok {
-			js, err := gjson.DecodeToJson(kStr)
-			if err != nil {
-				g.Log().Error(err)
-				return
-			}
-			ks := gconv.SliceAny(js.Value())
-			c.Removes(ks)
-		} else {
-			ks := gconv.SliceAny(keys)
-			c.Removes(ks)
-		}
-	}
-	c.Remove(c.tagKey)
-	c.tagSetMux.Unlock()
-}
-
-// Removes deletes <tags> in the cache.
-func (c *cacheTagService) RemoveByTags(tag []interface{}) {
-	for _, v := range tag {
-		c.RemoveByTag(v)
-	}
-}
-
-// Data returns a copy of all tagKey-value pairs in the cache as map type.
-func (c *cacheTagService) Data() map[interface{}]interface{} {
-	v, _ := c.cache.Data()
-	return v
-}
-
-// Keys returns all keys in the cache as slice.
-func (c *cacheTagService) Keys() []interface{} {
-	v, _ := c.cache.Keys()
-	return v
-}
-
-// KeyStrings returns all keys in the cache as string slice.
-func (c *cacheTagService) KeyStrings() []string {
-	v, _ := c.cache.KeyStrings()
-	return v
-}
-
-// Values returns all values in the cache as slice.
-func (c *cacheTagService) Values() []interface{} {
-	v, _ := c.cache.Values()
-	return v
-}
-
-// Size returns the size of the cache.
-func (c *cacheTagService) Size() int {
-	v, _ := c.cache.Size()
-	return v
-}

+ 3 - 0
opms_admin/app/dao/internal/sys_menu.go

@@ -41,6 +41,7 @@ type sysMenuColumns struct {
 	PlatformId  string // 所属平台
 	Sort        string // 显示顺序
 	ActiveMenu  string // 高亮路由
+	NoColumn    string // 是否展示栏目20 不展示
 	Remark      string // 备注
 	CreatedBy   string // 创建者
 	CreatedName string // 创建人
@@ -74,6 +75,7 @@ var (
 			PlatformId:  "platform_id",
 			Sort:        "sort",
 			ActiveMenu:  "active_menu",
+			NoColumn:    "no_column",
 			Remark:      "remark",
 			CreatedBy:   "created_by",
 			CreatedName: "created_name",
@@ -109,6 +111,7 @@ func NewSysMenuDao(tenant string) SysMenuDao {
 			PlatformId:  "platform_id",
 			Sort:        "sort",
 			ActiveMenu:  "active_menu",
+			NoColumn:    "no_column",
 			Remark:      "remark",
 			CreatedBy:   "created_by",
 			CreatedName: "created_name",

+ 14 - 9
opms_admin/app/handler/menu.go

@@ -106,18 +106,17 @@ func (h *MenuHandler) DeleteById(ctx context.Context, req *comm_def.IdReq, rsp *
 
 // GetRoleMenuIds 根据角色获取菜单
 //func (o *MenuHandler) GetRoleMenuIds(ctx context.Context, req *menu_def.RoleIdReq, rsp *comm_def.CommonMsg) error {
-//	service, err := role_menu.NewService(tenant)
+//	menuService, err := service.NewMenuService(ctx)
 //	if err != nil {
-//		g.Log().Error(err)
 //		return gerror.New("系统异常,请重新尝试")
 //	}
 //
-//	entity, err := service.GetRoleMenuIds(req.RoleId)
-//	_, err, code, msg := myerrors.CheckError(err)
-//	rsp.Code = code
-//	rsp.Msg = msg
+//	entity, err := menuService.GetRoleMenuIds(req.RoleId)
+//	_, err, rsp.Code, rsp.Msg = myerrors.CheckError(err)
+//	if err != nil {
+//		return err
+//	}
 //	rsp.Data = entity
-//
 //	return nil
 //}
 
@@ -125,14 +124,20 @@ func (h *MenuHandler) DeleteById(ctx context.Context, req *comm_def.IdReq, rsp *
 func (h *MenuHandler) GetMenuTree(ctx context.Context, req map[string]interface{}, rsp *comm_def.CommonMsg) error {
 	menuService, err := service.NewMenuService(ctx)
 	if err != nil {
-		g.Log().Error(err)
 		return gerror.New("系统异常,请重新尝试")
 	}
 	isAll := false
 	if val, ok := req["isAll"]; ok && val == "all" {
 		isAll = true
 	}
-	list, err := menuService.GetMenuTree(isAll)
+	var list interface{}
+	if menuService.GetCxtUserName() == "dashoo" {
+		list, err = menuService.GetMenuTree(isAll)
+	} else {
+		userService, _ := service.NewUserService(ctx)
+		userRoles, _ := userService.GetUserRoleIds(userService.GetCxtUserId())
+		list, err = menuService.GetUserRoleMenuTree(userRoles)
+	}
 	_, _, rsp.Code, rsp.Msg = myerrors.CheckError(err)
 	rsp.Data = list
 	return nil

+ 80 - 115
opms_admin/app/handler/user.go

@@ -2,8 +2,10 @@ package handler
 
 import (
 	"context"
+	"dashoo.cn/common_definition/admin/user_def"
 	"dashoo.cn/micro/app/model"
 	"dashoo.cn/micro/app/service"
+	"dashoo.cn/opms_libary/micro_srv"
 	"dashoo.cn/opms_libary/myerrors"
 	"github.com/gogf/gf/errors/gerror"
 	"github.com/gogf/gf/util/gvalid"
@@ -90,18 +92,16 @@ func (h *UserHandler) UpdateById(ctx context.Context, req *model.EditUserReq, rs
 func (e *UserHandler) GetUserInfo(ctx context.Context, req *comm_def.IdReq, rsp *comm_def.CommonMsg) error {
 	userService, err := service.NewUserService(ctx)
 	if err != nil {
-		g.Log().Error(err)
 		return gerror.New("系统异常,请重新尝试")
 	}
-	userId := int(req.Id)
-	if req.Id == 0 {
-		// 从上下文中获取用户
-		userId = userService.GetCxtUserId()
+	// 从上下文中获取用户
+	userId := userService.GetCxtUserId()
+	if req.Id != 0 {
+		userId = int(req.Id)
 	}
 
 	data, err := userService.GetUserInfoById(userId)
 	if err != nil {
-		g.Log().Error(err)
 		return err
 	}
 	// 获取用户权限 角色
@@ -110,6 +110,13 @@ func (e *UserHandler) GetUserInfo(ctx context.Context, req *comm_def.IdReq, rsp
 	if err != nil {
 		return err
 	}
+	roleService, _ := service.NewRoleService(ctx)
+	permissions, err := roleService.GetRolesMenuPermissions(userRoles)
+	_, err, rsp.Code, rsp.Msg = myerrors.CheckError(err)
+	if err != nil {
+		return err
+	}
+
 	userPosts, err := userService.GetUserPostIds(userId)
 	_, err, rsp.Code, rsp.Msg = myerrors.CheckError(err)
 	if err != nil {
@@ -122,38 +129,30 @@ func (e *UserHandler) GetUserInfo(ctx context.Context, req *comm_def.IdReq, rsp
 	}
 
 	rsp.Data = g.Map{
-		"entity":   data,
-		"roleIds":  userRoles,
-		"postIds":  userPosts,
-		"groupIds": userGroups,
+		"entity":      data,
+		"permissions": permissions,
+		"roleIds":     userRoles,
+		"postIds":     userPosts,
+		"groupIds":    userGroups,
 	}
 	return nil
 }
 
 //// GetEntityByUuId 根据UUID获取用户实体信息
 //func (e *UserHandler) GetEntityByUuId(ctx context.Context, req *user_def.UuIdReq, rsp *comm_def.CommonMsg) error {
-//	// 获取租户码
-//	tenant, err := micro_srv.GetTenant(ctx)
-//	if err != nil {
-//		return err
-//	}
-//	g.Log().Info("Received UserHandler.GetEntityByUuId request @ " + tenant)
 //	// 参数校验
 //	if req.Uuid == "" {
 //		return NoParamsErr
 //	}
-//	service, err := user.NewService(tenant)
+//	userService, err := service.NewUserService(ctx)
 //	if err != nil {
-//		g.Log().Error(err)
 //		return gerror.New("系统异常,请重新尝试")
 //	}
-//	data, err := service.GetEntityByUuId(req.Uuid)
-//	_, err, code, msg := myerrors.CheckError(err)
+//	data, err := userService.GetEntityByUuId(req.Uuid)
+//	_, err, rsp.Code, rsp.Msg = myerrors.CheckError(err)
 //	if err != nil {
 //		return err
 //	}
-//	rsp.Code = code
-//	rsp.Msg = msg
 //	rsp.Data = data
 //	return nil
 //}
@@ -178,71 +177,41 @@ func (h *UserHandler) DeleteByIds(ctx context.Context, req *comm_def.IdsReq, rsp
 	return nil
 }
 
-//// ResetPassword 密码重置(管理员进行操作)
-//func (e *UserHandler) ResetPassword(ctx context.Context, req *user_def.ResetPwdReq, rsp *comm_def.CommonMsg) error {
-//	// 获取租户码
-//	tenant, err := micro_srv.GetTenant(ctx)
-//	if err != nil {
-//		return err
-//	}
-//	g.Log().Info("Received UserHandler.ResetPassword request @ " + tenant)
-//	if req.Id == 0 || req.Password == "" {
-//		return NoParamsErr
-//	}
-//	if err = gvalid.CheckStruct(ctx, req, nil); err != nil {
-//		return err
-//	}
-//	// todo:校验用户是否有修改权限
-//	service, err := user.NewService(tenant)
-//	if err != nil {
-//		g.Log().Error(err)
-//		return gerror.New("系统异常,请重新尝试")
-//	}
-//	userInfo, err := micro_srv.GetUserInfo(ctx)
-//	if err != nil {
-//		return err
-//	}
-//	err = service.ResetPassword(&userInfo, req.Id, req.Password)
-//	_, err, code, msg := myerrors.CheckError(err)
-//	if err != nil {
-//		return err
-//	}
-//	rsp.Code = code
-//	rsp.Msg = msg
-//	return nil
-//}
-//
-//// SetStatus 设置用户状态
-//func (e *UserHandler) SetStatus(ctx context.Context, req *user_def.SetStatusReq, rsp *comm_def.CommonMsg) error {
-//	// 获取租户码
-//	tenant, err := micro_srv.GetTenant(ctx)
-//	if err != nil {
-//		return err
-//	}
-//	g.Log().Info("Received UserHandler.SetStatus request @ " + tenant)
-//	// 参数校验
-//	if req.Id == 0 {
-//		return NoParamsErr
-//	}
-//	service, err := user.NewService(tenant)
-//	if err != nil {
-//		g.Log().Error(err)
-//		return gerror.New("系统异常,请重新尝试")
-//	}
-//	userInfo, err := micro_srv.GetUserInfo(ctx)
-//	if err != nil {
-//		return err
-//	}
-//	err = service.SetStatus(&userInfo, req.Id, req.Enabled)
-//	_, err, code, msg := myerrors.CheckError(err)
-//	if err != nil {
-//		return err
-//	}
-//	rsp.Code = code
-//	rsp.Msg = msg
-//	return nil
-//}
-//
+// ResetPassword 密码重置(管理员进行操作)
+func (e *UserHandler) ResetPassword(ctx context.Context, req *model.SysUserResetPwdReq, rsp *comm_def.CommonMsg) error {
+	if err := gvalid.CheckStruct(ctx, req, nil); err != nil {
+		return err
+	}
+	// todo:校验用户是否有修改权限
+	userService, err := service.NewUserService(ctx)
+	if err != nil {
+		return gerror.New("系统异常,请重新尝试")
+	}
+	err = userService.ResetUserPwd(req)
+	_, err, rsp.Code, rsp.Msg = myerrors.CheckError(err)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// SetStatus 设置用户状态
+func (e *UserHandler) SetStatus(ctx context.Context, req *model.SysUserStatusReq, rsp *comm_def.CommonMsg) error {
+	if err := gvalid.CheckStruct(ctx, req, nil); err != nil {
+		return err
+	}
+	userService, err := service.NewUserService(ctx)
+	if err != nil {
+		return gerror.New("系统异常,请重新尝试")
+	}
+	err = userService.ChangeUserStatus(req)
+	_, err, rsp.Code, rsp.Msg = myerrors.CheckError(err)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
 //// GetUserBelongDept 获取部门下所属用户
 //func (e *UserHandler) GetUserBelongDept(ctx context.Context, req *user_def.DeptIdReq, rsp *comm_def.CommonMsg) error {
 //	// 获取租户码
@@ -441,34 +410,30 @@ func (h *UserHandler) DeleteByIds(ctx context.Context, req *comm_def.IdsReq, rsp
 //	rsp.Msg = msg
 //	return nil
 //}
-//
-//// ChangePassword 用户修改密码
-//func (e *UserHandler) ChangePassword(ctx context.Context, req *user_def.PWDReq, rsp *comm_def.CommonMsg) error {
-//	// 获取租户码
-//	tenant, err := micro_srv.GetTenant(ctx)
-//	if err != nil {
-//		return err
-//	}
-//	g.Log().Info("Received UserHandler.ChangePassword request @ " + tenant)
-//	gvalidErr := gvalid.CheckStruct(ctx, req, nil)
-//	if gvalidErr != nil {
-//		return gvalidErr.Current()
-//	}
-//	service, err := user.NewService(tenant)
-//	if flag, err, _, _ := myerrors.CheckError(err); flag {
-//		return err
-//	}
-//	userInfo, err := micro_srv.GetUserInfo(ctx)
-//	if err != nil {
-//		return err
-//	}
-//	err = service.ChangePassword(&userInfo, req.OldPassword, req.NewPassword)
-//	_, err, code, msg := myerrors.CheckError(err)
-//	rsp.Code = code
-//	rsp.Msg = msg
-//	return err
-//}
-//
+
+// ChangePassword 用户修改密码
+func (e *UserHandler) ChangePassword(ctx context.Context, req *user_def.PWDReq, rsp *comm_def.CommonMsg) error {
+	gvalidErr := gvalid.CheckStruct(ctx, req, nil)
+	if gvalidErr != nil {
+		return gvalidErr.Current()
+	}
+	userService, err := service.NewUserService(ctx)
+	if err != nil {
+		return gerror.New("系统异常,请重新尝试")
+	}
+	userInfo, err := micro_srv.GetUserInfo(ctx)
+	if err != nil {
+		return err
+	}
+	err = userService.ProfileUpdatePwd(&model.ProfileUpdatePwdReq{
+		UserId:      userInfo.Id,
+		OldPassword: req.OldPassword,
+		NewPassword: req.NewPassword,
+	})
+	_, err, rsp.Code, rsp.Msg = myerrors.CheckError(err)
+	return err
+}
+
 //// GetUserByUserName 根据用户名获取用户信息
 //func (e *UserHandler) GetUserByUserName(ctx context.Context, req *user_def.UserNameReq, rsp *comm_def.CommonMsg) error {
 //	// 获取租户码

+ 1 - 0
opms_admin/app/model/internal/sys_menu.go

@@ -26,6 +26,7 @@ type SysMenu struct {
 	PlatformId  int         `orm:"platform_id"  json:"platformId"`  // 所属平台
 	Sort        int         `orm:"sort"         json:"sort"`        // 显示顺序
 	ActiveMenu  string      `orm:"active_menu"  json:"activeMenu"`  // 高亮路由
+	NoColumn    string      `orm:"no_column"    json:"noColumn"`    // 是否展示栏目20 不展示
 	Remark      string      `orm:"remark"       json:"remark"`      // 备注
 	CreatedBy   int         `orm:"created_by"   json:"createdBy"`   // 创建者
 	CreatedName string      `orm:"created_name" json:"createdName"` // 创建人

+ 2 - 0
opms_admin/app/model/sys_menu.go

@@ -54,6 +54,7 @@ type Meta struct {
 	Hidden           bool   `json:"hidden,omitempty"`
 	ActiveMenu       string `json:"activeMenu,omitempty"`
 	Target           string `json:"target,omitempty"`
+	NoColumn         bool   `json:"noColumn,omitempty"`
 }
 
 func (m SysMenu) ConvName() string {
@@ -84,6 +85,7 @@ func (m SysMenu) ConvMenuTree() MenuTree {
 			ActiveMenu:  m.ActiveMenu,
 			NoKeepAlive: m.IsCache != 1,
 			Hidden:      m.Visible != "10",
+			NoColumn:    m.NoColumn == "20",
 		},
 		Children: nil,
 	}

+ 0 - 11
opms_admin/app/service/sys_config.go

@@ -1,8 +1,6 @@
 package service
 
 import (
-	"dashoo.cn/micro/app/common/global"
-	comService "dashoo.cn/micro/app/common/service"
 	"dashoo.cn/micro/app/dao"
 	"dashoo.cn/micro/app/model"
 	"github.com/gogf/gf/errors/gerror"
@@ -112,19 +110,10 @@ func (s *sysConfig) GetConfigByKey(key string) (config *model.SysConfig, err err
 		err = gerror.New("参数key不能为空")
 		return
 	}
-	cache := comService.Cache.New()
-	cf := cache.Get(global.SysConfigTag + key)
-	if cf != nil {
-		err = gconv.Struct(cf, &config)
-		return
-	}
 	config, err = s.GetByKey(key)
 	if err != nil {
 		return
 	}
-	if config != nil {
-		cache.Set(global.SysConfigTag+key, config, 0, global.SysConfigTag)
-	}
 	return
 }
 

+ 16 - 32
opms_admin/app/service/sys_dict_data.go

@@ -2,8 +2,6 @@ package service
 
 import (
 	"context"
-	"dashoo.cn/micro/app/common/global"
-	comService "dashoo.cn/micro/app/common/service"
 	"dashoo.cn/micro/app/dao"
 	"dashoo.cn/micro/app/model"
 	"database/sql"
@@ -72,37 +70,23 @@ func (s *dictDataService) GetDictDataById(id int64) (data *model.SysDictData, er
 
 // GetDictWithDataByType 通过字典键类型获取选项
 func (s *dictDataService) GetDictWithDataByType(req *model.GetDictReq) (dict *model.DictRes, err error) {
-	cache := comService.Cache.New()
-	cacheKey := global.SysDict + "_" + req.DictType
-	//从缓存获取
-	iDict := cache.Get(cacheKey)
-	if iDict != nil {
-		err = gconv.Struct(iDict, &dict)
-		if err != nil {
-			return
-		}
-	} else {
-		//从数据库获取
-		dict = &model.DictRes{}
-		//获取类型数据
-		err = s.Dao.DB.Model("sys_dict_type").Where(dao.SysDictType.Columns.DictType, req.DictType).
-			Where(dao.SysDictType.Columns.Status, "10").Fields(model.DictTypeRes{}).Scan(&dict.Info)
-		if err != nil {
-			g.Log().Error(err)
-			err = gerror.New("获取字典类型失败")
-		}
-		err = s.Dao.Where(s.Dao.Columns.DictType, req.DictType).Where(s.Dao.Columns.Status, "10").
-			Order(s.Dao.Columns.DictSort + " asc," + s.Dao.Columns.DictCode + " asc").
-			Scan(&dict.Values)
-		if err != nil {
-			g.Log().Error(err)
-			err = gerror.New("获取字典数据失败")
-		}
-		//缓存菜单
-		if dict.Info != nil && dict.Values != nil {
-			cache.Set(cacheKey, dict, 0, global.SysDictTag)
-		}
+	//从数据库获取
+	dict = &model.DictRes{}
+	//获取类型数据
+	err = s.Dao.DB.Model("sys_dict_type").Where(dao.SysDictType.Columns.DictType, req.DictType).
+		Where(dao.SysDictType.Columns.Status, "10").Fields(model.DictTypeRes{}).Scan(&dict.Info)
+	if err != nil {
+		g.Log().Error(err)
+		err = gerror.New("获取字典类型失败")
+	}
+	err = s.Dao.Where(s.Dao.Columns.DictType, req.DictType).Where(s.Dao.Columns.Status, "10").
+		Order(s.Dao.Columns.DictSort + " asc," + s.Dao.Columns.DictCode + " asc").
+		Scan(&dict.Values)
+	if err != nil {
+		g.Log().Error(err)
+		err = gerror.New("获取字典数据失败")
 	}
+
 	//设置给定的默认值
 	for _, v := range dict.Values {
 		if req.DefaultValue != "" {

+ 0 - 11
opms_admin/app/service/sys_dict_type.go

@@ -2,8 +2,6 @@ package service
 
 import (
 	"context"
-	"dashoo.cn/micro/app/common/global"
-	comService "dashoo.cn/micro/app/common/service"
 	"dashoo.cn/micro/app/dao"
 	"dashoo.cn/micro/app/model"
 	"github.com/gogf/gf/container/garray"
@@ -69,21 +67,12 @@ func (s *dictTypeService) GetDictById(id int64) (dict *model.SysDictType, err er
 
 // GetAllDictType 获取所有正常状态下的字典类型
 func (s *dictTypeService) GetAllDictType() (list []*model.SysDictType, err error) {
-	cache := comService.Cache.New()
-	//从缓存获取
-	data := cache.Get(global.SysDict + "_dict_type_all")
-	if data != nil {
-		err = gconv.Structs(data, &list)
-		return
-	}
 	err = s.Dao.Where("status", 1).Order("dict_id ASC").Scan(&list)
 	if err != nil {
 		g.Log().Error(err)
 		err = gerror.New("获取字典类型数据出错")
 		return
 	}
-	//缓存
-	cache.Set(global.SysDict+"_dict_type_all", list, 0, global.SysDictTag)
 	return
 }
 

+ 18 - 0
opms_admin/app/service/sys_menu.go

@@ -183,6 +183,24 @@ func (s menuService) GetMenuTree(isAll bool) ([]model.MenuTree, error) {
 	return menuTree, err
 }
 
+// GetUserRoleMenuTree 用户获取角色菜单树
+func (s menuService) GetUserRoleMenuTree(roles []int) ([]model.MenuTree, error) {
+	menuList := make([]model.SysMenu, 0)
+	err := s.Dao.Where(s.Dao.Columns.Status, "10").WhereIn(s.Dao.Columns.MenuType, g.Slice{"M", "C"}).
+		WhereIn(s.Dao.Columns.Id, dao.NewSysRoleMenuDao(s.Tenant).WhereIn(dao.SysRoleMenu.Columns.RoleId, roles).Fields(dao.SysRoleMenu.Columns.MenuId)).
+		Order("sort").Scan(&menuList)
+
+	treeMap := make(map[int][]model.MenuTree, 0)
+	for _, v := range menuList {
+		treeMap[v.ParentId] = append(treeMap[v.ParentId], v.ConvMenuTree())
+	}
+	menuTree := treeMap[0]
+	for i := 0; i < len(menuTree); i++ {
+		s.getChildrenList(&menuTree[i], treeMap)
+	}
+	return menuTree, err
+}
+
 // getChildrenList 获取菜单的子菜单
 func (s menuService) getChildrenList(menu *model.MenuTree, treeMap map[int][]model.MenuTree) {
 	if value, ok := treeMap[menu.Id]; ok {

+ 9 - 16
opms_admin/app/service/sys_role.go

@@ -2,8 +2,6 @@ package service
 
 import (
 	"context"
-	"dashoo.cn/micro/app/common/global"
-	"dashoo.cn/micro/app/common/service"
 	"dashoo.cn/micro/app/dao"
 	"dashoo.cn/micro/app/model"
 	"dashoo.cn/opms_libary/utils"
@@ -34,22 +32,12 @@ func NewRoleService(ctx context.Context) (svc *roleService, err error) {
 
 // GetRoleList 获取角色列表
 func (s *roleService) GetRoleList() (list []*model.SysRole, err error) {
-	cache := service.Cache.New()
-	//从缓存获取
-	iList := cache.Get(global.SysRole)
-	if iList != nil {
-		err = gconv.Struct(iList, &list)
-		return
-	}
 	//从数据库获取
 	list, err = s.Dao.Order(s.Dao.Columns.Sort + " asc," + s.Dao.Columns.Id + " asc").All()
 	if err != nil {
 		g.Log().Error(err)
 		err = gerror.New("获取角色数据失败")
 	}
-	//缓存数据
-	cache.Set(global.SysRole, list, 0, global.SysAuthTag)
-	iList = cache.Get(global.SysRole)
 	return
 }
 
@@ -117,6 +105,15 @@ func (s *roleService) GetRoleDeptTreeselect(id int64) (deptIds []int, err error)
 	return
 }
 
+// GetRolesMenuPermissions 获取角色菜单权限
+func (s roleService) GetRolesMenuPermissions(ids []int) (perms []string, err error) {
+	result, err := dao.NewSysMenuDao(s.Tenant).Fields(dao.SysMenu.Columns.Perms).WhereIn(dao.SysMenu.Columns.MenuType, g.Slice{"C", "F"}).
+		WhereIn(dao.SysMenu.Columns.Id, s.roleMenuDao.WhereIn(s.roleMenuDao.Columns.RoleId, ids).Fields(s.roleMenuDao.Columns.MenuId)).
+		WhereNot(dao.SysMenu.Columns.Perms, "").Array()
+	perms = gconv.Strings(result)
+	return perms, err
+}
+
 func (s *roleService) CreateRole(req *model.SysRoleReq) error {
 	data := new(model.SysRole)
 	if err := gconv.Struct(req, data); err != nil {
@@ -195,10 +192,6 @@ func (s *roleService) DeleteByIds(ids []int64) (err error) {
 
 func (s *roleService) UpdateRoleStatus(req *model.StatusSetReq) error {
 	_, err := s.Dao.Where(s.Dao.Columns.Id, req.RoleId).Data(s.Dao.Columns.Status, req.Status).Update()
-	if err == nil {
-		//清除TAG缓存
-		service.Cache.New().RemoveByTag(global.SysAuthTag)
-	}
 	return err
 }
 

+ 12 - 11
opms_admin/app/service/sys_user.go

@@ -146,11 +146,6 @@ func (s *userService) GetUserByUsername(ctx context.Context, userName string) (u
 	return dao.SysUser.FindByUsername(ctx, userName)
 }
 
-// SaveOnline 保存用户登录在线状态信息
-//func (s *sysUser) SaveOnline(params *model.SysUserOnline) {
-//	dao.SysUserOnline.SaveOnline(params)
-//}
-
 // GetUserInfoById 通过Id获取用户信息
 func (s *userService) GetUserInfoById(id int, withPwd ...bool) (user *model.SysUser, err error) {
 	if len(withPwd) > 0 && withPwd[0] {
@@ -425,17 +420,21 @@ func (s *userService) UpdateUser(req *model.EditUserReq) (err error) {
 func (s *userService) ResetUserPwd(req *model.SysUserResetPwdReq) error {
 	salt := grand.S(10)
 	password := utils.EncryptPassword(req.Password, salt)
-	_, err := dao.SysUser.WherePri(req.Id).Update(g.Map{
+	data := g.Map{
 		dao.SysUser.Columns.UserSalt: salt,
 		dao.SysUser.Columns.Password: password,
-	})
+	}
+	SetCurrentUpdatedInfo(data, s.CxtUser)
+	_, err := dao.SysUser.WherePri(req.Id).Update()
 	return err
 }
 
 func (s *userService) ChangeUserStatus(req *model.SysUserStatusReq) error {
-	_, err := dao.SysUser.WherePri(req.Id).Update(g.Map{
+	data := g.Map{
 		dao.SysUser.Columns.Status: req.UserStatus,
-	})
+	}
+	SetCurrentUpdatedInfo(data, s.CxtUser)
+	_, err := dao.SysUser.WherePri(req.Id).Update()
 	return err
 }
 
@@ -475,10 +474,12 @@ func (s *userService) ProfileUpdatePwd(req *model.ProfileUpdatePwdReq) error {
 	}
 	salt := grand.S(10)
 	newPassword := utils.EncryptPassword(req.NewPassword, salt)
-	_, err = dao.SysUser.WherePri(req.UserId).Unscoped().Update(g.Map{
+	data := g.Map{
 		dao.SysUser.Columns.UserSalt: salt,
 		dao.SysUser.Columns.Password: newPassword,
-	})
+	}
+	SetCurrentUpdatedInfo(data, s.CxtUser)
+	_, err = dao.SysUser.WherePri(req.UserId).Unscoped().Update(data)
 	return err
 }