Ver código fonte

Merge branch 'master' of http://git.ycjcjy.com/marketing/pc-admin

baozhangchao 3 anos atrás
pai
commit
a73a536283

+ 1
- 1
config/defaultSettings.js Ver arquivo

@@ -12,7 +12,7 @@ export default {
12 12
   menu: {
13 13
     locale: false,
14 14
   },
15
-  title: '新 联 ',
15
+  title: '新 联 ',
16 16
   pwa: false,
17 17
   iconfontUrl: '',
18 18
 };

+ 46
- 0
src/components/DragableUploadImageList/Item.jsx Ver arquivo

@@ -0,0 +1,46 @@
1
+import React from 'react'
2
+import { Icon } from 'antd'
3
+
4
+export default (props) => {
5
+    const { dataset = {}, onPreview, onDelete, onClick, onSticky } = props
6
+    const { url } = dataset
7
+
8
+    const handlePreview = () => {
9
+        onPreview && onPreview(dataset)
10
+    }
11
+
12
+    const handleDelete = () => {
13
+        onDelete && onDelete(dataset)
14
+    }
15
+
16
+    const handleClick = () => {
17
+        return onClick ? onClick(dataset) : null
18
+    }
19
+
20
+    const handleSticky = () => {
21
+        onSticky && onSticky(dataset)
22
+    }
23
+
24
+    return (
25
+        <div className="ant-upload-list-picture-card-container">
26
+            <span>
27
+                <div className="ant-upload-list-item ant-upload-list-item-done ant-upload-list-item-list-type-picture-card">
28
+                    <div className="ant-upload-list-item-info">
29
+                        <span>
30
+                            <a className="ant-upload-list-item-thumbnail" href={url} target="_blank" rel="noopener noreferrer" onClick={handleClick}>
31
+                                <img className="ant-upload-list-item-image" src={url} alt="image" />
32
+                            </a>
33
+                        </span>
34
+                    </div>
35
+
36
+                    <span className="ant-upload-list-item-actions">
37
+                        <Icon type="vertical-align-top" className="anticon anticon-eye-o" onClick={handleSticky} />
38
+                        <Icon type="eye" className="anticon anticon-eye-o" onClick={handlePreview} />
39
+                        <Icon type="delete" onClick={handleDelete} />
40
+                    </span>
41
+                </div>
42
+            </span>
43
+        </div>
44
+    )
45
+}
46
+

+ 121
- 0
src/components/DragableUploadImageList/index.jsx Ver arquivo

