ASP.NET核心项目实战权限管理系统(6)功能管理-研发项目管理

>>ASP.NET核心项目实战权限管理系统(6)功能管理-研发项目管理

ASP.NET核心项目实战权限管理系统(6)功能管理-研发项目管理

引言:当今社会市场竞争激烈,软件开发企业想要占据前列需要在研发管理上下功夫,“向管理要效益”已经成为软件开发企业的共识,研发项目管理在软件企业中的普及也是大势所趋。国内做软件项目管理工具的开发商翼发云近几年发展十分迅速,越来越多的软件开发企业认识到研发项目管理的重要性,能切实有效降低成本,规范软件开发流程,提高软件产品质量。国内研发项目管理系统、敏捷开发管理工具的领导品牌翼发云敏捷项目管理系统采用可视化业务流程技术,支持瀑布模型等传统软件研发项目管理,同时也支持scrum等敏捷开发流程,是理想的敏捷开发管理工具,涵盖软件项目管理工作的整个生命周期。为提高国内软件开发企业的项目管理水平,分享一篇企业管理相关的知识文章。

0 ASP.NET核心项目物权管理系统(0)

1 ASP。NET核心项目实战的权限管理系统(1)使用adminlte建立前端 scrum

2 ASP.NET核心项目实战权限管理系统(2)功能与实体设计

3 ASP。NET核心项目真正的版权管理系统(3)通过使用PostgreSQL EntityFramework核心 软件项目管理

4 ASP.NET核心项目物权管理系统(4)依赖于多项目分层实施注入、仓储和服务。

5 ASP.NET核心项目实战权限管理系统(5)用户登录 敏捷开发流程

6 ASP.NET核心项目实战权限管理系统(6)功能管理

7 ASP.NET核心项目版权管理系统(7)组织、角色、用户权限 研发项目管理

8 ASP.NET核心项目版权管理系统(8)功能菜单动态加载

GitHub源地址

0仓储接口及其实现

0存储接口

修改Fonour.Domain项目中IRepository接口,增加分页查询及根据条件删除的操作接口。

