sunpander 2015-04-09T07:27:13+00:00 sunpander@163.com Devextream学习2 2015-03-08T00:00:00+00:00 sunpander http://sunpander.github.io//2015/03/DevExtream学习2 Application Project http://js.devexpress.com/Documentation/Howto/SPA_Framework/Application_Project/?version=14_2

应用程序项目(Application Project)

使用DevExtream框架开发的应用程序,是单页面应用程序(SPA),以下页面代码示例(包含2个视图)

HTML
<!DOCTYPE html>

</html>

--
是可以把所有内容放入一个页面,但再实际项目中很难维护这样的页面.你可以将js代码,html标签,css标签放入独立的文件,为了简化开发,我们建议你使用devExtream提供的项目模板,包含以下内容.

•css - 子文件夹,包含所支持设备的样式

•js - 子文件夹,包含必须的js库

•layouts - 子文件夹,包含预定义的布局(常在移动程序中使用)

•views - 子文件夹,包含视图文件;

•index.js - 主页js,创建和配置html应用程序对象(HTMLApplication object)

•index.html - 主页html,包含所有引用资源的程序页面.

•index.css - 主页样式,包含应用程序定义的css样式

这样的项目模板时可以直接使用的,它包含简单的视图,并包含所有需使用的资源,你可以在以下位置找到这个模板

•如果是单独产品,在zip压缩文件中的template下的knockout文件夹中.

•如果是所有产品,集成到了vs的项目模板中.

阅读以下内容,学习一个devexteam项目的组成部分
应用程序页面(Application Page)

与项目模板匹配的,一个应用程序页面只包含必须的资源,如下所示:

HTML <!DOCTYPE html> //Here is the div to which the application's views are rendered

正如以上代码所示,页面的主体(body)包含一个使用的dx-viewport样式的div对象.这个对象被用来插入一个视图,可以有很多视图,当将view port替换为视图的时候,这个单页面程序被转换成一个多屏幕的应用程序

脚本(Scripts)
当开发一个devExteme项目时,以下库必须在主页中被引用.
•jQuery version 2.0.1+
•Knockout version 2.2.3+
•globalize
•PhoneJS/WebAppJS

注意: 按以上顺序引入相应的库文件

有两种提供引用连接的方式.
使用本地脚本(Use Local Scripts)
你可以下载这些文件,将他们放入你的项目中,然后提供本地的连接
HTML

在项目模板中,所有的引用脚本都是放在js文件夹下,使用的本地脚本.
使用在线连接(Use a CDN)
当使用Content Delivery Network (CDN),可以提高你程序的性能,

HTML

另外也可以使用以下方式.

HTML

主体和样式

为了使你的应用程序在不同设备上本地化,必须提供相应的主题.devexteam包含一系列针对不同设备的主题,常用的light和dark主题是可用的,这些主题不针对特殊的设备,但在不同设备上看起来都还可以,在添加产品脚本链接之前添加所需的主题链接.

HTML
这些文件在你的devexteme包中是可用的.
dx.common.css文件和dx.spa.css文件包含应用程序所需的样式,跟所运行的设备无关.
想学习预定义的主题和样式,阅读相应的文章.

除了预定义样式外,你可能还需要定义项目所需的样式,这些样式可以在app.css文件中定义,这个文件需要在项目主页中被引用.

HTML

The app.css file and the predefined themes are added to the application template project and referenced in the application page.

Application Object

To configure the application and control its life cycle, an HtmlApplication object must be created using the document.ready event or the jQuery "$()" function. There should be an index.js file within the application project. The HTMLApplication object should be created in this file.

JavaScript window.MyApp = {}; MyApp.$(function() { MyApp.app = new DevExpress.framework.html.HtmlApplication({ namespace: MyApp }); });

The parameter of the HTMLApplication's constructor is a configuration object that is used to set up application options.

Using the HTMLApplication object, register a routing rule for the application, and navigate to the starting view.

