浏览代码

Merge branch 'dev' of http://git.ycjcjy.com/estateagents/pc-center into dev

傅行帆 5 年前
父节点
当前提交
65dc968728

+ 1
- 1
config/defaultSettings.js 查看文件

10
   menu: {
10
   menu: {
11
     locale: false,
11
     locale: false,
12
   },
12
   },
13
-  title: '营销云服务平台',
13
+  title: '渠道代理后台',
14
   pwa: false,
14
   pwa: false,
15
   iconfontUrl: '',
15
   iconfontUrl: '',
16
 };
16
 };

二进制
src/assets/login-bg.png 查看文件


+ 43
- 8
src/components/GlobalHeader/AvatarDropdown.jsx 查看文件

5
 import router from 'umi/router';
5
 import router from 'umi/router';
6
 import HeaderDropdown from '../HeaderDropdown';
6
 import HeaderDropdown from '../HeaderDropdown';
7
 import styles from './index.less';
7
 import styles from './index.less';
8
+import ShowPassword from './ShowPassword'
8
 
9
 
9
 class AvatarDropdown extends React.Component {
10
 class AvatarDropdown extends React.Component {
11
+
12
+  constructor(props) {
13
+    super()
14
+    this.state = { visible: false }
15
+  }
16
+
10
   onMenuClick = event => {
17
   onMenuClick = event => {
11
     const { key } = event;
18
     const { key } = event;
12
 
19
 
13
     if (key === 'logout') {
20
     if (key === 'logout') {
21
+      console.log(this.props)
14
       const { dispatch } = this.props;
22
       const { dispatch } = this.props;
15
 
23
 
16
       if (dispatch) {
24
       if (dispatch) {
22
       return;
30
       return;
23
     }
31
     }
24
 
32
 
33
+    if (key === 'updatePassword') {
34
+      this.setState({ visible: true })
35
+      return;
36
+    }
37
+
25
     router.push(`/account/${key}`);
38
     router.push(`/account/${key}`);
26
   };
39
   };
27
 
40
 
41
+  onCancel = (e) => {
42
+    this.setState({ visible: false })
43
+  }
44
+
45
+  onReset = (e) => {
46
+    const { dispatch } = this.props;
47
+
48
+      if (dispatch) {
49
+        dispatch({
50
+          type: 'login/logout',
51
+        });
52
+      }
53
+
54
+      return;
55
+  }
56
+  
28
   render() {
57
   render() {
29
     const {
58
     const {
30
       currentUser = {
59
       currentUser = {
48
           </Menu.Item>
77
           </Menu.Item>
49
         )}
78
         )}
50
         {menu && <Menu.Divider />}
79
         {menu && <Menu.Divider />}
51
-
80
+        <Menu.Item key="updatePassword">
81
+          <Icon type="key" />
82
+          <FormattedMessage id="menu.account.updatePassword" defaultMessage="updatePassword" />
83
+        </Menu.Item>   
52
         <Menu.Item key="logout">
84
         <Menu.Item key="logout">
53
           <Icon type="logout" />
85
           <Icon type="logout" />
54
           <FormattedMessage id="menu.account.logout" defaultMessage="logout" />
86
           <FormattedMessage id="menu.account.logout" defaultMessage="logout" />
55
         </Menu.Item>
87
         </Menu.Item>
56
       </Menu>
88
       </Menu>
57
     );
89
     );
58
-    return currentUser && currentUser.name ? (
59
-      <HeaderDropdown overlay={menuHeaderDropdown}>
60
-        <span className={`${styles.action} ${styles.account}`}>
61
-          <Avatar size="small" className={styles.avatar} src={currentUser.avatar} alt="avatar" />
62
-          <span className={styles.name}>{currentUser.name}</span>
63
-        </span>
64
-      </HeaderDropdown>
90
+    return currentUser && currentUser.userName ? (
91
+      <>
92
+        <HeaderDropdown overlay={menuHeaderDropdown}>
93
+          <span className={`${styles.action} ${styles.account}`}>
94
+            <Avatar size="small" className={styles.avatar} src={currentUser.channelImg} alt="avatar" />
95
+            <span className={styles.name}>{currentUser.userName}</span>
96
+          </span>
97
+        </HeaderDropdown>
98
+        <ShowPassword visible={this.state.visible} onCancel={(e) => this.onCancel(e)} onReset={(e => this.onReset(e))} />
99
+      </>  
65
     ) : (
100
     ) : (
66
       <Spin
101
       <Spin
67
         size="small"
102
         size="small"

+ 0
- 38
src/components/GlobalHeader/RightContent.jsx 查看文件

17
 
17
 
18
   return (
18
   return (
19
     <div className={className}>
19
     <div className={className}>
20
-      {/* <HeaderSearch
21
-        className={`${styles.action} ${styles.search}`}
22
-        placeholder={formatMessage({
23
-          id: 'component.globalHeader.search',
24
-        })}
25
-        dataSource={[
26
-          formatMessage({
27
-            id: 'component.globalHeader.search.example1',
28
-          }),
29
-          formatMessage({
30
-            id: 'component.globalHeader.search.example2',
31
-          }),
32
-          formatMessage({
33
-            id: 'component.globalHeader.search.example3',
34
-          }),
35
-        ]}
36
-        onSearch={value => {
37
-          console.log('input', value);
38
-        }}
39
-        onPressEnter={value => {
40
-          console.log('enter', value);
41
-        }}
42
-      />
43
-      <Tooltip
44
-        title={formatMessage({
45
-          id: 'component.globalHeader.help',
46
-        })}
47
-      >
48
-        <a
49
-          target="_blank"
50
-          href="https://pro.ant.design/docs/getting-started"
51
-          rel="noopener noreferrer"
52
-          className={styles.action}
53
-        >
54
-          <Icon type="question-circle-o" />
55
-        </a>
56
-      </Tooltip> */}
57
       <Avatar />
20
       <Avatar />
58
-      {/* <SelectLang className={styles.action} /> */}
59
     </div>
21
     </div>
60
   );
22
   );
61
 };
23
 };

+ 19
- 25
src/layouts/BasicLayout.jsx 查看文件

4
  * https://github.com/ant-design/ant-design-pro-layout
4
  * https://github.com/ant-design/ant-design-pro-layout
5
  */
5
  */
6
 import ProLayout from '@ant-design/pro-layout';
6
 import ProLayout from '@ant-design/pro-layout';
7
-import React, { useEffect } from 'react';
7
+import React, { useState, useEffect } from 'react';
8
 import Link from 'umi/link';
8
 import Link from 'umi/link';
9
 import { connect } from 'dva';
9
 import { connect } from 'dva';
10
+import request from '../utils/request'
10
 import { formatMessage } from 'umi-plugin-react/locale';
11
 import { formatMessage } from 'umi-plugin-react/locale';
11
 import Authorized from '@/utils/Authorized';
12
 import Authorized from '@/utils/Authorized';
12
 import RightContent from '@/components/GlobalHeader/RightContent';
13
 import RightContent from '@/components/GlobalHeader/RightContent';
13
 import { isAntDesignPro } from '@/utils/utils';
14
 import { isAntDesignPro } from '@/utils/utils';
14
 // import logo from '../assets/logo.svg';
15
 // import logo from '../assets/logo.svg';
15
 import logo from '../assets/logo.png';
16
 import logo from '../assets/logo.png';
17
+import apis from '../services/apis'
16
 
18
 
17
 /**
19
 /**
18
  * use Authorized check all menu item
20
  * use Authorized check all menu item
24
   });
26
   });
25
 
27
 
26
 const footerRender = (_, defaultDom) => {
28
 const footerRender = (_, defaultDom) => {
27
-  // if (!isAntDesignPro()) {
28
-  //   return defaultDom;
29
-  // }
30
-
31
-  // return (
32
-  //   <>
33
-  //     {defaultDom}
34
-  //     <div
35
-  //       style={{
36
-  //         padding: '0px 24px 24px',
37
-  //         textAlign: 'center',
38
-  //       }}
39
-  //     >
40
-  //       <a href="https://www.netlify.com" target="_blank" rel="noopener noreferrer">
41
-  //         <img
42
-  //           src="https://www.netlify.com/img/global/badges/netlify-color-bg.svg"
43
-  //           width="82px"
44
-  //           alt="netlify logo"
45
-  //         />
46
-  //       </a>
47
-  //     </div>
48
-  //   </>
49
-  // );
50
   return (
29
   return (
51
     <footer className="ant-pro-global-footer">
30
     <footer className="ant-pro-global-footer">
52
       <div className="ant-pro-global-footer-copyright">Copyright @ 营销云</div>
31
       <div className="ant-pro-global-footer-copyright">Copyright @ 营销云</div>
55
 };
34
 };
56
 
35
 
57
 const menuHeaderRender = (logo, title) => {
36
 const menuHeaderRender = (logo, title) => {
37
+  const [logoInfo, setLogoInfo] = useState([]);
38
+
39
+  useEffect(() => {
40
+    getLogoInfo();
41
+  })
42
+  
43
+  const getLogoInfo = e => {
44
+    request({ ...apis.image.logo }).then(data => {
45
+      setLogoInfo(data.channelImg)
46
+    })
47
+  }
48
+
58
   return (
49
   return (
59
     <Link to="/">
50
     <Link to="/">
60
-      {logo}
51
+      <img src={logoInfo}/>
61
       {title}
52
       {title}
62
     </Link>
53
     </Link>
63
   );
54
   );
83
    * init variables
74
    * init variables
84
    */
75
    */
85
 
76
 
77
+  
78
+
79
+
86
   const handleMenuCollapse = payload => {
80
   const handleMenuCollapse = payload => {
87
     if (dispatch) {
81
     if (dispatch) {
88
       dispatch({
82
       dispatch({

+ 2
- 1
src/locales/zh-CN/menu.js 查看文件

44
   'menu.account.trigger': '触发报错',
44
   'menu.account.trigger': '触发报错',
45
   'menu.account.logout': '退出登录',
45
   'menu.account.logout': '退出登录',
46
   'menu.editor': '图形编辑器',
46
   'menu.editor': '图形编辑器',
47
+  'menu.account.updatePassword': '修改密码',
47
   'menu.editor.flow': '流程编辑器',
48
   'menu.editor.flow': '流程编辑器',
48
   'menu.editor.mind': '脑图编辑器',
49
   'menu.editor.mind': '脑图编辑器',
49
-  'menu.editor.koni': '拓扑编辑器',
50
+  'menu.editor.koni': '拓扑编辑器', 
50
 };
51
 };

+ 4
- 2
src/pages/UserManage/Editor/User.jsx 查看文件

1
 import React, { useState, useEffect } from 'react';
1
 import React, { useState, useEffect } from 'react';
2
-import { Button, notification, Tree, message } from 'antd';
2
+import { Button, notification, Tree, message, Spin } from 'antd';
3
 import md5 from 'md5';
3
 import md5 from 'md5';
4
 import moment from 'moment';
4
 import moment from 'moment';
5
 import router from 'umi/router';
5
 import router from 'umi/router';
178
       message.error('维护项目数量必须大于0')
178
       message.error('维护项目数量必须大于0')
179
       return
179
       return
180
     }
180
     }
181
+    
181
     setSubmitting(true)
182
     setSubmitting(true)
182
     if (user && user.userId) {
183
     if (user && user.userId) {
183
       updateUser({ urlData: { id: user.userId }, data }).then((user) => {
184
       updateUser({ urlData: { id: user.userId }, data }).then((user) => {
204
     }
205
     }
205
   }
206
   }
206
 
207
 
207
-  return (<XForm onSubmit={handleSubmit} onCancel={handleCancel} fields={fields} submitting={submitting}></XForm>)
208
+  return (
209
+  <><Spin spinning={ submitting } size="large"><XForm onSubmit={handleSubmit} onCancel={handleCancel} fields={fields} submitting={submitting}></XForm></Spin></>)
208
 }
210
 }

+ 25
- 1
src/pages/UserManage/index.jsx 查看文件

7
 import Cell from '../../components/Cell';
7
 import Cell from '../../components/Cell';
8
 import Style from './style.less';
8
 import Style from './style.less';
9
 import { fetch, apis } from '../../utils/request';
9
 import { fetch, apis } from '../../utils/request';
10
+import PasswordText from './passwordText';
10
 
11
 
11
 const { Meta } = Card;
12
 const { Meta } = Card;
12
 
13
 
51
     }))
52
     }))
52
   }
53
   }
