下载自: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

最新文章

  1. 操作系统篇-hello world(免系统运行程序)
  2. html drag api 在firefox 下 拖动出现新窗口的解决办法
  3. 让一个图片在div中居中(四种方法)
  4. CSS系列:CSS中盒子之间的关系
  5. HIbernate实现增、删、改、查。
  6. 94. Binary Tree Inorder Traversal
  7. [Bootstrap]全局样式(五)
  8. mssql触发器demo
  9. LeeCode-Spiral Matrix II
  10. 微信小程序Server端环境配置
  11. Windows下GIT安装与使用(上传远程端)
  12. 【JAVA零基础入门系列】Day9 Java中的那个大数值
  13. 团队第七次 # scrum meeting
  14. How Tomcat works — 一、怎样阅读源码
  15. CentOS7 vi编辑命令【转】
  16. SQLServer 里面的 DDL,DML,DCL,TCL
  17. Android屏幕适配工具
  18. 20155229 《信息安全系统设计基础》 Mypwd实现
  19. WAMP设置默认访问目录
  20. gitlab-runner ---CI

热门文章

  1. 国内首家VR虚拟现实主题公园即将在北京推出
  2. jQuery入门级part.1
  3. 【学+原】CSS3的2D动画 ——仿NOMOS手表
  4. ADF_Data Binding系列2_使用URL Service Data Control
  5. Handler基本概念
  6. Mobile Web调试工具Weinre (reproduce)
  7. Spring Boot CLI安装
  8. 【解决】SharePoint集成模式下Reporting Service—为用户授予的权限不足,无法执行此操作。 (rsAccessDenied)
  9. XE6移动开发环境搭建之IOS篇(9):配置XE6的IOS SDK(有图有真相)
  10. 制作HP MicroServer Gen8可用的ESXi 5.x SD/TF卡启动盘