后端应用程序
这是用户名和密码输入的实际应用程序。您将主要在此应用程序上添加您的业务需求。
应用文件夹
后端应用程序默认内置在专用区域,名为“ App ”,但可以在创建解决方案时确定。因此,所有控制器,视图和模型都位于 Areas / App文件夹下。此外,相关脚本和样式文件位于wwwroot / view-resources / Areas / App文件夹下,如下所示:
主菜单
应用程序的主菜单在AppNavigationProvider 类中定义。请参阅ABP的 导航文档,以深入了解创建菜单。当您添加新的菜单项时,它会自动在布局中呈现。
布局
应用程序的布局位于Areas / App / Views / Layout 文件夹下。它使用组件的页眉,页脚和 侧边栏:
主菜单在侧边栏组件中呈现 。布局还高度使用捆绑和压缩(见下文)系统的脚本和样式包括。
版本管理
如果您没有开发多租户应用程序,则可以跳过本节。
大多数SaaS(多租户)应用程序都有具有不同功能的版本(包) 。因此,他们可以为其租户(客户)提供不同的价格和功能选项。 版本页面(可在host登录中使用)用于管理应用程序的版本:
版本用于分组功能值并分配给租户。当我们点击版本的操作/编辑时,我们可以看到它已分配的功能:
启动项目仅包含每个版本/租户可以启用/禁用聊天功能(并且它是2个子功能)。所有功能都在 AppFeatureProvider类中定义。特征值存储在 AbpFeatures表中。功能不限于布尔(启用/禁用)值,并且可以包含不同类型的值,如下所示:
租户管理
如果您没有开发多租户应用程序,则可以跳过本节。
如果这是一个多租户应用程序,并以host用户身份登录,则显示租户页面:
租户由租户类代表。可以通过添加新的属性类来拓展租户类 。只有一个租户,默认为 Default。租户名称(代号名称)是租户的唯一名称。租户可以是激活的或锁定的。如果是锁定状态的,那么这个租户的用户不能登录到应用程序。
当我们点击“ 创建新租户 ”按钮时,会显示一个对话框:
租用名称应该是唯一的,不能包含空格或其他特殊字符,因为它可以用作子域名(如tenancyname.mydomain.com。请参阅下面的部分)。名字可以是任何东西。管理员电子邮件 用作新客户的管理员用户的电子邮件地址。用户将自动创建管理员用户。我们可以为管理员设置随机密码并发送激活邮件。当用户首次登录时,他/她应该更改密码。我们可以取消选中此项以输入已知密码。
当我们创建一个新的租户时,我们应该选择/创建一个数据库来存储新租户的数据。我们可以选择“ 使用主机数据库 ”将租户数据存储在主机数据库中(可以用于单个数据库方法),或者我们可以指定一个连接字符串来为新租户创建/使用专用数据库 。AspNet Zero支持混合方式。这意味着您可以为某些租户使用host数据库,并为其他租户创建专用数据库。即使您可以将一些租户分组在一个单独的数据库中。
所有租户操作都由TenantAppService 类处理。示例(删除租户):
[AbpAuthorize(AppPermissions.Pages_Tenants_Delete)] public async Task DeleteTenant(EntityRequestInput input) { var tenant = wait TenantManager.GetByIdAsync(input.Id); CheckErrors(wait TenantManager.DeleteAsync(tenant)); }
TenantAppService主要使用TenantManager域名服务进行租户操作。
租户版和功能
一个版本可以分配给租户(创建或编辑)。租户将继承分配版本的所有功能。但是我们也可以覆盖租户的功能和价值。单击 租户的操作/更改功能以自定义 其功能:
租户用户模仿
作为host用户,我们可能希望代表租户执行操作。在这种情况下,我们可以在操作中单击“ 登录为此租户 ”按钮。当我们点击它,我们看到一个模式来选择租户的用户。我们可以选择任何用户并执行允许该用户的操作。有关详细信息,请参阅 本文档中的“ 用户模拟”部分。
将租约名称用作子域名
多租户应用程序通常使用子域来识别当前租户。 tenant1 .mydomain.com,tenant2 .mydomain.com等。ASP.NET Zero自动识别并从子域获取租户名称(请参阅主机设置部分)。
组织单位
组织单位(OU)用于对用户和实体进行分层分组。那么你可以根据他们的OU来获取用户或实体。当我们点击管理/组织单位时,我们进入相关页面:
在这里,我们可以管理OU(创建,编辑,取消,移动)和成员(添加/删除)。
OrganizationUnitManager用于管理OU, UserManager用于管理代码中的OU成员。 OrganizationUnitAppService执行应用程序逻辑。
在左OU树中,我们可以右键单击一个OU(或左键点击到 右侧的箭头)打开OU操作的上下文菜单。当我们尝试 添加一个成员时,显示一个模态来选择用户:
这实际上是一个通用的查找模式,可用于选择任何类型的实体(请参阅区域/应用/视图/公共/模态/ _LookupModal.cshtml及其相关的脚本文件)。要选择用户,我们创建FindUsers 的方法CommonLookupAppService然后配置模式使用此方法的工作(见景资源/区/应用/浏览/ OrganizationUnits / index.js为lookupModal.open的使用文件)。
有关详细信息,请参阅 组织单位管理文件。
角色管理
当我们点击管理/角色菜单,我们进入角色管理页面:
角色用于分组权限。当用户有角色时,他/她将具有该角色的所有权限。
角色由Role类表示。角色类可以通过添加新的属性来扩展。
RoleManager执行域逻辑,RoleAppService 执行角色的应用程序逻辑。
角色可以是动态的或静态的:
- 静态角色:静态角色具有已知名称 (如“admin”),不能更改此名称(我们可以更改 显示名称)。它在系统启动时存在,无法删除。因此,我们可以根据静态角色名编写代码。
- 动态角色:部署后可以创建动态角色。然后我们可以授予该角色的权限,我们可以将角色分配给某些用户,我们可以将其删除。我们不能在开发时间内知道动态角色的名称。
一个或多个角色可以设置为默认。默认角色默认分配给新添加/注册的用户。这不是开发时属性,可以在部署后设置或更改。
在启动项目中,我们对host(对于多租户应用程序)具有静态管理员角色。此外,我们还为租户提供静态管理员和用户角色。管理角色默认授予所有权限。用户角色是新用户的默认角色,默认情况下没有权限。这些可以轻松改变。有关所有静态角色,请参阅StaticRoleNames类和更改静态角色的AppRoleConfig。
角色权限
由于角色用于分组权限,因此我们可以在创建或编辑角色时设置权限,如下所示:
(并非所有权限如上图所示)
每个租户都有自己的角色,租户角色的任何改变都不会影响其他租户。而且,host也有自己的角色。
用户管理
当我们单击管理/用户菜单时,我们进入用户管理页面:
用户是可以登录应用程序并根据其权限执行某些操作的人员。
用户类代表用户,可以通过添加新属性来拓展用户类 。
UserManager 用于执行域逻辑,UserAppService用于为用户执行应用程序逻辑。
用户可以有零个或多个角色。如果用户具有多个角色,则他将继承所有这些角色的权限。此外,我们可以设置用户特定的权限。用户特定权限设置将覆盖此权限的角色设置。用户权限对话框的截图:
(并非所有权限如上图所示)
对话框用于创建/编辑用户:
我们可以更改用户密码,使其 激活/锁定 等等...用户拥有个人资料图片。用户可以更改(请参阅用户菜单部分)。管理员 用户不能作为业务规则删除。如果你不想使用管理员,你可以锁定它。
用户模拟
作为管理员(或任何允许的用户),我们可能希望以用户身份登录,并代表该用户执行操作,而不知道他的密码。当我们在用户的操作中点击“ 以此用户身份登录 ”图标时,我们将自动重定向并以此用户身份登录。这被称为“ 用户模拟 ”。当我们模拟用户时,“ 回到我的帐户 ”选项被添加到用户配置文件菜单中:
在一个模拟帐户中,我们只能执行该用户允许的操作。这意味着,一切正好可以作为此相同用户登录自己的能力。唯一的区别是在审计日志中显示,这表明操作是由其他人执行的。注意; 此外,用户名附近还显示一个红色的“返回”图标,表示您处于模拟帐户。
在Web项目的AccountController中进行模拟。
语言管理
语言管理页面用于管理(添加/编辑/删除)应用程序语言并更改本地化文本:
我们可以创建新语言,编辑/删除现有语言,并将语言设置为默认语言。注意; 租户无法编辑/删除默认语言,但host用户可以做。
当我们点击更改任何语言的文本时,我们被重定向到一个新的视图来编辑语言文本:
我们可以选择任何语言作为基础(参考)并更改 目标语言的文本。基础语言只是为了帮助翻译进度。由于可能有不同的 本地化来源,我们选择要翻译的源。当我们点击编辑图标时,我们可以看到所选文本的编辑模式:
host用户(如果允许的话)可以编辑语言和本地化的文本。对于多租户应用程序的所有租户,这些语言将是默认的。 租户继承语言和本地化的文本,可以 覆盖本地化的文本或添加新的语言。
两个页面都使用LanguageAppService类作为应用程序服务。它具有管理语言和本地化文本的方法。 IApplicationLanguageManager和IApplicationLanguageTextManager 接口用于执行域逻辑(由LanguageAppService使用)。
审核日志
在审核日志页面中,我们可以看到与应用程序的所有用户交互:
所有应用程序服务方法和MVC控制器操作都会自动记录,可以在这里查看。请参阅 审核日志文档以了解如何进行配置。当我们点击放大镜图标时,我们可以看到所有的细节是一个审核日志:
审计日志报告由AuditLogAppService类提供。
主机设置
主机设置页面用于配置一些系统设置:
时区是此页面中的重要设置。AspNet Zero可以在多个区域工作。每个用户可以在自己的时区中看到日期和时间。此页面中的时区设置允许您为应用程序(包括所有租户和用户)设置默认时区。租户和用户可以在自己的设置中更改时区。时区设置仅在使用UTC时钟时可用。 请参阅文档以切换到UTC。
SAVE ALL按钮可以一键保存所有设置。HostSettingAppService用于检索和保存设置(有关详细信息,请参阅设置提供程序部分)。
主机设置页面中的“ 安全 ”选项卡包含密码复杂性和其他安全设置。主机可以在此选项卡中定义系统范围的安全设置。每个租户都可以在租户设置页面中覆盖此设置。PasswordComplexityChecker 类负责检查密码是否满足密码复杂度设置。
租户设置
在多租户应用程序中,租户设置如下所示:
如果我们禁用多租户,那么这个页面也会显示一些主机设置(因为没有主机设置页面)。租户还可以定义用户的密码复杂度设置,也可以使用主机用户定义的密码复杂度设置。
TenantSettingAppService用于获取/设置租户设置。
启用LDAP(ACTIVE DIRECTORY)身份验证
LDAP(Active Directory)默认情况下禁用身份验证。为了使其工作,我们应该禁用多租户,因为LDAP auth不会在多租户系统中正常使用。在.Core项目的CoreModule类中,我们应该启用以下行:
Configuration.Modules.ZeroLdap().Enable(typeof(AppLdapAuthenticationSource));
然后,我们可以在设置页面中看到LDAP设置部分:
我们可以检查“ 启用LDAP验证 ”以启用它。如果服务器在域和应用程序中运行域用户或本地系统,则通常甚至不需要设置域名,用户和密码。您可以注销,然后使用您的域用户名和密码登录。如果没有,您应该设置这些凭据。
.Net core兼容性
LDAP认证尚未被.net core支持。因此,它被设计为有条件的。如果您使用的是.Net Framework(4.6+),那么它将可用,否则将被禁用。
维护
维护页面可用于多租户应用程序的host端(单租户应用程序在租户侧显示),如下所示:
在“ 缓存 ”选项卡中,我们可以清除一些或所有高速缓存。如果您手动更改数据库并希望刷新应用程序缓存,则可能需要清除缓存。CachingAppService用于清除服务器端的缓存。
网站日志选项卡用于查看和下载日志:
WebLogAppService用于从服务器获取日志。
租户仪表板
ASP.NET Zero启动项目还包括示例 仪表板。这只是为了演示目的,您可以将其作为实际仪表盘的起点:
在这里,只有会员活动图数据从服务器(从TenantDashboardAppService)中 检索。您可以单击刷新按钮生成随机图。
通知
通知图标位于语言选择按钮旁边。红色圆圈中的数字显示未读通知计数。
用户可以通过点击此图标看到3个最近的通知。
用户可以通过单击“将所有设为全部”链接将所有通知标记为已读,或者通过单击每个通知旁边的“设置为已读”链接来标记单个通知。
通知使用SignalR实时发送。另外,收到 通知时会显示桌面推送通知。
通知设置
“设置”链接打开通知设置对话框。
在此对话框中有一个用于启用/禁用接收通知的全局设置。如果启用此设置,则用户可以单独启用/禁用每个通知。
您还可以在AppNotificationProvider 类中定义自定义通知。例如,新用户的注册通知在所定义的AppNotificationProvider如下。
context.Manager.Add( new NotificationDefinition( AppNotificationNames.NewUserRegistered, displayName:L(“NewUserRegisteredNotificationDefinition”), permissionDependency:new SimplePermissionDependency(AppPermissions.Pages_Administration_Users) ) );
有关 详细信息,请参阅通知定义部分。
AppNotifier类用于发布通知。 NotificationAppService类用于管理通知的应用程序逻辑。有关详细信息,请参阅通知文档。
通知单
用户的所有通知都列在此页面中。
.Net core兼容性
由于SignalR还没有为.net core准备就绪,如果您选择.net core作为基础框架,实时通知将不起作用。
聊
聊天图标位于页面右上角的用户个人资料图像旁边。红色圆圈中的数字显示未读的聊天消息计数。
当用户点击此图标时,聊天面板将出现在页面右侧。此面板包含用户的朋友和被阻止的用户列表。
用户可以通过将用户名写入朋友列表中的用户名文本框中来添加新朋友。如果为租户启用“与其他租户聊天”功能,则可以通过写[租户名称] \ [用户名](例如:默认\ admin)将其他租户的用户添加为朋友。如果启用了“与host用户聊天”功能,host用户可以通过在相同的文本框中写入。\ [用户名]添加为朋友。
虽然在线朋友/用户的个人资料图片上有一个绿色圆圈,但离线的朋友/用户都有一个灰色的圈子。
用户可以通过点击聊天面板右上角的针图标来定位或取消打开聊天面板。应用程序尝试记住聊天面板的最后状态,并在用户登录到应用程序时恢复。
当选择了一个朋友/用户时,会话面板被打开。
用户可以阻止或解除此区域中的朋友/用户。所选用户用户名右侧有一个扳手图标。此图标打开一个操作菜单,该菜单包含块用户或根据用户的块状态取消阻止用户操作。
聊天消息通过使用ChatMessageManager域类的ChatHub signalR集线器类传播。
ChatUserStateWatcher类负责观看聊天用户的在线/离线状态更改。当用户上线或离线时,该类抓取状态更改并通知相关用户的朋友。
FriendshipAppService和FriendshipManager类负责管理友谊请求。来自被阻止的用户的聊天消息不会传递给目标用户。
由于聊天是一个实时操作,应用程序会缓存在线用户的朋友和每个朋友的未读消息数。UserFriendsCache 类管理这些缓存操作。
UserFriendCacheSyncronizer类负责保持用户的朋友缓存最新。为了做到这一点,它会观看Friendship和ChatMessage实体的一些事件。
.Net core兼容性
由于SignalR尚未准备好.net core,如果您选择.net核心作为基础框架,聊天功能将无法正常工作。
聊天功能
系统中有三个聊天功能。这些是“聊天”,“与主机聊天”,“与其他租户聊天”。每个版本/租户可以启用/禁用这些功能。通过使用这些功能,主机可以启用/禁用与其他租户的用户或主机用户的聊天。
用户菜单
用户可以点击右上角的姓名打开用户菜单:
链接帐户
链接的帐户用于将多个帐户相互链接。以这种方式,用户可以使用此功能轻松浏览他/她的帐户。
用户可以通过点击“管理帐户”链接来链接新帐户或删除已链接的帐户。
为了链接新帐户,用户必须输入相关帐号的登录凭据。
UserLinkAppService类用于管理帐户链接的应用程序逻辑, UserLinkManager类用于管理用于帐户链接的域逻辑。
配置文件设置
我的设置用于更改用户配置文件设置:
如下所示,管理员用户名无法更改。它被认为是一个特殊的用户名,因为它被用于数据库迁移种子。其他用户可以更改其用户名。ProfileAppService用于获取/更改设置。
登录尝试
所有登录尝试(失败的成功)都记录在应用程序中。用户可以看到他/她的帐户的上次登录尝试。UserLoginAppService 用于从服务器获取登录尝试。
更换图片
用户可以更改自己的个人资料图片。ProfileController用于上传和获取用户个人资料图片。目前,支持jpg / jpeg,gif和png文件,您可以扩展它。
更改密码
ProfileAppService用于更改密码。
登出
AccountController用于注销用户并重定向到登录页面。