系统管理指南
本节介绍 QuickAdmin.Net 内置管理功能,请对照示例项目或在线演示阅览。
管理员说明
管理员设计有 超级管理员 和 各级机构管理员,实现分级管理。
超级管理员 负责系统的初始化、配置以及日常维护工作,可去指定各级机构管理员,但不能参与业务,通常由开发或运维人员担任。 在后端数据库中,超级管理员存储于单独的表中,和系统用户表是分开的。
系统管理员(也叫根机构管理员) 负责整个机构的部门、用户管理以及授权工作,可去指定下级机构管理员,由上级部门相关人员担任。
下级管理员 负责其所在级别机构的部门、用户管理以及授权工作,由下级部门相关人员担任。
管理员具体分到几级可按需求自行决定。默认分了两级,即 系统管理员 和 二级单位管理员。
内置管理页面
QuickAdmin.Net 内置的系统管理相关 Razor 页面位于名为 "QAdmin" 的区域(Area)下,即各内置页面的相对路径是:
~/QAdmin/xxx
页面 "~/QAdmin/Setup/BuiltInPageList" 列出了所有内置的系统管理相关 Razor 页面,并指出了各页面对哪些用户可用。
这里没有把各个内置页面的功能细节一一列出,请打开具体页面查看。关于各个数据项的说明,请到其对应实体的参考文档查阅。
基础数据初始化
系统基础数据初始化由 超级管理员 负责,可按以下顺序依次执行:
组织机构 -> 角色类别 -> 角色 -> 权限类别 -> 权限 -> 角色授权(角色拥有的权限) -> 用户 -> 用户授权(用户拥有的角色/权限) -> 首页功能菜单(侧边栏系统菜单、顶部快速链接以及右上用户菜单)
具体过程可根据实际情况调整,比如你的系统无须权限数据,只用角色就可满足授权需求,那就不用去初始化 权限类别/权限 等。
QuickAdmin.Net 也提供了基础数据的导出、导入功能以方便迁移,具体见 导出系统基础数据 和 导入系统基础数据 页面。
TIP
在大部分列表页面里,用鼠标双击记录行可直接打开编辑界面,等同于选取行然后点击页面里的 "编辑" 按钮。
组织机构与用户
组织机构可进行批量快速添加,具体见 组织机构管理 页面。
管理员在新增用户时,若不指定密码,新用户密码将是默认密码。 默认密码是 DefaultPasswordPrefix 配置 加上用户的 AccountId。 可通过重写 UserService 的 GenerateDefaultPassword() 方法去定制默认密码。
管理员不能修改现存用户的密码,只能去重置用户密码,即将用户的密码重置为默认密码。
若用户的密码是默认密码,在登录后系统将强制用户修改密码,修改后才能继续使用系统。用户也不能把自己的密码修改为系统默认密码。
组织机构与用户均被设计为软删除实体,并且记录了用户部门日志(即用户的部门调动记录),以便能够查询历史业务。同时也提供了永久删除功能。
角色与权限
角色默认被分为两类:管理员角色和业务角色,并默认添加了两个管理员角色:系统管理员 和 二级单位管理员。
角色的 AdminLevel-管理员级别 属性决定该角色是管理员角色(以及是哪级管理员角色),还是业务角色。 同时该属性也决定了管理员的分级深度:各角色中该属性的最大值就是管理员的最大分级。
权限默认无数据,按需去创建。
权限默认不能直接授给用户,即默认只可将权限授予角色,用户再通过角色拥有相应权限。可通过配置参数 AllowGrantPermissionsToUser 更改。
系统管理员 可新增/修改业务角色,但不能维护权限数据。可对所有角色/权限进行授权操作。
下级管理员 则不能维护任何角色/权限数据,只能对自己权限范围内的角色/权限进行授权操作。
首页功能菜单
系统菜单、快速链接、用户菜单 均可设置为点击时打开一个页面,还是执行指定的 js 脚本,参见各自的 NavigateUrl 属性。
还可指定在什么目标打开页面:应用内标签、浏览器标签或弹出窗口。快速链接/用户菜单 通过 OpenIn 属性设置,系统菜单 则要通过其 AttributeDataTag 属性设置。
可通过授权指定哪些菜单项对用户可见。快速链接/用户菜单 还提供了 InnerHTML 属性,可完全指定显示内容及样式。
若快速链接和某一个系统菜单项指向同一页面,用户点击时将打开或激活同一个选项卡,不会打开两个选项卡。
QuickAdmin.json 配置文件
可通过 json 文件对 QuickAdmin.Net 应用进行配置,无须再次编译,如应用的名称、Logo、一些功能的启用/停用等等。默认使用应用 configs 目录下的 QuickAdmin.json 文件加载/保存配置。
该文件中包含两部分配置:公共配置和 RCL 配置,可配置项目请分别参考QuickAdminSettings类和QuickAdminRCLSettings类文档。
QuickAdmin.Net 也内置了一个进行参数配置的页面:QuickAdmin Settings 页,用来可视化修改并保存一些配置(并不是所有配置项都可更改)。该页面仅超级管理员可用。
在生产环境中,可将配置 json 放入嵌入资源中,此时配置项将无法更改。
以下为默认的配置 json:
{
"AllowLoginWithMobileOrEmail": true,
"EnableLoginCaptcha": true,
"MaxPasswordRetryTimes": 5,
"UserLockedDuration": 300,
"BrowserAutoLoginMode": 1,
"BrowserAutoLoginTokenExpireDays": 30,
"BrowserHashValidationMode": 0,
"AllowAdminResetUserPassword": true,
"DefaultPasswordPrefix": null,
"CacheUserRights": true,
"AllowGrantPermissionsToUser": false,
"SiteMenuItemAvailableByDefault": true,
"EnableUserEmailVerification": false,
"EnableUserMobileVerification": false,
"AllowAdminModifyUserEmailAndMobile": true,
"MobileRegexPattern": "^([1][3,4,5,6,7,8,9])\\d{9}$",
"DefaultPagingSize": 20,
"DiagnosticsLevel": 1,
"IsClientSideDateTimeDisplayedAsServerTime": null,
"CookieNamePostfix": null,
"TempPath": null,
"AppPathBase": null,
"RCL": {
"AppFullName": "QuickAdmin.Net",
"AppShortName": "QuickAdmin.Net",
"AppIcon": "QAdmin/Res/img/logoc.png",
"GlobalCss": null,
"GlobalJs": null,
"EnableRequestBuffering": false,
"CaptchaLength": 4,
"CaptchaLetters": "123456789abdefhkmnprswxyABCDEFGHJKLMNPRSTWXY",
"CaptchaNoiseLineCount": 6,
"DefaultPageName": null,
"LoginPageName": null,
"CRUDProxyCfgDirectory": "configs/crudProxy",
"AutoRegisterCRUDProxies": false,
"ShowOpLogInUserAccountModule": false,
"EnablePasswordExpiredHandler": true,
"EnableLoginAPI": true,
"EnableCaptchaAPI": true,
"EnableWeChatMiniProgAPI": false,
"NoDefaultIconOnInternalButtons": false,
"DemoWeChatMiniProgAppId": null,
"DemoWeChatMiniProgAppSecret": null,
"LoginPage": {
"Enabled": true,
"UseUserLoginPage": false,
"EnableWeChatQRCodeLogin": false,
"PageCss": null,
"PageJs": null,
"LogoImg": "QAdmin/Res/img/logos.png",
"FooterText": "© quickadmin.net"
},
"IndexPage": {
"Enabled": true,
"PageCss": null,
"PageJs": null,
"SidebarWidth": 250,
"SidebarLogoImg": "QAdmin/Res/img/logos.png",
"SidebarTitle": "QuickAdmin",
"SidebarCollapsed": false,
"MaxTabCount": 10,
"SingleTabMode": false,
"ExpandTreeNodeIndexes": null,
"IgnoreIconsForEachTab": false,
"CloseTabAfterOpenInNewWindow": false,
"CacheOpenedWindows": false,
"LoadingImg": null,
"QuickLinkTextPosition": 4,
"HomeTab": {
"TabTitle": "首页",
"TabUrl": null,
"Closeable": false,
"IconFont": "_Home",
"Icon": null,
"IconFontClass": null,
"IconUrl": null
}
},
"UserProfilePage": {
"PageCss": null,
"PageJs": null
},
"Buttons": null
}
}
通用 CRUD 配置文件
默认情况下,应用 configs 目录下的 crudProxy 目录及其子目录下的所有 .json 文件被认为是通用 CRUD 配置文件, 若配置项 AutoRegisterCRUDProxies 为 true,将在应用程序启动时将它们一一加载。
有关通用 CRUD 的开发与配置在后边章节详细说明。
数据库配置
数据库配置类为 DBSettings 类,默认取自 appsettings.json 里的名为 "DB" 的 Section:
{
"DB": {
"Type": "Sqlite",
"ConnectionString": "Data Source=.\\qadmindemo.db"
}
}
Type 可为 "Sqlite"、"SqlServer"、"Oracle"、"MySql"、"PostgreSQL" 等等, 参见 FreeSql 的 DataType 枚举。
登录页
QuickAdmin.Net 内置了两个不同布局的登录页 "~/Login" 和 "~/UserLogin",具体用哪一个由配置文件里的 "RCL:LoginPage:UseUserLoginPage" 配置项决定,对应属性为 UseUserLoginPage。 可在示例项目里修改一下 UseUserLoginPage 配置查看效果。
内置登录页的全部配置项参考 LoginPageSettings 类。
可通过 PageCss/PageJs 配置给内置登录页加载自定义 css/js 文件,对页面元素进行调整,比如你要用自己的 Logo 图片或背景图片,此时可能需要调整一下相关元素的样式。
例如你要用户能够始终自动登录,不需要显示 "下次自动登录" 检查框,即:隐藏该检查框,且始终置为选中状态,像如下效果:
做法为:在应用 wwwroot/js 目录下新建一个名为 login.js 的 JS 文件,内容如下:
F.ready(function () {
$('input.SavePassword').prop('checked', true);
$('input.SavePassword').closest('.login-form4').hide();
if (F('SavePassword')) {
F('SavePassword').setValue(true);
F('SavePassword').hide();
}
F.ui.outterPanel.doLayout();
});
然后配置 PageJs 项即可:
{
...
"RCL": {
...
"LoginPage": {
...
"PageJs": "js/login.js",
...
},
...
}
}
TIP
F.ready() 为 FineUICore 的客户端对象函数,在使用了 FineUICore 的页面,要在页面加载完成时执行 JS 代码,通常要用 F.ready() 而不是 jQuery 的 ready() 方法。
登录页内还有一个隐藏的 "忘记密码" 链接,以及其它元素,也可通过 PageCss/PageJs 配置去显示或填充其它内容。
也可使用自己的登录页面,如何实现参见下节说明。
默认页
QuickAdmin.Net 内置了 Index 页:"~/Index" 作为应用的默认页,该页面的可配置项参见 IndexPageSettings 类。
支持单选项卡或多选项卡模式,由配置文件里的 "RCL:IndexPage:SingleTabMode" 配置项决定,对应属性为 SingleTabMode。
可通过 "RCL:IndexPage:HomeTab:TabUrl" 配置项指定首页 Url,对应属性为 TabUrl。
可通过 PageCss/PageJs 配置加载自定义 css/js 文件,对页面元素进行调整或加入需要的 js 代码。当有 系统菜单/快速链接/用户菜单 指定为执行一个 js 函数时, 就需要通过 PageJs 配置把含有该函数的 js 文件加载进来。
也可使用自己默认页,如何实现参见下节说明。