JavaScript $(function() { MyApp.app = new DevExpress.framework.html.HtmlApplication({ //... }); MyApp.app.router.register(":view", { view: "home"}); MyApp.app.navigate(); });

The index.js file must be linked in the application page.

The application template project includes this file and has a reference to it within the application page.

Layouts

According to the framework's Views and Layouts concept, a screen is a combination of view and layout markup. Each screen has a common element such as a navigation bar or a toolbar. These elements are added to the layout markup, which is then applied to each displayed view. Since several different layouts can be used in an application, a layout set should be specified as an array assigned to the layoutSet configuration option of the application object. The framework comes with ready-to-use layout sets that are based on predefined layouts.

JavaScript window.MyApp = {}; MyApp.$(function() { MyApp.app = new DevExpress.framework.html.HtmlApplication({ namespace: MyApp,
layoutSet: DevExpress.framework.html.layoutSets['navbar'], navigation: [ { title: "Home", onExecute: "#home", icon: "home" }, { title: "About", onExecute: "#about", icon: "info" } ] }); });

In the code above, the navigation option is specified. The array assigned to this option will be used by the 'navbar' predefined layout to create navigation items on the navbar widget.

The predefined layouts that are used in the speciified layout set should be contained in the application and referenced in the application page.

HTML

The application template project includes a folder with all the predefined layouts. The 'navbar' layout set is specified for the application, and the corresponding layouts are referenced in the application page.

All the layouts are available for you within the your DevExtreme package.

To learn more about view and layout concepts, refer to the Views and Layouts article.

To learn about layout sets and predefined layouts, refer to the Built-in Layouts article.

视图(Views)

视图定义了组成视图模板的html标签的一部分.为了定制化样式和体验(look and feel)视图模板可选择包含js脚本以及相关联的样式.视图模板中js脚本和样式需要在不同的文件中实现,所以一个视图将包含以下文件.
•viewName.html(以视图名称命名的html)
•viewName.js(以视图名称命名的js)
•viewName.css(以视图名称命名的css)

将这些文件放置在项目的views文件夹下,在主页面中引用这些文件.

<!-- HTML --><link rel="stylesheet" type="text/css" href="views/home.css" />
<script type="text/javascript" src="views/home.js"></script>
<link rel="dx-template" type="text/html" href="views/home.html"/>
<link rel="dx-template" type="text/html" href="views/about.html"/>

应用程序模板项目所包含的视图文件夹下已包含三个简单的视图文件,这些文件在项目中被引用.

学习更过有关 视图的内容,阅读视图和布局相关的文章.

]]>
工作周报 2015-02-09T00:00:00+00:00 sunpander http://sunpander.github.io//2015/02/工作周报 遗留问题(待解决,不紧急)
  1. java端框架性能测试.[功能完善]
  2. 任务管理UI优化.(从用户角度,分解多个简单操作的画面)
  3. 报表控件spreedsheetgear在保存excel文件时,使用openxml 格式,java 无法正常读取.
  4. bfr报表数据源管理BS实现(雏形已完成).数据项BS实现
  5. combox下拉grid的控件,带模糊搜索,分页
  6. 要把后台方法能统一管理起来,有一个可维护的列表,以类似api查询一样存在;目前是前后台分离,后台以类似plat4C平台的C++端一样存在.固定输入输出参数格式,画面展现,跳转都在前台完成.后台方法,主要是依靠方法名来区分含义,需求变更的过程中,会有很多地方依据不同传入参数做不同处理,时间久了很难定位.很难描述清楚各个方法的作用.
  7. 管理后台假死,刷新页面后才可使用(后台才用js的mvc方式,只有一个页面,在页面操作过程中js如果出错,单独重新打开画面不会重新加载js,需要f5刷新整个页面才行..)
  8. socialcalc开源js端报表控件实例,使用
  9. webservice提供单点登录.(通常的单点登录是指公用 用户信息表,在登陆成功后,调用一下webservice记录下登陆用户信息,返回一个token,下一个系统会也调用webservice,根据token查询用户是否已登陆.)

2月

讨论,学习

  1. 例会,讨论工程需求,以及问题进展.讨论报表参数控件自定义..
  2. 报表cs端功能转bs(-分报表,报表目录,维度,数据源,数据项,参数-),java框架优化,功能完善

    bug处理

  3. 工程测试遇到问题的解决
  4. 37.120数据库更新,java端war包发布到120上
  5. .net端auth独立测试时,使用rpds需要自己加载BFRAPP.XML

    功能优化

  6. 客户端数据连接维护以及数据源维护在java端的实现(80%雏形已完成.具体细节待使用时再完善)
  7. 任务维护页面慢的问题(将一些加载项放在,点击下一步的时候)

    下周计划

  8. 工程问题继续修改.(在java端添加报表目录树维护的画面)
  9. 报表.数据项的查询,维护.
]]>
测试目录1 2015-02-02T00:00:00+00:00 sunpander http://sunpander.github.io//2015/02/test1

没有金刚钻,就别揽瓷器活

本文针对那些对自己写软件有想法的攻城狮们。


引子

一开始认为接个软件项目做做很简单的事情。
先问自己开发过商业软件吗,做的软件有真正卖出去过吗?(是接受市场考验过的卖出去,而不是强推模式的不得不用)


入门级

]]>
测试目录2 2015-02-01T00:00:00+00:00 sunpander http://sunpander.github.io//2015/02/test2

没有金刚钻,就别揽瓷器活