53
 
54
 
55
+  /**
56
+   *回调事件
57
+   *
58
+   */
59
+  function onModalChange() {
60
+    // getList()
61
+    // setVisibleData({ visible: false, userId: '', oldPassword:'', newPassword: '', confirmPassword: '' })
62
+  }
63
+
64
+  /**
65
+   *打开编辑页
66
+   *
67
+   * @param {*} record
68
+   */
69
+  const editPassword = (record) => () => {
70
+    setVisibleData({ visible: true, userId: record.userId, oldPasswod: '', newPassword: '', confirmPassword: '',submitting:submitting})
71
+  }
72
+
54
   const CardBody = (cbProps) => {
73
   const CardBody = (cbProps) => {
55
     const handleSwitch = (on) => () => {
74
     const handleSwitch = (on) => () => {
56
       if (!on) {
75
       if (!on) {
85
         <div>
104
         <div>
86
           <ABCol header={'联系人'}>{cbProps.userName}</ABCol>
105
           <ABCol header={'联系人'}>{cbProps.userName}</ABCol>
87
           <ABCol header={'手机号'}>{cbProps.phone}</ABCol>
106
           <ABCol header={'手机号'}>{cbProps.phone}</ABCol>
88
-          <ABCol header={'服务到期时间'}>{cbProps.expData ? moment(cbProps.expData).format('YYYY-MM-DD') : <Warn>未设置</Warn>}</ABCol>
107
+          <ABCol header={'服务到期时间'}>{cbProps.expireDate ? moment(cbProps.expireDate).format('YYYY-MM-DD') : <Warn>未设置</Warn>}</ABCol>
108
+          <ABCol header={'所有用户'}>{cbProps.userCount}</ABCol>
109
+          <ABCol header={'注册用户'}>{cbProps.registeredCount}</ABCol>
89
         </div>
110
         </div>
90
       </>
111
       </>
91
     )
112
     )
133
   }
154
   }
134
 
155
 
135
   return (
156
   return (
157
+    <>
136
     <PageHeaderWrapper extra={<Button type="primary" icon="plus" onClick={createUser}>新建</Button>}>
158
     <PageHeaderWrapper extra={<Button type="primary" icon="plus" onClick={createUser}>新建</Button>}>
137
       <div className={Style['flex-box']}>
159
       <div className={Style['flex-box']}>
138
         {
160
         {
170
         onShowSizeChange={handleSizeChange}
192
         onShowSizeChange={handleSizeChange}
171
       />
193
       />
172
     </PageHeaderWrapper>
194
     </PageHeaderWrapper>
195
+    <PasswordText visibleData={visibleData} key="PasswordText" onSuccess={() => onModalChange()}/>
196
+    </>
173
   )
197
   )
174
 }
198
 }

+ 10
- 0
src/services/apis.js 查看文件

19
       action: 'center',
19
       action: 'center',
20
       logout: true
20
       logout: true
21
     },
21
     },
