本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。
系统的选题背景和意义
选题背景: 随着城市化进程的加快和人口流动的增加,房屋租赁市场成为了现代社会中一个重要的领域。然而,传统的房屋租赁方式存在一些问题,如信息不对称、租赁流程繁琐、合同纠纷等。为了解决这些问题,越来越多的房屋租赁平台开始采用前后端分离的技术架构,以提供更好的用户体验和服务质量。
选题意义: 基于前后端分离的房屋租赁平台的设计与实现对于改善房屋租赁市场的运作方式具有重要意义。首先,通过前后端分离的技术架构,平台可以提供更快速、稳定的响应速度和更好的用户界面。前端部分负责展示房屋信息、搜索筛选功能等,而后端则负责处理数据逻辑和交互操作。这种分离的架构可以使得前端和后端各自专注于自己的工作,提高开发效率和系统性能。
其次,该平台可以通过前后端分离的方式实现更灵活的功能扩展和升级。由于前后端分离的架构将前端和后端解耦,使得二者可以独立开发和部署。这样一来,当需要新增功能或进行系统升级时,可以只对其中一个部分进行修改,而不会影响到整个系统的运行。这种灵活性可以大大减少系统维护和更新的成本,提高平台的可扩展性和可维护性。
此外,基于前后端分离的房屋租赁平台还可以提供更好的用户体验和交互方式。通过采用现代化的前端技术和设计风格,平台可以提供直观、友好的用户界面,使用户能够轻松浏览房屋信息、进行筛选和预订等操作。同时,通过与第三方支付、地图导航等服务的集成,平台可以为用户提供更便捷的租赁流程和全面的服务支持。
最后,该平台还可以通过前后端分离的架构实现更好的安全性和数据保护。通过合理的权限管理和数据加密措施,平台可以保护用户的个人信息和交易数据的安全。同时,由于前后端分离的架构可以将敏感数据存储在后端服务器上,减少了前端被攻击的风险,提高了系统的安全性和稳定性。
以上选题背景和意义内容是根据本选题撰写,非本作品实际的选题背景、意义或功能。各位童鞋可参考用于写开题选题和意义内容切勿直接引用。本作品的实际功能和技术以下列内容为准。
技术栈:
本项目的技术栈主要包括前端Vue、后端Java程序语言开发、SSM框架和MySQL5.7数据库。
Vue是一种轻量级的JavaScript框架,能够快速构建交互式的用户界面。Vue提供了易于使用的API,使得开发者可以非常容易地创建组件化、可复用的代码。
Java是一种跨平台的编程语言,拥有丰富的库和工具生态系统,广泛用于企业级应用开发。Java在后端服务开发方面拥有强大的性能和可伸缩性,并且能够很好地与其他技术栈集成,如Spring、Hibernate、MyBatis等。
SSM框架是Spring、SpringMVC和MyBatis三个框架的结合体,其整合了各自优势,形成了完整的Web开发框架。本系统客户端向服务器发送请求,SpringMVC拦截请求交给相应的控制器(Controller)处理,使用注解或配置文件定义URL和方法映射,控制器调用Service层中的业务逻辑处理方法,Service层处理完毕后将结果返回给控制器,控制器根据返回的结果选择适当的视图(View)进行展示,视图渲染完成后返回给客户端的过程。
MySQL5.7是一种开源的关系型数据库管理系统,在数据存储和管理方面表现优异。它能够轻松地集成到任何技术栈中,如Java、Python、Ruby等。除此之外,MySQL还具备高可靠性、高稳定性、易扩展性和强数据安全性等特点。
我们选择Vue、Java、SSM框架和MySQL5.7作为本作品的技术栈,具有语言间的无缝协作、代码复用性强、开发效率高、性能高等诸多优势。
系统对这些功能进行整合,产生的功能结构图如下:
图4-1系统功能结构图
4.3 数据库设计与实现
在每一个系统中数据库有着非常重要的作用,数据库的设计得好将会增加系统的效率以及系统各逻辑功能的实现。所以数据库的设计我们要从系统的实际需要出发,才能使其更为完美的符合系统功能的实现。
4.3.1 数据库设计规范
数据可设计要遵循职责分离原则,即在设计时应该要考虑系统独立性,即每个系统之间互不干预不能混乱数据表和系统关系。
数据库命名也要遵循一定规范,否则容易混淆,数据库字段名要尽量做到与表名类似,多使用小写英文字母和下划线来命名并尽量使用简单单词。
4.3.2 数据库概念结构设计
数据库的E-R图反映了实体、实体的属性和实体之间的联系。下面是各个实体以及实体的属性。
1. 房源信息实体
房源信息实体包括房源名称、房屋分类、房子户型、房源位置、图片、发布时间、房源面积、租赁价格、房东账号、房东姓名、房东电话、状态、房源介绍等属性。房源信息实体图如图4-2所示:
图4-2房源信息实体图
2. 小区实体
小区实体包括小区名称、小区封面、小区面积、小区位置、小区栋数等属性;小区实体图如图4-3所示:
系统首页的设计
该界面是房屋租赁app的首页,界面设置要求界面简洁明了、操作简单、兼容性好。在考虑设计界面时,首先要考虑界面标准化设计,其次是完善界面设计,但不要因对界面的美化使界面的操作变得复杂,用户可在此页面进行登录等操作,页面顶部导航条是各模块的入口。
租房者登录,租房者进入app,输入自己的账号和密码进行系统登录操作,如图5-1所示。
图5-1登录界面图
其代码如下:
form.on('submit(login)', function(data) {
data = data.field;
if (vue.roles.length!=1) {
if (!data.role) {
layer.msg('请选择登录用户类型', {
time: 2000,
icon: 5
});
return false;
}
} else {
data.role = vue.roles[0].tableName;
}
http.request(data.role + '/login', 'get', data, function(res) {
layer.msg('登录成功', {
time: 2000,
icon: 6
});
// 登录凭证
localStorage.setItem('Token', res.token);
var roleName = "";
if(typeof(jquery('#role:checked').attr('title')) == "undefined") {
roleName = vue.roles[0].roleName;
} else {
roleName = jquery('#role:checked').attr('title');
}
localStorage.setItem('role', roleName);
// 当前登录用户角色
localStorage.setItem('userTable', data.role);
localStorage.setItem('sessionTable', data.role);
// 用户名称
localStorage.setItem('adminName', data.username);
http.request(data.role + '/session', 'get', {}, function(res) {
// 用户id
localStorage.setItem('userid', res.data.id);
if(res.data.vip) {
localStorage.setItem('vip', res.data.vip);
}
// 路径访问设置
window.location.href = '../../index.html';
})
});
return false
});
});
/**
* 跳转登录
* @param {Object} tablename
*/
function registerClick(tablename) {
window.location.href = '../' + tablename + '/register.html?tablename=' + tablename;
}
租房者注册,进入租房者注册页面,通过填写租房者账号、密码、确认密码、租房者姓名、性别、租房者电话等信息进行注册操作,如图5-2所示。
图5-2租房者注册界面图
其代码如下:
*/
@IgnoreAuth
@RequestMapping("/register")
public R register(@RequestBody YonghuEntity yonghu){
//ValidatorUtils.validateEntity(yonghu);
YonghuEntity user = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("yonghuming", yonghu.getYonghuming()));
if(user!=null) {
return R.error("注册用户已存在");
}
Long uId = new Date().getTime();
yonghu.setId(uId);
yonghuService.insert(yonghu);
return R.ok();
}
租房者登陆系统后,可以对首页、房源信息、公告资讯、我的等内容进行详细操作,如图5-3所示。
图5-3 app首页界面图
其代码如下:
methods: {
jump(url) {
if (this.queryIndex == 0) {
localStorage.setItem('indexQueryCondition', document.getElementById("dianyingxinxidianyingmingcheng").value);
}
jump(url)
},
queryChange(event) {
this.queryIndex = event.target.value;
if (this.queryIndex == 0) {
this.dianyingxinxidianyingmingcheng = this.queryList[event.target.value].queryName;
}
}
}
});
layui.use(['layer', 'form', 'element', 'carousel', 'http', 'jquery'], function() {
var layer = layui.layer;
var element = layui.element;
var form = layui.form;
var carousel = layui.carousel;
var http = layui.http;
var jquery = layui.jquery;
vue.baseurl=http.baseurl;
// 获取轮播图 数据
http.request('config/list', 'get', {
page: 1,
limit: 5
}, function(res) {
if (res.data.list.length > 0) {
let swiperList = [];
res.data.list.forEach(element => {
if (element.value != null) {
swiperList.push({
img: http.baseurl + element.value
});
}
});
vue.swiperList = swiperList;
vue.$nextTick(() => {
carousel.render({
elem: '#test1',
width: '89.6%',
height: '500px',
arrow: 'hover',
anim: 'default',
autoplay: 'true',
interval: '3000',
indicator: 'inside'
});
})
// vue.$nextTick(()=>{
// window.xznSlide();
// });
}
});
http.request('news/list', 'get', {
page: 1,
order: 'desc'
}, function(res) {
var newsList = res.data.list;
for(var i = 0; i<newsList.length; i++) {
let d = newsList[i].addtime.split(' ')
d = d[0].split('-')
newsList[i].year = d[0]
newsList[i].month = d[1] + '-' + d[2]
}
vue.newsList = newsList;
if (newsList.length > 0 && newsList.length <= 2) {
vue.leftNewsList = res.data.list
} else {
var leftNewsList = []
for (let i = 0; i <= 2; i++) {
leftNewsList.push(newsList[i]);
}
vue.leftNewsList = leftNewsList
}
if (newsList.length > 2 && newsList.length <= 8) {
var rightNewsList = []
for (let i = 3; i <= newsList.length; i++) {
rightNewsList.push(newsList[i]);
}
vue.rightNewsList = rightNewsList
}
let flag = 10;
let options = {"navigation":{"nextEl":".swiper-button-next","prevEl":".swiper-button-prev"},"slidesPerView":5,"loop":true,"spaceBetween":20,"autoplay":{"delay":3000,"disableOnInteraction":false}}
options.pagination = {el:'null'}
if(flag == 3) {
vue.$nextTick(() => {
new Swiper('#newsnews', options)
})
}
if(flag == 6) {
let sixSwiper = {
loop: true,
speed: 2500,
slidesPerView: 3,
spaceBetween: 10,
centeredSlides: true,
watchSlidesProgress: true,
autoplay: {
delay: 0,
stopOnLastSlide: false,
disableOnInteraction: false
}
}
vue.$nextTick(() => {
new Swiper('#new-list-6', sixSwiper)
})
}
});
// 获取推荐信息
var autoSortUrl = "dianyingxinxi/autoSort";
if(localStorage.getItem('userid')!=null) {
autoSortUrl = "dianyingxinxi/autoSort2";
}
http.request(autoSortUrl, 'get', {
page: 1,
limit: 3 * 1
}, function(res) {
vue.dianyingxinxiRecommend = res.data.list
let flag = 1;
let options = {"navigation":{"nextEl":".swiper-button-next","prevEl":".swiper-button-prev"},"slidesPerView":5,"loop":true,"spaceBetween":20,"autoplay":{"delay":3000,"disableOnInteraction":false}}
options.pagination = {el:'null'}
if(flag == 3) {
vue.$nextTick(() => {
new Swiper('#recommenddianyingxinxi', options)
})
}
if(flag == 5) {
vue.$nextTick(() => {
var swiper = new Swiper('#recommend-five-swiperdianyingxinxi', {
loop: true,
speed: 500,
slidesPerView: 5,
spaceBetween: 10,
autoplay: {"delay":3000,"disableOnInteraction":false},
centeredSlides: true,
watchSlidesProgress: true,
on: {
setTranslate: function() {
slides = this.slides
for (i = 0; i < slides.length; i++) {
slide = slides.eq(i)
progress = slides[i].progress
// slide.html(progress.toFixed(2)); //看清楚progress是怎么变化的
slide.css({
'opacity': '',
'background': ''
});
slide.transform(''); //清除样式
slide.transform('scale(' + (1.5 - Math.abs(progress) / 4) + ')');
}
},
setTransition: function(transition) {
for (var i = 0; i < this.slides.length; i++) {
var slide = this.slides.eq(i)
slide.transition(transition);
}
},
},
navigation: {"nextEl":".swiper-button-next","prevEl":".swiper-button-prev"},
pagination: {"el":".swiper-pagination","clickable":true},
});
})
}
});
});
房源信息,在房源信息页面可以查看房源名称、房屋分类、房子户型、房源位置、图片、发布时间、房源面积、租赁价格、房东账号、房东姓名、房东电话、状态、房源介绍等信息,可根据需要进行租赁,评论或收藏操作,如图5-4所示。
图5-4房源信息界面图
租房者,在我的页面可以对个人中心、房源信息、租赁信息、续租信息、评价房东、评价租客、我的收藏管理等详细信息进行操作,如图5-5所示。
图5-5租房者管理界面图
租房者信息,在用户信息页面通过填写租房者账号、密码、租房者姓名、性别、租房者电话、头像等信息进行保存或退出登录操作,如图5-6所示。
图5-6租房者信息界面图
5.2后端功能模块
后端登录,管理员通过输入用户名,密码,选择角色等信息,点击登录进入系统进行操作,如图5-7所示。
图5-7后端登录界面图
其代码如下:
mounted() {
let menus = menu.list();
this.menus = menus;
},
created() {
this.getRandCode()
},
methods: {
register(tableName){
this.$storage.set("loginTable", tableName);
this.$router.push({path:'/register'})
},
// 登陆
login() {
if (!this.rulesForm.username) {
this.$message.error("请输入用户名");
return;
}
if (!this.rulesForm.password) {
this.$message.error("请输入密码");
return;
}
if (!this.rulesForm.role) {
this.$message.error("请选择角色");
return;
}
let menus = this.menus;
for (let i = 0; i < menus.length; i++) {
if (menus[i].roleName == this.rulesForm.role) {
this.tableName = menus[i].tableName;
}
}
this.$http({
url: `${this.tableName}/login?username=${this.rulesForm.username}&password=${this.rulesForm.password}`,
method: "post"
}).then(({ data }) => {
if (data && data.code === 0) {
this.$storage.set("Token", data.token);
this.$storage.set("role", this.rulesForm.role);
this.$storage.set("sessionTable", this.tableName);
this.$storage.set("adminName", this.rulesForm.username);
this.$router.replace({ path: "/index/" });
} else {
this.$message.error(data.msg);
}
});
},
5.2.1管理员功能模块
管理员登陆系统后,可以查看首页、个人中心、租房者管理、房东管理、小区管理、房屋分类管理、房源信息管理、租赁信息管理、续租信息管理、评价房东管理、评价租客管理、系统管理等功能,还能对每个功能逐一进行相应操作,如图5-8所示。
图5-8管理员功能界面图
租房者管理,在租房者管理页面可以对索引、租房者账号、租房者姓名、性别、租房者电话、头像等内容进行详情,修改或删除等操作,如图5-9所示。
图5-9租房者管理界面图
房东管理,在房东管理页面可以对索引、房东账号、房东姓名、性别、房东电话、头像等内容进行详情,修改和删除操作,如图5-10所示。
图5-10房东管理界面图
小区管理,在小区管理页面可以对索引、小区名称、小区封面、小区面积、小区位置、小区栋数等内容进行详情,修改或删除操作,如图5-11所示。
图5-11小区管理界面图
房屋分类管理,在房屋分类管理页面可以对索引、房屋分类等内容进行修改和删除操作,如图5-12所示。
图5-12房屋分类管理界面图
房源信息管理,在房源信息管理页面可以对索引、房源名称、房屋分类、房子户型、房源图片、房源位置、发布时间、房源面积、租赁价格、房东账号、房东姓名、房东电话、状态等内容进行详情,修改,查看评论或删除操作,如图5-13所示。
图5-13房源信息管理界面图
租赁信息管理,在租赁信息管理页面可以对索引、租赁编号、房源名称、房屋分类、房源图片、房源位置、租赁时间、租赁价格、押金、租赁费用、到期截止、租房合同、房东账号、房东姓名、房东电话、总价、是否支付、审核回复、审核状态等内容进行详情,修改或删除操作,如图5-14所示。
图5-14租赁信息管理界面图
续租信息管理,在续租信息管理页面可以对索引、续租编号、房源名称、房屋分类、房源图片、续租时间、租赁价格、房东账号、房东姓名、租房者账号、租房者姓名、是否支付、审核回复、审核状态等内容进行详情,修改或删除操作,如图5-15所示。
图5-15续租信息管理界面图