1. 业务开发

1.1. 前端开发

在业务表单中使用<ms-secret>组件

组件参数 是否必填 说明
id 当前业务数据id
table 存储当前业务数据的数据库表名称
multiple 权限值是否支持多选,业务数据权限推荐单选
secretId 业务表单场景必须,列表页不需要

下面以文章表单为例


...
<!-- 添加组件引入 -->
<#include "secret/components/ms-secret.ftl">
<template type="text/x-template" id="content-form">
    <div id="form" v-cloak>
        <el-header class="ms-header ms-tr" height="50px">
...

...
<!-- 组件使用 -->
<ms-secret :id="form.id" :table="'cms_content'" v-model:secret-id="secretId"  ref="secretRef"></ms-secret>
...


<!-- vue js -->
...
components:{
    ...
    // 增加组件注册
    MsSecret,
},
data: function () {
    return {
        ...
        // 增加密级值变量定义
        secretId: "",
        ...
    }
},
methods:{
    // 保存、更新方法
    saveOrUpdate(){
        ...
        // 设置密级值 默认参数名为secret
        data.secret = that.secretId;
        ms.http.post(url, data).then(function (res) {
        ...
    }
}

1.2. 后端开发

1.2.1. 添加_SECRET字段

ALTER TABLE YOUR_TABLE
ADD COLUMN _SECRET VARCHAR(255) DEFAULT '' COMMENT '权限值';

1.2.2. 使用SecretData注解


@SecretData(tableName = "YOUR_TABLE")
public ResultData save(){
    ...

    return ResultData.build().success(yourData);
}

@SecretData(tableName = "YOUR_TABLE")
public ResultData update(){
    ...

    return ResultData.build().success(yourData);
}

1.2.3. 控制数据展示

添加权限配置

控制是否开启对应业务的权限

按需修改配置模型json模版的title,然后导入到自定义配置

{
    "searchJson": "[\n        // 启用分保\n        {'action':'and', 'field': 'SECRET_ENABLE', 'el': 'eq', 'model': 'secretEnable', 'name': '启用分保', 'type': 'switch'},\n        //无分保权限URL\n        {'isSearch':'','action':'and', 'field': 'SECRET_ERROR_URL', 'el': 'eq', 'model': 'secretErrorUrl', 'name': '无分保权限URL', 'type': 'input'},\n]\n",
    "field": "[\n    {\n    \"model\":\"secretEnable\",\n    \"key\":\"SECRET_ENABLE\",\n    \"field\":\"SECRET_ENABLE\",\n    \"javaType\":\"Boolean\",\n    \"jdbcType\":\"VARCHAR\",\n    \"name\":\"启用分保\",\n    \"type\":\"switch\",\n    \"length\":\"11\",\n    \"isShow\":false,\n    \"isNoRepeat\":false,\n    \"isSearch\":false\n    }\n    ,{\n    \"model\":\"secretErrorUrl\",\n    \"key\":\"SECRET_ERROR_URL\",\n    \"field\":\"SECRET_ERROR_URL\",\n    \"javaType\":\"String\",\n    \"jdbcType\":\"VARCHAR\",\n    \"name\":\"无分保权限URL\",\n    \"type\":\"input\",\n    \"length\":\"255\",\n    \"isShow\":true,\n    \"isNoRepeat\":false,\n    \"isSearch\":false\n    }\n]\n\n",
    "html": "\n<template id=\"custom-model\">\n    <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"120px\" label-position=\"right\" size=\"default\" :disabled=\"disabled\" v-loading=\"loading\">\n        <!--启用分保-->\n    \n        <el-form-item  label=\"启用分保\" prop=\"secretEnable\">\n            <el-switch v-model=\"form.secretEnable\"\n                       :disabled=\"false\">\n            </el-switch>\n                <div class=\"ms-form-tip\">\n启用分保后,需要通过接口获取数据;设置了分保的文章需要会员(管理员)登录并拥有对应分保等级才能访问文章                </div>\n        </el-form-item>\n   \n            <!--无分保权限URL-->\n\n\t        <el-form-item  label=\"无分保权限URL\" prop=\"secretErrorUrl\">\n\t            <el-input\n                        v-model=\"form.secretErrorUrl\"\n                         :disabled=\"false\"\n                          :readonly=\"false\"\n                          :style=\"{width:  '100%'}\"\n                          :clearable=\"true\"\n                        placeholder=\"请输入无分保权限URL\">\n                </el-input>\n                <div class=\"ms-form-tip\">\n绝对路径URL,如http://localhost:8080/ms/login.do                </div>\n\t        </el-form-item>   \n    </el-form>\n</template>\n",
    "title": "文章分保配置",
    "script": "var custom_model = Vue.component(\"custom-model\",{\n    el: '#custom-model',\n    data:function() {\n        return {\n\t\t\tloading:false,\n            disabled:false,\n            modelId:0,\n            modelName: \"分保配置\",\n            //表单数据\n            form: {\n                linkId:0,\n                    // 启用分保\n                    secretEnable:false,\n                    // 无分保权限URL\n                    secretErrorUrl:'',\n            },\n\n            rules:{\n                        // 无分保权限URL\n                        secretErrorUrl: [{\"min\":0,\"max\":255,\"message\":\"无密级权限URL长度必须为0-255\"}],\n            },\n        }\n    },\n    watch:{\n            \n            //启用分保       \n            \"form.secretEnable\":function(nev,old){\n               if(typeof(nev)=='string') {\n                   this.form.secretEnable = (nev=='true');\n               } else  if(typeof(nev)=='undefined') {\n                    this.form.secretEnable = false;\n               }        \n            },\n    },\n    components:{\n    },\n    computed:{\n    },\n    methods: {\n      \tlink:function(e,field,binds){\n      \t\tlet that = this;\n            binds.forEach(function(item){\n  \t\t\t\tms.http.post(ms.manager+'/project/form/link.do', {id:that.modelId,field:item.field,value:e}).then(function (res) {\n                    if(res.result && res.data) {\n                        that.form[ms.util.camelCaseString(item.field)]=res.data[0][item.target];\n                    }else{\n                        that.$notify({\n                            title: '失败',\n                            message: res.msg,\n                            type: 'warning'\n                        });\n                    }\n                })\n\n            });\n      \t},\n              update: function (row) {\n                var that = this;\n                ms.http.post(ms.manager+\"/gov/securityConfig/update.do\", row).then(function (data) {\n                  if (data.result) {\n                    that.$notify({\n                      title: '成功',\n                      message: '更新成功',\n                      type: 'success'\n                    });\n\n                  } else {\n                    that.$notify({\n                      title: '失败',\n                      message: data.msg,\n                      type: 'warning'\n                    });\n                  }\n                });\n              },         validate:function(){\n            var b = false\n            this.$refs.form.validate(function(valid){\n                b = valid;\n            });\n            return b;\n        },\n        getFormData() {\n            var that = this;\n            var form = JSON.parse(JSON.stringify(that.form));\n            form.modelId = that.modelId;\n            return form;\n        },\n        save:function(callback) {\n            var that = this;\n            var url = this.formURL.save.url;\n            if (that.form.id > 0) {\n                url = this.formURL.update.url;\n            }\n            this.$refs.form.validate(function(valid) {\n                if (valid) {\n                    var form = JSON.parse(JSON.stringify(that.form));\n                    form.modelId = that.modelId;\n                    ms.http.post(url, form).then(function (res) {\n                        if(callback) {\n                            callback(res);\n                        }\n                    }).catch(function(err){\n                        callback(err.response.data);\n                    });\n                } else{\n                    callback({\n                    result:false,msg:'请检查表单输入项'\n                    });\n                }\n            })\n        },\n        //获取当前分保配置\n        get:function(id) {\n            var that = this;\n            that.loading = true;\n            ms.http.get(this.formURL.get.url, Object.assign({\"modelId\":that.modelId},this.formURL.get.params)).then(function (res) {\n                if(res.result&&res.data){\n                                       that.form = res.data;\n                    that.loading = false;\n                } else {\n                    that.loading = false;\n                }\n            }).catch(function (err) {\n                console.log(err);\n                that.loading = false;\n            });\n        },\n\n    },\n    created:function() {\n        var that = this;\n        //渲染create\n        that.get(this.form.linkId);\n    }\n});",
    "sql": "\n-- SECURITY_CONFIG\nCREATE TABLE  `{model}SECURITY_CONFIG` (\n    `id` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,\n    `SECRET_ENABLE` VARCHAR(11) DEFAULT NULL COMMENT '启用分保',\n    `SECRET_ERROR_URL` VARCHAR(255) DEFAULT NULL COMMENT '无分保权限URL',\n    `LINK_ID` VARCHAR(30) DEFAULT NULL,\n    `CREATE_DATE` DATETIME DEFAULT NULL COMMENT '创建时间',\n    `CREATE_BY` VARCHAR(50) DEFAULT NULL COMMENT '创建人',\n    `UPDATE_DATE` DATETIME DEFAULT NULL COMMENT '修改时间',\n    `UPDATE_BY` VARCHAR(50) DEFAULT NULL COMMENT '修改人',\n    `DEL` INT(1) DEFAULT 0 COMMENT '删除标记',\n    PRIMARY KEY (`ID`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='分保配置';\n",
    "tableName": "SECURITY_CONFIG"
}

开启权限控制


// web层文章数据展示接口为例

public ResultData list(){

    // 使用注意  DataScopeUtil.start开启权限后,必须紧跟着需要控制的查询方法
    ...
    if (ConfigUtil.getBoolean("文章分保配置","secretEnable", false)){
        SecretUtil.addSecretParam(map);
        DataScopeUtil.start(map.get(SecretUtil.MANAGER_ID).toString(),map.get(SecretUtil.PEOPLE_ID).toString(), DataScopeEnum.CONTENT_SECRET.toString(),true,map.get(SecretUtil.SECRET).toString());
    }
    List<CategoryBean> articleList = contentBiz.queryIdsByCategoryIdForParser(content);
    ...
}
Copyright © mingsoft.net 2012-2022 all right reserved,powered by Gitbook该文件修订时间: 2025-08-27 09:42:00

results matching ""

    No results matching ""

    results matching ""

      No results matching ""