22
+    changePassword: {
23
+      url: `${prefix}/changePassword`,
24
+      method: 'POST',
25
+      action: 'center'
26
+    }
22
   },
27
   },
23
   member: {
28
   member: {
24
     list: {
29
     list: {
90
       method: 'POST',
95
       method: 'POST',
91
       action: 'center',
96
       action: 'center',
92
     },
97
     },
98
+    logo: {
99
+      url: `${prefix}/logo`,
100
+      method: 'GET',
101
+      action: 'center',
102
+    },
93
   },
103
   },
94
   dict: {
104
   dict: {
95
     tplType: {
105
     tplType: {

+ 11
- 11
src/utils/request.js 查看文件

35
 request.interceptors.request.use((url, options) => {
35
 request.interceptors.request.use((url, options) => {
36
   const { urlData, headers = {}, logout = false, login = false, action, data, ...opts } = options
36
   const { urlData, headers = {}, logout = false, login = false, action, data, ...opts } = options
37
   const apiURL = urlData ? replaceURLParams(url, urlData) : url
37
   const apiURL = urlData ? replaceURLParams(url, urlData) : url
38
-  const token = mixStr(window.localStorage.getItem('test-foobar'))
38
+  const token = mixStr(window.localStorage.getItem('test-foobar-center'))
39
 
39
 
40
   if (login || logout) {
40
   if (login || logout) {
41
-    window.localStorage.removeItem('test-foobar')
41
+    window.localStorage.removeItem('test-foobar-center')
42
   }
42
   }
43
 
43
 
44
   const authHeader = !login ? { Authorization: `Bearer ${token}` } : {}
44
   const authHeader = !login ? { Authorization: `Bearer ${token}` } : {}
71
       const errorText = codeMessage[response.status] || response.statusText;
71
       const errorText = codeMessage[response.status] || response.statusText;
72
       const { status, url } = response;
72
       const { status, url } = response;
73
       notification.error({
73
       notification.error({
74
-        message: `请求错误 ${status}: ${url}`,
74
+        message: `请登录系统 ${status}: ${url}`,
75
         description: errorText,
75
         description: errorText,
76
       });
76
       });
77
       throw new Error(response.statusText);
77
       throw new Error(response.statusText);
85
       const { code, data, message } = await response.clone().json();
85
       const { code, data, message } = await response.clone().json();
86
       if (code != 1000) {
86
       if (code != 1000) {
87
         if (code === 1001) {
87
         if (code === 1001) {
88
-          notification.error({
89
-            message: `请求错误`,
90
-            description: '请登录系统',
91
-          });
92
-          throw new Error('请登录系统');
88
+          // notification.error({
89
+          //   message: `请登录系统`,
90
+          //   // description: '请登录系统',
91
+          // });
92
+          // throw new Error('请登录系统');
93
         } else {
93
         } else {
94
           notification.error({
94
           notification.error({
95
-            message: `请求错误`,
96
-            description: message,
95
+            message: message,
96
+            // description: message,
97
           });
97
           });
98
           throw new Error(message);
98
           throw new Error(message);
99
         }
99
         }
100
       }
100
       }
101
 
101
 
102
       if (data && data.token) {
102
       if (data && data.token) {
103
-        window.localStorage.setItem('test-foobar', mixStr(data.token))
103
+        window.localStorage.setItem('test-foobar-center', mixStr(data.token))
104
       }
104
       }
105
 
105
 
106
       return data;
106
       return data;

+ 1
- 1
src/utils/upload.js 查看文件

1
 import { fetch, apis } from './request';
1
 import { fetch, apis } from './request';
2
 import mixStr from './mixStr';
2
 import mixStr from './mixStr';
3
 
3
 
4
-const getToken = () => mixStr(window.localStorage.getItem('test-foobar'))
4
+const getToken = () => mixStr(window.localStorage.getItem('test-foobar-center'))
5
 
5
 
6
 const uploadImage = fetch(apis.image.upload)
6
 const uploadImage = fetch(apis.image.upload)
7
 
7