本文针对那些对自己写软件有想法的攻城狮们。


引子

一开始认为接个软件项目做做很简单的事情。
先问自己开发过商业软件吗,做的软件有真正卖出去过吗?(是接受市场考验过的卖出去,而不是强推模式的不得不用)


入门级

]]>
测试目录1 2015-02-01T00:00:00+00:00 sunpander http://sunpander.github.io//2015/02/test1

没有金刚钻,就别揽瓷器活

本文针对那些对自己写软件有想法的攻城狮们。


引子

一开始认为接个软件项目做做很简单的事情。
先问自己开发过商业软件吗,做的软件有真正卖出去过吗?(是接受市场考验过的卖出去,而不是强推模式的不得不用)


入门级

]]>
工作周报--15年1月 2015-01-23T00:00:00+00:00 sunpander http://sunpander.github.io//2015/01/工作周报 遗留问题(待解决,不紧急)
  1. java端框架性能测试.[功能完善]
  2. 任务管理UI优化.(从用户角度,分解多个简单操作的画面)
  3. 报表控件spreedsheetgear在保存excel文件时,使用openxml 格式,java 无法正常读取.
  4. bfr报表数据源管理BS实现.
  5. combox下拉grid的控件,带模糊搜索,分页
  6. 要把后台方法能统一管理起来,有一个可维护的列表,以类似api查询一样存在;目前是前后台分离,后台以类似plat4C平台的C++端一样存在.固定输入输出参数格式,画面展现,跳转都在前台完成.后台方法,主要是依靠方法名来区分含义,需求变更的过程中,会有很多地方依据不同传入参数做不同处理,时间久了很难定位.很难描述清楚各个方法的作用.
  7. 管理后台假死,刷新页面后才可使用(后台才用js的mvc方式,只有一个页面,在页面操作过程中js如果出错,单独重新打开画面不会重新加载js,需要f5刷新整个页面才行..)
  8. socialcalc开源js端报表控件实例,使用
  9. webservice提供单点登录.(通常的单点登录是指公用 用户信息表,在登陆成功后,调用一下webservice记录下登陆用户信息,返回一个token,下一个系统会也调用webservice,根据token查询用户是否已登陆.)

1月

讨论,学习

  1. 例会,讨论工程需求,以及问题进展...
  2. 报表cs端功能转bs,java框架优化,功能完善
  3. bug处理

功能优化

  1. 工程测试遇到问题的解决
  2. .net端权限模块(暂时先提供查询的功能,查询登陆,查询报表,目录权限).包括根据目录查报表信息.与移动端联合调试.
  3. java框架提供多数据源的功能(仿JFinal多数据源功能)
  4. 使用仿JFinal的多数据源实现客户端 多数据源查询的bs端实现.

    下周计划

  5. 工程问题继续修改
  6. .net权限 与移动端结合验证
  7. java端多数据源功能实际应用(使用cs端数据源功能做验证)
]]>
分析现有报表 2015-01-13T00:00:00+00:00 sunpander http://sunpander.github.io//2015/01/需求分析实例[在线表单2_分析现有报表] 很惭愧,在报表组一年多了,却一直没有去好好分析下整个流程,常年累月的积累,代码量已经很大了,各种修修补补也看起来有一些困难.. 但为了实现在线表单,希望能从整个过程中得到一些启发,能够更好地实现在线表单的功能.. 花了接近一下午的时间,主要是分析下,报表渲染的过程.
1. 当添加一个报表后,就有了一个excel文件,以及一个xml文件.
2. excel主要存储样式,xml配合存储所用到的公式,数据源,渲染方式等. 3. 当设计好报表,预览的时候,首先是解析xml获取各个独立属性(将xml文件转换为内存的类对象),结合模板excel信息.知道了公式中的数据该对应哪些格子.
4. 根据公式中用到的数据源去查询结果,再根据公式中的配置做二次处理筛选.
5. 再根据公式类型,确定渲染规则,再结合公式中保存的单元格名称,将数据源信息设置到单元格上.
6. 然后再显示excel 7. 公式中用到的单元格名称,而非直接使用类似A1的坐标,理由是当插入删除行时,单元格名称不会变.

-- 如果想做,可以先做解析xml的. 也即通过cs客户端,做了简单的设计(比如用到了一个多记录公式,并已多记录类grid方式显示).
传递给你一个报表id.你获取到xml公式定义,进行解析,首先能得到数据源定义,并查询到真实数据..
就差解析excel文件,将数据源正确地显示..
ok???
了解了,这个过程,那么我要做的就是添加一个action,传入报表id,返回所定义的数据源数据..

ibfr

