GVKun编程网logo

如何使用AngularJs打造权限管理系统【简易型】(angular权限控制)

11

对于如何使用AngularJs打造权限管理系统【简易型】感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解angular权限控制,并且为您提供关于angularjs–可以在AngulrJS1.

对于如何使用AngularJs打造权限管理系统【简易型】感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解angular权限控制,并且为您提供关于angularjs – 可以在AngulrJS 1.3.0项目中使用angular / di.js吗?、angularjs – 如何使用Angular 1.5 *组件*和UI Bootstrap模式进行解析、angularjs – 如何使用angular js动态设置HTML元素的id属性?、angularjs – 如何使用Angular Js声明一个全局变量?的宝贵知识。

本文目录一览:

如何使用AngularJs打造权限管理系统【简易型】(angular权限控制)

如何使用AngularJs打造权限管理系统【简易型】(angular权限控制)

一、引言

  本文将介绍如何把AngularJs应用到实际项目中。本篇文章将使用AngularJS来打造一个简易的权限管理系统。下面不多说,直接进入主题。

二、整体架构设计介绍

  首先看下整个项目的架构设计图:

  从上图可以看出整个项目的一个整体结构,接下来,我来详细介绍了项目的整体架构:

  采用Asp.net Web API来实现REST 服务。这样的实现方式,已达到后端服务的公用、分别部署和更好地扩展。Web层依赖应用服务接口,并且使用Castle Windsor实现依赖注入。

显示层(用户UI)

  显示层采用了AngularJS来实现的SPA页面。所有的页面数据都是异步加载和局部刷新,这样的实现将会有更好的用户体验。

应用层(Application Service)

  AngularJS通过Http服务去请求Web API来获得数据,而Web API的实现则是调用应用层来请求数据。

基础架构层

  基础架构层包括仓储的实现和一些公用方法的实现。

  仓储层的实现采用EF Code First的方式来实现的,并使用的方式来创建数据库和更新数据库。

  LH.Common层实现了一些公用的方法,如日志帮助类、表达式树扩展等类的实现。

领域层

  领域层主要实现了该项目的所有领域模型,其中包括领域模型的实现和仓储接口的定义。

  介绍完整体结构外,接下来将分别介绍该项目的后端服务实现和Web前端的实现。

三、后端服务实现

  后端服务主要采用Asp.net Web API来实现后端服务,并且采用Castle Windsor来完成依赖注入。

  这里拿权限管理中的用户管理来介绍Rest Web API服务的实现。

提供用户数据的REST服务的实现:

  从上面代码实现可以看出,User REST 服务依赖与IUserService接口,并且也没有像传统的方式将所有的业务逻辑放在Web API实现中,而是将具体的一些业务实现封装到对应的应用层中,Rest API只负责调用对应的应用层中的服务。这样设计好处有:

REST 服务部依赖与应用层接口,使得职责分离,将应用层服务的实例化交给单独的依赖注入容器去完成,而REST服务只负责调用对应应用服务的方法来获取数据。采用依赖接口而不依赖与具体类的实现,使得类与类之间低耦合。REST服务内不包括具体的业务逻辑实现。这样的设计可以使得服务更好地分离,如果你后期想用WCF来实现REST服务的,这样就不需要重复在WCF的REST服务类中重复写一篇Web API中的逻辑了,这时候完全可以调用应用服务的接口方法来实现WCF REST服务。所以将业务逻辑实现抽到应用服务层去实现,这样的设计将使得REST 服务职责更加单一,REST服务实现更容易扩展。

  

用户应用服务的实现:

GetUsers(PageInput input) { var result = GetDefault>(); var filterExp = BuildExpression(input); var query = _userRepository.Find(filterExp,user => user.Id,SortOrder.Descending,input.Current,input.Size); result.Total = _userRepository.Find(filterExp).Count(); result.Data = query.Select(user => new UserDto() { Id = user.Id,CreateTime = user.CreationTime,Email = user.Email,State = user.State,Name = user.Name,RealName = user.RealName,Password = "*******",Roles = user.UserRoles.Take(4).Select(z => new BaseEntityDto() { Id = z.Role.Id,Name = z.Role.RoleName }).ToList(),TotalRole = user.UserRoles.Count() }).ToList(); return result; } public UpdateResult UpdateUser(UserDto user) { var result = GetDefault(); var existUser = _userRepository.FindSingle(u => u.Id == user.Id); if (existUser == null) { result.Message = "USER_NOT_EXIST"; result.StateCode = 0x00303; return result; } if (IsHasSameName(existUser.Name,existUser.Id)) { result.Message = "USER_NAME_HAS_EXIST"; result.StateCode = 0x00302; return result; } existUser.RealName = user.RealName; existUser.Name = user.Name; existUser.State = user.State; existUser.Email = user.Email; _userRepository.Update(existUser); _userRepository.Commit(); result.IsSaved = true; return result; } public CreateResult AddUser(UserDto userDto) { var result = GetDefault>(); if (IsHasSameName(userDto.Name,userDto.Id)) { result.Message = "USER_NAME_HAS_EXIST"; result.StateCode = 0x00302; return result; } var user = new User() { CreationTime = DateTime.Now,Password = "",Email = userDto.Email,State = userDto.State,RealName = userDto.RealName,Name = userDto.Name }; _userRepository.Add(user); _userRepository.Commit(); result.Id = user.Id; result.IsCreated = true; return result; } public DeleteResult DeleteUser(int userId) { var result = GetDefault(); var user = _userRepository.FindSingle(x => x.Id == userId); if (user != null) { _userRepository.Delete(user); _userRepository.Commit(); } result.IsDeleted = true; return result; } public UpdateResult UpdatePwd(UserDto user) { var result = GetDefault(); var userEntity =_userRepository.FindSingle(x => x.Id == user.Id); if (userEntity == null) { result.Message = string.Format("当前编辑的用户“{0}”已经不存在",user.Name); return result; } userEntity.Password = user.Password; _userRepository.Commit(); result.IsSaved = true; return result; } public GetResult GetUser(int userId) { var result = GetDefault>(); var model = _userRepository.FindSingle(x => x.Id == userId); if (model == null) { result.Message = "USE_NOT_EXIST"; result.StateCode = 0x00402; return result; } result.Data = new UserDto() { CreateTime = model.CreationTime,Email = model.Email,Id = model.Id,RealName = model.RealName,State = model.State,Name = model.Name,Password = "*******" }; return result; } public UpdateResult UpdateRoles(UserDto user) { var result = GetDefault(); var model = _userRepository.FindSingle(x => x.Id == user.Id); if (model == null) { result.Message = "USE_NOT_EXIST"; result.StateCode = 0x00402; return result; } var list = model.UserRoles.ToList(); if (user.Roles != null) { foreach (var item in user.Roles) { if (!list.Exists(x => x.Role.Id == item.Id)) { _userRoleRepository.Add(new UserRole { RoleId = item.Id,UserId = model.Id }); } } foreach (var item in list) { if (!user.Roles.Exists(x => x.Id == item.Id)) { _userRoleRepository.Delete(item); } } _userRoleRepository.Commit(); _userRepository.Commit(); } result.IsSaved = true; return result; } public DeleteResult DeleteRole(int userId,int roleId) { var result = GetDefault(); var model = _userRoleRepository.FindSingle(x => x.UserId == userId && x.RoleId == roleId); if (model != null) { _userRoleRepository.Delete(model); _userRoleRepository.Commit(); } result.IsDeleted = true; return result; } public bool Exist(string username,string password) { return _userRepository.FindSingle(u => u.Name == username && u.Password == password) != null; } private bool IsHasSameName(string name,int userId) { return !string.IsNullOrWhiteSpace(name) && _userRepository.Find(u=>u.Name ==name && u.Id != userId).Any(); } private Expression> BuildExpression(PageInput pageInput) { Expression> filterExp = user => true; if (string.IsNullOrWhiteSpace(pageInput.Name)) return filterExp; switch (pageInput.Type) { case 0: filterExp = user => user.Name.Contains(pageInput.Name) || user.Email.Contains(pageInput.Name); break; case 1: filterExp = user => user.Name.Contains(pageInput.Name); break; case 2: filterExp = user => user.Email.Contains(pageInput.Name); break; } return filterExp; } }

  这里应用服务层其实还可以进一步的优化,实现代码层级的读写分离,定义IReadOnlyService接口和IWriteServie接口,并且把写操作可以采用泛型方法的方式抽象到BaseService中去实现。这样一些增删改操作实现公用,之所以可以将这里操作实现公用,是因为这些操作都是非常类似的,无非是操作的实体不一样罢了。其实这样的实现在我另一个开源项目中已经用到:.大家可以参考这个自行去实现。

  

