下载自:https://github.com/aspnetboilerplate/module-zero

打开D:\ABP\module-zero-master\sample里的ModuleZeroSampleProject.sln项目文件,马上还原程序包,试图update-database,报错,说没这个命令。
网上搜了半天,才看到解决方法:
输入set-executionpolicy remotesigned
再输入:
PM> Import-Module D:\ABP\module-zero-master\sample\packages\EntityFramework.6.1.3\tools\EntityFramework.psd1
PM> update-database
终于搞定。

(奇怪的是,重新解压,直接编译,让VS自动还原程序包,就不会出现上面的问题,直接update-database通过)

还有就是别手痒,去更新程序包,我下载的项目里还使用jquery-2.1.3.min.js,一更新就被换成jquery-2.1.4.min.js,但是BundleConfig类里还是2.1.3,没有改2.1.4啊…………

启动ModuleZeroSampleProject.Web项目,使用admin/123qwe登录没有问题。但是如果无输入、乱输入,则没有任何错误提示。

参考http://qasample.aspnetboilerplate.com/示例网站,分明是有错误提示的嘛:

原来还得改Web.config:

<customErrors mode="On" />

一个典型的ABP项目:
 
先看Core项目下的实体:
用户:
User继承的是AbpUser<Tenant, User>
UserManager继承的是AbpUserManager<Tenant, Role, User>
UserStore继承的是AbpUserStore<Tenant, Role, User>
这几个类实际上并无增加内容,仅仅是直接继承而已。需要注意的是User所继承的AbpUser<Tenant, User>使用了子类User作为TUser
角色:
Role继承的是AbpRole<Tenant, User>
RoleStore继承的是AbpRoleStore<Tenant, Role, User>
RoleManager继承的是AbpRoleManager<Tenant, Role, User>
PermissionChecker继承的是PermissionChecker<Tenant, Role, User>
同样,这些子类都没有增加内容。
租户:
Tenant继承的是AbpTenant<Tenant, User>
问题和回答:
Question继承了CreationAuditedEntity<int, User>,表明这个类要求包含创建者信息,后面可以看到需要使用到它的CreatorUser属性。
在数据表Questions里能够发现:
这个字段并没有在Question类里出现,要在CreationAuditedEntity里找:
因为问题和回答是一对多关系,所以有属性:
public virtual ICollection<Answer> Answers { get; set; }
Answer也继承了CreationAuditedEntity<int, User>
注意到有属性IsAccepted
领域服务:QuestionDomainService,继承了DomainService类
这个服务就是放“接受答案”方法的地方:
就是如果已有接受的答案,则找出来,设置为非接受,然后设置传入的答案为已接受。
注意在这个类已经使用了IRepository<Answer>
再看ModuleZeroSampleProject.EntityFramework项目下的ModuleZeroSampleProjectDbContext类
继承的是AbpZeroDbContext<Tenant, Role, User>
声明了:
        public virtual IDbSet<Question> Questions { get; set; }
        public virtual IDbSet<Answer> Answers { get; set; }
但是查看数据库,数据表可不止这两个。
 
再看ModuleZeroSampleProject.Application项目:
ModuleZeroSampleProjectAuthorizationProvider类,继承AuthorizationProvider,声明了几个权限:
创建问题、删除问题、删除答案、回答问题。
 
设置类MySettingProvider,继承SettingProvider,设置了一页显示10条问题。
IUserAppService声明了GetUsers方法,也就是用户列表。
IQuestionAppService声明了
GetQuestions获得所有问题
CreateQuestion创建问题
GetQuestion获取一个问题
VoteUp加1投票
VoteDown减1投票
SubmitAnswer回答问题
AcceptAnswer接受答案
再看实现:QuestionAppService类
GetQuestions方法中,读取了MySettingProvider里的配置:
 input.MaxResultCount = SettingManager.GetSettingValue<int>(MySettingProvider.QuestionsDefaultPageSize);
获取问题列表,需要注意输入的参数为GetQuestionsInput对象,该对象实现了IPagedResultRequest、ISortedResultRequest
看表达式
需要知道,Question类继承了CreationAuditedEntity<int, User>,因而具有CreateUser属性。
这里使用了EF里扩展的Include方法,要求根据外键CreatorUserID来加载创建者
PageBy方法是ABP扩展的一个分页方法。
另外要注意的是automapping:
    [AutoMapFrom(typeof(Question))]
    public class QuestionDto : CreationAuditedEntityDto
QuestionDto 类只有CreatorUserName属性,而没有CreatorUserID属性,但是还能映射:
Items = questions.MapTo<List<QuestionDto>>()
 
CreateQuestion方法:
可以看到CreateQuestion方法前,加了[AbpAuthorize("CanCreateQuestions")] 特性,对权限的验证非常便捷。
异步插入数据的写法:
GetQuestion方法:
跨表查询好狠:
            var question =
                _questionRepository
                    .GetAll()
                    .Include(q => q.CreatorUser)
                    .Include(q => q.Answers)
                    .Include("Answers.CreatorUser")
                    .FirstOrDefault(q => q.Id == input.Id);
SubmitAnswer方法:
使用了 _unitOfWorkManager.Current.SaveChanges();
AcceptAnswer方法:
直接调用了领域服务:_questionDomainService.AcceptAnswer(answer)
 
再看Tests项目对上面服务方法的测试,首先进行注入:
声明一个继承于AbpIntegratedTestBase的类SampleProjectTestBase,其构造函数
 
具体的测试类如UserAppService_Tests,需要继承SampleProjectTestBase
重新生成,就可以运行测试了:
 