/ / / < summary> / / / / / / delete entities according to the conditions of < /summary> / / / < param name= “where” > lambda &lt expression; /param> / / / < param name= > “autoSave” is automatically saved < /param> Expression< Func< void Delete (TEntity, bool> > where, bool autoSave = true); / / / < summary> / / / / / / &lt paging data; /summary> / / / < param name= > “startPage” start page < /param> / / / < param name= “pageSize” > &lt /param> / / / page entries; < param name= “rowCount” > the total number of &lt data /param> param; / / / < name= “where” > &lt /param> query; / / / < param name= “order” > &lt /param> &lt sequencing; / / / 返回;&gt;&lt;/返回&gt;IQueryable &lt;tentity &gt;LOAdPageList(int,int的起始,大小从int ROWC帐号,功能表达&lt;&lt;TEntity、布尔&gt;&gt;在表达功能,&lt;&lt;TEntity、对象&gt;&gt;

增加功能菜单管理的仓储操作接口IMenuRepository

公共接口imenurepository:IRepository &lt;菜单&gt;{ }。

0.1仓储实施

在Fonour.EntityFrameworkCore项目的Repositories/FonourRepositoryBase.cs中实现上述接口。

/ / / < summary> / / / / / / delete entities according to the conditions of < /summary> / / / < param name= “where” > lambda &lt expression; /param> / / / < param name= > “autoSave” is automatically saved < /param> public void Expression< Func< Delete (TEntity, bool> > where bool = autoSave true) {_dbContext.Set< TEntity> (.Where) (where) (.ToList).ForEach (it => _dbContext.Set< TEntity> (.Remove) (it)); if (autoSave) Save (&lt);} / / / / / / / / /; summary> /summary> &lt query; / / / &lt param name=; “startPage > &lt /param> / / / page; < param name= >” pageSize “single page data number < /param> / / / < param name= >” rowCount “line number < /par我& gt;/ / / & lt;参数名称=“”& gt;/参数&gt;&lt;/ / / & lt;参数名称=“秩序”& gt;& lt /参数& gt;& lt测序;/ / / & lt;/返回&gt;返回&gt;公众;IQueryable &lt;tentity &gt;LOAdPageList(int,int的起始,大小从int RowCount、功能表达&lt;&lt;TEntity、布尔&gt;&gt;=零,函数表达&lt;&lt;TEntity,对象&gt;&gt;订单= null){ var result = P在_dbcontext。集& lt(选择);TEntity &gt;P;如果(在!=结果=结果(在哪里);如果(顺序)!= null)结果= result.orderby(秩序);其他的结果= result.orderby(M = & gt;M ID;行数)=(结果。计数)返回;结果。跳过((起始页- 1)* PageSize)。以(PageSize);}

1应用服务接口及其实现

在Fonour.Application项目中添加MenuApp文件夹,新增IMenuAppService接口及实现MenuAppService,以及数据传输对象MenuDto。

Asp.Net Core 项目实战之权限管理系统(6) 功能管理

接口主要包含一下定义,具体实现代码参见GitHub源码。

&lt summary> / / / / / /; / / / &lt /summary&gt to obtain the list of features; returns> < / / /; < /returns> List< MenuDto> GetAllList (&lt); / / / / / /; summary> according to the parent Id access function list / / / < /summary> / / / < param name= “parentId” > parent Id&lt /param> param; / / / < name= “startPage” > &lt /param> / / / start page; < param name= pageSize > &lt /param> / / / page size; < param name= “rowCount” > the total number of data & lt; /param> returns> / / / < < /returns> List< MenuDto> GetMneusByParent (Guid parentId, int startPage, int pageSize, out int rowCount); / / / < summary> / / / / / / add or modify the function of < /summary> / / / < param name= > dto /param> entity < / / / < returns> < /returns> bool InsertOr Update (MenuDto dto); / / / / / / < summary> according to the Id collection batch delete /summary> / / / &lt / / / < param; name= “IDS” > &lt /param> Id collection function; void DeleteBatch (List< Guid> IDS); / / / &lt / / / / / / delete; summary> < /summary> / / / &lt param; name= “Id” > Id&lt /param> void function; Delete (Guid ID); / / / / / / < summary> according to Id to obtain &lt /summary> / / / / / / entity; < param name= “Id” > Id&lt function; /param> returns> / / / < < /returns> MenuDto Get (Guid ID);

1使用的AutoMapper

AutoMapper是一个轻量级的类库,主要功能是把一个对象转换成另外一个对象,而避免我们每次重复的手工去逐个属性赋值转换。在将领域模型(Menu)与数据传输对象(MenuDto)互相转化的过程中提供便利。

0添加AutoMapper应用

通过NuGet程序包管理器安装、通过NuGet程序包控制台安装、或通过直接修改project.json都可用很方便的快速添加对AutoMapper类库的引用。

1 fonourmapper类

AutoMapper最基本的使用是首先通过CreateMap<T1,T2>()方法创建两个实体的映射关系,然后通过Mapper.Map<T1>(T2)实现实体T2到T1的转换。这里所有领域模型与Dto之间的映射关系创建都在应用服务层完成,应用服务层将接收到的Dto对象转换为领域模型后传入仓储调用,同时将仓储返回的领域模型转换为Dto,返回给界面变现层使用。

在Fonour.Application项目中新增一个名称为FonourMapper的类,里面实现一个名称为Initialize的静态方法,以后所有的领域模型与Dto的映射关系都在这个FonourMapper类里完成。

& lt总结& gt;/ / /;/ / / Enity / / / & lt和DTO映射/摘要&gt;公共课;fonourmapper public static void(初始化){ { mapper.initialize(CFG = & gt;菜单{ CFG。CreateMap & lt;menudto &gt;CFG。CreateMap & lt;MenuDto;(),菜单(GT);} } });

2启动启动调用

在应用程序启动入口处初始化所有领域模型与Dto对象的映射关系,修改Startup.cs类的Startup方法,增加FonourMapper类Initialize静态方法的调用。

//初始化fonourmapper初始化()之间的映射;

3 AutoMapper实体转换

使用AutoMapper进行实体转换操作主要应用在应用服务接口的实现类中,如MenuAppService的GetAllList方法实现。

公示名单& lt;menudto &gt;getalllist(VAR){菜单= _menurepository.getalllist(。OrderBy)(= & gt;它。SerialNumber);// AutoMapper返回映射。地图& lt列表& lt;实体转化;menudto &gt;&gt;(菜单);}

2性能层实现

在功能及实体设计中我们将功能管理部分设计为左右结构,左边为树形结构,右边为列表结构,当单击左边树节点时,加载选中树节点的下级数据至右侧列表中。基于此设计,必不可少的必然包含一个树形插件和一个带有分页功能的表格插件。

2 jsTree用

树形插件这里选择使用JsTree,jsTree是一个 基于jQuery的Tree控件。支持XML,JSON,Html三种数据源。提供创建,重命名,移动,删除,拖”放节点操作。可以自己自定义创建,删 除,嵌套,重命名,选择节点的规则。在这些操作上可以添加多种监听事件,用以实现我们实际应用中的种种树形操作需求。

0 jsTree前端安装的软件包

通过Bower管理器,搜索JsTree,找到后直接安装即可。或直接修改Fonour.MVC项目中的Bower.json文件:

{“名字”:“ASP。NET”、“私人”:真的,“依赖”:{“引导”:“3.3.6”、“字体真棒”:“4.6.1”,“我”):“1.0.2”、“4.6.1”:“*”、“”“”“”“,”“”} } } }”。

