From 99e6dfee83752584ada2aec397c4ce0250878474 Mon Sep 17 00:00:00 2001 From: smallchill Date: Mon, 1 Apr 2019 23:01:21 +0800 Subject: [PATCH] =?UTF-8?q?:tada:=20=E5=A2=9E=E5=8A=A0=E5=A4=9A=E7=BB=88?= =?UTF-8?q?=E7=AB=AF=E4=BB=A4=E7=89=8C=E8=AE=A4=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- config/router.config.js | 10 ++ mock/client.js | 65 ++++++++ package.json | 3 +- src/actions/client.js | 36 +++++ src/defaultSettings.js | 5 +- src/locales/en-US/menu.js | 1 + src/locales/zh-CN/menu.js | 1 + src/locales/zh-TW/menu.js | 1 + src/models/client.js | 87 ++++++++++ src/pages/Login/Login.js | 23 +-- src/pages/System/Client/Client.js | 99 ++++++++++++ src/pages/System/Client/ClientAdd.js | 188 ++++++++++++++++++++++ src/pages/System/Client/ClientEdit.js | 219 ++++++++++++++++++++++++++ src/pages/System/Client/ClientView.js | 101 ++++++++++++ src/pages/System/Dept/Dept.js | 13 +- src/pages/System/Dept/DeptAdd.js | 1 - src/pages/System/Dept/DeptEdit.js | 8 +- src/pages/System/Dict/DictAdd.js | 1 - src/pages/System/Dict/DictEdit.js | 8 +- src/pages/System/Menu/MenuAdd.js | 1 - src/pages/System/Menu/MenuEdit.js | 7 +- src/pages/System/Role/Role.js | 13 +- src/pages/System/Role/RoleAdd.js | 1 - src/pages/System/Role/RoleEdit.js | 8 +- src/pages/System/User/User.js | 9 +- src/pages/System/User/UserAdd.js | 74 +++++---- src/pages/System/User/UserEdit.js | 78 +++++---- src/pages/System/User/UserView.js | 28 +++- src/services/client.js | 25 +++ src/utils/request.js | 12 +- tslint.json | 3 + 32 files changed, 1024 insertions(+), 108 deletions(-) create mode 100644 mock/client.js create mode 100644 src/actions/client.js create mode 100644 src/models/client.js create mode 100644 src/pages/System/Client/Client.js create mode 100644 src/pages/System/Client/ClientAdd.js create mode 100644 src/pages/System/Client/ClientEdit.js create mode 100644 src/pages/System/Client/ClientView.js create mode 100644 src/services/client.js diff --git a/README.md b/README.md index d71c3d0..90119f2 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ ## 简介 -Sword 是 [SpringBlade](https://gitee.com/smallc/SpringBlade)前端UI项目,基于react 、ant design、dva,用于快速构建系统中后台业务。 +* Sword 是 [SpringBlade](https://gitee.com/smallc/SpringBlade)前端UI项目,基于react 、ant design、dva,用于快速构建系统中后台业务。 +* Sword 已入选 ant design 官方脚手架市场,地址:[scaffolds.ant.design](http://scaffold.ant.design/#/scaffolds/Sword) ## 文档 * 文档地址:[Sword开发手册](https://www.kancloud.cn/smallchill/sword) diff --git a/config/router.config.js b/config/router.config.js index 8fc624d..2180332 100644 --- a/config/router.config.js +++ b/config/router.config.js @@ -166,6 +166,16 @@ export default [ { path: '/system/tenant/view/:id', component: './System/Tenant/TenantView' }, ], }, + { + path: '/system/client', + routes: [ + { path: '/system/client', redirect: '/system/client/list' }, + { path: '/system/client/list', component: './System/Client/Client' }, + { path: '/system/client/add', component: './System/Client/ClientAdd' }, + { path: '/system/client/edit/:id', component: './System/Client/ClientEdit' }, + { path: '/system/client/view/:id', component: './System/Client/ClientView' }, + ], + }, ], }, { diff --git a/mock/client.js b/mock/client.js new file mode 100644 index 0000000..21f82be --- /dev/null +++ b/mock/client.js @@ -0,0 +1,65 @@ +import { delay } from 'roadhog-api-doc'; + +function getFakeList(req, res) { + const json = { code: 200, success: true, msg: '操作成功' }; + const list = []; + list.push( + { + id: '1', + clientId: 'sword', + clientSecret: 'sword_secret', + scope: 'all', + authorizedGrantTypes: 'refresh_token,password,authorization_code', + webServerRedirectUri: 'https://sword.bladex.vip', + accessTokenValidity: '3600', + refreshTokenValidity: '36000', + }, + { + id: '2', + clientId: 'saber', + clientSecret: 'saber_secret', + scope: 'all', + authorizedGrantTypes: 'refresh_token,password,authorization_code', + webServerRedirectUri: 'https://saber.bladex.vip', + accessTokenValidity: '3600', + refreshTokenValidity: '36000', + } + ); + json.data = { + total: 10, + size: 10, + current: 2, + searchCount: true, + pages: 1, + records: list, + }; + return res.json(json); +} + +function getFakeDetail(req, res) { + const json = { code: 200, success: true, msg: '操作成功' }; + json.data = { + id: '1', + clientId: 'sword', + clientSecret: 'sword_secret', + scope: 'all', + authorizedGrantTypes: 'refresh_token,password,authorization_code', + webServerRedirectUri: 'https://sword.bladex.vip', + accessTokenValidity: '3600', + refreshTokenValidity: '36000', + }; + return res.json(json); +} + +function fakeSuccess(req, res) { + const json = { code: 200, success: true, msg: '操作成功' }; + return res.json(json); +} + +const proxy = { + 'GET /api/blade-system/client/list': getFakeList, + 'GET /api/blade-system/client/detail': getFakeDetail, + 'POST /api/blade-system/client/submit': fakeSuccess, + 'POST /api/blade-system/client/remove': fakeSuccess, +}; +export default delay(proxy, 500); diff --git a/package.json b/package.json index c8519b8..62fbe4f 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,8 @@ "react-fittext": "^1.0.0", "react-media": "^1.9.2", "react-router-dom": "^4.3.1", - "roadhog-api-doc": "^1.1.2" + "roadhog-api-doc": "^1.1.2", + "js-base64": "^2.5.1" }, "devDependencies": { "@types/react": "^16.8.1", diff --git a/src/actions/client.js b/src/actions/client.js new file mode 100644 index 0000000..c8b55da --- /dev/null +++ b/src/actions/client.js @@ -0,0 +1,36 @@ +export const CLIENT_NAMESPACE = 'client'; + +export function CLIENT_LIST(payload) { + return { + type: `${CLIENT_NAMESPACE}/fetchList`, + payload, + }; +} + +export function CLIENT_DETAIL(id) { + return { + type: `${CLIENT_NAMESPACE}/fetchDetail`, + payload: { id }, + }; +} + +export function CLIENT_CLEAR_DETAIL() { + return { + type: `${CLIENT_NAMESPACE}/clearDetail`, + payload: {}, + }; +} + +export function CLIENT_SUBMIT(payload) { + return { + type: `${CLIENT_NAMESPACE}/submit`, + payload, + }; +} + +export function CLIENT_REMOVE(payload) { + return { + type: `${CLIENT_NAMESPACE}/remove`, + payload, + }; +} diff --git a/src/defaultSettings.js b/src/defaultSettings.js index 6e98a77..4d39b6e 100644 --- a/src/defaultSettings.js +++ b/src/defaultSettings.js @@ -1,4 +1,8 @@ module.exports = { + title: 'Sword企业级开发平台', + clientId: 'sword', // 客户端id + clientSecret: 'sword_secret', // 客户端密钥 + tenantMode: true, // 开启租户模式 navTheme: 'dark', // theme for nav menu primaryColor: '#1890FF', // primary color of ant design layout: 'sidemenu', // nav menu position: sidemenu or topmenu @@ -10,6 +14,5 @@ module.exports = { menu: { disableLocal: false, }, - title: 'Sword企业级开发平台', pwa: true, }; diff --git a/src/locales/en-US/menu.js b/src/locales/en-US/menu.js index 194b0b2..cc83d16 100644 --- a/src/locales/en-US/menu.js +++ b/src/locales/en-US/menu.js @@ -14,6 +14,7 @@ export default { 'menu.system.role': 'role', 'menu.system.param': 'parameter', 'menu.system.tenant': 'tenant', + 'menu.system.client': 'client', 'menu.monitor': 'monitor', 'menu.monitor.log': 'log', 'menu.monitor.log.log_usual': 'usual log', diff --git a/src/locales/zh-CN/menu.js b/src/locales/zh-CN/menu.js index 5e3f773..eafd4bb 100644 --- a/src/locales/zh-CN/menu.js +++ b/src/locales/zh-CN/menu.js @@ -14,6 +14,7 @@ export default { 'menu.system.role': '角色管理', 'menu.system.param': '参数管理', 'menu.system.tenant': '租户管理', + 'menu.system.client': '应用管理', 'menu.monitor': '系统监控', 'menu.monitor.log': '日志管理', 'menu.monitor.log.log_usual': '通用日志', diff --git a/src/locales/zh-TW/menu.js b/src/locales/zh-TW/menu.js index ff3c00b..3bd46e2 100644 --- a/src/locales/zh-TW/menu.js +++ b/src/locales/zh-TW/menu.js @@ -14,6 +14,7 @@ export default { 'menu.system.role': '角色管理', 'menu.system.param': '參數管理', 'menu.system.tenant': '租戶管理', + 'menu.system.client': '應用管理', 'menu.monitor': '系統監控', 'menu.monitor.log': '日志管理', 'menu.monitor.log.log_usual': '通用日志', diff --git a/src/models/client.js b/src/models/client.js new file mode 100644 index 0000000..e81ccbb --- /dev/null +++ b/src/models/client.js @@ -0,0 +1,87 @@ +import { message } from 'antd'; +import router from 'umi/router'; +import { CLIENT_NAMESPACE } from '../actions/client'; +import { list, submit, detail, remove } from '../services/client'; + +export default { + namespace: CLIENT_NAMESPACE, + state: { + data: { + list: [], + pagination: false, + }, + detail: {}, + }, + effects: { + *fetchList({ payload }, { call, put }) { + const response = yield call(list, payload); + if (response.success) { + yield put({ + type: 'saveList', + payload: { + list: response.data.records, + pagination: { + total: response.data.total, + current: response.data.current, + pageSize: response.data.size, + }, + }, + }); + } + }, + *fetchDetail({ payload }, { call, put }) { + const response = yield call(detail, payload); + if (response.success) { + yield put({ + type: 'saveDetail', + payload: { + detail: response.data, + }, + }); + } + }, + *clearDetail({ payload }, { put }) { + yield put({ + type: 'removeDetail', + payload: { payload }, + }); + }, + *submit({ payload }, { call }) { + const response = yield call(submit, payload); + if (response.success) { + message.success('提交成功'); + router.push('/system/client'); + } + }, + *remove({ payload }, { call }) { + const { + data: { keys }, + success, + } = payload; + const response = yield call(remove, { ids: keys }); + if (response.success) { + success(); + } + }, + }, + reducers: { + saveList(state, action) { + return { + ...state, + data: action.payload, + }; + }, + saveDetail(state, action) { + return { + ...state, + detail: action.payload.detail, + }; + }, + removeDetail(state) { + return { + ...state, + detail: {}, + }; + }, + }, +}; diff --git a/src/pages/Login/Login.js b/src/pages/Login/Login.js index 9652781..96a19dc 100644 --- a/src/pages/Login/Login.js +++ b/src/pages/Login/Login.js @@ -4,6 +4,7 @@ import { formatMessage, FormattedMessage } from 'umi/locale'; import { Checkbox, Alert } from 'antd'; import Login from '../../components/Login'; import styles from './Login.less'; +import { tenantMode } from '../../defaultSettings'; const { Tab, TenantCode, UserName, Password, Submit } = Login; @@ -80,16 +81,18 @@ class LoginPage extends Component { login.type === 'account' && !submitting && this.renderMessage(formatMessage({ id: 'app.login.message-invalid-credentials' }))} - + {tenantMode ? ( + + ) : null} ({ + client, + loading: loading.models.client, +})) +@Form.create() +class Client extends PureComponent { + // ============ 查询 =============== + handleSearch = params => { + const { dispatch } = this.props; + dispatch(CLIENT_LIST(params)); + }; + + // ============ 查询表单 =============== + renderSearchForm = onReset => { + const { form } = this.props; + const { getFieldDecorator } = form; + + return ( + + + + {getFieldDecorator('clientId')()} + + + +
+ + +
+ +
+ ); + }; + + render() { + const code = 'client'; + + const { + form, + loading, + client: { data }, + } = this.props; + + const columns = [ + { + title: '客户端id', + dataIndex: 'clientId', + }, + { + title: '客户端密钥', + dataIndex: 'clientSecret', + }, + { + title: '授权范围', + dataIndex: 'scope', + }, + { + title: '授权类型', + dataIndex: 'authorizedGrantTypes', + }, + { + title: '回调地址', + dataIndex: 'webServerRedirectUri', + }, + { + title: '令牌过期秒数', + dataIndex: 'accessTokenValidity', + }, + ]; + + return ( + + + + ); + } +} +export default Client; diff --git a/src/pages/System/Client/ClientAdd.js b/src/pages/System/Client/ClientAdd.js new file mode 100644 index 0000000..72c103a --- /dev/null +++ b/src/pages/System/Client/ClientAdd.js @@ -0,0 +1,188 @@ +import React, { PureComponent } from 'react'; +import { Form, Input, Card, Button, Row, Col, InputNumber } from 'antd'; +import { connect } from 'dva'; +import Panel from '../../../components/Panel'; +import styles from '../../../layouts/Sword.less'; +import { CLIENT_SUBMIT } from '../../../actions/client'; + +const FormItem = Form.Item; + +@connect(({ loading }) => ({ + submitting: loading.effects['client/submit'], +})) +@Form.create() +class ClientAdd extends PureComponent { + handleSubmit = e => { + e.preventDefault(); + const { dispatch, form } = this.props; + form.validateFieldsAndScroll((err, values) => { + if (!err) { + dispatch(CLIENT_SUBMIT(values)); + } + }); + }; + + render() { + const { + form: { getFieldDecorator }, + submitting, + } = this.props; + + const formItemLayout = { + labelCol: { + span: 8, + }, + wrapperCol: { + span: 16, + }, + }; + + const formAllItemLayout = { + labelCol: { + span: 4, + }, + wrapperCol: { + span: 20, + }, + }; + + const action = ( + + ); + + return ( + +
+ + + + + {getFieldDecorator('clientId', { + rules: [ + { + required: true, + message: '请输入客户端id', + }, + ], + })()} + + + + + {getFieldDecorator('clientSecret', { + rules: [ + { + required: true, + message: '请输入客户端密钥', + }, + ], + })()} + + + + + + + {getFieldDecorator('authorizedGrantTypes', { + rules: [ + { + required: true, + message: '请输入授权类型', + }, + ], + initialValue: 'refresh_token,password,authorization_code', + })()} + + + + + {getFieldDecorator('scope', { + rules: [ + { + required: true, + message: '请输入授权范围', + }, + ], + initialValue: 'all', + })()} + + + + + + + {getFieldDecorator('accessTokenValidity', { + rules: [ + { + required: true, + message: '请输入令牌过期秒数', + }, + ], + initialValue: 3600, + })()} + + + + + {getFieldDecorator('refreshTokenValidity', { + rules: [ + { + required: true, + message: '请输入刷新令牌过期秒数', + }, + ], + initialValue: 604800, + })()} + + + + + + + {getFieldDecorator('webServerRedirectUri', { + rules: [ + { + required: true, + message: '请输入回调地址', + }, + ], + })()} + + + + + {getFieldDecorator('resourceIds', {})()} + + + + + + + {getFieldDecorator('authorities', {})()} + + + + + {getFieldDecorator('autoapprove', {})()} + + + + + + + {getFieldDecorator('additionalInformation', {})( + + )} + + + + +
+
+ ); + } +} + +export default ClientAdd; diff --git a/src/pages/System/Client/ClientEdit.js b/src/pages/System/Client/ClientEdit.js new file mode 100644 index 0000000..b099742 --- /dev/null +++ b/src/pages/System/Client/ClientEdit.js @@ -0,0 +1,219 @@ +import React, { PureComponent } from 'react'; +import { Form, Input, Card, Button, Row, Col, InputNumber } from 'antd'; +import { connect } from 'dva'; +import Panel from '../../../components/Panel'; +import styles from '../../../layouts/Sword.less'; +import { CLIENT_DETAIL, CLIENT_SUBMIT } from '../../../actions/client'; + +const FormItem = Form.Item; + +@connect(({ client, loading }) => ({ + client, + submitting: loading.effects['client/submit'], +})) +@Form.create() +class ClientEdit extends PureComponent { + componentWillMount() { + const { + dispatch, + match: { + params: { id }, + }, + } = this.props; + dispatch(CLIENT_DETAIL(id)); + } + + handleSubmit = e => { + e.preventDefault(); + const { + dispatch, + match: { + params: { id }, + }, + form, + } = this.props; + form.validateFieldsAndScroll((err, values) => { + if (!err) { + const params = { + id, + ...values, + }; + dispatch(CLIENT_SUBMIT(params)); + } + }); + }; + + render() { + const { + form: { getFieldDecorator }, + client: { detail }, + submitting, + } = this.props; + + const formItemLayout = { + labelCol: { + span: 8, + }, + wrapperCol: { + span: 16, + }, + }; + + const formAllItemLayout = { + labelCol: { + span: 4, + }, + wrapperCol: { + span: 20, + }, + }; + + const action = ( + + ); + + return ( + +
+ + + + + {getFieldDecorator('clientId', { + rules: [ + { + required: true, + message: '请输入客户端id', + }, + ], + initialValue: detail.clientId, + })()} + + + + + {getFieldDecorator('clientSecret', { + rules: [ + { + required: true, + message: '请输入客户端密钥', + }, + ], + initialValue: detail.clientSecret, + })()} + + + + + + + {getFieldDecorator('authorizedGrantTypes', { + rules: [ + { + required: true, + message: '请输入授权类型', + }, + ], + initialValue: detail.authorizedGrantTypes, + })()} + + + + + {getFieldDecorator('scope', { + rules: [ + { + required: true, + message: '请输入授权范围', + }, + ], + initialValue: detail.scope, + })()} + + + + + + + {getFieldDecorator('accessTokenValidity', { + rules: [ + { + required: true, + message: '请输入令牌过期秒数', + }, + ], + initialValue: detail.accessTokenValidity, + })()} + + + + + {getFieldDecorator('refreshTokenValidity', { + rules: [ + { + required: true, + message: '请输入刷新令牌过期秒数', + }, + ], + initialValue: detail.refreshTokenValidity, + })()} + + + + + + + {getFieldDecorator('webServerRedirectUri', { + rules: [ + { + required: true, + message: '请输入回调地址', + }, + ], + initialValue: detail.webServerRedirectUri, + })()} + + + + + {getFieldDecorator('resourceIds', { + initialValue: detail.resourceIds, + })()} + + + + + + + {getFieldDecorator('authorities', { + initialValue: detail.authorities, + })()} + + + + + {getFieldDecorator('autoapprove', { + initialValue: detail.autoapprove, + })()} + + + + + + + {getFieldDecorator('additionalInformation', { + initialValue: detail.additionalInformation, + })()} + + + + +
+
+ ); + } +} + +export default ClientEdit; diff --git a/src/pages/System/Client/ClientView.js b/src/pages/System/Client/ClientView.js new file mode 100644 index 0000000..c53bc66 --- /dev/null +++ b/src/pages/System/Client/ClientView.js @@ -0,0 +1,101 @@ +import React, { PureComponent } from 'react'; +import router from 'umi/router'; +import { Form, Card, Button } from 'antd'; +import { connect } from 'dva'; +import Panel from '../../../components/Panel'; +import styles from '../../../layouts/Sword.less'; +import { CLIENT_DETAIL } from '../../../actions/client'; + +const FormItem = Form.Item; + +@connect(({ client }) => ({ + client, +})) +@Form.create() +class ClientView extends PureComponent { + componentWillMount() { + const { + dispatch, + match: { + params: { id }, + }, + } = this.props; + dispatch(CLIENT_DETAIL(id)); + } + + handleEdit = () => { + const { + match: { + params: { id }, + }, + } = this.props; + router.push(`/system/client/edit/${id}`); + }; + + render() { + const { + client: { detail }, + } = this.props; + + const formItemLayout = { + labelCol: { + xs: { span: 24 }, + sm: { span: 7 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 12 }, + md: { span: 10 }, + }, + }; + + const action = ( + + ); + + return ( + +
+ + + {detail.clientId} + + + {detail.clientSecret} + + + {detail.resourceIds} + + + {detail.scope} + + + {detail.authorizedGrantTypes} + + + {detail.accessTokenValidity} + + + {detail.refreshTokenValidity} + + + {detail.webServerRedirectUri} + + + {detail.authorities} + + + {detail.additionalInformation} + + + {detail.autoapprove} + + +
+
+ ); + } +} +export default ClientView; diff --git a/src/pages/System/Dept/Dept.js b/src/pages/System/Dept/Dept.js index 4cdd327..f859afd 100644 --- a/src/pages/System/Dept/Dept.js +++ b/src/pages/System/Dept/Dept.js @@ -4,6 +4,7 @@ import { Button, Col, Form, Input, Row } from 'antd'; import Panel from '../../../components/Panel'; import Grid from '../../../components/Sword/Grid'; import { DEPT_LIST } from '../../../actions/dept'; +import { tenantMode } from '../../../defaultSettings'; const FormItem = Form.Item; @@ -65,14 +66,14 @@ class Dept extends PureComponent { } = this.props; const columns = [ - { - title: '部门名称', - dataIndex: 'deptName', - }, { title: '租户编号', dataIndex: 'tenantCode', }, + { + title: '部门名称', + dataIndex: 'deptName', + }, { title: '部门全称', dataIndex: 'fullName', @@ -83,6 +84,10 @@ class Dept extends PureComponent { }, ]; + if (!tenantMode) { + columns.splice(0, 1); + } + return ( { if (!err) { - console.log(values); dispatch(DEPT_SUBMIT(values)); } }); diff --git a/src/pages/System/Dept/DeptEdit.js b/src/pages/System/Dept/DeptEdit.js index 2bd9c9c..92a2994 100644 --- a/src/pages/System/Dept/DeptEdit.js +++ b/src/pages/System/Dept/DeptEdit.js @@ -1,5 +1,5 @@ import React, { PureComponent } from 'react'; -import { Form, Input, Card, Row, Col, Button, InputNumber, TreeSelect } from 'antd'; +import { Form, Input, Card, Row, Col, Button, InputNumber, TreeSelect, message } from "antd"; import { connect } from 'dva'; import Panel from '../../../components/Panel'; import styles from '../../../layouts/Sword.less'; @@ -34,13 +34,17 @@ class DeptEdit extends PureComponent { }, form, } = this.props; + const parentId = form.getFieldValue('parentId'); + if (id === parentId.toString()) { + message.warn('上级部门不能选择自身!'); + return; + } form.validateFieldsAndScroll((err, values) => { if (!err) { const params = { id, ...values, }; - console.log(params); dispatch(DEPT_SUBMIT(params)); } }); diff --git a/src/pages/System/Dict/DictAdd.js b/src/pages/System/Dict/DictAdd.js index 6bffbc9..d06b4a7 100644 --- a/src/pages/System/Dict/DictAdd.js +++ b/src/pages/System/Dict/DictAdd.js @@ -40,7 +40,6 @@ class DictAdd extends PureComponent { const { dispatch, form } = this.props; form.validateFieldsAndScroll((err, values) => { if (!err) { - console.log(values); dispatch(DICT_SUBMIT(values)); } }); diff --git a/src/pages/System/Dict/DictEdit.js b/src/pages/System/Dict/DictEdit.js index ff32e15..1ac24a1 100644 --- a/src/pages/System/Dict/DictEdit.js +++ b/src/pages/System/Dict/DictEdit.js @@ -1,5 +1,5 @@ import React, { PureComponent } from 'react'; -import { Form, Input, Card, Row, Col, Button, InputNumber, TreeSelect } from 'antd'; +import { Form, Input, Card, Row, Col, Button, InputNumber, TreeSelect, message } from "antd"; import { connect } from 'dva'; import Panel from '../../../components/Panel'; import styles from '../../../layouts/Sword.less'; @@ -39,13 +39,17 @@ class DictEdit extends PureComponent { }, form, } = this.props; + const parentId = form.getFieldValue('parentId'); + if (id === parentId.toString()) { + message.warn('上级字典不能选择自身!'); + return; + } form.validateFieldsAndScroll((err, values) => { if (!err) { const params = { id, ...values, }; - console.log(params); dispatch(DICT_SUBMIT(params)); } }); diff --git a/src/pages/System/Menu/MenuAdd.js b/src/pages/System/Menu/MenuAdd.js index 0367456..9a37b64 100644 --- a/src/pages/System/Menu/MenuAdd.js +++ b/src/pages/System/Menu/MenuAdd.js @@ -51,7 +51,6 @@ class MenuAdd extends PureComponent { const { dispatch, form } = this.props; form.validateFieldsAndScroll((err, values) => { if (!err) { - console.log(values); dispatch(MENU_SUBMIT(values)); } }); diff --git a/src/pages/System/Menu/MenuEdit.js b/src/pages/System/Menu/MenuEdit.js index 19cf364..f8a2c1b 100644 --- a/src/pages/System/Menu/MenuEdit.js +++ b/src/pages/System/Menu/MenuEdit.js @@ -11,6 +11,7 @@ import { Radio, Icon, Modal, + message, } from 'antd'; import { connect } from 'dva'; import Panel from '../../../components/Panel'; @@ -51,13 +52,17 @@ class MenuEdit extends PureComponent { }, form, } = this.props; + const parentId = form.getFieldValue('parentId'); + if (id === parentId.toString()) { + message.warn('上级菜单不能选择自身!'); + return; + } form.validateFieldsAndScroll((err, values) => { if (!err) { const params = { id, ...values, }; - console.log(params); dispatch(MENU_SUBMIT(params)); } }); diff --git a/src/pages/System/Role/Role.js b/src/pages/System/Role/Role.js index d8f4406..82ecc51 100644 --- a/src/pages/System/Role/Role.js +++ b/src/pages/System/Role/Role.js @@ -11,6 +11,7 @@ import { ROLE_GRANT, } from '../../../actions/role'; import { MENU_REFRESH_DATA } from '../../../actions/menu'; +import { tenantMode } from '../../../defaultSettings'; const FormItem = Form.Item; const { TreeNode } = Tree; @@ -176,14 +177,14 @@ class Role extends PureComponent { } = this.props; const columns = [ - { - title: '角色名称', - dataIndex: 'roleName', - }, { title: '租户编号', dataIndex: 'tenantCode', }, + { + title: '角色名称', + dataIndex: 'roleName', + }, { title: '角色别名', dataIndex: 'roleAlias', @@ -194,6 +195,10 @@ class Role extends PureComponent { }, ]; + if (!tenantMode) { + columns.splice(0, 1); + } + return ( { if (!err) { - console.log(values); dispatch(ROLE_SUBMIT(values)); } }); diff --git a/src/pages/System/Role/RoleEdit.js b/src/pages/System/Role/RoleEdit.js index 224f869..f931e6e 100644 --- a/src/pages/System/Role/RoleEdit.js +++ b/src/pages/System/Role/RoleEdit.js @@ -1,5 +1,5 @@ import React, { PureComponent } from 'react'; -import { Form, Input, Card, Row, Col, Button, InputNumber, TreeSelect } from 'antd'; +import { Form, Input, Card, Row, Col, Button, InputNumber, TreeSelect, message } from "antd"; import { connect } from 'dva'; import Panel from '../../../components/Panel'; import styles from '../../../layouts/Sword.less'; @@ -34,13 +34,17 @@ class RoleEdit extends PureComponent { }, form, } = this.props; + const parentId = form.getFieldValue('parentId'); + if (id === parentId.toString()) { + message.warn('上级角色不能选择自身!'); + return; + } form.validateFieldsAndScroll((err, values) => { if (!err) { const params = { id, ...values, }; - console.log(params); dispatch(ROLE_SUBMIT(params)); } }); diff --git a/src/pages/System/User/User.js b/src/pages/System/User/User.js index 23dc44c..9be9608 100644 --- a/src/pages/System/User/User.js +++ b/src/pages/System/User/User.js @@ -5,6 +5,7 @@ import Panel from '../../../components/Panel'; import Grid from '../../../components/Sword/Grid'; import { USER_INIT, USER_LIST, USER_ROLE_GRANT } from '../../../actions/user'; import { resetPassword } from '../../../services/user'; +import { tenantMode } from '../../../defaultSettings'; const FormItem = Form.Item; const { TreeNode } = Tree; @@ -205,12 +206,12 @@ class User extends PureComponent { title: '电子邮箱', dataIndex: 'email', }, - { - title: '账号状态', - dataIndex: 'statusName', - }, ]; + if (!tenantMode) { + columns.splice(0, 1); + } + return ( 提交 @@ -77,8 +87,8 @@ class UserAdd extends PureComponent {
- - + + {getFieldDecorator('account', { rules: [ { @@ -89,35 +99,39 @@ class UserAdd extends PureComponent { })()} - - - {getFieldDecorator('tenantCode', { - rules: [ - { - required: true, - message: '请选择所属租户', - }, - ], - })( - - )} - - + {tenantMode ? ( + + + + {getFieldDecorator('tenantCode', { + rules: [ + { + required: true, + message: '请选择所属租户', + }, + ], + })( + + )} + + + + ) : null} diff --git a/src/pages/System/User/UserEdit.js b/src/pages/System/User/UserEdit.js index 7e7b12d..5591d3f 100644 --- a/src/pages/System/User/UserEdit.js +++ b/src/pages/System/User/UserEdit.js @@ -6,6 +6,7 @@ import Panel from '../../../components/Panel'; import func from '../../../utils/Func'; import styles from '../../../layouts/Sword.less'; import { USER_CHANGE_INIT, USER_DETAIL, USER_INIT, USER_SUBMIT } from '../../../actions/user'; +import { tenantMode } from '../../../defaultSettings'; const FormItem = Form.Item; @@ -65,8 +66,6 @@ class UserEdit extends PureComponent { submitting, } = this.props; - console.log(detail); - const formItemLayout = { labelCol: { span: 8, @@ -76,6 +75,15 @@ class UserEdit extends PureComponent { }, }; + const formAllItemLayout = { + labelCol: { + span: 4, + }, + wrapperCol: { + span: 20, + }, + }; + const action = (