点击预览:
FormReportPreview 窗体属性 ReportObject 维护了一个ReportObject对象.很多报表所需要的属性都存在这个对象中. workbookView1 维护了一个spreatgear 报表控件
1. 重置图表位置 SetPictureNewPosition(); SetChartNewPosition(); 2. 传入报表id,构建FormReportPreview窗体 - 签入到主窗体中 (设置MdiParent属性) - 设置DatabaseCellList - 设置预览路径.(设置View_Report_Directory属性) - 报存文件到本地(调用workbookView1控件的save方法.报错的是存在服务端的xls模板文件) -调用,3,4更新服务器端的xml文件 --将xml文件保存在本地 3. 保存报表和用到的数据源之间的关系

  1. 保存公式.保证渲染方法一致 构建对象ReportObjManage,传入参数workbookView 和ReportObject 调用对象ReportObjManage的RepairRegionFormulaRelation 方法. -循环ReportObject内sheet,再循环sheet内page再循环page内的region,进行公式校验 --校验即循环ReportObject内的CellFormularItemList(是一个HashTable对象,key是单元格地址,value是FormulaOutParam对象) ------通过key找到区域range,通过value对象的FormulaName 到ReportObject中的ReportFormulaList 查找FormulaMultiBaseObj,如果能找到,则加到区域的FormulaObjList中.

然后调用ReportObject 的SaveFormula方法.保存公式(也即把公式对象转成xml保存到xml文件中) --先请空FormulaLinkRangeList 和 RangeLinkControlList 对象 --然后重新设置a.遍历CellFormularItemList获得value中的FormulaName.到FormulaDisplayObjList 查找FormulaDisplayObj 然后遍历该对象的LinkCellNameList.构建FormulaLinkRangeRelation.添加到FormulaLinkRangeList b.遍历CellDataItemExObjs...构建FormulaLinkRangeRelation.添加到RangeLinkControlList

--然后创建xml文件(调用CreateFormulaXML方法) xml中包含以下信息: 报表属性,报表公式列表,报表交叉表数据项关系列表,报表公式对应联动单元格列表,报表公式字段列对应联动单元格列表,报表单元格控件对应联动单元格列表, 填报单元格公式列表, 图表列表,组合公式,图片,----sheet列表,取数对象,报表校验,验证js,动态区域配置