仓储层的实现:

  用户应用服务也没有直接依赖与具体的仓储类,同样也是依赖其接口。对应的用户仓储类的实现如下:

rush:js;"> public class BaseRepository : IRepository where TEntity :class,IEntity { private readonly ThreadLocal _localCtx = new ThreadLocal(() => new UserManagerDBContext()); public UserManagerDBContext DbContext { get { return _localCtx.Value; } } public TEntity FindSingle(Expression> exp = null) { return DbContext.Set().AsNoTracking().FirstOrDefault(exp); } public IQueryable Find(Expression> exp = null) { return Filter(exp); } public IQueryable Find(Expression> expression,Expression> sortPredicate,SortOrder sortOrder,int pageNumber,int pageSize) { if (pageNumber <= 0) throw new ArgumentOutOfRangeException("pageNumber",pageNumber,"pageNumber must great than or equal to 1."); if (pageSize <= 0) throw new ArgumentOutOfRangeException("pageSize",pageSize,"pageSize must great than or equal to 1."); var query = DbContext.Set().Where(expression); var skip = (pageNumber - 1) * pageSize; var take = pageSize; if (sortPredicate == null) throw new InvalidOperationException("Based on the paging query must specify sorting fields and sort order."); switch (sortOrder) { case SortOrder.Ascending: var pagedAscending = query.sortBy(sortPredicate).Skip(skip).Take(take); return pagedAscending; case SortOrder.Descending: var pagedDescending = query.sortByDescending(sortPredicate).Skip(skip).Take(take); return pagedDescending; } throw new InvalidOperationException("Based on the paging query must specify sorting fields and sort order."); } public int GetCount(Expression> exp = null) { return Filter(exp).Count(); } public void Add(TEntity entity) { DbContext.Set().Add(entity); } public void Update(TEntity entity) { DbContext.Entry(entity).State = EntityState.Modified; } public void Delete(TEntity entity) { DbContext.Entry(entity).State = EntityState.Deleted; DbContext.Set().Remove(entity); } public void Delete(ICollection entityCollection) { if(entityCollection.Count ==0) return; DbContext.Set().Attach(entityCollection.First()); DbContext.Set().RemoveRange(entityCollection); } private IQueryable Filter(Expression> exp) { var dbSet = DbContext.Set().AsQueryable(); if (exp != null) dbSet = dbSet.Where(exp); return dbSet; } public void Commit() { DbContext.SaveChanges(); } } public class UserRepository :BaseRepository,IUserRepository { }

四、AngularJS前端实现

  Web前端的实现就是采用AngularJS来实现,并且采用模块化开发模式。具体Web前端的代码结构如下图所示:

rush:js;"> App/images // 存放Web前端使用的图片资源 App/Styles // 存放样式文件 App/scripts // 整个Web前端用到的脚本文件 / Controllers // angularJS控制器模块存放目录 / directives // angularJs指令模块存放目录 / filters // 过滤器模块存放目录 / services // 服务模块存放目录 / app.js // Web前端程序配置模块(路由配置) App/Modules // 项目依赖库,angular、Bootstrap、Jquery库 App/Views // AngularJs视图模板存放目录

  使用AngularJS开发的Web应用程序的代码之间的调用层次和后端基本一致,也是视图页面——》控制器模块——》服务模块——》Web API服务。

  并且Web前端CSS和JS资源的加载采用了Bundle的方式来减少请求资源的次数,从而加快页面加载时间。具体Bundle类的配置:

rush:js;"> public class BundleConfig { // For more information on bundling,visit http://go.microsoft.com/fwlink/?LinkId=301862 public static void RegisterBundles(BundleCollection bundles) { //类库依赖文件 bundles.Add(new ScriptBundle("~/js/base/lib").Include( "~/app/modules/jquery-1.11.2.min.js","~/app/modules/angular/angular.min.js","~/app/modules/angular/angular-route.min.js","~/app/modules/bootstrap/js/ui-bootstrap-tpls-0.13.0.min.js","~/app/modules/bootstrap-notify/bootstrap-notify.min.js" )); //angularjs 项目文件 bundles.Add(new ScriptBundle("~/js/angularjs/app").Include( "~/app/scripts/services/*.js","~/app/scripts/controllers/*.js","~/app/scripts/directives/*.js","~/app/scripts/filters/*.js","~/app/scripts/app.js")); //样式 bundles.Add(new StyleBundle("~/js/base/style").Include( "~/app/modules/bootstrap/css/bootstrap.min.css","~/app/styles/dashboard.css","~/app/styles/console.css" )); } }

 

 首页 Index.cshtml

rush:js;"> 简易权限管理系统Demo @Styles.Render("~/js/base/style") @Scripts.Render("~/js/base/lib")

angularjs – 可以在AngulrJS 1.3.0项目中使用angular / di.js吗?

angularjs – 可以在AngulrJS 1.3.0项目中使用angular / di.js吗?

Volta在ng-conf上谈到的新的依赖注入,包含在这里: https://github.com/angular/di.js正是我正在为我的AngularJS 1.3.0项目寻找的.

问题是,我不清楚我是否可以使用它.在github项目示例中,似乎没有使用AngularJS v1的例子.

我在Backbone项目中发现了一个例子:http://teropa.info/blog/2014/03/18/using-angular-2-0-dependency-injection-in-a-backbone-app.html,我发现在AngularJS v1项目中使用ES6的一个例子:https://github.com/mvolkmann/todo-es6/,但是我在Angular v1项目中找不到使用新的DI的例子.

我很困惑.任何指针?

也许不要使用di.js,而是将类似样式的代码转换成有效的角度1.X语法(在构建步骤中)

一个小例子和一个可能的开始:

var falafel = require('falafel');
var traceur = require('traceur');

var src =  
  '@Inject(MyService,MyOtherService)' +
  'class Thing{' +
  '  constructor(service,otherservice){' +
  '  }' +
  '}';

src = traceur.compile(src,{ annotations: true });
//console.log(src);

function tryGetPath(obj,path) {
  path.split('.').forEach(function(key) {
    obj = obj && obj[key];
  });
  return obj;
}

var output = falafel(src,function(node) {
  //find `Object.defineProperty for 'annotations'`
  if (node.type === 'CallExpression' && tryGetPath(node,'arguments.1.value') === 'annotations') {
    var injectable = tryGetPath(node,'arguments.0.name');
    var $inject = (tryGetPath(node,'arguments.2.properties.0.value.body.body.0.argument.elements') || [])
                       .filter(function(a){return a.callee.name === 'Inject'})  
                       .reduce(function(p,c){ p.push.apply(p,c.arguments); return p;},[])
                       .map(function(a){return "'"+a.name+"'";});
    node.update(injectable + '.$inject = [' + $inject.toString() + '];');
  }
});

console.log(output);

也许您甚至可以使用某些属性(例如@NgController等)将其注册到您的模块上作为控制器.

angularjs – 如何使用Angular 1.5 *组件*和UI Bootstrap模式进行解析

angularjs – 如何使用Angular 1.5 *组件*和UI Bootstrap模式进行解析

我正在尝试使用resolve将数据传递到 ubi modal,这是一个Angular 1.5组件.我知道这是可能的,因为它表明uib模式文档中的组件支持resolve.

component (Type: string,Example: myComponent) – A string reference to
the component to be rendered that is registered with Angular’s
compiler. If using a directive,the directive must have restrict: ‘E’
and a template or templateUrl set.

It supports these bindings:

(…)

resolve – An object of the modal resolve values. See UI Router
resolves for details.

我发现的所有示例都在open方法中声明了templateurl / controller.然后将在resolve中声明的项目注入控制器.我将一个Angular 1.5组件传递给模态(不是templateurl / controller),当我尝试从resolve中注入项目时,我遇到了一个可怕的“unkNow provider”错误.

这是我的代码.我想通过一个网址.

调用模型的组件控制器

ParentController.$inject = ['$uibModal'];

function ParentController $uibModal) {
  var $ctrl = this;

  $ctrl.openComponentModal = function(url) {
    var modalinstance = $uibModal.open({
      animation: false,component: "ImageModalComponent",resolve: {
        url: function() {
          return url;
        }
      }
    });
  };
}

作为模态的组件中的控制器

ImageModalController.$inject = ['url'];

function ImageModalController(url) {
  var $ctrl = this;

  $ctrl.$onInit = function() {
    console.log(url);
  };

}
对于组件,需要将resolve添加到绑定中,然后在隔离范围上提供.换句话说,添加解决方案:’<'在声明组件时. 模态组件
var template = require('./image_modal.component.html');
var ImageModalController = require('./image_modal.controller');

module.exports = {
  template: template,bindings: {
    close: '&',resolve: ‘<‘
  },controller: ImageModalController
};

调用模型的组件控制器

ParentController.$inject = ['$uibModal'];
function ParentController $uibModal){
  var $ctrl = this;

     $ctrl.openComponentModal = function (urlFromClickEvent) {
        var modalinstance = $uibModal.open({
          animation: false,resolve: {
            url: function() {
              return url;
            }
          }
        });
      };
}

作为模态的组件的控制器

ImageModalController.$inject = [];
function ImageModalController() {
  var $ctrl = this;
  
  $ctrl.$onInit = function () {
    console.log($ctrl.resolve.url);
  };
}

angularjs – 如何使用angular js动态设置HTML元素的id属性?

angularjs – 如何使用angular js动态设置HTML元素的id属性?

提供了一个类型为div的HTML元素,如何设置其id属性的值,它是一个scope变量和一个字符串的连接?
ngAttr指令可以完全有帮助,在官方文档中介绍

https://docs.angularjs.org/guide/directive#-ngattr-attribute-bindings
更新:文档移至:https://docs.angularjs.org/guide/interpolation#-ngattr-for-binding-to-arbitrary-attributes

例如,要设置div元素的id属性值,以使其包含索引,视图片段可能包含

<div ng-attr-id="{{ 'object-' + myScopeObject.index }}"></div>

其将被内插到

<div id="object-1"></div>

angularjs – 如何使用Angular Js声明一个全局变量?

angularjs – 如何使用Angular Js声明一个全局变量?

我想要一个可以在所有控制器中使用但不想为它创建一个服务的变量.它可能在角度js?
您可以使用 constants or values.

常量

var app = angular.module('myApp',[]);
app.constant('appName','Application Name');

app.controller('TestCtrl',['appName',function TestCtrl(appName) {
    console.log(appName);
}]);

var app = angular.module('myApp',[]);

app.value('usersOnline',0);
app.controller('TestCtrl',['usersOnline',function TestCtrl(usersOnline) {
    console.log(usersOnline);
    usersOnline = 15;
    console.log(usersOnline);
}]);

http://ilikekillnerds.com/2014/11/constants-values-global-variables-in-angularjs-the-right-way/

我们今天的关于如何使用AngularJs打造权限管理系统【简易型】angular权限控制的分享就到这里,谢谢您的阅读,如果想了解更多关于angularjs – 可以在AngulrJS 1.3.0项目中使用angular / di.js吗?、angularjs – 如何使用Angular 1.5 *组件*和UI Bootstrap模式进行解析、angularjs – 如何使用angular js动态设置HTML元素的id属性?、angularjs – 如何使用Angular Js声明一个全局变量?的相关信息,可以在本站进行搜索。

本文标签: