silentbalanceyh/vertx-zero

View on GitHub
vertx-pin/zero-rbac/src/main/resources/plugin/sql/rbac/S_VIEW.sql

Summary

Maintainability
Test Coverage
-- liquibase formatted sql

-- changeset Lang:ox-view-1
-- 用户/ 角色资源限定表,用于处理资源的行、列基本信息
DROP TABLE IF EXISTS S_VIEW;
CREATE TABLE IF NOT EXISTS S_VIEW
(
    -- 资源拥有者:按角色/用户 处理
    `KEY`         VARCHAR(36) COMMENT '「key」- 限定记录ID',
    -- 用户优先模式,角色为默认(S_RESOURCE需要传入角色计算模式,多个角色处理时支持多角色的筛选字段需要保存在内
    `NAME`        VARCHAR(96) COMMENT '「name」- 视图名称,每个 MATRIX 对应一个视图',
    `TITLE`       VARCHAR(255) COMMENT '「title」- 视图标题,用户输入,可选择',
    `OWNER`       VARCHAR(36) COMMENT '「owner」- 用户 / 角色ID',
    `OWNER_TYPE`  VARCHAR(5) COMMENT '「ownerType」- ROLE 角色,USER 用户',
    `RESOURCE_ID` VARCHAR(36) COMMENT '「resourceId」- 关联资源ID',

    /*
     * 1. 针对该资源,只能查看对应的列
     *    CARD:卡片类型,针对数据库中的属性进行过滤
     *    LIST:列表类型,针对数据库中的列进行过滤
     *    FORM:表单类型,针对数据库中的字段进行过滤
     * 固定格式:
     * [field1, field2, field3]
     * -- 「后置列过滤」
     */
    `PROJECTION`  TEXT COMMENT '「projection」- 该资源的列定义(单用户处理)',
    /*
     * 2. 针对该资源,提供查询引擎的分支条件,和传入条件进行合并
     * 固定格式:
     * {} (查询引擎语法)
     * 当角色出现多个的时候,执行
     * {} or {} 的模式来执行查询
     * -- 「前置查询条件修改,只针对查询参数专用」
     */
    `CRITERIA`    TEXT COMMENT '「criteria」- 该资源的行查询(单用户处理)',
    /*
     * 3. 针对特殊资源,提供IDS的主键直接命中条件,用户处理复杂场景的直接Join(本来可以依靠查询引擎处理,但这里不设置)
     *    表单不存在这种类型,主要针对列表
     *    DATA:数据层面,在列表处理过程中,ROWS中存在的ID才会显示出来,不存在的不显示
     *    META:元数据层面,在处理过程中同样只读取ROWS中存在的ID信息
     *    (注):对于界面呈现的ReadOnly模式,存在于UI的属性中,而不是出现在安全定义部分
     * 固定格式:(合并过滤)
     * {
     *     "field1": ["value1", "value2"],
     *     "field2": ["value2"]
     * }
     * -- 「后置行过滤」
     */
    `ROWS`        TEXT COMMENT '「rows」- 该资源针对保存的行进行过滤',
    `POSITION`    VARCHAR(96) COMMENT '「position」- 当前视图的模块位置,比页面低一个维度',

    /*
     * 是否虚拟视图,一般在抽象层的为虚拟视图,一旦出现虚拟视图,则需要针对原始视图执行视图替换
     * 1)入参为传入的参数信息,主要用于检查 identifier 部分
     * 2)只能在顶层模型往底层模型中转移的时候执行虚拟视图的控制
     * 3)虚拟视图提供的功能
     * 3.1)列过滤,从配置项到子类
     * 3.2)表单三态:可见/不可见,可见时:只读/可编辑
     * 3.3)操作:不同的操作带有不同的扩展
     * 如果当前视图带有视图访问者,则计算算法会发生改变,主要作用于通用接口,目前需要设置的主要是:
     * 一旦启用了访问者,那么该视图中对应的 ROWS/CRITERIA/PROJECTION/POSITION 会纳入到系统中
     * 运算,运算时需要考虑访问者中的扩展属性
     */
    `VISITANT`    BIT COMMENT '「visitant」- 是否包含了视图访问者',

    -- 特殊字段
    `SIGMA`       VARCHAR(128) COMMENT '「sigma」- 用户组绑定的统一标识',
    `LANGUAGE`    VARCHAR(10) COMMENT '「language」- 使用的语言',
    `ACTIVE`      BIT COMMENT '「active」- 是否启用',
    `METADATA`    TEXT COMMENT '「metadata」- 附加配置数据',

    -- Auditor字段
    `CREATED_AT`  DATETIME COMMENT '「createdAt」- 创建时间',
    `CREATED_BY`  VARCHAR(36) COMMENT '「createdBy」- 创建人',
    `UPDATED_AT`  DATETIME COMMENT '「updatedAt」- 更新时间',
    `UPDATED_BY`  VARCHAR(36) COMMENT '「updatedBy」- 更新人',
    PRIMARY KEY (`KEY`) USING BTREE
);

-- changeset Lang:ox-view-2
-- Unique
-- 用户、资源:唯一记录:高优先级
-- 角色、资源:唯一记录:低优先级
ALTER TABLE S_VIEW
    ADD UNIQUE (
                `OWNER_TYPE`, -- 拥有者类型(角色视图和个人视图的分离)
                `OWNER`, -- 拥有者(角色ID和用户ID)对应拥有的单实体
                `RESOURCE_ID`, -- 资源ID,对应某一个查询接口
                `NAME`, -- 视图名称(用户创建视图以及角色创建视图时专用)
                `POSITION` -- 视图位置(最复杂的维度)
        ) USING BTREE;
/*
 POSITION 是视图中的核心维度,在系统中出现不同情况则对其进行管理
 1. 单模块无视图管理
    NAME = DEFAULT,
    POSITION = DEFAULT
 2. 单模块开启视图应用
    NAME = DEFAULT, V1, V2, V3
    POSITION = DEFAULT
 3. 多模块无视图管理
    NAME = DEFAULT
    POSITION = DEFAULT, P1, P2, P3, P4
 4. 多模块多视图管理
    NAME = DEFAULT, V1, V2, V3
    POSITION = DEFAULT, P1, P2, P3, P4

 关于位置的详细说明
 1. POSITION 比资源多一个维度,资源通常是类似 /api/xxx/search 的接口,但这个接口可能
    会跨越页面(两个菜单共享一个资源,但查询条件不同)。
 2. POSITION 不可以和页面绑定,比如待办列表,是一个 Tab 页签造成了同一个页面中出现了两种
    不同的查询,绑定了同一个资源。
 3. POSITION 不可以和查询条件绑定,可能会出现视图功能应用在不同页面、不同位置、同一查询条件
    的情况,这样的模式会引起混淆管理。
 4. POSITION 只能和配置列表绑定,即配置列表中引入一个 position 来实现不同 position中的
    视图,但此处给了一个基本假设,即列表提供了一个 option 来表明位置信息。

 比如离职员工和在职员工
 视图特性:
 1. 都是员工数据,模型一样:res.employee,即资源地址一致
 2. 都是个人视图,OWNER_TYPE = USER
 3. 都是我的视图,OWNER = 个人用户ID
 4. 开启了视图管理功能,NAME = DEFAULT + 用户管理

 上述四点是目前已经实现的功能

 如何区分一个档案以及一个列表,目前能考虑的方案就是在前端配置中让员工的列表提供位置数据
 离职员工列表:POSITION = HISTORY
 在职员工列表:POSITION = RUNNING
 这样就从模块级区分开了。
 */