5.准备show之前,调用了下PreviewReport 方法,成功则show -.具体获取数据源显示的过程全在previewReport里面完成的 --DisplayToUIEntrance 的PreviewReport 方法

  1. 提取报表文件:复制三个文件(包括模板xls,公式xml,和浏览的xls)
  2. 加载模版文件:使用spreadgear的方法,根据路径加载模板xls文件,得到IWorkbook对象[TempWorkbook]
  3. 加载公式文件:根据公式xml文件,构造ReportObj对象(重点在这里,读取报表属性,公式列表,单元格控件,显示值,图表等等)
    3.1 加载ReportObj报表属性(WorkbookPassword)
    3.2 加载ReportFormulaList报表公式列表属性(可能是FormulaBaseObj,FormulaCrosstabObj或FormulaGroupObj 对象,每个对象就是一个跟xml描述一样的类,将xml转换为类的属性值.不包含数据处理,只是xml转class
    3.3 加载ReportCrossDataItemList报表交叉表数据项关系列表,
    3.4 加载FormulaLinkRangeList报表公式对应联动单元格列表
    3.5 加载RangeLinkControlList报表单元格控件联动单元格列表 3.6 加载FormulaDisplayObjList公式显示对象 3.7 加载ReportChartObjCollection 图表
    3.8 加载CellFormularItemList 单元格对应公式列
    3.9 加载SheetObjList 报表sheet对象 3.10 加载FormulaSingleCollections对象 3.11 加载FormulaComposeCollection 3.12 加载FormulaMRefCollection 3.13 PictureObjCollection 3.14 FusionChartCollection 3.15 DatabaseCellCollection 3.16 ReportVerifyObj

  4. GetReportFormulaList 获取数据源详细信息包含输入,输出参数,sql语句等

  5. SetDataControlDropdownListDictionaries 如果用到控件,设置控件集合
  6. 开始计算值
  7. --DecryptWorkbooks解密,如果文件加密了,先解密
  8. --CalculateSingleFormulasPreview计算单值公式,(分析,计算,渲染)
  9. --CalculateMRefFormulasPreviewZ计算REF公式.
  10. --ReportFormulaCalculateMulti 计算多数据源公式(先分析用到的数据源,然后遍历执行,按公式定义再做二次处理,
  11. 开始渲染数据
  12. --使用spreadgear的方法,根据路径加载模板xls文件,得到IWorkbook对象[DisplayWorkbook]
  13. --解密文件
  14. --构造FormulaDisplayClass对象,执行DisplayMainSheet方法
  15. -----RegionDisplay(刷新excel公式,清空公式的原始内容,
]]>
框架之通用权限 2015-01-12T00:00:00+00:00 sunpander http://sunpander.github.io//2015/01/ExtNet框架之权限 先讨论下权限。

第一步:

经典的大家都知道的,基于角色的权限控制。通过以下表
资源表(标明项目内资源)
资源行为表(要被用来授权的客体)
权限表(记录资源行为和角色的关系表,存储行为id和角色id)
角色表(人员群组) 角色人员关系表(存储人员id,角色id,类型[管理员还是成员])
人员表(人员明细表)

比如画面是个资源,菜单是个资源,其他自定义的比如模块是个资源。然后对于画面可能有新增,修改,删除的行为,对菜单有浏览,模块有增删改等。。。

为了区分资源中的菜单,画面,模块等,添加类型列,同时新增一张表:资源类型表(标注资源的一个分类),再增一张表:资源类型默认行为表(标注某一分类的资源默认拥有的行为)。当新增一条某类型的资源时,同时会按 类型默认行为表新增 相应的资源行为信息。。。

根据需要,比如菜单拥有自己的菜单表,那只需要通过一个类似guid的菜单id字段关联菜单表 和资源表,保持同步。。

这样可满足常用的需求统一授权:开一个默认系统级角色:系统管理员,系统管理员的成员拥有类似administartor的权限,能够操作所有资源,用户,权限信息。
根据需要添加相应的角色组,然后把相关人员加到相关角色组,然后在权限表中存储角色组id,跟资源行为id即可。。。如现有角色组不满足,增加新的角色即可。 查询权限先查询用户所在的组,然后查询改组拥有的权限,合集即可..

第二步:

下放授权功能,为角色添加角色管理员,授权同时标注是否可再授权

为了下放授权功能,角色人员关系中添加一个类型列(标注是管理员还是成员),角色管理员可以操作角色.
1. 任何用户如果有角色维护页面权限,都可新建角色,当新建一个角色时,该用户默认为角色的管理员。该角色管理员可维护该角色。(包含修改角色,删除角色,维护角色管理员,维护角色成员,维护角色资源)。
2. 角色管理员可新增的对应角色的管理员或者成员.人员从系统成员中选择。 为了
3. 角色管理员,删除成员或者管理员,或者删除角色资源不受限制。

为了控制可授权的资源,在权限表中新增一列是否可再授权,当授权的时候同时可标注是否允许拥有该资源权限的人继续授给其他人
3. 角色管理员可新增的资源,为当前管理员自身所拥有的可授权的资源{在权限表有一个字段用来标注,相应权限是否可继续再授权}。

优点:很简单啦,大多数人稍讲解下都知道的。。。

不足:
1. 用户不限制,即每个管理员都可为角色新增 任何用户
2. 角色不分级,即所有角色是平等的,平铺开的,没有上下高低之分.
3. 角色不嵌套,即角色不设置父角色,比如。现有一个角色A,新增一个角色B归属于这个角色A,那么任何用户只要属于角色B,则同时拥有角色A和B的权限。不能嵌套,那么就需要把用户拉入A角色和B角色,或者把A所有资源拉入B角色。。
4. 资源不分组,比如现有一堆资源属于同一类,可将资源分组,然后可将改组授给多个角色。授一次即可,如果资源不分组,那表示需要将一堆资源分别多次拉入角色。或可通过先加入一个角色,然后复制新增该角色内资源到其他角色。

第三步:

授权的资源信息可通过是否再授权维护了,那么人员信息呢?考虑为添加人员管理员的概念
为了维护成员,限制角色管理员可管理的用户?(此处有个疑问,如果对可操作用户限制了,那么是不是如果角色管理员A不能管理用户B,不单新增角色用户时看不到B,而且不能将B从角色中删除??疑问?。{暂定可见就可删,谁让人家是角色管理员呢}。)

新增部门信息表。默认情况下每个用户都是归属于某一个部门的(或称组织机构)。。数据库初始化时,默认有一条不定部门 的记录,则当用户还不确定部门时可归属不定部门。部门设置部门管理员,部门管理员可管理该部门下的用户。

那么,角色管理员,通常同时是部门管理员,则可新增部门下的用户,如果角色管理员不是部门管理员,则不能新增角色用户。但能删除用户,或者维护资源.

优点:解决了角色管理员限制用户的目的。。比如一些顶级用户是不希望 其他的用户能够看到自己或者随便把自己加到 某些角色的。

缺点:虽把用户分开了,但资源不分级。。比如有些用户可操作的资源,只能是其他一些用户的子集。。

第四步:

添加分级授权的功能,比如给A授权的100个资源,那么A的下级只能授这100之内的,如果A的某一权限被收回,则下级默认全收回
为了分级,在权限表再增一个字段,授权主体类型。即除了为角色授权外,也可针对部门授权,但针对部门的授权,只用来做 分级授权使用,即子部门所能拥有的权限只能是父部门权限的子集。。

这样角色管理员,再新增角色资源时,他所拥有的可授权的资源。就不单来源于他所在的角色, 还有可能来自部门(当他是某一部门的管理员时,他就默认拥有了该部门的权限)。切记该部门的权限只用来授权使用,此处暂定不用来享有权限(也即,如果部门管理员没加入任何角色,则不拥有任何资源。只是当把他设为某一角色的管理员时,他可以为角色添加部门下的资源,以及挑选部门下的用户)

---优点:解决了资源分级,这样的话就可限制,某些角色管理员可见的资源。。比如,如果没有部门授权,那么当新增3个角色A,B,C并设置的相应 的角色管理员A1,B1,C1那么当A B C角色所能访问的资源有包含关系时,就需要再新建三角色来放置A1,B1,C1,这样A1,B1,C1就可访问不同资源。。相当于为角色管理员设置 角色管理员角色,来限制角色管理员可授权的资源。。

--=缺点:嵌套关系还没有

第五步:

考虑权限嵌套,类似角色套角色的功能 权限嵌套,可发生在部门,比如部门A下有个角色,那么部门A下的子部门AA1,如果在AA1内挂角色,那么该角色默认拥有父部门A的角色所有的权限。

这样就可实现嵌套,那就加一张部门角色表。。也即当新增一个角色时,可以指定角色的部门(0至多个)。。如果指定了部门,则只是为了做权限嵌套使用。同一个角色可指定多个部门 包含父子或者平级的部门。。

只有角色管理员才能把他所管理的角色添加到 他所管理的部门下,也即 操作用户需要即是部门管理员,且是角色管理员,才可拖拉角色到部门

优缺点:与单纯的角色套角色比,有何优缺点,还待讨论?


综上。。暂定如此。。。 可能理解上稍有难度,主要纠结一些细节,比如角色挂在了部门下,但并不表示该角色的权限 是部门权限的子集。完全没关系,只是为了嵌套使用。。当为角色添加成员时,跟角色所在部门无关,只跟当前操作的角色管理员有关。

其实很多是操作方式是否方便,是否有重复操作等问题。。人为的不要去做一些 理论上可行,但没意义的操作即可。。


无论如何设计授权模式,操作界面,最终只是为了权限查询.而查询,最终是落在了到权限表查询上..

针对以上模式,当获取登录用户id后,要查询他所拥有的权限,先查询它所在的角色,包括直属角色,以及嵌套角色(角色父部门下的所有角色)。等获取到角色的并集时,再去查询相应权限的并集。。

]]>
ExtNet框架提取[1] 2015-01-11T00:00:00+00:00 sunpander http://sunpander.github.io//2015/01/ExtNet之gridEdit] 本篇主要是[框架提取]具体功能实现示例

