你的位置:首页 > ASP.net教程

[ASP.net教程]【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.4) 登录功能的实现,创建与登录用户相关的接口和实现类


声明:本系列为原创,分享本人现用框架,未经本人同意,禁止转载!http://yuangang.cnblogs.com

希望大家好好一步一步做,所有的技术和项目,都毫无保留的提供,希望大家能自己跟着做一套,还有,请大家放心,只要大家喜欢,有人需要,绝对不会烂尾,我会坚持写完~

如果你感觉文章有帮助,点一下推荐,让更多的朋友参与进来,也是对本人劳动成果的鼓励,谢谢大家!由于还要工作,所以基本都是牺牲午休时间来写博客的,写博客呢不是简单的Ctrl+C、Ctrl+V,我是要挨着做一遍的,这也是对大家负责,所以有些时候更新不及时,或者问题没有及时解答,希望大家谅解,再次感谢大家!!

因为我引用了许多以前积累的类库,所以有些东西是重复的(后来更新),有些东西是过时的,包括我写的代码,希望大家不要纯粹的复制,取其精华去其糟粕>_<。

在项目最后我会把每个部分、每个阶段的Demo提供下载给大家,其实,如果跟着做完,并且剔除掉了我代码不好的地方,你也不需要这些Demo了,是吧~

索引

 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(1)搭建MVC环境 注册区域

 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(2)创建数据库和数据模型

 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(3)公共基础数据操作类 RepositoryBase

 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(4)对前面的一些问题汇总和总结

 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.1) 登录功能的实现,开始接触Spring IOC、DI

【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.2) 登录功能的实现,接口注入、log4net的使用

【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.3) 登录功能的实现,丰富数据表、建立关联

简述

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

项目准备

我们用的工具是: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 Attribute11     /// <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     #endregion60   }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-1911   /// </summary>12   public class UserInfoManage : RepositoryBase<Domain.SYS_USERINFO>,IService.IUserInfoManage13   {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-1912   /// </summary>13   public interface IUserRoleManage:IRepository<Domain.SYS_USER_ROLE>14   {15     /// <summary>16     /// 设置用户角色17     /// add yuangang by 2016-05-1918     /// </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-1911   /// </summary>12   public class UserRoleManage : RepositoryBase<Domain.SYS_USER_ROLE>,IService.IUserRoleManage13   {14     /// <summary>15     /// 设置用户角色16     /// add yuangang by 2016-05-1917     /// </summary>18     /// <param name="userId">用户ID</param>19     /// <param name="roleId">角色ID字符串</param>20     public bool SetUserRole(int userId, string roleId)21     {22       try23       {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-1911   /// </summary>12   public interface IUserPermissionManage : IRepository<Domain.SYS_USER_PERMISSION>13   {14     /// <summary>15     /// 设置用户权限16     /// add yuangang by 2016-05-1917     /// </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-1912   /// </summary>13   public class UserPermissionManage : RepositoryBase<Domain.SYS_USER_PERMISSION>,IService.IUserPermissionManage14   {15     IPermissionManage PermissionManage { get; set; }16     /// <summary>17     /// 保存用户权限18     /// </summary>19     public bool SetUserPermission(int userId, string newper, string sysId)20     {21       try22       {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、Save42         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-1911   /// </summary>12   public interface IPostUserManage : IRepository<Domain.SYS_POST_USER>13   {14     /// <summary>15     /// 根据岗位ID获取人员集合,可传递多个岗位ID16     /// </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-1911   /// </summary>12   public class PostUserManage : RepositoryBase<Domain.SYS_POST_USER>, IService.IPostUserManage13   {14     /// <summary>15     /// 根据岗位ID获取人员列表16     /// </summary>17     public List<Domain.SYS_USER> GetUserListByPostId(string postId)18     {19       try20       {21         string sql = @"select * from sys_user t where exists(select u.fk_userid from sys_post_user u22                 inner join sys_post_department p23                 on u.fk_post_departmentid=p.id24                 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       try46       {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       try79       {80         string sql = @"select d.name+'-'+p.postname as postname,s.id from sys_department d inner join81             sys_post_department s on d.id=s.fk_department_id82             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-1911   /// </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-1911   /// </summary>12   public class UserDepartmentManage:RepositoryBase<Domain.SYS_USER_DEPARTMENT>,IService.IUserDepartmentManage13   {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       try37       {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 = userId55           }).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-1911   /// </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-1913   /// </summary>14   public class PermissionManage : RepositoryBase<Domain.SYS_PERMISSION>, IService.IPermissionManage15   {16     /// <summary>17     /// 根据系统ID获取所有模块的权限ID集合18     /// </summary>19     public List<int> GetPermissionIdBySysId(string sysId)20     {21       try22       {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-1911   /// </summary>12   public interface IDepartmentManage : IRepository<Domain.SYS_DEPARTMENT>13   {14     /// <summary>15     /// 递归部门列表,返回按级别排序16     /// add yuangang by 2016-05-1917     /// </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-1925     /// </summary>26     List<Domain.SYS_DEPARTMENT> RecursiveDepartment(string parentId);27     /// <summary>28     /// 自动创建部门编号29     /// add yuangang by 2016-05-1930     /// </summary>31     string CreateCode(string parentCode);32 33     /// <summary>34     /// 部门是否存在下级部门35     /// add huafg by 2015-06-0336     /// </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-19135     /// </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-19149     /// </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         else162           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 => new215         {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-2211   /// </summary>12   public interface IModuleManage : IRepository<Domain.SYS_MODULE>13   {14     /// <summary>15     /// 获取用户权限模块集合16     /// add yuangang by 2015-05-3017     /// </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-0326     /// </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-03136   /// </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_ROLE10       {11         ID = p.SYS_ROLE.ID12       });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       try13       {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           //是否为json15           if (!JsonSplit.IsJson(cookievalue)) return null;16           try17           {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 = module33       };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

 

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