Преглед на файлове

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

张延森 преди 3 години
родител
ревизия
560937a76f

+ 1
- 0
package.json Целия файл

@@ -56,6 +56,7 @@
56 56
     "md5": "^2.3.0",
57 57
     "moment": "^2.24.0",
58 58
     "omit.js": "^1.0.2",
59
+    "package.json": "^2.0.1",
59 60
     "path-to-regexp": "2.4.0",
60 61
     "qs": "^6.9.0",
61 62
     "react": "^16.8.6",

+ 1
- 1
src/pages/building/Developers/tableColumns.js Целия файл

@@ -27,7 +27,7 @@ export default ({page,getBrandData, onEdit, onDelete}) => [
27 27
     dataIndex: 'brandImg',
28 28
     key: 'brandImg',
29 29
     align: 'center',
30
-    render:(_,record)=> <img src={getImgURL(record.brandImg)} style={{width:'165px',height:'104px'}}/>,
30
+    render:(_,record)=> <img src={getImgURL(record.brandImg)} style={{width:'165px',height:'104px',borderRadius:'5px'}}/>,
31 31
   },
32 32
   {
33 33
     title: '简介',

+ 0
- 0
src/pages/building/Edit/Basic.jsx Целия файл


+ 8
- 8
src/pages/home/Recommend/auditCopy.jsx Целия файл

@@ -33,14 +33,14 @@ function body(props) {
33 33
   function getById(currentId) {
34 34
     request({ ...apis.customer.recommendGetById, urlData: { id: currentId } }).then(res => {
35 35
       // res.reportDate = moment(res.reportDate)
36
-      if(res){
37
-        props.form.setFieldsValue({...res,reportDate:moment(res.reportDate)})
36
+      if (res) {
37
+        props.form.setFieldsValue({ ...res, reportDate: moment(res.reportDate) })
38 38
       }
39
-    
39
+
40 40
     })
41 41
   }
42 42
   //返回上一页
43
-  function backCom(){
43
+  function backCom() {
44 44
     window.history.back(-1)
45 45
   }
46 46
   return (
@@ -81,15 +81,15 @@ function body(props) {
81 81
         </Form.Item>
82 82
         <Form.Item label="客户备注"  >
83 83
           {getFieldDecorator('say')(
84
-            <TextArea  placeholder="客户描述" rows={7}
84
+            <TextArea placeholder="客户描述" rows={7}
85 85
             />,
86 86
           )}
87 87
         </Form.Item>
88 88
         <Form.Item label="回访备注" >
89
-          {getFieldDecorator('describe' ,{
90
-            rules:[{required:true}]//v3x必填
89
+          {getFieldDecorator('describe', {
90
+            rules: [{ required: true }]//v3x必填
91 91
           })(
92
-            <TextArea placeholder="回访备注" rows={7}  value={props}/>,
92
+            <TextArea placeholder="回访备注" rows={7} value={props} />,
93 93
           )}
94 94
         </Form.Item>
95 95
         <Form.Item style={{ display: 'flex', justifyContent: 'center' }}>

+ 95
- 101
src/pages/home/Recommend/index.jsx Целия файл

@@ -1,5 +1,5 @@
1
-import React, {PureComponent, useMemo, useState } from 'react';
2
-import {  Avatar, Button } from 'antd';
1
+import React, { PureComponent, useMemo, useState } from 'react';
2
+import { Avatar, Button } from 'antd';
3 3
 import moment from 'moment';
4 4
 import request from '../../../utils/request';
5 5
 import apis from '../../../services/apis';
@@ -26,7 +26,7 @@ import { backgroundColor } from 'echarts/lib/theme/dark';
26 26
 
27 27
 
28 28
 function Recommend() {
29
-  const [exportLoding,setExportLoding] = useState(false)
29
+  const [exportLoding, setExportLoding] = useState(false)
30 30
   //详情页面弹窗配置
31 31
   function toAudit(cuurentId) {
32 32
     router.push({
@@ -35,7 +35,7 @@ function Recommend() {
35 35
         id: cuurentId,
36 36
       },
37 37
     })
38
-    
38
+
39 39
   }
40 40
   function toSee(cuurentId) {
41 41
     router.push({
@@ -44,7 +44,7 @@ function Recommend() {
44 44
         id: cuurentId,
45 45
       },
46 46
     })
47
-    
47
+
48 48
   }
49 49
 
50 50
 
@@ -64,19 +64,16 @@ function Recommend() {
64 64
 
65 65
     })
66 66
   }
67
-  function back(){
68
-    window.history.back(-1)
69
-  }
70 67
 
71 68
   function download(data) {
72 69
     if (!data) {
73
-      return 
70
+      return
74 71
     }
75 72
     const url = window.URL.createObjectURL(new Blob([data]))
76 73
     const link = document.createElement('a')
77 74
     link.style.display = 'none'
78 75
     link.href = url
79
-    link.setAttribute('download', '推荐客户.xlsx')
76
+    link.setAttribute('download', '找房需求.xlsx')
80 77
     document.body.append(link)
81 78
     link.click()
82 79
     setExportLoding(false)
@@ -84,146 +81,143 @@ function Recommend() {
84 81
   const columns = [
85 82
     {
86 83
       title: '头像',
87
-      dataIndex: 'picture',
88
-      key: 'picture',
89
-      align:'center',
90
-      render: (_, record) => <Avatar shape="square" src={record.picture} size={64} icon="user" />,
84
+      dataIndex: 'avatarurl',
85
+      key: 'avatarurl',
86
+      align: 'center',
87
+      render: (_, record) => <Avatar shape="square" src={record.avatarurl} size={64} />,
91 88
     },
92 89
     {
93 90
       title: '姓名',
94
-      dataIndex: 'name',
95
-      key: 'name',
96
-      align:'center',
91
+      dataIndex: 'nickname',
92
+      key: 'nickname',
93
+      align: 'center',
97 94
       // render: (_, record) => <><span>{record.name = '曹建芳'}</span></>,
98 95
     },
99 96
     {
100 97
       title: '电话',
101 98
       dataIndex: 'phone',
102 99
       key: 'phone',
103
-      align:'center',
100
+      align: 'center',
104 101
     },
105 102
     {
106 103
       title: '性别',
107
-      dataIndex: 'sex',
108
-      key: 'sex',
109
-      align:'center',
104
+      dataIndex: 'gender',
105
+      key: 'gender',
106
+      align: 'center',
110 107
       // eslint-disable-next-line no-nested-ternary
111
-      render: (_, record) => <><span>{record.sex === 1 ? '男' : record.sex === 2 ? '女' : '未知'}</span></>,
108
+      render: (_, record) => <><span>{record.gender === '1' ? '男' : record.gender === '2' ? '女' : '未知'}</span></>,
112 109
     },
113 110
     {
114 111
       title: '意向区域',
115
-      dataIndex: 'area',//意向区域
116
-      key: 'area',
117
-      align:'center',
118
-      render: (_, record) => <><span>{record.area = '江苏省南京市秦淮区'}</span></>,
112
+      dataIndex: 'intentArea',//意向区域
113
+      key: 'intentArea',
114
+      align: 'center',
115
+      // render: (_, record) => <><span>{record.area = '江苏省南京市秦淮区'}</span></>,
119 116
 
120 117
     },
121 118
     {
122 119
       title: '意向项目',
123 120
       dataIndex: 'intention',
124 121
       key: 'intention',
125
-      // intention
126
-      //project
127
-      align:'center',
128
-      // render: (_, record) => <><span>{record.area = '香颂.蔚澜半岛'}</span></>,
129
-      render:(_,record)=><span>{record='香颂.蔚澜半岛'}</span>
122
+      align: 'center',
123
+      // render:(_,record)=><span>{record='香颂.蔚澜半岛'}</span>
130 124
 
131 125
     },
132 126
     {
133 127
       title: '提交时间',
134
-      dataIndex: 'createDate',
135
-      key: 'createDate',
136
-      align:'center',
137
-      render: (_, record) => <><span>{record.createDate && moment(record.createDate).format('YYYY-MM-DD HH:mm:ss')}</span></>,
128
+      dataIndex: 'createdTime',
129
+      key: 'createdTime',
130
+      align: 'center',
131
+      render: (_, record) => <><span>{record.createdTime && moment(record.createdTime).format('YYYY-MM-DD HH:mm:ss')}</span></>,
138 132
     },
139 133
     {
140 134
       title: '状态',
141
-      dataIndex: 'verifyStatus',
142
-      key: 'verifyStatus',
143
-      align:'center',
144
-      render: (_, record) => <><span>{record.verifyStatus === 0 ? '待回访' : record.verifyStatus === 1 ? '已回访'   : record.verifyStatus === 2 ? '无效' : ''}</span></>,
135
+      dataIndex: 'status',
136
+      key: 'status',
137
+      align: 'center',
138
+      render: (_, record) => <><span>{record.verifyStatus === 0 ? '待回访' : record.verifyStatus === 1 ? '已回访' : record.verifyStatus === 2 ? '无效' : ''}</span></>,
145 139
     },
146 140
     {
147 141
       title: '操作',
148 142
       dataIndex: 'customerId',
149 143
       key: 'customerId',
150
-      align:'center',
144
+      align: 'center',
151 145
 
152 146
       render: (_, record) => (
153 147
         <><span style={{ color: 'rgba(239,39,58,1)', cursor: 'pointer' }} >
154
-          {record.verifyStatus ===0?<span onClick={() => toAudit(record.customerId)}>审核</span>
155
-          : record.verifyStatus ===1?<span onClick={() => toSee(record.customerId)}>查看详情</span>
156
-          : record.verifyStatus ===2?<span onClick={() => toSee(record.customerId)}>查看详情</span>
157
-          :''}</span>
148
+          {record.verifyStatus === 0 ? <span onClick={() => toAudit(record.customerId)}>审核</span>
149
+            : record.verifyStatus === 1 ? <span onClick={() => toSee(record.customerId)}>查看详情</span>
150
+              : record.verifyStatus === 2 ? <span onClick={() => toSee(record.customerId)}>查看详情</span>
151
+                : ''}</span>
158 152
         </>
159 153
       ),
160 154
     },
161 155
   ]
162 156
 
163 157
 
164
- const searchFields=[
165
-
166
-  {
167
-    name: 'project',
168
-    label: '意向项目',
169
-    placeholder: '请输入意向项目',
170
-  },
171
-
172
-  {
173
-    name: 'name',
174
-    label: '姓名',
175
-    placeholder: '请输入姓名',
176
-  },
177
-  {
178
-    name: 'tel',
179
-    label: '电话',
180
-    placeholder: '请输入电话',
181
-  },
158
+  const searchFields = [
159
+
160
+    {
161
+      name: 'project',
162
+      label: '意向项目',
163
+      placeholder: '请输入意向项目',
164
+    },
165
+
166
+    {
167
+      name: 'name',
168
+      label: '姓名',
169
+      placeholder: '请输入姓名',
170
+    },
182 171
     {
183
-    name: 'types',
184
-    label: '类型',
185
-    placeholder: '类型',
186
-    type: 'select',
187
-    options: [
188
-      {label: '全部',value:''},
189
-      {label: '买房',value: '1'},
190
-      {label: '租房', value: '2'},
191
-      {label: '海外', value: '3'}
192
-    ]
193
-  },
194
-  {
195
-    name: 'verifyStatus',
196
-    label: '状态',
197
-    placeholder: '请选择状态',
198
-    type: 'select',
199
-    placeholder:'全部',//错误
200
-    options: [
201
-      {label: '全部',value:''},
202
-      {label: '待回访', value: '0'},
203
-      {label: '已回访', value: '1'},
204
-      {label: '无效', value: '2'}
205
-    ]
206
-  },
172
+      name: 'tel',
173
+      label: '电话',
174
+      placeholder: '请输入电话',
175
+    },
176
+    {
177
+      name: 'types',
178
+      label: '类型',
179
+      placeholder: '类型',
180
+      type: 'select',
181
+      options: [
182
+        { label: '全部', value: '' },
183
+        { label: '买房', value: '1' },
184
+        { label: '租房', value: '2' },
185
+        { label: '海外', value: '3' }
186
+      ]
187
+    },
188
+    {
189
+      name: 'verifyStatus',
190
+      label: '状态',
191
+      placeholder: '请选择状态',
192
+      type: 'select',
193
+      placeholder: '全部',//错误
194
+      options: [
195
+        { label: '全部', value: '' },
196
+        { label: '待回访', value: '0' },
197
+        { label: '已回访', value: '1' },
198
+        { label: '无效', value: '2' }
199
+      ]
200
+    },
207 201
   ]
208
- const actionRender = () => {
209
-  return (
210
-    <Button type="danger" loading={exportLoding} onClick={() => exportRecommendCustomer()}>
211
-      导出
212
-    </Button>
213
-  );
214
-};
202
+  const actionRender = () => {
203
+    return (
204
+      <Button type="danger" loading={exportLoding} onClick={() => exportRecommendCustomer()}>
205
+        导出
206
+      </Button>
207
+    );
208
+  };
215 209
 
216 210
   return (
217 211
     <>
218 212
       <QueryTable
219
-          rowKey="recommendCustomer"
220
-          // recommendCustomer
221
-          api={apis.searchHouse.list}
222
-          searchFields={searchFields}
223
-          columns={columns}
224
-          actionRender={actionRender}
225
-        />
226
-    
213
+        rowKey="recommendCustomer"
214
+        // recommendCustomer
215
+        api={apis.searchHouse.list}
216
+        searchFields={searchFields}
217
+        columns={columns}
218
+        actionRender={actionRender}
219
+      />
220
+
227 221
     </>
228 222
   );
229 223
 }

+ 79
- 0
src/pages/staff/Organization/TreeTitle.jsx Целия файл

@@ -0,0 +1,79 @@
1
+import { Icon } from 'antd';
2
+import { useState } from 'react';
3
+
4
+export default (props) => {
5
+    const [isEdit, setIsEdit] = useState(false)
6
+    const [inputVal, setInputVal] = useState()
7
+    const { onAdd, onDelete, isDelete, onChange, value } = props
8
+
9
+    const handleClose = () => {
10
+        setIsEdit(false)
11
+        setInputVal(value)
12
+    }
13
+
14
+    const handleSave = () => {
15
+        onChange(inputVal)
16
+        setIsEdit(false)
17
+        setInputVal()
18
+    }
19
+
20
+    if (isEdit) {
21
+        return (
22
+
23
+            <div>
24
+                {/* 逻辑运算 OR  */}
25
+                {/* item项目value根据状态切换 */}
26
+                {/*onChange这个API是一个函数,并且需要返回值,API的返回值是onChange方法的返回值
27
+                e就是api的形参,这个参数的生成需要onChange的API触发,同时将e传给方法并获取其返回值
28
+                实参把值给形参,由形参保存。
29
+                这个e会获取到最新的变化值并且传到onchange方法
30
+                */}
31
+                <input value={inputVal} onChange={(e) => setInputVal(e.target.value)} />
32
+
33
+                <Icon
34
+                    //取消保存
35
+                    type="close-circle"
36
+                    theme="filled"
37
+
38
+                    style={{ marginLeft: 10 }}
39
+                    onClick={handleClose}//恢复默认值 
40
+                />
41
+                <Icon
42
+                    //保存节点
43
+                    type="check-circle"
44
+                    theme="filled"
45
+                    style={{ marginLeft: 10 }}
46
+                    onClick={handleSave}
47
+                />
48
+            </div>
49
+        )
50
+    }
51
+
52
+    return (
53
+        <div >
54
+            <span>{value}</span>
55
+            <span>
56
+                {/* 编辑edit onclick 拿到项目的key */}
57
+                <Icon
58
+                    type="edit"
59
+                    style={{ marginLeft: 10 }}
60
+                    onClick={() => setIsEdit(true)}
61
+                />
62
+                {/* 编辑plus onclick 拿到项目的key */}
63
+                <Icon
64
+                    type="plus"
65
+                    style={{ marginLeft: 10 }}
66
+                    onClick={onAdd}
67
+                />
68
+                {/* 先确认父key是不是绝对等于"0" */}
69
+                {isDelete && (
70
+                    <Icon
71
+                        type="delete"
72
+                        style={{ marginLeft: 10 }}
73
+                        onClick={onDelete}
74
+                    />
75
+                )}
76
+            </span>
77
+        </div>
78
+    )
79
+}

+ 4
- 0
src/pages/staff/Organization/form.jsx Целия файл

@@ -0,0 +1,4 @@
1
+
2
+export default (props) => {
3
+
4
+}

+ 494
- 132
src/pages/staff/Organization/index.jsx Целия файл

@@ -1,140 +1,502 @@
1
+// import React, { useState } from "react";
2
+// import { Tree, Icon, Card } from "antd";
3
+// import { nanoid } from "nanoid";//生成唯一id
4
+// import { duration } from "moment";
5
+// import TreeTitle from './TreeTitle'
6
+
7
+// const { TreeNode } = Tree;
8
+// //树形数据
9
+// const treeData = [
10
+//   {
11
+//     value: "0",
12
+//     defaultValue: "0",
13
+//     key: "0",
14
+//     parentKey: '0',
15
+//     isEditable: false,
16
+//     children: [
17
+//       {
18
+//         value: "0",
19
+//         key: "0-1",
20
+//         defaultValue: "0-1",
21
+//         isEditable: false,
22
+//       },
23
+//     ],
24
+//   },
25
+
26
+// ];
27
+
28
+// const expandedKeyArr = ["0"];
29
+// export default function TreeDemo() {
30
+//   const [data, setData] = useState(treeData);//获取值,及时更新被修改的值。变量
31
+//   const [expandedKeys, setExpandedKeys] = useState(expandedKeyArr);//状态
32
+//   // const onExpand = (expandedKeys) => {
33
+//   //   //记录折叠的key值
34
+//   //   setExpandedKeys(expandedKeys);
35
+//   // };
36
+//   //开始渲染树形节点 data拿到数据
37
+//   const renderTreeNodes = (data) => {
38
+//     //遍历项目
39
+//     let nodeArr = data.map((item) => {
40
+
41
+//       const Title = (
42
+//         <TreeTitle
43
+//           value={item.value}
44
+//           isDelete={item.parentKey !== "0"}
45
+//           onAdd={() => onAdd(item.key)}
46
+//           onDelete={() => onDelete(item.key)}
47
+//           onChange={(val) => onChange(val, item.key)}
48
+//         />
49
+//       );
50
+//       if (item.children) {
51
+//         return (
52
+//           <TreeNode title={Title} key={item.key} dataRef={item}>
53
+//             {/* 渲染 */}
54
+//             {renderTreeNodes(item.children)}
55
+//           </TreeNode>
56
+//         );
57
+//       }
58
+//       //返回他的标题,和key值
59
+//       return <TreeNode title={Title} key={item.key} />;
60
+//     });
61
+//     //返回节点
62
+//     return nodeArr;
63
+//   }
64
+//   //新增
65
+//   const onAdd = (key) => {
66
+//     if (expandedKeys.indexOf(key) === -1) {
67
+//       expandedKeyArr.push(key);
68
+//     }
69
+//     setExpandedKeys(expandedKeyArr.slice());
70
+//     addNode(key, treeData);//添加节点 树形
71
+//     //useState里数据务必为immutable (不可赋值的对象),所以必须加上slice()返回一个新的数组对象
72
+//     setData(treeData.slice());//添加子项
73
+//   };
74
+//   //编辑
75
+//   //拿到key treeData数据--setData设置数据---slice删除数据中已返回的元素  [aa,bb,cc,dd,ee]--slice(2)输出[cc,dd,ee]
76
+//   const onEdit = (key) => {
77
+//     editNode(key, treeData);
78
+//     setData(treeData.slice());
79
+//   };
80
+//   const editNode = (key, data) =>
81
+//     data.forEach((item) => {
82
+//       if (item.key === key) {
83
+//         //编辑状态 true
84
+
85
+//         item.isEditable = true;
86
+//       } else {
87
+
88
+//         //编辑状态 false
89
+//         item.isEditable = false;
90
+//       }
91
+//       item.value = item.defaultValue; // 当某节点处于编辑状态,并改变数据,点击编辑其他节点时,此节点变成不可编辑状态,value 需要回退到 defaultvalue
92
+//       //当某子项处于编辑状态,改变数据,点击其他时候,此项变成不可编辑
93
+//       if (item.children) {
94
+//         editNode(key, item.children);
95
+//         //编辑子节点
96
+//       }
97
+//     });
98
+
99
+//   const addNode = (key, data) =>
100
+//     data.forEach((item) => {
101
+//       if (item.key === key) {//如果拿到的key相同则判断子项
102
+//         if (item.children) {
103
+//           item.children.push({
104
+//             value: "default",//创建新的子项默认值
105
+//             key: nanoid(), // 这个 key 应该是唯一的
106
+//           });
107
+//         } else {
108
+//           item.children = [];
109
+//           item.children.push({
110
+//             value: "default",
111
+//             key: nanoid(),
112
+//           });
113
+//         }
114
+//         return;
115
+//       }
116
+//       if (item.children) {
117
+//         addNode(key, item.children);
118
+//       }
119
+//     });
120
+
121
+//   const onChange = (val, key) => {
122
+//     changeNode(key, val, treeData);
123
+//     setData(treeData.slice());
124
+//   };
125
+
126
+//   const changeNode = (key, value, data) =>
127
+//     data.forEach((item) => {
128
+//       if (item.key === key) {//新增子项内容赋值
129
+//         item.value = value;
130
+//       }
131
+//       if (item.children) {
132
+//         changeNode(key, value, item.children);//子项
133
+//       }
134
+//     });
135
+
136
+//   //确认保存节点
137
+//   const saveNode = (key, data) =>
138
+//     data.forEach((item) => {
139
+//       if (item.key === key) {
140
+//         item.defaultValue = item.value;//item.value内容赋值给defaultValue
141
+//       }
142
+//       //子项保存不能编辑
143
+//       if (item.children) {
144
+//         saveNode(key, item.children);
145
+//       }
146
+//       //项目是否能编辑
147
+//       item.isEditable = false;
148
+//     });
149
+
150
+//   //取消确认
151
+//   const closeNode = (key, defaultValue, data) =>
152
+//     data.forEach((item) => {
153
+//       item.isEditable = false;
154
+//       if (item.key === key) {
155
+//         item.value = defaultValue;
156
+//       }
157
+//       if (item.children) {
158
+//         closeNode(key, defaultValue, item.children);
159
+//       }
160
+//     });
161
+//   // slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。
162
+//   const onDelete = (key) => {
163
+//     deleteNode(key, treeData);
164
+//     setData(treeData.slice());
165
+//   };
166
+//   //删除节点
167
+//   const deleteNode = (key, data) =>
168
+//     //拿到每个key数据, 如果要删除的key相同,则删除,并返回。如果不同判断子项
169
+//     data.forEach((item, index) => {
170
+//       if (item.key === key) {
171
+//         data.splice(index, 1);//从某个位置开始删除元素
172
+//         return;
173
+//       } else {
174
+//         if (item.children) {
175
+//           deleteNode(key, item.children);
176
+//         }
177
+//       }
178
+//     });
179
+
180
+//   return (
181
+//     <div>
182
+//       <Card style={{ width: '90%' }}>
183
+//         <Tree
184
+//           switcherIcon={<Icon type="down-square" theme="filled" />}
185
+//           expandedKeys={expandedKeys}
186
+//         // onExpand={onExpand}
187
+//         >
188
+//           {renderTreeNodes(data)}
189
+//         </Tree>
190
+//       </Card>
191
+
192
+//     </div>
193
+//   );
194
+// }
195
+
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+
204
+
205
+
206
+
207
+
208
+import { Row, Col, Card, Tree, DatePicker, Form, Input, InputNumber, Radio, Button } from 'antd'
209
+import React, { useEffect, useState, useCallback } from 'react';
210
+import ImageUpload from '@/components/XForm/ImageUpload';
211
+
212
+// import userTrees from './tree'
213
+
214
+const { TreeNode, DirectoryTree } = Tree
215
+const FormItem = Form.Item;
216
+
217
+
218
+
219
+
220
+const userTree = React.forwardRef((props, ref) => {
221
+  const [loading, setLoading] = useState(false);//防止多次点击 定义loadind
222
+  const [formData, setFormData] = useState();//提交表单的数据
223
+  const [contentType, setContentType] = useState(1);//单选。初始默认显示1 富文本框。点击视频, 渲染2
224
+  const { form, history } = props;
225
+  const { getFieldDecorator, setFieldsValue, validateFields } = form;
226
+  const { curriculumId } = history.location.query || {}
227
+
228
+
229
+  const formItemLayout = {
230
+    //布局
231
+    labelCol: { span: 6 },
232
+    wrapperCol: { span: 14 },
1 233
 
2
-import React, { Component,useState } from 'react';
3
-import { Card, Tree,Icon } from 'antd';
4
-import { render } from 'preact';
5
-import { turn } from 'cli-table';
6
-const { DirectoryTree,TreeNode } = Tree;
7
-const treeData = [
8
-  {
9
-    value:'江苏省公安厅',
10
-    defaultValue:'0',
11
-    parentKey:'0',
12
-    isEditable:false,
13
-    key:'0',
14
-    children:[
15
-      {
16
-        value:'南京分局',
17
-        key:'0-1',
18
-        defaultValue: "0-1",
19
-        isEditable: false,
20
-      },
21
-      {
22
-        value:'苏州分局',
23
-        key:'0-2',
24
-        defaultValue: "0-2",
25
-        isEditable: false,
26
-      },
27
-    ],
28
-  },
29
-];
30
-
31
-
32
-const expandedKeyArr=['0'];
33
-
34
-
35
-export default function TreeDemo() {
36
-  const[data,setData]=useState(treeData)//获取值,及时更新被修改的值。变量
37
-  const renderTreeNodes=(data)=>{
38
-    let nodeArr=data.map((item)=>{//遍历数据
39
-      item.title=(//修改
40
-        <div style={{display:'flex', minWidth: '100px'}}>
41
-          <span style={{ flex: 'auto' }}>{item.value}</span>
42
-          <span style={{ width: '6em', flex: 'none',marginLeft:'20px' }}>
43
-            {/* 编辑 */}
44
-            <Icon type="edit" onClick={()=>onDelete(item.key)} /> 
45
-            {/* 添加 */}
46
-            <Icon type="diff" onClick={()=>onAdd(item.key)} />
47
-            {/* 删除 */}
48
-            <Icon type="delete"  onClick={()=>onEdit(item.key)}/>
49
-          </span>
50
-        </div>
51
-      )
52
-      if(item.children){//如果有子项就返回下面组件
53
-        return(
54
-          <TreeNode title={item.title} key={item.key} dataRef={item}>
55
-            {renderTreeNodes(item.children)}
56
-            {/* 重新渲染节点 */}
57
-          </TreeNode>//title 接收的 ReactNode类型数据 自定义
58
-        )
59
-      }
60
-      //返回
61
-      return <TreeNode title={item.title} key={item.key} />
62
-    })
63
-      return nodeArr
64
-  };
65
-//添加
66
-  const onAdd=(key)=>{
67
-    // useState 里面数据是不能变的对象。需要slice返回一个新的数组
68
-    addNode(key.treeData);//添加节点 树形
69
-    setData(treeData.slice()) //设置 子项
70
-  }
71
-  //编辑
72
-  const onEdit=(key)=>{
73
-    editNode(key,treeData);
74
-    setData(treeData.slice());
75 234
   };
76
-  const editNode=(key,data)=>
77
-    data.forEach((item)=>{
78
-      if (item.key===key) {
79
-        item.isEditable=true;//可编辑状态更改
80
-      }else{
81
-        item.isEditable=false;
82
-      }
83
-      item.value=item.defaultValue;//当某子项处于编辑状态,改变数据,点击其他时候,此项变成不可编辑
84
-      if (item.children) {
85
-        editNode(key,item.children);
86
-      }
87
-    })  
88
-
89
-    //删除
90
-    const onDelete = (key) => {
91
-      deleteNode(key, treeData);
92
-      setData(treeData.slice());
93
-    };
94
-    const deleteNode = (key, data) =>
95
-      data.forEach((item, index) => {
96
-        if (item.key === key) {
97
-          data.splice(index, 1);//从某个位置开始删除元素
98
-          return;
99
-        } else {
100
-          if (item.children) {
101
-            deleteNode(key, item.children);
102
-          }
103
-        }
104
-      });
105
-
106
-  const addNode=(key,data)=>
107
-    data.forEach((item)=>{
108
-      if(item.key===key){//如果拿到的key相同则判断子项
109
-        if (item.children) {
110
-          item.children.push({
111
-            value:"请输入内容",
112
-            key:key+Math.random(100),//随机唯一的key
113
-          });
114
-        }
115
-        return;
116
-      }
117
-      if (item.children) {
118
-        addNode(key,item.children)//子项
119
-      }
120
-    })
235
+
121 236
   return (
122
-    <div>
123
-      <Card style={{width:'90%'}}>
124
-        <Tree 
125
-        switcherIcon={<Icon type="down-square" theme="filled" />}
126
-        // icon={<Icon type="carry-out" />}
127
-        style={{paddingLeft:'60px'}} 
128
-        treeData={treeData}  >
129
-        {renderTreeNodes(data)}
130
-        </Tree>
131
-        {/* 渲染被更新 */}
132
-      </Card>
133
-    </div>
134
-  );
135
-}
237
+    <Card>
238
+      <Row justify='center'>
239
+        <Col xs={{ span: 5, offset: 1 }} lg={{ span: 6, offset: 0 }}>
240
+          <Card>
241
+            <Button type='danger' style={{ marginLeft: '2em' }} >
242
+              删除
243
+            </Button>
244
+            <DirectoryTree multiple>
245
+              <TreeNode title="parent 0" key="0-0">
246
+                <TreeNode title="leaf 0-0" key="0-0-0" isLeaf />
247
+                <TreeNode title="leaf 0-1" key="0-0-1" isLeaf />
248
+              </TreeNode>
249
+              <TreeNode title="parent 1" key="0-1">
250
+                <TreeNode title="leaf 1-0" key="0-1-0" isLeaf />
251
+                <TreeNode title="leaf 1-1" key="0-1-1" isLeaf />
252
+                <TreeNode title="leaf 1-1" key="0-1-2" isLeaf />
253
+                <TreeNode title="leaf 1-1" key="0-1-3" isLeaf />
254
+                <TreeNode title="leaf 1-1" key="0-1-4" isLeaf />
255
+                <TreeNode title="leaf 1-1" key="0-1-5" isLeaf />
256
+              </TreeNode>
257
+            </DirectoryTree>
258
+          </Card>
259
+        </Col>
260
+        {/* FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF>Form表单 */}
261
+        <Col xs={{ span: 10, offset: 10 }} lg={{ span: 10, offset: 4 }}>
262
+          <Card>
263
+            <Form {...formItemLayout} >
264
+              <FormItem label="照片" help="建议尺寸:750px*600px,比例5:4,格式:jpg,用于:列表和详情">
265
+                {
266
+                  getFieldDecorator('curriculumImg', {
267
+                    rules: [
268
+                      { required: true, message: '请上传照片' }
269
+                    ]
270
+                  })(
271
+                    <ImageUpload />
272
+                  )
273
+                }
274
+              </FormItem>
275
+              <FormItem label="姓名">
276
+                {
277
+                  getFieldDecorator('name', {
278
+                    rules: [
279
+                      { required: true, message: '请输入姓名' }
280
+                    ]
281
+                  })(
282
+                    <Input style={{ width: '88px' }} />
283
+                  )
284
+                }
285
+              </FormItem>
286
+              <FormItem label="年龄" >
287
+                {
288
+                  getFieldDecorator('weight', {
289
+                    rules: [{ required: true, message: '请输入年龄' }]
290
+                  })(
291
+                    <InputNumber min='18' />
292
+                  )
293
+                }
294
+              </FormItem>
295
+
296
+              <FormItem label="性别">
297
+                {
298
+                  getFieldDecorator('type', {
299
+                    rules: [
300
+                      { required: true, message: '请选择性别' }
301
+                    ]
302
+                  })(
303
+                    <Radio.Group value={contentType} style={{ width: '500px' }} defaultValue={1}>
304
+                      {/* onChange={e => setContentType(e.target.value)} */}
305
+                      <Radio value={1}>男</Radio>
306
+                      <Radio value={2}>女</Radio>
307
+                    </Radio.Group>
308
+                  )
309
+                }
310
+              </FormItem>
311
+              <Form.Item label="工作总时间" style={{ marginBottom: 0 }} help="如未离职,第二个日期则不用输入">
312
+                <Form.Item style={{ display: 'inline-block' }} >
313
+                  <DatePicker />
314
+                </Form.Item>
315
+                <span style={{ display: 'inline-block', width: '20px', textAlign: 'center' }}>至</span>
316
+                <Form.Item style={{ display: 'inline-block' }}>
317
+                  <DatePicker />
318
+                </Form.Item>
319
+              </Form.Item>
320
+
321
+              <FormItem wrapperCol={{ span: 12, offset: 6 }}>
322
+                <Button loading={loading} type="primary" htmlType="">
323
+                  确认修改
324
+                </Button>
325
+              </FormItem>
326
+            </Form>
327
+          </Card>
328
+        </Col>
329
+      </Row>
330
+    </Card>
331
+
332
+  )
333
+})
334
+
335
+
336
+
337
+// import React, { useEffect, useState, useCallback } from 'react';
338
+// import { Button, Form, Select, Input, InputNumber, Radio, message, DatePicker, Card } from 'antd';
339
+// import ImageUpload from '@/components/XForm/ImageUpload';
340
+// import FileUpload from '@/components/XForm/FileUpload';
341
+// import Wangedit from '@/components/Wangedit/Wangedit';
342
+// import router from 'umi/router';
343
+// import { fetch, apis } from '@/utils/request';
344
+
345
+// const FormItem = Form.Item;
346
+// const Option = Select.Option;
347
+// // const getCurriculumData = fetch(apis.course.searchCourse);
348
+// // const saveCurriculumData = fetch(apis.course.addCourse);
349
+// // const updateCurriculumData = fetch(apis.course.alterCourse);
350
+// const goBack = () => router.goBack(-1);
351
+
352
+// const userTree = React.forwardRef((props, ref) => {
353
+//   const [loading, setLoading] = useState(false);//防止多次点击 定义loadind
354
+//   const [formData, setFormData] = useState();//提交表单的数据
355
+//   const [contentType, setContentType] = useState(1);//单选。初始默认显示1 富文本框。点击视频, 渲染2
356
+//   const { form, history } = props;
357
+//   const { getFieldDecorator, setFieldsValue, validateFields } = form;
358
+//   const { curriculumId } = history.location.query || {}
359
+
360
+//   const formItemLayout = {
361
+//     //布局
362
+//     labelCol: { span: 6 },
363
+//     wrapperCol: { span: 14 },
364
+
365
+//   };
366
+
367
+//   const handleSubmit = (e) => {
368
+//     e.preventDefault();
369
+//     validateFields((err, values) => {
370
+//       if (err) {
371
+//         return;
372
+//         //字符验证未填写---返回
373
+//       }
374
+
375
+//       setLoading(true);//loading开始
376
+
377
+//       if (curriculumId) {
378
+//         //如果有这个id拿。没有就,拿返回的curriculumId
379
+//         updateCurriculumData({
380
+//           data: {
381
+//             ...values,
382
+//             curriculumId
383
+//           },
384
+//           urlData: { id: curriculumId }
385
+//         }).then(() => {
386
+//           setLoading(false);
387
+//           message.success('数据更新成功');
388
+//           goBack()
389
+//         }).catch((err) => {
390
+//           setLoading(false);//loading消失
391
+//           message.error(err.message || err);
392
+//         })
393
+//       } else {
394
+//         saveCurriculumData({ data: values }).then(() => {
395
+//           setLoading(false);
396
+//           message.success('数据保存成功');
397
+//           goBack()
398
+//         }).catch((err) => {
399
+//           setLoading(false);//loading消失
400
+//           message.error(err.message || err);
401
+//         })
402
+//       }
403
+//     });
404
+//   }
405
+
406
+//   const getCourseData = useCallback(({ curriculumId }) => {//函数结果存 初始化运行一次,等待调用。
407
+//     getCurriculumData({ urlData: { id: curriculumId } }).then((res) => {
408
+//       setFormData(res)
409
+//     })
410
+//   }, [])
411
+
412
+//   useEffect(() => {
413
+//     if (curriculumId) {
414
+//       getCourseData({ curriculumId })//第一次渲染前//获取id
415
+//     }
416
+//   }, [curriculumId])//第二次id一样不执行
417
+
418
+//   useEffect(() => {
419
+//     if (formData) {//1.form表单数据{2} 执行。无变更不执行
420
+//       setFieldsValue(formData)
421
+//     }
422
+//   }, [formData])//2.有变更跟的话
423
+
136 424
 
425
+//   return (
426
+//     <Card>
427
+//       <Form {...formItemLayout} onSubmit={handleSubmit}>
428
+//         <FormItem label="照片" help="建议尺寸:750px*600px,比例5:4,格式:jpg,用于:列表和详情">
429
+//           {
430
+//             getFieldDecorator('curriculumImg', {
431
+//               rules: [
432
+//                 { required: true, message: '请上传照片' }
433
+//               ]
434
+//             })(
435
+//               <ImageUpload />
436
+//             )
437
+//           }
438
+//         </FormItem>
439
+//         <FormItem label="姓名">
440
+//           {
441
+//             getFieldDecorator('name', {
442
+//               rules: [
443
+//                 { required: true, message: '请输入姓名' }
444
+//               ]
445
+//             })(
446
+//               <Input style={{ width: '88px' }} />
447
+//             )
448
+//           }
449
+//         </FormItem>
450
+//         <FormItem label="年龄" >
451
+//           {
452
+//             getFieldDecorator('weight', {
453
+//               rules: [{ required: true, message: '请输入年龄' }]
454
+//             })(
455
+//               <InputNumber min='18' />
456
+//             )
457
+//           }
458
+//         </FormItem>
137 459
 
460
+//         <FormItem label="性别">
461
+//           {
462
+//             getFieldDecorator('type', {
463
+//               rules: [
464
+//                 { required: true, message: '请选择性别' }
465
+//               ]
466
+//             })(
467
+//               <Radio.Group value={contentType} style={{ width: '500px' }} defaultValue={1}>
468
+//                 {/* onChange={e => setContentType(e.target.value)} */}
469
+//                 <Radio value={1}>男</Radio>
470
+//                 <Radio value={2}>女</Radio>
471
+//               </Radio.Group>
472
+//             )
473
+//           }
474
+//         </FormItem>
475
+//         <Form.Item label="工作总时间" style={{ marginBottom: 0 }} help="如未离职,第二个日期则不用输入">
476
+//           <Form.Item style={{ display: 'inline-block' }} >
477
+//             <DatePicker />
478
+//           </Form.Item>
479
+//           <span style={{ display: 'inline-block', width: '20px', textAlign: 'center' }}>至</span>
480
+//           <Form.Item style={{ display: 'inline-block' }}>
481
+//             <DatePicker />
482
+//           </Form.Item>
483
+//         </Form.Item>
138 484
 
485
+//         <FormItem wrapperCol={{ span: 12, offset: 6 }}>
486
+//           <Button loading={loading} type="primary" htmlType="">
487
+//             保存
488
+//           </Button>
489
+//           <Button style={{ marginLeft: '2em' }} onClick={goBack}>
490
+//             返回
491
+//           </Button>
492
+//           <Button type='danger' style={{ marginLeft: '2em' }} >
493
+//             删除
494
+//           </Button>
495
+//         </FormItem>
496
+//       </Form>
497
+//     </Card>
139 498
 
499
+//   )
500
+// })
140 501
 
502
+export default Form.create({})(userTree);

+ 18
- 0
src/pages/staff/Organization/tree.jsx Целия файл

@@ -0,0 +1,18 @@
1
+import { Tree } from 'antd'
2
+
3
+export default (props) => {
4
+    const { TreeNode, DirectoryTree } = Tree
5
+
6
+    return (
7
+        <DirectoryTree multiple>
8
+            <TreeNode title="parent 0" key="0-0">
9
+                <TreeNode title="leaf 0-0" key="0-0-0" isLeaf />
10
+                <TreeNode title="leaf 0-1" key="0-0-1" isLeaf />
11
+            </TreeNode>
12
+            <TreeNode title="parent 1" key="0-1">
13
+                <TreeNode title="leaf 1-0" key="0-1-0" isLeaf />
14
+                <TreeNode title="leaf 1-1" key="0-1-1" isLeaf />
15
+            </TreeNode>
16
+        </DirectoryTree>
17
+    )
18
+}

+ 2
- 2
src/pages/system/Sellhouse/index.jsx Целия файл

@@ -163,7 +163,7 @@ export default props => {
163 163
       align: 'center',
164 164
       with: 300,
165 165
       // ellipsis: true,
166
-      render:(_,record)=><span>{record.houseName='高奢生活,在遇到它之前你想象不到'}</span>
166
+      // render:(_,record)=><span>{record.houseName='高奢生活,在遇到它之前你想象不到'}</span>
167 167
     },
168 168
     {
169 169
       title: '城市',
@@ -171,7 +171,7 @@ export default props => {
171 171
       dataIndex: 'houseType',
172 172
       align: 'center',
173 173
       // render: t => t.newsTypeName,
174
-      render:(_,record)=><span>{record.houseType='南京'}</span>
174
+      // render:(_,record)=><span>{record.houseType='南京'}</span>
175 175
 
176 176
     },
177 177
     {

+ 99
- 97
src/pages/system/housingPolicy/Edit/index.jsx Целия файл

@@ -1,5 +1,5 @@
1 1
 import React, { useState, useEffect } from 'react';
2
-import { Form, Input, Button, Icon, Select, Tabs, Radio, DatePicker,message } from 'antd';
2
+import { Form, Input, Button, Icon, Select, Tabs, Radio, DatePicker, message, Card } from 'antd';
3 3
 
4 4
 import moment from 'moment';
5 5
 import router from 'umi/router';
@@ -16,118 +16,120 @@ const { MonthPicker, RangePicker, WeekPicker } = DatePicker;
16 16
  * @param {*} props
17 17
  * @returns
18 18
  */
19
- const Edit = (props) => {
19
+const Edit = (props) => {
20 20
   const policyId = props.location.query.policyId
21
-  const [ policyData, setPolicyData ] = useState({})
22
-  if(policyId){
21
+  const [policyData, setPolicyData] = useState({})
22
+  if (policyId) {
23 23
     useEffect(() => {
24 24
       getPolicyData(policyId);
25
-    },[])
25
+    }, [])
26 26
 
27
-  // 查询列表
28
-  const getPolicyData = (policyId) => {
29
-    request({ ...apis.system.taPolicy, urlData: {id: policyId} }).then((data) => {
27
+    // 查询列表
28
+    const getPolicyData = (policyId) => {
29
+      request({ ...apis.system.taPolicy, urlData: { id: policyId } }).then((data) => {
30 30
         console.log(data)
31 31
         setPolicyData(data)
32
-    })
33
-  }
32
+      })
33
+    }
34 34
   }
35 35
 
36
-  const cancelPage = () =>{
36
+  const cancelPage = () => {
37 37
     router.push({
38 38
       pathname: '/system/housingPolicy',
39 39
     });
40 40
   }
41
-    const fields = [
42
-      {
43
-        label: '城市',
44
-        name: 'cityId',
45
-        render: <SelectCity />,
46
-        value: policyData.cityId,
47
-        rules: [
48
-          {
49
-            required: true,
50
-            message: '请选择城市',
51
-          },
52
-        ],
53
-      },
54
-      {
55
-        label: '购房须知封面图',
56
-        name: 'policyImg',
57
-        type: FieldTypes.ImageUploader,
58
-        value: policyData.policyImg,
59
-        help: '建议图片尺寸:220*176px,比例5:4,格式:jpg,用于购房须知列表',
60
-        rules: [
61
-          {
62
-            required: true,
63
-            message: '请选择购房须知封面图',
64
-          },
65
-        ],
66
-      },
67
-      {
68
-        label: '购房须知标题',
69
-        name: 'title',
70
-        type: FieldTypes.Text,
71
-        value: policyData.title,
72
-        rules: [
73
-          {
74
-            required: true,
75
-            message: '请输入购房须知标题',
76
-          },
77
-        ],
78
-      },
79
-      {
80
-        label: '购房须知详情',
81
-        name: 'body',
82
-        render: <Wangedit />,
83
-        value: policyData.body,
84
-        rules: [
85
-          {
86
-            required: true,
87
-            message: '请输入购房须知详情',
88
-          },
89
-        ],
90
-      },
91
-      {
92
-        label: '状态',
93
-        name: 'publishStatus',
94
-        type: FieldTypes.Select,
95
-        dict: [{label:"未发布",value:0},{label:"已发布",value:1}],
96
-        value: policyData.publishStatus != null ? policyData.publishStatus : 1,
97
-      },
98
-    ]
99
-  
100
-    const handleSubmit = val => { 
101
-      console.log('submit data --->', val)
102
-      console.log(val.body, 'val.body')
103
-      if (val.body == '<p><br></p>'){
104
-        message.info("购房须知详情必填")
105
-        return
106
-      }
107
-      
108
-      if(policyId){
109
-        val.policyId = policyId
110
-        request({ ...apis.system.updateTaPolicy, urlData: {id: policyId},data: val, }).then((data) => {
111
-          message.info("保存成功")
112
-          cancelPage()
113
-        }).catch((err) => {
114
-          message.info(err.msg || err.message)
115
-        })
116
-      }else{
117
-        request({ ...apis.system.addTaPolicy,data: val, }).then((data) => {
118
-          message.info("保存成功")
119
-          cancelPage()
120
-        }).catch((err) => {
121
-          message.info(err.msg || err.message)
122
-        })
123
-      }
41
+  const fields = [
42
+    {
43
+      label: '城市',
44
+      name: 'cityId',
45
+      render: <SelectCity />,
46
+      value: policyData.cityId,
47
+      rules: [
48
+        {
49
+          required: true,
50
+          message: '请选择城市',
51
+        },
52
+      ],
53
+    },
54
+    {
55
+      label: '购房须知封面图',
56
+      name: 'policyImg',
57
+      type: FieldTypes.ImageUploader,
58
+      value: policyData.policyImg,
59
+      help: '建议图片尺寸:220*176px,比例5:4,格式:jpg,用于购房须知列表',
60
+      rules: [
61
+        {
62
+          required: true,
63
+          message: '请选择购房须知封面图',
64
+        },
65
+      ],
66
+    },
67
+    {
68
+      label: '购房须知标题',
69
+      name: 'title',
70
+      type: FieldTypes.Text,
71
+      value: policyData.title,
72
+      rules: [
73
+        {
74
+          required: true,
75
+          message: '请输入购房须知标题',
76
+        },
77
+      ],
78
+    },
79
+    {
80
+      label: '购房须知详情',
81
+      name: 'body',
82
+      render: <Wangedit />,
83
+      value: policyData.body,
84
+      rules: [
85
+        {
86
+          required: true,
87
+          message: '请输入购房须知详情',
88
+        },
89
+      ],
90
+    },
91
+    {
92
+      label: '状态',
93
+      name: 'publishStatus',
94
+      type: FieldTypes.Select,
95
+      dict: [{ label: "未发布", value: 0 }, { label: "已发布", value: 1 }],
96
+      value: policyData.publishStatus != null ? policyData.publishStatus : 1,
97
+    },
98
+  ]
99
+
100
+  const handleSubmit = val => {
101
+    console.log('submit data --->', val)
102
+    console.log(val.body, 'val.body')
103
+    if (val.body == '<p><br></p>') {
104
+      message.info("购房须知详情必填")
105
+      return
124 106
     }
125
-     
107
+
108
+    if (policyId) {
109
+      val.policyId = policyId
110
+      request({ ...apis.system.updateTaPolicy, urlData: { id: policyId }, data: val, }).then((data) => {
111
+        message.info("保存成功")
112
+        cancelPage()
113
+      }).catch((err) => {
114
+        message.info(err.msg || err.message)
115
+      })
116
+    } else {
117
+      request({ ...apis.system.addTaPolicy, data: val, }).then((data) => {
118
+        message.info("保存成功")
119
+        cancelPage()
120
+      }).catch((err) => {
121
+        message.info(err.msg || err.message)
122
+      })
123
+    }
124
+  }
125
+
126 126
 
127 127
   return (
128
-    <XForm onSubmit={handleSubmit} onCancel={cancelPage} fields={fields}></XForm>
128
+    <Card>
129
+      <XForm onSubmit={handleSubmit} onCancel={cancelPage} fields={fields}></XForm>
130
+    </Card>
129 131
   );
130
- }
132
+}
131 133
 
132 134
 
133 135