近几年,我国经济的跨越性发展速度大家有目共睹,农村都在向城市化发展,农民都踊跃走出家乡投身城市的建设
中,因此也推动城市房地产和租赁行业的新发展时机。房屋租赁行业的发展离不开房屋租赁政策的支持。
财政部、国家发改委曾发布通知称,自2015年11月1日起,在全国统一取消和暂停征收包括房屋租赁手续费等在内
的37项行政事业性收费,以及自2016年1月1日起,取消人力资源社会保障等部门所属公共就业和人才服务机构收
取的人才集体户口管理服务费。取消和暂停征收上述收费后,有关部门及所属事业单位依法履行管理职能资金投入
量,安排合理中央在房屋租赁方面的财政预算,保证工作顺利完成,各级政府相关价格管理部门要加强对房地产市
场的价格监控,消除不合理乱收费现象,坚决取缔多于的政府公共事业单位,升级改革行政人员体系使其精英化,
严厉杜绝各种乱收费现象。
北上广地区的城市外来人口众多,租房问题急需解决,租房供不应求,根据数据分析,国内的一线都市每年对房屋
的需求高达650套,我国在进行第六次人口普及调查中,在北上广和珠三角发达区域,外来人口户数占据成熟人口
接近一半的比重。2015年北京和上海平均家庭规模约为2.42人。基于房产网站搜索的出租房源数据,北京出租房
平均合租户数为2.04。如果按照一线城市标准,我国房屋租赁市场有着极大的发展前景
好客租房是直接促成房东与租户对接的生活服务平台,它包含房东发布房源,租户多维度寻找房源,智能匹配房
源,近期行情查询等功能。减少中间环节产生的费用,提高房东与租户匹配的成功率。
《好客租房项目》采用SOA架构思想进行设计,采用SpringBoot、SpringMVC、Mybaits、Dubbo等技术框架实
现,好客租房是直接促成房东与租户对接的生活服务平台,他包含房东发布房源,租户多维度寻找房源,智能匹配
房源,近期行情查询等功能。减少中间环节产生的费用,提高房东与租户匹配的成功率。
《好客租房项目》融合了RPC、大数据等相技术,如SpringBoot、SpringMVC、Mybaits、Dubbo、React.js、
GraphQL、RocketMQ、Flume、ELK等技术,实现了移动web应用、微信小程序应用、后台管理应用等功能
后端架构:SpringBoot+StringMVC+Dubbo+Mybatis+ELK+区块链
前端架构:React.js+html5+百度地图+微信小程序

第一步,将资料文件中的itcast-haoke-manage-web.zip解压到指定目录(我的是F:\code\itcast-haoke);
第二步,导入到Idea中
第三步,执行命令导入相关的依赖
tyarn install #安装相关依赖
#如果tyarn install安装失败(提示Integrity check failed for "antd" (computed integrity doesn't match our records),那么运行此命令
yarn --update-checksums
tyarn start #启动服务

全局的布局文件在这,打开看代码,发现,左侧的菜单是自定义组件

打开/components/SiderMenu文件:

在Footer.js文件中修改版权信息:

根据需求,修改左侧的菜单:

{ //房源管理
path: '/house',
name: 'house',
icon: 'home',
routes: [
{
path: '/house/resource',
name: 'resource',
component: './haoke/House/Resource'
},
{
path: '/house/addResource',
name: 'addResource',
component: './haoke/House/AddResource'
},
{
path: '/house/kanfang',
name: 'kanfang',
component: './haoke/House/KanFang'
},
{
path: '/house/zufang',
name: 'zufang',
component: './haoke/House/ZuFang'
}
]
},
{ //房东管理
path: '/fangdong',
name: 'fangdong',
icon: 'key',
routes: [
{
path: '/fangdong/list',
name: 'list',
component: './haoke/FangDong/List'
}
]
},
{ //用户管理
path: '/users',
name: 'users',
icon: 'user',
routes: [
{
path: '/users/list',
name: 'list',
component: './haoke/Users/List'
}
]
},
{ //合约管理
path: '/heyue',
name: 'heyue',
icon: 'file-text',
routes: [
{
path: '/heyue/list',
name: 'list',
component: './haoke/HeYue/List'
}
]
},
{ //资讯管理
path: '/news',
name: 'news',
icon: 'message',
routes: [
{
path: '/news/list',
name: 'list',
component: './haoke/News/List'
}
]
},
{ //问答管理
path: '/qa',
name: 'qa',
icon: 'question-circle',
routes: [
{
path: '/news/list',
name: 'list',
component: './haoke/News/List'
}
]
},
{ //财务管理
path: '/finance',
name: 'finance',
icon: 'money-collect',
routes: [
{
path: '/finance/bill',
name: 'bill',
component: './haoke/Finance/Bill'
},
{
path: '/finance/tixian',
name: 'tixian',
component: './haoke/Finance/TiXian'
}
]
},
{ //系统管理
path: '/system',
name: 'system',
icon: 'laptop',
routes: [
{
path: '/system/interface',
name: 'interface',
component: './haoke/System/Interface'
},
{
path: '/system/dict',
name: 'dict',
component: './haoke/System/Dict'
},
{
path: '/system/contract',
name: 'contract',
component: './haoke/System/Contract'
}
]
},
在src/pages目录下创建haoke文件夹,项目中的页面代码均放在此目录中:


修改,进入系统后,默认打开房源管理页面:

楼盘数据(estate)
| 字段 | 类型 | 备注 |
|---|---|---|
| id | Long | 楼盘id |
| name | String | 楼盘名称 |
| province | String | 所在省 |
| city | String | 所在市 |
| area | String | 所在区 |
| address | String | 具体地址 |
| year | String | 建筑年代 |
| type | String | 建筑类型 |
| propertyCost | String | 物业费 |
| propertyCompany | String | 物业公司 |
| developers | String | 开发商 |
| created | datetime | 创建时间 |
| updated | datetime | 更新时间 |
房源数据(houseResources)
| 字段 | 类型 | 备注 |
|---|---|---|
| id | Long | 房源id |
| title | String | 房源标题,如:南北通透,两室朝南,主卧带阳台 |
| estateId | Long | 楼盘id |
| buildingNum | String | 楼号(栋) |
| buildingUnit | String | 单元号 |
| buildingFloorNum | String | 门牌号 |
| rent | int | 租金 |
| rentMethod | int | 租赁方式,1-整租,2-合租 |
| paymentMethod | int | 支付方式,1-付一押一,2-付三押一,3-付六押一,4-年付押一,5-其它 |
| houseType | String | 户型,如:2室1厅1卫 |
| coveredArea | String | 建筑面积 |
| useArea | String | 使用面积 |
| floor | String | 楼层,如:8/26 |
| orientation | int | 朝向:东、南、西、北 |
| decoration | String | 装修,1-精装,2-简装,3-毛坯 |
| facilities | String | 配套设施, 如:1,2,3 |
| pic | String | 图片,最多5张 |
| desc | String | 房源描述,如:出小区门,门口有时代联华超市,餐饮有川菜馆,淮南牛肉汤,黄焖鸡沙县小吃等;可到达亲水湾城市生活广场,里面有儿童乐园,台球室和康桥健身等休闲娱乐;生活广场往北沿御水路往北步行一公里就是御桥路,旁边就是御桥地铁站,地铁站商场… |
| contact | String | 联系人 |
| mobile | String | 手机号 |
| time | int | 看房时间,1-上午,2-中午,3-下午,4-晚上,5-全天 |
| propertyCost | String | 物业费 |
| created | datetime | 创建时间 |
| updated | datetime | 更新时间 |

在页面中,通过@Form.create()对页面进行了包装,包装之后,会在this.props中增加form对象,该对象将包含有丰富的功能。
在from表单中,需要通过getFieldDecorator(表单数据双向绑定)方法进行包装注册,才能获取到其值

<FormItem {...formItemLayout} label="支付方式">
{getFieldDecorator('paymentMethod',{initialValue:'1',rules:[{ required: true, message:"此项为必填项" }]})
(
<Select style={{ width: '50%' }}>
<Option value="1">付一押一</Option>
<Option value="2">付三押一</Option>
<Option value="3">付六押一</Option>
<Option value="4">年付押一</Option>
<Option value="5">其它</Option>
</Select>
)}
</FormItem>

在getFieldDecorator的参数中可以增加校验规则
{initialValue:'1',rules:[{ required: true, message:"此项为必填项" }]}
表单的提交通过submit按钮完成,通过onSubmit方法进行拦截处理。

handleSubmit = e => {
const { dispatch, form } = this.props;
e.preventDefault();
console.log(this.state.fileList);
form.validateFieldsAndScroll((err, values) => {
if (!err) {
if(values.facilities){
values.facilities = values.facilities.join(",");
}
if(values.floor_1 && values.floor_2){
values.floor = values.floor_1 + "/" + values.floor_2;
}
values.houseType = values.houseType_1 + "室" + values.houseType_2 + "厅"
+ values.houseType_3 + "卫" + values.houseType_4 + "厨"
+ values.houseType_2 + "阳台";
delete values.floor_1;
delete values.floor_2;
delete values.houseType_1;
delete values.houseType_2;
delete values.houseType_3;
delete values.houseType_4;
delete values.houseType_5;
dispatch({
type: 'form/submitRegularForm',
payload: values,
});
}
});
};
通过form.validateFieldsAndScroll()对表单进行校验,通过values获取表单中输入的值。通过dispatch()调用model中定义的方法。

const estateMap = new Map([
['中远两湾城','1001|上海市,上海市,普陀区,远景路97弄'],
['上海康城','1002|上海市,上海市,闵行区,莘松路958弄'],
['保利西子湾','1003|上海市,上海市,松江区,广富林路1188弄'],
['万科城市花园','1004|上海市,上海市,闵行区,七莘路3333弄2区-15区'],
['上海阳城','1005|上海市,上海市,闵行区,罗锦路888弄']
]);
<FormItem {...formItemLayout} label="楼盘名称">
<AutoComplete
style={{ width: '100%' }}
dataSource={this.state.estateDataSource}
placeholder="搜索楼盘"
onSelect={(value, option)=>{
let v = estateMap.get(value);
this.setState({
estateAddress: v.substring(v.indexOf('|')+1),
estateId : v.substring(0,v.indexOf('|'))
});
}}
onSearch={this.handleSearch}
filterOption={(inputValue, option) => option.props.children.toUpperCase().indexOf(inputValue.toUpperCase()) !== -1}
/>
</FormItem>
handleSearch = (value)=>{
let arr = new Array();
if(value.length > 0 ){
estateMap.forEach((v, k) => {
if(k.startsWith(value)){
arr.push(k);
}
});
}
this.setState({
estateDataSource: arr
});
} ;


图片上传通过自定义组件PicturesWall完成,在PicturesWall中,通过Upload组件实现
在代码实现中,需要解决的问题是:父组件如何获取子组件中的数据。
解决思路:父组件通过属性的方式进行引用子组件,在bind方法中改变this的引用为父组件,在子组件中,通过this.props获取传入的函数,进行调用,即可把数据传递到父组件中

<FormItem {...formItemLayout} label="上传室内图">
<PicturesWall handleFileList={this.handleFileList.bind(this)}/>
</FormItem>
handleChange = ({ fileList }) => {
this.setState({ fileList });
this.props.handleFileList(this.state.fileList);
}
handleFileList = (obj)=>{
console.log(obj, "图片列表");
}

链接:https://pan.baidu.com/s/1VJZwJdnMGNzeuWH4nbBDRw?pwd=3i3x
提取码:3i3x
–来自百度网盘超级会员V3的分享