Commit 2037b763 authored by Maofei94's avatar Maofei94

feat: 版本日志

parent aaa9afd5
import React, { useState } from 'react';
import { Timeline, Tabs } from 'antd';
import { useHistory } from 'react-router-dom';
import styles from './index.less';
const { Item } = Timeline;
const { TabPane } = Tabs;
const ColConen = () => {
const [tabPosition, setTabPosition] = useState('left');
const a = '1';
return (
<div>
<div className={styles.titlebox}>
<p className={styles.log}>版本记录</p>
<p className={styles.desclog}>熊猫运维平台</p>
</div>
<div className={styles.logbox}>
<Tabs
tabPosition={tabPosition}
style={{ height: 'calc(100vh - 200px)' }}
addIcon={<p>aa</p>}
>
{arr.reverse().map((item, index) => (
<TabPane tab={item.label} key={item.key}>
{item.content}
</TabPane>
))}
</Tabs>
{/* <Timeline mode={mode}>
{arr.map((item, index) => (
<Item label={item.label} key={item.key}>
{item.content}
</Item>
))}
</Timeline> */}
</div>
</div>
);
};
const arr = [
{
key: '0',
label: `v1.0.0 2020-12-18`,
content: (
<div className={styles.hr}>
<div className={styles.topBox}>
<div className={styles.topl}>v1.0.0</div>
<div className={styles.topr}>2020-12-18</div>
</div>
<hr />
<h3>运维第一个版本记录</h3>
<ul>
<li>
[+]
新增了解决方案管理、数据库管理、用户中心、平台中心、应用中心、数据中心、系统日志板块
</li>
<li>[+] 新增了版本记录模块</li>
<li>[^] 登录页面修改了动画效果</li>
<li>[^] 移动应用配置模块进行了翻新</li>
<li>[^] 业务平台模块修改了交互方式</li>
</ul>
</div>
),
},
// {
// key: '1',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '2',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '3',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '4',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '5',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '6',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '131',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '70',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '8',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '9',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '10',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '11',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '12',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '13',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '14',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '15',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '16',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '17',
// label: '1.0.20201218',
// content: 'aaaa',
// },
// {
// key: '18',
// label: '1.0.20201219',
// content: 'aaaa',
// },
];
export default ColConen;
import React, { useEffect } from 'react';
import { useHistory } from 'react-router-dom';
import styles from './index.less';
const Colophon = props => {
const historyPath = useHistory();
const handleClick = () => {
historyPath.push('/colophon');
console.log(historyPath);
};
return (
<div className={styles.desc} onClick={handleClick}>
版本记录
</div>
);
};
export default Colophon;
.desc:hover{
cursor: pointer;
color: #1890ff;
}
.desc{
margin-right: 10px;
}
.titlebox{
width: 100%;
height: 100px;
text-align: center;
color: #333;
}
.log{
font-size: 40px;
font-weight: bold;
margin-bottom: 5px;
margin-top: 20px;
}
.desclog{
color: #8E99AB;
margin-bottom: 0px;
}
.logbox{
width: 100%;
max-height: calc(100vh - 200px);
background-color: #f6f6f6;
text-align: left;
overflow: hidden;
}
.hr{
margin-right: 20px;
}
.topBox{
display: flex;
justify-content: space-between;
height: 40px;
align-items: center;
}
.topl{
font-size: 22px;
color: #1890ff;
}
.topr{
font-size: 16px;
color: #333;
}
\ No newline at end of file
......@@ -4,6 +4,7 @@ import { Breadcrumb } from 'antd';
import check from '@/components/Authorized/CheckPermissions';
import { Link } from 'react-router-dom';
import HeaderSearch from '../HeaderSearch';
import Colophon from '../Colophon';
import Avatar from './AvatarDropdown';
import styles from './index.less';
......@@ -44,6 +45,7 @@ const GlobalHeaderRight = props => {
{/* <span className={styles.left}>{value.title}</span> */}
<Breadcrumb {...value.breadcrumb} className={styles.lineHeight} />
<div style={{ flex: 1 }} />
<Colophon />
<HeaderSearch
className={`${styles.action} ${styles.search} ${styles.toRight}`}
placeholder="站内搜索"
......
......@@ -11,7 +11,7 @@
flex-direction: column;
background-color: #F6F6F6;
border-radius:8px;
box-shadow: 20px 20px 5px #888888;
box-shadow: 10px 10px 5px #888888;
}
.imgs{
margin-top: 20px;
......
......@@ -6,12 +6,16 @@ import {
addWebsite,
} from '@/services/mobileConfig/api';
import PicturesWall from '@/components/Upload/index';
const { Item } = Form;
const { Option } = Select;
const SiteConfig = props => {
const { miniTitle, submitCallback, subType, addCallback } = props;
console.log(subType, 'ubType');
const {
miniTitle,
submitCallback,
addCallback,
parentKey,
clientName,
} = props;
const [config, setConfig] = useState(''); // 网站配置信息
const [loginList, setLoginList] = useState([
{ text: '默认界面', value: 'default' },
......@@ -42,7 +46,6 @@ const SiteConfig = props => {
})
.then(res => {
setLoading(false);
console.log(res.shortcutIcon);
let obj = {};
let arr = Object.keys(form.getFieldsValue());
arr.map(k => {
......@@ -62,71 +65,40 @@ const SiteConfig = props => {
if (valid) {
setLoading(true);
const obj = { ...form.getFieldsValue() };
let params = { ...obj, mode: 'single', client: 'miniapp' };
if (subType === 'add') {
addWebsite(params, {
headers: {
'content-type':
'application/x-www-form-urlencggoded;charset=UTF-8',
},
})
.then(res => {
setLoading(false);
if (res.success) {
addCallback(params.title);
notification.success({
message: '提示',
duration: 3,
description: '新增成功',
});
} else {
notification.error({
message: '提示',
duration: 10,
description: res.message || '新增失败',
});
}
console.log(res, 'res');
})
.catch(err => {
setLoading(false);
});
} else {
editWebsite(params, {
headers: {
'content-type':
'application/x-www-form-urlencggoded;charset=UTF-8',
},
let params = { ...obj, mode: 'single', client: clientName };
editWebsite(params, {
headers: {
'content-type': 'application/x-www-form-urlencggoded;charset=UTF-8',
},
})
.then(res => {
setLoading(false);
if (res.success) {
submitCallback();
notification.success({
message: '提示',
duration: 3,
description: '编辑成功',
});
} else {
notification.error({
message: '提示',
duration: 3,
description: res.message || '编辑失败',
});
}
console.log(res, 'res');
})
.then(res => {
setLoading(false);
if (res.success) {
submitCallback();
notification.success({
message: '提示',
duration: 3,
description: '编辑成功',
});
} else {
notification.error({
message: '提示',
duration: 3,
description: res.message || '编辑失败',
});
}
console.log(res, 'res');
})
.catch(err => {
setLoading(false);
});
}
.catch(err => {
setLoading(false);
});
}
});
};
return (
<Spin spinning={loading} tip="loading...">
<div style={{ minHeight: 'calc(100vh - 192px)', marginTop: '20px' }}>
<Form form={form} {...layout}>
<div style={{ minHeight: 'calc(100vh - 252px)', marginTop: '20px' }}>
<Form form={form} name={`form-${miniTitle}`} {...layout}>
<Item
label="应用名称:"
name="title"
......@@ -139,18 +111,6 @@ const SiteConfig = props => {
>
<Input placeholder="请输入应用名称" allowClear />
</Item>
{/* <Item
label="系统图标:"
name="shortcutIcon"
rules={[
{
required: true,
message: '请选择系统图标',
},
]}
>
<Input placeholder="请输入系统图标名称" allowClear />
</Item> */}
<Item
label="系统图标:"
name="shortcutIcon"
......
import React, { useState, useEffect } from 'react';
import { Form, Select, Input, Button, Radio, notification, Spin } from 'antd';
import {
editWebsite,
getWebsite,
addWebsite,
} from '@/services/mobileConfig/api';
import PicturesWall from '@/components/Upload/index';
const { Item } = Form;
const { Option } = Select;
const AddConfig = props => {
const { miniTitle, submitCallback, subType, addCallback } = props;
console.log(subType, 'ubType');
const [config, setConfig] = useState(''); // 网站配置信息
const [loginList, setLoginList] = useState([
{ text: '默认界面', value: 'default' },
]); // 系统登陆页
const [styleList, setStyleList] = useState([
{ text: '默认风格', value: 'default' },
]); // 系统风格
const [themeList, setThemeList] = useState([
{ text: '默认皮肤', value: 'default' },
]); // 系统皮肤
const [loading, setLoading] = useState(false);
const [form] = Form.useForm();
const layout = {
layout: 'horizontal',
labelCol: { span: 7 },
wrapperCol: { span: 15 },
};
// 单选值改变
const radioChange = e => {};
// 提交选择
const submit = value => {
form.validateFields().then(valid => {
if (valid) {
setLoading(true);
const obj = { ...form.getFieldsValue() };
let params = { ...obj, mode: 'single' };
addWebsite(params, {
headers: {
'content-type': 'application/x-www-form-urlencggoded;charset=UTF-8',
},
})
.then(res => {
setLoading(false);
if (res.success) {
addCallback(params.title);
notification.success({
message: '提示',
duration: 3,
description: '新增成功',
});
} else {
notification.error({
message: '提示',
duration: 10,
description: res.message || '新增失败',
});
}
console.log(res, 'res');
})
.catch(err => {
setLoading(false);
});
}
});
};
return (
<Spin spinning={loading} tip="loading...">
<div style={{ minHeight: 'calc(100vh - 252px)', marginTop: '20px' }}>
<Form form={form} name={`form-${miniTitle}`} {...layout}>
<Item
label="应用名称:"
name="title"
rules={[
{
required: true,
message: '请输入应用名称',
},
]}
>
<Input placeholder="请输入应用名称" allowClear />
</Item>
<Item
label="应用类别:"
name="client"
rules={[
{
required: true,
message: '请输入应用类别',
},
]}
>
<Input placeholder="请输入应用类别" allowClear />
</Item>
<Item
label="系统图标:"
name="shortcutIcon"
rules={[
{
required: true,
message: '请选择系统图标',
},
]}
>
<PicturesWall />
</Item>
<Item
label="登陆页面:"
name="loginTemplate"
rules={[
{
required: true,
message: '请选择登陆页面',
},
]}
>
<Select placeholder="请选择登陆页面">
{loginList &&
loginList.map((item, index) => (
<Option value={item.value} key={`item${index}`}>
{item.text}
</Option>
))}
</Select>
</Item>
<Item
label="系统皮肤:"
name="theme"
rules={[
{
required: true,
message: '请选择系统皮肤',
},
]}
>
<Select placeholder="请选择系统皮肤">
{themeList &&
themeList.map((item, index) => (
<Option value={item.value} key={`item${index}`}>
{item.text}
</Option>
))}
</Select>
</Item>
<Item
label="系统风格:"
name="style"
rules={[
{
required: true,
message: '请选择系统风格',
},
]}
>
<Select placeholder="请选择系统风格">
{styleList &&
styleList.map((item, index) => (
<Option value={item.value} key={`item${index}`}>
{item.text}
</Option>
))}
</Select>
</Item>
<Item label="开启云登陆:" name="cloudLogin" initialValue={false}>
<Radio.Group onChange={radioChange}>
<Radio value></Radio>
<Radio value={false}></Radio>
</Radio.Group>
</Item>
<Item wrapperCol={{ span: 6, offset: 7 }}>
<Button type="primary" onClick={submit}>
提交
</Button>
</Item>
</Form>
</div>
</Spin>
);
};
export default AddConfig;
import React, { useState, useEffect, useMemo } from 'react';
import { Card, Tabs, Button, Popconfirm, notification, Spin } from 'antd';
import {
Card,
Tabs,
Button,
Popconfirm,
notification,
Spin,
Modal,
Drawer,
} from 'antd';
import ProCard from '@ant-design/pro-card';
import PageContainer from '@/components/BasePageContainer';
import SevenParams from './menuconfig/SevenParams';
......@@ -9,41 +18,48 @@ import {
deleteWebsite,
deleteMiniMenu,
} from '@/services/mobileConfig/api';
import { ExclamationCircleOutlined } from '@ant-design/icons';
import SiteConfig from './SiteConfig';
import MenuConfig from './menuconfig/MenuConfig';
import MiniMenu from './menuconfig/miniMenu';
import AddConfig from './addConfig';
import { appConnector } from '@/containers/App/store';
const { TabPane } = Tabs;
const MobileConfigPage = props => {
const { userMode } = props;
const [activeKey, setActiveKey] = useState('1'); // tabs活动页
const [miniTitle, setMiniTitle] = useState('');
const [flag, setFlag] = useState(1);
const [activeKey, setActiveKey] = useState('0'); // tabs活动页
const [miniTitle, setMiniTitle] = useState(''); // 应用名称
const [flag, setFlag] = useState(1); // 刷新标志
const [showConfig, setShowConfig] = useState(true);
const [loading, setLoading] = useState(false);
const [position, setPosition] = useState([]);
const [subType, setSubType] = useState('');
const [parentKey, setParentKey] = useState('');
const [singleList, setSingleList] = useState([]);
const [clientName, setClientName] = useState(''); // client
const [addVisible, setAddVisible] = useState(false);
useEffect(() => {
setLoading(true);
getMiniAppModuleTree({
userMode: userMode || 'super',
}).then(res => {
setLoading(false);
console.log(res, 'res');
if (res.code === 0) {
const { data } = res;
let obj =
data[0].children.length > 0 &&
data[0].children.find(item => item.id.includes('miniapp'));
console.log(obj, 'obj');
if (data[0].children.length > 0 && obj) {
const title = obj.text || '';
setShowConfig(true);
setMiniTitle(title);
setPosition(['right']);
} else {
setPosition(['left']);
setShowConfig(false);
}
let array = data[0].children.length > 0 && [...data[0].children];
let arr = [];
array.map(item => {
arr.push({
...item,
subSystemValue: item.id.split('single')[1],
});
console.log(item.id.split('single')[1]);
return item;
});
setParentKey(arr[0].id);
setSingleList(arr);
setMiniTitle(arr[0].text);
setClientName(arr[0].subSystemValue);
console.log(arr);
} else {
setShowConfig(false);
}
......@@ -51,17 +67,45 @@ const MobileConfigPage = props => {
});
}, [flag]);
useEffect(() => {
// getMiniAppModuleTree({
// userMode: 'super',
// }).then(res => {
// console.log(res);
// });
}, []);
// 修改选中的tab
const handleChange = key => {
setActiveKey(key);
};
// tab新增编辑的回调
const handleEdit = (key, action) => {
console.log(key, 'key', action);
switch (action) {
case 'add': {
setAddVisible(true);
break;
}
case 'remove': {
let val = key.split('single')[1] || '';
Modal.confirm({
title: '确认删除应用?',
icon: <ExclamationCircleOutlined />,
okText: '确认',
cancelText: '取消',
onOk: closeModal => {
delMini(val, closeModal);
},
});
break;
}
default:
break;
}
};
const handleParChange = key => {
console.log(key);
let obj = singleList.find(item => item.id === key);
console.log(obj);
setParentKey(key);
setActiveKey('0');
setClientName(obj.subSystemValue);
setMiniTitle(obj.text);
};
const submitCallback = () => {
setFlag(flag + 1);
setSubType('');
......@@ -69,14 +113,17 @@ const MobileConfigPage = props => {
const addCallback = val => {
console.log(val);
setSubType('');
setMiniTitle(val);
setPosition(['right']);
setAddVisible(false);
setFlag(flag + 1);
// setMiniTitle(val);
};
// 删除
const delMini = () => {
const delMini = (val, closeModal) => {
setLoading(true);
closeModal();
console.log(val);
deleteWebsite({
client: 'miniapp',
client: val,
_version: 9999,
_dc: Date.now(),
})
......@@ -84,7 +131,7 @@ const MobileConfigPage = props => {
setLoading(false);
if (res.success) {
setFlag(flag + 1);
deleteMiniMenu({ visible: 'miniapp' });
deleteMiniMenu({ visible: val });
notification.success({
message: '提示',
duration: 3,
......@@ -107,34 +154,39 @@ const MobileConfigPage = props => {
setSubType('add');
};
const options = {
left: (
<Button type="primary" onClick={addMini}>
新增移动应用
</Button>
),
right: (
<Popconfirm
title="是否删除移动应用,及相关联的角色和菜单"
okText="确认"
cancelText="取消"
placement="left"
onConfirm={delMini}
>
<Button type="primary" danger>
删除移动应用
</Button>
</Popconfirm>
),
};
const slot = useMemo(() => {
if (position.length === 0) return null;
return position.reduce((acc, direction) => {
console.log(acc, direction);
return { ...acc, [direction]: options[direction] };
}, {});
}, [position]);
const ContentTab = () => (
<ProCard>
<Spin tip="loading..." spinning={loading}>
<Tabs activeKey={activeKey} type="card" onChange={handleChange}>
{showConfig && (
<TabPane tab={tabArr[0].title} key={tabArr[0].key}>
{activeKey === tabArr[0].key && tabArr[0].component}
</TabPane>
)}
{showConfig && subType !== 'add' && (
<TabPane tab={tabArr[1].title} key={tabArr[1].key}>
{activeKey === tabArr[1].key && tabArr[1].component}
</TabPane>
)}
{showConfig && subType !== 'add' && (
<TabPane tab={tabArr[2].title} key={tabArr[2].key}>
{activeKey === tabArr[2].key && tabArr[2].component}
</TabPane>
)}
{showConfig && subType !== 'add' && (
<TabPane tab={tabArr[3].title} key={tabArr[3].key}>
{activeKey === tabArr[3].key && tabArr[3].component}
</TabPane>
)}
</Tabs>
</Spin>
</ProCard>
);
const cts = (tabPaneItem, id) => (
<TabPane key={tabPaneItem.id} tab={tabPaneItem.text}>
<>{parentKey === tabPaneItem.id && ContentTab()}</>
</TabPane>
);
const tabArr = [
{
title: '网站配置',
......@@ -145,51 +197,54 @@ const MobileConfigPage = props => {
submitCallback={submitCallback}
subType={subType}
addCallback={addCallback}
clientName={clientName}
parentKey={parentKey}
/>
),
},
{
title: '菜单管理',
key: '1',
component: <MenuConfig />,
component: (
<MiniMenu
clientName={clientName}
userMode={userMode}
parentKey={parentKey}
/>
),
},
{
title: '七参数配置',
key: '2',
component: <SevenParams />,
},
{
title: '版本包配置',
key: '3',
component: <VersionPublish />,
},
];
return (
<PageContainer>
<ProCard>
<Spin tip="loading..." spinning={loading}>
<Tabs
activeKey={activeKey}
type="card"
onChange={handleChange}
tabBarExtraContent={slot}
>
{/* {showConfig &&
tabArr?.length > 0 &&
tabArr.map(item => (
<TabPane tab={item.title} key={item.key}>
{activeKey === item.key && item.component}
</TabPane>
))} */}
{showConfig && (
<TabPane tab={tabArr[0].title} key={tabArr[0].key}>
{activeKey === tabArr[0].key && tabArr[0].component}
</TabPane>
)}
{showConfig && subType !== 'add' && (
<TabPane tab={tabArr[1].title} key={tabArr[1].key}>
{activeKey === tabArr[1].key && tabArr[1].component}
</TabPane>
)}
{showConfig && subType !== 'add' && (
<TabPane tab="其他配置" key="tab3">
<SevenParams />
<VersionPublish />
</TabPane>
)}
</Tabs>
</Spin>
</ProCard>
<Tabs
activeKey={parentKey}
onChange={handleParChange}
type="editable-card"
onEdit={handleEdit}
>
{singleList.map(item => cts(item, parentKey))}
</Tabs>
<Drawer
title="新增应用"
destroyOnClose
width={500}
onClose={() => {
setAddVisible(false);
}}
visible={addVisible}
>
<AddConfig addCallback={addCallback} submitCallback={submitCallback} />
</Drawer>
</PageContainer>
);
};
......
......@@ -35,7 +35,7 @@ import EditForm from './editForm';
import CheckList from './checkBox';
const MiniMenu = props => {
const { userMode } = props;
const { userMode, clientName, parentKey } = props;
const [flag, setFlag] = useState(1); // 刷新标志
const [treeFlag, setTreeFlag] = useState(true);
const [treeData, setTreeData] = useState([]); // 树的数据
......@@ -58,12 +58,13 @@ const MiniMenu = props => {
// 获取菜单树
useEffect(() => {
console.log(props);
updateTrees();
}, [flag]);
// 获取角色列表
useEffect(() => {
getRoleListPlain({
subSystemValue: 'miniapp',
subSystemValue: clientName || 'miniapp',
_dc: Date.now(),
_version: 9999,
}).then(res => {
......@@ -71,7 +72,7 @@ const MiniMenu = props => {
setAddList(res.list);
}
});
}, [flag]);
}, [flag, clientName]);
// 获取菜单信息
useEffect(() => {
getInfo();
......@@ -80,14 +81,6 @@ const MiniMenu = props => {
// 更新树
const updateTrees = () => {
setLoading(true);
// miniAppSiteTree({
// _version: 9999,
// _dc: new Date().getTime(),
// node: -2,
// userMode: 'super',
// select: '',
// })
getMiniAppModuleTree({
userMode: userMode || 'super',
})
......@@ -100,7 +93,7 @@ const MiniMenu = props => {
if (res.code === 0) {
const { data } = res;
setLoading(false);
let obj = data[0].children.find(item => item.id.includes('miniapp'));
let obj = data[0].children.find(item => item.id === parentKey);
const result = obj.children[1].children;
setNewTreeList(JSON.parse(JSON.stringify(result)));
setTreeData(result);
......@@ -153,10 +146,10 @@ const MiniMenu = props => {
icon:
obj.menuType !== 'MiniAppMenuThree' &&
obj.menuType !== 'MiniAppMenu' ? (
<FolderFilled />
) : (
<FileOutlined />
),
<FolderFilled />
) : (
<FileOutlined />
),
menuType: obj.menuType,
children: hasChild ? obj.children.map(i => mapTree(i)) : [],
};
......@@ -306,7 +299,7 @@ const MiniMenu = props => {
addMenu({
_dc: Date.now(),
parentID,
subSystemValue: 'miniapp',
subSystemValue: clientName || 'miniapp',
_version: 9999,
...obj,
})
......@@ -345,7 +338,7 @@ const MiniMenu = props => {
editMenu({
_dc: Date.now(),
menuID,
subSystemValue: 'miniapp',
subSystemValue: clientName || 'miniapp',
_version: 9999,
...obj,
})
......@@ -513,7 +506,7 @@ const MiniMenu = props => {
</Tooltip>
</div>
</div>
{treeData.length > 0 && (
{treeData.length > 0 ? (
<Tree
showIcon
onSelect={handleSelect}
......@@ -526,6 +519,11 @@ const MiniMenu = props => {
selectedKeys={[menuID]}
// expandedKeys={[menuID]}
/>
) : (
<Empty
image={Empty.PRESENTED_IMAGE_SIMPLE}
description="暂无菜单"
/>
)}
</div>
<Modal
......@@ -631,4 +629,4 @@ const MiniMenu = props => {
);
};
export default appConnector(MiniMenu);
export default MiniMenu;
.box{
min-height: calc( 100vh - 172px);
min-height: calc( 100vh - 242px)!important;
display: flex;
}
.left{
......
......@@ -34,6 +34,7 @@ import MobileConfigPage from '@/pages/mobileConfig';
import { USER_MODE } from '@/utils/constants';
import BaseFrameContainer from '@/components/BaseFrameContainer';
import JumpContainer from '@/components/JumpContainer';
import ColConen from '@/components/Colophon/colContent';
const iconStyle = { verticalAlign: '0.125em' };
const superAuthority = [USER_MODE.SUPER];
......@@ -70,6 +71,12 @@ export default {
authority: superAuthority,
component: CurrentSolution,
},
{
path: '/colophon',
name: '版本记录',
hideMenu: true,
component: ColConen,
},
{
path: '/dbm',
name: '数据库管理',
......
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