zoukankan      html  css  js  c++  java
  • 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.4) 登录功能的实现,创建与登录用户相关的接口和实现类

    索引

    【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 目录索引

    简述

    今天我们创建几个与登录用户相关的数据表的接口和实现类

    项目准备

    我们用的工具是:VS 2013 + SqlServer 2012 + IIS7.5

    希望大家对ASP.NET MVC有一个初步的理解,理论性的东西我们不做过多解释,有些地方不理解也没关系,会用就行了,用的多了,用的久了,自然就理解了。

    项目开始

    一、新建登录用户类Account

    我们在(5.2)中我们登录验证直接返回了管理员实体类Domain.SYS_USER,但是在实际的后台操作验证中,我们并不需要SYS_USER的许多属性,同时我们需要它的一些扩展属性,我们来新建一个管理员类,来具体的描述这个管理员,我们在Service类库下面新建一个管理类Account.cs

    代码:

     1 using System.Collections.Generic;
     2 
     3 namespace Service
     4 {
     5     /// <summary>
     6     /// 通用用户登录类,简单信息
     7     /// </summary>
     8     public class Account
     9     {
    10         #region Attribute
    11         /// <summary>
    12         /// 主键
    13         /// </summary>
    14         public int Id { get; set; }
    15         /// <summary>
    16         /// 姓名
    17         /// </summary>
    18         public string Name { get; set; }
    19         /// <summary>
    20         /// 登录的用户名
    21         /// </summary>
    22         public string LogName { get; set; }
    23         /// <summary>
    24         /// 登录密码
    25         /// </summary>
    26         public string PassWord { get; set; }
    27         /// <summary>
    28         /// 是否管理员
    29         /// </summary>
    30         public bool IsAdmin { get; set; }
    31         /// <summary>
    32         /// 用户头像
    33         /// </summary>
    34         public string Face_Img { get; set; }
    35         /// <summary>
    36         /// 用户主部门
    37         /// </summary>
    38         public Domain.SYS_DEPARTMENT DptInfo { get; set; }
    39         /// <summary>
    40         /// 用户所在部门集合
    41         /// </summary>
    42         public List<Domain.SYS_DEPARTMENT> Dpt { get; set; }
    43         /// <summary>
    44         /// 权限集合
    45         /// </summary>
    46         public List<Domain.SYS_PERMISSION> Permissions { get; set; }
    47         /// <summary>
    48         /// 角色的集合
    49         /// </summary>
    50         public List<Domain.SYS_ROLE> Roles { get; set; }
    51         /// <summary>
    52         /// 用户岗位集合
    53         /// </summary>
    54         public List<Domain.SYS_POST_USER> PostUser { get; set; }
    55         /// <summary>
    56         /// 用户可操作的模块集合
    57         /// </summary>
    58         public List<Domain.SYS_MODULE> Modules { get; set; }
    59         #endregion
    60     }
    61 }
    View Code

    二、修改我们的用户管理接口IUserManage

    修改我们的用户管理接口IUserManage 添加几个方法:根据用户ID获取本职部门名称、 删除用户、根据用户构造用户基本信息、从Cookie中获取用户信息

    代码:

     1  /// <summary>
     2         /// 根据用户ID获取本职部门名称
     3         /// </summary>
     4         string GetUserDptName(int id);
     5         /// <summary>
     6         /// 删除用户
     7         /// </summary>
     8         bool Remove(int userId);
     9         /// <summary>
    10         /// 根据用户构造用户基本信息
    11         /// </summary>
    12         Account GetAccountByUser(Domain.SYS_USER user);
    13         /// <summary>
    14         /// 从Cookie中获取用户信息
    15         /// </summary>
    16         Account GetAccountByCookie();
    View Code

    三、我们分别创建几个关联表的接口和实现类

    创建SYS_USERINFO(用户档案)、SYS_USER_ROLE(用户角色)、SYS_USER_PERMISSION(用户权限)、SYS_POST_USER(用户岗位)、SYS_USER_DEPARTMENT(用户部门)、SYS_PERMISSION(权限表)、SYS_DEPARTMENT(部门表)、SYS_MODULE(模块表)的接口和实现类

    这两天没怎么发布东西,一是工作太忙,二是我提前把这些东西都写好了,测试了一下,可能写的会有些不合理,希望大家指正,我先贴出来,注释我都写了,大家可以先预想一下这些都是干什么用的,下一篇我们完成我们的登录功能,使用到了这些东西就一目了然了。

    IUserInfoManage、UserInfoManage

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace Service.IService
     8 {
     9     public interface IUserInfoManage:IRepository<Domain.SYS_USERINFO>
    10     {
    11     }
    12 }
    View Code
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Service.ServiceImp
     7 {
     8     /// <summary>
     9     /// Service层用户拓展信息接口
    10     /// add yuangang by 2016-05-19
    11     /// </summary>
    12     public class UserInfoManage : RepositoryBase<Domain.SYS_USERINFO>,IService.IUserInfoManage
    13     {
    14     }
    15 }
    View Code

    IUserRoleManage、UserRoleManage

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace Service.IService
     8 {
     9     /// <summary>
    10     /// Service层用户与角色关系接口
    11     /// add yuangang by 2016-05-19
    12     /// </summary>
    13     public interface IUserRoleManage:IRepository<Domain.SYS_USER_ROLE>
    14     {
    15         /// <summary>
    16         /// 设置用户角色
    17         /// add yuangang by 2016-05-19
    18         /// </summary>
    19         /// <param name="userId">用户ID</param>
    20         /// <param name="roleId">角色ID字符串</param>
    21         /// <returns></returns>
    22         bool SetUserRole(int userId, string roleId);
    23     }
    24 }
    View Code
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Service.ServiceImp
     7 {
     8     /// <summary>
     9     /// Service层用户与角色关系接口
    10     /// add yuangang by 2016-05-19
    11     /// </summary>
    12     public class UserRoleManage : RepositoryBase<Domain.SYS_USER_ROLE>,IService.IUserRoleManage
    13     {
    14         /// <summary>
    15         /// 设置用户角色
    16         /// add yuangang by 2016-05-19
    17         /// </summary>
    18         /// <param name="userId">用户ID</param>
    19         /// <param name="roleId">角色ID字符串</param>
    20         public bool SetUserRole(int userId, string roleId)
    21         {
    22             try
    23             {
    24                 //1、删除用户角色
    25                 this.Delete(p => p.FK_USERID == userId);
    26                 //2、设置当前用户的角色
    27                 if (string.IsNullOrEmpty(roleId)) return true;
    28                 foreach (var entity in roleId.Split(',').Select(t => new Domain.SYS_USER_ROLE()
    29                 {
    30                     FK_USERID = userId,
    31                     FK_ROLEID = int.Parse(t)
    32                 }))
    33                 {
    34                     this.dbSet.Add(entity);
    35                 }
    36                 return this.Context.SaveChanges() > 0;
    37             }
    38             catch (Exception e) { throw e; }
    39         }
    40     }
    41 }
    View Code

    IUserPermissionManage、UserPermissionManage

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Service.IService
     7 {
     8     /// <summary>
     9     /// Service层用户授权接口
    10     /// add yuangang by 2016-05-19
    11     /// </summary>
    12     public interface IUserPermissionManage : IRepository<Domain.SYS_USER_PERMISSION>
    13     {
    14         /// <summary>
    15         /// 设置用户权限
    16         /// add yuangang by 2016-05-19
    17         /// </summary>
    18         /// <param name="userId">用户ID</param>
    19         /// <param name="newper">权限字符串</param>
    20         /// <param name="sysId">系统ID</param>
    21         /// <returns></returns>
    22         bool SetUserPermission(int userId, string newper, string sysId);
    23     }
    24 }
    View Code
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using Service.IService;
     6 
     7 namespace Service.ServiceImp
     8 {
     9     /// <summary>
    10     /// Service层用户授权接口
    11     /// add yuangang by 2016-05-19
    12     /// </summary>
    13     public class UserPermissionManage : RepositoryBase<Domain.SYS_USER_PERMISSION>,IService.IUserPermissionManage
    14     {
    15         IPermissionManage PermissionManage { get; set; }
    16         /// <summary>
    17         /// 保存用户权限
    18         /// </summary>
    19         public bool SetUserPermission(int userId, string newper, string sysId)
    20         {
    21             try
    22             {
    23                 //1、获取当前系统的模块ID集合
    24                 var permissionId = this.PermissionManage.GetPermissionIdBySysId(sysId).Cast<int>().ToList();
    25                 //2、获取用户权限,是否存在,存在即删除
    26                 if (this.IsExist(p => p.FK_USERID == userId && permissionId.Any(e => e == p.FK_PERMISSIONID)))
    27                 {
    28                     //3、删除用户权限
    29                     this.Delete(p => p.FK_USERID == userId && permissionId.Any(e => e == p.FK_PERMISSIONID));
    30                 }
    31                 //4、添加用户权限
    32                 var str = newper.Trim(',').Split(',');
    33                 foreach (var per in str.Select(t => new Domain.SYS_USER_PERMISSION()
    34                 {
    35                     FK_USERID = userId,
    36                     FK_PERMISSIONID = int.Parse(t)
    37                 }))
    38                 {
    39                     this.dbSet.Add(per);
    40                 }
    41                 //5、Save
    42                 return this.Context.SaveChanges() > 0;
    43             }
    44             catch (Exception e) { throw e; }
    45         }
    46     }
    47 }
    View Code

    IPostUserManage、PostUserManage

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Service.IService
     7 {
     8     /// <summary>
     9     /// 岗位用户关系业务接口
    10     /// add yuangang by 2016-05-19
    11     /// </summary>
    12     public interface IPostUserManage : IRepository<Domain.SYS_POST_USER>
    13     {
    14         /// <summary>
    15         /// 根据岗位ID获取人员集合,可传递多个岗位ID
    16         /// </summary>
    17         List<Domain.SYS_USER> GetUserListByPostId(string postId);
    18         /// <summary>
    19         /// 根据人员ID获取岗位集合,可传递多个
    20         /// </summary>
    21         List<Domain.SYS_POST> GetPostListByUserId(string userId);
    22         /// <summary>
    23         /// 添加岗位人员关系
    24         /// </summary>
    25         /// <param name="userId">人员ID</param>
    26         /// <param name="postId">岗位ID集合</param>
    27         /// <returns></returns>
    28         bool SavePostUser(int userId, string postId);
    29         /// <summary>
    30         /// 根据岗位集合获取岗位名称,部门-岗位模式        
    31         /// </summary>
    32         dynamic GetPostNameBySysPostUser(ICollection<Domain.SYS_POST_USER> collection);
    33 
    34     }
    35 }
    View Code
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Service.ServiceImp
     7 {
     8     /// <summary>
     9     /// 岗位人员关系业务实现类
    10     /// add yuangang by 2016-05-19
    11     /// </summary>
    12     public class PostUserManage : RepositoryBase<Domain.SYS_POST_USER>, IService.IPostUserManage
    13     {
    14         /// <summary>
    15         /// 根据岗位ID获取人员列表
    16         /// </summary>
    17         public List<Domain.SYS_USER> GetUserListByPostId(string postId)
    18         {
    19             try
    20             {
    21                 string sql = @"select * from sys_user t where exists(select u.fk_userid from sys_post_user u
    22                                 inner join sys_post_department p
    23                                 on u.fk_post_departmentid=p.id
    24                                 where t.id=u.fk_userid and p.fk_post_id in (" + postId + ")  group by u.fk_userid)";
    25                 return this.SelectBySql<Domain.SYS_USER>(sql);
    26             }
    27             catch (Exception e) { throw e.InnerException; }
    28         }
    29         /// <summary>
    30         /// 根据用户ID获取所持有的岗位集合
    31         /// </summary>
    32         public List<Domain.SYS_POST> GetPostListByUserId(string userId)
    33         {
    34             return this.LoadAll(p => userId.Contains(p.FK_USERID.ToString())).Select(p => p.SYS_POST_DEPARTMENT.SYS_POST).ToList();
    35         }
    36 
    37         /// <summary>
    38         /// 添加岗位人员关系
    39         /// </summary>
    40         /// <param name="userId">人员ID</param>
    41         /// <param name="postId">岗位ID集合</param>
    42         /// <returns></returns>
    43         public bool SavePostUser(int userId, string postId)
    44         {
    45             try
    46             {
    47                 if (this.IsExist(p => p.FK_USERID == userId))
    48                 {
    49                     //存在之后再对比是否一致 
    50                     var oldCount = this.LoadAll(p => p.FK_USERID == userId).Select(p => p.FK_POST_DEPARTMENTID).ToList().Cast<int>().ToList();
    51                     var newpostId = postId.Trim(',').Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(p => int.Parse(p)).ToList();
    52                     if (oldCount.Count == newpostId.Count && oldCount.All(newpostId.Contains)) return true;
    53                     //删除原有关系
    54                     this.Delete(p => p.FK_USERID == userId);
    55                 }
    56                 if (!string.IsNullOrEmpty(postId))
    57                 {
    58                     //添加现有关系
    59                     var list = postId.Split(',').Select(item => new Domain.SYS_POST_USER()
    60                     {
    61                         FK_USERID = userId,
    62                         FK_POST_DEPARTMENTID =int.Parse(item)
    63                     }).ToList();
    64                     return this.SaveList(list) > 0;
    65                 }
    66                 return true;
    67             }
    68             catch (Exception e) { throw e.InnerException; }
    69         }
    70 
    71         /// <summary>
    72         /// 根据岗位集合获取岗位名称,部门-岗位模式        
    73         /// </summary>
    74         public dynamic GetPostNameBySysPostUser(ICollection<Domain.SYS_POST_USER> collection)
    75         {
    76             //岗位部门关系ID集合
    77             string post_departmentid = collection.Select(p => p.FK_POST_DEPARTMENTID).Aggregate(string.Empty, (current, t) => current + "'" + t + "',").TrimEnd(',');
    78             try
    79             {
    80                 string sql = @"select d.name+'-'+p.postname as postname,s.id from sys_department d inner join
    81                         sys_post_department s on d.id=s.fk_department_id
    82                         inner join sys_post p on p.id=s.fk_post_id 
    83                         where s.id in (" + post_departmentid + ")";
    84                 return this.ExecuteSqlQuery(sql);
    85             }
    86             catch (Exception e) { throw e.InnerException; }
    87         }
    88     }
    89 }
    View Code

    IUserDepartmentManage、UserDepartmentManage

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Service.IService
     7 {
     8     /// <summary>
     9     /// 用户部门关系业务接口
    10     /// add yuangang by 2016-05-19
    11     /// </summary>
    12     public interface IUserDepartmentManage : IRepository<Domain.SYS_USER_DEPARTMENT>
    13     {
    14         /// <summary>
    15         /// 根据部门ID获取当前部门的所有用户集合
    16         /// </summary>
    17         List<Domain.SYS_USER> GetUserListByDptId(List<string> dptId);
    18         /// <summary>
    19         /// 根据用户ID获取所在的部门集合
    20         /// </summary>
    21         List<Domain.SYS_DEPARTMENT> GetDptListByUserId(int userId);
    22         /// <summary>
    23         /// 保存用户部门关系
    24         /// </summary>
    25         /// <param name="userId">用户ID</param>
    26         /// <param name="dptId">部门ID集合</param>
    27         /// <returns></returns>
    28         bool SaveUserDpt(int userId, string dptId);
    29     }
    30 }
    View Code
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Service.ServiceImp
     7 {
     8     /// <summary>
     9     /// 用户部门关系业务实现类
    10     /// add yuangang by 2016-05-19
    11     /// </summary>
    12     public class UserDepartmentManage:RepositoryBase<Domain.SYS_USER_DEPARTMENT>,IService.IUserDepartmentManage
    13     {
    14         /// <summary>
    15         /// 根据部门ID获取当前部门的所有用户ID集合
    16         /// </summary>
    17         public List<Domain.SYS_USER> GetUserListByDptId(List<string> dptId)
    18         {
    19             return this.LoadAll(p => dptId.Contains(p.DEPARTMENT_ID)).Select(p => p.SYS_USER).ToList();
    20         }
    21         /// <summary>
    22         /// 根据用户ID获取所在的部门ID集合
    23         /// </summary>
    24         public List<Domain.SYS_DEPARTMENT> GetDptListByUserId(int userId)
    25         {
    26             return this.LoadAll(p => p.USER_ID == userId).Select(p=>p.SYS_DEPARTMENT).ToList();
    27         }
    28 
    29         /// <summary>
    30         /// 保存用户部门关系
    31         /// </summary>
    32         /// <param name="userId">用户ID</param>
    33         /// <param name="dptId">部门ID集合</param>
    34         public bool SaveUserDpt(int userId, string dptId)
    35         {
    36             try
    37             {
    38                 //原始部门人员关系是否与当前设置一致,不一致重新构造
    39                 if (this.IsExist(p => p.USER_ID == userId))
    40                 {
    41                     //存在之后再对比是否一致 
    42                     var oldCount = this.LoadAll(p => p.USER_ID == userId && dptId.Contains(p.DEPARTMENT_ID)).Select(p => p.DEPARTMENT_ID).ToList();
    43                     var newdptid = dptId.Split(',').OrderBy(c => c).ToList();
    44                     if (oldCount.Count == newdptid.Count && oldCount.All(newdptid.Contains)) return true;
    45                     //删除原有关系
    46                     this.Delete(p => p.USER_ID == userId);
    47                 }
    48                 if (!string.IsNullOrEmpty(dptId))
    49                 {
    50                     //添加现有关系
    51                     var list = dptId.Split(',').Select(item => new Domain.SYS_USER_DEPARTMENT()
    52                     {
    53                         DEPARTMENT_ID = item,
    54                         USER_ID = userId
    55                     }).ToList();
    56                     return this.SaveList(list) > 0;
    57                 }
    58                 return true;
    59             }
    60             catch (Exception e) { throw e.InnerException; }
    61         }
    62     }
    63 }
    View Code

    IPermissionManage、PermissionManage

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Service.IService
     7 {
     8     /// <summary>
     9     /// Service 授权验证模块对应接口
    10     /// add yuangang by 2016-05-19
    11     /// </summary>
    12     public interface IPermissionManage : IRepository<Domain.SYS_PERMISSION>
    13     {
    14         /// <summary>
    15         /// 根据系统ID获取所有模块的权限ID集合
    16         /// </summary>
    17         List<int> GetPermissionIdBySysId(string sysId);
    18     }
    19 }
    View Code
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Data.Common;
     4 using System.Data.SqlClient;
     5 using System.Linq;
     6 using System.Text;
     7 
     8 namespace Service.ServiceImp
     9 {
    10     /// <summary>
    11     /// Service 授权模块关系处理类
    12     /// add yuangang by 2016-05-19
    13     /// </summary>
    14     public class PermissionManage : RepositoryBase<Domain.SYS_PERMISSION>, IService.IPermissionManage
    15     {
    16         /// <summary>
    17         /// 根据系统ID获取所有模块的权限ID集合
    18         /// </summary>
    19         public List<int> GetPermissionIdBySysId(string sysId)
    20         {
    21             try
    22             {
    23                 string sql = "select p.id from sys_permission p where exists(select 1 from sys_module t where t.fk_belongsystem=@sysid and t.id=p.moduleid)";
    24                 DbParameter para = new SqlParameter("@sysid", sysId);
    25                 return this.SelectBySql<int>(sql, para);
    26             }
    27             catch (Exception e)
    28             {
    29                 throw e;
    30             }
    31         }
    32     }
    33 }
    View Code

    IDepartmentManage、DepartmentManage

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Service.IService
     7 {
     8     /// <summary>
     9     /// Service层部门管理接口
    10     /// add yuangang by 2016-05-19
    11     /// </summary>
    12     public interface IDepartmentManage : IRepository<Domain.SYS_DEPARTMENT>
    13     {
    14         /// <summary>
    15         /// 递归部门列表,返回按级别排序
    16         /// add yuangang by 2016-05-19
    17         /// </summary>
    18         /// <param name="list"></param>
    19         /// <returns></returns>
    20         List<Domain.SYS_DEPARTMENT> RecursiveDepartment(List<Domain.SYS_DEPARTMENT> list);
    21 
    22         /// <summary>
    23         /// 根据部门ID递归部门列表,返回子部门+本部门的对象集合
    24         /// add yuangang by 2016-05-19
    25         /// </summary>
    26         List<Domain.SYS_DEPARTMENT> RecursiveDepartment(string parentId);
    27         /// <summary>
    28         /// 自动创建部门编号
    29         /// add yuangang by 2016-05-19
    30         /// </summary>
    31         string CreateCode(string parentCode);
    32 
    33         /// <summary>
    34         /// 部门是否存在下级部门
    35         /// add huafg by 2015-06-03
    36         /// </summary>
    37         bool DepartmentIsExists(string idlist);
    38 
    39         /// <summary>
    40         /// 根据部门ID获取部门名称,不存在返回空
    41         /// </summary>
    42         string GetDepartmentName(string id);
    43         /// <summary>
    44         /// 显示错层方法
    45         /// </summary>
    46         object GetDepartmentName(string name, decimal? level);
    47         /// <summary>
    48         /// 获取部门父级列表
    49         /// </summary>
    50         System.Collections.IList GetDepartmentByDetail();
    51 
    52     }
    53 }
    View Code
      1 using System;
      2 using System.Collections;
      3 using System.Collections.Generic;
      4 using System.Linq;
      5 using System.Text;
      6 
      7 namespace Service.ServiceImp
      8 {
      9     /// <summary>
     10     /// Service层部门管理
     11     /// add yuangang by 2016-05-19
     12     /// </summary>
     13     public class DepartmentManage : RepositoryBase<Domain.SYS_DEPARTMENT>,IService.IDepartmentManage
     14     {
     15         /// <summary>
     16         /// 自动创建部门编号
     17         /// add yuangang by 2016-05-19
     18         /// <param name="parentId">上级部门ID 注:ID不是Code,数据表已改</param>
     19         /// </summary>
     20         public string CreateCode(string parentId)
     21         {
     22             string _strCode = string.Empty;
     23 
     24             #region 验证上级部门code是否为空,为空返回,第一级部门的Code
     25             if (string.IsNullOrEmpty(parentId))
     26             {
     27                 //注意:Oracle存储值为空=null MsSql 空=空 null=null
     28                 var query = this.LoadAll(p => p.PARENTID == null || p.PARENTID == "").OrderBy(p => p.CODE).ToList();
     29                 if (!query.Any())
     30                 {
     31                     return "001";
     32                 }
     33                 //按照之前的逻辑,查漏补缺
     34                 for (int i = 1; i <= query.Count; i++)
     35                 {
     36                     string code = query[i - 1].CODE;
     37                     if (string.IsNullOrEmpty(code))
     38                     {
     39                         return FormatCode(i);
     40                     }
     41                     if (i != int.Parse(code))
     42                     {
     43                         return  FormatCode(i);
     44                     }
     45                 }
     46                 return  FormatCode(query.Count + 1);
     47             }
     48             #endregion
     49             
     50             #region 上级部门不为空,返回当前上级部门下的部门Code
     51             
     52             /* *根据部门编号获取下级部门 查询条件为:
     53              * 1.下级部门编号长度=当前部门编号+3 
     54              * 2.下级部门上级部门ID=当前部门ID
     55              * */
     56             var parentDpt = this.Get(p => p.ID == parentId);
     57             if (parentDpt != null)//上级部门存在
     58             {
     59                 //查询同等级部门下的所有数据
     60                 var queryable = this.LoadAll(p => p.CODE.Length == parentDpt.CODE.Length + 3 && p.PARENTID == parentId).OrderBy(p=>p.CODE).ToList();
     61                 if (queryable.Any())
     62                 {
     63                     //需要验证是否存在编号缺失的情况 方法:遍历下级部门列表,
     64                     //用部门编号去掉上级部门编号,然后转化成数字和for循环的索引进行对比,遇到第一个不相等时,返回此编号,并跳出循环
     65                     for (int i = 1; i <= queryable.Count; i++)
     66                     {
     67                         string _code = queryable[i - 1].CODE;
     68                         _code = _code.Substring(parentDpt.CODE.Length);
     69                         int _intCode = 0;
     70                         Int32.TryParse(_code, out _intCode);
     71                         //下级部门编号中不存在
     72                         if (i != _intCode)
     73                         {
     74                             //返回此编号,并退出循环
     75                             _strCode = parentDpt.CODE + FormatCode(i);
     76                             return _strCode;
     77                         }
     78                     }
     79                     //不存在编号缺失情况
     80                     _strCode = parentDpt.CODE + FormatCode(queryable.Count + 1);
     81                 }
     82                 else
     83                 {
     84                     _strCode = parentDpt.CODE + FormatCode(1);
     85                     return _strCode;
     86                 }
     87             }//上级部门不存在,返回空,这种情况基本不会出现
     88             #endregion
     89 
     90             return _strCode;
     91         }
     92         /// <summary>
     93         /// 功能描述:根据传入的数字 返回补码后的3位部门编号
     94         /// 创建标号:add yuangang by 2016-05-19
     95         /// </summary>
     96         public string FormatCode(int dptCode)
     97         {
     98             try
     99             {
    100                 string _strCode = string.Empty;
    101                 //<=9 一位数
    102                 if (dptCode <= 9 && dptCode >= 1)
    103                 {
    104                     return "00" + dptCode;
    105                 }
    106                 //<=99 两位数
    107                 else if (dptCode <= 99 && dptCode > 9)
    108                 {
    109                     return "0" + dptCode;
    110                 }
    111                 //<==999 三位数
    112                 else if (dptCode <= 999 && dptCode > 99)
    113                 {
    114                     return _strCode;
    115                 }
    116                 return string.Empty;
    117             }
    118             catch (Exception ex)
    119             {
    120                 throw ex;
    121             }
    122         }
    123 
    124         /// <summary>
    125         /// 验证当前删除的部门是否存在下级部门
    126         /// </summary>
    127         public bool DepartmentIsExists(string idlist)
    128         {
    129             return this.IsExist(p => idlist.Contains(p.PARENTID));
    130         }
    131 
    132         /// <summary>
    133         /// 递归部门列表,返回排序后的对象集合
    134         /// add yuangang by 2016-05-19
    135         /// </summary>
    136         public List<Domain.SYS_DEPARTMENT> RecursiveDepartment(List<Domain.SYS_DEPARTMENT> list) 
    137         {
    138             var result = new List<Domain.SYS_DEPARTMENT>();
    139             if (list.Count>0)
    140             {
    141                 ChildDepartment(list, result, null);
    142             }
    143             return result;
    144         }
    145 
    146         /// <summary>
    147         /// 根据部门ID递归部门列表,返回子部门+本部门的对象集合
    148         /// add yuangang by 2016-05-19
    149         /// </summary>
    150         public List<Domain.SYS_DEPARTMENT> RecursiveDepartment(string parentId)
    151         {
    152             //原始数据
    153             var list = this.LoadAll(null);
    154             //新数据
    155             var result = new List<Domain.SYS_DEPARTMENT>();
    156             if (list.Any())
    157             {
    158                 result.AddRange(list.Where(p => p.ID == parentId).ToList());
    159                 if(!string.IsNullOrEmpty(parentId))
    160                     ChildDepartment(list.ToList(),result, parentId);
    161                 else
    162                     ChildDepartment(list.ToList(),result, null);//oracle使用null sql使用空
    163             }
    164             return result;
    165         }
    166 
    167         private void ChildDepartment(List<Domain.SYS_DEPARTMENT> newlist ,List<Domain.SYS_DEPARTMENT> list,string id) 
    168         {
    169             var result = newlist.Where(p => p.PARENTID == id).OrderBy(p => p.CODE).ThenBy(p => p.SHOWORDER).ToList();
    170             if (result.Any())
    171             {
    172                 for (int i = 0; i < result.Count(); i++)
    173                 {
    174                     list.Add(result[i]);
    175                     ChildDepartment(newlist,list, result[i].ID);
    176                 }
    177             }
    178         }
    179 
    180         /// <summary>
    181         /// 根据部门ID获取部门名称,不存在返回空
    182         /// </summary>
    183         public string GetDepartmentName(string id)
    184         {
    185             var query = this.LoadAll(p => p.ID == id);
    186             if (query == null || !query.Any())
    187                 return "";
    188             return query.First().NAME;
    189         }
    190 
    191         /// <summary>
    192         /// 显示错层方法
    193         /// </summary>
    194         public object GetDepartmentName(string name, decimal? level)
    195         {
    196             if (level > 1)
    197             {
    198                 string nbsp = "&nbsp;&nbsp;";
    199                 for (int i = 0; i < level; i++)
    200                 {
    201                     nbsp += "&nbsp;&nbsp;";
    202                 }
    203                 name = nbsp + "|--" + name;
    204             }
    205             return name;
    206         }
    207 
    208         /// <summary>
    209         /// 获取父级列表
    210         /// </summary>
    211         public IList GetDepartmentByDetail()
    212         {
    213             var list = RecursiveDepartment(this.LoadAll(null).ToList())
    214                 .Select(p => new
    215                 {
    216                     id = p.ID,
    217                     code=p.CODE,
    218                     name = GetDepartmentName(p.NAME, p.BUSINESSLEVEL)
    219                 }).ToList();
    220 
    221             return Common.JsonConverter.JsonClass(list);
    222         }
    223     }
    224 }
    View Code

    IModuleManage、ModuleManage

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Service.IService
     7 {
     8     /// <summary>
     9     /// Service模型处理接口
    10     /// add yuangang by 2015-05-22
    11     /// </summary>
    12     public interface IModuleManage : IRepository<Domain.SYS_MODULE>
    13     {
    14         /// <summary>
    15         /// 获取用户权限模块集合
    16         /// add yuangang by 2015-05-30
    17         /// </summary>
    18         /// <param name="userId">用户ID</param>
    19         /// <param name="permission">用户授权集合</param>
    20         /// <param name="siteId">站点ID</param>
    21         /// <returns></returns>
    22         List<Domain.SYS_MODULE> GetModule(int userId, List<Domain.SYS_PERMISSION> permission, string siteId);
    23         /// <summary>
    24         /// 递归模块列表,返回按级别排序
    25         /// add yuangang by 2015-06-03
    26         /// </summary>
    27         List<Domain.SYS_MODULE> RecursiveModule(List<Domain.SYS_MODULE> list);
    28 
    29         /// <summary>
    30         /// 批量变更当前模块下其他模块的级别
    31         /// </summary>
    32         bool MoreModifyModule(int moduleId, int levels);
    33     }
    34 }
    View Code
      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 
      6 namespace Service.ServiceImp
      7 {
      8     /// <summary>
      9     /// Service模型处理类
     10     /// add yuangang by 2015-05-22
     11     /// </summary>
     12     public class ModuleManage : RepositoryBase<Domain.SYS_MODULE>, IService.IModuleManage
     13     {
     14         /// <summary>
     15         /// 获取用户权限模块集合
     16         /// add yuangang by 2015-05-30
     17         /// </summary>
     18         /// <param name="userId">用户ID</param>
     19         /// <param name="permission">用户授权集合</param>
     20         /// <param name="siteId">站点ID</param>
     21         /// <returns></returns>
     22         public List<Domain.SYS_MODULE> GetModule(int userId, List<Domain.SYS_PERMISSION> permission,string siteId)
     23         {
     24             //返回模块
     25             var retmodule = new List<Domain.SYS_MODULE>();
     26             var permodule = new List<Domain.SYS_MODULE>();
     27             //权限转模块
     28             if (permission != null)
     29             {
     30                 permodule.AddRange(permission.Select(p => p.SYS_MODULE));
     31                 //去重
     32                 permodule = permodule.Distinct(new ModuleDistinct()).ToList();
     33             }
     34             //检索显示与系统
     35             //permodule = permodule.Where(p => p.ISSHOW == 1 && p.FK_BELONGSYSTEM.ToString() == siteId).ToList();
     36             //商城系统融入本系统不再区分系统
     37             permodule = permodule.Where(p => p.ISSHOW == 1 ).ToList();
     38             //构造上级导航模块
     39             //var prevModule = this.LoadListAll(p => p.FK_BELONGSYSTEM.ToString() == siteId);
     40             //商城系统融入本系统不再区分系统
     41             var prevModule = this.LoadListAll(null);
     42             //反向递归算法构造模块带上级上上级模块
     43             if (permodule.Count > 0)
     44             {
     45                 foreach (var item in permodule)
     46                 {
     47                     RecursiveModule(prevModule, retmodule, item.PARENTID);
     48                     retmodule.Add(item);
     49                 }
     50             }
     51             //去重
     52             retmodule = retmodule.Distinct(new ModuleDistinct()).ToList();
     53             //返回模块集合
     54             return retmodule.OrderBy(p => p.LEVELS).ThenBy(p => p.SHOWORDER).ToList();
     55         }
     56 
     57         /// <summary>
     58         /// 反向递归模块集合,可重复模块数据,最后去重
     59         /// </summary>
     60         /// <param name="PrevModule">总模块</param>
     61         /// <param name="retmodule">返回模块</param>
     62         /// <param name="parentId">上级ID</param>
     63         private void RecursiveModule(List<Domain.SYS_MODULE> PrevModule, List<Domain.SYS_MODULE> retmodule, int? parentId)
     64         {
     65            var result = PrevModule.Where(p => p.ID == parentId);
     66             if (result != null)
     67             {
     68                 foreach (var item in result)
     69                 {
     70                     retmodule.Add(item);
     71                     RecursiveModule(PrevModule, retmodule, item.PARENTID);
     72                 }
     73             }
     74         }
     75 
     76         /// <summary>
     77         /// 递归模块列表,返回按级别排序
     78         /// add yuangang by 2015-06-03
     79         /// </summary>
     80         public List<Domain.SYS_MODULE> RecursiveModule(List<Domain.SYS_MODULE> list)
     81         {
     82             List<Domain.SYS_MODULE> result = new List<Domain.SYS_MODULE>();
     83             if (list!=null && list.Count>0)
     84             {
     85                 ChildModule(list, result, 0);
     86             }
     87             return result;
     88         }
     89         /// <summary>
     90         /// 递归模块列表
     91         /// add yuangang by 2015-06-03
     92         /// </summary>
     93         private void ChildModule(List<Domain.SYS_MODULE> list, List<Domain.SYS_MODULE> newlist, int parentId)
     94         {
     95             var result = list.Where(p => p.PARENTID == parentId).OrderBy(p => p.LEVELS).OrderBy(p => p.SHOWORDER).ToList();
     96             if (result.Count() > 0)
     97             {
     98                 for (int i = 0; i < result.Count(); i++)
     99                 {
    100                     newlist.Add(result[i]);
    101                     ChildModule(list, newlist, result[i].ID);
    102                 }
    103             }
    104         }
    105 
    106         /// <summary>
    107         /// 批量变更下级模块的级别
    108         /// </summary>
    109         public bool MoreModifyModule(int moduleId, int levels)
    110         {
    111            //根据当前模块ID获取下级模块的集合
    112             var ChildModule = this.LoadAll(p => p.PARENTID == moduleId).ToList();
    113             if (ChildModule.Any())
    114             {
    115                 foreach (var item in ChildModule)
    116                 {
    117                     item.LEVELS = levels + 1;
    118                     this.Update(item);
    119                     MoreModifyModule(item.ID, item.LEVELS);
    120                 }
    121             }
    122             return true;
    123         }
    124 
    125         /// <summary>
    126         /// 获取模板列表
    127         /// </summary>
    128         public dynamic LoadModuleInfo(int id)
    129         {
    130             return Common.JsonConverter.JsonClass(this.LoadAll(p=>p.PARENTID==id).OrderBy(p => p.ID).Select(p => new { p.ID, p.NAME }).ToList());
    131         }
    132     }
    133   /// <summary>
    134     /// 模型去重,非常重要
    135     /// add yuangang by 2015-08-03
    136     /// </summary>
    137     public class ModuleDistinct : IEqualityComparer<Domain.SYS_MODULE> 
    138     {
    139         public bool Equals(Domain.SYS_MODULE x, Domain.SYS_MODULE y)
    140         {
    141             return x.ID == y.ID; 
    142         }
    143 
    144         public int GetHashCode(Domain.SYS_MODULE obj)
    145         {
    146             return obj.ToString().GetHashCode();
    147         }
    148     }
    149 }
    View Code

    三、我们分修改UserManage实现类

    修改我们UserManage的IsAdmin方法

     1  /// <summary>
     2         /// 是否超级管理员
     3         /// </summary>
     4         public bool IsAdmin(int userId)
     5         {
     6             //通过用户ID获取角色
     7             Domain.SYS_USER entity = this.Get(p => p.ID == userId);
     8             if (entity == null) return false;
     9             var roles = entity.SYS_USER_ROLE.Select(p => new Domain.SYS_ROLE
    10             {
    11                 ID = p.SYS_ROLE.ID
    12             });
    13             return roles.ToList().Any(item => item.ID == ClsDic.DicRole["超级管理员"]);
    14         }
    View Code


    /// 根据用户ID删除用户相关记录
    /// 删除原则:1、删除用户档案
    /// 2、删除用户角色关系
    /// 3、删除用户权限关系
    /// 4、删除用户岗位关系
    /// 5、删除用户部门关系
    /// 6、删除用户

     1 /// <summary>
     2         /// 根据用户ID删除用户相关记录
     3         /// 删除原则:1、删除用户档案
     4         ///           2、删除用户角色关系
     5         ///           3、删除用户权限关系
     6         ///           4、删除用户岗位关系
     7         ///           5、删除用户部门关系
     8         ///           6、删除用户
     9         /// </summary>
    10         public bool Remove(int userId)
    11         {
    12             try
    13             {
    14                 //档案
    15                 if (this.UserInfoManage.IsExist(p => p.USERID == userId))
    16                 {
    17                     this.UserInfoManage.Delete(p => p.USERID == userId);
    18                 }
    19                 //用户角色
    20                 if (this.UserRoleManage.IsExist(p => p.FK_USERID == userId))
    21                 {
    22                     this.UserRoleManage.Delete(p => p.FK_USERID == userId);
    23                 }
    24                 //用户权限
    25                 if (this.UserPermissionManage.IsExist(p => p.FK_USERID == userId))
    26                 {
    27                     this.UserPermissionManage.Delete(p => p.FK_USERID == userId);
    28                 }
    29                 //用户岗位
    30                 if (this.PostUserManage.IsExist(p => p.FK_USERID == userId))
    31                 {
    32                     this.PostUserManage.Delete(p => p.FK_USERID == userId);
    33                 }
    34                 //用户部门
    35                 if (this.UserDepartmentManage.IsExist(p => p.USER_ID == userId))
    36                 {
    37                     this.UserDepartmentManage.Delete(p => p.USER_ID == userId);
    38                 }
    39                 //用户自身
    40                 if (this.IsExist(p => p.ID == userId))
    41                 {
    42                     this.Delete(p => p.ID == userId);
    43                 }
    44                 return true;
    45             }
    46             catch (Exception e) { throw e.InnerException; }
    47         }
    View Code

    从Cookie中获取用户信息

     1 /// <summary>
     2         /// 从Cookie中获取用户信息
     3         /// </summary>
     4         public Account GetAccountByCookie()
     5         {
     6             var cookie = CookieHelper.GetCookie("cookie_rememberme");
     7             if (cookie != null)
     8             {
     9                 //验证json的有效性
    10                 if (!string.IsNullOrEmpty(cookie.Value))
    11                 {
    12                     //解密
    13                     var cookievalue = new Common.CryptHelper.AESCrypt().Decrypt(cookie.Value);
    14                     //是否为json
    15                     if (!JsonSplit.IsJson(cookievalue)) return null;
    16                     try
    17                     {
    18                         var jsonFormat = Common.JsonConverter.ConvertJson(cookievalue);
    19                         if (jsonFormat != null)
    20                         {
    21                             var users = UserLogin(jsonFormat.username, new Common.CryptHelper.AESCrypt().Decrypt(jsonFormat.password));
    22                             if (users != null)
    23                                 return GetAccountByUser(users);
    24                         }
    25                     }
    26                     catch { return null; }
    27                 }
    28             }
    29             return null;
    30         }
    View Code

    根据用户构造用户基本信息

     1  /// <summary>
     2         /// 根据用户构造用户基本信息
     3         /// </summary>
     4         public Account GetAccountByUser(Domain.SYS_USER users)
     5         {
     6             if (users == null) return null;
     7             //用户授权--->注意用户的授权是包括角色权限与自身权限的
     8             var permission = GetPermissionByUser(users);
     9             //用户角色
    10             var role = users.SYS_USER_ROLE.Select(p => p.SYS_ROLE).ToList();
    11             //用户部门
    12             var dpt = users.SYS_USER_DEPARTMENT.Select(p => p.SYS_DEPARTMENT).ToList();
    13             //用户岗位
    14             var post = users.SYS_POST_USER.ToList();
    15             //用户主部门
    16             var dptInfo = this.DepartmentManage.Get(p => p.ID == users.DPTID);
    17             //用户模块
    18             var module = permission.Select(p => p.SYS_MODULE).ToList().Distinct(new ModuleDistinct()).ToList();
    19             Account account = new Account()
    20             {
    21                 Id = users.ID,
    22                 Name = users.NAME,
    23                 LogName = users.ACCOUNT,
    24                 PassWord = users.PASSWORD,
    25                 IsAdmin = IsAdmin(users.ID),
    26                 DptInfo = dptInfo,
    27                 Dpt = dpt,
    28                 Face_Img = users.FACE_IMG,
    29                 Permissions = permission,
    30                 Roles = role,
    31                 PostUser = post,
    32                 Modules = module
    33             };
    34             return account;
    35         }
    View Code

    根据用户信息获取用户所有的权限

     1 /// <summary>
     2         /// 根据用户信息获取用户所有的权限
     3         /// </summary>
     4         private List<Domain.SYS_PERMISSION> GetPermissionByUser(Domain.SYS_USER users)
     5         {
     6             //1、超级管理员拥有所有权限
     7             if (IsAdmin(users.ID))
     8                 return PermissionManage.LoadListAll(null);
     9             //2、普通用户,合并当前用户权限与角色权限
    10             var perlist = new List<Domain.SYS_PERMISSION>();
    11             //2.1合并用户权限
    12             perlist.AddRange(users.SYS_USER_PERMISSION.Select(p => p.SYS_PERMISSION).ToList());
    13             //2.2合同角色权限
    14             ////todo:经典多对多的数据查询Linq方法
    15             perlist.AddRange(users.SYS_USER_ROLE.Select(p => p.SYS_ROLE.SYS_ROLE_PERMISSION.Select(c => c.SYS_PERMISSION)).SelectMany(c => c.Select(e => e)).Cast<Domain.SYS_PERMISSION>().ToList());
    16             //3、去重
    17             ////todo:通过重写IEqualityComparer<T>实现对象去重
    18             perlist = perlist.Distinct(new PermissionDistinct()).ToList();
    19             return perlist;
    20         }
    View Code

    根据用户ID获取部门名称

     1  /// <summary>
     2         /// 根据用户ID获取部门名称
     3         /// </summary>
     4         public string GetUserDptName(int id)
     5         {
     6             if (id <= 0)
     7                 return "";
     8             var dptid = this.Get(p => p.ID == id).DPTID;
     9             return this.DepartmentManage.Get(p => p.ID == dptid).NAME;
    10         }
    View Code

    三、权限去重,非常重要

     1  /// <summary>
     2     /// 权限去重,非常重要
     3     /// add yuangang by 2015-08-03
     4     /// </summary>
     5     public class PermissionDistinct : IEqualityComparer<Domain.SYS_PERMISSION>
     6     {
     7         public bool Equals(Domain.SYS_PERMISSION x, Domain.SYS_PERMISSION y)
     8         {
     9             return x.ID == y.ID;
    10         }
    11 
    12         public int GetHashCode(Domain.SYS_PERMISSION obj)
    13         {
    14             return obj.ToString().GetHashCode();
    15         }
    16     }
    View Code

    需要的帮助类:【C#公共帮助类】 WebHelper帮助类

    原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com

  • 相关阅读:
    [JSBSim]基于winsocket2的TCPUDP使用例子
    [转][JSBSim]JSBSim的使用--飞行控制组件及其配置
    [原][译][osg][osgEarth]飞行模拟软件JSBSim的操作(FGFCS类)
    [原][JSBSim]基于qt代码实现:TCP|UDP与飞行模拟软件JSBSim的通信,现实模型飞行!
    Linux mysql添加用户,删除用户,以及用户权限
    Linux启动/停止/重启Mysql数据库的方法
    Linux中vi编辑器的使用详解
    安装mysql问题解决
    centos6.5下修改文件夹权限和用户名用户组
    mysql启动时报错:Starting MySQL... ERROR! The server quit without updating PID file (/opt/mysql/data/mysql.pid) 的解决方法
  • 原文地址:https://www.cnblogs.com/yuangang/p/5507710.html
Copyright © 2011-2022 走看看