Commit 8dfc6efe by zhaochengxiang

模型权限控制

parent 0c1ef5b0
......@@ -258,7 +258,7 @@ export function recommandEnglishWords(payload) {
}
export function startFlow(payload) {
return Post("/datamodeler/easyDataModelerWorkflowSupport/addPhysicalModelApproval", payload);
return PostJSON("/datamodeler/easyDataModelerWorkflowSupport/addPhysicalModelApproval", payload);
}
export function getDatasourcesByEnv (payload) {
......
......@@ -23,6 +23,7 @@ export const Holder = 'holder';
export const ReadOnly = 'readOnly';
export const DataModelerRoleAdmin = 'admin';
export const DataModelerRoleApproval = 'approval';
export const DataModelerRoleUser = 'user';
export const DataModelerRoleReader = 'reader';
......
......@@ -7,7 +7,7 @@ import LocalStorage from 'local-storage';
import { dispatchLatest, action } from '../model';
import { set_sess_state } from "../model/reducer";
import { DataModelerRoleAdmin, DataModelerRoleUser, DataModelerRoleReader } from './constant';
import { DataModelerRoleAdmin, DataModelerRoleUser, DataModelerRoleReader, DataModelerRoleApproval } from './constant';
//内网深交所环境 isSzseEnv true
//元曜公网环境 isSzseEnv false
......@@ -389,12 +389,13 @@ export function getTextWidth(text, font='14px tabular-nums') {
export function getDataModelerRole(user) {
if ((user?.roles||[]).indexOf('ROLE_dataModeler_admin') !== -1) {
return DataModelerRoleAdmin;
}
// else if ((user?.roles||[]).indexOf('ROLE_dataModeler_user') !== -1) {
// return DataModelerRoleUser;
// } else if ((user?.roles||[]).indexOf('ROLE_dataModeler_reader') !== -1) {
// return DataModelerRoleReader;
// }
} else if ((user?.roles||[]).indexOf('ROLE_dataModeler_approval') !== -1) {
return DataModelerRoleApproval;
} else if ((user?.roles||[]).indexOf('ROLE_dataModeler_user') !== -1) {
return DataModelerRoleUser;
} else if ((user?.roles||[]).indexOf('ROLE_dataModeler_reader') !== -1) {
return DataModelerRoleReader;
}
return '';
}
......
......@@ -27,7 +27,7 @@ const ExportOtherModal = (props) => {
}
return exportModes
}, [])
}, [app])
const onModeChange = (e) => {
setModeKey(e.target?.value);
......
......@@ -8,14 +8,15 @@ import { useContextMenu, Menu as RcMenu, Item as RcItem } from "react-contexify"
import ResizeObserver from 'rc-resize-observer';
import { dispatch } from '../../../../model';
import { showMessage, getQueryParam, paginate, isSzseEnv, formatDate } from '../../../../util';
import { AnchorId, AnchorTimestamp, Action, CatalogId, ModelerId } from '../../../../util/constant';
import { showMessage, getQueryParam, paginate, isSzseEnv, formatDate, getDataModelerRole } from '../../../../util';
import { AnchorId, AnchorTimestamp, Action, CatalogId, ModelerId, DataModelerRoleReader } from '../../../../util/constant';
// import Tag from "../../Tag";
import IframeDrawer from '../../ModelConfig/Component/IframeDrawer';
import UploadDDLResult from './upload-ddl-result';
import './ModelTable.less';
import 'react-contexify/dist/ReactContexify.css';
import { AppContext } from "../../../../App";
const { Text } = Typography;
......@@ -152,6 +153,8 @@ const ModelTable = (props) => {
id: undefined,
})
const app = React.useContext(AppContext)
const cols = [
{
title: '序号',
......@@ -790,8 +793,10 @@ const ModelTable = (props) => {
id: `data-model-${record?.id}`,
style: { backgroundColor: (record?.id===anchorId)?'#e7f7ff':'transparent' },
onContextMenu: event => {
setCurrentItem(record);
displayMenu(event);
if (getDataModelerRole(app?.user) !== DataModelerRoleReader) {
setCurrentItem(record);
displayMenu(event);
}
},
}
}}
......
......@@ -6,11 +6,12 @@ import { useContextMenu, Menu as RcMenu, Item as RcItem } from "react-contexify"
import UpdateTreeItemModal from './UpdateTreeItemModal';
import { dispatch } from '../../../../model';
import { showMessage, getQueryParam } from '../../../../util';
import { AnchorId, AnchorDirId, AnchorTimestamp, AnchorRequireId } from '../../../../util/constant';
import { showMessage, getQueryParam, getDataModelerRole } from '../../../../util';
import { AnchorId, AnchorDirId, AnchorTimestamp, AnchorRequireId, DataModelerRoleAdmin } from '../../../../util/constant';
import './ModelTree.less';
import 'react-contexify/dist/ReactContexify.css';
import { AppContext } from "../../../../App";
const viewModes = [
{
......@@ -52,6 +53,7 @@ const ModelTree = (props) => {
const [ currentRightClickDir, setCurrentRightClickDir ] = useState({});
const [modal, contextHolder] = Modal.useModal();
const app = React.useContext(AppContext);
const timestamp = getQueryParam(AnchorTimestamp, props.location?.search||'');
const id = getQueryParam(AnchorId, props.location?.search||'');
......@@ -488,7 +490,7 @@ const ModelTree = (props) => {
</Dropdown>
{
viewSelectedKey==='dir' && (
viewSelectedKey==='dir' && getDataModelerRole(app?.user)===DataModelerRoleAdmin && (
<Tooltip title="新增目录" className='ml-5'>
<PlusOutlined className='default' onClick={add} style={{ fontSize:16,cursor:'pointer' }} />
</Tooltip>
......@@ -540,7 +542,7 @@ const ModelTree = (props) => {
return <span title={nodeData?.remark||''}>{nodeData?.name||''}</span>;
}}
onRightClick={({event, node}) => {
if (viewSelectedKey==='dir') {
if (viewSelectedKey==='dir' && getDataModelerRole(app?.user)===DataModelerRoleAdmin) {
setCurrentRightClickDir(node);
displayMenu(event);
}
......
......@@ -35,14 +35,12 @@ const StartFlowModal = (props) => {
}
},
callback: data => {
if (data) {
if (data === '发起成功') {
showMessage('success', data)
} else {
showNotifaction('送审提示', data, 5);
}
if (data?.allSuccess) {
showMessage('success', '送审成功')
} else if (data?.alertMsg) {
showNotifaction('送审提示', data?.alertMsg, 5);
}
LocalStorage.set('modelChange', !(LocalStorage.get('modelChange')||false));
let event = new Event('storage');
event.key = 'modelChange';
......
......@@ -13,9 +13,9 @@ import ExportOtherModal from './Component/ExportOtherModal';
import RecatalogModal from './Component/RecatalogModal';
import HistoryAndVersionDrawer from './Component/HistoryAndVersionDrawer';
import StartFlowModal from './Component/StartFlowModal';
import { showMessage, showNotifaction, inputWidth, DeleteTipModal } from '../../../util';
import { showMessage, showNotifaction, inputWidth, DeleteTipModal, getDataModelerRole } from '../../../util';
import { dispatch, dispatchLatestHomepage } from '../../../model';
import { Action, CatalogId, ModelerId, Hints, ModelerData, PermitCheckOut, Editable, StateId, Holder, DDL, RequireId } from '../../../util/constant';
import { Action, CatalogId, ModelerId, Hints, ModelerData, PermitCheckOut, Editable, StateId, Holder, DDL, RequireId, DataModelerRoleReader } from '../../../util/constant';
import { AppContext } from '../../../App';
import DebounceInput from './Component/DebounceInput';
import MetadataAnalysis from '../../QianKun/MetadataAnalysis';
......@@ -586,6 +586,7 @@ class ModelComponet extends React.Component {
}
render() {
const { app } = this.props;
const { importModalVisible, catalogId, loadingTableData, selectModelerIds, keyword, filterTableData, selectModelerNames, exportDDLModalVisible, exportOtherModalVisible, importStockWordDrawerVisible , loadingStates, modelStates, currentModelState, currentView, recatalogModalVisible, exportDDLModalReference, currentModel, offset, historyAndVersionDrawerVisible, modelerId, startFlowModalVisible, expandTree, showMode, tableData } = this.state;
const content = (
......@@ -649,56 +650,27 @@ class ModelComponet extends React.Component {
alignItems: 'center'
}}
>
<Space>
<Space>
{
getDataModelerRole(app?.user)===DataModelerRoleReader ? <div /> : <Space>
<Button onClick={() => { this.setState({ importModalVisible: true }); }}>新建</Button>
</Space>
{
(currentView!=='requirement') && <React.Fragment>
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Button onClick={this.onExportOtherBtnClick} disabled={(selectModelerIds||[]).length===0}>导出</Button>
</Tooltip>
</Space>
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Button onClick={this.onRecatalogBtnClick} disabled={(selectModelerIds||[]).length===0}>变更目录</Button>
</Tooltip>
</Space>
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Button onClick={this.onBatchDeleteBtnClick} disabled={(selectModelerIds||[]).length===0}>删除</Button>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Button onClick={this.onExportOtherBtnClick} disabled={(selectModelerIds||[]).length===0}>导出</Button>
</Tooltip>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Button onClick={this.onRecatalogBtnClick} disabled={(selectModelerIds||[]).length===0}>变更目录</Button>
</Tooltip>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Button onClick={this.onBatchDeleteBtnClick} disabled={(selectModelerIds||[]).length===0}>删除</Button>
</Tooltip>
{
(currentView==='dir' || (currentView==='state'&&catalogId==='1')) && <Space>
<Tooltip title={startFlowTip}>
<Button onClick={this.startFlow} disabled={disableStartFlow}>送审</Button>
</Tooltip>
</Space>
{
(currentView==='dir' || (currentView==='state'&&catalogId==='1')) && <Space>
<Tooltip title={startFlowTip}>
<Button onClick={this.startFlow} disabled={disableStartFlow}>送审</Button>
</Tooltip>
</Space>
}
</React.Fragment>
}
{
(currentView==='requirement') && <React.Fragment>
<Space>
<Button onClick={this.onBatchModelerBtnClick}>引入数据模型</Button>
</Space>
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Button onClick={this.onBatchUnbindBtnClick} disabled={(selectModelerIds||[]).length===0}>解除绑定</Button>
</Tooltip>
</Space>
</React.Fragment>
}
</Space>
}
</Space>
}
<Space>
{/* {
......@@ -834,10 +806,11 @@ class ModelComponet extends React.Component {
const Model = (props) => {
const [modal, contextHolder] = Modal.useModal();
const app = React.useContext(AppContext)
return (
<>
<ModelComponet modal={modal} {...props} />
<ModelComponet modal={modal} app={app} {...props} />
{contextHolder}
</>
)
......
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