顾绍勇 5 år sedan
förälder
incheckning
3178813cfa

+ 24
- 0
config/routes.js Visa fil

@@ -39,6 +39,30 @@ export default [
39 39
             hideInMenu: true,
40 40
             component: './channel/edit',
41 41
           },
42
+          {
43
+            path: '/contact',
44
+            name: '联系人管理',
45
+            component: '../layouts/BlankLayout',
46
+            routes: [
47
+              {
48
+                path: '/contact/contact/list',
49
+                name: '联系人',
50
+                component: './contact/contact/list',
51
+              },
52
+              {
53
+                path: '/contact/contact/add',
54
+                name: '新增',
55
+                hideInMenu: true,
56
+                component: './contact/contact/add',
57
+              },
58
+              {
59
+                path: '/contact/contact/detail',
60
+                name: '详情',
61
+                hideInMenu: true,
62
+                component: './contact/contact/detail',
63
+              },
64
+            ],
65
+          },
42 66
           {
43 67
             path: '/sample',
44 68
             name: 'H5样例管理',

+ 205
- 0
src/pages/contact/contact/add.jsx Visa fil

@@ -0,0 +1,205 @@
1
+import React, { useState, useEffect } from 'react';
2
+import { Input, Modal, Menu, Dropdown, Button, Icon, message, Table, Divider, Tag, Select, Form, Alert } from 'antd';
3
+import { FormattedMessage } from 'umi-plugin-react/locale';
4
+import XForm, { FieldTypes } from '../../../components/XForm';
5
+import router from 'umi/router';
6
+import apis from '../../../services/apis';
7
+import request from '../../../utils/request';
8
+import moment from 'moment';
9
+
10
+
11
+
12
+const header = props => {
13
+
14
+    const [data, setData] = useState({})
15
+
16
+    const [datas, setDatas] = useState([])//表格数据
17
+    const [visible, setVisible] = useState()
18
+    const [formsdate, setFormsDate] = useState({})
19
+    //   const [page, changePage] = useState({})
20
+    useEffect(() => {
21
+
22
+        setVisible(false)
23
+
24
+    }, [])
25
+    const ModalData = props => {
26
+
27
+        const data = [];
28
+        return (
29
+            <>
30
+                <div>
31
+                </div>
32
+            </>
33
+        )
34
+    }
35
+
36
+    const onSelectBusiness = (e) => {
37
+        console.log('11111')
38
+
39
+    }
40
+
41
+    const fields = [
42
+        {
43
+            label: '姓名',
44
+            name: 'contactName',
45
+            type: FieldTypes.Text,
46
+            value: data.contactName,
47
+            rules: [
48
+                { required: true, message: '请输入通知标题' },
49
+                { max: 6, message: '通知标题名称不超过6个字符' }
50
+            ]
51
+        },
52
+        {
53
+            label: '性别',
54
+            name: 'sex',
55
+            type: FieldTypes.Select,
56
+            value: data.sex,
57
+            dict: [{
58
+                name: '男',
59
+                value: '1',
60
+            },
61
+            {
62
+                name: '女',
63
+                value: '2',
64
+            }],
65
+            rules: [
66
+                { required: false, message: '请选择性别' }
67
+            ]
68
+        },
69
+        {
70
+            label: '头像',
71
+            name: 'avatar',
72
+            type: FieldTypes.ImageUploader,
73
+            value: data.avatar,
74
+            rules: [
75
+                { required: false, message: '请选择头像' },
76
+            ],
77
+            help: '建议尺寸:Npx*Npx,比例:1:1,格式:jpg,大小:不超过300KB,用于客户查看',
78
+        },
79
+        {
80
+            label: '对外头衔',
81
+            name: 'appellation',
82
+            type: FieldTypes.Text,
83
+            value: data.appellation,
84
+            rules: [
85
+                { required: false, message: '请输入对外头衔' },
86
+                { max: 20, message: '对外头衔不能超过20个字符' }
87
+            ]
88
+        },
89
+        {
90
+            label: '固话',
91
+            name: 'telephone',
92
+            type: FieldTypes.Text,
93
+            value: data.telephone,
94
+            rules: [
95
+                { required: false, message: '请输入固话' },
96
+                { max: 20, message: '固话内容不能超过20个字符' }
97
+            ]
98
+        },
99
+        {
100
+            label: '手机号',
101
+            name: 'phone',
102
+            type: FieldTypes.Text,
103
+            value: data.phone,
104
+            rules: [
105
+                { required: true, message: '请输入手机号' },
106
+                // { max: 20, message: '' }
107
+            ]
108
+        },
109
+        {
110
+            label: '微信号',
111
+            name: 'wxCardImg',
112
+            type: FieldTypes.ImageUploader,
113
+            value: data.wxCardImg,
114
+            rules: [
115
+                { required: false, message: '请上传微信号' },
116
+            ],
117
+            help: '联系人的微信二维码名片,请到手机端微信-我-顶部微信号中保存后上传',
118
+        },
119
+        {
120
+            label: '邮箱',
121
+            name: 'mail',
122
+            type: FieldTypes.Text,
123
+            value: data.mail,
124
+            rules: [
125
+                { required: false, message: '请输入邮箱' },
126
+                { max: 20, message: '邮箱不能超过20个字符' }
127
+            ]
128
+        },
129
+        {
130
+            label: '联系地址*',
131
+            name: 'address',
132
+            type: FieldTypes.Text,
133
+            value: data.address,
134
+            rules: [
135
+                { required: false, message: '请输入联系地址' },
136
+                { max: 40, message: '邮箱不能超过40个字符' }
137
+            ]
138
+        },
139
+        {
140
+            label: '内部岗位*',
141
+            name: 'job',
142
+            type: FieldTypes.Text,
143
+            value: data.job,
144
+            rules: [
145
+                { required: false, message: '请输入内部岗位' },
146
+                { max: 20, message: '内部岗位不能超过20个字符' }
147
+            ]
148
+        },
149
+        {
150
+            label: '权重',
151
+            name: 'orderNo',
152
+            type: FieldTypes.Number,
153
+            value: data.orderNo,
154
+
155
+            help: '用于列表排序,越大越靠前'
156
+        },
157
+    ]
158
+
159
+    const handleSubmit = (values) => {
160
+        console.log | ("开始提交 联系人")
161
+        let submitValues = values;
162
+        props.form.validateFields((err, values) => {
163
+            console.log(values)
164
+            if (!err) {
165
+                request({ ...apis.contact.taContactAdd, data: { ...submitValues }, }).then((data) => {
166
+                    //   message.info("保存成功,请上传房源")
167
+                    router.push({
168
+                        pathname: '/contact/contact/list',
169
+                        query: {
170
+                            //   salesBatchId: data.salesBatchId,
171
+                            //   buildingId: data.buildingId,
172
+                        },
173
+                    });
174
+                }).catch((err) => {
175
+                    message.info(err.msg || err.message)
176
+                })
177
+            }
178
+        });
179
+    }
180
+    //model
181
+    const handleShowModel = val => {
182
+        setVisible(true);
183
+    }
184
+
185
+    const handleCancel = val => {
186
+        setVisible(false);
187
+    }
188
+
189
+    const cancelPage = () => {
190
+        router.push({
191
+            pathname: '/contact/pathname',
192
+        });
193
+    }
194
+
195
+    return (
196
+        <>
197
+            <div>
198
+                <XForm onSubmit={handleSubmit} onCancel={cancelPage} fields={fields}></XForm>
199
+            </div>
200
+        </>
201
+    )
202
+}
203
+
204
+const WrappedNormalLoginForm = Form.create({ name: 'header' })(header);
205
+export default WrappedNormalLoginForm

+ 211
- 0
src/pages/contact/contact/detail.jsx Visa fil

@@ -0,0 +1,211 @@
1
+import React, { useState, useEffect } from 'react';
2
+import { Input, Modal, Menu, Dropdown, Button, Icon, message, Table, Divider, Tag, Select, Form, Alert } from 'antd';
3
+import { FormattedMessage } from 'umi-plugin-react/locale';
4
+import XForm, { FieldTypes } from '../../../components/XForm';
5
+import router from 'umi/router';
6
+import apis from '../../../services/apis';
7
+import request from '../../../utils/request';
8
+import moment from 'moment';
9
+
10
+
11
+
12
+const header = props => {
13
+    const [data, setData] = useState({})
14
+    const contactId = props.location.query.id
15
+    if (contactId) {
16
+        useEffect(() => {
17
+            getData(contactId);
18
+        }, [])
19
+
20
+        // 查询列表
21
+        const getData = (contactId) => {
22
+            request({
23
+                ...apis.contact.taContactGet,
24
+                urlData: { id: contactId }
25
+            }).then((data) => {
26
+                setData(data)
27
+            }).catch((err) => {
28
+                message.error(err.msg || err.message)
29
+            })
30
+        }
31
+    }
32
+
33
+    const [datas, setDatas] = useState([])//表格数据
34
+    const [visible, setVisible] = useState()
35
+    const [formsdate, setFormsDate] = useState({})
36
+    //   const [page, changePage] = useState({})
37
+    useEffect(() => {
38
+
39
+        setVisible(false)
40
+
41
+    }, [])
42
+    const ModalData = props => {
43
+
44
+        const data = [];
45
+        return (
46
+            <>
47
+                <div>
48
+                </div>
49
+            </>
50
+        )
51
+    }
52
+
53
+    const onSelectBusiness = (e) => {
54
+        console.log('11111')
55
+
56
+    }
57
+
58
+    const fields = [
59
+        {
60
+            label: '姓名',
61
+            name: 'contactName',
62
+            type: FieldTypes.Text,
63
+            value: data.contactName,
64
+            rules: [
65
+                { required: true, message: '请输入通知标题' },
66
+                { max: 6, message: '通知标题名称不超过6个字符' }
67
+            ]
68
+        },
69
+        {
70
+            label: '性别',
71
+            name: 'sex',
72
+            type: FieldTypes.Select,
73
+            value: data.sex === 1 ? '男' : '女',
74
+            dict: [{
75
+                name: '男',
76
+                value: '1',
77
+            },
78
+            {
79
+                name: '女',
80
+                value: '2',
81
+            }],
82
+            rules: [
83
+                { required: false, message: '请选择性别' }
84
+            ]
85
+        },
86
+        {
87
+            label: '头像',
88
+            name: 'avatar',
89
+            type: FieldTypes.ImageUploader,
90
+            value: data.avatar,
91
+            rules: [
92
+                { required: false, message: '请选择头像' },
93
+            ],
94
+            help: '建议尺寸:Npx*Npx,比例:1:1,格式:jpg,大小:不超过300KB,用于客户查看',
95
+        },
96
+        {
97
+            label: '对外头衔',
98
+            name: 'appellation',
99
+            type: FieldTypes.Text,
100
+            value: data.appellation,
101
+            rules: [
102
+                { required: false, message: '请输入对外头衔' },
103
+                { max: 20, message: '对外头衔不能超过20个字符' }
104
+            ]
105
+        },
106
+        {
107
+            label: '固话',
108
+            name: 'telephone',
109
+            type: FieldTypes.Text,
110
+            value: data.telephone,
111
+            rules: [
112
+                { required: false, message: '请输入固话' },
113
+                { max: 20, message: '固话内容不能超过20个字符' }
114
+            ]
115
+        },
116
+        {
117
+            label: '手机号',
118
+            name: 'phone',
119
+            type: FieldTypes.Text,
120
+            value: data.phone,
121
+            rules: [
122
+                { required: true, message: '请输入手机号' },
123
+                // { max: 20, message: '' }
124
+            ]
125
+        },
126
+        {
127
+            label: '微信号',
128
+            name: 'wxCardImg',
129
+            type: FieldTypes.ImageUploader,
130
+            value: data.wxCardImg,
131
+            rules: [
132
+                { required: false, message: '请上传微信号' },
133
+            ],
134
+            help: '联系人的微信二维码名片,请到手机端微信-我-顶部微信号中保存后上传',
135
+        },
136
+        {
137
+            label: '邮箱',
138
+            name: 'mail',
139
+            type: FieldTypes.Text,
140
+            value: data.mail,
141
+            rules: [
142
+                { required: false, message: '请输入邮箱' },
143
+                { max: 20, message: '邮箱不能超过20个字符' }
144
+            ]
145
+        },
146
+        {
147
+            label: '联系地址*',
148
+            name: 'address',
149
+            type: FieldTypes.Text,
150
+            value: data.address,
151
+            rules: [
152
+                { required: false, message: '请输入联系地址' },
153
+                { max: 40, message: '邮箱不能超过40个字符' }
154
+            ]
155
+        },
156
+        {
157
+            label: '内部岗位*',
158
+            name: 'job',
159
+            type: FieldTypes.Text,
160
+            value: data.job,
161
+            rules: [
162
+                { required: false, message: '请输入内部岗位' },
163
+                { max: 20, message: '内部岗位不能超过20个字符' }
164
+            ]
165
+        },
166
+        {
167
+            label: '权重',
168
+            name: 'orderNo',
169
+            type: FieldTypes.Number,
170
+            value: data.orderNo,
171
+
172
+            help: '用于列表排序,越大越靠前'
173
+        },
174
+    ]
175
+
176
+    const handleSubmit = (values) => {
177
+        if (contactId) {
178
+            values.contactId = contactId
179
+            request({ ...apis.contact.taContactUpdate, urlData: { id: contactId }, data: { ...values } }).then((data) => {
180
+                cancelPage();
181
+            }).catch((err) => {
182
+                message.error(err.msg || err.message)
183
+            })
184
+        }
185
+    }
186
+    //model
187
+    const handleShowModel = val => {
188
+        setVisible(true);
189
+    }
190
+
191
+    const handleCancel = val => {
192
+        setVisible(false);
193
+    }
194
+
195
+    const cancelPage = () => {
196
+        router.push({
197
+            pathname: '/contact/contact/list',
198
+        });
199
+    }
200
+
201
+    return (
202
+        <>
203
+            <div>
204
+                <XForm onSubmit={handleSubmit} onCancel={cancelPage} fields={fields}></XForm>
205
+            </div>
206
+        </>
207
+    )
208
+}
209
+
210
+const WrappedNormalLoginForm = Form.create({ name: 'header' })(header);
211
+export default WrappedNormalLoginForm

+ 220
- 0
src/pages/contact/contact/list.jsx Visa fil

@@ -0,0 +1,220 @@
1
+import React, { useState, useEffect } from 'react';
2
+import { PageHeaderWrapper } from '@ant-design/pro-layout';
3
+import { Form, Input, Button, Icon, Select, message, Table, Divider, Tag, Pagination, Modal, Breadcrumb } from 'antd';
4
+import router from 'umi/router';
5
+import moment from 'moment';
6
+import styles from './style.less';
7
+import { fetch, apis } from '../../../utils/request';
8
+import request from '../../../utils/request';
9
+import AuthButton from '@/components/AuthButton';
10
+
11
+function header(props) {
12
+
13
+    const [data, setData] = useState([])
14
+    const [contactList, setContactList] = useState([])
15
+
16
+    useEffect(() => {
17
+        getList({ pageNum: 1, pageSize: 10 });
18
+    }, [])
19
+    // 查询列表
20
+    const getList = params => {
21
+        request({ ...apis.contact.listContactByCondition, params: { ...params } }).then(data => {
22
+            console.log(data)
23
+            setData(data)
24
+        })
25
+    }
26
+
27
+    const toAdd = (id) => () => {
28
+        router.push({
29
+            pathname: '/contact/contact/add',
30
+            //   query: {
31
+            //     id
32
+            //   },
33
+        });
34
+    }
35
+
36
+    const toEdit = (id) => () => {
37
+        router.push({
38
+            pathname: '/contact/contact/detail',
39
+            query: {
40
+                id
41
+            },
42
+        });
43
+    }
44
+
45
+    const handleSubmit = (e, props) => {
46
+        console.log(e)
47
+        e.preventDefault();
48
+        props.form.validateFields((err, values) => {
49
+            if (!err) {
50
+                getList({ pageNum: 1, pageSize: 10, ...values })
51
+            }
52
+        });
53
+    }
54
+
55
+    function handleReset() {
56
+        props.form.resetFields();
57
+        getList({ pageNum: 1, pageSize: 10 });
58
+    }
59
+
60
+    const toDel = rowData => () => {
61
+        if (contactList.length < 1) {
62
+            openNotificationWithIcon('error', '请先选择需要删除的联系人')
63
+            return
64
+        }
65
+
66
+        Modal.confirm({
67
+            title: '确定联系人信息吗',
68
+            okText: '确定',
69
+            cancelText: '取消',
70
+            onOk() {
71
+                request({ ...apis.contact.batchDeleteContact, data: contactList, }).then((data) => {
72
+                    message.info("操作成功")
73
+                    getList({ pageNum: 1, pageSize: 10 });
74
+                }).catch((err) => {
75
+                    
76
+                })
77
+            },
78
+        });
79
+    }
80
+
81
+    const rowSelection = {
82
+        onChange: (selectedRowKeys, selectedRows) => {
83
+            console.log('selectedRowKeys:', selectedRowKeys, 'selectedRows: ', selectedRows);
84
+            setContactList(selectedRows)
85
+        },
86
+    };
87
+
88
+    const changePageNum = pageNumber => {
89
+        getList({ pageNum: pageNumber, pageSize: 10, ...props.form.getFieldsValue() })
90
+    }
91
+
92
+    const columns = [
93
+        {
94
+            title: '姓名',
95
+            dataIndex: 'contactName',
96
+            key: 'contactName',
97
+            align: 'center',
98
+
99
+        },
100
+        {
101
+            title: '性别',
102
+            dataIndex: 'sex',
103
+            key: 'sex',
104
+            align: 'center',
105
+            render: (sex) => <span>{sex === 1 ? '男' : '女'}</span>,
106
+        },
107
+        {
108
+            title: '头像',
109
+            dataIndex: 'avatar',
110
+            key: 'avatar',
111
+            align: 'center',
112
+            render: (text, record) => <img src={record.avatar} className={styles.touxiang} />,
113
+        },
114
+        {
115
+            title: '固话',
116
+            dataIndex: 'telephone',
117
+            key: 'telephone',
118
+            align: 'center',
119
+        },
120
+        {
121
+            title: '手机号',
122
+            dataIndex: 'phone',
123
+            key: 'phone',
124
+            align: 'center',
125
+        },
126
+        {
127
+            title: '内部岗位',
128
+            dataIndex: 'job',
129
+            key: 'job',
130
+            align: 'center',
131
+
132
+        },
133
+        {
134
+            title: '权重',
135
+            dataIndex: 'orderNo',
136
+            key: 'orderNo',
137
+            align: 'center',
138
+        },
139
+        {
140
+            title: '操作',
141
+            dataIndex: 'handle',
142
+            key: 'handle',
143
+            align: 'center',
144
+            render: (x, row) => (
145
+                <>
146
+                    <span style={{ color: '#FF925C', cursor: 'pointer' }} onClick={toEdit(row.contactId)}>
147
+                        编辑<Icon type="form" className={styles.edit} />
148
+                    </span>
149
+                </>
150
+            ),
151
+        },
152
+    ];
153
+
154
+    const { getFieldDecorator } = props.form
155
+    return (
156
+
157
+        <>
158
+            <div>
159
+                <Form layout="inline" onSubmit={e => handleSubmit(e, props)}>
160
+                    <Form.Item>
161
+                        {getFieldDecorator('contactName')(
162
+                            <Input
163
+                                prefix={<Icon type="text" style={{ color: 'rgba(0,0,0,.25)' }} />}
164
+                                placeholder="姓名"
165
+                            />,
166
+                        )}
167
+                    </Form.Item>
168
+                    <Form.Item>
169
+                        {getFieldDecorator('telephone')(
170
+                            <Input style={{ width: '180px' }} placeholder="固话">
171
+
172
+                            </Input>,
173
+                        )}
174
+                    </Form.Item>
175
+
176
+                    <Form.Item>
177
+                        {getFieldDecorator('phone')(
178
+                            <Input
179
+                                prefix={<Icon type="text" style={{ color: 'rgba(0,0,0,.25)' }} />}
180
+                                placeholder="手机号"
181
+                            />,
182
+                        )}
183
+                    </Form.Item>
184
+                    <Form.Item>
185
+                        {getFieldDecorator('job')(
186
+                            <Input
187
+                                prefix={<Icon type="text" style={{ color: 'rgba(0,0,0,.25)' }} />}
188
+                                placeholder="内部岗位"
189
+                            />,
190
+                        )}
191
+                    </Form.Item>
192
+                    <Form.Item>
193
+
194
+                        <Button type="primary" htmlType="submit" className={styles.searchBtn}>
195
+                            搜索
196
+              </Button>
197
+                        {/*  */}
198
+                        <Button style={{ marginLeft: 8 }} onClick={handleReset}>
199
+                            重置
200
+            </Button>
201
+                    </Form.Item>
202
+                </Form>
203
+
204
+                <Button type="danger" className={styles.addBtn} onClick={toAdd()}>新增</Button>
205
+
206
+                <Button type="primary" className={styles.addBtn} onClick={toDel()} style={{ marginLeft: '30px' }} >删除</Button>
207
+
208
+                <Table rowSelection={rowSelection} rowKey="goodsList" dataSource={data.records} columns={columns} pagination={false} />
209
+
210
+                <div style={{ display: 'flex', justifyContent: 'flex-end', marginTop: '30px' }}>
211
+                    {<Pagination showQuickJumper defaultCurrent={1} total={data.total} onChange={e => changePageNum(e)} current={data.current} />}
212
+                </div>
213
+            </div>
214
+        </>
215
+    )
216
+}
217
+
218
+const WrappedHeader = Form.create({ name: 'header' })(header);
219
+
220
+export default WrappedHeader

+ 48
- 0
src/pages/contact/contact/style.less Visa fil

@@ -0,0 +1,48 @@
1
+.addBtn {
2
+    padding: 0 40px;
3
+    height: 36px;
4
+    margin: 30px 0;
5
+  }
6
+  
7
+  .touxiang {
8
+    width: 93px;
9
+    height: 93px;
10
+  }
11
+  
12
+  .imgPerfect {
13
+    width: 120px;
14
+    height: 40px;
15
+  }
16
+  
17
+  .imgIndex {
18
+    width: 150px;
19
+    height: 92.7px;
20
+  }
21
+  
22
+  .imgSmall {
23
+    width: 128px;
24
+    height: 192px;
25
+  }
26
+  
27
+  .propaganda {
28
+    width: 240px;
29
+    height: 60px;
30
+  }
31
+  
32
+  .ant-table-column-title {
33
+    font-weight: 600;
34
+  }
35
+  
36
+  .shoppingCart {
37
+    // color: #dcdcdc;
38
+    color: #bebebe;
39
+    margin-left: 6px;
40
+    font-size: 16px;
41
+  }
42
+  
43
+  .edit {
44
+    // color: #dcdcdc;
45
+    color: #bebebe;
46
+    margin-left: 6px;
47
+    font-size: 15px;
48
+  }

+ 27
- 1
src/services/apis.js Visa fil

@@ -76,7 +76,33 @@ const apis = {
76 76
       action: 'center',
77 77
     },
78 78
   },
79
-  
79
+  contact:{
80
+    listContactByCondition: {
81
+      url: `${prefix}/listContactByCondition`,
82
+      method: 'GET',
83
+      action: 'center',
84
+    },
85
+    taContactAdd: {
86
+      url: `${prefix}/taContact`,
87
+      method: 'POST',
88
+      action: 'center',
89
+    },
90
+    batchDeleteContact: {
91
+      url: `${prefix}/taContact/batchDelete`,
92
+      method: 'PUT',
93
+      action: 'center',
94
+    },
95
+    taContactGet: {
96
+      url: `${prefix}/taContact/:id`,
97
+      method: 'GET',
98
+      action: 'center',
99
+    },
100
+    taContactUpdate: {
101
+      url: `${prefix}/taContact/:id`,
102
+      method: 'PUT',
103
+      action: 'center',
104
+    },
105
+  }
80 106
   
81 107
 }
82 108