Commit 8dfc6efe by zhaochengxiang

模型权限控制

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