一步一步搭建,功能最全的权限管理系统(一)
一、前言这是一篇搭建权限管理系统的系列文章。
随着网络的发展,信息安全对应任何企业来说都越发的重要,而本系列文章将和大家一起一步一步搭建一个全新的权限管理系统。
说明:由于搭建一个全新的项目过于繁琐,所有作者将挑选核心代码和核心思路进行分享。
二、技术选择
三、开始设计
1、自主搭建vue前端和.net core webapi后端,网上有很多搭建教程。
这是我搭建的
后端: 前端:
搭建好之后,vue需要把基础配置做好,比如路由、响应请求等,网上都有教程。
vue配置较为简单,webapi的框架我使用DDD领域启动设计方式,各个层的介绍如下下。
[*]ProjectManageWebApi webapi接口层,属于启动项
[*]Model 业务模型,代表着系统中的具体业务对象。
[*]Infrastructure 仓储层,是数据存储层,提供持久化对象的方法。
[*]Domain 领域层,是整个系统运行时核心业务对象的载体,是业务逻辑处理的领域。
[*]Subdomain 子域,子域是领域层更加细微的划分,处理整个系统最核心业务逻辑。
[*]Utility 工具层,存放系统的辅助工具类。
2、搭建数据库
菜单对于一个系统来说,是必不可少的,我们搭建权限管理系统就从这里开始
任务:建立菜单表,并通过程序把菜单动态加载到页面,实现树形菜单。
这是我的菜单表结构
我采用的是一张表存储系统菜单,用id和pid存储上下级关系。当然这不是唯一的,根据情况可以把它拆分层多张表。
3、创建基础仓储和菜单仓储
在webapi中Infrastructure 仓储层创建基础仓储,以便提供持久化支持。
我orm框架使用的是dapper来提共数据库和编程语言间的映射关系。
首先需要建立一个增删改查的仓储接口,大致如下:
/// <summary>
/// 仓储接口定义
/// </summary>
public interface IRepository
{
}
/// <summary>
/// 定义泛型仓储接口
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <typeparam name="object">主键类型</typeparam>
public interface IRepository<T> : IRepository where T : class, new()
{
/// <summary>
/// 新增
/// </summary>
/// <param name="entity">实体</param>
/// <param name="innserSql">新增sql</param>
/// <returns></returns>
int Insert(T entity, string innserSql);
/// <summary>
/// 修改
/// </summary>
/// <param name="entity">实体</param>
/// <param name="updateSql">更新sql</param>
/// <returns></returns>
int Update(T entity, string updateSql);
/// <summary>
/// 删除
/// </summary>
/// <param name="deleteSql">删除sql</param>
/// <returns></returns>
int Delete(string key,string deleteSql);
/// <summary>
/// 根据主键获取模型
/// </summary>
/// <param name="key">主键</param>
/// <param name="selectSql">查询sql</param>
/// <returns></returns>
T GetByKey(string key, string selectSql);
/// <summary>
/// 获取所有数据
/// </summary>
/// <param name="selectAllSql">查询sql</param>
/// <returns></returns>
List<T> GetAll(string selectAllSql);
/// <summary>
/// 根据唯一主键验证数据是否存在
/// </summary>
/// <param name="id">主键</param>
/// <param name="selectSql">查询sql</param>
/// <returns>返回true存在,false不存在</returns>
bool IsExist(string id, string selectSql);
/// <summary>
/// dapper通用分页方法
/// </summary>
/// <typeparam name="T">泛型集合实体类</typeparam>
/// <param name="pageResultModel">分页模型</param>
/// <returns></returns>
PageResultModel<T> GetPageList<T>(PageResultModel pageResultModel);
}View 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 WHERERowNum >= {4} AND RowNum
页:
[1]