From 43a49063e2a6636b3c53b6e54d059af55e6ba631 Mon Sep 17 00:00:00 2001 From: smallchill Date: Fri, 12 Jun 2020 11:53:17 +0800 Subject: [PATCH] =?UTF-8?q?:tada:=202.7.1.RELEASE,=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=A1=8C=E6=94=BF=E5=8C=BA=E5=88=92=E7=AE=A1=E7=90=86,?= =?UTF-8?q?=E6=94=AF=E6=8C=81seata1.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +- config/router.config.js | 12 + src/locales/en-US/menu.js | 2 + src/locales/zh-CN/menu.js | 2 + src/locales/zh-TW/menu.js | 2 + src/pages/Base/Region/Region.js | 399 +++++++++++++++++++++++++++++++ src/pages/Dashboard/Workplace.js | 20 +- src/services/region.js | 25 ++ src/utils/authority.js | 4 + 9 files changed, 467 insertions(+), 8 deletions(-) create mode 100644 src/pages/Base/Region/Region.js create mode 100644 src/services/region.js diff --git a/README.md b/README.md index 5490155..2086926 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@

- Downloads + Downloads Build Status Build Status - Coverage Status - Downloads + Coverage Status + Downloads Downloads @@ -58,7 +58,8 @@ SpringBlade * 会员计划:[SpringBlade会员计划](https://gitee.com/smallc/SpringBlade/wikis/SpringBlade会员计划) * 交流一群:`477853168`(满) * 交流二群:`751253339`(满) -* 交流三群:`784729540` +* 交流三群:`784729540`(满) +* 交流四群:`1034621754` ## 在线演示 * Saber-基于Vue:[https://saber.bladex.vip](https://saber.bladex.vip) diff --git a/config/router.config.js b/config/router.config.js index e903132..5e7c708 100644 --- a/config/router.config.js +++ b/config/router.config.js @@ -90,6 +90,18 @@ export default [ }, ], }, + { + path: '/base', + routes: [ + { + path: '/base/region', + routes: [ + { path: '/base/region', redirect: '/base/region/detail' }, + { path: '/base/region/detail', component: './Base/Region/Region' }, + ], + }, + ], + }, { path: '/system', routes: [ diff --git a/src/locales/en-US/menu.js b/src/locales/en-US/menu.js index e7b7443..af66b88 100644 --- a/src/locales/en-US/menu.js +++ b/src/locales/en-US/menu.js @@ -6,6 +6,8 @@ export default { 'menu.dashboard.workplace': 'Workplace', 'menu.desk': 'desktop', 'menu.desk.notice': 'notice', + 'menu.base': 'base', + 'menu.base.region': 'region', 'menu.system': 'system', 'menu.system.user': 'user', 'menu.system.dept': 'department', diff --git a/src/locales/zh-CN/menu.js b/src/locales/zh-CN/menu.js index e158659..2b3e64a 100644 --- a/src/locales/zh-CN/menu.js +++ b/src/locales/zh-CN/menu.js @@ -6,6 +6,8 @@ export default { 'menu.dashboard.workplace': '工作台', 'menu.desk': '工作台', 'menu.desk.notice': '通知公告', + 'menu.base': '基础配置', + 'menu.base.region': '行政区划', 'menu.system': '系统管理', 'menu.system.user': '用户管理', 'menu.system.dept': '部门管理', diff --git a/src/locales/zh-TW/menu.js b/src/locales/zh-TW/menu.js index 86daa5c..6a4e899 100644 --- a/src/locales/zh-TW/menu.js +++ b/src/locales/zh-TW/menu.js @@ -6,6 +6,8 @@ export default { 'menu.dashboard.workplace': '工作台', 'menu.desk': '工作台', 'menu.desk.notice': '通知公告', + 'menu.base': '基礎配置', + 'menu.base.region': '行政區劃', 'menu.system': '系統管理', 'menu.system.user': '用戶管理', 'menu.system.dept': '部門管理', diff --git a/src/pages/Base/Region/Region.js b/src/pages/Base/Region/Region.js new file mode 100644 index 0000000..da0a2b8 --- /dev/null +++ b/src/pages/Base/Region/Region.js @@ -0,0 +1,399 @@ +import React, { PureComponent } from 'react'; +import { + Button, + Card, + Col, + Form, + Input, + InputNumber, + Row, + Tree, + Cascader, + Radio, + message, + Modal, +} from 'antd'; +import Panel from '../../../components/Panel'; +import styles from '@/layouts/Sword.less'; +import { getLazyTree, detail, submit, remove } from '../../../services/region'; +import { getButton, hasButton } from '../../../utils/authority'; +import Func from '../../../utils/Func'; + +const FormItem = Form.Item; +const { TreeNode } = Tree; +const { TextArea } = Input; +const ButtonGroup = Button.Group; + +@Form.create() +class Region extends PureComponent { + state = { + topCode: '00', + treeData: [], + treeCascader: [], + debugVisible: false, + }; + + // ============ 初始化数据 =============== + componentWillMount() { + this.initTree(); + this.initCascader('00'); + } + + initTree = () => { + const { topCode } = this.state; + getLazyTree({ parentCode: topCode }).then(resp => { + if (resp.success) { + this.setState({ + treeData: resp.data.map(item => { + return { ...item, isLeaf: !item.hasChildren }; + }), + }); + } + }); + }; + + initCascader = code => { + getLazyTree({ parentCode: code }).then(resp => { + if (resp.success) { + this.setState({ + treeCascader: resp.data.map(item => { + return { + label: item.title, + value: item.value, + isLeaf: !item.hasChildren, + }; + }), + }); + } + }); + }; + + onSelect = checkedTreeKeys => { + const code = checkedTreeKeys[0]; + if (Func.isEmpty(code)) { + return; + } + detail({ code }).then(resp => { + if (resp.success) { + const { form } = this.props; + const { data } = resp; + form.setFieldsValue({ + parentCode: data.parentCode, + parentName: data.parentName, + code: data.code, + name: data.name, + level: data.level, + sort: data.sort, + remark: data.remark, + }); + } + }); + }; + + onLoadData = treeNode => + new Promise(resolve => { + if (treeNode.props.children) { + resolve(); + return; + } + getLazyTree({ parentCode: treeNode.props.id }).then(resp => { + if (resp.success) { + const { treeData } = this.state; + // eslint-disable-next-line no-param-reassign + treeNode.props.dataRef.children = resp.data.map(item => { + return { ...item, isLeaf: !item.hasChildren }; + }); + this.setState({ + treeData: [...treeData], + }); + } + resolve(); + }); + }); + + onCascaderChange = (value, selectedOptions) => { + window.console.log(value, selectedOptions); + }; + + onLoadCascaderData = selectedOptions => { + const targetOption = selectedOptions[selectedOptions.length - 1]; + targetOption.loading = true; + + getLazyTree({ parentCode: targetOption.value }).then(resp => { + if (resp.success) { + targetOption.loading = false; + targetOption.children = resp.data.map(item => { + return { + label: item.title, + value: item.value, + isLeaf: !item.hasChildren, + }; + }); + const { treeCascader } = this.state; + this.setState({ + treeCascader: [...treeCascader], + }); + } + }); + }; + + handleAdd = () => { + const { form } = this.props; + const region = form.getFieldsValue(); + if (!region.code || !region.name) { + message.warn('请先选择一项区划!'); + return; + } + form.setFieldsValue({ + parentCode: region.code, + parentName: region.name, + code: region.code, + name: '', + level: region.level < 5 ? region.level + 1 : region.level, + remark: region.remark, + }); + }; + + handleDelete = () => { + const { form } = this.props; + const code = form.getFieldValue('code'); + Modal.confirm({ + title: '删除确认', + content: '确定删除该条记录?', + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + remove({ id: code }).then(resp => { + if (resp.success) { + message.success(resp.msg); + form.resetFields(); + } else { + message.error(resp.msg || '删除失败'); + } + }); + }, + onCancel() {}, + }); + }; + + handleDebug = () => { + this.setState({ debugVisible: true }); + }; + + handleDebugCancel = () => { + this.setState({ debugVisible: false }); + }; + + handleSubmit = e => { + e.preventDefault(); + const { form } = this.props; + const { topCode } = this.state; + form.validateFieldsAndScroll((err, values) => { + if (err) return; + const parentCode = form.getFieldValue('parentCode'); + const code = form.getFieldValue('code'); + if (parentCode === code) { + message.warn('请输入正确的区划子编号!'); + return; + } + const params = { + ...values, + parentCode: parentCode === topCode ? '' : parentCode, + }; + submit(params).then(resp => { + if (resp.success) { + message.success(resp.msg); + form.resetFields(); + } else { + message.error(resp.msg || '提交失败'); + } + }); + }); + }; + + handleReset = () => { + const { form } = this.props; + form.resetFields(); + }; + + renderTreeNodes = data => + data.map(item => { + if (item.children) { + return ( + + {this.renderTreeNodes(item.children)} + + ); + } + return ; + }); + + render() { + const { + form: { getFieldDecorator }, + } = this.props; + + const buttons = getButton('region'); + + const { + treeData, + treeCascader, + debugVisible, + } = this.state; + + const formItemLayout = { + labelCol: { + xs: { span: 24 }, + sm: { span: 5 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 12 }, + md: { span: 16 }, + }, + }; + + return ( + + + + + + {this.renderTreeNodes(treeData)} + + + + + + + + + {hasButton(buttons, 'region_add') ? ( + + ) : null} + {hasButton(buttons, 'region_delete') ? ( + + ) : null} + {hasButton(buttons, 'region_debug') ? ( + + ) : null} + + + + + + + + + + + + +

+ + {getFieldDecorator('parentCode', { + rules: [ + { + required: true, + message: '请输入父区划编号', + }, + ], + })()} + + + {getFieldDecorator('parentName', { + rules: [ + { + required: true, + message: '请输入父区划名称', + }, + ], + })()} + + + {getFieldDecorator('code', { + rules: [ + { + required: true, + message: '请输入区划编号', + }, + ], + })()} + + + {getFieldDecorator('name', { + rules: [ + { + required: true, + message: '请输入区划名称', + }, + ], + })()} + + + {getFieldDecorator('level', { + rules: [ + { + required: true, + message: '请输入区划等级', + }, + ], + })( + + 国家 + 省份/直辖市 + 地市 + 区县 + 乡镇 + 村委 + + )} + + + {getFieldDecorator('sort', { + rules: [ + { + required: true, + message: '请输入区划排序', + }, + ], + })()} + + + {getFieldDecorator('remark', {})(