@@ -0,0 +1,121 @@
1
+import React from 'react';
2
+import { Upload, Icon, Modal } from 'antd';
3
+import './style.less';
4
+import { uploaderProps } from '../../utils/upload';
5
+import Item from './Item'
6
+import { getImgURL } from '@/utils/image';
7
+/**
8
+ * unlimited  属性表示上传图片无限制
9
+ * 例子: <ImageListUpload unlimited/>
10
+ */
11
+class ImageListUpload extends React.Component {
12
+  state = {
13
+    previewVisible: false,
14
+    previewImage: '',
15
+    loadding: false,
16
+  };
17
+
18
+  getFileList = () => {
19
+    return (this.props.value || []).map((img, inx) => ({ uid: inx, url: getImgURL(img), status: 'done' }))
20
+  }
21
+
22
+  handleCancel = () => this.setState({ previewVisible: false });
23
+
24
+  handlePreview = async file => {
25
+    this.setState({
26
+      previewImage: file.url ,
27
+      previewVisible: true,
28
+    });
29
+  };
30
+
31
+  handleSticky = ({ url }) => {
32
+    const fileList = this.props.value || [];
33
+    this.props.onChange([url].concat(fileList.filter(x => x != url)))
34
+  }
35
+
36
+  handleDelete = ({ url }) => {
37
+    const fileList = this.props.value || [];
38
+    this.props.onChange(fileList.filter(x => x != url))
39
+  }
40
+
41
+  handleChange = (e) => {
42
+    if (e.file.status === "uploading") {
43
+      this.setState({ loading: true });
44
+      return;
45
+    }
46
+
47
+    const fileList = (this.props.value || []).filter(x => getImgURL(x) != e.file.url);
48
+    this.props.onChange(fileList);
49
+
50
+    // console.log('删除图片触发了', e.file)
51
+    // if (e.file.state === 'removed') {
52
+    //   const fileList = (this.props.value || []).filter(x => x != e.file.url);
53
+    //   this.props.onChange(fileList);
54
+    // }
55
+
56
+    // if (e.file.status === "done") {
57
+    //   this.setState({
58
+    //     loading: false,
59
+    //   })
60
+
61
+    //   if (e.file.response && e.file.response.url) {
62
+    //     if (typeof this.props.onChange === 'function') {
63
+    //       const fileList = this.getFileList()
64
+    //       this.props.onChange([...fileList || [], e.file.response.url]);
65
+    //     }
66
+    //   }
67
+    // }
68
+  };
69
+
70
+  handleUploadSucess = (url) => {
71
+    this.setState({ loading: false });
72
+    if (typeof this.props.onChange === 'function') {
73
+      const fileList = this.props.value || [];
74
+      this.props.onChange([...fileList, url]);
75
+    }
76
+  }
77
+
78
+  render() {
79
+    const { previewVisible, previewImage } = this.state;
80
+    const { multiple = false } = this.props;
81
+    const fileList = this.getFileList();
82
+
83
+    const uploadButton = (
84
+      <div>
85
+        <Icon style={{ fontSize: '2em', color: '#aaa' }} type={this.state.loading ? "loading" : "plus"}  />
86
+      </div>
87
+    );
88
+    return (
89
+      <div className="clearfix x-dargable-image-upload-list" style={{display:'flex'}}> 
90
+        <div className="ant-upload-list ant-upload-list-picture-card" style={{display:'flex'}}>
91
+            {fileList.map(img => <Item key={img.url} dataset={img} onPreview={this.handlePreview} onSticky={this.handleSticky} onDelete={this.handleDelete}/>)}
92
+        </div>
93
+          {/*  */}
94
+        <Upload
95
+          listType="picture-card"
96
+          showUploadList={false}
97
+          multiple={multiple}
98
+          onPreview={this.handlePreview}
99
+          onChange={this.handleChange}
100
+          { ...uploaderProps }
101
+          onSuccess={this.handleUploadSucess}
102
+        >
103
+         {/* listType="picture-card"
104
+          multiple={true}
105
+          fileList={fileList}
106
+          onPreview={this.handlePreview}
107
+          onChange={this.handleChange}
108
+          { ...uploaderProps }
109
+          onSuccess={this.handleUploadSucess} */}
110
+          {/* unlimited 表示上传无限制数量 */}
111
+          {(this.props.unlimited && uploadButton) || ((fileList || images).length >= 8 ? null : uploadButton)}
112
+        </Upload>
113
+        <Modal visible={previewVisible} footer={null} onCancel={this.handleCancel}>
114
+          <img alt="example" style={{ width: '100%' }} src={getImgURL(previewImage)} />
115
+        </Modal>
116
+      </div>
117
+    );
118
+  }
119
+}
120
+
121
+export default ImageListUpload;

+ 23
- 0
src/components/DragableUploadImageList/style.less Ver arquivo

@@ -0,0 +1,23 @@
1
+:global {
2
+  .x-dargable-image-upload-list {
3
+    display: flex;
4
+  }
5
+
6
+  
7
+  .x-dargable-image-upload-list  .ant-upload-picture-card-wrapper {
8
+    width: auto !important;
9
+  }
10
+
11
+}
12
+
13
+
14
+/* you can make up upload button and sample style by using stylesheets */
15
+.ant-upload-select-picture-card i {
16
+  font-size: 32px;
17
+  color: #999;
18
+}
19
+
20
+.ant-upload-select-picture-card .ant-upload-text {
21
+  margin-top: 8px;
22
+  color: #666;
23
+}

+ 1
- 1
src/components/Poster/Preview.jsx Ver arquivo

@@ -24,7 +24,7 @@ export default (props) => {
24 24
       <Row gutter={24} style={{padding: '2em'}}>
25 25
         <Col span={6}><Avatar size={78} src={avatar} /></Col>
26 26
         <Col span={10}>
27
-          <Title level={4}>新联</Title>
27
+          <Title level={4}>新联</Title>
28 28
           <div>长按识别看房</div>
29 29
         </Col>
30 30
         <Col span={8}><img src={qrCode} alt="" style={qrStyle} /></Col>

+ 10
- 4
src/components/SelectButton/AreaSelect.jsx Ver arquivo

@@ -17,8 +17,14 @@ const CitySelect = (props) => {
17 17
 
18 18
   useEffect(() => {
19 19
     getCityAreaList();
20
-    getValue();
21
-  },[cityId])
20
+    // getValue();
21
+  },[cityId,props.value])
22
+
23
+  // useEffect(() => {
24
+   
25
+  //   getValue();
26
+  // },[props.value,cityId])
27
+
22 28
 