1 jsTree的基本使用

在布局页Shared/_Layout.cshtml中统一添加JsTree的css及js引用。

&lt;链接rel=“样式表”href =“~ / lib / jsTree /距离/主题/默认/风格。min.css”& gt;
&lt;script src=“~ / lib / jsTree /距离/ jsTree .js”&gt;&lt;script&gt /;

在视图文件中定义要渲染JsTree的Div对象

&lt;div id=“treediv”class=“门户”&gt;&lt;/ div & gt;

JsTree的创建主要是通过调用$(‘#treeDiv’).jstree()方法实现,下面是一个基本的使用ajax获取json数据并绑定树结构的过程,有关JsTree的更详细的使用说明,请参看官方网站相关介绍。

Function (initTree / lOAding function tree ($.jstree.destroy); $.ajax) {{type: (“Get”, “/Menu/GetMenuTreeData”, url: / / data acquisition Ajax request address success: function (data) {$(‘#treeDiv’).Jstree (JsTtree:’core’ {/ / create {‘data’: data / JsTree data binding, “multiple”: false / be more “plugins”}, [“state”, “types”, “wholerow”] / / configuration information)} $(“#treeDiv”).On (“ready.jstree”, function (E, data) {/ / create complete event (data.instance.open_all tree); / / expand all nodes}); $(“#treeDiv”).On (‘changed.jstree’, function (e, Data) {/ / node = var nodes selected change event data.instance.get_node (data.selected[0]); / / get the node selected if (node) {selectedMenuId = node.id; lOAdTables (1, 10);};}}});});

2.1引导页面分页插件的使用

表格的显示我们采用Bootstrap中的Table组件,并配合bootstrap-paginator提供的分页功能实现列表数据的分页展示。Bootstrap-paginator是一款基于Bootstrap的js分页插件,功能很丰富,它提供了一系列的参数用来支持用户的定制,提供了公共的方法可随时获得插件状态的改变,以及事件来监听用户的动作。由于它暂不支持Bower,所以我们只能下载这个js文件,添加到我们项目的wwwroot/js/文件夹下。同时在布局页中添加此js的引用。

&lt;script src=“~ / JS /引导页面js“&gt;&lt;script&gt /;

一般的使用是首先在视图页中定义分页插件的容器。

>“分页工具栏”“gt”和“;”;“=”;

然后在列表数据的加载同时创建分页插件,其中page,data.rowsCount,data.pageCount等定义需要在请求的控制器方法中通过json格式返回。

VaR值= $(“# grid_paging_part”);//如果页面插件容器(data.rowcount &gt;var选项= 0){ { //分页插件配置bootstrapmajorversion:3,currentpage:页面,numberofpages:data.rowscount / / / /当前页的总页数,总人数:data.pagecount,onpagechanged:功能/总页数(事件、oldpage,NewPage){ //页面切换事件lOAdtables(NewPage)elment.bootstrappaginator(选项);} } };//初始化插件页面

2.2个功能的实现

0控制器

新建名称为MenuController的控制器,控制器的构造函数中通过依赖注入获取IMenuAppService的实现实例。

私人只读imenuappservice _menuappservice;市民MenuController(imenuappservice menuappservice){ _menuappservice = menuappservice;}

控制器中主要包括以下方法。

  • 索引返回函数管理接口。
  • getmenutreedata返回左边功能树的JSON数据管理
  • getmneusbyparent返回下功能分页列表左边功能树节点所需的JSON数据
  • 编辑功能的管理编辑
  • 批DeleteMuti功能缺失
  • 删除功能删除
  • 获取基于id的功能实体

注:此处根据个人喜好,视图界面采用尽量纯净的html,操作全部采用ajax请求,控制器统一返回Json格式的数据。当然你也可以通过使用TagHelper+模型绑定+Razor机制实现(控制器获取实体或实体集合,返回View,View中得到实体,通过TagHelper实现模型绑定),可参考用户登陆实现部分。

1视图

Views文件夹下新建Menu文件夹,在Menu文件夹下创建Index.cshtml视图,以及名称为_Edit.cshtml(新增/修改)的分部视图,同时添加Index.js文件。

在布局页_Layout.cshtml中增加RenderSection,用于渲染视图页中相关js方法。

“rendersection(“脚本”,假)

Index.cshtml主要布局修改如下

< div class= > &lt row; div class= “col-md-3” > < div class= “box box-primary” &gt div class= “box-header; < > < with-border” H3 class= “box-title” > &lt /h3> management function; < /div> < div class= “box-body” > < div id= “treeDiv” class= “portlet-body” > < /div> < /div> < /div> < /div> < div class= “col-md-9” > < div class= “box box-primary” &gt div class= “box-header; < > < with-border H3 class=” box-title “> &lt /h3> &lt function list; div class=; pull-right box-tools > < button” id= “btnAddRoot” C “Lass= BTN btn-primary” type= “button” data-original-title= “new top function” data-toggle= “tooltip” data-widget= “&gt” I “Fa; < class= fa-plus-square > < /i> & nbsp; & nbsp; /button> new top < < button id=” btnAdd “title=” “class=” BTN btn-primary “type=” button “data-original-title=” new “data-toggle=” tooltip “data-widget=” &gt “I” Fa; < class= fa-plus-circle > < /i> & nbsp; nbsp; &lt & amp; new /button> < button; id= “btnDelete” title= “class=” BTN btn-danger “type=” button “data-original-title=” delete function “data-toggle=” tooltip “data-widget=” &gt &l “; T; I class= “Fa fa-times” > < /i> & nbsp; & nbsp; /button> < &lt deletion; button id= “btnLOAdRoot” title= “class=” BTN “btn-success” type= “button” data-original-title= “data-toggle=” tooltip top lOAding function “” data-widget= “” > < I “class= FA fa-list” > < /i> & nbsp; & nbsp; &lt /button&gt < top lOAding;; /div> < /div> < div class= “box-body” > &lt div; class= “table-scrollable” > < table class= table table-striped table-bordered table-hover dataTable no-footer role= “” grid “aria-describedby=” sample_2_info “> < thead> < tr role= > &lt row; th class= “table-checkbox” style= “width:40px; text-align:center; > < input” id= “checkAll” class= “group-checkable” type= “checkbox” > < /th> < th tabindex= “0” aria-label= “&gt”; function name < /th> < th tabindex= “0” aria-label= “> &lt /th> &lt encoding function; th; tabindex=” 0 “aria-label=” &gt “; &lt /th> &lt address; Th; tabindex= “0” aria-label= “&gt” type; < /th> < th tabindex= “0” aria-label= “&gt”; &lt /th> &lt function; th; tabindex= “0” style= “width: 230px aria-label=”; “&gt”; /th> < < /tr& gt; < /thead> < tbody id= “tableBody” > < /tbody> < /table> < /div> < /div> < div class= “paging-toolbar” > < UL id= “grid_paging_part” > < /ul> < /div> < /div> <; “;”; “;”; “;”; “;”; “(” “”) “,” the “,” the “;”

_Edit.cshtm采用Bootstrap的Modal弹出框组件,做为功能管理的新增和编辑界面

< div id= “addRootModal” tabindex= “-1” class= “modal fade in” aria-hidden= “true” > &lt div; class= “modal-dialog” > < div class= “box box-info” &gt div class= “box-header; < > < with-border” H5 class= “box-title” id= “Title” &gt < < /h5> button; class= “close” aria-label= “Close” type= “button” data-dismiss= “modal” > &lt span; aria-hidden= “true” > /span> < < /button> < /div> < form > class= “form-horizontal” &lt input type= “hidden”; id= “Id” /> &lt input; type= “hidden” id= “ParentId” /> &lt div; class= > &lt box-body; div class = “form-group” > < label “class= col-sm-2 control-label” for= “> /label> function name < < div class=” col-sm-10 “> &lt input; class=” form-control “id=” Name “type=” text “placeholder=” function name & gt; < /div> < /div&gt < div; class= form-group > < label class= “col-sm-2 control-label” for= “inputPassword3” > &lt /label> &lt encoding function; div; class= col-sm-10 > &lt input; class= “form-control” id= “Code” type= “text” placeholder= “encoding” > < /div&gt < /div> div; < class= form-group > < label class= “col-sm-2 control-label” for= “inputPassword3” > &lt /label> &lt function; div; class= “col-sm-10” > &lt select; class= “form-control” id= “Type” > < option value= > the function of “0” the menu &lt /option> < option; value= 1 > &lt /option> &lt operation button;; /select> < /div> < /div> < div class= “form-group” > < label class= “col-sm-2 control-label” for= “> link address < /label> < div class= > &lt col-sm-10; input class= “form-control” id= “Url” type= “text” placeholder= “link” > < /div> < /div> < div class= “form-group” > < label class= “col-sm-2 control-label” for= “&gt &lt” function icon; /label> div; < class= col-sm-10 > &lt input; class= “form-control” id= “Icon” type= “text” placeholder= “icon” > < /div> < /div> < div class = “form-group” > < label “class= col-sm-2 control-label” for= “&gt” function; The number of < /label> < div class= “col-sm-10” > &lt input; class= “form-control” id= “SerialNumber” type= “text” placeholder= “> < serial number /div> < /div> < div class=” form-group “> < label class=” col-sm-2 control-label “for=” “> /label> functional description < &lt div; class= > &lt col-sm-10; textarea id=” Remarks “class=” form-control “rows=” 3 “> < /textarea> < /div> < /div> < /div> < div class=” box-footer “> < Di V class= “pull-right box-tools &gt”; &lt button; id= “btnSave” class= “BTN btn-primary” type= “button” > /button> < < button “class= BTN btn-default” type= “button” data-dismiss= “modal” > &lt / button> cancel; < /div> < /div> < /form> < /div> < /div> < /div>

Index.js文件主要定义视图文件与服务器的交互操作,主要包括以下定义。

Asp.Net Core 项目实战之权限管理系统(6) 功能管理

前面我们已经介绍过静态文件的使用需要在Startup中的Configure方法中增加

静态文件(应用程序使用。usestaticfiles)/ /;

这样就可以访问所有wwwroot目录下的静态文件,但是若想访问Views/Menu/Index.js文件,还需要在Configure方法中增加

app.usestaticfiles(新staticfileoptions(){ fileprovider =新physicalfileprovider(Directory.GetCurrentDirectory())});

这样在客户端就可以成功访问Views/Menu/Index.js文件,调用相关方法了。

3界面预览

完成的功能管理界面大体如下。

主界面

Asp.Net Core 项目实战之权限管理系统(6) 功能管理

编辑界面

Asp.Net Core 项目实战之权限管理系统(6) 功能管理

删除提示

Asp.Net Core 项目实战之权限管理系统(6) 功能管理

4总结

本次我们通过使用AutoMapper、JsTree、Bootstrap-paginator等技术实现了功能管理的开发,接下来要实现组织机构管理功能的开发。

文章从互联网整理而来,旨在传播scrum、软件项目管理、研发项目管理、敏捷开发管理工具的知识与应用,帮助软件开发企业真正了解研发项目管理的价值和意义,如果本文侵犯了您的权益或者您需要具体了解更多国内做研发项目管理系统的公司翼发云敏捷项目管理系统的相关信息,欢迎和我们联络:

【网址】www.effapp.com

2018-02-24T04:48:56+08:002018-02-24 04:48:56|Categories: scrum项目管理|