“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系统经验总结的更多相关文章

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

    不论什么系统都离不开权限的管理,有一个好的权限管理模块,不仅使我们的系统操作自如,管理方便,也为系统加入亮点. l         不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是 ...

  2. OA系统权限管理设计方案【转】

    l 不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是最基本的功能. l 可以对“组”进行权限分配.对于一个大企业的业务系统来说,如果要求管理员为其下员工逐一分配系统操作权限的话,是 ...

  3. OA系统权限管理设计方案

    (转)OA系统权限管理设计方案 OA系统权限管理设计方案     不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是最基本的功能.     可以对“组”进行权限分配.对于一个大企业的 ...

  4. 以WCF安全认证方式调用通用权限管理系统获取基础信息资料

    在B/S开发中,涉及到获取系统基础资料的问题,因为是在不同平台下的开发,采用了WCF方式获取. 下面是一个调用通用权限管理系统(吉日嘎拉)基础信息资料的一个demo供参考 调用原理图: web.con ...

  5. ABP+AdminLTE+Bootstrap Table权限管理系统第二节--在ABP的基础做数据库脚本处理

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 第一点,上一篇文章中我们讲到codefirst中一些问题包括如图,codefirst在每次执行命令的时候会生成新的 ...

  6. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十四节--后台工作者HangFire与ABP框架Abp.Hangfire及扩展

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于 ...

  7. OA系统从选型到实施完整攻略

    本文结合一线IT人士分享OA实施经验,单纯地讲述OA的选型与实施,为相关经验较少的IT人士提供真正的帮助. 一.如何选择OA系统 说起OA选型,稳定性.易用性.灵活性.成本和服务少不了.但是,只了解这 ...

  8. .NET Core/.NET5/.NET6 开源项目汇总5:权限管理系统项目

    系列目录     [已更新最新开发文章,点击查看详细] 企业管理系统一般包含后台管理UI.组织机构管理.权限管理.日志.数据访问.表单.工作流等常用必备功能.下面收集的几款优秀开源的管理系统,值得大家 ...

  9. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

随机推荐

  1. 极光推送和百度lbs android sdk一起使用使用proguard 混淆的问题

    主要是http得类被混淆后,导致apk定位失败.经过确认,保留apache 的http类就好了 # To enable ProGuard in your project, edit project.p ...

  2. 二叉堆(binary heap)

    堆(heap) 亦被称为:优先队列(priority queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因 ...

  3. CSS 子选择器(六)

    一.子选择器 子选择器中前后部分之间用一个大于号隔开,前后两部分选择符在结构上属于父子关系. 子选择器是根据左侧选择符指定的父元素,然后在该父元素下寻找匹配右侧选择符的子元素. 二.简单例子 < ...

  4. iOS--开发之手势解锁

    本文主要介绍通过手势识别实现手势解锁功能,这个方法被广泛用于手机解锁,密码验证,快捷支付等功能实现.事例效果如下所示. 首先,我们先分析功能的实现过程,首先我们需要先看大致的实现过程: 1.加载九宫格 ...

  5. Masonry介绍与使用实践(快速上手Autolayout)

    MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时代 win ...

  6. android 短信助手demo

    关于意图Intent: 显式意图:必须指定要激活的组件的完整包名和类名(应用程序之间耦合在一起) 一般激活自己应用的组件的时候采用显式意图 隐式意图:只需要指定动作和数据就可以(好处是应用程序之间没有 ...

  7. CocoaPods的使用(图文并茂)OS X 10.11 系统

    系统:OS X EI Capitan 版本:10.11.2 开发工具:XCode:7.2 要使用CocoaPods,那么就需要先安装哦,你安装了么?如果没安装那就请阅读我的前篇<OS X 10. ...

  8. IOS中文版资源库

    Swift 语言写成的项目会被标记为  ★ ,AppleWatch 的项目则会被标记为 ▲. [转自]https://github.com/jobbole/awesome-ios-cn#librari ...

  9. Swift字符与字符串

    学习来自<极客学院:Swift中的字符串和集合> 工具:Xcode6.4 直接上基础的示例代码,多敲多体会就会有收获:百看不如一敲,一敲就会 import Foundation /**** ...

  10. iOS证书失效

    iOS证书突然失效 今早上班打包直接报错,错误如图 根据错误信息到“钥匙串”里面看了一下证书,证书都莫名其妙的失效了,昨天还是好好的. 重新去钥匙串从证颁发中心获取证书,然后登陆开发者账号重新申请证书 ...