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);
...
}