接上一篇[框架提取].说到了

--框架就是一套解决方案,当我提出问题的时候,你能立马给出方案,并能够对该方案的优点进行描述,让我信服,对开发中可能遇到的各种问题有例子,能测试.简单容易上手.
-- 对开发人员来说,框架就是一个框框,一定程度上'限定了'你的自由发挥,但同时极大地缩短了,工作有交叉,以及工作移交时的工作量.当你查看其它人代码的时候,能够很快滴理解明白,因为只要他是用一样的框架,那就应该有'一样的'写法.

本篇假设采用了以下框架,具体对各功能代码实现的示例:

整体技术框架

数据库采用sqlserver 2008
开发语言采用C#
与数据库的交互使用ado.net(已有一个疯封装的dll库) 前台采用asp.net
前台控件使用extNet

框架(主页面)

经典的上(标题logo)中(左边菜单树,右边tab页方式的页面)下(底部状态) 简单地extnet提供了tabpanel控件,可动态添加page页.提供treepanel构建菜单树.
treepanel上绑定url地址,点击时动态加载url页面即可 提供画面维护菜单树即可(维护一个树列表)

demo程序

  1. 将之前配置用电量计算公式的功能,单独拿出来做一个demo.数节点(或列表)公式配置的 该功能完善后,应包含的功能

将一个例子单独开一篇文章用来详细描述

grid增删改查的demo

按照不同的操作方式,会有不同的结果 grid中可编辑,常用的方式: 1. 点击编辑按钮..然后新增,删除,保存,取消按钮可用,点击新增在grid上新增,点击删除在grid中删除,如果要修改直接在grid中修改,点击保存时降数据一起存入数据库(可能包含增删改)

