@ -1,5 +1,13 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"Account": "账户", |
|||
"Welcome": "欢迎", |
|||
"UseOneOfTheFollowingLinksToContinue": "使用下面的链接继续", |
|||
"FrameworkHomePage": "框架首页", |
|||
"FrameworkDocumentation": "框架文档", |
|||
"OfficialBlog": "官方博客", |
|||
"CommercialHomePage": "商业版首页", |
|||
"CommercialSupportWebSite": "商业版支持网站" |
|||
} |
|||
} |
|||
@ -1,5 +1,60 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"Permission:NpmPackages": "NPM包", |
|||
"Permission:NugetPackages": "Nuget包", |
|||
"Permission:Maintenance": "维护", |
|||
"Permission:Maintain": "维护", |
|||
"Permission:ClearCaches": "清除缓存", |
|||
"Permission:Modules": "模块", |
|||
"Permission:Packages": "包", |
|||
"Permission:Edit": "编辑", |
|||
"Permission:Delete": "删除", |
|||
"Permission:Create": "创建", |
|||
"Menu:Packages": "包", |
|||
"NpmPackageDeletionWarningMessage": "该NPM包将会被删除. 你确定吗?", |
|||
"NugetPackageDeletionWarningMessage": "该Nuget包将会被删除. 你确定吗?", |
|||
"ModuleDeletionWarningMessage": "该模块将会被删除. 你确定吗?", |
|||
"Name": "名称", |
|||
"DisplayName": "显示名称", |
|||
"ShortDescription": "简述", |
|||
"NameFilter": "名称", |
|||
"CreationTime": "创建时间", |
|||
"IsPro": "是否为专业版", |
|||
"EfCoreConfigureMethodName": "配置方法法", |
|||
"IsProFilter": "是否为专业版", |
|||
"ApplicationType": "应用程序类型", |
|||
"Target": "目标", |
|||
"TargetFilter": "目标", |
|||
"ModuleClass": "模块分类", |
|||
"NugetPackageTarget.DomainShared": "Domain Shared", |
|||
"NugetPackageTarget.Domain": "Domain", |
|||
"NugetPackageTarget.Application": "Application", |
|||
"NugetPackageTarget.ApplicationContracts": "Application Contracts", |
|||
"NugetPackageTarget.HttpApi": "Http Api", |
|||
"NugetPackageTarget.HttpApiClient": "Http Api Client", |
|||
"NugetPackageTarget.Web": "Web", |
|||
"NugetPackageTarget.EntityFrameworkCore": "EntityFramework Core", |
|||
"NugetPackageTarget.MongoDB": "MongoDB", |
|||
"Edit": "编辑", |
|||
"Delete": "删除", |
|||
"Refresh": "刷新", |
|||
"NpmPackages": "NPM包", |
|||
"NugetPackages": "Nuget包", |
|||
"NpmPackageCount": "NPM包数量", |
|||
"NugetPackageCount": "Nuget包数量", |
|||
"Module": "模块", |
|||
"ModuleInfo": "模块信息", |
|||
"CreateANpmPackage": "创建NPM包", |
|||
"CreateAModule": "创建模块", |
|||
"CreateANugetPackage": "创建Nuget包", |
|||
"AddNew": "新建", |
|||
"PackageAlreadyExist{0}": "\"{0}\"已经被添加.", |
|||
"ClearCache": "清除缓存", |
|||
"SuccessfullyCleared": "清除成功", |
|||
"Menu:NpmPackages": "NPM包", |
|||
"Menu:Modules": "模块", |
|||
"Menu:Maintenance": "维护", |
|||
"Menu:NugetPackages": "Nuget包" |
|||
} |
|||
} |
|||
@ -1,12 +1,31 @@ |
|||
{ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"Volo.AbpIo.Domain:010004": "超过最大成员数!", |
|||
"Volo.AbpIo.Domain:010005": "超过最大所有者数!", |
|||
"Volo.AbpIo.Domain:010006": "T用户已经是该组织的所有者!", |
|||
"Volo.AbpIo.Domain:010006": "用户已经是该组织的所有者!", |
|||
"Volo.AbpIo.Domain:010007": "该用户已经是该组织的开发者!", |
|||
"Volo.AbpIo.Domain:010008": "允许的开发者数量不能低于当前开发者数量!", |
|||
"Volo.AbpIo.Domain:010009": "允许的开发者数量不能小于零!", |
|||
"Volo.AbpIo.Domain:010010": "超出了最大mac地址数!" |
|||
"Volo.AbpIo.Domain:010010": "超出了最大mac地址数!", |
|||
"Volo.AbpIo.Domain:010011": "个人许可不允许超过1个开发者!", |
|||
"Volo.AbpIo.Domain:010012": "许可过期后许可不可延长1个月!", |
|||
"Volo.AbpIo.Domain:020001": "不能删除该NPM包因为\"{NugetPackages}\"Nuget包依赖此包.", |
|||
"Volo.AbpIo.Domain:020002": "不能删除该NPM包因为\"{Modules}\"模块正在使用此包.", |
|||
"Volo.AbpIo.Domain:020003": "不能删除该NPM包因为\"{Modules}\"模块正在使用此包并且\"{NugetPackages}\"Nuget包依赖此包.", |
|||
"Volo.AbpIo.Domain:020004": "不能删除该Nuget包因为\"{Modules}\"模块正在使用此包.", |
|||
"WantToLearn?": "想学习吗?", |
|||
"ReadyToGetStarted?": "准备开始了吗?", |
|||
"JoinOurCommunity": "加入我们的社区", |
|||
"GetStartedUpper": "开始", |
|||
"ForkMeOnGitHub": "Fork me on GitHub", |
|||
"Features": "功能", |
|||
"GetStarted": "开始", |
|||
"Documents": "文档", |
|||
"Community": "社区", |
|||
"ContributionGuide": "贡献指南", |
|||
"Blog": "博客", |
|||
"Commercial": "商业版", |
|||
"SeeDocuments": "查看文档" |
|||
} |
|||
} |
|||
} |
|||
@ -1,30 +1,30 @@ |
|||
{ |
|||
"culture": "pt-BR", |
|||
"texts": { |
|||
"OrganizationManagement": "Gerenciamento da organização", |
|||
"OrganizationList": "Lista de organização", |
|||
"Volo.AbpIo.Commercial:010003": "Você não é proprietário desta organização!", |
|||
"OrganizationNotFoundMessage": "Nenhuma organização encontrada!", |
|||
"DeveloperCount": "Número de desenvolvedores", |
|||
"Owners": "Proprietários", |
|||
"OrganizationManagement": "Gerenciamento da organização", |
|||
"OrganizationList": "Lista de organização", |
|||
"Volo.AbpIo.Commercial:010003": "Você não é proprietário desta organização!", |
|||
"OrganizationNotFoundMessage": "Nenhuma organização encontrada!", |
|||
"DeveloperCount": "Número de desenvolvedores", |
|||
"Owners": "Proprietários", |
|||
"AddMember": "Adicionar membro", |
|||
"AddOwner": "Adicionar proprietário", |
|||
"AddOwner": "Adicionar proprietário", |
|||
"AddDeveloper": "Adicionar desenvolvedor", |
|||
"UserName": "Nome de usuário", |
|||
"UserName": "Nome de usuário", |
|||
"Name": "Nome", |
|||
"EmailAddress": "Endereço de email", |
|||
"EmailAddress": "Endereço de email", |
|||
"Developers": "Desenvolvedores", |
|||
"LicenseType": "Tipo de licença", |
|||
"LicenseType": "Tipo de licença", |
|||
"Manage": "Gerenciar", |
|||
"StartDate": "Data de início", |
|||
"StartDate": "Data de início", |
|||
"EndDate": "Data final", |
|||
"Modules": "Módulos", |
|||
"LicenseExtendMessage": "A data de término da sua licença foi estendida para {0}", |
|||
"LicenseUpgradeMessage": "Sua licença foi atualizada para {0}", |
|||
"LicenseAddDeveloperMessage": "{0} desenvolvedores adicionados à sua licença", |
|||
"Volo.AbpIo.Commercial:010004": "Não foi possível encontrar o usuário especificado! O usuário já deve ter se registrado.", |
|||
"MyOrganizations": "Minhas organizações", |
|||
"Modules": "Módulos", |
|||
"LicenseExtendMessage": "A data de término da sua licença foi estendida para {0}", |
|||
"LicenseUpgradeMessage": "Sua licença foi atualizada para {0}", |
|||
"LicenseAddDeveloperMessage": "{0} desenvolvedores adicionados à sua licença", |
|||
"Volo.AbpIo.Commercial:010004": "Não foi possível encontrar o usuário especificado! O usuário já deve ter se registrado.", |
|||
"MyOrganizations": "Minhas organizações", |
|||
"ApiKey": "Chave da API", |
|||
"UserNameNotFound": "Não há usuário com nome de usuário {0}" |
|||
"UserNameNotFound": "Não há usuário com nome de usuário {0}" |
|||
} |
|||
} |
|||
@ -1,5 +1,160 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"GetStarted": "开始", |
|||
"Create": "创建", |
|||
"NewProject": "新工程", |
|||
"DirectDownload": "直接下载", |
|||
"ProjectName": "项目名称", |
|||
"ProjectType": "项目类型", |
|||
"DatabaseProvider": "数据库提供者", |
|||
"NTier": "N层", |
|||
"IncludeUserInterface": "包含用户界面", |
|||
"CreateNow": "现在创建", |
|||
"TheStartupProject": "启动项目", |
|||
"Tutorial": "教程", |
|||
"UsingCLI": "使用CLI", |
|||
"SeeDetails": "见详细", |
|||
"AbpShortDescription": "ABP是用于创建现代Web应用程序的完整架构和强大的基础设施! 遵循最佳实践和约定,为你提供SOLID开发经验.", |
|||
"SourceCodeUpper": "源代码", |
|||
"LatestReleaseLogs": "最新发布日志", |
|||
"Infrastructure": "基础设施", |
|||
"Architecture": "架构", |
|||
"Modular": "模块化", |
|||
"DontRepeatYourself": "不要重复工作", |
|||
"DeveloperFocused": "专注于开发者", |
|||
"FullStackApplicationInfrastructure": "全栈应用程序基础设施", |
|||
"DomainDrivenDesign": "领域驱动设计", |
|||
"DomainDrivenDesignExplanation": "根据DDD模式和准则进行设计和开发. 为你的应用程序提供分层模型.", |
|||
"Authorization": "授权", |
|||
"AuthorizationExplanation": "具有用户,角色和细粒度权限系统的高级授权. 建立在Microsoft Identity库上.", |
|||
"MultiTenancy": "多租户", |
|||
"MultiTenancyExplanation": "SaaS应用程序变得简单! 从数据库到UI的多租户集成.", |
|||
"CrossCuttingConcerns": "横切关注点", |
|||
"CrossCuttingConcernsExplanation": "完整的基础架构,用于授权,验证,异常处理,缓存,审计日志记录,事务管理等.", |
|||
"BuiltInBundlingMinification": "内置Bundling & Minification", |
|||
"BuiltInBundlingMinificationExplanation": "无需使用外部工具进行Bundling & Minification. ABP提供了一种更简单,动态,功能强大,模块化和内置的方式!", |
|||
"VirtualFileSystem": "虚拟文件系统", |
|||
"VirtualFileSystemExplanation": "将视图,脚本,样式,图像...嵌入到包/库中,并在不同的应用程序中重复使用.", |
|||
"Theming": "主题", |
|||
"ThemingExplanation": "使用和定制基于bootstrap的标准UI主题,或创建自己的主题.", |
|||
"BootstrapTagHelpersDynamicForms": "Bootstrap Tag Helpers和动态表单", |
|||
"BootstrapTagHelpersDynamicFormsExplanation": "内置的后台作业系统可以集成到Hangfire,RabbitMQ或您喜欢的任何工具中.", //TODO explanation doesn't match. |
|||
"HTTPAPIsDynamicProxies": "HTTP APIs和动态代理", |
|||
"HTTPAPIsDynamicProxiesExplanation": "自动将应用程序服务公开为REST样式的HTTP API,并与动态JavaScript和C#代理一起使用.", |
|||
"CompleteArchitectureInfo": "现代架构用来创建可维护的软件解决方案.", |
|||
"DomainDrivenDesignBasedLayeringModelExplanation": "帮助你实现基于DDD的分层架构并构建可维护的代码库.", |
|||
"DomainDrivenDesignBasedLayeringModelExplanationCont": "提供启动模板,抽象,基类,服务,文档和指南以帮助你开发基于DDD模式和准则的应用程序.", |
|||
"MicroserviceCompatibleModelExplanation": "核心框架和预构建模块在设计时就考虑了微服务架构.", |
|||
"MicroserviceCompatibleModelExplanationCont": "提供基础结构,集成,示例和文档,以更轻松地实现微服务解决方案,而如果你要使用整体应用程序,也不会带来额外的复杂性.", |
|||
"ModularInfo": "ABP提供了完整的模块化系统,使你能够开发可重复使用的应用程序模块.", |
|||
"PreBuiltModulesThemes": "预构建模块和主题", |
|||
"PreBuiltModulesThemesExplanation": "开源和商业模块和主题已准备好在你的业务应用程序中使用.", |
|||
"NuGetNPMPackages": "NuGet和NPM包", |
|||
"NuGetNPMPackagesExplanation": "作为NuGet和NPM包分发.易于安装和升级.", |
|||
"ExtensibleReplaceable": "可扩展/可替换", |
|||
"ExtensibleReplaceableExplanation": "所有服务和模块在设计时都考虑了可扩展性.您可以替换服务,页面,样式,组件...", |
|||
"CrossCuttingConcernsExplanation2": "保持代码整洁,专注于你自己的业务代码.", |
|||
"CrossCuttingConcernsExplanation3": "不要浪费时间一次又一次地实现通用的应用程序要求.", |
|||
"AuthenticationAuthorization": "认证与授权", |
|||
"ExceptionHandling": "异常处理", |
|||
"Validation": "验证", |
|||
"DatabaseConnection": "数据库连接", |
|||
"TransactionManagement": "事务管理", |
|||
"AuditLogging": "审计日志", |
|||
"Caching": "缓存", |
|||
"Multitenancy": "多租户", |
|||
"DataFiltering": "数据过滤", |
|||
"ConventionOverConfiguration": "约定优于配置", |
|||
"ConventionOverConfigurationExplanation": "默认情况下,ABP使用最小或零配置实现通用的应用程序约定.", |
|||
"ConventionOverConfigurationExplanationList1": "自动注册已知服务以进行依赖项注入.", |
|||
"ConventionOverConfigurationExplanationList2": "通过命名约定将应用程序服务公开为HTTP API.", |
|||
"ConventionOverConfigurationExplanationList3": "为C#和JavaScript创建动态HTTP客户端代理.", |
|||
"ConventionOverConfigurationExplanationList4": "为您的实体提供默认仓储库.", |
|||
"ConventionOverConfigurationExplanationList5": "根据Web请求或应用程序服务方法管理工作单元.", |
|||
"ConventionOverConfigurationExplanationList6": "为实体发布创建,更新和删除事件.", |
|||
"BaseClasses": "基类", |
|||
"BaseClassesExplanation": "通用应用程序模式的预构建基类.", |
|||
"DeveloperFocusedExplanation": "ABP是为了开发者", |
|||
"DeveloperFocusedExplanationCont": "它旨在简化你的日常软件开发,同时又不限制你在需要时进行底层工作。", |
|||
"SeeAllFeatures": "查看所有功能", |
|||
"CLI_CommandLineInterface": "CLI (命令行界面)", |
|||
"CLI_CommandLineInterfaceExplanation": "CLI会自动创建新项目并将模块添加到你的应用程序.", |
|||
"StartupTemplates": "启动模板", |
|||
"StartupTemplatesExplanation": "各种启动模板为你提供了完整配置的解决方案,以快速启动你的开发.", |
|||
"BasedOnFamiliarTools": "基于熟悉的工具", |
|||
"BasedOnFamiliarToolsExplanation": "建立在你已经知道的流行工具之上并与之集成.学习曲线低,适应性强,舒适的开发.", |
|||
"ORMIndependent": "ORM独立", |
|||
"ORMIndependentExplanation": "核心框架独立于ORM/数据库,并且可以与任何数据源一起使用.Entity Framework Core和MongoDB提供程序已经可用.", |
|||
"Features": "功能", |
|||
"ABPCLI": "ABP CLI", |
|||
"Modularity": "模块化", |
|||
"BootstrapTagHelpers": "Bootstrap Tag Helpers", |
|||
"DynamicForms": "动态表单", |
|||
"BundlingMinification": "Bundling & Minification", |
|||
"BackgroundJobs": "后台作业", |
|||
"DDDInfrastructure": "DDD基础设施", |
|||
"DomainDrivenDesignInfrastructure": "Domain Driven Design基础设施", |
|||
"AutoRESTAPIs": "自动REST APIs", |
|||
"DynamicClientProxies": "动态客户端代理", |
|||
"DistributedEventBus": "分布式事件总线", |
|||
"DistributedEventBusWithRabbitMQIntegration": "具有RabbitMQ集成的分布式事件总线", |
|||
"TestInfrastructure": "测试基础设施", |
|||
"AuditLogging": "审计日志", |
|||
"AuditLoggingEntityHistories": "审计日志和实体历史", |
|||
"ObjectToObjectMapping": "对象映射", |
|||
"EmailSMSAbstractions": "电子邮件和短信抽象", |
|||
"EmailSMSAbstractionsWithTemplatingSupport": "具有模板支持的电子邮件和短信抽象", |
|||
"Localization": "本土化", |
|||
"SettingManagement": "设置管理", |
|||
"ExtensionMethods": "扩展方法", |
|||
"ExtensionMethodsHelpers": "扩展方法和助手", |
|||
"AspectOrientedProgramming": "面向切面的编程", |
|||
"DependencyInjection": "依赖注入", |
|||
"DependencyInjectionByConventions": "依据约定的依赖注入", |
|||
"ABPCLIExplanation": "ABP CLI(命令行界面)是用于对ABP解决方案执行常见操作的命令行工具.", |
|||
"ModularityExplanation": "ABP提供了一个完整的基础设施来构建你自己的应用程序模块,这些模块可能具有实体,服务,数据库集成,API,UI组件等.", //TODO: strong "your own application modules",- |
|||
"MultiTenancyExplanation": "ABP框架不仅支持开发多租户应用程序,而且使你的代码几乎无需知道多租户.", |
|||
"MultiTenancyExplanation2": "可以自动确定当前租户,将不同租户的数据相互隔离.", |
|||
"MultiTenancyExplanation3": "支持单一数据库,或每个租户单独数据库或者混合方式.", |
|||
"MultiTenancyExplanation4": "你专注于业务代码,并让该框架为你处理多租户.", |
|||
"BootstrapTagHelpersExplanation": "与其手动编写重复细节的bootstrap组件,不如使用ABP的tag helper来简化它并利用智能感知.你当然也可以在需要时直接使用Bootstrap.", |
|||
"DynamicFormsExplanation": "动态表单和tag helpers可从作为模型的C#类创建完整的表单.", |
|||
"AuthenticationAuthorizationExplanation": "集成到ASP.NET Core Identity和IdentityServer4的丰富身份验证和授权选项.提供可扩展且详细的权限系统.", |
|||
"CrossCuttingConcernsExplanation": "不要重复自己一次又一次地实现所有这些常见的东西.专注于你的业务代码,并让ABP按照约定自动执行.", |
|||
"DatabaseConnectionTransactionManagement": "数据库连接和事务管理", |
|||
"CorrelationIdTracking": "关联ID跟踪", |
|||
"BundlingMinificationExplanation": "ABP提供了一个简单,动态,功能强大,模块化的内置Bundling & Minification系统.", |
|||
"VirtualFileSystemnExplanation": "虚拟文件系统使管理文件系统(磁盘)上不存在的文件成为可能.它主要用于将(js,css,image,cshtml...)文件嵌入到程序集中,并在运行时像物理文件一样使用它们.", |
|||
"ThemingExplanation": "主题系统允许通过基于最新的Bootstrap框架定义一组通用基础库和布局来独立开发应用程序和模块主题.", |
|||
"DomainDrivenDesignInfrastructureExplanation": "基于域驱动设计模式和准则构建分层应用程序的完整基础设施;", |
|||
"Specification": "规范", |
|||
"Repository": "仓储", |
|||
"DomainService": "领域服务", |
|||
"ValueObject": "值对象", |
|||
"ApplicationService": "应用程序服务", |
|||
"DataTransferObject": "数据传输对象", |
|||
"AggregateRootEntity": "聚合根, 实体", |
|||
"AutoRESTAPIsExplanation": "ABP可以按照约定自动将你的应用程序服务配置为API控制器.", |
|||
"DynamicClientProxiesExplanation": "从JavaScript和C#客户端轻松使用你的API.", |
|||
"DistributedEventBusWithRabbitMQIntegrationExplanation": "使用带有RabbitMQ集成的内置分布式事件总线,可以轻松发布和使用分布式事件.", |
|||
"TestInfrastructureExplanation": "框架已经考虑了单元和集成测试.为你提供基类,使其更容易.启动模板已预先配置用于测试.", |
|||
"AuditLoggingEntityHistoriesExplanation": "针对关键业务应用程序的内置审计日志记录.请求,服务,方法级别的审计日志记录以及具有属性级别详细信息的实体历史记录.", |
|||
"EmailSMSAbstractionsWithTemplatingSupportExplanation": "IEmailSender和ISmsSender抽象使你的应用程序逻辑与基础设施解耦.先进的电子邮件模板系统允许创建和本地化电子邮件模板,并在需要时轻松使用.", |
|||
"LocalizationExplanation": "本地化系统允许在纯JSON文件中创建资源,并使用它们来本地化UI.它支持继承,扩展和JavaScript集成等高级方案,同时与AspNet Core的本地化系统完全兼容.", |
|||
"SettingManagementExplanation": "定义应用程序的设置,并根据当前配置,租户和用户在运行时获取值.", |
|||
"ExtensionMethodsHelpersExplanation": "即使是琐碎的代码部分,也不要重复.标准类型的扩展方法和助手使你的代码更加清晰和易于编写.", |
|||
"AspectOrientedProgrammingExplanation": "提供合适的基础设施来创建动态代理并实现面向切面的编程.拦截任何类,并在每次方法执行之前和之后执行代码.", |
|||
"DependencyInjectionByConventionsExplanation": "无需手动注册类以进行依赖项注入.按照约定自动注册常用服务类型.对于其他类型的服务,你可以使用接口和属性来使其变得更轻松和就位.", |
|||
"DataFilteringExplanation": "定义和使用数据过滤器,这些过滤器在你从数据库中查询实体时会自动应用.当你实现简单的接口时,可立即使用软删除功能和多租户过滤器.", |
|||
"PublishEvents": "发布事件", |
|||
"HandleEvents": "处理事件", |
|||
"AndMore": "更多...", |
|||
"Code": "编码", |
|||
"Result": "结果", |
|||
"SeeTheDocumentForMoreInformation": "查看<a href=\"{1}\">{0} 文档</a>获得更多信息", |
|||
"IndexPageHeroSection": "<span class=\"third-line shine2\"><strong>asp.net core的</strong></span><span class=\"first-line shine\"><strong>开源</strong></span><span class=\"second-line text-uppercase\">Web应用程序<br />框架 </span>", |
|||
"UiFramework": "UI框架", |
|||
"EmailAddress": "电子邮件地址" |
|||
} |
|||
} |
|||
@ -0,0 +1,29 @@ |
|||
# ABP v1.0 Has Been Finally Released! |
|||
|
|||
 |