Web项目,AccountController类,注意到使用了UserManager、AuthenticationManager
通过HttpContext.GetOwinContext().Authentication获取AuthenticationManager,使用了Owin
UserManager是通过AccountController的构造函数传入的,前者的父类有实现ITransientDependency,所以这里会被自动注入。
使用:
            var loginResult = await _userManager.LoginAsync(
                loginModel.UsernameOrEmailAddress,
                loginModel.Password,
                loginModel.TenancyName
                );
LoginAsync方法:
public virtual Task<AbpUserManager<TTenant, TRole, TUser>.AbpLoginResult> LoginAsync(string userNameOrEmailAddress, string plainPassword, string tenancyName = null)
这方法需要去zero的源码里研究
 
 AuthenticationManager可直接使用其SignIn、SignOut方法:
            AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
            AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = loginModel.RememberMe }, loginResult.Identity);
 
 
HomeController加了 [AbpMvcAuthorize]特性。
 
Startup类可以看到配置,[assembly: OwinStartup(typeof(Startup))]
在Configuration方法里
        public void Configuration(IAppBuilder app)
        {
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login")
            });
            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
        }
    }
详情参考文章
Code! MVC 5 App with Facebook, Twitter, LinkedIn and Google OAuth2 Sign-on (C#)http://www.asp.net/mvc/overview/security/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on

ABP的Zero Sample的更多相关文章

  1. ABP 极简入门教程(一)

    本示例不讲概念,只讲怎么用,概念性的内容没有比官方文档更清楚的了,我也正在学习,可能理解的地方有不对的欢迎一起交流,但需要您了解以下内容才能看明白 asp.net core Entity Framew ...

  2. abp zero sample

    测试运行地址:http://ghy.demo.aspnetzero.com 账号:admin  密码:123456 需要源码,请加QQ:858-048-581 一.用户管理 二.日志记录 1.先编译成 ...

  3. ABP文档 - 本地化

    文档目录 本节内容: 简介 应用语言 本地化源 XML文件 注册XML本地化源 JSOn文件 注册JSON本地化源 资源文件 自定义源 获取一个本地文本 在服务端 在MVc控制器里 在MVC视图里 在 ...

  4. ABP文档 - 异常处理

    文档目录 本节内容: 简介 启用错误处理 非AJAX请求 显示异常 UserFriendlyException Error 模型 AJAX 请求 异常事件 简介 这个文档针对Asp.net Mvc和W ...

  5. ABP(现代ASP.NET样板开发框架)系列之8、ABP日志管理

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之8.ABP日志管理 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  6. ABP(现代ASP.NET样板开发框架)系列之23、ABP展现层——异常处理

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之23.ABP展现层——异常处理 ABP是“ASP.NET Boilerplate Project (ASP.NET ...

  7. ABP框架 - 日志

    文档目录 本节内容: 服务端 获取Logger(记录器) Logger的基类 配置 Abp.Castle.Log4Net 包 客户端 服务端 ABP使用Castle Windsor的日志记录工具,它可 ...

  8. ABP框架 - 功能管理

    文档目录 本节内容: 简介 关于 IFeatureValueStore 功能类型 Boolean 功能 Value 功能 定义功能 基本功能属性 其它功能属性 功能层次 检查功能 使用Requires ...

  9. Abp集成Swagger的最佳实践

    1.在项目中添加nuget包 Abp.Web.Api.SwaggerTool 2.在项目Abp模块的DependsOn添加AbpWebApiSwaggerToolModule Run It,启动项目, ...

随机推荐

  1. Spring MVC中使用 Swagger2 构建Restful API

    1.Spring MVC配置文件中的配置 [java] view plain copy <!-- 设置使用注解的类所在的jar包,只加载controller类 --> <contex ...

  2. JavaScript引用方法说明

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. HBase使用场景和成功案例 (转)

    HBase 使用场景和成功案例 有时候了解软件产品的最好方法是看看它是怎么用的.它可以解决什么问题和这些解决方案如何适用于大型应用架构,能够告诉你很多.因为HBase有许多公开的产品部署,我们正好可以 ...

  4. c# Wndproc的使用方法

    protected override void WndProc(ref Message m) { const int WM_SYSCOMMAND = 0x0112; const int SC_CLOS ...

  5. bootstrap-图文混排 media

    <!-- media 图文混排 media-left(right) 图片的区域 在左边显示(右边) media-body 内容区域 media-heading 内容区域里的标题 media-mi ...

  6. ArcGIS Engine要素渲染和专题图制作(转)

    摘要:Feature的常用的绘制方法包括:1.简单绘制:2.唯一值绘制/多字段唯一值绘制:3.点密度/多字段点密度绘制:4.数据分级绘制:5.质量图(饼图/直方图): 6.按比例尺渲染:7.比例符号渲 ...

  7. 继承自NSObject的不常用又很有用的函数(2)

    函数调用 Objective-C是一门动态语言,一个函数是由一个selector(SEL),和一个implement(IML)组成的.Selector相当于门牌号,而Implement才是真正的住户( ...

  8. Esfog_UnityShader教程_镜面反射SpecularReflection

    系列教程第四篇,本来打算昨天写的,有些小偷懒就今天写了,这一期我们来讨论一下关于镜面反射的基本原理和具体代码.这一篇是承接着上一篇<Esfog_UnityShader教程_漫反射DiffuseR ...

  9. ForeignKey 的第二个位置参数on_delete

    on_delete指的是通过ForeignKey连接起来的对象被删除后,当前字段怎么变化. 常见的选项有: models.CASCADE,对就对象删除后,包含ForeignKey的字段也会被删除 mo ...

  10. 性能测试框架Locust初学笔记

    Locust初探 Locust是一款类似于Jmeter开源负载测试工具,所不同的是它是用python实现,并支持python脚本. locust提供web ui界面,能够方便用户实时监控脚本运行状态. ...