grid新增一行,代码如何写
grid删除一行,代码如何写
grid获取修改的记录,代码如何写

]]>
ExtNet方案描述 2015-01-10T00:00:00+00:00 sunpander http://sunpander.github.io//2015/01/ExtNet框架1] 本篇主要是[框架提取]具体功能实现示例

接上一篇[框架提取].说到了

--框架就是一套解决方案,当我提出问题的时候,你能立马给出方案,并能够对该方案的优点进行描述,让我信服,对开发中可能遇到的各种问题有例子,能测试.简单容易上手.
-- 对开发人员来说,框架就是一个框框,一定程度上'限定了'你的自由发挥,但同时极大地缩短了,工作有交叉,以及工作移交时的工作量.当你查看其它人代码的时候,能够很快滴理解明白,因为只要他是用一样的框架,那就应该有'一样的'写法.

本篇假设采用了以下框架,具体对各功能代码实现的示例:

整体技术框架

数据库采用sqlserver 2008
开发语言采用C#
与数据库的交互使用ado.net(已有一个疯封装的dll库) 前台采用asp.net
前台控件使用extNet

框架(主页面)

经典的上(标题logo)中(左边菜单树,右边tab页方式的页面)下(底部状态) 简单地extnet提供了tabpanel控件,可动态添加page页.提供treepanel构建菜单树.
treepanel上绑定url地址,点击时动态加载url页面即可 提供画面维护菜单树即可(维护一个树列表)

demo程序

  1. 将之前配置用电量计算公式的功能,单独拿出来做一个demo.数节点(或列表)公式配置的 该功能完善后,应包含的功能

grid增删改查的demo

按照不同的操作方式,会有不同的结果 grid中可编辑,常用的方式: 1. 点击编辑按钮..然后新增,删除,保存,取消按钮可用,点击新增在grid上新增,点击删除在grid中删除,如果要修改直接在grid中修改,点击保存时降数据一起存入数据库(可能包含增删改)

grid新增一行,代码如何写
grid删除一行,代码如何写
grid获取修改的记录,代码如何写

当拿到一个例子的时候,多想一想一些没做过的,或者想要做的某些功能中的某一块,不要一想就是用户部门之类的增删改..

授权(画面按钮授权)

授权通常分:数据数据,功能授权. 只考虑后者,通常有菜单,画面,按钮授权 为了方便'框架',只授权到菜单项.

在主页面基础上,授权到菜单项(不同用户角色查看不同的菜单项) ,当用户登陆时,构建菜单树即可.

在此基础上,如果需要对画面内的按钮授权,可以在配置菜单的url地址上加参数,页面内读取参数做不同处理.

比如:有一个画面demo.aspx,同时具有增删改查功能.而又不想为查询单独新增一个画面,则可以demo.aspx?action=edit 然后页面内判断如果有edit则显示增删改按钮,否则隐藏

数据库操作类

(这个也待完善,目前没考虑事务的情况)
需提供以下接口
1. 执行某一个sql,返回DataTable,内部判断sql是查询还是非查询,还是存储过程等
2. 执行某一个查询的sql返回DataTable
3. 执行某一个非查询的sql返回int
4. 执行某一个insert方法,传入DataTable,做insert 5. 执行某一个update方法,传入DataTable,做update
6. 执行某一个delete方法,传入DataTable,做delete

数据查询

数据在其他系统维护,(比如存储过程插入,外部系统维护,数据库直接维护等).只需提供查询画面的.
通常上下结构(上方查询条件区域,下方grid列表显示)
extnet很简单,grid绑定用Store,查询的时候后台直接查询到对应的DataTable,设置绑定即可,如果不需要后台分页,控件可自带分页.按钮查询事件最好用js的onclick,首先可以做一些前台必输验证,然后使用 App.direct.XXXXX的方式调用后台的XXXXX方法,传入参数放在前面,后面直接跟回调函数.如
var btnSearchClick = function (btn, e) {
App.direct.BindData({
success: function (result) {App.gridList.selModel.select(0); }
}); };
后台方法添加[DirectMethod]注解,以上回调中的result对应返回值.

简单数据维护(配置类)

数据增删改的,但不频繁,如配置类的,小代码维护,数据字典,设备维护,电厂维护等.
增删改例子:

日报-月报(月报不用计算汇总)

日报是每天或频繁录入的一些台账信息,信息录入式的.比如药品到货信息,添加剂领取信息等,只管录入不关心计算的.
月报只为了记录编制信息,方便后期导出打印,查看.
日报录入后,按月编制月报,编制的时候只记录编制信息(比如按厂还是按机组,编制月份,编制时间,编制人,审核人,审核以及等)而关联的台账信息,不单独建表关联查询之前录入的数据.
后台表结构A:台账表(通常每种类型台账有一张表) B:月报信息表(各台账共享一个表,至少包含编制月份,编制时间,编制人,审核人,审核意见,状态,台账类型字段)

日报-月报(月报需要计算并将结果落地存储)

与之前的差异在于,编制的月报数据也需要存储.比如对一个月所有数据的汇总.但汇总不是简单的求和或平均,而是需要经过各种算法复杂运算.也有可能对运算后的结果进行更改).

复杂逻辑计算类

  1. 按设定频率自动执行的,使用sqlserver的代理计划调用存储过程
  2. 人工触发的,C#类中写逻辑

图形化展示类

  1. 如果简单的,实时性要求不高,做查询展示的可以直接用extnet的图形控件
  2. 或可采用netchartdir

报表导出类

采用EPPlus加excel模板文件的方式.(这个应该可以再继续封装一层,做的更通用些,目前还没完善)
1. 最常用的格式,Datatable列表的方式,传入一个datatabe型数据.将数据按多行的方式,指定列顺序,平铺.

FileInfo file = new FileInfo(strFilePath);//strFilePath导出的文件全路径
FileInfo template = new FileInfo(tmpPath); //tmpPath模板文件全路径
using (ExcelPackage package = new ExcelPackage(file, template))
{
//开始遍历的左上角坐标(从左上角开始先行后列,一个个格子设置值)
int x=1,y=1;
//导出的列顺序
List<String>  listColIndex = new List<string>() { "powerPlant", "rec_date", "powerGenerate1", "powerGenerate2", "powerGenerateTotal", "powerTotalUsed", "
//取要操作的sheet
ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
//为一些固定格子设置值    
worksheet.Cells[1, 1].Value = "";
//按行   遍历传入的数据源  dtContent
for (int i = 0; i < dtContent.Rows.Count; i++)
{
//按列  遍历导出列 列表
for (int k = 0; k < listColIndex.Count; k++)
{
object obj = dtContent.Rows[i][listColIndex[k]];
//指定了行列,设置相应格子值
worksheet.Cells[x + i, y + k].Value = obj;
//设置格子样式
setBorderStyle(worksheet.Cells[x + i, y + k]);
}
}
package.Save();
return strFilePath;
}

文件上传类

extnet封装的上传控件.


  • 除了按技术模块的划分,而给出相应的'最佳解决方法'外.(可能不是最佳,但在个性化的方法, 还没能取的同意的情况下,理论上不允许..如果确实有,大家讨论后,定下来新的方法)
  • 还有就是规范,编码的规范(数据库表的命名规范,程序变量的命名规范,画面的命名规范,类文件,方法名等),还有文件存放位置.
  • 比如数据库表名称已T开头,如果考虑与其他公司表合并,可以再加两位公司代码如TBS,再跟模块名称(通常4位),再加数字序列号..通常表名称与改表维护的前台画面名称一致,如TBSOMOR01在前台对应画面OMOR01.aspx
  • 比如控件命名称已控件类型开头,按钮建议btn开头,textbox以txt开头,gridpanel建议以grid开头,如果页面只有一个grid报表的叫gridReport,列表的叫gridList,如果是明确某一张数据库表的grid加表名称,如gridOMOR01,store建议store开头加上表名称(如果表前几位固定,可只取后几位),如果对应的英文大家都清楚,则加英文名称,如storeUser.总之.如果变量只是在画面aspx文件内用到,可以不在乎,比如一些column,label,一些textbox等,但是如果在cs中编码有用到,一定要按规范命名.比如.cs代码上不要出现类似 this.Store1.DataSource=dt;或者string name=textbox1.Text 之类的..
  • 比如逻辑方法,建议把与数据调用,相关的尽量单独作为一个serviceXxxx类提供,查询的最好能放一起,比如serviceXxxxQuery.serviceXxxx继承自serviceXxxxQuery.可以以静态方法的方式提供,对外的用public,内部自己调用的用protected
  • 比如类内的方法,在serviceXxxxQuery通常有针对各个表的QueryTOMOR01参数可以重载
  • 比如在

总之一切为了清晰,统一,无争议,为了养成良好的编码习惯,为了工作交接时无负担,为了方便重构,修改代码.为了后期维护.

另外文档性的,一些在开发的过程中就留意完善的
- 项目方案
- 自检报表
- 程序安装手册
- 系统管理员手册
- 软件使用说明书
- 源程序
- 程序架构说明
- 数据库表结构说明
- 数据库存储过程及触发器说明

]]>