Commit c7ccc12b by yuwei

项目初始化

parent f8b26ff2
package cn.datax.service.data.metadata.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@ApiModel(value = "数据授权信息Model")
@Data
public class AuthorizeData implements Serializable {
private static final long serialVersionUID=1L;
@NotBlank(message = "目标表主键ID不能为空")
@ApiModelProperty(value = "目标表主键ID")
private String objectId;
@NotBlank(message = "角色ID不能为空")
@ApiModelProperty(value = "角色ID")
private String roleId;
@NotBlank(message = "目标表类型不能为空")
@ApiModelProperty(value = "目标表类型(1数据源2表3字段)")
private String objectType;
}
package cn.datax.service.data.metadata.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.util.List;
/**
* <p>
* 数据授权信息表 实体DTO
* </p>
*
* @author yuwei
* @since 2020-10-23
*/
@ApiModel(value = "数据授权信息表Model")
@Data
public class MetadataAuthorizeDto implements Serializable {
private static final long serialVersionUID=1L;
@NotBlank(message = "角色ID不能为空")
@ApiModelProperty(value = "角色ID")
private String roleId;
@Valid
@ApiModelProperty(value = "授权信息")
private List<AuthorizeData> authorizeDataList;
}
package cn.datax.service.data.metadata.api.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import cn.datax.common.base.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 数据授权信息表
* </p>
*
* @author yuwei
* @since 2020-10-23
*/
@Data
@Accessors(chain = true)
@TableName("metadata_authorize")
public class MetadataAuthorizeEntity implements Serializable {
private static final long serialVersionUID=1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
/**
* 目标表主键ID
*/
private String objectId;
/**
* 角色ID
*/
private String roleId;
/**
* 目标表类型(1数据源2表3字段)
*/
private String objectType;
}
package cn.datax.service.data.metadata.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 数据授权信息表 查询实体
* </p>
*
* @author yuwei
* @since 2020-10-23
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class MetadataAuthorizeQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
}
package cn.datax.service.data.metadata.api.vo;
import lombok.Data;
import java.io.Serializable;
/**
* <p>
* 数据授权信息表 实体VO
* </p>
*
* @author yuwei
* @since 2020-10-23
*/
@Data
public class MetadataAuthorizeVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private String objectId;
private String roleId;
private String objectType;
}
package cn.datax.service.data.metadata.controller;
import cn.datax.common.core.R;
import cn.datax.service.data.metadata.api.dto.MetadataAuthorizeDto;
import cn.datax.service.data.metadata.mapstruct.MetadataAuthorizeMapper;
import cn.datax.service.data.metadata.service.MetadataAuthorizeService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController;
import java.util.List;
/**
* <p>
* 数据授权信息表 前端控制器
* </p>
*
* @author yuwei
* @since 2020-10-23
*/
@Api(tags = {"元数据授权信息表"})
@RestController
@RequestMapping("/authorizes")
public class MetadataAuthorizeController extends BaseController {
@Autowired
private MetadataAuthorizeService metadataAuthorizeService;
@Autowired
private MetadataAuthorizeMapper metadataAuthorizeMapper;
@GetMapping("/getAuthorizedMetadata/{id}")
public R getAuthorizedMetadata(@PathVariable String id) {
List<String> list = metadataAuthorizeService.getAuthorizedMetadata(id);
return R.ok().setData(list);
}
@PostMapping("/metadata")
public R metadataAuthorize(@RequestBody @Validated MetadataAuthorizeDto metadataAuthorizeDto) {
metadataAuthorizeService.metadataAuthorize(metadataAuthorizeDto);
return R.ok();
}
}
package cn.datax.service.data.metadata.dao;
import cn.datax.common.base.BaseDao;
import cn.datax.service.data.metadata.api.entity.MetadataAuthorizeEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 数据授权信息表 Mapper 接口
* </p>
*
* @author yuwei
* @since 2020-10-23
*/
@Mapper
public interface MetadataAuthorizeDao extends BaseDao<MetadataAuthorizeEntity> {
}
package cn.datax.service.data.metadata.mapstruct;
import cn.datax.common.mapstruct.EntityMapper;
import cn.datax.service.data.metadata.api.dto.MetadataAuthorizeDto;
import cn.datax.service.data.metadata.api.entity.MetadataAuthorizeEntity;
import cn.datax.service.data.metadata.api.vo.MetadataAuthorizeVo;
import org.mapstruct.Mapper;
/**
* <p>
* 数据授权信息表 Mapper 实体映射
* </p>
*
* @author yuwei
* @since 2020-10-23
*/
@Mapper(componentModel = "spring")
public interface MetadataAuthorizeMapper extends EntityMapper<MetadataAuthorizeDto, MetadataAuthorizeEntity, MetadataAuthorizeVo> {
}
package cn.datax.service.data.metadata.service;
import cn.datax.service.data.metadata.api.dto.MetadataAuthorizeDto;
import cn.datax.service.data.metadata.api.entity.MetadataAuthorizeEntity;
import cn.datax.common.base.BaseService;
import java.util.List;
/**
* <p>
* 数据授权信息表 服务类
* </p>
*
* @author yuwei
* @since 2020-10-23
*/
public interface MetadataAuthorizeService extends BaseService<MetadataAuthorizeEntity> {
List<String> getAuthorizedMetadata(String id);
void metadataAuthorize(MetadataAuthorizeDto metadataAuthorizeDto);
}
package cn.datax.service.data.metadata.service.impl;
import cn.datax.service.data.metadata.api.dto.MetadataAuthorizeDto;
import cn.datax.service.data.metadata.api.entity.MetadataAuthorizeEntity;
import cn.datax.service.data.metadata.api.enums.DataLevel;
import cn.datax.service.data.metadata.service.MetadataAuthorizeService;
import cn.datax.service.data.metadata.mapstruct.MetadataAuthorizeMapper;
import cn.datax.service.data.metadata.dao.MetadataAuthorizeDao;
import cn.datax.common.base.BaseServiceImpl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* 数据授权信息表 服务实现类
* </p>
*
* @author yuwei
* @since 2020-10-23
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class MetadataAuthorizeServiceImpl extends BaseServiceImpl<MetadataAuthorizeDao, MetadataAuthorizeEntity> implements MetadataAuthorizeService {
@Autowired
private MetadataAuthorizeDao metadataAuthorizeDao;
@Autowired
private MetadataAuthorizeMapper metadataAuthorizeMapper;
@Override
public List<String> getAuthorizedMetadata(String id) {
List<MetadataAuthorizeEntity> metadataAuthorizeList = metadataAuthorizeDao.selectList(Wrappers.<MetadataAuthorizeEntity>lambdaQuery().eq(MetadataAuthorizeEntity::getRoleId, id));
List<String> list = metadataAuthorizeList.stream().map(s -> s.getObjectId()).collect(Collectors.toList());
return list;
}
@Override
public void metadataAuthorize(MetadataAuthorizeDto metadataAuthorizeDto) {
// 先删除
metadataAuthorizeDao.delete(Wrappers.<MetadataAuthorizeEntity>lambdaQuery().eq(MetadataAuthorizeEntity::getRoleId, metadataAuthorizeDto.getRoleId()));
metadataAuthorizeDto.getAuthorizeDataList().stream().forEach(s -> {
MetadataAuthorizeEntity metadataAuthorizeEntity = new MetadataAuthorizeEntity();
metadataAuthorizeEntity.setRoleId(s.getRoleId());
metadataAuthorizeEntity.setObjectId(s.getObjectId());
Integer level = DataLevel.getLevel(s.getObjectType()).getLevel();
metadataAuthorizeEntity.setObjectType(String.valueOf(level));
metadataAuthorizeDao.insert(metadataAuthorizeEntity);
});
}
}
...@@ -129,7 +129,7 @@ public class MetadataColumnServiceImpl extends BaseServiceImpl<MetadataColumnDao ...@@ -129,7 +129,7 @@ public class MetadataColumnServiceImpl extends BaseServiceImpl<MetadataColumnDao
.map(m -> { .map(m -> {
MetadataTreeVo tree = new MetadataTreeVo(); MetadataTreeVo tree = new MetadataTreeVo();
tree.setId(m.getId()); tree.setId(m.getId());
tree.setType(DataLevel.TABLE.getKey()); tree.setType(DataLevel.COLUMN.getKey());
tree.setName(m.getColumnComment()); tree.setName(m.getColumnComment());
tree.setCode(m.getColumnName()); tree.setCode(m.getColumnName());
tree.setLabel(StrUtil.isBlank(m.getColumnComment()) ? m.getColumnName() : m.getColumnComment()); tree.setLabel(StrUtil.isBlank(m.getColumnComment()) ? m.getColumnName() : m.getColumnComment());
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.datax.service.data.metadata.dao.MetadataAuthorizeDao">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.datax.service.data.metadata.api.entity.MetadataAuthorizeEntity">
<result column="id" property="id" />
<result column="object_id" property="objectId" />
<result column="role_id" property="roleId" />
<result column="object_type" property="objectType" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id,
object_id, role_id, object_type
</sql>
</mapper>
import request from '@/utils/request'
export function getAuthorizedMetadata(id) {
return request({
url: '/data/metadata/authorizes/getAuthorizedMetadata/' + id,
method: 'get'
})
}
export function metadataAuthorize(data) {
return request({
url: '/data/metadata/authorizes/metadata',
method: 'post',
data: data
})
}
<template>
<div class="app-container">
DataApply
</div>
</template>
<script>
export default {
name: 'DataApply'
}
</script>
<style lang="scss" scoped>
</style>
<template> <template>
<div class="app-container"> <div class="app-container">
DataAuthorize <el-row :gutter="20">
<el-col :span="6">
<el-card class="box-card tree-wrapper" shadow="always">
<el-tree
ref="leftTree"
:data="leftTreeOptions"
node-key="id"
empty-text="加载中,请稍后"
:props="leftTreeDefaultProps"
default-expand-all
highlight-current
:expand-on-click-node="false"
@node-click="handleNodeClick"
>
<span slot-scope="{ node, data }" class="custom-tree-node">
<span><i v-if="node.level === 1" class="iconfont icon-zuzhi tree-folder" />{{ node.label }}</span>
</span>
</el-tree>
</el-card>
</el-col>
<el-col :span="18">
<el-card class="box-card tree-wrapper" shadow="always">
<el-row type="flex" justify="space-between">
<el-col :span="12">
<el-button-group>
<el-button
type="warning"
icon="el-icon-refresh"
size="mini"
@click="handleCacheRefresh"
>刷新缓存</el-button>
</el-button-group>
</el-col>
<el-col :span="12">
<el-button-group style="float: right;">
<template v-if="showBtns">
<el-button v-if="disabled" size="mini" round @click="disabled = false">修改</el-button>
<el-button v-else size="mini" round @click="handSubmit">保存</el-button>
</template>
</el-button-group>
</el-col>
</el-row>
<el-divider />
<el-form ref="form" :model="form" :disabled="disabled">
<el-tree
ref="rightTree"
:data="rightTreeOptions"
show-checkbox
accordion
node-key="id"
empty-text="加载中,请稍后"
:props="rightTreeDefaultProps"
highlight-current
:expand-on-click-node="false"
:check-strictly="checkStrictly"
>
<span slot-scope="{ node, data }" class="custom-tree-node">
<span>
<i v-if="node.level === 1" class="iconfont icon-shujuku tree-folder" />
<i v-else-if="node.level === 2" class="iconfont icon-shujubiao tree-folder" />
<i v-else-if="node.level === 3" class="iconfont icon-shujuziduan tree-folder" />
{{ data.code ? (data.name ? data.code + '(' + data.name + ')' : data.code) : data.name }}
</span>
</span>
</el-tree>
</el-form>
</el-card>
</el-col>
</el-row>
</div> </div>
</template> </template>
<script> <script>
import { listRole } from '@/api/system/role'
import { getDataMetadataTree } from '@/api/metadata/datacolumn'
import { getAuthorizedMetadata, metadataAuthorize } from '@/api/metadata/dataauthorize'
export default { export default {
name: 'DataAuthorize' name: 'DataAuthorize',
data() {
return {
tableHeight: document.body.offsetHeight - 310 + 'px',
// 左侧树
leftTreeOptions: [],
leftTreeDefaultProps: {
children: 'children',
label: 'roleName'
},
// 右侧树
rightTreeOptions: [],
rightTreeDefaultProps: {
children: 'children',
label: 'label'
},
checkStrictly: false,
form: {},
disabled: true,
showBtns: false,
btnSubmitEnable: false
}
},
created() {
this.getLeftTree()
this.getRightTree()
},
methods: {
getLeftTree() {
listRole().then(response => {
if (response.success) {
const { data } = response
const tree = {}
tree.roleName = '角色组'
tree.children = data
this.leftTreeOptions = []
this.leftTreeOptions.push(tree)
}
})
},
handleNodeClick(data) {
if (data.id) {
this.form.roleId = data.id
getAuthorizedMetadata(data.id).then(response => {
if (response.success) {
this.$refs.rightTree.setCheckedKeys([])
const checkedKeys = response.data || []
if (checkedKeys && checkedKeys.length > 0) {
this.checkStrictly = true
this.$nextTick(() => {
this.$refs.rightTree.setCheckedKeys(checkedKeys)
this.checkStrictly = false
})
}
this.showBtns = true
}
})
}
},
getRightTree() {
getDataMetadataTree('column').then(response => {
if (response.success) {
const { data } = response
this.rightTreeOptions = data
}
})
},
handSubmit() {
const data = []
const checkedNodes = this.$refs.rightTree.getCheckedNodes(false, true)
checkedNodes.forEach((item, index, arr) => {
const obj = {}
obj.objectId = item.id
obj.roleId = this.form.roleId
obj.objectType = item.type
data.push(obj)
})
metadataAuthorize({ roleId: this.form.roleId, authorizeDataList: data }).then(response => {
if (response.success) {
this.$message.success('保存成功')
this.disabled = true
}
})
},
handleCacheRefresh() {}
}
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.el-card ::v-deep .el-card__body {
height: calc(100vh - 170px);
}
.tree-wrapper {
overflow-y: auto;
::v-deep .custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
.tree-folder {
margin-right: 5px;
color: #f6cf07;
}
}
}
</style> </style>
<template>
<el-row :gutter="20">
<el-col :span="6">
<el-card class="box-card tree-wrapper" shadow="always">
<el-tree
ref="tree"
:data="treeOptions"
node-key="id"
empty-text="加载中,请稍后"
:props="defaultProps"
default-expand-all
highlight-current
:expand-on-click-node="false"
@node-click="handleNodeClick"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span><i v-if="node.level === 1" class="iconfont icon-zuzhi tree-folder" />{{ node.label }}</span>
</span>
</el-tree>
</el-card>
</el-col>
<el-col :span="18">
<el-card class="box-card tree-wrapper" shadow="always">
<el-row type="flex" justify="space-between">
<el-col :span="12">
<el-button-group>
<el-button
type="warning"
icon="el-icon-refresh"
size="mini"
@click="handleCacheRefresh"
>刷新缓存</el-button>
</el-button-group>
</el-col>
<el-col :span="12">
<el-button-group style="float: right;">
<template v-if="showBtns">
<el-button size="mini" round v-if="disabled" @click="disabled = false">修改</el-button>
<el-button size="mini" round v-else @click="handSubmit">保存</el-button>
</template>
</el-button-group>
</el-col>
</el-row>
<el-divider></el-divider>
<el-form ref="form" :model="form" :disabled="disabled">
<el-tree
ref="data"
:data="dataTreeOptions"
show-checkbox
node-key="id"
empty-text="加载中,请稍后"
:props="dataDefaultProps"
highlight-current
:expand-on-click-node="false"
:check-strictly="checkStrictly"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span>
<i v-if="node.level === 1" class="iconfont icon-shujuku tree-folder" />
<i v-else-if="node.level === 2" class="iconfont icon-shujubiao tree-folder"/>
<i v-else-if="node.level === 3" class="iconfont icon-shujuziduan tree-folder"/>
{{ data.code ? (data.name ? data.code + '(' + data.name + ')' : data.code) : data.name }}
</span>
</span>
</el-tree>
</el-form>
</el-card>
</el-col>
</el-row>
</template>
<script>
import { listRole } from '@/api/system/role'
import { getDataMetadataTree, getGrantPermission, grantPermission } from '@/api/metadata/datacolumn'
export default {
name: 'DataPermissionList',
data() {
return {
tableHeight: document.body.offsetHeight - 310 + 'px',
// 展示切换
showOptions: {
data: {},
showList: true
},
// 左侧树
treeOptions: [],
defaultProps: {
children: 'children',
label: 'roleName'
},
// 右侧树
dataTreeOptions: [],
dataDefaultProps: {
children: 'children',
label: 'label'
},
checkStrictly: false,
form: {},
disabled: true,
showBtns: false,
btnSubmitEnable: false
}
},
created() {
this.getLeftTree()
this.getRightTree()
},
methods: {
getLeftTree() {
listRole().then(response => {
if (response.success) {
const { data } = response
const tree = {}
tree.roleName = '角色组'
tree.children = data
this.treeOptions = []
this.treeOptions.push(tree)
}
})
},
handleNodeClick(data) {
if (data.id) {
this.form.roleId = data.id
getGrantPermission(data.id).then(response => {
if (response.success) {
const { data } = response
const checkedKeys = data || []
if (checkedKeys && checkedKeys.length > 0) {
this.checkStrictly = true
this.$nextTick(() => {
this.$refs.data.setCheckedKeys(checkedKeys)
this.checkStrictly = false
})
}
this.showBtns = true
}
})
}
},
getRightTree() {
getDataMetadataTree('column').then(response => {
if (response.success) {
const { data } = response
this.dataTreeOptions = data
}
})
},
// 获取选中节点数据
getAllCheckedKeys() {
// 目前被选中的节点
const checkedKeys = this.$refs.data.getHalfCheckedKeys()
// 半选中的菜单节点
const halfCheckedKeys = this.$refs.data.getCheckedKeys()
checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys)
return checkedKeys
},
handSubmit() {
this.form.ids = this.getAllCheckedKeys()
grantPermission(this.form).then(response => {
if (response.success) {
this.$message.success('保存成功')
this.disabled = true
}
})
},
handleCacheRefresh() {}
}
}
</script>
<style lang="scss" scoped>
.right-toolbar {
float: right;
}
.el-card ::v-deep .el-card__body {
height: calc(100vh - 170px);
}
.tree-wrapper {
overflow-y: auto;
::v-deep .custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
.tree-folder {
margin-right: 5px;
color: #f6cf07;
}
}
}
</style>
<template>
<div class="app-container">
<transition name="el-zoom-in-center">
<data-permission-list v-if="options.showList" @showCard="showCard" />
</transition>
</div>
</template>
<script>
import DataPermissionList from './DataPermissionList'
export default {
name: 'DataPermission',
components: { DataPermissionList },
data() {
return {
options: {
data: {},
showList: true
}
}
},
methods: {
showCard(data) {
Object.assign(this.options, data)
}
}
}
</script>
<style lang="scss" scoped>
</style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment