系统管理与配置
本节介绍 QuickAdmin.Net 内置管理/配置相关功能,请对照示例项目或在线演示阅览。
分级管理
管理员设计有 超级管理员 和 各级机构管理员,实现分级管理。
超级管理员 负责系统的初始化、配置以及日常维护工作,可去指定各级机构管理员,但不能参与业务,通常由开发或运维人员担任。 在后端数据库中,超级管理员存储于单独的表中,和系统用户表是分开的。
系统管理员(也叫根机构管理员) 负责整个机构的部门、用户管理以及授权工作,可去指定下级机构管理员,由上级部门相关人员担任。
下级管理员 负责其所在级别机构的部门、用户管理以及授权工作,由下级部门相关人员担任。角色、角色组均设计有 可授权管理员级别 属性,用来限定各下级管理员的可授权范围。
相比各级管理员,超级管理员 将在一些页面里看到更详尽的信息、更多的搜索条件以及更多的操作功能,比如各个日志、在线用户等等。超级管理员 的个人账户页则与其他用户是完全不同的。
管理员具体分到几级可按需求自行决定。默认分了两级,即 系统管理员 和 二级单位管理员。
例如对于以下集团组织机构,可设计成三级管理员:
集团公司
├── 信息部
├── ...
├── 能源股份公司
│ ├── XX厂
│ │ ├── 生产运行科
│ │ ├── 综合管理科
│ │ └── ...
│ ├── XX研究院
│ │ ├── 技术研发科
│ │ └── ...
│ └── ...
├── 建设股份公司
│ ├── 第一工程分公司
│ │ ├── 工程技术科
│ │ ├── 质量安全科
│ │ └── ...
│ ├── 市政工程分公司
│ │ ├── 项目管理科
│ │ ├── 审计科
│ │ └── ...
│ └── ...
├── 智能制造股份公司
│ └── ...
└── ...
内置管理页面
QuickAdmin.Net 内置的系统管理相关 Razor 页面位于名为 "QAdmin" 的区域(Area)下,即各内置页面的相对路径是:
~/QAdmin/xxx
页面 "~/QAdmin/Setup/BuiltInPageList" 列出了所有内置的系统管理相关 Razor 页面,并指出了各页面对哪些用户可用。
本节没有把所有内置页面以及页面内的功能细节一一列出,请打开具体页面查看。关于各个数据项的说明,请到其对应实体的参考文档查阅。
基础数据初始化
系统基础数据初始化由 超级管理员 负责,可按以下顺序依次执行:
组织机构 -> 角色类别 -> 角色 -> 权限类别 -> 权限 -> 角色授权(角色拥有的权限) -> 角色组 -> 用户 -> 用户授权(用户拥有的角色/权限以及所在角色组) -> 首页功能菜单(侧边栏系统菜单、顶部快速链接以及右上用户菜单)
具体过程可根据实际情况调整,比如你的系统无须权限数据,只用角色就可满足授权需求,那就不用去初始化 权限类别/权限/角色组 等。
TIP
在大部分内置列表页面里,用鼠标双击记录行可直接打开编辑界面,等同于选取行然后点击页面里的 "编辑" 按钮。
若是只读列表,双击记录行将打开一个记录详情页面。某些页面的双击响应只有超级管理员才有。
组织机构与用户
QuickAdmin.Net 内置了两种用来维护组织机构(即部门)的页面,表格列表形式页面:
~/QAdmin/Dept/List
和树形式页面:
~/QAdmin/Dept/TreeModeList
可自行决定在系统菜单里添加哪一个供管理员使用。页内均提供了批量快速添加等等功能。
部门实体的部门类型属性和经纬度属性(Lon/Lat)默认未启用, 可通过重写 DeptService 的 GetAvailableDeptTypesAsync()、 EnableLonLat 来启用。
管理员在新增用户时,若不指定密码,新用户密码将是默认密码。 默认密码是 DefaultPasswordPrefix 配置 加上用户的 AccountId。 可通过重写 UserService 的 GenerateDefaultPasswordAsync() 方法去定制默认密码。若要定制密码策略,可去重写 ValidatePasswordPolicyAsync 方法(如何定制内置服务参见下一章节说明)。
用户的学历、职务、职称将分别从 UserService 的 Educations、JobTitles 和 ProfessionalTitles 属性的返回结果中选取,请按需去重写。
若用户的密码是默认密码,在登录后系统将强制用户修改密码,修改后才能继续使用系统。用户也不能把自己的密码修改为默认密码。
AllowAdminSpecifyUserPassword 以及 AllowAdminResetUserPassword 配置决定管理员能否给用户指定密码以及能否重置用户密码。
EnableUserMobileVerification/ EnableUserEmailVerification 配置分别决定用户能否直接修改自己的手机号码/邮箱地址,还是需要验证一下。
组织机构与用户均被设计为软删除实体,同时也提供了永久删除功能。
若使用了 FineUICore v13+,组织机构表格列表形式页面将采用树表格,并加入右键菜单(全部展开、全部折叠)。双击名称将展开/折叠节点,双击其它位置则仍然打开编辑页面。
角色与权限
系统内置 RBAC 权限系统,同时提供了角色、权限、角色组,你可根据项目实际情况决定使用哪些以及如何组合。角色组支持启用、停用。
角色默认被分为两类:管理员角色和业务角色,并默认添加了两个管理员角色:系统管理员 和 二级单位管理员。
角色的 AdminLevel-管理员级别 属性决定该角色是管理员角色(以及是哪级管理员角色),还是业务角色。 同时该属性也决定了管理员的分级深度:各角色中该属性的最大值就是管理员的最大分级。
可利用角色的 DefaultDataScopeLevel 属性指定数据权限范围。
权限默认无数据,按需去创建(由超级管理员负责)。
角色组默认无数据,按需去创建。
系统管理员 可新增、修改业务角色/角色组,但不能维护权限数据。可对所有角色/权限/角色组进行授权操作。
下级管理员 则不能维护任何角色/权限/角色组数据,只能对自己权限范围内的角色/角色组进行授权操作。
下级管理员的可授权范围由各个角色/角色组的可授权管理员级别属性决定。
首页功能菜单
系统菜单、快速链接、用户菜单 均可设置为点击时打开一个页面,还是执行指定的 js 脚本,参见各自的 NavigateUrl 属性。
还可指定在什么目标打开页面:应用内标签、浏览器标签或弹出窗口。快速链接/用户菜单通过 OpenIn 属性设置(SysSiteQuickLink.OpenIn/SysSiteUserMenu.OpenIn),系统菜单 则要通过其 AttributeDataTag 属性设置。
系统菜单提供了 NodeHTML 属性,快速链接/用户菜单则提供了 InnerHTML 属性(SysSiteQuickLink.InnerHTML/SysSiteUserMenu.InnerHTML),可完全指定显示内容及样式。设置的 HTML 里可用 "{0}" 代表名称或文本属性值。
若想要系统菜单树同时只能展开一个节点,将 EnableTreeSingleExpand 配置项置为 true。
快速链接可通过QuickLinkTextPosition 配置来指示是否显示文本以及文本显示在图标的哪个位置, 其它相关配置有: QuickLinkLeftRightMargin、 IsQuickLinkFixHeight。
QuickAdmin.Net 内部可自动识别 CssClass 为指定值的快速链接/用户菜单,各见其 CssClass 属性说明(SysSiteQuickLink.CssClass/SysSiteUserMenu.CssClass)。
用户菜单还支持 CheckBox 菜单项,相关属性有: RenderAsCheckBox、 CheckBoxGroupName、 CheckBoxHandler、 AttributeDataTag 。
可通过授权指定哪些 系统菜单/快速链接 对用户可见。
若快速链接和某一个系统菜单项指向同一页面,用户点击时将打开或激活同一个选项卡,不会打开两个选项卡。
新建各项目时,可以先不指定 NavigateUrl,系统会自动使用一个内置的空白页面,以方便初始化过程。
若使用了 FineUICore v13+,系统菜单、用户菜单列表页将采用树表格,并加入右键菜单(全部展开、全部折叠)。双击名称将展开/折叠节点,双击其它位置则仍然打开编辑页面。
系统参数
设计有一个系统参数表 SysParam,只有两个字段:Id、Value,用来存储任意配置信息。
之前在开发过程中,遇到不同的应用的需要动态设定的一些参数配置各不相同,不好统一结构,因此就设计了这么个 SysParam,Value 可以去存储简单的标量参数值如数值、日期、字符串等等, 复杂一些的可以去用 json 或其它自定义格式去存储。
对应的录入页面为:
~/QAdmin/Entity/List/QuickAdmin.Entity.Admin.SysParam/1/1
即是用内置的通用 CRUD 功能实现的,并无实际页面文件。该页面仅 超级管理员 可用。
QuickAdmin.Net 内部自动识别了一个特殊的 Id:"AdminExclusiveModeMsg",表示超级管理员独占模式下的提示信息。
即新建 Id 为 "AdminExclusiveModeMsg" 的记录并在 Value 里输入提示消息(如:"系统维护中,预计XX点XX分恢复访问"),系统将进入超级管理员独占模式:只允许超级管理员登录,其他用户登录时会弹出该提示消息(已登录用户不受影响)。 若 Value 为空白不会进入独占模式。
字典管理
QuickAdmin.Net 内置字典管理功能,采用了两级字典表结构:SysDictType 和 SysDictItem。
SysDictType 存储字典类型,即都有哪些字典。
SysDictItem 里则存储具体字典的各个项目。SysDictItem 设计有 Value/Name 字段,你可自由组合字典项,比如只用 Value,Value/Name 成对,或者 Value/Id 成对。
对应的管理页面分别为:
~/QAdmin/Entity/List/QuickAdmin.Entity.Admin.SysDictType/1/1
和
~/QAdmin/Entity/List/QuickAdmin.Entity.Admin.SysDictItem/1/1
这两个页面对 超级管理员 和 根机构管理员 可用,页内均提供了批量快速添加功能。它们是用内置的通用 CRUD 功能实现的,并无实际页面文件。
同时提供了对应的服务来获取字典项目:IDictItemService 的各个 GetAvailableXXX() 方法。
以及 UI 扩展,如:ExtLoadSysDictItemsByValue/ExtLoadSysDictItemsByNameAndValue, 只需一个方法即可自动填充下拉框控件。
QuickAdmin.json 配置文件
可通过 json 文件对 QuickAdmin.Net 应用进行配置,无须再次编译,如应用的名称、Logo、一些功能的启用/停用等等。默认使用应用 configs 目录下的 QuickAdmin.json 文件。
QuickAdmin.Net 内置了一个进行参数配置的页面:QuickAdmin Settings 页 (~/QAdmin/Setup/Settings),用来可视化修改并保存一些配置(并非所有配置项都可更改)。该页面仅超级管理员可用,且每次保存时都会进行备份。
文件中包含两部分配置:公共配置和 RCL 配置,RCL 配置位于名为 "RCL" 的 Section 里,可配置项以及各项默认值请分别参考 QuickAdminSettings类 和 QuickAdminRCLSettings类 文档。
可在 QuickAdmin.json 文件里仅输入非默认配置项,如:
{
"AppDeployName": "QHSE",
"RCL": {
"AppFullName": "QHSE",
"AppShortName": "QHSE",
"AppIcon": "img/logo.png",
"GlobalCss": "QAdmin/Res/css/solidBlueButtons.css, css/site.css",
"GlobalJs": "js/site.js",
"AutoRegisterCRUDProxies": true,
"NoDefaultIconOnInternalButtons": true,
"LoginPage": {
"EnableWeChatQRCodeLogin": true,
"PageCss": "css/login.css",
"PageJs": "js/login.js",
"LogoImg": "img/logo.png",
"FooterText": "© QHSE"
},
"IndexPage": {
"PageCss": "css/index.css",
"PageJs": "js/index.js",
"SidebarLogoImg": "img/logo.png",
"SidebarTitle": "QHSE",
"HomeTab": {
"TabTitle": "总览",
"TabUrl": "Dashboard"
}
}
}
}
可将配置 json 放入嵌入资源中,此时配置将无法更改。
也可实现部分配置硬编码,部分配置可修改,具体参见开发指南章节里的配置自定义部分。
数据库配置
数据库配置类为 DBSettings 类,默认取自 appsettings.json 里的名为 "DB" 的 Section:
{
...
"DB": {
"Type": "Sqlite",
"ConnectionString": "Data Source=./qadmindemo.db"
},
...
}
Type 可为 "Sqlite"、"SqlServer"、"Oracle"、"MySql"、"PostgreSQL" 等等, 参见 FreeSql 的 DataType 枚举。除过 SQLite,其它类型数据库需要先将数据库及用户账户建好。 MySql 数据库需要 v8.0+ (用到了 CTE 查询)。
v1.2.29+:对于 "Sqlite"/"Firebird" 数据库的连接字符串有特别处理:若连接字符串中包含 "{0}" 占位符,"{0}" 将被替换为应用所在目录,因此当数据库文件位于相对于应用所在目录的某个目录时,比如位于应用上一级目录下的 "db" 目录,你可以这样配置连接字符串:
{
...
"DB_Sqlite": {
"Type": "Sqlite",
"ConnectionString": "Data Source={0}/../db/myapp.db"
},
"DB_Firebird": {
"Type": "Firebird",
"ConnectionString": "database=localhost/3050:{0}/../db/myapp.fdb;user=qadmin;password=123456"
},
...
}
以下为一些数据库的账户创建脚本示例。QuickAdmin.Net.Templates 提供的项目模板里的 appsettings.json 里有不同类型数据库的连接串示例。
-- SqlServer
USE master
GO
CREATE DATABASE qadmindemo
GO
create login qadmin with password='qwer@1234', default_database=qadmindemo
GO
use qadmindemo
GO
create user qadmin for login qadmin with default_schema=dbo
GO
exec sp_addrolemember 'db_owner', 'qadmin'
GO
-- Oracle
CREATE USER qadmin IDENTIFIED BY 123456;
grant connect, resource to qadmin;
-- PostgreSQL
CREATE USER qadmin WITH ENCRYPTED PASSWORD '123456';
CREATE DATABASE qadmindemo with owner qadmin;
GRANT ALL PRIVILEGES ON DATABASE qadmindemo TO qadmin;
-- MySql
CREATE DATABASE qadmindemo;
CREATE USER 'qadmin'@'%' IDENTIFIED BY '123456';
GRANT CREATE ON *.* TO 'qadmin'@'%';
GRANT ALL PRIVILEGES ON qadmindemo.* TO 'qadmin'@'%';
FLUSH PRIVILEGES;
-- Dameng
CREATE USER qadmin IDENTIFIED BY "123456789";
GRANT PUBLIC, RESOURCE TO qadmin;
-- KingbaseES
CREATE USER qadmin WITH PASSWORD '123456';
CREATE DATABASE qadmindemo OWNER qadmin;
登录页
QuickAdmin.Net 内置了两个不同布局的登录页 "~/Login" 和 "~/UserLogin",具体用哪一个由配置文件里的 "RCL:LoginPage:UseUserLoginPage" 配置项决定,对应属性为 UseUserLoginPage。 可在示例项目里修改一下 UseUserLoginPage 配置查看效果。
内置登录页的全部配置项参考 LoginPageSettings 类。
可通过 PageCss/PageJs 配置给内置登录页加载自定义 css/js 文件,对页面元素进行调整,比如你要用自己的 Logo 图片或背景图片,此时可能需要调整一下相关元素的样式。 登录页有个已隐藏的 "忘记密码" 链接,可通过 js 将其显示出来,参见下节。
QuickAdmin.Net 还内置了用手机号+验证码登录以及微信扫码登录,默认未启用,也可使用自己的登录页面,如何实现参见下节说明。
默认页
QuickAdmin.Net 内置了 Index 页:"~/Index" 作为应用的默认页,该页面的可配置项参见 IndexPageSettings 类。
可通过 "RCL:IndexPage:HomeTab:TabUrl" 配置项指定首页 Url,对应属性为 TabUrl。
可通过 PageCss/PageJs 配置加载自定义 css/js 文件,对页面元素进行调整或加入需要的 js 代码。当有 系统菜单/快速链接/用户菜单 指定为执行一个 js 函数时, 就需要通过 PageJs 配置把含有该函数的 js 文件加载进来。
可通过 DefaultFrameStyle 配置项指定默认框架样式。
可通过配置项 ShowBreadcrumb 来指定顶部是否显示面包屑(即是否在顶部显示当前活动 Tab 页的页面路径),不在系统菜单树里的页面也可显示。在小屏设备上,页面路径会被始终隐藏。
另外,可通过 BreadcrumbAreaBoxFlex 和 QuickLinkAreaBoxFlex 配置项来控制面包屑区域和快速链接区域占据顶部空间的宽度比例。如果快速链接区域的宽度不足以容纳所有快速链接,靠左的项将被自动隐藏。
快速链接可通过QuickLinkTextPosition 配置来指示是否显示文本以及文本显示在图标的哪个位置, 其它相关配置有: QuickLinkLeftRightMargin、 IsQuickLinkFixHeight。
可通过重写 RCLService.CreateIndexPageFooterPanel() 方法,在底部显示一个包含自定义内容的页脚面板。
也可使用自己默认页,如何实现参见下节说明。
手动同步表结构
系统为 CodeFirst 内置了一个可用来手动同步表结构的页面:~/QAdmin/Setup/SyncStructure,可在该页面查看 CodeFirst 生成的 SQL、执行同步操作等等。
若系统连接了多个数据库,还可选取目标数据库。
TIP
同步操作仅在开发环境下可用。
手动加载DLL功能用来在以下情形使用:实体是在某个程序集内定义的,但该程序集尚未被加载(例如自应用启动以来还没有使用程序集内的任何对象),其内定义的实体类型也就没有在此页面显示出来,这时手动加载一下该程序集并刷新页面即可。
通用 CRUD 配置文件
默认情况下,应用 configs 目录下的 crudProxy 目录及其子目录下的所有 .json 文件被认为是通用 CRUD 配置文件, 若配置项 AutoRegisterCRUDProxies 为 true,将在应用程序启动时将它们一一加载。
有关通用 CRUD 的开发与配置在后边章节详细说明。
