public static int RefreshCache(string systemCode) { int result = 0; List <BaseModuleEntity> list = BaseModuleManager.GetEntitiesByCache(systemCode, true); foreach (var entity in list) { // 2016-02-29 吉日嘎拉 强制刷新缓存 BaseModuleManager.GetObjectByCache(systemCode, entity.Id, true); } return(result); }
/// <summary> /// 获取用户的权限主键数组 /// </summary> /// <param name="systemCode">系统编号</param> /// <param name="userId">用户主键</param> /// <param name="companyId">公司主键</param> /// <param name="containPublic">公开的也包含</param> /// <param name="useBaseRole">使用基础角色权限</param> /// <returns>拥有权限数组</returns> public string[] GetPermissionIdsByUser(string systemCode, string userId, string companyId = null, bool containPublic = true, bool useBaseRole = false) { // 公开的操作权限需要计算 string[] result = null; int errorMark = 0; string tableName = BaseModuleEntity.TableName; if (string.IsNullOrWhiteSpace(systemCode)) { systemCode = "Base"; } // 就不需要参合基础的角色了 if (systemCode.Equals("Base")) { useBaseRole = false; } tableName = systemCode + "Module"; try { errorMark = 1; if (containPublic) { // 把公开的部分获取出来(把公开的主键数组从缓存里获取出来,减少数据库的读取次数) List <BaseModuleEntity> moduleEntities = BaseModuleManager.GetEntitiesByCache(systemCode); if (moduleEntities != null) { result = moduleEntities.Where((t => t.IsPublic == 1 && t.Enabled == 1 && t.DeletionStateCode == 0)).Select(t => t.Id.ToString()).ToArray(); } } tableName = systemCode + "UserRole"; string roleTableName = systemCode + "Role"; this.CurrentTableName = systemCode + "Permission"; List <IDbDataParameter> dbParameters = new List <IDbDataParameter>(); StringBuilder sqlQuery = new StringBuilder(); // 用户的操作权限 sqlQuery.Append(" SELECT " + BasePermissionEntity.FieldPermissionId); sqlQuery.Append(" FROM " + this.CurrentTableName); sqlQuery.Append(" WHERE (" + BasePermissionEntity.FieldResourceCategory + " = " + DbHelper.GetParameter(BaseUserEntity.TableName + "_" + BasePermissionEntity.FieldResourceCategory)); sqlQuery.Append(" AND " + BasePermissionEntity.FieldResourceId + " = " + DbHelper.GetParameter(BaseUserEntity.TableName + "_" + BaseUserEntity.FieldId)); sqlQuery.Append(" AND " + BasePermissionEntity.FieldEnabled + " = 1 "); sqlQuery.Append(" AND " + BasePermissionEntity.FieldDeletionStateCode + " = 0)"); dbParameters.Add(DbHelper.MakeParameter(BaseUserEntity.TableName + "_" + BasePermissionEntity.FieldResourceCategory, BaseUserEntity.TableName)); dbParameters.Add(DbHelper.MakeParameter(BaseUserEntity.TableName + "_" + BaseUserEntity.FieldId, userId)); // 角色的操作权限 sqlQuery.Append(" UNION "); sqlQuery.Append(" SELECT " + BasePermissionEntity.FieldPermissionId); sqlQuery.Append(" FROM " + this.CurrentTableName); sqlQuery.Append(" , ( SELECT " + BaseUserRoleEntity.FieldRoleId); sqlQuery.Append(" FROM " + tableName); sqlQuery.Append(" WHERE (" + BaseUserRoleEntity.FieldUserId + " = " + DbHelper.GetParameter(BaseUserRoleEntity.TableName + "_" + BaseUserRoleEntity.FieldUserId)); sqlQuery.Append(" AND " + BaseUserRoleEntity.FieldEnabled + " = 1 "); sqlQuery.Append(" AND " + BaseUserRoleEntity.FieldDeletionStateCode + " = 0 ) "); dbParameters.Add(DbHelper.MakeParameter(BaseUserRoleEntity.TableName + "_" + BaseUserRoleEntity.FieldUserId, userId)); // 2015-12-02 吉日嘎拉 简化SQL语句,提高效率 if (useBaseRole && !systemCode.Equals("Base", StringComparison.OrdinalIgnoreCase)) { // 是否使用基础角色的权限 sqlQuery.Append(" UNION SELECT " + BaseUserRoleEntity.FieldRoleId); sqlQuery.Append(" FROM " + BaseUserRoleEntity.TableName); sqlQuery.Append(" WHERE ( " + BaseUserRoleEntity.FieldUserId + " = " + DbHelper.GetParameter(BaseUserRoleEntity.TableName + "_USEBASE_" + BaseUserRoleEntity.FieldUserId)); sqlQuery.Append(" AND " + BaseUserRoleEntity.FieldEnabled + " = 1 "); sqlQuery.Append(" AND " + BaseUserRoleEntity.FieldDeletionStateCode + " = 0 ) "); dbParameters.Add(DbHelper.MakeParameter(BaseUserRoleEntity.TableName + "_USEBASE_" + BaseUserRoleEntity.FieldUserId, userId)); } /* * // 角色与部门是否进行关联? * // 2015-12-02 吉日嘎拉 这里基本上没在用的,心里有个数。 * if (BaseSystemInfo.UseRoleOrganize && !string.IsNullOrEmpty(companyId)) * { * string roleOrganizeTableName = systemCode + "RoleOrganize"; * sqlQuery.Append(" UNION SELECT " + BaseRoleOrganizeEntity.FieldRoleId); * sqlQuery.Append(" FROM " + roleOrganizeTableName); * sqlQuery.Append(" WHERE ( " + BaseRoleOrganizeEntity.FieldOrganizeId + " = " + DbHelper.GetParameter(BaseRoleOrganizeEntity.FieldOrganizeId)); * sqlQuery.Append(" AND " + BaseRoleOrganizeEntity.FieldEnabled + " = 1 "); * sqlQuery.Append(" AND " + BaseRoleOrganizeEntity.FieldDeletionStateCode + " = 0 )"); * dbParameters.Add(DbHelper.MakeParameter(BaseRoleOrganizeEntity.FieldOrganizeId, companyId)); * } */ sqlQuery.Append(") B "); sqlQuery.Append(" WHERE " + BasePermissionEntity.FieldResourceCategory + " = " + DbHelper.GetParameter(BaseRoleEntity.TableName + "_" + BasePermissionEntity.FieldResourceCategory)); sqlQuery.Append(" AND " + this.CurrentTableName + "." + BasePermissionEntity.FieldResourceId + " = B." + BaseUserRoleEntity.FieldRoleId); sqlQuery.Append(" AND " + this.CurrentTableName + "." + BasePermissionEntity.FieldEnabled + " = 1 "); sqlQuery.Append(" AND " + this.CurrentTableName + "." + BasePermissionEntity.FieldDeletionStateCode + " = 0 "); dbParameters.Add(DbHelper.MakeParameter(BaseRoleEntity.TableName + "_" + BasePermissionEntity.FieldResourceCategory, roleTableName)); List <string> ids = new List <string>(); errorMark = 3; using (IDataReader dataReader = DbHelper.ExecuteReader(sqlQuery.ToString(), dbParameters.ToArray())) { while (dataReader.Read()) { ids.Add(dataReader[BasePermissionEntity.FieldPermissionId].ToString()); } } // string[] userRolePermissionIds = ids.ToArray(); result = StringUtil.Concat(result, ids.ToArray()); // 按部门(组织机构)获取权限项 if (BaseSystemInfo.UseOrganizePermission) { if (!string.IsNullOrEmpty(companyId)) { sqlQuery = new StringBuilder(); sqlQuery.Append(" SELECT " + BasePermissionEntity.FieldPermissionId); sqlQuery.Append(" FROM " + this.CurrentTableName); sqlQuery.Append(" WHERE " + BasePermissionEntity.FieldResourceCategory + " = " + DbHelper.GetParameter(BasePermissionEntity.FieldResourceCategory)); sqlQuery.Append(" AND " + BasePermissionEntity.FieldPermissionId + " = " + DbHelper.GetParameter(BasePermissionEntity.FieldPermissionId)); sqlQuery.Append(" AND " + BasePermissionEntity.FieldEnabled + " = " + DbHelper.GetParameter(BasePermissionEntity.FieldEnabled)); sqlQuery.Append(" AND " + BasePermissionEntity.FieldDeletionStateCode + " = " + DbHelper.GetParameter(BasePermissionEntity.FieldDeletionStateCode)); // dt = DbHelper.Fill(sqlQuery); // string[] organizePermission = BaseBusinessLogic.FieldToArray(dt, BasePermissionEntity.FieldPermissionId).Distinct<string>().Where(t => !string.IsNullOrEmpty(t)).ToArray(); // 2015-12-02 吉日嘎拉 优化参数,用ExecuteReader,提高效率节约内存。 dbParameters = new List <IDbDataParameter>(); dbParameters.Add(DbHelper.MakeParameter(BasePermissionEntity.FieldResourceCategory, BaseOrganizeEntity.TableName)); dbParameters.Add(DbHelper.MakeParameter(BasePermissionEntity.FieldPermissionId, companyId)); dbParameters.Add(DbHelper.MakeParameter(BasePermissionEntity.FieldEnabled, 1)); dbParameters.Add(DbHelper.MakeParameter(BasePermissionEntity.FieldDeletionStateCode, 0)); ids = new List <string>(); errorMark = 4; using (IDataReader dataReader = DbHelper.ExecuteReader(sqlQuery.ToString(), dbParameters.ToArray())) { while (dataReader.Read()) { ids.Add(dataReader[BasePermissionEntity.FieldPermissionId].ToString()); } } // string[] organizePermission = ids.ToArray(); result = StringUtil.Concat(result, ids.ToArray()); } } } catch (System.Exception ex) { string writeMessage = "BasePermissionManager.GetPermissionIdsByUser:发生时间:" + DateTime.Now + System.Environment.NewLine + "errorMark = " + errorMark.ToString() + System.Environment.NewLine + "Message:" + ex.Message + System.Environment.NewLine + "Source:" + ex.Source + System.Environment.NewLine + "StackTrace:" + ex.StackTrace + System.Environment.NewLine + "TargetSite:" + ex.TargetSite + System.Environment.NewLine; FileUtil.WriteMessage(writeMessage, BaseSystemInfo.StartupPath + "//Exception//Exception" + DateTime.Now.ToString(BaseSystemInfo.DateFormat) + ".txt"); } return(result); }
// // 从数据库获取权限 // public List <BaseModuleEntity> GetPermissionListByUser(string systemCode, string userId, string companyId = null, bool fromCache = false) { List <BaseModuleEntity> result = new List <BaseModuleEntity>(); bool useBaseRole = false; string key = "BaseModule"; string tableName = "BaseModule"; if (!string.IsNullOrWhiteSpace(systemCode)) { key = systemCode + "Module"; tableName = systemCode + "Module"; // 2015-11-19 所有的系统都继承基础角色的权限 useBaseRole = true; // 2015-01-21 吉日嘎拉,实现判断别人的权限,是否超级管理员 bool isAdministrator = false; if (UserInfo != null && UserInfo.IsAdministrator) { if (UserInfo.Id.Equals(userId, StringComparison.CurrentCulture)) { isAdministrator = true; } else { BaseUserManager userManager = new BaseUserManager(UserInfo); isAdministrator = userManager.IsAdministrator(userId); } } if (isAdministrator) { result = BaseModuleManager.GetEntitiesByCache(systemCode); } else { string[] permissionIds = null; // 2016-02-26 吉日嘎拉进行优化,用缓存与不用缓存感觉区别不是很大。 if (fromCache) { // permissionIds = GetPermissionIdsByUserByCache(systemCode, userId, companyId, useBaseRole); permissionIds = GetPermissionIdsByUser(systemCode, userId, companyId, false, useBaseRole); } else { permissionIds = GetPermissionIdsByUser(systemCode, userId, companyId, false, useBaseRole); } // 2016-03-02 吉日嘎拉,少读一次缓存服务器,减少缓存服务器读写压力 List <BaseModuleEntity> entities = BaseModuleManager.GetEntitiesByCache(systemCode); // 若是以前赋予的权限,后来有些权限设置为无效了,那就不应该再获取哪些无效的权限才对。 if (permissionIds != null && permissionIds.Length > 0) { result = (entities as List <BaseModuleEntity>).Where(t => (t.IsPublic == 1 && t.Enabled == 1 && t.DeletionStateCode == 0) || permissionIds.Contains(t.Id)).ToList(); } else { result = (entities as List <BaseModuleEntity>).Where(t => t.IsPublic == 1 && t.Enabled == 1 && t.DeletionStateCode == 0).ToList(); } } } return(result); }
/// <summary> /// 获取用户的权限主键数组 /// </summary> /// <param name="systemCode">系统编号</param> /// <param name="userId">用户主键</param> /// <param name="companyId">公司主键</param> /// <param name="useBaseRole">使用基础角色权限</param> /// <returns>拥有权限数组</returns> public static string[] GetPermissionIdsByUserByCache(string systemCode, string userId, string companyId = null, bool containPublic = true, bool useBaseRole = false) { // 公开的操作权限需要计算 string[] result = null; int errorMark = 0; string tableName = BaseModuleEntity.TableName; if (string.IsNullOrWhiteSpace(systemCode)) { systemCode = "Base"; } // 就不需要参合基础的角色了 if (systemCode.Equals("Base")) { useBaseRole = false; } tableName = systemCode + "Module"; try { errorMark = 1; // 01: 把公开的部分获取出来(把公开的主键数组从缓存里获取出来,减少数据库的读取次数) if (containPublic) { List <BaseModuleEntity> moduleEntities = BaseModuleManager.GetEntitiesByCache(systemCode); if (moduleEntities != null) { result = moduleEntities.Where((t => t.IsPublic == 1 && t.Enabled == 1 && t.DeletionStateCode == 0)).Select(t => t.Id.ToString()).ToArray(); } } // 02: 获取用户本身拥有的权限 string[] userPermissionIds = BaseUserPermissionManager.GetPermissionIdsByCache(systemCode, userId); result = StringUtil.Concat(result, userPermissionIds); // 03: 用户角色的操作权限 // 用户都在哪些角色里?通过缓存读取?没有角色的,没必要进行运算了 string[] roleIds = BaseUserManager.GetRoleIdsByCache(systemCode, userId, companyId); if (useBaseRole && !systemCode.Equals("Base", StringComparison.OrdinalIgnoreCase)) { string[] baseRoleIds = BaseUserManager.GetRoleIdsByCache("Base", userId, companyId); if (baseRoleIds != null && baseRoleIds.Length > 0) { roleIds = StringUtil.Concat(roleIds, baseRoleIds); } } if (roleIds != null && roleIds.Length > 0) { string[] userRolePermissionIds = BaseRolePermissionManager.GetPermissionIdsByCache(systemCode, roleIds); result = StringUtil.Concat(result, userRolePermissionIds); } // 04: 按部门(组织机构)获取权限项 if (BaseSystemInfo.UseOrganizePermission && !string.IsNullOrEmpty(companyId)) { // 2016-02-26 吉日嘎拉,公司权限进行优化简化 string[] organizePermission = BaseOrganizePermissionManager.GetPermissionIdsByCache(systemCode, companyId); result = StringUtil.Concat(result, organizePermission); } } catch (System.Exception ex) { string writeMessage = "BasePermissionManager.GetPermissionIdsByUser:发生时间:" + DateTime.Now + System.Environment.NewLine + "errorMark = " + errorMark.ToString() + System.Environment.NewLine + "Message:" + ex.Message + System.Environment.NewLine + "Source:" + ex.Source + System.Environment.NewLine + "StackTrace:" + ex.StackTrace + System.Environment.NewLine + "TargetSite:" + ex.TargetSite + System.Environment.NewLine; FileUtil.WriteMessage(writeMessage, BaseSystemInfo.StartupPath + "//Exception//Exception" + DateTime.Now.ToString(BaseSystemInfo.DateFormat) + ".txt"); } return(result); }