文章目录
组织管理
组织管理
组织=公司,记录使用本系统的组织与各级子组织信息,顶级组织的上级组织为空。
ENABLED_FLAG
字段为Y
(未封存)的为有效数据ENABLED_FLAG
字段为N
(封存)的为无效数据
部门管理
记录各级组织下的各级部门信息。各级组织自身也作为部门数据存放此。
ENABLED_FLAG
字段为Y
(未封存)的为有效数据ENABLED_FLAG
字段为N
(封存)的为无效数据- 部门类型:普通部门,虚拟部门,公司,事业部
- 部门级别:一级部门最高,最多存在五级部门,一般来讲,1级:总部部门或事业部,2级:事业部部门,3级:科系,4级:班组
- 主要负责人:部门负责人
- 主持人:实际工作调动后,官方调动公告发布前,间隔期内的部门负责人。当存在主持人时,主持人优先级高于主要负责人
- 分管负责人:总经办部门的各位领导,基于分工原则,展开对其它部门的管理。各部门对应的总经办领导即为本部门分管负责人
- 一个部门只能隶属于一个组织
岗位管理
针对部门内不同性质与内容的工作,作出的一种划分方式。
ENABLED_FLAG
字段为Y
(未封存)的为有效数据ENABLED_FLAG
字段为N
(封存)的为无效数据- 岗位序列:管理岗(M),技术岗(T),专业岗§,作业岗(N)等
- 部门编码:岗位所属的部门。不同部门的相同岗位名称的岗位,具有不同的岗位编码
- 一个岗位只能隶属于一个部门
员工管理
显示公司各部门员工的基本信息。IS_IN_JOB
为Y
(未结束)且ENABLED_FLAG
为Y
(未封存)的为有效数据
IS_IN_JOB
为Y
(未结束)且ENABLED_FLAG
为Y
(未封存)的为有效数据(在职)IS_IN_JOB
为N
(未结束)或ENABLED_FLAG
为N
(封存)的为无效数据(离职)- 使用员工编码唯一识别不同的员工
- 同一个员工,可能属于多个岗位(进而对应多个部门)
工作信息
记录了员工在公司各岗位的工作履历。表现为员工管理界面右边的岗位数据。
IS_IN_JOB
为Y
(未结束)且post_stat
为Y
(在岗)且ENABLED_FLAG
为Y
(未封存)的为有效数据(在岗)IS_IN_JOB
为N
(未结束)或post_stat
为N
(在岗)或ENABLED_FLAG
为N
(封存)的为无效数据(离岗)- 一个员工,可以同时在多个岗位任职
- 一个员工,有且只能有一条有效的主岗信息。
PRIMARY_POSITION_FLAG
为Y
(是否主职)的为主岗
账户管理
账户管理
显示公司各部门员工的账户信息。
- 使用账户名唯一识别不同的账户
- 账户名与员工编码保持一致,一个员工只能有一个账户
登录配置
安全策略
名称 | 默认值 | 说明 |
---|---|---|
失败次数统计范围(分钟) | 10 | 密码输入错误的次数统计的时间范围 |
登录失败次数 | 5 | 范围时间内密码输入错误而触发锁定动作的最高次数 |
登录失败锁定时长(分钟) | 60 | 触发锁定后的锁定时长 |
密码策略
名称 | 默认值 | 说明 |
---|---|---|
密码最小长度 | 8 | 设置密码的最小长度 |
密码复杂度要求 | 必须混合数字、大小写字母和符号 | 密码需要这四种元素组合,缺一不可 |
密码失效时间 | 0 | 单位:天,0表示密码不过期 |
登录策略
名称 | 值 | 说明 |
---|---|---|
首次登陆修改密码 | 是 | 首次登陆强制新账户修改密码 |
禁止账户重复登录 | 否 | 同一账户不能同时在多个地点登录 |
角色合并 | 是 | 合并后,登录不在需要选择角色,菜单、权限都是合并后的 |
跳转URL | / | 登录成功以后跳转的URL |
角色管理
管理本系统的角色信息。在左边维护角色清单,并为右边的员工分配各类角色
- 角色编码需保持唯一
- 当将某角色勾选为默认角色后,现有员工不受影响,基于HR系统新增或修改的员工将自动拥有此角色
- 当将某角色取消勾选默认角色后,现有员工不受影响,基于HR系统新增或修改的员工将不再自动拥有此角色
默认角色管理
为不同岗位的新员工设定默认角色。在左边的角色清单中,为右边的岗位分配各类角色
- 当为某岗位勾选默认角色后,现有岗位对应员工不受影响,基于HR系统新增或修改的岗位员工将自动拥有此角色
- 当为某岗位取消勾选默认角色后,现有员工不受影响,基于HR系统新增或修改的岗位员工将不再自动拥有此角色
功能权限
资源管理
页面资源注册
属性 | 描述 |
---|---|
URL | 资源路径,不以/开头,不包含项目上下文路径 |
类型 | HTML页面,URL服务 |
名称 | 页面名称 |
描述 | 页面描述 |
需要登录 | 当勾选时,只有登录用户才能访问本资源,否则任意用户都可访问本资源 |
权限控制 | 当勾选时,登录用户只能访问经过授权的资源和资源上的权限组件,否则登录用户可以访问全部的资源和权限组件 |
权限组件注册
定义资源上可供权限控制的各类组件。当未设置时,则所有组件都可直接访问
权限组件属性
属性 | 描述 |
---|---|
组件类型 | 组件所属的类型,共有四种,分别为服务端变量、表格、表单和按钮组 |
组件标识单 | 组件在页面中的唯一标识,通常为组件的ID |
组件名称 | 组件的名称 |
权限组件元素属性
属性 | 描述 |
---|---|
类型 | 组件中元素的类型 |
属性 | 由类型带出,不可编辑,表示元素的标识,有id,className,name等 |
属性值 | 元素的标识的具体值,如id=“save”,class=“edit”,field="gender"等 |
名称 | 元素的名称 |
表格组件
控制表格中的元素,首先需要定义表格的组件标识,与界面中表格的ID相同。表格中的元素主要分为三种类型
属性 | 描述 |
---|---|
工具栏按钮 | 表格中的toolbar,表格上方的按钮 |
表格列按钮 | 表格列中的按钮 |
表格列 | 表格中的列 |
对应的代码如下
表单组件
控制表单中的元素,首先需要定义表单的组件标识,与界面中表单的ID相同。表单中的元素主要分为两种类型
属性 | 描述 |
---|---|
字段 | 表单中的字段,比如邮件输入框 |
按钮 | 表单中的按钮,比如保存按钮 |
对应的代码如下
按钮组
主要是为了区分是表单的按钮,还是表单外的按钮,所以单独定义了一个按钮组类型
属性 | 描述 |
---|---|
按钮 | 按钮组中的按钮,比如保存按钮 |
对应的代码如下
功能维护
- 定义项目功能
- 定义树形菜单结构,关联各级菜单对应打开的页面资源
- 如果对应页面资源勾选了
权限控制
,还需在功能资源
中再次关联本资源,实现对页面资源和权限组件的授权管理(目前已实现自动关联)
功能分配
角色权限设置
- 选择相应的角色,勾选启用对应功能
- 如果功能对应的资源勾选了
权限控制
,且设置了对应的权限组件,则可进一步点击权限设置
,为该角色设置相应的组件权限
有如下注意事项
- 除服务端变量外的组件,权限设置时,默认是启用状态
- 不支持对同一页面属于多个功能的情况 进行权限设置, 如订单页面,可能会有多个功能会共用这个页面,在某一个功能中设置了订单页面的权限,则会导致所有功能都是同样的权限。暂时的解决方案是新建一个页面,将共有的页面include进去,然后进行配置
- 如果用户登录时,开启了角色合并,则相应的组件权限将合并。其中服务端变量类型不支持角色合并。合并的规则是,角色拥有相同功能的,进行组件权限合并,只要其中一个角色拥有组件权限,则表示启用
账户权限设置
- 打开账户管理界面,选择相应的用户,点击权限设置
- 系统弹出登录用户所拥有的所有角色合并后的菜单
- 后续操作与角色权限设置保持一致
有如下注意事项
- 用户权限不支持配置服务端变量
- 对于同一个资源,如果当前用户所拥有的角色已经分配了组件权限,而用户又单独配置了一次,则以用户设置的为主
总结
综合上述说明,组合五个选项,可以得出如下配置组合
资源管理 | 功能维护 | 功能分配 | 访问控制 | ||
---|---|---|---|---|---|
登录用户 | 权限控制 | 功能资源 | 是否启用 | 权限设置 | |
否 | 所有用户可以访问页面资源 | ||||
是 | 否 | 否 | 登录用户无法访问页面资源 | ||
是 | 否 | 是 | 登录用户可以访问页面资源 | ||
是 | 是 | 否 | 是 | 登录用户无法访问页面资源 | |
是 | 是 | 是 | 否 | 登录用户无法访问页面资源 | |
是 | 是 | 是 | 是 | 否 | 登录用户可以访问页面资源,无法访问组件资源 |
是 | 是 | 是 | 是 | 是 | 登录且授权用户可以访问页面资源及组件资源 |
示例
原界面
新界面
数据权限
所谓数据权限,即特定范围的用户查看特定范围的数据。通过在拦截器技术,LCP在Mapper层捕获正常执行的sql语句,通过预设参数针对不同用户追加不同的where条件,使之实现对特定用户特定范围的过滤效果。
例如,不同部门的资产管理员,只能看到本部门管理范围内的资产
信息技术部资产管理员 | 人事总务部资产管理员 | 运营管理部资产管理员 |
---|---|---|
无数据权限
当方法未添加数据权限时,查询后将展示所有的数据
代码示例:
List<OwnAssetCard> selectCards(IRequest requestContext, OwnAssetCard dto, int page, int pageSize);
生成的sql脚本为
SELECT
t.*,
ty.TYPE_NAME AS assetTypeName,
ty.IS_FIXATION AS isFixation,
e.NAME AS USE_MAN_NAME,
b.COMPANY_FULL_NAME AS COMPANY_NAME,
b1.COMPANY_FULL_NAME AS orgName,
o.NAME AS deptName,
o1.NAME AS manageDeptName,
o2.NAME AS bindDeptName
FROM
t_ams_asset_card t
LEFT JOIN T_AMS_ASSET_TYPE ty ON ty.TYPE_NO = t.ASSET_TYPE
AND t.FINANCE_CODE = ty.ORG_CODE
LEFT JOIN hr_employee e ON t.USE_MAN = e.EMPLOYEE_CODE
LEFT JOIN fnd_company_b b ON t.FINANCE_CODE = b.COMPANY_CODE
LEFT JOIN hr_org_unit_b o ON t.DEPT_CODE = o.UNIT_CODE
LEFT JOIN hr_org_unit_b o1 ON t.MANAGE_DEPT = o1.UNIT_CODE
LEFT JOIN hr_org_unit_b o2 ON t.BIND_DEPT = o2.UNIT_CODE
LEFT JOIN fnd_company_b b1 ON t.org_code = b1.COMPANY_CODE
WHERE
t.ASSET_MODULE = 'OWN'
AND t.IS_DELETE = 'N'
AND t.CARD_STATUS IN ( 'IN_USE', 'IDIE', 'SCRAPPED', 'DISPOSAL' )
ORDER BY
CREATION_DATE DESC
使用效果
创建者数据权限
com.fsl.lcp.auth.annotation.UserAuth
按数据创建者过滤数据,可以实现员工只能查看自己创建的数据,和部门权限注解互斥
参数 | 说明 |
---|---|
value | 数据表里的创建者字段,填写规则为"创建者字段名"。可空,默认取created_by_user字段 |
rule | 拼接规则,默认是OR规则,取并集,AND规则是取交集。和通用数据权限注解一起使用时生效。 |
使用说明
- 本注解使用在Mapper类上
- 使用本注解后,系统基于当前登录用户上下文信息,进行sql拼接
使用示例
使用代码:
@UserAuth
List<OwnAssetCard> selectCards(IRequest requestContext, OwnAssetCard dto, int page, int pageSize);
生成的sql脚本为
SELECT
*
FROM
(
SELECT
t.*,
ty.TYPE_NAME AS assetTypeName,
ty.IS_FIXATION AS isFixation,
e.NAME AS USE_MAN_NAME,
b.COMPANY_FULL_NAME AS COMPANY_NAME,
b1.COMPANY_FULL_NAME AS orgName,
o.NAME AS deptName,
o1.NAME AS manageDeptName,
o2.NAME AS bindDeptName
FROM
t_ams_asset_card t
LEFT JOIN T_AMS_ASSET_TYPE ty ON ty.TYPE_NO = t.ASSET_TYPE
AND t.FINANCE_CODE = ty.ORG_CODE
LEFT JOIN hr_employee e ON t.USE_MAN = e.EMPLOYEE_CODE
LEFT JOIN fnd_company_b b ON t.FINANCE_CODE = b.COMPANY_CODE
LEFT JOIN hr_org_unit_b o ON t.DEPT_CODE = o.UNIT_CODE
LEFT JOIN hr_org_unit_b o1 ON t.MANAGE_DEPT = o1.UNIT_CODE
LEFT JOIN hr_org_unit_b o2 ON t.BIND_DEPT = o2.UNIT_CODE
LEFT JOIN fnd_company_b b1 ON t.org_code = b1.COMPANY_CODE
WHERE
t.ASSET_MODULE = 'OWN'
AND t.IS_DELETE = 'N'
AND t.CARD_STATUS IN ( 'IN_USE', 'IDIE', 'SCRAPPED', 'DISPOSAL' )
) auth
WHERE
auth.created_by_user IN ( '008022' )
ORDER BY
AUTH.CREATION_DATE DESC
使用效果
部门数据权限
com.fsl.lcp.auth.annotation.OrgAuth
按组织架构过滤数据
- Value、rule、type组合使用,实现上级部门的员工可以查看本级以及下级部门的数据,和创建者权限注解互斥。
- Value、rule、chargeOnly、creatorColumn组合使用,实现部门主要负责人或主持人才能查看本级及下级部门的数据,普通员工查看自己创建的数据。
参数 | 说明 |
---|---|
value | 数据表里的字段,可空,默认取created_org字段 |
rule | 拼接规则,默认是OR规则,取并集,AND规则是取交集。和通用数据权限注解一起使用时生效。 |
type | 组织权限类型,UNIT_CODE,按所有所属组织过滤,DEPT_CODE,按所有所属部门过滤,POSITIONORG_CODE,按所有所属岗位部门(含下级部门)过滤。默认值为POSITIONORG_CODE |
chargeOnly | true/false,默认是false。是否只有主要负责人或主持人有权限查看本级以及下属部门的所有数据, 普通员工只能查看自己创建的数据。值为true时,type字段失效不需要配置 |
creatorColumn | 数据表里的字段,可空,默认取 created_by_user 字段。当chargeOnly参数为true时生效,当登录用户不是主要负责人或者主持人时,根据此字段匹配自己创建的数据 |
使用说明
- 本注解使用在Mapper类上
- 使用本注解后,系统基于当前登录用户上下文信息,进行sql拼接
- 一般来讲,UNIT_CODE类型配合created_unit_code字段使用,DEPT_CODE类型配合created_dept_code字段使用,POSITIONORG_CODE类型配合created_org字段使用
使用示例
代码示例:
@OrgAuth(value = "DEPT_CODE", type = OrgAuth.Type.DEPT_CODE)
List<OwnAssetCard> selectCards(IRequest requestContext, OwnAssetCard dto, int page, int pageSize);
生成的sql脚本为
SELECT
*
FROM
(
SELECT
t.*,
ty.TYPE_NAME AS assetTypeName,
ty.IS_FIXATION AS isFixation,
e.NAME AS USE_MAN_NAME,
b.COMPANY_FULL_NAME AS COMPANY_NAME,
b1.COMPANY_FULL_NAME AS orgName,
o.NAME AS deptName,
o1.NAME AS manageDeptName,
o2.NAME AS bindDeptName
FROM
t_ams_asset_card t
LEFT JOIN T_AMS_ASSET_TYPE ty ON ty.TYPE_NO = t.ASSET_TYPE
AND t.FINANCE_CODE = ty.ORG_CODE
LEFT JOIN hr_employee e ON t.USE_MAN = e.EMPLOYEE_CODE
LEFT JOIN fnd_company_b b ON t.FINANCE_CODE = b.COMPANY_CODE
LEFT JOIN hr_org_unit_b o ON t.DEPT_CODE = o.UNIT_CODE
LEFT JOIN hr_org_unit_b o1 ON t.MANAGE_DEPT = o1.UNIT_CODE
LEFT JOIN hr_org_unit_b o2 ON t.BIND_DEPT = o2.UNIT_CODE
LEFT JOIN fnd_company_b b1 ON t.org_code = b1.COMPANY_CODE
WHERE
t.ASSET_MODULE = 'OWN'
AND t.IS_DELETE = 'N'
AND t.CARD_STATUS IN ( 'IN_USE', 'IDIE', 'SCRAPPED', 'DISPOSAL' )
) auth
WHERE
auth.DEPT_CODE IN ( 'A15' )
ORDER BY
AUTH.CREATION_DATE DESC
LIMIT 0,
10
使用效果为
通用数据权限
自定义数据权限的拼接sql,分配给对应的用户,该用户登录的时候,只能查看该拼接sql范围内的数据
权限资源定义
定义需要拼接的过滤sql语句。内置如下系统变量,系统在执行时会自动将变值替换为实际值
名称 | 说明 |
---|---|
@unitCode | 所属组织 |
@deptCode | 所属部门 |
@parentOrgCode | 主岗上级部门 |
@orgCode | 主岗部门 |
@mainPostionCode | 主岗编码 |
@employeeCode | 员工编码 |
@userName | 账户编码 |
@oneLevelDept | 登录员工主岗所属一级部门 |
@twoLevelDept | 登陆员工主岗所属二级部门 |
@threeLevelDept | 登陆员工主岗所属三级部门 |
@fourLevelDept | 登陆员工主岗所属四级部门 |
@fiveLevelDept | 登陆员工主岗所属五级部门 |
用户分配资源
一个用户,可以在同一资源组不同类型间分配多次,但在同一类型中只能分配一次。可以借用下面的概念理解
- 资源组=组织
- 资源类型=部门
- 资源=岗位
后台代码使用
com.fsl.lcp.auth.annotation.DataAuth
参数 | 说明 |
---|---|
value | 资源权限组编码。指明这次查询需要从哪个组挑选sql |
使用说明
- 本注解使用在Mapper类上
- 编写sql语句时,请使用auth别名引用列名
- 如果定义了资源sql,却没有分配给当前登陆的用户,则不会返回任何数据
- 当在同一分组中获取到不同类型的多个条过滤条件时,使用or关系连接各条件
- 输入不存在的资源组code,不会返回任何数据
- 拼接后的sql有问题的,会产生sql错误
使用示例
资源定义
(auth.ASSET_TYPE in ('010506','010507') and auth.DEPT_CODE like '@oneLevelDept%')
代码示例
@DataAuth("own_data")
List<OwnAssetCard> selectCards(IRequest requestContext, OwnAssetCard dto, int page, int pageSize);
生成的sql脚本为
SELECT
*
FROM
(
SELECT
t.*,
ty.TYPE_NAME AS assetTypeName,
ty.IS_FIXATION AS isFixation,
e.NAME AS USE_MAN_NAME,
b.COMPANY_FULL_NAME AS COMPANY_NAME,
b1.COMPANY_FULL_NAME AS orgName,
o.NAME AS deptName,
o1.NAME AS manageDeptName,
o2.NAME AS bindDeptName
FROM
t_ams_asset_card t
LEFT JOIN T_AMS_ASSET_TYPE ty ON ty.TYPE_NO = t.ASSET_TYPE
AND t.FINANCE_CODE = ty.ORG_CODE
LEFT JOIN hr_employee e ON t.USE_MAN = e.EMPLOYEE_CODE
LEFT JOIN fnd_company_b b ON t.FINANCE_CODE = b.COMPANY_CODE
LEFT JOIN hr_org_unit_b o ON t.DEPT_CODE = o.UNIT_CODE
LEFT JOIN hr_org_unit_b o1 ON t.MANAGE_DEPT = o1.UNIT_CODE
LEFT JOIN hr_org_unit_b o2 ON t.BIND_DEPT = o2.UNIT_CODE
LEFT JOIN fnd_company_b b1 ON t.org_code = b1.COMPANY_CODE
WHERE
t.ASSET_MODULE = 'OWN'
AND t.IS_DELETE = 'N'
AND t.CARD_STATUS IN ( 'IN_USE', 'IDIE', 'SCRAPPED', 'DISPOSAL' )
) auth
WHERE
( ( auth.ASSET_TYPE IN ( '010506', '010507' ) AND auth.DEPT_CODE LIKE 'A15%' ) )
ORDER BY
AUTH.CREATION_DATE DESC
LIMIT 0,
10
使用效果为
组合使用
可将通用数据权限与创建者数据权限,或者通用数据权限与部门数据权限组合使用
使用示例
代码示例
@DataAuth("own_data")
@OrgAuth(value = "DEPT_CODE", rule = OrgAuth.Rule.OR, type = OrgAuth.Type.DEPT_CODE)
List<OwnAssetCard> selectCards(IRequest requestContext, OwnAssetCard dto, int page, int pageSize);
生成的sql脚本为
SELECT
*
FROM
(
SELECT
t.*,
ty.TYPE_NAME AS assetTypeName,
ty.IS_FIXATION AS isFixation,
e.NAME AS USE_MAN_NAME,
b.COMPANY_FULL_NAME AS COMPANY_NAME,
b1.COMPANY_FULL_NAME AS orgName,
o.NAME AS deptName,
o1.NAME AS manageDeptName,
o2.NAME AS bindDeptName
FROM
t_ams_asset_card t
LEFT JOIN T_AMS_ASSET_TYPE ty ON ty.TYPE_NO = t.ASSET_TYPE
AND t.FINANCE_CODE = ty.ORG_CODE
LEFT JOIN hr_employee e ON t.USE_MAN = e.EMPLOYEE_CODE
LEFT JOIN fnd_company_b b ON t.FINANCE_CODE = b.COMPANY_CODE
LEFT JOIN hr_org_unit_b o ON t.DEPT_CODE = o.UNIT_CODE
LEFT JOIN hr_org_unit_b o1 ON t.MANAGE_DEPT = o1.UNIT_CODE
LEFT JOIN hr_org_unit_b o2 ON t.BIND_DEPT = o2.UNIT_CODE
LEFT JOIN fnd_company_b b1 ON t.org_code = b1.COMPANY_CODE
WHERE
t.ASSET_MODULE = 'OWN'
AND t.IS_DELETE = 'N'
AND t.CARD_STATUS IN ( 'IN_USE', 'IDIE', 'SCRAPPED', 'DISPOSAL' )
) auth
WHERE
( ( auth.ASSET_TYPE IN ( '010506', '010507' ) AND auth.DEPT_CODE LIKE 'A15%' ) )
OR auth.DEPT_CODE IN ( 'A15' )
ORDER BY
AUTH.CREATION_DATE DESC
LIMIT 0,
10
使用效果
分页集成
当在标记了数据权限的方法中使用分页时,需要在service层使用下面的API进行分页
com.fsl.lcp.auth.sqlsource.ExtensionSqlUtil
方法 | 说明 |
---|---|
startPage(int pageNum, int pageSize) | 分页,设置当前页码与每页条数。当pageSize设为0时,表示不分页,将返回所有符合条件的数据 |
实现方案
注解 | 说明 |
---|---|
DataAuth | 通过mybatis拦截器和注解,获取当前登录用户分配的权限拼接sql,拼接修改sql |
OrgAuth | 通过mybatis拦截器和注解,获取当前登录用户上下文信息,拼接修改sql |
UserAuth | 通过mybatis拦截器和注解,获取当前登录用户,拼接修改sql |
参数管理
外观维护
设定系统的外观参数
属性 | 描述 |
---|---|
系统标题 | 浏览器标题栏的名称 |
系统logo | 原标准登录中显示的系统图标,已废弃 |
favicon | 浏览器标展示本系统时显示的图标 |
首页配置
设定系统首页内仪表盘的展示内容与顺序
通过设置参数,设置首页的刷新间隔。默认为60秒
sys.home.refresh.interval=60
属性 | 描述 |
---|---|
代码 | 显示的仪表盘代码 |
标题 | 显示的仪表盘标题 |
描述 | 显示的仪表盘描述信息 |
入口页面 | 首先需将页面注册为资源,然后选择本资源作为仪表盘界面显示在首页 |
排序号 | 从左到右,从上到下依次显示,序号小的排在前面 |
是否有效 | 如无效,则不会在首页显示 |
当前可用仪表盘如下
编码 | 名称 | 描述 | 默认启用 |
---|---|---|---|
DB_WFL_ALL | 业务流程 | 显示在系统集成功能中注册了的系统的当前登录用户的待办,抄送,发起,参与任务数量与列表链接 | 否 |
DB_WFL_TODO2 | 待办事项 | 显示当前系统当前登录用户的待办列表 | 是 |
PORTAL_DD_TODO | 钉钉待办事项 | 显示所有与钉钉做了工作流集成的系统的当前登录用户的所有待办列表 | 否 |
PROMPT | 消息提醒 | 显示当前系统当前登录用户的站内通知列表 | 是 |
系统参数
设置自定义系统参数。有三种参数作用域
属性 | 描述 |
---|---|
全局 | 全局生效的参数 |
角色 | 指定角色生效的参数 |
用户 | 指定用户生效的参数 |
当为同一个参数设定了多个作用域时,默认情况下,参数选用优先级为:用户>角色>全局。可使用levelId参数获取指定作用域的值
@RequestMapping(value = "/profilevalue/query", method = {
RequestMethod.GET, RequestMethod.POST} )
public ResponseData queryProfileValues(ProfileValue value) {
return new ResponseData(profileService.selectProfileValues(value));
}
@RequestMapping(value = "/profilevalue/querylevelvalues", method = {
RequestMethod.GET, RequestMethod.POST} )
public ResponseData queryLevelValues(ProfileValue value,Long levelId, @RequestParam(defaultValue = DEFAULT_PAGE) int page,
@RequestParam(defaultValue = DEFAULT_PAGE_SIZE) int pagesize) {
return new ResponseData(profileService.selectLevelValues(value,levelId, page, pagesize));
}
数据字典
又称枚举值。使用了父子结构来表达数据结构。用于对业务数据作简单的分类与总结,多配合下拉框或选择框使用。
前端控件的定义如下
<div class="col-sm-4">
<label class="control-label col-sm-4">部门等级</label>
<div class="col-sm-8">
<input id="deptLevel" data-bind="value:model.deptLevel"/>
</div>
</div>
调用方案一,将变量名与数据字典名作为参数调用指定地址,后台返回数据字典值并自动赋值至指定变量
<script src="${base.contextPath}/common/code?deptLevel=hr_org_deptlevel" type="text/javascript"></script>
<script>
$("#deptLevel").kendoComboBox({
dataTextField: "meaning",
dataValueField: "value",
filter: "contains",
valuePrimitive: true,
dataSource: deptLevel
});
</script>
调用方案二,使用ajax方式,使用指定的参数,调用预定义好的后台接口,将返回值绑定至控件
$.ajax("${base.contextPath}/sys/code/getCodeValueByCode", {
method: "POST",
contentType: "application/json; charset=utf-8",
data: JSON.stringify({
code: 'hr_org_deptlevel'
}),
success: function (result) {
$("#deptLevel2").kendoComboBox({
dataTextField: "meaning",
dataValueField: "value",
filter: "contains",
valuePrimitive: true,
dataSource: result.rows
});
}
})
LOV定义
LOV,是一个可以让用户在一个预定义的值集(list of value)里选择,将选择结果返回到基础页面里的过程。由于LOV的使用场景非常广泛,LCP平台通过参数的快速配置,即可零代码生成LOV控件,能够极大的提升项目的开发效率。目前仅支持单选返回
属性 | 描述 |
---|---|
代码 | LOV的编码 |
描述 | LOV的描述 |
标题 | LOV显示的标题,可使用多语言编码 |
提示 | LOV输入框的输入提示,可使用多语言编码 |
高度 | LOV弹出框的高度 |
宽度 | LOV弹出框的宽度 |
SQL类型 | 有三种,SQL_ID,自定义SQL,URL |
SQL_ID/自定义SQL/URL | 具体的查询执行内容 |
列数 | 一行放置几个查询条件 |
页大小 | 一页显示多少条查询结果 |
树形结构 | 查询结果按树形结构展示 |
TextField | 返回值的key值 |
ValueField | 返回值的value值 |
可编辑 | LOV返回结果可修改 |
对于SQL类型
属性 | 描述 |
---|---|
SQL_ID | Mapper接口名.方法名,如存在重名则报错 |
自定义SQL | 自己编写一段sql查询语句,语法同mybatis一致,支持传参 |
URL | 访问本系统restful接口获取数据,不包含网站上下文地址 |
执行查询后,将结果显示在表格中。每行信息的解析规则定义如下
属性 | 描述 |
---|---|
显示 | 行标题,可使用多语言编码 |
字段名 | 从结果中获取哪个属性显法 |
表格列 | 是否作为表格列显示在表格中 |
列宽度 | 表格列宽度 |
列对齐方式 | 内容中表格中的对齐方式 |
查询字段 | 是否作为表列的查询字段显示 |
列序号 | 列表或查询字段的显示顺序 |
查询配置 | 对查询字段作更加细致的设置 |
查询配置的说明如下
属性 | 描述 |
---|---|
字段类型 | 数字框,值列表,下拉框,文本框,日期框 |
查询描述宽度 | 查询条件标题的宽度 |
查询字段宽度 | 查询输入框的宽度 |
查询字段序号 | 查询字段的排序号 |
查询字段名 | 针对哪个字段作查询 |
完成如上配置后,LOV的预览效果如下
前端控件的定义如下
<div class="col-sm-4">
<label class="control-label col-sm-4">部门</label>
<div class="col-sm-8">
<input id="deptCode" data-bind="value:model.deptCode"/>
</div>
</div>
前端通过下述写法,完成LOV的调用,返回值的获取
- 在query方法中,可以通过为e.param数组赋值,实现自定义传参
- 在select与change方法中,除了使用this.text()与this.value()获取返回值外,还可以访问e对象拿到更加详细的事件上下文信息
$("#deptCode").kendoLov($.extend(${
lovProvider.getLov(base.contextPath, base.locale, "LOV_UNIT")}, {
query: function (e) {
e.param['enabledFlag'] = 'Y'; // 查询参数
},
select:function(e){
console.log("LOV select 事件:" + this.value() + this.text())
},
change:function(e){
console.log("LOV change 事件:" + this.value() + this.text())
}
}));
流水号配置
配置流水号的生成规则,按序号拼接各规则生成最终的流水号
规则 | 说明 |
---|---|
序列 | 按指定的位数,开始值,步长生成数字,并按设定的重置频率(日/月/季/年)归0后重头生成 |
日期 | 获取当前的日期时间值 |
常数 | 固定值 |
变量 | 使用参数传入值 |
UUID | 生成随机的UUID值 |
调用生成流水号方法如下
@RequestMapping(value = {
"/api/public/testCodeRule"}, method = RequestMethod.GET)
@ResponseBody
public ResponseData testCodeRule(HttpServletRequest request) throws CodeRuleException {
Map<String, String> params = new HashMap<>();
params.put("var", "V");
String cv = codeRuleProcessService.getRuleCode("BASE_TEST", params);
return new ResponseData(cv);
}
多语言
首先定义语言种类,系统默认内置了简中和英文
而后,成对定义各个词汇或语句
最后,使用编码,引用各个多语言。前端示例如下,系统会选择与浏览器语言代码一致的词汇,返回给客户端浏览器显示
<label class="control-label col-sm-4"><@spring.message "role.rolename"/></label>
后端示例如下:
@Autowired
private MessageSource messageSource;
messageSource.getMessage("error.account_no_role", null,"非法用户", Locale.getDefault())
流程管理
任务管理
使用quartz中间件,完成预定义各类任务的调度执行
quartz集群特性
- quartz是通过借助关系数据库和JDBC作业存储来实现集群管理的。
- 通过使用共同的quartz数据库表,多个节点自然构成quartz集群。
- 当有任务需要执行时,集群中的节点通过抢占锁(数据库表),来同步执行任务。各个节点之间的时间最好同步,误差不要超过一秒,否则其中某个节点将一直抢占任务。
- 集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性。
编写任务
继承AbstractJob抽象类,编写自己的定时执行的业务逻辑。AbstractJob类的关键方法如下
方法 | 描述 |
---|---|
safeExecute | 定义计划任务中具体的执行逻辑 |
isRefireImmediatelyWhenException | 表示任务发生异常时的处理方式,返回true:重新执行Job,false:挂起Job,等待管理员处理。默认为false |
setExecutionSummary | 可以记录任务的执行概要,比如任务返回结果或任务发生异常的信息。该执行概要可以在计划任务的执行记录中看到 |
public class TestJob extends AbstractJob {
@Override
public void safeExecute(JobExecutionContext context) throws Exception {
JobDataMap jobDataMap = context.getMergedJobDataMap();
System.out.println("--------------调度成功测试Job----" + JSONUtil.parseObj