|||
|
|||
Today is the big day! After ~3 years of continuous development, first stable ABP release, 1.0, has been released. Thanks to everyone contributed to the project or tried it so far. |
|||
|
|||
Start playing with the new ABP framework now: [abp.io/get-started](https://abp.io/get-started) |
|||
|
|||
 |
|||
|
|||
Here, a few GitHub & NuGet statistics about the project: |
|||
|
|||
* 2,360 stars. |
|||
* 5,917 commits. |
|||
* 72 contributors. |
|||
* 1,136 issues were closed, 276 open. |
|||
* 566 PRs were closed, 5 open. |
|||
* 39 releases. |
|||
* 122,795 downloads on NuGet. |
|||
|
|||
There was an excellent demand even before the first release. |
|||
|
|||
## Road Map |
|||
|
|||
The first priority is to complete the documentation, since there are still a lot of missing documents for the framework features & the modules. Then we will continue to work on the issues on GitHub, based on the labeled priorities. |
|||
|
|||
See the [GitHub milestone items](https://github.com/abpframework/abp/milestones). |
|||
|
|||
ABP is a community-driven project. So, we are prioritizing the issues mostly based on the community feedback and demand. |
|||
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 66 KiB |
@ -0,0 +1,3 @@ |
|||
# abp.auth JavaScript API |
|||
|
|||
TODO |
|||
@ -0,0 +1,24 @@ |
|||
# JavaScript API |
|||
|
|||
ABP为ASP.NET Core MVC / Razor页面应用程序提供了一些执行客户端常见需求的JavaScrpt Api. |
|||
|
|||
## APIs |
|||
|
|||
* abp.ajax |
|||
* [abp.auth](Auth.md) |
|||
* abp.currentUser |
|||
* abp.dom |
|||
* abp.event |
|||
* abp.features |
|||
* abp.localization |
|||
* abp.log |
|||
* abp.ModalManager |
|||
* abp.notify |
|||
* abp.security |
|||
* abp.setting |
|||
* abp.ui |
|||
* abp.utils |
|||
* abp.ResourceLoader |
|||
* abp.WidgetManager |
|||
* Other APIs |
|||
|
|||
@ -0,0 +1,370 @@ |
|||
# 授权 |
|||
|
|||
授权用于在应用程序中判断是否允许用户执行某些特定的操作. |
|||
|
|||
ABP扩展了[ASP.NET Core 授权](https://docs.microsoft.com/zh-cn/aspnet/core/security/authorization/introduction), 将 **权限** 添加为自动[策略](https://docs.microsoft.com/zh-cn/aspnet/core/security/authorization/policies)并且使授权系统在 **[应用服务](Application-Services.md)** 同样可用. |
|||
|
|||
所以ASP.NET Core授权的功能特性和它的文档在基于ABP的应用程序是可用的. |
|||
本文中着重介绍在ASP.NET Core授权功能基础上添加的功能. |
|||
|
|||
## Authorize Attribute |
|||
|
|||
ASP.NET Core 定义了 [**Authorize**](https://docs.microsoft.com/zh-cn/aspnet/core/security/authorization/simple) attribute 用于在控制器,控制器方法以及页面上授权. 现在ABP将它带到了[应用服务](Application-Services.md). |
|||
|
|||
示例: |
|||
|
|||
````csharp |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.AspNetCore.Authorization; |
|||
using Volo.Abp.Application.Services; |
|||
|
|||
namespace Acme.BookStore |
|||
{ |
|||
[Authorize] |
|||
public class AuthorAppService : ApplicationService, IAuthorAppService |
|||
{ |
|||
public Task<List<AuthorDto>> GetListAsync() |
|||
{ |
|||
... |
|||
} |
|||
|
|||
[AllowAnonymous] |
|||
public Task<AuthorDto> GetAsync(Guid id) |
|||
{ |
|||
... |
|||
} |
|||
|
|||
[Authorize("BookStore_Author_Create")] |
|||
public Task CreateAsync(CreateAuthorDto input) |
|||
{ |
|||
... |
|||
} |
|||
} |
|||
} |
|||
|
|||
```` |
|||
|
|||
* `Authorize` attribute 使用户必须登陆到应用程序才可以访问 `AuthorAppService` 中的方法. 所以`GetListAsync` 方法仅可用于通过身份验证的用户. |
|||
* `AllowAnonymous` 禁用身份验证. 所以 `GetAsync` 方法任何人都可以访问,包括未授权的用户. |
|||
* `[Authorize("BookStore_Author_Create")]` 定义了一个策略 (参阅 [基于策略的授权](https://docs.microsoft.com/zh-cn/aspnet/core/security/authorization/policies)),它用于检查当前用户的权限. |
|||
|
|||
"BookStore_Author_Create" 是一个策略名称. 如果你想要使用策略的授权方式,需要在ASP.NET Core授权系统中预先定义它. |
|||
|
|||
你可以按照ASP.NET Core文档进行实施策略授权,但对于简单的 `true/false` 条件(比如是否授予了用户策略) ABP定义了权限系统,在下一部分中会进行讲解. |
|||
|
|||
## 权限系统 |
|||
|
|||
权限系统是为特定用户,角色或客户端授权或禁止的简单策略. |
|||
|
|||
### 定义权限 |
|||
|
|||
创建一个继承自 `PermissionDefinitionProvider` 的类,如下所示: |
|||
|
|||
````csharp |
|||
using Volo.Abp.Authorization.Permissions; |
|||
|
|||
namespace Acme.BookStore.Permissions |
|||
{ |
|||
public class BookStorePermissionDefinitionProvider : PermissionDefinitionProvider |
|||
{ |
|||
public override void Define(IPermissionDefinitionContext context) |
|||
{ |
|||
var myGroup = context.AddGroup("BookStore"); |
|||
|
|||
myGroup.AddPermission("BookStore_Author_Create"); |
|||
} |
|||
} |
|||
} |
|||
```` |
|||
|
|||
> ABP会自动发现这个类,不需要进行配置! |
|||
|
|||
你需要在 `Define` 方法中添加**权限组**或者获取已存在的权限组,并向权限组中添加**权限**. |
|||
|
|||
在定义权限后就可以在ASP.NET Core权限系统中当做**策略**名称使用. 在角色的权限管理模态框中同样可以看到: |
|||
|
|||
 |
|||
|
|||
* 左边的选项卡显示了 "BookStore" 权限组. |
|||
* 右侧的 "BookStore_Author_Create" 是权限名称,在这里可以为角色授权或禁止. |
|||
|
|||
保存后更改会持久化到数据库并在授权系统使用. |
|||
|
|||
> 只有在你安装了identity模块时,才会出现上图中的管理对话框. 该模块用于用户和角色的. 启动模板中已经预装identity模块. |
|||
|
|||
#### 本地化权限名称 |
|||
|
|||
"BookStore_Author_Create" 名称对于权限系统来说很适合,但对于UI展示会让操作人员费解. 幸运的是 `AddPermission` 和 `AddGroup` 方法提供了 `LocalizableString` 参数: |
|||
|
|||
````csharp |
|||
var myGroup = context.AddGroup( |
|||
"BookStore", |
|||
LocalizableString.Create<BookStoreResource>("BookStore") |
|||
); |
|||
|
|||
myGroup.AddPermission( |
|||
"BookStore_Author_Create", |
|||
LocalizableString.Create<BookStoreResource>("Permission:BookStore_Author_Create") |
|||
); |
|||
```` |
|||
|
|||
然后在本地化文档中对 "BookStore" 和 "Permission:BookStore_Author_Create" 键添加本地化语言: |
|||
|
|||
````json |
|||
"BookStore": "Book Store", |
|||
"Permission:BookStore_Author_Create": "Creating a new author" |
|||
```` |
|||
|
|||
> 有关更多信息请参阅[本地化系统文档](Localization.md). |
|||
|
|||
下图展示了本地化后的效果: |
|||
|
|||
 |
|||
|
|||
#### 多租户 |
|||
|
|||
权限系统同样支持在ABP中做为一等公民的 [多租户](Multi-Tenancy.md). 在定义新权限时可以设置多租户选项. 有下面三个值: |
|||
|
|||
* **Host**: 权限仅适用于宿主. |
|||
* **Tenant**: 权限仅适用于租户. |
|||
* **Both** (默认): 权限适用与宿主和租户. |
|||
|
|||
> 如果你的应用程序不是多租户的,可以忽略这个选项. |
|||
|
|||
`AddPermission` 方法的第三个参数用于设置多租户选项: |
|||
|
|||
````csharp |
|||
myGroup.AddPermission( |
|||
"BookStore_Author_Create", |
|||
LocalizableString.Create<BookStoreResource>("Permission:BookStore_Author_Create"), |
|||
multiTenancySide: MultiTenancySides.Tenant //set multi-tenancy side! |
|||
); |
|||
```` |
|||
|
|||
#### 子权限 |
|||
|
|||
权限可以具有子权限,当你想要创建一个层次结构的权限树时它特别有用. 在这个树中一个权限可能含有子权限,并且子权限只有在授权父权限时才可用. |
|||
|
|||
定义示例: |
|||
|
|||
````csharp |
|||
var authorManagement = myGroup.AddPermission("Author_Management"); |
|||
authorManagement.AddChild("Author_Management_Create_Books"); |
|||
authorManagement.AddChild("Author_Management_Edit_Books"); |
|||
authorManagement.AddChild("Author_Management_Delete_Books"); |
|||
```` |
|||
|
|||
在页面上如下所示 (你可能想要本地化权限名称): |
|||
|
|||
 |
|||
|
|||
下面的示例代码是一个典型的应用服务: |
|||
|
|||
````csharp |
|||
[Authorize("Author_Management")] |
|||
public class AuthorAppService : ApplicationService, IAuthorAppService |
|||
{ |
|||
public Task<List<AuthorDto>> GetListAsync() |
|||
{ |
|||
... |
|||
} |
|||
|
|||
public Task<AuthorDto> GetAsync(Guid id) |
|||
{ |
|||
... |
|||
} |
|||
|
|||
[Authorize("Author_Management_Create_Books")] |
|||
public Task CreateAsync(CreateAuthorDto input) |
|||
{ |
|||
... |
|||
} |
|||
|
|||
[Authorize("Author_Management_Edit_Books")] |
|||
public Task UpdateAsync(CreateAuthorDto input) |
|||
{ |
|||
... |
|||
} |
|||
|
|||
[Authorize("Author_Management_Delete_Books")] |
|||
public Task DeleteAsync(CreateAuthorDto input) |
|||
{ |
|||
... |
|||
} |
|||
} |
|||
```` |
|||
|
|||
* 拥有`Author_Management`权限的用户可以访问`GetListAsync`和 `GetAsync`方法. |
|||
* 示例中的其他方法需要额外的权限. |
|||
|
|||
### 自定义策略覆盖已有权限 |
|||
|
|||
有时我们需要扩展扩展应用程序中预构建模块的权限,可以定义并注册一个与权限名称相同的策略到ASP.Net Core授权系统,策略会覆盖已有权限. |
|||
|
|||
参阅 [基于策略的授权](https://docs.microsoft.com/zh-cn/aspnet/core/security/authorization/policies) 文档了解如何自定义策略. |
|||
|
|||
## IAuthorizationService |
|||
|
|||
ASP.NET Core 提供了 `IAuthorizationService` 用于检查权限. 注入后使用它进行条件控制权限. |
|||
|
|||
示例: |
|||
|
|||
````csharp |
|||
public async Task CreateAsync(CreateAuthorDto input) |
|||
{ |
|||
var result = await AuthorizationService |
|||
.AuthorizeAsync("Author_Management_Create_Books"); |
|||
if (result.Succeeded == false) |
|||
{ |
|||
//throw exception |
|||
throw new AbpAuthorizationException("..."); |
|||
} |
|||
|
|||
//continue to the normal flow... |
|||
} |
|||
```` |
|||
|
|||
> 因为应用服务会经常检查权限,`ApplicationService` 已经属性注入了`AuthorizationService`, 所有继承自 `ApplicationService` 的类都可以直接使用. 你也可以直接 [注入](Dependency-Injection.md)到类中. |
|||
|
|||
上面的示例代码是检查权限的标准代码,ABP提供了一种简化的方式来编写它. |
|||
|
|||
示例: |
|||
|
|||
````csharp |
|||
public async Task CreateAsync(CreateAuthorDto input) |
|||
{ |
|||
await AuthorizationService.CheckAsync("Author_Management_Create_Books"); |
|||
|
|||
//continue to the normal flow... |
|||
} |
|||
```` |
|||
|
|||
如果未授权 `CheckAsync` 扩展方法会抛出 `AbpAuthorizationException` 异常. 还有一个 `IsGrantedAsync` 扩展方法会返回 `true` 或 `false`. |
|||
|
|||
`IAuthorizationService` 中有多个 `AuthorizeAsync` 方法重载. [ASP.NET Core 授权文档](https://docs.microsoft.com/zh-cn/aspnet/core/security/authorization/introduction)中有详细的解释. |
|||
|
|||
> 提示: 尽可能使用声明式的 `Authorize` attribute,因为它比较简单不会侵入方法内部. 如果你需要在业务代码中有条件的检查权限,那么请使用 `IAuthorizationService`. |
|||
|
|||
### 在JavaScript中检查权限 |
|||
|
|||
有时你会需要在客户端检查策略/权限. 在ASP.NET Core MVC/Razor页面应用程序可以使用 `abp.auth` API. 示例: |
|||
|
|||
````js |
|||
abp.auth.isGranted('MyPermissionName'); |
|||
```` |
|||
|
|||
参阅 [abp.auth](AspNetCore/JavaScript-API/Auth.md) API 文档了解详情. |
|||
|
|||
## 权限管理 |
|||
|
|||
通常权限管理是管理员用户使用权限管理模态框进行授权: |
|||
|
|||
 |
|||
|
|||
如果你想要通过代码管理权限, 可以注入使用 `IPermissionManager`. 如下所示: |
|||
|
|||
````csharp |
|||
public class MyService : ITransientDependency |
|||
{ |
|||
private readonly IPermissionManager _permissionManager; |
|||
|
|||
public MyService(IPermissionManager permissionManager) |
|||
{ |
|||
_permissionManager = permissionManager; |
|||
} |
|||
|
|||
public async Task GrantPermissionForUserAsync(Guid userId, string permissionName) |
|||
{ |
|||
await _permissionManager.SetForUserAsync(userId, permissionName, true); |
|||
} |
|||
|
|||
public async Task ProhibitPermissionForUserAsync(Guid userId, string permissionName) |
|||
{ |
|||
await _permissionManager.SetForUserAsync(userId, permissionName, false); |
|||
} |
|||
} |
|||
```` |
|||
|
|||
`SetForUserAsync` 方法用于设置用户的权限 (true/false). 类似的还有 `SetForRoleAsync` 和 `SetForClientAsync` 扩展方法. |
|||
|
|||
`IPermissionManager` 由权限管理模块定义, 更多信息请参阅 [权限管理模块文档](Modules/Permission-Management.md). |
|||
|
|||
## 高级主题 |
|||
|
|||
### Permission Value Providers |
|||
|
|||
权限检查是可扩展的. 继承自 `PermissionValueProvider` (或实现 `IPermissionValueProvider`) 的任何类都可以参与权限检查. 有三个预定义的Provider: |
|||
|
|||
* `UserPermissionValueProvider` 从当前的声明中拿到当前用户ID并检查用户授权. 用户声明由 `AbpClaimTypes.UserId` 静态属性定义. |
|||
* `RolePermissionValueProvider` 从当前的声明中拿到授予当前用户的角色集合并且判断角色是否具有指定的权限. 角色声明由 `AbpClaimTypes.Role` 静态属性定义. |
|||
* `ClientPermissionValueProvider` 从当前声明中拿到当前客户端并检查客户端是否具有指定的权限. 这在没有当前登录用户的客户端交互特别有用. 客户端声明由 `AbpClaimTypes.ClientId` 静态属性定义. |
|||
|
|||
你可以定义自己的`PermissionValueProvider`扩展权限检查系统. |
|||
|
|||
示例: |
|||
|
|||
````csharp |
|||
public class SystemAdminPermissionValueProvider : PermissionValueProvider |
|||
{ |
|||
public SystemAdminPermissionValueProvider(IPermissionStore permissionStore) |
|||
: base(permissionStore) |
|||
{ |
|||
} |
|||
|
|||
public override string Name => "SystemAdmin"; |
|||
|
|||
public override async Task<PermissionGrantResult> |
|||
CheckAsync(PermissionValueCheckContext context) |
|||
{ |
|||
if (context.Principal?.FindFirst("User_Type")?.Value == "SystemAdmin") |
|||
{ |
|||
return PermissionGrantResult.Granted; |
|||
} |
|||
|
|||
return PermissionGrantResult.Undefined; |
|||
} |
|||
} |
|||
```` |
|||
|
|||
示例`SystemAdminPermissionValueProvider`允许声明`User_Type`值为`SystemAdmin`的用户授予所有权限. 通常在`Provider`中使用当前声明和 `IPermissionStore`. |
|||
|
|||
`PermissionValueProvider` 的 `CheckAsync` 应该返回下面三个值之一: |
|||
|
|||
* `PermissionGrantResult.Granted` 授予用户权限,如果没有其他的授权值提供程序返回 `Prohibited`, 那么最后会返回 `Granted`. |
|||
* `PermissionGrantResult.Prohibited` 禁止授权用户,任何一个授权值提供程序返回了 `Prohibited`, 那么其他的提供程序返回的值都不再重要. |
|||
* `PermissionGrantResult.Undefined` 代表当前无法确定是否授予或禁止权限, 返回`UnDefined`由其他权限值提供程序检查权限. |
|||
|
|||
定义`Provider`后将其添加到 `PermissionOptions`,如下所示: |
|||
|
|||
````csharp |
|||
Configure<PermissionOptions>(options => |
|||
{ |
|||
options.ValueProviders.Add<SystemAdminPermissionValueProvider>(); |
|||
}); |
|||
```` |
|||
|
|||
### Permission Store |
|||
|
|||
`IPermissionStore` 是唯一需要从持久化源(通常是数据库)中读取权限值的接口. 它的实现在权限管理模块. 参见 [权限管理模块](Modules/Permission-Management.md) 了解更多信息 |
|||
|
|||
### AlwaysAllowAuthorizationService |
|||
|
|||
`AlwaysAllowAuthorizationService` 类可以绕过授权服务. 通常用于在需要禁用授权系统的集成测试中. |
|||
|
|||
使用 `IServiceCollection.AddAlwaysAllowAuthorization()` 扩展方法将 `AlwaysAllowAuthorizationService` 注册到 [依赖注入](Dependency-Injection.md) 系统中: |
|||
|
|||
````csharp |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
context.Services.AddAlwaysAllowAuthorization(); |
|||
} |
|||
```` |
|||
|
|||
启动模板的集成测试已经禁用了授权服务. |
|||
|
|||
## 接下来 |
|||
|
|||
* [权限管理模块](Modules/Permission-Management.md) |
|||
* [ASP.NET Core MVC / Razor 页面 JavaScript Auth API](AspNetCore/JavaScript-API/Auth.md) |
|||
@ -0,0 +1,29 @@ |
|||
# ABP v1.0终于发布了! |
|||
|
|||
今天是个大日子!经过约3年的不断开发,第一个稳定的ABP版本,1.0,已经发布了.感谢为该项目做出贡献或试用过的每个人. |
|||
|
|||
 |
|||
|
|||
立即开始使用新的ABP框架:[abp.io/get-started](https://abp.io/get-started) |
|||
|
|||
## 统计 |
|||
|
|||
在这里,有关该项目的一些GitHub和NuGet统计信息: |
|||
|
|||
* 2,360星. |
|||
* 5,917次提交. |
|||
* 72位贡献者. |
|||
* 关闭了1,136个问题,276个打开问题. |
|||
* 关闭了566个PR,5个打开的PR. |
|||
* 39次发布. |
|||
* 在NuGet上有122,795次下载. |
|||
|
|||
甚至在第一个版本发布之前就有了非常好的需求. |
|||
|
|||
## 路线图 |
|||
|
|||
首要任务是完成文档,因为框架功能和模块仍然缺少很多文档.然后,我们将根据标记的优先级继续在GitHub上解决问题. |
|||
|
|||
请参阅[GitHub里程碑项目](https://github.com/abpframework/abp/milestones). |
|||
|
|||
ABP是一个社区驱动的项目.因此,我们主要根据社区的反馈和需求确定问题的优先级. |
|||
|
After Width: | Height: | Size: 66 KiB |
@ -0,0 +1,3 @@ |
|||
## Dynamic JavaScript API Clients |
|||
|
|||
TODO |
|||
@ -0,0 +1,3 @@ |
|||
# 权限管理模块 |
|||
|
|||
TODO |
|||
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 178 KiB |
|
After Width: | Height: | Size: 64 KiB |
@ -1,10 +1,10 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"DocsTitle": "Volo文档", |
|||
"DocsTitle": "VoloDocs", |
|||
"WelcomeVoloDocs": "欢迎使用VoloDocs!", |
|||
"NoProjectWarning": "当前没有定义的项目!", |
|||
"NoProjectWarning": "当前没有定义的项目!", |
|||
"CreateYourFirstProject": "点击这里开始你的第一个项目", |
|||
"NoProject": "没有项目!" |
|||
"NoProject": "没有项目!" |
|||
} |
|||
} |
|||
@ -1,6 +1,7 @@ |
|||
{ |
|||
"culture": "tr", |
|||
"texts": { |
|||
"Features": "Özellikler" |
|||
"Features": "Özellikler", |
|||
"NoFeatureFoundMessage": "Hiç özellik yok." |
|||
} |
|||
} |
|||
@ -1,6 +1,7 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"Features": "特性" |
|||
"Features": "功能", |
|||
"NoFeatureFoundMessage": "没有可用的功能." |
|||
} |
|||
} |
|||
} |
|||
@ -1,9 +1,13 @@ |
|||
using Volo.Abp.Domain.Entities; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using Volo.Abp.Domain.Entities; |
|||
|
|||
namespace Volo.Abp.Identity |
|||
{ |
|||
public class IdentityUserUpdateDto : IdentityUserCreateOrUpdateDtoBase, IHasConcurrencyStamp |
|||
{ |
|||
[StringLength(IdentityUserConsts.MaxPasswordLength)] |
|||
public string Password { get; set; } |
|||
|
|||
public string ConcurrencyStamp { get; set; } |
|||
} |
|||
} |
|||
@ -1,6 +1,7 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"Settings": "设置" |
|||
} |
|||
} |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"Settings": "设置", |
|||
"SuccessfullySaved": "保存成功" |
|||
} |
|||
} |
|||
@ -0,0 +1,24 @@ |
|||
const glob = require('glob'); |
|||
var path = require('path'); |
|||
const childProcess = require('child_process'); |
|||
|
|||
const check = pkgJsonPath => { |
|||
try { |
|||
return childProcess.execSync(`ncu "/^@abp.*$/" --packageFile ${pkgJsonPath} -u`).toString(); |
|||
} catch (error) { |
|||
console.log('exec error: ' + error.message); |
|||
process.exit(error.status); |
|||
} |
|||
}; |
|||
|
|||
const folder = process.argv[2] || '.'; |
|||
|
|||
glob(folder + '/**/package.json', {}, (er, files) => { |
|||
files.forEach(file => { |
|||
if (file.includes('node_modules')) { |
|||
return; |
|||
} |
|||
|
|||
console.log(check(file)); |
|||
}); |
|||
}); |
|||
@ -1,15 +1,19 @@ |
|||
<div class="card"> |
|||
<div class="card-header">{{ '::Welcome' | abpLocalization }}</div> |
|||
<div class="card-body"> |
|||
<p> |
|||
{{ '::LongWelcomeMessage' | abpLocalization }} |
|||
</p> |
|||
<p *ngIf="!hasLoggedIn"> |
|||
<a routerLink="/account/login" [state]="{ redirectUrl: '/' }" class="btn btn-primary" role="button" |
|||
><i class="fa fa-sign-in mr-1"></i>{{ 'AbpIdentity::Login' | abpLocalization }}</a |
|||
> |
|||
</p> |
|||
<hr /> |
|||
<p class="text-right"><a href="https://abp.io?ref=tmpl" target="_blank">abp.io</a></p> |
|||
<div id="AbpContentToolbar"></div> |
|||
<div class="jumbotron text-center"> |
|||
<h1>{{ '::Welcome' | abpLocalization }}</h1> |
|||
<div class="row"> |
|||
<div class="col-md-6 mx-auto"> |
|||
<p>{{ '::LongWelcomeMessage' | abpLocalization }}</p> |
|||
<hr class="my-4" /> |
|||
</div> |
|||
</div> |
|||
<a href="https://abp.io?ref=tmpl" target="_blank" class="btn btn-primary px-4">abp.io</a> |
|||
<a |
|||
*ngIf="!hasLoggedIn" |
|||
routerLink="/account/login" |
|||
[state]="{ redirectUrl: '/' }" |
|||
class="px-4 btn btn-primary ml-1" |
|||
role="button" |
|||
><i class="fa fa-sign-in"></i> {{ 'AbpIdentity::Login' | abpLocalization }}</a |
|||
> |
|||
</div> |
|||
|
|||
@ -1 +1 @@ |
|||
# @abp/ng.account.config |
|||
# @abp/ng.account.config |
|||
@ -1,132 +1 @@ |
|||
{ |
|||
"__symbolic": "module", |
|||
"version": 4, |
|||
"metadata": { |
|||
"AccountConfigService": { |
|||
"__symbolic": "class", |
|||
"decorators": [ |
|||
{ |
|||
"__symbolic": "call", |
|||
"expression": { |
|||
"__symbolic": "reference", |
|||
"module": "@angular/core", |
|||
"name": "Injectable", |
|||
"line": 4, |
|||
"character": 1 |
|||
}, |
|||
"arguments": [{ "providedIn": "root" }] |
|||
} |
|||
], |
|||
"members": { |
|||
"__ctor__": [ |
|||
{ |
|||
"__symbolic": "constructor", |
|||
"parameters": [ |
|||
{ "__symbolic": "reference", "module": "@angular/router", "name": "Router", "line": 8, "character": 30 }, |
|||
{ "__symbolic": "reference", "module": "@abp/ng.core", "name": "RestService", "line": 8, "character": 59 } |
|||
] |
|||
} |
|||
] |
|||
}, |
|||
"statics": { "ngInjectableDef": {} } |
|||
}, |
|||
"AccountConfigOptions": { "__symbolic": "interface" }, |
|||
"accountOptionsFactory": { "__symbolic": "function", "parameters": ["options"], "value": { "redirectUrl": "/" } }, |
|||
"ACCOUNT_OPTIONS": { |
|||
"__symbolic": "new", |
|||
"expression": { |
|||
"__symbolic": "reference", |
|||
"module": "@angular/core", |
|||
"name": "InjectionToken", |
|||
"line": 16, |
|||
"character": 35 |
|||
}, |
|||
"arguments": ["ACCOUNT_OPTIONS"] |
|||
}, |
|||
"AccountConfigModule": { |
|||
"__symbolic": "class", |
|||
"decorators": [ |
|||
{ |
|||
"__symbolic": "call", |
|||
"expression": { |
|||
"__symbolic": "reference", |
|||
"module": "@angular/core", |
|||
"name": "NgModule", |
|||
"line": 18, |
|||
"character": 1 |
|||
}, |
|||
"arguments": [ |
|||
{ |
|||
"imports": [ |
|||
{ |
|||
"__symbolic": "reference", |
|||
"module": "@abp/ng.core", |
|||
"name": "CoreModule", |
|||
"line": 19, |
|||
"character": 12 |
|||
}, |
|||
{ |
|||
"__symbolic": "reference", |
|||
"module": "@abp/ng.theme.shared", |
|||
"name": "ThemeSharedModule", |
|||
"line": 19, |
|||
"character": 24 |
|||
} |
|||
], |
|||
"providers": [ |
|||
{ |
|||
"provide": { |
|||
"__symbolic": "reference", |
|||
"module": "@angular/core", |
|||
"name": "APP_INITIALIZER", |
|||
"line": 20, |
|||
"character": 25 |
|||
}, |
|||
"multi": true, |
|||
"deps": [{ "__symbolic": "reference", "name": "AccountConfigService" }], |
|||
"useFactory": { |
|||
"__symbolic": "reference", |
|||
"module": "@abp/ng.core", |
|||
"name": "noop", |
|||
"line": 20, |
|||
"character": 97 |
|||
} |
|||
} |
|||
] |
|||
} |
|||
] |
|||
} |
|||
], |
|||
"members": {}, |
|||
"statics": { |
|||
"forRoot": { |
|||
"__symbolic": "function", |
|||
"parameters": ["options"], |
|||
"defaults": [{}], |
|||
"value": { |
|||
"ngModule": { "__symbolic": "reference", "name": "AccountConfigModule" }, |
|||
"providers": [ |
|||
{ |
|||
"provide": { "__symbolic": "reference", "name": "ACCOUNT_OPTIONS" }, |
|||
"useValue": { "__symbolic": "reference", "name": "options" } |
|||
}, |
|||
{ |
|||
"provide": "ACCOUNT_OPTIONS", |
|||
"useFactory": { "__symbolic": "reference", "name": "accountOptionsFactory" }, |
|||
"deps": [{ "__symbolic": "reference", "name": "ACCOUNT_OPTIONS" }] |
|||
} |
|||
] |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
"origins": { |
|||
"AccountConfigService": "./lib/services/account-config.service", |
|||
"AccountConfigOptions": "./lib/account-config.module", |
|||
"accountOptionsFactory": "./lib/account-config.module", |
|||
"ACCOUNT_OPTIONS": "./lib/account-config.module", |
|||
"AccountConfigModule": "./lib/account-config.module" |
|||
}, |
|||
"importAs": "@abp/ng.account.config" |
|||
} |
|||
{"__symbolic":"module","version":4,"metadata":{"AccountConfigService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":4,"character":1},"arguments":[{"providedIn":"root"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"Router","line":8,"character":30},{"__symbolic":"reference","module":"@abp/ng.core","name":"RestService","line":8,"character":59}]}]},"statics":{"ngInjectableDef":{}}},"AccountConfigOptions":{"__symbolic":"interface"},"accountOptionsFactory":{"__symbolic":"function","parameters":["options"],"value":{"redirectUrl":"/"}},"ACCOUNT_OPTIONS":{"__symbolic":"new","expression":{"__symbolic":"reference","module":"@angular/core","name":"InjectionToken","line":16,"character":35},"arguments":["ACCOUNT_OPTIONS"]},"AccountConfigModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":18,"character":1},"arguments":[{"imports":[{"__symbolic":"reference","module":"@abp/ng.core","name":"CoreModule","line":19,"character":12},{"__symbolic":"reference","module":"@abp/ng.theme.shared","name":"ThemeSharedModule","line":19,"character":24}],"providers":[{"provide":{"__symbolic":"reference","module":"@angular/core","name":"APP_INITIALIZER","line":20,"character":25},"multi":true,"deps":[{"__symbolic":"reference","name":"AccountConfigService"}],"useFactory":{"__symbolic":"reference","module":"@abp/ng.core","name":"noop","line":20,"character":97}}]}]}],"members":{},"statics":{"forRoot":{"__symbolic":"function","parameters":["options"],"defaults":[{}],"value":{"ngModule":{"__symbolic":"reference","name":"AccountConfigModule"},"providers":[{"provide":{"__symbolic":"reference","name":"ACCOUNT_OPTIONS"},"useValue":{"__symbolic":"reference","name":"options"}},{"provide":"ACCOUNT_OPTIONS","useFactory":{"__symbolic":"reference","name":"accountOptionsFactory"},"deps":[{"__symbolic":"reference","name":"ACCOUNT_OPTIONS"}]}]}}}}},"origins":{"AccountConfigService":"./lib/services/account-config.service","AccountConfigOptions":"./lib/account-config.module","accountOptionsFactory":"./lib/account-config.module","ACCOUNT_OPTIONS":"./lib/account-config.module","AccountConfigModule":"./lib/account-config.module"},"importAs":"@abp/ng.account.config"} |
|||
@ -1 +1 @@ |
|||
{"version":3,"file":"abp-ng.account.config.js","sources":["ng://@abp/ng.account.config/lib/services/account-config.service.ts","ng://@abp/ng.account.config/lib/account-config.module.ts"],"sourcesContent":["import { eLayoutType, RestService, addAbpRoutes } from '@abp/ng.core';\nimport { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AccountConfigService {\n constructor(private router: Router, private restService: RestService) {\n addAbpRoutes({\n name: 'AbpAccount::Menu:Account',\n path: 'account',\n invisible: true,\n layout: eLayoutType.application,\n children: [\n { path: 'login', name: 'AbpAccount::Login', order: 1 },\n { path: 'register', name: 'AbpAccount::Register', order: 2 },\n ],\n });\n }\n}\n","import { CoreModule, noop } from '@abp/ng.core';\nimport { ThemeSharedModule } from '@abp/ng.theme.shared';\nimport { APP_INITIALIZER, InjectionToken, ModuleWithProviders, NgModule } from '@angular/core';\nimport { AccountConfigService } from './services/account-config.service';\n\nexport interface AccountConfigOptions {\n redirectUrl?: string;\n}\n\nexport function accountOptionsFactory(options: AccountConfigOptions) {\n return {\n redirectUrl: '/',\n ...options,\n };\n}\n\nexport const ACCOUNT_OPTIONS = new InjectionToken('ACCOUNT_OPTIONS');\n\n@NgModule({\n imports: [CoreModule, ThemeSharedModule],\n providers: [{ provide: APP_INITIALIZER, multi: true, deps: [AccountConfigService], useFactory: noop }],\n})\nexport class AccountConfigModule {\n static forRoot(options = {} as AccountConfigOptions): ModuleWithProviders {\n return {\n ngModule: AccountConfigModule,\n providers: [\n { provide: ACCOUNT_OPTIONS, useValue: options },\n {\n provide: 'ACCOUNT_OPTIONS',\n useFactory: accountOptionsFactory,\n deps: [ACCOUNT_OPTIONS],\n },\n ],\n };\n }\n}\n"],"names":[],"mappings":";;;;;;;;;AAAA,MAOa,oBAAoB;;;;;IAC/B,YAAoB,MAAc,EAAU,WAAwB;QAAhD,WAAM,GAAN,MAAM,CAAQ;QAAU,gBAAW,GAAX,WAAW,CAAa;QAClE,YAAY,CAAC;YACX,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,IAAI;YACf,MAAM;YACN,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE;gBACtD,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE;aAC7D;SACF,CAAC,CAAC;KACJ;;;YAfF,UAAU,SAAC;gBACV,UAAU,EAAE,MAAM;aACnB;;;;YAJQ,MAAM;YAFO,WAAW;;;;;;;;IAQnB,sCAAsB;;;;;IAAE,2CAAgC;;;;;;;ACRtE;;;AAKA,mCAEC;;;IADC,2CAAqB;;;;;;AAGvB,SAAgB,qBAAqB,CAAC,OAA6B;IACjE,uBACE,WAAW,EAAE,GAAG,IACb,OAAO,EACV;CACH;;AAED,MAAa,eAAe,GAAG,IAAI,cAAc,CAAC,iBAAiB,CAAC;WAI6B,IAAI;AAErG,MAAa,mBAAmB;;;;;IAC9B,OAAO,OAAO,CAAC,OAAO,sBAAG,EAAE,EAAwB;QACjD,OAAO;YACL,QAAQ,EAAE,mBAAmB;YAC7B,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC/C;oBACE,OAAO,EAAE,iBAAiB;oBAC1B,UAAU,EAAE,qBAAqB;oBACjC,IAAI,EAAE,CAAC,eAAe,CAAC;iBACxB;aACF;SACF,CAAC;KACH;;;YAjBF,QAAQ,SAAC;gBACR,OAAO,EAAE,CAAC,UAAU,EAAE,iBAAiB,CAAC;gBACxC,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,IAAM,EAAE,CAAC;aACvG;;;;;;;;;;;;;;;"} |
|||
{"version":3,"file":"abp-ng.account.config.js","sources":["ng://@abp/ng.account.config/lib/services/account-config.service.ts","ng://@abp/ng.account.config/lib/account-config.module.ts"],"sourcesContent":["import { eLayoutType, RestService, addAbpRoutes } from '@abp/ng.core';\nimport { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AccountConfigService {\n constructor(private router: Router, private restService: RestService) {\n addAbpRoutes({\n name: 'AbpAccount::Menu:Account',\n path: 'account',\n invisible: true,\n layout: eLayoutType.application,\n children: [\n { path: 'login', name: 'AbpAccount::Login', order: 1 },\n { path: 'register', name: 'AbpAccount::Register', order: 2 },\n { path: 'manage-profile', name: 'AbpAccount::ManageYourProfile', order: 3 },\n ],\n });\n }\n}\n","import { CoreModule, noop } from '@abp/ng.core';\nimport { ThemeSharedModule } from '@abp/ng.theme.shared';\nimport { APP_INITIALIZER, InjectionToken, ModuleWithProviders, NgModule } from '@angular/core';\nimport { AccountConfigService } from './services/account-config.service';\n\nexport interface AccountConfigOptions {\n redirectUrl?: string;\n}\n\nexport function accountOptionsFactory(options: AccountConfigOptions) {\n return {\n redirectUrl: '/',\n ...options,\n };\n}\n\nexport const ACCOUNT_OPTIONS = new InjectionToken('ACCOUNT_OPTIONS');\n\n@NgModule({\n imports: [CoreModule, ThemeSharedModule],\n providers: [{ provide: APP_INITIALIZER, multi: true, deps: [AccountConfigService], useFactory: noop }],\n})\nexport class AccountConfigModule {\n static forRoot(options = {} as AccountConfigOptions): ModuleWithProviders {\n return {\n ngModule: AccountConfigModule,\n providers: [\n { provide: ACCOUNT_OPTIONS, useValue: options },\n {\n provide: 'ACCOUNT_OPTIONS',\n useFactory: accountOptionsFactory,\n deps: [ACCOUNT_OPTIONS],\n },\n ],\n };\n }\n}\n"],"names":[],"mappings":";;;;;;;;;AAAA,MAOa,oBAAoB;;;;;IAC/B,YAAoB,MAAc,EAAU,WAAwB;QAAhD,WAAM,GAAN,MAAM,CAAQ;QAAU,gBAAW,GAAX,WAAW,CAAa;QAClE,YAAY,CAAC;YACX,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,IAAI;YACf,MAAM;YACN,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE;gBACtD,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC5D,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,+BAA+B,EAAE,KAAK,EAAE,CAAC,EAAE;aAC5E;SACF,CAAC,CAAC;KACJ;;;YAhBF,UAAU,SAAC;gBACV,UAAU,EAAE,MAAM;aACnB;;;;YAJQ,MAAM;YAFO,WAAW;;;;;;;;IAQnB,sCAAsB;;;;;IAAE,2CAAgC;;;;;;;ACRtE;;;AAKA,mCAEC;;;IADC,2CAAqB;;;;;;AAGvB,SAAgB,qBAAqB,CAAC,OAA6B;IACjE,uBACE,WAAW,EAAE,GAAG,IACb,OAAO,EACV;CACH;;AAED,MAAa,eAAe,GAAG,IAAI,cAAc,CAAC,iBAAiB,CAAC;WAI6B,IAAI;AAErG,MAAa,mBAAmB;;;;;IAC9B,OAAO,OAAO,CAAC,OAAO,sBAAG,EAAE,EAAwB;QACjD,OAAO;YACL,QAAQ,EAAE,mBAAmB;YAC7B,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC/C;oBACE,OAAO,EAAE,iBAAiB;oBAC1B,UAAU,EAAE,qBAAqB;oBACjC,IAAI,EAAE,CAAC,eAAe,CAAC;iBACxB;aACF;SACF,CAAC;KACH;;;YAjBF,QAAQ,SAAC;gBACR,OAAO,EAAE,CAAC,UAAU,EAAE,iBAAiB,CAAC;gBACxC,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,IAAM,EAAE,CAAC;aACvG;;;;;;;;;;;;;;;"} |
|||
@ -1 +1 @@ |
|||
{"version":3,"file":"abp-ng.account.config.js","sources":["ng://@abp/ng.account.config/lib/services/account-config.service.ts","ng://@abp/ng.account.config/lib/account-config.module.ts"],"sourcesContent":["import { eLayoutType, RestService, addAbpRoutes } from '@abp/ng.core';\nimport { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AccountConfigService {\n constructor(private router: Router, private restService: RestService) {\n addAbpRoutes({\n name: 'AbpAccount::Menu:Account',\n path: 'account',\n invisible: true,\n layout: eLayoutType.application,\n children: [\n { path: 'login', name: 'AbpAccount::Login', order: 1 },\n { path: 'register', name: 'AbpAccount::Register', order: 2 },\n ],\n });\n }\n}\n","import { CoreModule, noop } from '@abp/ng.core';\nimport { ThemeSharedModule } from '@abp/ng.theme.shared';\nimport { APP_INITIALIZER, InjectionToken, ModuleWithProviders, NgModule } from '@angular/core';\nimport { AccountConfigService } from './services/account-config.service';\n\nexport interface AccountConfigOptions {\n redirectUrl?: string;\n}\n\nexport function accountOptionsFactory(options: AccountConfigOptions) {\n return {\n redirectUrl: '/',\n ...options,\n };\n}\n\nexport const ACCOUNT_OPTIONS = new InjectionToken('ACCOUNT_OPTIONS');\n\n@NgModule({\n imports: [CoreModule, ThemeSharedModule],\n providers: [{ provide: APP_INITIALIZER, multi: true, deps: [AccountConfigService], useFactory: noop }],\n})\nexport class AccountConfigModule {\n static forRoot(options = {} as AccountConfigOptions): ModuleWithProviders {\n return {\n ngModule: AccountConfigModule,\n providers: [\n { provide: ACCOUNT_OPTIONS, useValue: options },\n {\n provide: 'ACCOUNT_OPTIONS',\n useFactory: accountOptionsFactory,\n deps: [ACCOUNT_OPTIONS],\n },\n ],\n };\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;AAAA;IAQE,8BAAoB,MAAc,EAAU,WAAwB;QAAhD,WAAM,GAAN,MAAM,CAAQ;QAAU,gBAAW,GAAX,WAAW,CAAa;QAClE,YAAY,CAAC;YACX,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,IAAI;YACf,MAAM;YACN,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE;gBACtD,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE;aAC7D;SACF,CAAC,CAAC;KACJ;;gBAfF,UAAU,SAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;;;gBAJQ,MAAM;gBAFO,WAAW;;;+BAAjC;CAIA,IAgBC;;;;;;IAZa,sCAAsB;;;;;IAAE,2CAAgC;;;;;;;;;;ACHtE,mCAEC;;;IADC,2CAAqB;;;;;;AAGvB,SAAgB,qBAAqB,CAAC,OAA6B;IACjE,kBACE,WAAW,EAAE,GAAG,IACb,OAAO,EACV;CACH;;AAED,IAAa,eAAe,GAAG,IAAI,cAAc,CAAC,iBAAiB,CAAC;SAI6B,IAAI;AAFrG;IAAA;KAkBC;;;;;IAbQ,2BAAO;;;;IAAd,UAAe,OAAoC;QAApC,wBAAA,EAAA,6BAAU,EAAE,EAAwB;QACjD,OAAO;YACL,QAAQ,EAAE,mBAAmB;YAC7B,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC/C;oBACE,OAAO,EAAE,iBAAiB;oBAC1B,UAAU,EAAE,qBAAqB;oBACjC,IAAI,EAAE,CAAC,eAAe,CAAC;iBACxB;aACF;SACF,CAAC;KACH;;gBAjBF,QAAQ,SAAC;oBACR,OAAO,EAAE,CAAC,UAAU,EAAE,iBAAiB,CAAC;oBACxC,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,IAAM,EAAE,CAAC;iBACvG;;IAeD,0BAAC;CAlBD;;;;;;;;;;;;;;"} |
|||
{"version":3,"file":"abp-ng.account.config.js","sources":["ng://@abp/ng.account.config/lib/services/account-config.service.ts","ng://@abp/ng.account.config/lib/account-config.module.ts"],"sourcesContent":["import { eLayoutType, RestService, addAbpRoutes } from '@abp/ng.core';\nimport { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AccountConfigService {\n constructor(private router: Router, private restService: RestService) {\n addAbpRoutes({\n name: 'AbpAccount::Menu:Account',\n path: 'account',\n invisible: true,\n layout: eLayoutType.application,\n children: [\n { path: 'login', name: 'AbpAccount::Login', order: 1 },\n { path: 'register', name: 'AbpAccount::Register', order: 2 },\n { path: 'manage-profile', name: 'AbpAccount::ManageYourProfile', order: 3 },\n ],\n });\n }\n}\n","import { CoreModule, noop } from '@abp/ng.core';\nimport { ThemeSharedModule } from '@abp/ng.theme.shared';\nimport { APP_INITIALIZER, InjectionToken, ModuleWithProviders, NgModule } from '@angular/core';\nimport { AccountConfigService } from './services/account-config.service';\n\nexport interface AccountConfigOptions {\n redirectUrl?: string;\n}\n\nexport function accountOptionsFactory(options: AccountConfigOptions) {\n return {\n redirectUrl: '/',\n ...options,\n };\n}\n\nexport const ACCOUNT_OPTIONS = new InjectionToken('ACCOUNT_OPTIONS');\n\n@NgModule({\n imports: [CoreModule, ThemeSharedModule],\n providers: [{ provide: APP_INITIALIZER, multi: true, deps: [AccountConfigService], useFactory: noop }],\n})\nexport class AccountConfigModule {\n static forRoot(options = {} as AccountConfigOptions): ModuleWithProviders {\n return {\n ngModule: AccountConfigModule,\n providers: [\n { provide: ACCOUNT_OPTIONS, useValue: options },\n {\n provide: 'ACCOUNT_OPTIONS',\n useFactory: accountOptionsFactory,\n deps: [ACCOUNT_OPTIONS],\n },\n ],\n };\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;AAAA;IAQE,8BAAoB,MAAc,EAAU,WAAwB;QAAhD,WAAM,GAAN,MAAM,CAAQ;QAAU,gBAAW,GAAX,WAAW,CAAa;QAClE,YAAY,CAAC;YACX,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,IAAI;YACf,MAAM;YACN,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE;gBACtD,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC5D,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,+BAA+B,EAAE,KAAK,EAAE,CAAC,EAAE;aAC5E;SACF,CAAC,CAAC;KACJ;;gBAhBF,UAAU,SAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;;;gBAJQ,MAAM;gBAFO,WAAW;;;+BAAjC;CAIA,IAiBC;;;;;;IAba,sCAAsB;;;;;IAAE,2CAAgC;;;;;;;;;;ACHtE,mCAEC;;;IADC,2CAAqB;;;;;;AAGvB,SAAgB,qBAAqB,CAAC,OAA6B;IACjE,kBACE,WAAW,EAAE,GAAG,IACb,OAAO,EACV;CACH;;AAED,IAAa,eAAe,GAAG,IAAI,cAAc,CAAC,iBAAiB,CAAC;SAI6B,IAAI;AAFrG;IAAA;KAkBC;;;;;IAbQ,2BAAO;;;;IAAd,UAAe,OAAoC;QAApC,wBAAA,EAAA,6BAAU,EAAE,EAAwB;QACjD,OAAO;YACL,QAAQ,EAAE,mBAAmB;YAC7B,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC/C;oBACE,OAAO,EAAE,iBAAiB;oBAC1B,UAAU,EAAE,qBAAqB;oBACjC,IAAI,EAAE,CAAC,eAAe,CAAC;iBACxB;aACF;SACF,CAAC;KACH;;gBAjBF,QAAQ,SAAC;oBACR,OAAO,EAAE,CAAC,UAAU,EAAE,iBAAiB,CAAC;oBACxC,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,IAAM,EAAE,CAAC;iBACvG;;IAeD,0BAAC;CAlBD;;;;;;;;;;;;;;"} |
|||
@ -1,13 +1,11 @@ |
|||
import { InjectionToken, ModuleWithProviders } from '@angular/core'; |
|||
export interface AccountConfigOptions { |
|||
redirectUrl?: string; |
|||
redirectUrl?: string; |
|||
} |
|||
export declare function accountOptionsFactory( |
|||
options: AccountConfigOptions, |
|||
): { |
|||
redirectUrl: string; |
|||
export declare function accountOptionsFactory(options: AccountConfigOptions): { |
|||
redirectUrl: string; |
|||
}; |
|||
export declare const ACCOUNT_OPTIONS: InjectionToken<unknown>; |
|||
export declare class AccountConfigModule { |
|||
static forRoot(options?: AccountConfigOptions): ModuleWithProviders; |
|||
static forRoot(options?: AccountConfigOptions): ModuleWithProviders; |
|||
} |
|||
|
|||
@ -1,7 +1,7 @@ |
|||
import { RestService } from '@abp/ng.core'; |
|||
import { Router } from '@angular/router'; |
|||
export declare class AccountConfigService { |
|||
private router; |
|||
private restService; |
|||
constructor(router: Router, restService: RestService); |
|||
private router; |
|||
private restService; |
|||
constructor(router: Router, restService: RestService); |
|||
} |
|||
|
|||