“PMS-基础权限管理系统”实施某谱OA系统经验总结

“PMS-基础权限管理系统”介绍

"PMS-基础权限管理系统"是我一直想做的一个产品,融合多年开发及维护管理系统的经验,参考了很多系统,精心研制而成。

可以做为毕业设计参考,新手学习或基础开发平台,适合大中型系统开发,内置功能强大的数据访问组件,独立的缓存,日志,配置管理及邮件发送等企业开发方案。

2013.07.05

主要使用的技术和工具:

MVC3

jquery

jquery easyui

SQL Server 2005+

方案架构图

2013.07.10

OA系统项目结构截图及说明:

Abs.Framework::基础类库,包括数据访问(支持多种数据库),邮件发送,缓存,异常处理,日志及常用帮助类。

XX.OPMS.BizProcess:业务逻辑层,主要调用数据访问层完成数据持久化及逻辑运算。

XX.OPMS.Configuration: 配置层,主要存放项目中的SQL脚本配置文件,邮件模板及Key-Value配置。

XX.OPMS.DataAccess:数据访问层,使用基础类库封装的数据访问方法与数据库交互。

XX.OPMS.Enum:枚举层,项目中使用到的枚举统一放在这里,以方便管理。

XX.OPMS.Entity:模型层,项目中创建到的业务模型统一放在这里,以方便管理。

XX.OPMS.Jobs:定时作业,项目中需要定时处理业务数据的任务。

XX.OPMS.WebUI:表现层,项目的界面实现。

2013.07.13

如何使用Enum,KeyValuePair及其适用的场景

1. 什么时候使用Enum

如果子项目稳定,不经常变化(相对较少),并且一般会参与逻辑运算(比如根据用户类别做不同的权限限制)应该使用Enum,比如用户性别

参见:XX.OPMS.Enum\SysMgmt\Sex.cs

使用方法

如果要在列表起始位置增加全部,使用

EnumHelper.GetEnumList(typeof(RiskLevel) ,AppendType.All);

如果要在列表起始位置增加请选择,使用EnumHelper.GetEnumList(typeof(RiskLevel),AppendType.Select);

如果要在列表起始位置增加自定义项,使用EnumHelper.GetEnumList(typeof(RiskLevel),"key","value");

详细实现请详读框架源代码Framework\EnumUtil\EnumHelper.cs

2. 什么时候使用KeyValuePair

如果子项目不稳定,变化相对较多(比如过一段时间要增加几个子项目)应该使用KeyValuePair配置,比如国籍

参见:ABS.OPMS.Configuration\Configs\KeyValuePair.xml

使用方法

如果要在列表起始位置增加全部,使用ConfigManager.GetKeyValuePair("CompanyNature",AppendType.All);

如果要在列表起始位置增加请选择,使用ConfigManager.GetKeyValuePair("CompanyNature",AppendType.Select);

如果要在列表起始位置增加自定义项,使用ConfigManager.GetKeyValuePair("CompanyNature","key","value");

ConfigManager.GetKeyValuePair方法说明:从配置文件Configs\KeyValuePair*.xml读取KeyValuePair,为了防止在源代码管理器中多人编辑冲突,可以按模块或其它方式分多个文件,

比如KeyValuePair.xml,KeyValuePair_SysMgmt.xml等,文件名必须以KeyValuePair开头,以.xml结尾

详细实现请详读框架源代码Framework\Config\ConfigManager.cs

2013.07.17

如何使用动态查询

1.带服务器端分页的动态查询

以商品查询为例:

1.1定义sql模板,其中#StrWhere#是点位符,在程序中动态添加条件后会生成where语句替换掉此点位符

<dataCommand name="Product.Query" database="AuthMgmt">

<commandText>

SELECT @TotalCount=COUNT(1) FROM [dbo].[Product] WITH(NOLOCK)

#StrWhere#

;WITH CTE_Paging

AS

(

SELECT [SysNo]

,[ProductID]

,ROW_NUMBER() OVER(#OrderBy#) AS RowID

FROM [dbo].[Product] WITH(NOLOCK)

#StrWhere#

)

SELECT [SysNo]

,[ProductID]

FROM CTE_Paging

WHERE RowID BETWEEN @StartRowID and @EndRowID

</commandText>

<orderFields>

<field name="SysNo" />

</orderFields>

</dataCommand>

1.2 根据需求定义查询条件,由于需要分页,因此要继承自PagingQuery,一般需要将值类型查询条件设置成可空类型,因为一般业务需求是条件值为空就不参于查询,因此如果值为空就不会添加这个条件。

public class ProductQuery : PagingQuery

{

public int? SysNo { get; set; }

public string Keywords { get; set; }

public int? MfSysNo { get; set; }

public int? CatalogSysNo { get; set; }

}

1.3在程序中动态添加各查询条件,由于需要分页,因此需要使用PagingSqlConditionBuilder

public QueryResult<Product> Query(ProductQuery q)

{

DataCommand cmd = DataCommandManager.GetDataCommand("Product.Query");

string defaultOrderBy = "SysNo DESC";

PagingSqlConditionBuilder sb = new PagingSqlConditionBuilder(cmd, q, defaultOrderBy);

sb.AddCondition(SqlRelation.AND, "SysNo", SqlOperator.Equal, "@SysNo", DbType.Int32, q.SysNo);

sb.AddCondition(SqlRelation.AND, "MfSysNo", SqlOperator.Equal, "@MfSysNo", DbType.Int32, q.MfSysNo);

if (q.CatalogSysNo > 0)

{

sb.AddCondition(SqlRelation.AND, "CatalogSysNo", SqlOperator.Equal, "@CatalogSysNo", DbType.Int32, q.CatalogSysNo);

}

if (!StringHelper.IsNullOrEmpty(q.Keywords))

{

sb.AddLeftBracketCondition(SqlRelation.AND);

sb.AddCondition(SqlRelation.OR, "ProductName", SqlOperator.Like, "@ProductName", DbType.String, q.Keywords);

sb.AddCondition(SqlRelation.OR, "ProductID", SqlOperator.Like, "@ProductID", DbType.String, q.Keywords);

sb.AddCondition(SqlRelation.OR, "Keywords", SqlOperator.Like, "@Keywords", DbType.String, q.Keywords);

sb.AddRightBracketCondition(SqlRelation.AND);

}

sb.BuildSql();

var result = new QueryResult<Product>();

result.rows = cmd.ExecuteEntityList<Product>();

result.total = sb.GetTotalCount();

return result;

}

语句sb.BuildSql();会将上面添加的查询条件生成where语句,然后替换点位符#StrWhere#

具体实现请参考框架源代码

2.不需要服务器端分页的动态查询

2.1定义sql查询

<!--获取所有菜单数据-->

<dataCommand name="SysMenu.Query" database="AuthMgmt">

<commandText>

SELECT [SysNo]

,[MenuType]

,[MenuName]

,[Description]

,[Key]

,[Url]

,[IsShow]

,[DisplayOrder]

,[ParentSysNo]

,Icon

FROM [dbo].[SysMenu]

#StrWhere#

ORDER BY [ParentSysNo],[DisplayOrder]

</commandText>

</dataCommand>

2.2根据需求定义查询条件,不需要分页,就不需要继承自PagingQuery

public class SysMenuQuery

{

public string MenuType { get; set; }

public string MenuName { get; set; }

public string IsShow { get; set; }

public int? ParentSysNo { get; set; }

}

2.3在程序中动态添加各查询条件,不需要分页就直接使用SqlConditionBuilder

public List<SysMenu> Query(SysMenuQuery q)

{

DataCommand cmd = DataCommandManager.GetDataCommand("SysMenu.Query");

SqlConditionBuilder sb = new SqlConditionBuilder(cmd);

sb.AddCondition(SqlRelation.AND, "ParentSysNo", SqlOperator.Equal, "@ParentSysNo", DbType.Int32, q.ParentSysNo);

sb.BuildSql();

return cmd.ExecuteEntityList<SysMenu>();

}

3. 可以查看下PagingSqlConditionBuilder以及SqlConditionBuilder的实现,以了解其用法。

“PMS-基础权限管理系统”实施某谱OA系统经验总结

时间: 2024-10-13 00:45:34

“PMS-基础权限管理系统”实施某谱OA系统经验总结的相关文章

OA系统权限管理设计(转载)

不论什么系统都离不开权限的管理,有一个好的权限管理模块,不仅使我们的系统操作自如,管理方便,也为系统加入亮点. l         不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是最主要的功能. l         能够对"组"进行权限分配.对于一个大企业的业务系统来说,假设要求管理员为其下员工逐一分配系统操作权限的话,是件耗时且不够方便的事情.所以,系统中就提出了对"组"进行操作的概念,将权限一致的人员编入同一组,然后对该组进行权限分配. l 

OA系统权限管理设计方案

(转)OA系统权限管理设计方案 OA系统权限管理设计方案     不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是最基本的功能.     可以对“组”进行权限分配.对于一个大企业的业务系统来说,如果要求管理员为其下员工逐一分配系统操作权限的话,是件耗时且不够方便的事情.所以,系统中就提出了对“组”进行操作的概念,将权限一致的人员编入同一组,然后对该组进行权限分配.    权限管理系统应该是可扩展的.它应该可以加入到任何带有权限管理功能的系统中.就像是组件一样的可以被不断的重用

泛微OA系统产品故障知识管理,助力制造业把关生产质量

减少产品在设计.制造.安装过程中的故障率,做好自检.维修工作是制造业保障产品质量的重要途径之一- 泛微OA系统通过把产品在设计.制造.安装过程中发生的典型故障.处理过程.诊断数据保存到OA系统,为制造业打造特色"产品故障知识库",让产品生产过程中能快速检索查阅问题.避免同类故障重复发生.提高故障诊断效率. 一.产品故障知识管理系统方案应用亮点 OA系统在流程的串联作用下,将各类故障问题和专家知识库相连接,在问题一对一解决的过程中,收集故障信息,形成分类清.方案全.信息高效共享的故障管理

【知道创宇404实验室】致远OA系统远程任意代码执行高危安全漏洞预警

今日(2019年6月26日),互联网上有安全研究者预警并发布了关于致远OA系统的高危安全漏洞,***者可以通过某接口漏洞在未授权的情况下实现远程任意代码执行,最终控制整个系统权限.据悉致远OA系统是由用友致远互联旗下协同管理软件系统,在国内很多央企.大型公司都有广泛应用. 知道创宇404实验室立即启动漏洞应急流程,确定该漏洞存在致远OA系统某些型号及版本中某Servlet接口缺少必要的安全过滤,最终允许***者远程执行任意代码,并且该接口无需认证即可访问,危害巨大. 通过知道创宇旗下ZoomEy

零基础到CS开发高手通用权限管理系统全程实录

零基础到CS开发高手通用权限管理系统全程实录(Devexpress.FastReport.NET.WebService.智能客户端)课程讲师:闲筝课程分类:.NET框架适合人群:中级课时数量:70课时更新程度:80%用到技术:Devexpress.FastReport.NET.WebService.智能客户端涉及项目:通权系统.智能客户端.报表设计器咨询qq:1840215592 详细介绍:http://www.ibeifeng.com/goods-493.html项目主要功能模块:闲筝老师的.

通用OA+权限管理系统源码 联系QQ:847129860

通用OA+权限管理系统源码 功能介绍:    1.本程序分为系统后台管理,内网,论坛,外网,外网后台管理    2.开发工具为VS2010,MVC4(razor视图引擎),数据访问为EntityFramework4.4,数据库为sql server 2008,UI插件为jquery-easyui-1.3.0,编辑器为kindeditor,上传文件为uploadify,表格插件Flexigrid,相册插件为lightbox    3.工程分为:CommWeb,Core,DAL,Entity,Too

XMwoods通用版权限管理系统 .net 联系QQ:847129860

XMwoods通用版权限管理系统 主要功能有:权限管理.角色管理.部门管理.用户管理.公司管理.模块管理.系统设置.一. 权限管理以关键字(Key)的方式来定义系统的权限,使系统权限分配更加贴合企业需求.提供给开发人员使用,权限的控制需要与系统功能的实现挂接.● 权限管理界面,可以进行系统权限的定义操作.● 用户权限管理,对用户权限进行自定义设置,也可以继承其他用户.角色 等权限.● 角色权限管理,对角色权限进行自定义设置,也可以继承其他角色 等权限.二.角色管理系统实现了内部员工户角色的统一管

Asp.Net Core 项目实战之权限管理系统(7) 组织机构、角色、用户权限

0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计 3 Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL 4 Asp.Net Core 项目实战之权限管理系统(4) 依赖注入.仓储.服务的多项目分层实现 5 Asp.Net Core 项目实

权限管理系统 Spring-authority

是由 spring+springmvc+hibernate+spring-security +easyui +boostrap 写的一个框架集合,目前实现了一个基础的权限管理系统,权限是基于细粒度的过滤,对于初学权限设计的人来说也算是个最简洁的权限实现,基于它来做项目,它只是做了一些绝大部分项目都应该做的一些基础功能. 1参考资料 http://blog.csdn.net/k10509806/article/details/6369131 http://www.cnblogs.com/wenxi