Asp.Net Zero轻量级审核流设计
复杂的业务系统中往往会集成工作流或审核流,但有些轻量及的业务系统对这些功能的需求并不大,有的系统甚至只需要审核功能就够了。这里给大家介绍在Asp.Net Zero中通用轻量及审核流设计,功能具备审核权限、修改权限、查看权限等。
通用的审核流是在业务表中添加审核字段来实现,审核字段如下:
/// <summary>
/// 单据状态
/// </summary>
public short State { get; set; }
系统中该字段统一为short类型,State定义在系统的枚举中:
public enum State
{
/// <summary>
/// 新单
/// </summary>
New=, /// <summary>
/// 已审核
/// </summary>
Checked=, /// <summary>
/// 作废
/// </summary>
Cancel=
}
审核权限、数据权限都应该根据该枚举判断。字段和枚举添加完成后开始为业务模块增加审核功能,普通的业务模块通常只需要CRUD接口,而需要审核和数据权限的业务模块应该添加审核和作废接口。
普通业务模块,档案、字典等模块应该具备的接口如下:
public interface IAreaManagerAppService: IApplicationService
{
Task DeleteArea(EntityDto<int> input); Task<PagedResultDto<CreateOrEditAreaInput>> GetAreas(GetAreaInput input); Task<CreateOrEditAreaInput> GetAreaForEdit(NullableIdDto<int> input); Task CreateOrUpdateArea(CreateOrEditAreaInput input); Task<ListResultDto<AreaDto>> GetAllAreaWithLevel();
}
包含审核、作废的模块接口:
public interface ISomeoneClassAppService: IApplicationService
{
Task CreateOrUpdate(CreateOrEditInput input); Task Delete(EntityDto<int> input); Task<PagedResultDto<Output>> Get(GetInput input); Task<CreateOrEditInput> GetForEdit(NullableIdDto<int> input); Task Check(int id); Task Cancel(int id);
}
审核需要分配角色权限,所以在审核接口的实现中应该加上权限标签:
[AbpAuthorize(AppPermissions.Pages_SomeoneModule_SomeoneClass_Check)]
public async Task Check(int id)
{
var master = await _MasterRepository.FirstOrDefaultAsync(id);
if (master.State == Convert.ToInt16(State.Checked))
{
throw new UserFriendlyException("单据已审核!");
}
if (master.State == Convert.ToInt16(State.Cancel))
{
throw new UserFriendlyException("单据已作废!");
}
master.State = Convert.ToInt16(State.Checked);
master.CheckerId = AbpSession.UserId.Value;
await _MasterRepository.UpdateAsync(master); var details = await _DetailRepository.GetAllListAsync(_ => _.PID == master.Id);
//do something
}
审核流显示效果,新增单据和没有权限时审核、作废功能应该禁用,也可以改为隐藏
已审核的单据在分配权限的情况下应该具备查看、删除、作废操作
未审核的单据在分配权限的情况下应该具备编辑、删除、审核
实现如下:
在新增修改组件按钮组中加入审核按钮
<button type="button" class="btn btn-warning" (click)="check(data.id)"
[disabled]="data.State!=1"><i class="fa fa-check"></i>审核</button>
<button type="button" class="btn btn-danger" (click)="cancel(data.id)"
[disabled]="data.State!=2"><i class="fa fa-ban"></i>作废</button>
在父组件table中加入操作:
<a href="javascript:;" *ngIf="!record.isStatic && permission.isGranted('Pages.SomeoneModule.Class.Check') && record.State==1" (click)="check(record)">
审核
</a>
<a href="javascript:;" *ngIf="!record.isStatic && permission.isGranted('Pages.SomeoneModele.Class.Cancel') && record.State==2" (click)="cancel(record)">
作废
</a>
总结:到这里Asp.Net Zero通用审核流设计方式已经结束完毕,审核流在业务系统中也是比较复杂的设计,所以这里给大家提供的是设计思路,详细的业务代码还是要看实际需求。希望大家看完有所启发,如果有不太明白的可以在下方留言,我会详细解答。
Asp.Net Zero轻量级审核流设计的更多相关文章
- 审核流(2)流程设计-SNF.WorkFlow功能使用说明--SNF快速开发平台3.1
流程设计 图形化的流程设计,更方便.直观 1.打开“流程设计“程序,如上.点击”新建“如下: 2.红色部分为必填项,审批对象是选择要审批的程序菜单,单据名称是在审核流流转时用于提示的单据名称,还要选择 ...
- 审核流(3)低调奢华,简单不凡,实例演示-SNF.WorkFlow--SNF快速开发平台3.1
下面我们就从什么都没有,结合审核流进行演示实例.从无到有如何快速完美的实现,然而如此简单.低调而奢华,简单而不凡. 从只有数据表通过SNF.CodeGenerator代码生成器快速生成单据并与审核流进 ...
- 审核流(1)SNF.WorkFlow审核流简介--SNF快速开发平台3.1
本项目是的在Spring.Net.Framework 平台之上进行研发.SNF.WorkFlow审核流是一款完全自主知识产权研发的为软件项目. 审核流基本概念:什么是审核流? 审核流:两个或两个以上的 ...
- 连表查询都用Left Join吧 以Windows服务方式运行.NET Core程序 HTTP和HTTPS的区别 ASP.NET SignalR介绍 asp.net—WebApi跨域 asp.net—自定义轻量级ORM C#之23中设计模式
连表查询都用Left Join吧 最近看同事的代码,SQL连表查询的时候很多时候用的是Inner Join,而我觉得对我们的业务而言,99.9%都应该使用Left Join(还有0.1%我不知道在 ...
- 如何利用redis来进行分布式集群系统的限流设计
在很多高并发请求的情况下,我们经常需要对系统进行限流,而且需要对应用集群进行全局的限流,那么我们如何类实现呢. 我们可以利用redis的缓存来进行实现,并且结合mysql数据库一起,先来看一个流程图. ...
- 通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[上篇]
<200行代码,7个对象--让你了解ASP.NET Core框架的本质>让很多读者对ASP.NET Core管道有了真实的了解.在过去很长一段时间中,有很多人私信给我:能否按照相同的方式分 ...
- ASP.NET 系列:RBAC权限设计
权限系统的组成通常包括RBAC模型.权限验证.权限管理以及界面访问控制.现有的一些权限系统分析通常存在以下问题: (1)没有权限的设计思路 认为所有系统都可以使用一套基于Table设计的权限系统.事实 ...
- Knockout.js, Asp.Net MVC and Bootstrap 前端设计
原文地址:http://ddmvc4.codeplex.com/ 原文名称:Design and Develop a website using ASP.NET MVC 4, EF, Knockout ...
- [Asp.Net Core轻量级Aop解决方案]AspectCore Project 介绍
AspectCore Project 介绍 什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect- ...
随机推荐
- ajax将数组或list集合传到后台 的 【坑】
代码如下 function deleteChecked() { var orderNosList = new Array(); var rows = $("#dataGrid"). ...
- UniEAP UTF 用户手册 (引擎)
目录 第1章 概述 5 1.1 术语解释 5 第2章 测试文件组织 6 2.1 测试执行文件详解 7 2.1.1 参数配置 7 2.1.2 测试报告配置 9 2.1.3 浏览器类型配置 9 2.1.4 ...
- DevOps - DevOps工具链
不要满足于使用世界上已存在的各种方法和技术,而应重点放在希望达到的效果上! 单单使用工具不难,困难的是在团队开发中熟练使用,并形成一套理想的工作流程,只有在团队中工具和思想才能发挥最大价值. 开源工具 ...
- mybatis resultMap 子元素
resultMap constructor - 类在实例化时,用来注入结果到构造方法中 idArg - ID 参数;标记结果作为 ID 可以帮助提高整体效能 arg - 注入到构造方法的一个普通结果 ...
- 【AMAD】django-cities -- 为Django项目提供国家,城市数据
动机 简介 个人评分 动机 有时候看一些数据库设计,国家数据会存在一个单独的表里面.这种方式读取数据库无疑又要加上一层join,很不划算. 简介 [django-cities]1可用为你提供国家和城市 ...
- Nginx反向代理,Nginx的TCP/UDP调度器以及Nginx常见问题处理
nginx反向代理: 方案 使用4台RHEL7虚拟机,其中一台作为Nginx代理服务器,该服务器需要配置两块网卡,IP地址分别为192.168.4.5和192.168.2.5,两台Web服务器IP地址 ...
- Int8,Int16,Int32,Int64 有啥不同呢?看了立马就懂!
大家有没有写了很久代码,还不知道这个Int8,Int16, Int32, Int64有什么区别呢?或者是为什么后面的数字不一样呢? 初步了解了一下,才清楚这个东西. 先来扫盲一下计算机存储单元, 在计 ...
- 【VS开发】recv函数函数返回值说明(特别有利于工程调试)
recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据. ...
- 【VS开发】【DSP开发】如何使用WinDriver为PCIe采集卡装驱动
如何使用WinDriver为PCIe采集卡装驱动 第一步:使用WinDriver生成驱动 1.运行Drier Wizard 2.点击New host driverproject 3.在列表中,选择待安 ...
- day32 网络编程之粘包问题
1.最大半连接数 什么是最大半连接数 半连接:在进行TCP协议通信时,客户端与服务器端进行三次握手建立连接,但是有时客户端与服务器端进行了连接申请,服务器端也同意了申请(既已经完成三次握手的两次),此 ...