23 29
   const getCityAreaList = (e) => {
24 30
     request({
@@ -38,7 +44,7 @@ const CitySelect = (props) => {
38 44
     if (props.value) {
39 45
       const tempData = data.filter(f => f.id == props.value)
40 46
       const va = (tempData.length > 0) ? props.value : undefined
41
-      props.onChange(va)
47
+      // props.onChange(va)
42 48
     }
43 49
   }
44 50
 
@@ -60,7 +66,7 @@ const CitySelect = (props) => {
60 66
       }
61 67
       >
62 68
           {data.map(city => (
63
-            <Option key={city.id} value={city.name}>{city.name}</Option>
69
+            <Option key={city.id} value={`${city.id}`}>{city.name}</Option>
64 70
           ))}
65 71
       </Select>
66 72
   )

+ 1
- 1
src/components/TableList/index.jsx Ver arquivo

@@ -12,7 +12,7 @@ export default React.forwardRef((props, ref) => {
12 12
   const [pageTotal, setPageTotal] = useState(0);
13 13
 
14 14
   const { api, urlData, params, onPageChange, postData=()=>{}, page, ...tableProps } = props;
15
-  const [pageConfig, setPageConfig] = useState({ current: 1, pageSize: !page ? 500 : 10, ...(page || {}) });
15
+  const [pageConfig, setPageConfig] = useState({ current: 1, pageSize: page ? 500 : 10, ...(page || {}) });
16 16
 
17 17
   // 更新分页
18 18
   const updatePage = useCallback(

+ 20
- 19
src/components/XForm/ImageListUpload.jsx Ver arquivo

@@ -11,7 +11,7 @@ class ImageListUpload extends React.Component {
11 11
   state = {
12 12
     previewVisible: false,
13 13
     previewImage: '',
14
-    loadding: false,
14
+    loading: false,
15 15
   };
16 16
 
17 17
   getFileList = () => {
@@ -32,28 +32,29 @@ class ImageListUpload extends React.Component {
32 32
       this.setState({ loading: true });
33 33
       return;
34 34
     }
35
-
36
-    const fileList = (this.props.value || []).filter(x => x != e.file.url);
37
-    this.props.onChange(fileList);
35
+console.log(e,'handleChange')
36
+    // const fileList = (this.props.value || []).filter(x => x != e.file.url);
37
+    // this.props.onChange(fileList);
38 38
 
39 39
     // console.log('删除图片触发了', e.file)
40
-    // if (e.file.state === 'removed') {
41
-    //   const fileList = (this.props.value || []).filter(x => x != e.file.url);
42
-    //   this.props.onChange(fileList);
43
-    // }
40
+    if (e.file.status === 'removed') {
41
+      console.log(e,'handleChange22')
42
+      const fileList = (this.props.value || []).filter(x => getImgURL(x) != e.file.url);
43
+      this.props.onChange(fileList);
44
+    }
44 45
 
45
-    // if (e.file.status === "done") {
46
-    //   this.setState({
47
-    //     loading: false,
48
-    //   })
46
+    if (e.file.status === "done") {
47
+      this.setState({
48
+        loading: false,
49
+      })
49 50
 
50
-    //   if (e.file.response && e.file.response.url) {
51
-    //     if (typeof this.props.onChange === 'function') {
52
-    //       const fileList = this.getFileList()
53
-    //       this.props.onChange([...fileList || [], e.file.response.url]);
54
-    //     }
55
-    //   }
56
-    // }
51
+      if (e.file.response && e.file.response.url) {
52
+        if (typeof this.props.onChange === 'function') {
53
+          const fileList = this.getFileList()
54
+          this.props.onChange([...fileList || [], e.file.response.url]);
55
+        }
56
+      }
57
+    }
57 58
   };
58 59
 
59 60
   handleUploadSucess = (url) => {

+ 2
- 2
src/layouts/UserLayout.jsx Ver arquivo

@@ -42,7 +42,7 @@ const UserLayout = (props) => {
42 42
           <SelectLang />
43 43
         </div> */}
44 44
         <div className={styles.content}>
45
-          <div className={styles.top}>
45
+          {/* <div className={styles.top}>
46 46
             <div className={styles.header}>
47 47
               <Link to="/">
48 48
                 <img alt="logo" className={styles.logo} src={logo} />
@@ -50,7 +50,7 @@ const UserLayout = (props) => {
50 50
               </Link>
51 51
             </div>
52 52
             <div className={styles.desc}>Ant Design 是西湖区最具影响力的 Web 设计规范</div>
53
-          </div>
53
+          </div> */}
54 54
           {children}
55 55
         </div>
56 56
         <GlobalFooter />

+ 15
- 4
src/pages/building/Edit/AlbumList/List.jsx Ver arquivo

@@ -5,18 +5,29 @@ import ImageListUpload from '@/components/XForm/ImageListUpload';
5 5
 const { Panel } = Collapse;
6 6
 
7 7
 const ImageList = props => {
8
-  const { data } = props;
8
+  const { data,updateImg } = props;
9 9
   const [imageList, setImageList] = useState([]);
10 10
 
11 11
   function getImgUrl() {
12 12
     return (data.buildingImgList || []).map(item => item.url);
13 13
   }
14 14
 
15
+  function onImageChange(e) {
16
+    setImageList(e)
17
+    console.log(e,'onImageChange')
18
+       
19
+    // 新增加图片后,更新后端数据
20
+    const img = e.map((item, index) => ({ imgType: 'aparment', url: item, orderNo: index }))
21
+    updateImg({ ...data, img }).then(res=>{
22
+
23
+    })
24
+  }
25
+
15 26
   useEffect(() => {
16 27
     setImageList(getImgUrl());
17 28
   }, [data]);
18 29
 
19
-  return <ImageListUpload value={imageList} onChange={e => console.log(e, 'onChange')} unlimited />;
30
+  return <ImageListUpload value={imageList} disabled onChange={onImageChange} unlimited={false} />;
20 31
 };
21 32
 
22 33
 export default props => {
@@ -24,7 +35,7 @@ export default props => {
24 35
 
25 36
   const Extra = item => (
26 37
     <>
27
-      <Button type="link" size="small" onClick={props.onRename}>
38
+      <Button type="link" size="small" onClick={(e)=>{e.stopPropagation(),props.onRename(item)}}>
28 39
         重命名
29 40
       </Button>
30 41
       {/* <Popconfirm title="Are you sure delete this task?" onConfirm={props.onDelete}> */}
@@ -45,7 +56,7 @@ export default props => {
45 56
       {dataList.map((row, index) => {
46 57
         return (
47 58
           <Panel header={row.apartmentName} key={index} extra={Extra(row)}>
48
-            <ImageList data={row}></ImageList>
59
+            <ImageList data={row} updateImg={props.updateImg}></ImageList>
49 60
           </Panel>
50 61
         );
51 62
       })}

+ 88
- 21
src/pages/building/Edit/AlbumList/index.jsx Ver arquivo

@@ -1,8 +1,9 @@
1 1
 import React, { useState, useEffect, useRef } from 'react';
2
-import { Button, Modal,message } from 'antd';
2
+import { Button, Modal, message, Input } from 'antd';
3 3
 import request, { apis } from '@/utils/request';
4 4
 import Form from './Form';
5 5
 import List from './List';
6
+import ModalForm from '../components/ModalForm';
6 7
 
7 8
 export default props => {
8 9
   const [visible, setVisible] = useState(false);
@@ -11,7 +12,10 @@ export default props => {
11 12
   const { id } = query;
12 13
 
13 14
   const [loading, setLoading] = useState(false);
15
+  const [reNameData, setReNameData] = useState({ visible: false, data: {} });
14 16
   const [list, setList] = useState([]);
17
+  const [value, setValue] = useState('');
18
+  const [confirmLoading, setConfirmLoading] = useState(false);
15 19
   const albumRef = useRef();
16 20
 
17 21
   const getList = () => {
@@ -49,46 +53,85 @@ export default props => {
49 53
       onOk: () => {
50 54
         request({ ...apis.building.buildingApartmentDelete, urlData: { id: record.apartmentId } })
51 55
           .then(() => {
52
-            console.log('删除成功')
56
+            console.log('删除成功');
53 57
             message.success('删除成功');
54 58
             getList();
55 59
           })
56 60
           .catch(err => {
57
-            console.log('删除失败')
61
+            console.log('删除失败');
58 62
           });
59 63
       },
60 64
     });
61 65
   }
62 66
 
63
-  // const handleDelete = record => {
64
-  //   const urlData = { id: record.apartmentId };
65
-
66
-  //   setLoading(true);
67
-  //   deleteData({ urlData })
68
-  //     .then(() => {
69
-  //       getList();
70
-  //       message.success('删除成功');
71
-  //       setLoading(false);
72
-  //     })
73
-  //     .catch(err => {
74
-  //       console.error(err.message || err);
75
-  //       setLoading(false);
76
-  //     });
77
-  // };
67
+  const updateApartment = data => {
68
+  // const values= {}
69
+
70
+    // setLoading(true);
71
+
72
+    return request({
73
+      ...apis.building.buildingApartmentUpdate,
74
+      // urlData: { id: data.apartmentId },
75
+      data
76
+
77
+    })
78
+    //   .then(() => {
79
+    //     console.log('删除成功');
80
+    //     message.success('删除成功');
81
+    //     getList();
82
+    //   })
83
+    //   .catch(err => {
84
+    //     console.log('删除失败');
85
+    //   });
86
+    // deleteData({ urlData })
87
+    //   .then(() => {
88
+    //     getList();
89
+    //     message.success('删除成功');
90
+    //     setLoading(false);
91
+    //   })
92
+    //   .catch(err => {
93
+    //     console.error(err.message || err);
94
+    //     setLoading(false);
95
+    //   });
96
+  };
78 97
 
79 98
   const handleSuccess = () => {
80 99
     getList();
81 100
     setVisible(false);
82 101
   };
83 102
 
84
-  const onRename = () => {
85
-    getList();
86
-    setVisible(false);
103
+  const onRename = record => {
104
+    // getList();
105
+    setValue(record.apartmentName);
106
+    setReNameData({ visible: true, data: record });
87 107
   };
88 108
 
89 109
   useEffect(() => {
90 110
     getList();
91 111
   }, [id]);
112
+
113
+  const handleOk = () => {
114
+    // getList();
115
+    const { data } = reNameData;
116
+    setConfirmLoading(true);
117
+    const values={}
118
+    // // values.buildingId=data.buildingId
119
+    // values.apartmentType = 'photo'
120
+    // values.apartmentName = value
121
+    // values.img = data.img.map((item, index) => ({ imgType: 'aparment', url: item, orderNo: index }))
122
+    values.img = data.buildingImgList
123
+    values.apartmentId=data.apartmentId
124
+    values.buildingId = data.buildingId;
125
+    values.apartmentName = value
126
+    values.apartmentType = 'photo'
127
+    console.log(values,'values')
128
+    updateApartment({ ...values }).then(res => {
129
+      setReNameData({ visible: false, data: {} });
130
+      setConfirmLoading(false);
131
+      getList()
132
+    });
133
+  };
134
+
92 135
   return (
93 136
     <div>
94 137
       <div>
@@ -108,7 +151,31 @@ export default props => {
108 151
         onEdit={handleEdit}
109 152
         onRename={onRename}
110 153
         onDelete={handleDelete}
154
+        updateImg={updateApartment}
111 155
       />
156
+      <Modal
157
+        title="相册名称"
158
+        visible={reNameData.visible}
159
+        onCancel={() => {
160
+          setReNameData({ visible: false });
161
+        }}
162
+        // onOk={this.handleOk}
163
+        // confirmLoading={confirmLoading}
164
+        // onCancel={this.handleCancel}
165
+        // footer={true}
166
+        destroyOnClose={true}
167
+        onOk={handleOk}
168
+        confirmLoading={confirmLoading}
169
+        // onSubmit={handleSubmit}
170
+      >
171
+        <Input
172
+          value={value}
173
+          onChange={e => {
174
+            setValue(e.target.value);
175
+            // reNameData.data.apartmentName = e.target.value;
176
+          }}
177
+        ></Input>
178
+      </Modal>
112 179
     </div>
113 180
   );
114 181
 };

+ 4
- 2
src/pages/building/Edit/Basic/index.jsx Ver arquivo

@@ -28,6 +28,7 @@ const BuildingBasic = React.forwardRef((props, ref) => {
28 28
   const { query } = history.location;
29 29
   const { id } = query;
30 30
 
31
+  const [cityId,setCityId] = useState()
31 32
   const [ loading, setLoading ] = useState({ form: false, arround: false })
32 33
   const [brands] = useBrands()
33 34
   const [
@@ -50,6 +51,7 @@ const BuildingBasic = React.forwardRef((props, ref) => {
50 51
     initArrounds(res)
51 52
     initForm(form, res)
52 53
     setMarketingCode(res.marketingCode)
54
+    setCityId(res.cityId)
53 55
   })
54 56
   
55 57
   // 视频文件上传前 回调
@@ -233,13 +235,13 @@ const BuildingBasic = React.forwardRef((props, ref) => {
233 235
             {getFieldDecorator('cityId', {
234 236
               rules: [{ required: true, message: '请选择城市' }],
235 237
             })(
236
-              <SelectCity style={fullWidth} />,
238
+              <SelectCity style={fullWidth} onChange={e=>{setCityId(e)}} />,
237 239
             )}
238 240
           </Form.Item>
239 241
           <Form.Item label="楼盘区域" {...gourpItemLayout.ab.b } >
240 242
             {getFieldDecorator('buildingArea', {
241 243
               rules: [{ required: true, message: '请输入楼盘区域' }],
242
-            })(<AreaSelect style={fullWidth} />)}
244
+            })(<AreaSelect cityId={cityId} style={fullWidth} />)}
243 245
           </Form.Item>
244 246
         </FormGroupItem>
245 247
         <Form.Item label="项目地址" >

+ 22
- 1
src/pages/building/Edit/OnSiteService.jsx Ver arquivo

@@ -42,7 +42,28 @@ export default props => {
42 42
   // const getList=()=>{
43 43
   //   getMarketing
44 44
   // }
45
-  const handleCancel = row => {};
45
+  const handleCancel = row => {
46
+    request({
47
+      ...apis.building.deleteMarketing,
48
+      urlData:{id:row.id},
49
+      // params: { id },
50
+    })
51
+      .then(res => {
52
+        notification.error({
53
+          message: '成功取消绑定',
54
+          description: '',
55
+        });
56
+        getList()
57
+      })
58
+      .catch(err => {
59
+       
60
+        notification.error({
61
+          message: err.message,
62
+          description: '',
63
+        });
64
+      });
65
+
66
+  };
46 67
 
47 68
   const columns = [
48 69
     {

+ 2
- 2
src/pages/building/Edit/components/ModalForm/index.jsx Ver arquivo

@@ -5,7 +5,7 @@ import { formItemLayout } from '../../utils'
5 5
 const noop = () => undefined
6 6
 
7 7
 export default (props) => {
8
-  const { title, visible, onCancel = noop, modalProps = {}, children, ...leftProps } = props
8
+  const { title, visible, onCancel = noop, modalProps = {}, children, footer=null,...leftProps } = props
9 9
 
10 10
   return (
11 11
     <Modal
@@ -13,7 +13,7 @@ export default (props) => {
13 13
       width={800}
14 14
       visible={visible}
15 15
       onCancel={onCancel}
16
-      footer={null}
16
+      footer={footer}
17 17
       {...modalProps}
18 18
     >
19 19
       <Form {...formItemLayout} {...leftProps} >

+ 2
- 1
src/pages/building/List/tableColumns.js Ver arquivo

@@ -4,6 +4,7 @@ import moment from 'moment'
4 4
 import OperButton from '@/components/OperButton'
5 5
 import AuthButton from '@/components/AuthButton'
6 6
 import withActions from '@/components/ActionList'
7
+import { getImgURL } from '@/utils/image'
7 8
 
8 9
 export default ({page, onPublish, onDelete}) => [
9 10
   {
@@ -19,7 +20,7 @@ export default ({page, onPublish, onDelete}) => [
19 20
     align: 'center',
20 21
     render: (_, row) => {
21 22
       if (row.buildingListImg && row.buildingListImg[0]) {
22
-        return <img src={row.buildingListImg[0].url} width={128} height={72} style={{borderRadius: '4px'}} alt="" />
23
+        return <img src={getImgURL(row.buildingListImg[0].url)} width={128} height={72} style={{borderRadius: '4px'}} alt="" />
23 24
       }
24 25
       return null
25 26
     }

+ 57
- 97
src/pages/user/login/index.jsx Ver arquivo

@@ -1,112 +1,72 @@
1
-import { Alert, Icon } from 'antd';
2
-import { FormattedMessage, formatMessage } from 'umi-plugin-react/locale';
3
-import React, { Component } from 'react';
1
+import React, { useState } from 'react';
4 2
 import { connect } from 'dva';
5 3
 import md5 from "md5";
6
-import LoginComponents from './components/Login';
4
+import { Form, Input, Button } from 'antd'
7 5
 import styles from './style.less';
8
-import { defineLocale } from 'moment';
9 6
 
10
-const { UserName, Password, Submit } = LoginComponents;
7
+const buttonItemLayout = {
8
+  wrapperCol: { span: 14, offset: 4 },
9
+}
11 10
 
12
-@connect(({ login, loading }) => ({
13
-  userLogin: login,
14
-  submitting: loading.effects['login/login'],
15
-}))
16
-class Login extends Component {
17
-  loginForm = undefined;
11
+const formItemLayout = {
12
+  labelCol: { span: 6 },
13
+  wrapperCol: { span: 18 },
14
+}
18 15
 
19
-  handleSubmit = (err, values) => {
20
-    if (!err) {
21
-      const { dispatch } = this.props;
22
-      try {
23
-        dispatch({
24
-          type: 'login/login',
25
-          payload: { ...values, loginPassword: md5(values.loginPassword) },
26
-        });
27
-      } catch (e) {
28
-        console.error(e)
29
-      }
30
-    }
16
+const LoginForm = React.forwardRef((props, ref) => {
17
+  const { form, dispatch } = props;
18
+  const { getFieldDecorator, validateFields } = form;
31 19
 
32
-  };
20
+  const [loading, setLoading] = useState(false)
33 21
 
34
-  renderMessage = (content) => (
35
-    <Alert
36
-      style={{
37
-        marginBottom: 24,
38
-      }}
39
-      message={content}
40
-      type="error"
41
-      showIcon
42
-    />
43
-  );
22
+  const handleSubmit = (e) => {
23
+    e.preventDefault();
24
+    validateFields((err, values) => {
25
+      if (!err) {
26
+        try {
27
+          setLoading(true)
28
+          dispatch({
29
+            type: 'login/login',
30
+            payload: { ...values, loginPassword: md5(values.loginPassword) },
31
+          }).then(() => {
32
+            setLoading(false)
33
+          });
34
+        } catch (e) {
35
+          console.error(e)
36
+          setLoading(false)
37
+        }
38
+      }
39
+    });
40
+  }
44 41
 
45
-  render() {
46
-    const { userLogin = {}, submitting } = this.props;
47
-    const { status } = userLogin;
48
-    // const { type, autoLogin } = this.state;
49
-    return (
50
-      <div className={styles.main}>
51
-        <LoginComponents
52
-          onTabChange={this.onTabChange}
53
-          onSubmit={this.handleSubmit}
54
-          onCreate={(form) => {
55
-            this.loginForm = form;
56
-          }}
57
-          >
58
-          {status === 'error' &&
59
-            !submitting &&
60
-            this.renderMessage(
61
-              formatMessage({
62
-                id: 'user-login.login.message-invalid-credentials',
63
-              }),
64
-            )}
65
-          <UserName
66
-            name="loginName"
67
-            placeholder={`${formatMessage({
68
-              id: 'user-login.login.userName',
69
-            })}: admin or user`}
70
-            rules={[
71
-              {
72
-                required: true,
73
-                message: formatMessage({
74
-                  id: 'user-login.userName.required',
75
-                }),
76
-              },
77
-            ]}
78
-          />
79
-          <Password
80
-            name="loginPassword"
81
-            placeholder={`${formatMessage({
82
-              id: 'user-login.login.password',
83
-            })}: ant.design`}
84
-            rules={[
85
-              {
86
-                required: true,
87
-                message: formatMessage({
88
-                  id: 'user-login.password.required',
89
-                }),
90
-              },
91
-            ]}
92
-            onPressEnter={(e) => {
93
-              e.preventDefault();
42
+  return (
43
+    <div className={styles.main}>
44
+      <div></div>
45
+      <div>
46
+        <Form onSubmit={handleSubmit}>
47
+          <Form.Item label="用户名" {...formItemLayout} colon={false}>
48
+            {getFieldDecorator('loginName', {
49
+              rules: [{ required: true, message: '请输入用户名' }]
50
+            })(<Input />)}          
51
+          </Form.Item>
52
+          <Form.Item label="密 码" {...formItemLayout} colon={false}>
53
+            {getFieldDecorator('loginPassword', {
54
+              rules: [{ required: true, message: '请输入密码' }]
55
+            })(<Input.Password visibilityToggle={false}/>)}          
56
+          </Form.Item>
94 57
 
95
-              if (this.loginForm) {
96
-                this.loginForm.validateFields(this.handleSubmit);
97
-              }
98
-            }}
99
-          />
100
-          <Submit loading={submitting}>
101
-            <FormattedMessage id="user-login.login.login" />
102
-          </Submit>
103
-        </LoginComponents>
58
+          <Button
59
+            loading={loading}
60
+            htmlType="submit"
61
+            className={styles['login-form-button']}
62
+          >登录</Button>
63
+        </Form>
104 64
       </div>
105
-    );
106
-  }
107
-}
65
+    </div>
66
+  )
67
+});
108 68
 
109 69
 export default connect(({ login, loading }) => ({
110 70
   userLogin: login,
111 71
   submitting: loading.effects['login/login'],
112
-}))(Login);
72
+}))(Form.create({})(LoginForm));

+ 48
- 2
src/pages/user/login/style.less Ver arquivo

@@ -1,12 +1,23 @@
1 1
 @import '~antd/es/style/themes/default.less';
2 2
 
3 3
 .main {
4
-  width: 368px;
5
-  margin: 0 auto;
4
+  width: 840px;
5
+  margin: 20vh auto 0;
6
+  background: rgba(17, 40, 81, 0.41);
7
+  box-shadow: 0px 8px 38px 0px rgba(4, 0, 0, 0.12);
8
+  border-radius: 24px;
9
+  box-sizing: border-box;
10
+  padding: 87px 0 120px;
11
+  display: flex;
6 12
   @media screen and (max-width: @screen-sm) {
7 13
     width: 95%;
8 14
   }
9 15
 
16
+  & > div {
17
+    flex: none;
18
+    width: 50%;
19
+  }
20
+
10 21
   .icon {
11 22
     margin-left: 16px;
12 23
     color: rgba(0, 0, 0, 0.2);
@@ -30,7 +41,42 @@
30 41
     }
31 42
   }
32 43
 
44
+  .login-form-button {
45
+    width: 100%;
46
+    font-size: 18px;
47
+    line-height: 48px;
48
+    height: 48px !important;
49
+    color: #fff !important;
50
+    background: #1548B6 !important;
51
+    border-radius: 48px;
52
+    border: none !important;
53
+  }
54
+
33 55
   :global {
56
+    .ant-form {
57
+      width: 260px;
58
+      margin-left: 60px;
59
+    }
60
+
61
+    .ant-form-item {
62
+      border-bottom: 2px solid #fff;
63
+    }
64
+
65
+    .ant-form-item-label > label {
66
+      color: #fff;
67
+    }
68
+
69
+    .ant-input {
70
+      color: #fff;
71
+      border: none;
72
+      background: transparent;
73
+      outline: none;
74
+
75
+      &:focus {
76
+        box-shadow: none;
77
+      }
78
+    }
79
+
34 80
     .antd-pro-login-submit {
35 81
       width: 100%;
36 82
       margin-top: 24px;

+ 6
- 2
src/services/apis.js Ver arquivo

@@ -194,10 +194,14 @@ export default {
194 194
     getMarketing: {
195 195
       url: `${prefix}/building/marketing`,
196 196
       method: 'GET',
197
-      action: 'admin.building.marketing,get',
197
+      action: 'admin.building.marketing.get',
198
+    },
199
+    deleteMarketing: {
200
+      url: `${prefix}/marketing/:id`,
201
+      method: 'DELETE',
202
+      action: 'admin.marketing.id.delete',
198 203
     },
199 204
 
200
-    // GET /api/admin/trend/{id}
201 205
   },
202 206
   buildingType: {
203 207
     getList: {

+ 2
- 2
src/utils/request.js Ver arquivo

@@ -46,8 +46,8 @@ request.interceptors.request.use((url, options) => {
46 46
 
47 47
   return (
48 48
     {
49
-      // url: 'https://xlk.njyz.tech' + apiURL,
50
-      url: apiURL,
49
+      url: 'https://xlk.njyz.tech' + apiURL,
50
+      // url: apiURL,
51 51
       options: {
52 52
         ...opts,
53 53
         headers: {