diff --git a/web/config/router.config.js b/web/config/router.config.js index 542bcea3..cf86246a 100644 --- a/web/config/router.config.js +++ b/web/config/router.config.js @@ -259,12 +259,33 @@ export default [ }, { path: '/settings/security', name: 'security', + component: './Settings/Security/Base', hideChildrenInMenu: true, routes: [ { - path: '/settings/security', - name: 'security', - component: './Settings/Security/General', + path: '/settings/security', + redirect: '/settings/security/general', + }, + { + path: '/settings/security/general', + name: 'general', + component: './Settings/Security/General', + }, { + path: '/settings/security/sso', + name: 'sso', + component: './Settings/Security/SSO', + }, { + path: '/settings/security/roles', + name: 'roles', + component: './Settings/Security/Roles', + }, { + path: '/settings/security/users', + name: 'users', + component: './Settings/Security/Users', + }, { + path: '/settings/security/certs', + name: 'certs', + component: './Settings/Security/Certs', }, ] }, { diff --git a/web/src/pages/Settings/Logs/Base.js b/web/src/pages/Settings/Logs/Base.js index 04bb98e3..95634eda 100644 --- a/web/src/pages/Settings/Logs/Base.js +++ b/web/src/pages/Settings/Logs/Base.js @@ -15,7 +15,7 @@ const {TextArea} = Input; @connect() -class Overview extends Component { +class Base extends Component { handleTabChange = key => { const { match,children } = this.props; switch (key) { @@ -70,4 +70,4 @@ class Overview extends Component { } } -export default Overview; +export default Base; diff --git a/web/src/pages/Settings/Security/Base.js b/web/src/pages/Settings/Security/Base.js new file mode 100644 index 00000000..b324a3af --- /dev/null +++ b/web/src/pages/Settings/Security/Base.js @@ -0,0 +1,80 @@ +import router from 'umi/router'; +import { connect } from 'dva'; +import PageHeaderWrapper from '@/components/PageHeaderWrapper'; + +import React, {Component, Fragment} from 'react'; + +import {Col, Divider,Card, Form, Icon, Input, Row, Select, Table} from 'antd'; +import {formatMessage} from 'umi/locale'; + +const {Option} = Select; + +const FormItem = Form.Item; +const {TextArea} = Input; + + + +@connect() +class Base extends Component { + handleTabChange = key => { + const { match,children } = this.props; + switch (key) { + case 'general': + router.push(`${match.url}/general`); + break; + case 'sso': + router.push(`${match.url}/sso`); + break; + case 'roles': + router.push(`${match.url}/roles`); + break; + case 'users': + router.push(`${match.url}/users`); + break; + case 'certs': + router.push(`${match.url}/certs`); + break; + default: + break; + } + } + + render() { + const tabList = [ + { + key: 'general', + tab: '基础设置', + }, + { + key: 'sso', + tab: '单点登录', + }, + { + key: 'roles', + tab: '角色管理', + }, + { + key: 'users', + tab: '用户管理', + }, + { + key: 'certs', + tab: '证书管理', + } + ]; + + const { match, children, location } = this.props; + + return ( + + {children} + + ); + } +} + +export default Base; diff --git a/web/src/pages/Settings/Security/Certs.js b/web/src/pages/Settings/Security/Certs.js new file mode 100644 index 00000000..1684430d --- /dev/null +++ b/web/src/pages/Settings/Security/Certs.js @@ -0,0 +1,26 @@ +import router from 'umi/router'; +import { connect } from 'dva'; +import PageHeaderWrapper from '@/components/PageHeaderWrapper'; + +import React, {Component, Fragment} from 'react'; + +import {Col, Divider,Card, Form, Icon, Input, Row, Select, Table} from 'antd'; +import {formatMessage} from 'umi/locale'; + +const {Option} = Select; + +const FormItem = Form.Item; +const {TextArea} = Input; + + +@connect() +class Certs extends Component { + + render() { + return ( + Certs + ); + } +} + +export default Certs; diff --git a/web/src/pages/Settings/Security/General.js b/web/src/pages/Settings/Security/General.js index 5840d66e..c197db46 100644 --- a/web/src/pages/Settings/Security/General.js +++ b/web/src/pages/Settings/Security/General.js @@ -1,305 +1,88 @@ +import {formatMessage, FormattedMessage} from 'umi/locale'; + import React, {Component, Fragment} from 'react'; import {connect} from 'dva'; -import {Card, Form, Input, Select,Switch, Button, message, Divider, Drawer, Descriptions} from 'antd'; +import {Card, Form, Input, Select,Switch, Button,Row, message,Col, Divider, Drawer, Descriptions} from 'antd'; import { Table, Tag } from 'antd'; import { Icon } from 'antd'; -const {Option} = Select; -import {formatMessage, FormattedMessage} from 'umi/locale'; +import router from 'umi/router'; +import PageHeaderWrapper from '@/components/PageHeaderWrapper'; import styles from './General.less'; -import PhoneView from "../../Account/Settings/PhoneView"; + + +const {Option} = Select; const FormItem = Form.Item; const {TextArea} = Input; -import {Row, Col} from 'antd'; -const operationTabList = [ - { - key: 'tab1', - tab: '基本设置', - }, - { - key: 'tab2', - tab: 'SSO 集成', - }, - { - key: 'tab3', - tab: '角色管理', - }, - { - key: 'tab4', - tab: '用户管理', - }, - { - key: 'tab5', - tab: '证书管理', - } -]; - -// @connect(({logstash,loading }) => ({ -// data: logstash.logstash, -// loading: loading.models.logstash, -// submitting: loading.effects['logstash/submitLogstashConfig'], -// })) - -@Form.create() +@connect() class General extends Component { - state = { - operationkey: 'tab1', - snapshotVisible: false, - repVisible: false, - }; - componentDidMount() { - // message.loading('数据加载中..', 'initdata'); - // const { dispatch } = this.props; - // dispatch({ - // type: 'logstash/queryInitialLogstashConfig', - // }); - } - - onOperationTabChange = key => { - this.setState({operationkey: key}); - }; - - ssoSettings() { - const columns = [ - { - title: 'ID', - dataIndex: 'key', - key: 'key', - render: text => {text}, - }, - { - title: '名称', - dataIndex: 'name', - key: 'name', - }, - { - title: '类型', - dataIndex: 'type', - key: 'type', - }, - { - title: '启用', - key: 'enabled', - dataIndex: 'enabled', - render: text => , - }, { - title: '最后更新时间', - key: 'modify_time', - dataIndex: 'modify_time', - }, { - title: '创建时间', - key: 'create_time', - dataIndex: 'create_time', - }, - { - title: '操作', - key: 'action', - render: (text, record) => ( - - 修改 - - 删除 - - ), - }, - ]; - - const data = [ - { - key: '1', - name: 'github', - type: "OAuth2", - enabled: true, - modify_time: "Mar 01, 2020", - create_time: "Oct 19, 2019", - },{ - key: '2', - name: 'okta', - type: "OAuth2", - enabled: true, - modify_time: "Mar 02, 2020", - create_time: "Oct 29, 2019", - }, - ]; - return (); - } - - userSettings() { - const columns = [ - { - title: 'ID', - dataIndex: 'key', - key: 'key', - render: text => {text}, - }, - { - title: '用户名', - dataIndex: 'user_name', - key: 'user_name', - }, - { - title: '电子邮件地址', - dataIndex: 'email', - key: 'email', - }, - { - title: '已激活', - key: 'enabled', - dataIndex: 'enabled', - render: text => , - }, { - title: '管理员', - key: 'is_admin', - dataIndex: 'is_admin', - render: (text, record) => { - if (record.is_admin){ - return - }else{ - return - } - }, - }, { - title: '创建时间', - key: 'create_time', - dataIndex: 'create_time', - },{ - title: '上次登录', - key: 'last_login_time', - dataIndex: 'last_login_time', - }, - { - title: '操作', - key: 'action', - render: (text, record) => ( - - 修改 - - 删除 - - ), - }, - ]; - - const data = [ - { - key: '1', - user_name: 'admin', - email: "admin@infini.ltd", - enabled: true, - is_admin: true, - create_time: "Oct 19, 2019", - last_login_time: "Mar 01, 2020", - - }, { - key: '2', - user_name: 'user', - email: "user@infini.ltd", - enabled: true, - is_admin: false, - create_time: "Oct 19, 2019", - last_login_time: "Mar 01, 2020", - - }, - ]; - return (
); - } - - generalSettings = () => { + render() { const { form: {getFieldDecorator}, } = this.props; + return ( - < div > - < Row - type = "flex" - justify = "end" > - < Col - span = {16} > - < div > < Form - layout = "vertical" - hideRequiredMark > + +
+ +
+
+
- - {getFieldDecorator('auth2factor_enabled', { - initialValue: true, - rules: [ - { - required: true, - message: formatMessage({id: 'app.settings.security.auth2factor_enabled-message'}, {}), - }, - ], - })( - {}} /> - )} - + + {getFieldDecorator('auth2factor_enabled', { + initialValue: true, + rules: [ + { + required: true, + message: formatMessage({id: 'app.settings.security.auth2factor_enabled-message'}, {}), + }, + ], + })( + {}} /> + )} + - < FormItem - label = {formatMessage({id: 'app.settings.security.audit_enabled'})} > - {getFieldDecorator('audit_enabled', - { - rules: [ - { - required: true, - message: formatMessage({id: 'app.settings.security.audit_enabled-message'}, {}), - }, - ], - } - ) - ( - {}} /> - ) - } - + + {getFieldDecorator('audit_enabled', + { + rules: [ + { + required: true, + message: formatMessage({id: 'app.settings.security.audit_enabled-message'}, {}), + }, + ], + } + ) + ( + {}} /> + ) + } + - < Button - type = "primary" > - < FormattedMessage - id = "app.settings.security.update" - defaultMessage = "Update Setting" - / > - < /Button> - < /Form> - < /Col> - < Col - span = {8} > - - < /Col> - < /Row> - < /div> - ) - ; - }; - - render() { - const {operationkey} = this.state; - const contentList = { - tab1: ( < div > {this.generalSettings()} < /div>), - tab2: ( < div > {this.ssoSettings()}< /div>), - tab3: ( < div > 角色管理 < /div>), - tab4: ( < div > {this.userSettings()} < /div>), - tab5: ( < div > 证书管理 < /div>), - } - ; - return ( - < Fragment > - < Card - className = {styles.tabsCard} - bordered = {false} - tabList = {operationTabList} - onTabChange = {this.onOperationTabChange} - > - {contentList[operationkey]} - < /Card> - < /Fragment> - ) - ; + + +
+ + + + + ); } } -export default General; +export default Form.create()(General); diff --git a/web/src/pages/Settings/Security/Roles.js b/web/src/pages/Settings/Security/Roles.js new file mode 100644 index 00000000..77a287e4 --- /dev/null +++ b/web/src/pages/Settings/Security/Roles.js @@ -0,0 +1,26 @@ +import router from 'umi/router'; +import { connect } from 'dva'; +import PageHeaderWrapper from '@/components/PageHeaderWrapper'; + +import React, {Component, Fragment} from 'react'; + +import {Col, Divider,Card, Form, Icon, Input, Row, Select, Table} from 'antd'; +import {formatMessage} from 'umi/locale'; + +const {Option} = Select; + +const FormItem = Form.Item; +const {TextArea} = Input; + + +@connect() +class Roles extends Component { + + render() { + return ( + Roles + ); + } +} + +export default Roles; diff --git a/web/src/pages/Settings/Security/SSO.js b/web/src/pages/Settings/Security/SSO.js new file mode 100644 index 00000000..08102f2e --- /dev/null +++ b/web/src/pages/Settings/Security/SSO.js @@ -0,0 +1,87 @@ +import router from 'umi/router'; +import { connect } from 'dva'; +import PageHeaderWrapper from '@/components/PageHeaderWrapper'; + +import React, {Component, Fragment} from 'react'; + +import {Col, Divider,Card, Form, Icon, Input, Row, Select, Table} from 'antd'; +import {formatMessage} from 'umi/locale'; + +const {Option} = Select; + +const FormItem = Form.Item; +const {TextArea} = Input; + +const columns = [ + { + title: 'ID', + dataIndex: 'key', + key: 'key', + render: text => {text}, + }, + { + title: '名称', + dataIndex: 'name', + key: 'name', + }, + { + title: '类型', + dataIndex: 'type', + key: 'type', + }, + { + title: '启用', + key: 'enabled', + dataIndex: 'enabled', + render: text => , + }, { + title: '最后更新时间', + key: 'modify_time', + dataIndex: 'modify_time', + }, { + title: '创建时间', + key: 'create_time', + dataIndex: 'create_time', + }, + { + title: '操作', + key: 'action', + render: (text, record) => ( + + 修改 + + 删除 + + ), + }, +]; + +const data = [ + { + key: '1', + name: 'github', + type: "OAuth2", + enabled: true, + modify_time: "Mar 01, 2020", + create_time: "Oct 19, 2019", + },{ + key: '2', + name: 'okta', + type: "OAuth2", + enabled: true, + modify_time: "Mar 02, 2020", + create_time: "Oct 29, 2019", + }, +]; + +@connect() +class SSO extends Component { + + render() { + return ( +
+ ); + } +} + +export default SSO; diff --git a/web/src/pages/Settings/Security/Users.js b/web/src/pages/Settings/Security/Users.js new file mode 100644 index 00000000..a4951bfd --- /dev/null +++ b/web/src/pages/Settings/Security/Users.js @@ -0,0 +1,102 @@ +import router from 'umi/router'; +import { connect } from 'dva'; +import PageHeaderWrapper from '@/components/PageHeaderWrapper'; + +import React, {Component, Fragment} from 'react'; + +import {Col, Divider,Card, Form, Icon, Input, Row, Select, Table} from 'antd'; +import {formatMessage} from 'umi/locale'; + +const {Option} = Select; + +const FormItem = Form.Item; +const {TextArea} = Input; + +const columns = [ + { + title: 'ID', + dataIndex: 'key', + key: 'key', + render: text => {text}, + }, + { + title: '用户名', + dataIndex: 'user_name', + key: 'user_name', + }, + { + title: '电子邮件地址', + dataIndex: 'email', + key: 'email', + }, + { + title: '已激活', + key: 'enabled', + dataIndex: 'enabled', + render: text => , + }, { + title: '管理员', + key: 'is_admin', + dataIndex: 'is_admin', + render: (text, record) => { + if (record.is_admin){ + return + }else{ + return + } + }, + }, { + title: '创建时间', + key: 'create_time', + dataIndex: 'create_time', + },{ + title: '上次登录', + key: 'last_login_time', + dataIndex: 'last_login_time', + }, + { + title: '操作', + key: 'action', + render: (text, record) => ( + + 修改 + + 删除 + + ), + }, +]; + +const data = [ + { + key: '1', + user_name: 'admin', + email: "admin@infini.ltd", + enabled: true, + is_admin: true, + create_time: "Oct 19, 2019", + last_login_time: "Mar 01, 2020", + + }, { + key: '2', + user_name: 'user', + email: "user@infini.ltd", + enabled: true, + is_admin: false, + create_time: "Oct 19, 2019", + last_login_time: "Mar 01, 2020", + + }, +]; + +@connect() +class Users extends Component { + + render() { + return ( +
+ ); + } +} + +export default Users;