背景
大学生租房系统设计的目的是建立一个高效的平台,采用简洁高效的Java语言与Mysql数据库等技术,设计和开发了本大学生租房系统设计。该系统主要实现了用户和房主通过系统注册用户,登录系统后能够编辑自己的个人信息、查看首页,房屋信息,房屋评价,公告资讯,个人中心,后台管理,意见反馈等,还可以对后台进行操作,以及管理员可以进行首页,个人中心,房主管理,用户管理,房屋类型管理,房屋信息管理,预约看房管理,定金留房管理,租赁订单管理,房屋评价管理等功能的管理。计算机技术在现代管理中的应用,使计算机成为用户应用现代技术的重要工具,能够有效的解决获取信息便捷化、全面化的问题,提高效率。
系统主要包括首页,个人中心,房主管理,用户管理,房屋类型管理,房屋信息管理,预约看房管理,定金留房管理,租赁订单管理,房屋评价管理等功能的操作系统,管理员是整个系统的核心。而用户登录到系统前台,可以对首页,房屋信息,房屋评价,公告资讯,个人中心,后台管理,意见反馈等进行查看以及其他的操作。
相关技术
SpringBoot
SpringBoot是一个全新开源的轻量级框架。基于Spring4.0设计,其不仅继承了Spring框架原来有的优秀特性,而且还通过简化配置文件来进一步简化了Spring应用的整个搭建以及开发过程。另外在原本的Spring中由于随着项目的扩大导入的jar包数量越来越大,随之出现了jar包版本之间的兼容性问题,而此时SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性问题得到了很好的解决。
SpringBoot可以看做是Spring的加强版本,但实质上都是Spring的相关技术,有了这些优秀的开源框架,程序员在开发过程中将事半功倍。
vue
Vue是一套用于构建用户界面的渐进式的js框架,发布于2014年2月。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库( 如: vue-router,vue-resource,vuex)或既有项目整合。
系统设计
根据大学生租房系统的功能需求,进行系统设计。
前台功能:进入系统可以实现首页,房屋信息,房屋评价,公告资讯,个人中心,后台管理,意见反馈等功能进行操作;
后台主要是管理员,房主和用户,主要功能包括首页,个人中心,房主管理,用户管理,房屋类型管理,房屋信息管理,预约看房管理,定金留房管理,租赁订单管理,房屋评价管理等。
系统对这些功能进行整合,产生的功能结构图如下:
数据库设计
ER图是由实体及其关系构成的图,通过E/R图可以清楚地描述系统涉及到的实体之间的相互关系。在系统中对一些主要的几个关键实体如下图:
1.用户注册实体
用户注册实体包括用户名,密码,确认密码,姓名,手机,身份证等属性。用户注册实体图如图4-2所示:
2.房屋信息实体
房屋信息实体包括房屋类型,地区,位置,朝向,楼层,楼号,房屋面积,房屋设施,房屋状态,房屋租金,房主账号,房主姓名等属性。房屋信息实体图如图4-3所示:
数据库概念结构设计后,可以数据库概念转化实际的数据模型,这是一种数据库的逻辑结构,就是将概念结构与支持数据库管理系统的模型相符合。具体的表设计如下所示。此处只展示部分表。
系统详细设计
系统功能模块
大学生租房系统,在系统首页可以查看首页,房屋信息,房屋评价,公告资讯,个人中心,后台管理,意见反馈等内容,并进行详细操作。
房屋信息,在房屋信息页面可以查看房屋类型,地区,位置,朝向,楼层,楼号,房屋面积,房屋设施,房屋状态,房屋租金,房主账号,房主姓名等内容,并可以进行预约看房,定金留房等操作。
管理员模块
管理员登录系统后,可以对首页,个人中心,房主管理,用户管理,房屋类型管理,房屋信息管理,预约看房管理,定金留房管理,租赁订单管理,房屋评价管理等功能进行相应的操作。
房主管理,在房主管理页面可以对索引,房主账号,房主姓名,性别,照片,联系电话,身份证等内容进行详情,修改和删除等操作。
代码实现
由于代码较多,此处只展示部分代码。
房屋信息接口
/**
* 房屋信息
* 后端接口
* @author
* @email
* @date 2022-04-10 15:56:44
*/
@RestController
@RequestMapping("/fangwuxinxi")
public class FangwuxinxiController {
@Autowired
private FangwuxinxiService fangwuxinxiService;
@Autowired
private StoreupService storeupService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,FangwuxinxiEntity fangwuxinxi,
HttpServletRequest request){
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("fangzhu")) {
fangwuxinxi.setFangzhuzhanghao((String)request.getSession().getAttribute("username"));
}
EntityWrapper<FangwuxinxiEntity> ew = new EntityWrapper<FangwuxinxiEntity>();
PageUtils page = fangwuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, fangwuxinxi), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,FangwuxinxiEntity fangwuxinxi,
HttpServletRequest request){
EntityWrapper<FangwuxinxiEntity> ew = new EntityWrapper<FangwuxinxiEntity>();
PageUtils page = fangwuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, fangwuxinxi), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( FangwuxinxiEntity fangwuxinxi){
EntityWrapper<FangwuxinxiEntity> ew = new EntityWrapper<FangwuxinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( fangwuxinxi, "fangwuxinxi"));
return R.ok().put("data", fangwuxinxiService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(FangwuxinxiEntity fangwuxinxi){
EntityWrapper< FangwuxinxiEntity> ew = new EntityWrapper< FangwuxinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( fangwuxinxi, "fangwuxinxi"));
FangwuxinxiView fangwuxinxiView = fangwuxinxiService.selectView(ew);
return R.ok("查询房屋信息成功").put("data", fangwuxinxiView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
FangwuxinxiEntity fangwuxinxi = fangwuxinxiService.selectById(id);
fangwuxinxi.setClicktime(new Date());
fangwuxinxiService.updateById(fangwuxinxi);
return R.ok().put("data", fangwuxinxi);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
FangwuxinxiEntity fangwuxinxi = fangwuxinxiService.selectById(id);
fangwuxinxi.setClicktime(new Date());
fangwuxinxiService.updateById(fangwuxinxi);
return R.ok().put("data", fangwuxinxi);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody FangwuxinxiEntity fangwuxinxi, HttpServletRequest request){
fangwuxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(fangwuxinxi);
fangwuxinxiService.insert(fangwuxinxi);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody FangwuxinxiEntity fangwuxinxi, HttpServletRequest request){
fangwuxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(fangwuxinxi);
fangwuxinxiService.insert(fangwuxinxi);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody FangwuxinxiEntity fangwuxinxi, HttpServletRequest request){
//ValidatorUtils.validateEntity(fangwuxinxi);
fangwuxinxiService.updateById(fangwuxinxi);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
fangwuxinxiService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
Wrapper<FangwuxinxiEntity> wrapper = new EntityWrapper<FangwuxinxiEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("fangzhu")) {
wrapper.eq("fangzhuzhanghao", (String)request.getSession().getAttribute("username"));
}
int count = fangwuxinxiService.selectCount(wrapper);
return R.ok().put("count", count);
}
/**
* 前端智能排序
*/
@IgnoreAuth
@RequestMapping("/autoSort")
public R autoSort(@RequestParam Map<String, Object> params,FangwuxinxiEntity fangwuxinxi, HttpServletRequest request,String pre){
EntityWrapper<FangwuxinxiEntity> ew = new EntityWrapper<FangwuxinxiEntity>();
Map<String, Object> newMap = new HashMap<String, Object>();
Map<String, Object> param = new HashMap<String, Object>();
Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> entry = it.next();
String key = entry.getKey();
String newKey = entry.getKey();
if (pre.endsWith(".")) {
newMap.put(pre + newKey, entry.getValue());
} else if (StringUtils.isEmpty(pre)) {
newMap.put(newKey, entry.getValue());
} else {
newMap.put(pre + "." + newKey, entry.getValue());
}
}
params.put("sort", "clicktime");
params.put("order", "desc");
PageUtils page = fangwuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, fangwuxinxi), params), params));
return R.ok().put("data", page);
}
/**
* 协同算法(按收藏推荐)
*/
@RequestMapping("/autoSort2")
public R autoSort2(@RequestParam Map<String, Object> params,FangwuxinxiEntity fangwuxinxi, HttpServletRequest request){
String userId = request.getSession().getAttribute("userId").toString();
String inteltypeColumn = "fangwuleixing";
List<StoreupEntity> storeups = storeupService.selectList(new EntityWrapper<StoreupEntity>().eq("type", 1).eq("userid", userId).eq("tablename", "fangwuxinxi").orderBy("addtime", false));
List<String> inteltypes = new ArrayList<String>();
Integer limit = params.get("limit")==null?10:Integer.parseInt(params.get("limit").toString());
List<FangwuxinxiEntity> fangwuxinxiList = new ArrayList<FangwuxinxiEntity>();
//去重
if(storeups!=null && storeups.size()>0) {
for(StoreupEntity s : storeups) {
fangwuxinxiList.addAll(fangwuxinxiService.selectList(new EntityWrapper<FangwuxinxiEntity>().eq(inteltypeColumn, s.getInteltype())));
}
}
EntityWrapper<FangwuxinxiEntity> ew = new EntityWrapper<FangwuxinxiEntity>();
params.put("sort", "id");
params.put("order", "desc");
PageUtils page = fangwuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, fangwuxinxi), params), params));
List<FangwuxinxiEntity> pageList = (List<FangwuxinxiEntity>)page.getList();
if(fangwuxinxiList.size()<limit) {
int toAddNum = (limit-fangwuxinxiList.size())<=pageList.size()?(limit-fangwuxinxiList.size()):pageList.size();
for(FangwuxinxiEntity o1 : pageList) {
boolean addFlag = true;
for(FangwuxinxiEntity o2 : fangwuxinxiList) {
if(o1.getId().intValue()==o2.getId().intValue()) {
addFlag = false;
break;
}
}
if(addFlag) {
fangwuxinxiList.add(o1);
if(--toAddNum==0) break;
}
}
}
page.setList(fangwuxinxiList);
return R.ok().put("data", page);
}
}
预约看房
/**
* 预约看房
* 后端接口
* @author
* @email
* @date 2022-04-10 15:56:44
*/
@RestController
@RequestMapping("/yuyuekanfang")
public class YuyuekanfangController {
@Autowired
private YuyuekanfangService yuyuekanfangService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,YuyuekanfangEntity yuyuekanfang,
HttpServletRequest request){
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("fangzhu")) {
yuyuekanfang.setFangzhuzhanghao((String)request.getSession().getAttribute("username"));
}
if(tableName.equals("yonghu")) {
yuyuekanfang.setYonghuming((String)request.getSession().getAttribute("username"));
}
EntityWrapper<YuyuekanfangEntity> ew = new EntityWrapper<YuyuekanfangEntity>();
PageUtils page = yuyuekanfangService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yuyuekanfang), params), params));
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,YuyuekanfangEntity yuyuekanfang,
HttpServletRequest request){
EntityWrapper<YuyuekanfangEntity> ew = new EntityWrapper<YuyuekanfangEntity>();
PageUtils page = yuyuekanfangService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yuyuekanfang), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( YuyuekanfangEntity yuyuekanfang){
EntityWrapper<YuyuekanfangEntity> ew = new EntityWrapper<YuyuekanfangEntity>();
ew.allEq(MPUtil.allEQMapPre( yuyuekanfang, "yuyuekanfang"));
return R.ok().put("data", yuyuekanfangService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(YuyuekanfangEntity yuyuekanfang){
EntityWrapper< YuyuekanfangEntity> ew = new EntityWrapper< YuyuekanfangEntity>();
ew.allEq(MPUtil.allEQMapPre( yuyuekanfang, "yuyuekanfang"));
YuyuekanfangView yuyuekanfangView = yuyuekanfangService.selectView(ew);
return R.ok("查询预约看房成功").put("data", yuyuekanfangView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
YuyuekanfangEntity yuyuekanfang = yuyuekanfangService.selectById(id);
return R.ok().put("data", yuyuekanfang);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
YuyuekanfangEntity yuyuekanfang = yuyuekanfangService.selectById(id);
return R.ok().put("data", yuyuekanfang);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody YuyuekanfangEntity yuyuekanfang, HttpServletRequest request){
yuyuekanfang.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(yuyuekanfang);
yuyuekanfangService.insert(yuyuekanfang);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody YuyuekanfangEntity yuyuekanfang, HttpServletRequest request){
yuyuekanfang.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(yuyuekanfang);
yuyuekanfangService.insert(yuyuekanfang);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody YuyuekanfangEntity yuyuekanfang, HttpServletRequest request){
//ValidatorUtils.validateEntity(yuyuekanfang);
yuyuekanfangService.updateById(yuyuekanfang);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
yuyuekanfangService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
Wrapper<YuyuekanfangEntity> wrapper = new EntityWrapper<YuyuekanfangEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("fangzhu")) {
wrapper.eq("fangzhuzhanghao", (String)request.getSession().getAttribute("username"));
}
if(tableName.equals("yonghu")) {
wrapper.eq("yonghuming", (String)request.getSession().getAttribute("username"));
}
int count = yuyuekanfangService.selectCount(wrapper);
return R.ok().put("count", count);
}
}