baozhangchao 3 yıl önce
ebeveyn
işleme
6308c31a46

+ 1
- 0
package.json Dosyayı Görüntüle

@@ -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 Dosyayı Görüntüle

@@ -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 Dosyayı Görüntüle


+ 8
- 8
src/pages/home/Recommend/auditCopy.jsx Dosyayı Görüntüle

@@ -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 Dosyayı Görüntüle

@@ -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
 }

+ 214
- 101
src/pages/staff/Organization/index.jsx Dosyayı Görüntüle

@@ -1,140 +1,253 @@
1
+import React, { useState } from "react";
2
+import { Tree, Icon, Card } from "antd";
3
+import { nanoid } from "nanoid";//生成唯一id
4
+import { duration } from "moment";
1 5
 
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;
6
+const { TreeNode } = Tree;
7
+//树形数据
7 8
 const treeData = [
8 9
   {
9
-    value:'江苏省公安厅',
10
-    defaultValue:'0',
11
-    parentKey:'0',
12
-    isEditable:false,
13
-    key:'0',
14
-    children:[
10
+    value: "0",
11
+    defaultValue: "0",
12
+    key: "0",
13
+    parentKey: '0',
14
+    isEditable: false,
15
+    children: [
15 16
       {
16
-        value:'南京分局',
17
-        key:'0-1',
17
+        value: "0",
18
+        key: "0-1",
18 19
         defaultValue: "0-1",
19 20
         isEditable: false,
20 21
       },
21
-      {
22
-        value:'苏州分局',
23
-        key:'0-2',
24
-        defaultValue: "0-2",
25
-        isEditable: false,
26
-      },
27 22
     ],
28 23
   },
24
+
29 25
 ];
30 26
 
27
+const expandedKeyArr = ["0"];
28
+export default function TreeDemo() {
29
+  const [data, setData] = useState(treeData);//获取值,及时更新被修改的值。变量
30
+  const [expandedKeys, setExpandedKeys] = useState(expandedKeyArr);//状态
31
+  const onExpand = (expandedKeys) => {
32
+    //记录折叠的key值
33
+    setExpandedKeys(expandedKeys);
34
+  };
35
+  //开始渲染树形节点 data拿到数据
36
+  const renderTreeNodes = (data) => {
37
+    //遍历项目
38
+    let nodeArr = data.map((item) => {
39
+      //项目编辑内容=title
40
+      if (item.isEditable) {
41
+        item.title = (
42
+          <div>
43
+            {/* 逻辑运算 OR  */}
44
+            {/* item项目value根据状态切换 */}
45
+            {/*onChange这个API是一个函数,并且需要返回值,API的返回值是onChange方法的返回值
46
+            e就是api的形参,这个参数的生成需要onChange的API触发,同时将e传给方法并获取其返回值
47
+            实参把值给形参,由形参保存。
31 48
 
32
-const expandedKeyArr=['0'];
49
+            这个e会获取到最新的变化值并且传到onchange方法
50
+            */}
51
+            <input value={item.value || ''} onChange={(e) => onChange(e, item.key)} />
33 52
 
53
+            <Icon
54
+              //取消保存
55
+              type="close-circle"
56
+              theme="filled"
34 57
 
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(
58
+              style={{ marginLeft: 10 }}
59
+              onClick={() => onClose(item.key, item.defaultValue)}//恢复默认值 
60
+            />
61
+            <Icon
62
+              //保存节点
63
+              type="check-circle"
64
+              theme="filled"
65
+              style={{ marginLeft: 10 }}
66
+              onClick={() => onSave(item.key)}
67
+            />
68
+          </div>
69
+        );
70
+      } else {
71
+        //放在标题旁边
72
+        item.title = (
73
+          <div >
74
+            <span>{item.value}</span>
75
+            <span>
76
+              {/* 编辑edit onclick 拿到项目的key */}
77
+              <Icon
78
+                type="edit"
79
+                style={{ marginLeft: 10 }}
80
+                onClick={() => onEdit(item.key)}
81
+              />
82
+              {/* 编辑plus onclick 拿到项目的key */}
83
+              <Icon
84
+                type="plus"
85
+                style={{ marginLeft: 10 }}
86
+                onClick={() => onAdd(item.key)}
87
+              />
88
+              {/* 先确认父key是不是绝对等于"0" */}
89
+              {item.parentKey === "0" ? null : (
90
+                <Icon
91
+                  type="delete"
92
+                  style={{ marginLeft: 10 }}
93
+                  onClick={() => onDelete(item.key)}
94
+                />
95
+              )}
96
+            </span>
97
+          </div>
98
+        );
99
+      }
100
+      //更新数据----------------------------
101
+      if (item.children) {
102
+        return (
54 103
           <TreeNode title={item.title} key={item.key} dataRef={item}>
104
+            {/* 渲染 */}
55 105
             {renderTreeNodes(item.children)}
56
-            {/* 重新渲染节点 */}
57
-          </TreeNode>//title 接收的 ReactNode类型数据 自定义
58
-        )
106
+          </TreeNode>
107
+        );
59 108
       }
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()) //设置 子项
109
+      //返回他的标题,和key值
110
+      return <TreeNode title={item.title} key={item.key} />;
111
+    });
112
+    //返回节点
113
+    return nodeArr;
70 114
   }
115
+  //新增
116
+  const onAdd = (key) => {
117
+    if (expandedKeys.indexOf(key) === -1) {
118
+      expandedKeyArr.push(key);
119
+    }
120
+    setExpandedKeys(expandedKeyArr.slice());
121
+    addNode(key, treeData);//添加节点 树形
122
+    //useState里数据务必为immutable (不可赋值的对象),所以必须加上slice()返回一个新的数组对象
123
+    setData(treeData.slice());//添加子项
124
+  };
71 125
   //编辑
72
-  const onEdit=(key)=>{
73
-    editNode(key,treeData);
126
+  //拿到key treeData数据--setData设置数据---slice删除数据中已返回的元素  [aa,bb,cc,dd,ee]--slice(2)输出[cc,dd,ee]
127
+  const onEdit = (key) => {
128
+    editNode(key, treeData);
74 129
     setData(treeData.slice());
75 130
   };
76
-  const editNode=(key,data)=>
77
-    data.forEach((item)=>{
78
-      if (item.key===key) {
79
-        item.isEditable=true;//可编辑状态更改
80
-      }else{
81
-        item.isEditable=false;
131
+  const editNode = (key, data) =>
132
+    data.forEach((item) => {
133
+      if (item.key === key) {
134
+        //编辑状态 true
135
+
136
+        item.isEditable = true;
137
+      } else {
138
+
139
+        //编辑状态 false
140
+        item.isEditable = false;
82 141
       }
83
-      item.value=item.defaultValue;//当某子项处于编辑状态,改变数据,点击其他时候,此项变成不可编辑
142
+      item.value = item.defaultValue; // 当某节点处于编辑状态,并改变数据,点击编辑其他节点时,此节点变成不可编辑状态,value 需要回退到 defaultvalue
143
+      //当某子项处于编辑状态,改变数据,点击其他时候,此项变成不可编辑
84 144
       if (item.children) {
85
-        editNode(key,item.children);
145
+        editNode(key, item.children);
146
+        //编辑子节点
86 147
       }
87
-    })  
148
+    });
88 149
 
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相同则判断子项
150
+  const addNode = (key, data) =>
151
+    data.forEach((item) => {
152
+      if (item.key === key) {//如果拿到的key相同则判断子项
109 153
         if (item.children) {
110 154
           item.children.push({
111
-            value:"请输入内容",
112
-            key:key+Math.random(100),//随机唯一的key
155
+            value: "default",//创建新的子项默认值
156
+            key: nanoid(), // 这个 key 应该是唯一的
157
+          });
158
+        } else {
159
+          item.children = [];
160
+          item.children.push({
161
+            value: "default",
162
+            key: nanoid(),
113 163
           });
114 164
         }
115 165
         return;
116 166
       }
117 167
       if (item.children) {
118
-        addNode(key,item.children)//子项
168
+        addNode(key, item.children);
169
+      }
170
+    });
171
+
172
+  const onChange = (e, key) => {
173
+    changeNode(key, e.target.value, treeData);
174
+    setData(treeData.slice());
175
+  };
176
+
177
+  const changeNode = (key, value, data) =>
178
+    data.forEach((item) => {
179
+      if (item.key === key) {//新增子项内容赋值
180
+        item.value = value;
181
+      }
182
+      if (item.children) {
183
+        changeNode(key, value, item.children);//子项
184
+      }
185
+    });
186
+
187
+  const onSave = (key) => {
188
+    saveNode(key, treeData);
189
+    setData(treeData.slice());
190
+  };
191
+  //确认保存节点
192
+  const saveNode = (key, data) =>
193
+    data.forEach((item) => {
194
+      if (item.key === key) {
195
+        item.defaultValue = item.value;//item.value内容赋值给defaultValue
196
+      }
197
+      //子项保存不能编辑
198
+      if (item.children) {
199
+        saveNode(key, item.children);
119 200
       }
120
-    })
201
+      //项目是否能编辑
202
+      item.isEditable = false;
203
+    });
204
+
205
+  const onClose = (key, defaultValue) => {
206
+    closeNode(key, defaultValue, treeData);
207
+    //项目关闭,获取treeData树数据值
208
+    setData(treeData);
209
+  };
210
+  //取消确认
211
+  const closeNode = (key, defaultValue, data) =>
212
+    data.forEach((item) => {
213
+      item.isEditable = false;
214
+      if (item.key === key) {
215
+        item.value = defaultValue;
216
+      }
217
+      if (item.children) {
218
+        closeNode(key, defaultValue, item.children);
219
+      }
220
+    });
221
+  // slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。
222
+  const onDelete = (key) => {
223
+    deleteNode(key, treeData);
224
+    setData(treeData.slice());
225
+  };
226
+  //删除节点
227
+  const deleteNode = (key, data) =>
228
+    //拿到每个key数据, 如果要删除的key相同,则删除,并返回。如果不同判断子项
229
+    data.forEach((item, index) => {
230
+      if (item.key === key) {
231
+        data.splice(index, 1);//从某个位置开始删除元素
232
+        return;
233
+      } else {
234
+        if (item.children) {
235
+          deleteNode(key, item.children);
236
+        }
237
+      }
238
+    });
239
+
121 240
   return (
122 241
     <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)}
242
+      <Card style={{ width: '90%' }}>
243
+        <Tree
244
+          switcherIcon={<Icon type="down-square" theme="filled" />}
245
+          expandedKeys={expandedKeys}
246
+          onExpand={onExpand}>
247
+          {renderTreeNodes(data)}
130 248
         </Tree>
131
-        {/* 渲染被更新 */}
132 249
       </Card>
250
+
133 251
     </div>
134 252
   );
135
-}
136
-
137
-
138
-
139
-
140
-
253
+}

+ 2
- 2
src/pages/system/Sellhouse/index.jsx Dosyayı Görüntüle

@@ -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 Dosyayı Görüntüle

@@ -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