baseConfig.jsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. import React from 'react'
  2. import { Button, Form, Row, Col, Input, InputNumber, Select, Icon, Menu, Dropdown, Divider, Upload, message } from 'antd'
  3. const FormItem = Form.Item
  4. const SelectOption = Select.Option
  5. const OptionGroup = Select.OptGroup
  6. const InputGroup = Input.Group
  7. const SubMenu = Menu.SubMenu
  8. const MenuItem = Menu.Item
  9. const MenuItemGroup = Menu.ItemGroup
  10. const UploadDragger = Upload.Dragger
  11. import { connect } from 'dva'
  12. import dataSource from '../../models/dataSource'
  13. const DataSourceBaseConfig = ({ dataSource, dispatch }) => {
  14. const formItemLayout = {
  15. labelCol: { span: 4 },
  16. wrapperCol: { span: 20 },
  17. };
  18. const dataSourceLinkMenu = (
  19. <Menu
  20. className='menu-datasource-link'
  21. onClick={() => {
  22. dispatch({ type: 'dataSource/setNewModelField', name: 'address', value: '1111adddd' });
  23. dispatch({ type: 'dataSource/setNewModelField', name: 'port', value: '1234' });
  24. dispatch({ type: 'dataSource/setNewModelField', name: 'dbType', value: {
  25. key: 'oracle',
  26. label: 'ORACLE'
  27. } });
  28. dispatch({ type: 'dataSource/setNewModelField', name: 'dbName', value: 'orcl' });
  29. dispatch({ type: 'dataSource/setNewModelField', name: 'userName', value: 'UAS' });
  30. dispatch({ type: 'dataSource/setNewModelField', name: 'password', value: 'select!#%*(' });
  31. }}
  32. >
  33. <MenuItem>1111</MenuItem>
  34. <MenuItem>2222</MenuItem>
  35. <MenuItem>33333</MenuItem>
  36. <MenuItem>44</MenuItem>
  37. </Menu>
  38. );
  39. return (
  40. <Form className='form-base' size='small'>
  41. <Divider orientation="left">基本配置</Divider>
  42. <FormItem label='数据源名称' {...formItemLayout}>
  43. <Input
  44. value={dataSource.newOne.name}
  45. onChange={(e) => { dispatch({ type: 'dataSource/setNewModelField', name: 'name', value: e.target.value }) }}>
  46. </Input>
  47. </FormItem>
  48. {
  49. dataSource.newOne.type=='file'?(
  50. <div>
  51. <Divider orientation="left">选择文件</Divider>
  52. <UploadDragger
  53. className='upload'
  54. name='file' // 上传到后台的文件名
  55. fileList={dataSource.newOne.fileList}
  56. accept='application/vnd.ms-excel,.csv' // 只支持excel和csv格式文件
  57. action='//jsonplaceholder.typicode.com/posts/'
  58. headers={{authorization: 'authorization-text'}}
  59. beforeUpload={(file, fileList) => {
  60. const trueType = file.type === 'application/vnd.ms-excel';
  61. if (!trueType) {
  62. message.error('选择文件格式错误!');
  63. }
  64. const trueSize = file.size / 1024 / 1024 < 30;
  65. if (!trueSize) {
  66. message.error('选择文件过大!');
  67. }
  68. return trueType && trueSize;
  69. }}
  70. onChange={(info) => {
  71. const file = info.file;
  72. let fileList = info.fileList;
  73. fileList = fileList.slice(-1); // 只保留最后一个
  74. if (info.file.status !== 'uploading') {
  75. console.log(file, info.fileList);
  76. const trueType = file.type === 'application/vnd.ms-excel';
  77. const trueSize = file.size / 1024 / 1024 < 30;
  78. if(!trueType || !trueSize) {
  79. fileList = [];
  80. }
  81. }
  82. if (file.status === 'done') {
  83. message.success(`${file.name} 文件上传成功`);
  84. } else if (file.status === 'error') {
  85. fileList = [];
  86. message.error(`${file.name} 文件上传失败.`);
  87. }
  88. dispatch({ type: 'dataSource/setNewModelField', name: 'fileList', value: fileList })
  89. }}
  90. >
  91. <p className="ant-upload-drag-icon">
  92. <Icon type="inbox" />
  93. </p>
  94. <p className="ant-upload-text">点击选择或拖动文件到该区域</p>
  95. <p className="ant-upload-hint">仅支持上传单个30MB以内EXCEL/CSV格式文件</p>
  96. </UploadDragger>
  97. </div>
  98. ):(
  99. <div>
  100. <Divider orientation="left">连接配置</Divider>
  101. <div className='links'>
  102. <Dropdown trigger={['click']} overlay={dataSourceLinkMenu}>
  103. <div>使用已存在的数据连接 <Icon type="down" /></div>
  104. </Dropdown>
  105. </div>
  106. <FormItem label='数据库类型' {...formItemLayout}>
  107. <Select
  108. value={dataSource.newOne.dbType}
  109. labelInValue={true}
  110. onChange={(value) => {
  111. dispatch({ type: 'dataSource/setNewModelField', name: 'dbType', value: value} );
  112. }}
  113. >
  114. <SelectOption value='oracle'>
  115. ORACLE
  116. </SelectOption>
  117. <SelectOption value='mysql'>
  118. MYSQL
  119. </SelectOption>
  120. <SelectOption value='sqlserver'>
  121. SQLSERVER
  122. </SelectOption>
  123. <SelectOption value='sqlite'>
  124. SQLITE
  125. </SelectOption>
  126. </Select>
  127. </FormItem>
  128. <Row>
  129. <Col span={19}>
  130. <FormItem label='数据库地址' {...{
  131. labelCol: { span: 5 },
  132. wrapperCol: { span: 19 }
  133. }}>
  134. <Input
  135. value={dataSource.newOne.address}
  136. onChange={(e) => {
  137. dispatch({ type: 'dataSource/setNewModelField', name: 'address', value: e.target.value });
  138. }}
  139. />
  140. </FormItem>
  141. </Col>
  142. <Col span={5}>
  143. <FormItem className='input-port' label='端口' {...{
  144. labelCol: { span: 12 },
  145. wrapperCol: { span: 12 }
  146. }}>
  147. <InputNumber
  148. value={dataSource.newOne.port}
  149. onChange={(value) => {
  150. dispatch({ type: 'dataSource/setNewModelField', name: 'port', value: value });
  151. }}
  152. />
  153. </FormItem>
  154. </Col>
  155. </Row>
  156. <FormItem label='数据库名' {...formItemLayout}>
  157. <Input
  158. value={dataSource.newOne.dbName}
  159. onChange={(e) => {
  160. dispatch({ type: 'dataSource/setNewModelField', name: 'dbName', value: e.target.value });
  161. }}
  162. />
  163. </FormItem>
  164. <Row>
  165. <Col span={12}>
  166. <FormItem label='用户名' {...{
  167. labelCol: { span: 8 },
  168. wrapperCol: { span: 16 }
  169. }}>
  170. <Input
  171. value={dataSource.newOne.userName}
  172. onChange={(e) => {
  173. dispatch({ type: 'dataSource/setNewModelField', name: 'userName', value: e.target.value });
  174. }}
  175. />
  176. </FormItem>
  177. </Col>
  178. <Col span={12}>
  179. <FormItem label='密码' {...{
  180. labelCol: { span: 8 },
  181. wrapperCol: { span: 16 }
  182. }}>
  183. <Input
  184. value={dataSource.newOne.password}
  185. onChange={(e) => {
  186. let value = e.target.value;
  187. dispatch({ type: 'dataSource/setNewModelField', name: 'password', value: value });
  188. e.target.removeAttribute('value')
  189. }}
  190. />
  191. </FormItem>
  192. </Col>
  193. </Row>
  194. <div className='buttons'>
  195. <Button size='small'>测试连接</Button>
  196. </div>
  197. </div>
  198. )
  199. }
  200. <Divider orientation="left">其他配置</Divider>
  201. <FormItem label='标签' {...formItemLayout}>
  202. <Select
  203. mode="tags"
  204. placeholder='多个标签使用逗号或空格分隔'
  205. tokenSeparators={[',', ' ']}
  206. value={dataSource.newOne.tags}
  207. dropdownStyle={{display: 'none'}}
  208. onChange={(value) => {
  209. dispatch({ type: 'dataSource/setNewModelField', name: 'tags', value: value });
  210. }}
  211. >
  212. </Select>
  213. </FormItem>
  214. <FormItem className='textarea-desc' label='说明' {...formItemLayout}>
  215. <Input.TextArea
  216. autosize={{ minRows: 2, maxRows: 5 }}
  217. value={dataSource.newOne.description}
  218. onChange={(e) => {
  219. dispatch({ type: 'dataSource/setNewModelField', name: 'description', value: e.target.value });
  220. }}
  221. />
  222. </FormItem>
  223. </Form>
  224. );
  225. }
  226. function mapStateToProps({ present: {dataSource} }) {
  227. return { dataSource }
  228. }
  229. export default connect(mapStateToProps)(DataSourceBaseConfig);