翼度科技»论坛 编程开发 .net 查看内容

一步一步搭建,功能最全的权限管理系统(一)

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
  一、前言
  这是一篇搭建权限管理系统的系列文章。
  随着网络的发展,信息安全对应任何企业来说都越发的重要,而本系列文章将和大家一起一步一步搭建一个全新的权限管理系统。
  说明:由于搭建一个全新的项目过于繁琐,所有作者将挑选核心代码和核心思路进行分享。
  二、技术选择

 
  三、开始设计
  1、自主搭建vue前端和.net core webapi后端,网上有很多搭建教程。
  这是我搭建的
 后端: 
  前端:

 
  搭建好之后,vue需要把基础配置做好,比如路由、响应请求等,网上都有教程。
   vue配置较为简单,webapi的框架我使用DDD领域启动设计方式,各个层的介绍如下下。

  • ProjectManageWebApi webapi接口层,属于启动项
  • Model 业务模型,代表着系统中的具体业务对象。
  • Infrastructure 仓储层,是数据存储层,提供持久化对象的方法。
  • Domain  领域层,是整个系统运行时核心业务对象的载体,是业务逻辑处理的领域。
  • Subdomain 子域,子域是领域层更加细微的划分,处理整个系统最核心业务逻辑。
  • Utility  工具层,存放系统的辅助工具类。
  2、搭建数据库
  菜单对于一个系统来说,是必不可少的,我们搭建权限管理系统就从这里开始
  任务:建立菜单表,并通过程序把菜单动态加载到页面,实现树形菜单。
  这是我的菜单表结构
  

 
  我采用的是一张表存储系统菜单,用id和pid存储上下级关系。当然这不是唯一的,根据情况可以把它拆分层多张表。
  3、创建基础仓储和菜单仓储
  在webapi中Infrastructure 仓储层创建基础仓储,以便提供持久化支持。
  我orm框架使用的是dapper来提共数据库和编程语言间的映射关系。
  首先需要建立一个增删改查的仓储接口,大致如下:
  1. /// <summary>
  2. /// 仓储接口定义
  3. /// </summary>
  4. public interface IRepository
  5. {
  6. }
  7. /// <summary>
  8. /// 定义泛型仓储接口
  9. /// </summary>
  10. /// <typeparam name="T">实体类型</typeparam>
  11. /// <typeparam name="object">主键类型</typeparam>
  12. public interface IRepository<T> : IRepository where T : class, new()
  13. {
  14.     /// <summary>
  15.     /// 新增
  16.     /// </summary>
  17.     /// <param name="entity">实体</param>
  18.     /// <param name="innserSql">新增sql</param>
  19.     /// <returns></returns>
  20.     int Insert(T entity, string innserSql);
  21.     /// <summary>
  22.     /// 修改
  23.     /// </summary>
  24.     /// <param name="entity">实体</param>
  25.     /// <param name="updateSql">更新sql</param>
  26.     /// <returns></returns>
  27.     int Update(T entity, string updateSql);
  28.     /// <summary>
  29.     /// 删除
  30.     /// </summary>
  31.     /// <param name="deleteSql">删除sql</param>
  32.     /// <returns></returns>
  33.     int Delete(string key,string deleteSql);
  34.     /// <summary>
  35.     /// 根据主键获取模型
  36.     /// </summary>
  37.     /// <param name="key">主键</param>
  38.     /// <param name="selectSql">查询sql</param>
  39.     /// <returns></returns>
  40.     T GetByKey(string key, string selectSql);
  41.     /// <summary>
  42.     /// 获取所有数据
  43.     /// </summary>
  44.     /// <param name="selectAllSql">查询sql</param>
  45.     /// <returns></returns>
  46.     List<T> GetAll(string selectAllSql);
  47.     /// <summary>
  48.     /// 根据唯一主键验证数据是否存在
  49.     /// </summary>
  50.     /// <param name="id">主键</param>
  51.     /// <param name="selectSql">查询sql</param>
  52.     /// <returns>返回true存在,false不存在</returns>
  53.     bool IsExist(string id, string selectSql);
  54.     /// <summary>
  55.     /// dapper通用分页方法
  56.     /// </summary>
  57.     /// <typeparam name="T">泛型集合实体类</typeparam>
  58.     /// <param name="pageResultModel">分页模型</param>
  59.     /// <returns></returns>
  60.     PageResultModel<T> GetPageList<T>(PageResultModel pageResultModel);
  61. }
复制代码
View Code  然后实现这个仓储接口
[code]/// /// 仓储基类/// /// 实体类型/// 主键类型public abstract class Repository : IRepository where T : class, new(){    ///     /// 删除    ///     /// 删除sql    ///     public int Delete(string key, string deleteSql)    {        using var connection = DataBaseConnectConfig.GetSqlConnection();        return connection.Execute(deleteSql, new { Key = key });    }    ///     /// 根据主键获取模型    ///     /// 主键    /// 查询sql    ///     public T GetByKey(string id, string selectSql)    {        using var connection = DataBaseConnectConfig.GetSqlConnection();        return connection.QueryFirstOrDefault(selectSql, new { Key = id });    }    ///     /// 获取所有数据    ///     /// 查询sql    ///     public List GetAll(string selectAllSql)    {        using var connection = DataBaseConnectConfig.GetSqlConnection();        return connection.Query(selectAllSql).ToList();    }    ///     /// 新增    ///     /// 新增实体    /// 新增sql    ///     public int Insert(T entity, string innserSql)    {        using var connection = DataBaseConnectConfig.GetSqlConnection();        return connection.Execute(innserSql, entity);    }    ///     /// 根据唯一主键验证数据是否存在    ///     /// 主键    /// 查询sql    /// 返回true存在,false不存在    public bool IsExist(string id, string selectSql)    {        using var connection = DataBaseConnectConfig.GetSqlConnection();        var count = connection.QueryFirst(selectSql, new { Key = id });        if (count > 0)            return true;        else            return false;    }    ///     /// 更新    ///     /// 更新实体    /// 更新sql    ///     public int Update(T entity, string updateSql)    {        using var connection = DataBaseConnectConfig.GetSqlConnection();        return connection.Execute(updateSql, entity);    }    ///     /// 分页方法    ///     /// 泛型集合实体类    /// 分页模型    ///     public PageResultModel GetPageList(PageResultModel pageResultModel)    {        PageResultModel resultModel = new();        using var connection = DataBaseConnectConfig.GetSqlConnection();        int skip = 1;        var orderBy = string.Empty;        if (pageResultModel.pageIndex > 0)        {            skip = (pageResultModel.pageIndex - 1) * pageResultModel.pageSize + 1;        }        if (!string.IsNullOrEmpty(pageResultModel.orderByField))        {            orderBy = string.Format(" ORDER BY {0} {1} ", pageResultModel.orderByField, pageResultModel.sortType);        }        StringBuilder sb = new StringBuilder();        sb.AppendFormat("SELECT COUNT(1) FROM {0} where 1=1 {1};", pageResultModel.tableName, pageResultModel.selectWhere);        sb.AppendFormat(@"SELECT  *                            FROM(SELECT ROW_NUMBER() OVER( {3}) AS RowNum,{0}                                      FROM  {1}                                      where 1=1 {2}                                    ) AS result                            WHERE  RowNum >= {4}   AND RowNum

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具