소스 검색

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

傅行帆 5 년 전
부모
커밋
65dc968728

+ 1
- 1
config/defaultSettings.js 파일 보기

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

BIN
src/assets/login-bg.png 파일 보기


+ 43
- 8
src/components/GlobalHeader/AvatarDropdown.jsx 파일 보기

@@ -5,12 +5,20 @@ import { connect } from 'dva';
5 5
 import router from 'umi/router';
6 6
 import HeaderDropdown from '../HeaderDropdown';
7 7
 import styles from './index.less';
8
+import ShowPassword from './ShowPassword'
8 9
 
9 10
 class AvatarDropdown extends React.Component {
11
+
12
+  constructor(props) {
13
+    super()
14
+    this.state = { visible: false }
15
+  }
16
+
10 17
   onMenuClick = event => {
11 18
     const { key } = event;
12 19
 
13 20
     if (key === 'logout') {
21
+      console.log(this.props)
14 22
       const { dispatch } = this.props;
15 23
 
16 24
       if (dispatch) {
@@ -22,9 +30,30 @@ class AvatarDropdown extends React.Component {
22 30
       return;
23 31
     }
24 32
 
33
+    if (key === 'updatePassword') {
34
+      this.setState({ visible: true })
35
+      return;
36
+    }
37
+
25 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 57
   render() {
29 58
     const {
30 59
       currentUser = {
@@ -48,20 +77,26 @@ class AvatarDropdown extends React.Component {
48 77
           </Menu.Item>
49 78
         )}
50 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 84
         <Menu.Item key="logout">
53 85
           <Icon type="logout" />
54 86
           <FormattedMessage id="menu.account.logout" defaultMessage="logout" />
55 87
         </Menu.Item>
56 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 101
       <Spin
67 102
         size="small"

+ 0
- 38
src/components/GlobalHeader/RightContent.jsx 파일 보기

@@ -17,45 +17,7 @@ const GlobalHeaderRight = props => {
17 17
 
18 18
   return (
19 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 20
       <Avatar />
58
-      {/* <SelectLang className={styles.action} /> */}
59 21
     </div>
60 22
   );
61 23
 };

+ 19
- 25
src/layouts/BasicLayout.jsx 파일 보기

@@ -4,15 +4,17 @@
4 4
  * https://github.com/ant-design/ant-design-pro-layout
5 5
  */
6 6
 import ProLayout from '@ant-design/pro-layout';
7
-import React, { useEffect } from 'react';
7
+import React, { useState, useEffect } from 'react';
8 8
 import Link from 'umi/link';
9 9
 import { connect } from 'dva';
10
+import request from '../utils/request'
10 11
 import { formatMessage } from 'umi-plugin-react/locale';
11 12
 import Authorized from '@/utils/Authorized';
12 13
 import RightContent from '@/components/GlobalHeader/RightContent';
13 14
 import { isAntDesignPro } from '@/utils/utils';
14 15
 // import logo from '../assets/logo.svg';
15 16
 import logo from '../assets/logo.png';
17
+import apis from '../services/apis'
16 18
 
17 19
 /**
18 20
  * use Authorized check all menu item
@@ -24,29 +26,6 @@ const menuDataRender = menuList =>
24 26
   });
25 27
 
26 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 29
   return (
51 30
     <footer className="ant-pro-global-footer">
52 31
       <div className="ant-pro-global-footer-copyright">Copyright @ 营销云</div>
@@ -55,9 +34,21 @@ const footerRender = (_, defaultDom) => {
55 34
 };
56 35
 
57 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 49
   return (
59 50
     <Link to="/">
60
-      {logo}
51
+      <img src={logoInfo}/>
61 52
       {title}
62 53
     </Link>
63 54
   );
@@ -83,6 +74,9 @@ const BasicLayout = props => {
83 74
    * init variables
84 75
    */
85 76
 
77
+  
78
+
79
+
86 80
   const handleMenuCollapse = payload => {
87 81
     if (dispatch) {
88 82
       dispatch({

+ 2
- 1
src/locales/zh-CN/menu.js 파일 보기

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

+ 4
- 2
src/pages/UserManage/Editor/User.jsx 파일 보기

@@ -1,5 +1,5 @@
1 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 3
 import md5 from 'md5';
4 4
 import moment from 'moment';
5 5
 import router from 'umi/router';
@@ -178,6 +178,7 @@ export default props => {
178 178
       message.error('维护项目数量必须大于0')
179 179
       return
180 180
     }
181
+    
181 182
     setSubmitting(true)
182 183
     if (user && user.userId) {
183 184
       updateUser({ urlData: { id: user.userId }, data }).then((user) => {
@@ -204,5 +205,6 @@ export default props => {
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,6 +7,7 @@ import className from 'classnames';
7 7
 import Cell from '../../components/Cell';
8 8
 import Style from './style.less';
9 9
 import { fetch, apis } from '../../utils/request';
10
+import PasswordText from './passwordText';
10 11
 
11 12
 const { Meta } = Card;
12 13
 
@@ -51,6 +52,24 @@ export default (props) => {
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 73
   const CardBody = (cbProps) => {
55 74
     const handleSwitch = (on) => () => {
56 75
       if (!on) {
@@ -85,7 +104,9 @@ export default (props) => {
85 104
         <div>
86 105
           <ABCol header={'联系人'}>{cbProps.userName}</ABCol>
87 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 110
         </div>
90 111
       </>
91 112
     )
@@ -133,6 +154,7 @@ export default (props) => {
133 154
   }
134 155
 
135 156
   return (
157
+    <>
136 158
     <PageHeaderWrapper extra={<Button type="primary" icon="plus" onClick={createUser}>新建</Button>}>
137 159
       <div className={Style['flex-box']}>
138 160
         {
@@ -170,5 +192,7 @@ export default (props) => {
170 192
         onShowSizeChange={handleSizeChange}
171 193
       />
172 194
     </PageHeaderWrapper>
195
+    <PasswordText visibleData={visibleData} key="PasswordText" onSuccess={() => onModalChange()}/>
196
+    </>
173 197
   )
174 198
 }

+ 10
- 0
src/services/apis.js 파일 보기

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

+ 11
- 11
src/utils/request.js 파일 보기

@@ -35,10 +35,10 @@ const replaceURLParams = (url, params = {}) => {
35 35
 request.interceptors.request.use((url, options) => {
36 36
   const { urlData, headers = {}, logout = false, login = false, action, data, ...opts } = options
37 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 40
   if (login || logout) {
41
-    window.localStorage.removeItem('test-foobar')
41
+    window.localStorage.removeItem('test-foobar-center')
42 42
   }
43 43
 
44 44
   const authHeader = !login ? { Authorization: `Bearer ${token}` } : {}
@@ -71,7 +71,7 @@ request.interceptors.response.use(async (response, options) => {
71 71
       const errorText = codeMessage[response.status] || response.statusText;
72 72
       const { status, url } = response;
73 73
       notification.error({
74
-        message: `请求错误 ${status}: ${url}`,
74
+        message: `请登录系统 ${status}: ${url}`,
75 75
         description: errorText,
76 76
       });
77 77
       throw new Error(response.statusText);
@@ -85,22 +85,22 @@ request.interceptors.response.use(async (response, options) => {
85 85
       const { code, data, message } = await response.clone().json();
86 86
       if (code != 1000) {
87 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 93
         } else {
94 94
           notification.error({
95
-            message: `请求错误`,
96
-            description: message,
95
+            message: message,
96
+            // description: message,
97 97
           });
98 98
           throw new Error(message);
99 99
         }
100 100
       }
101 101
 
102 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 106
       return data;

+ 1
- 1
src/utils/upload.js 파일 보기

@@ -1,7 +1,7 @@
1 1
 import { fetch, apis } from './request';
2 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 6
 const uploadImage = fetch(apis.image.upload)
7 7