Java源码程序设计-房屋出租管理系统设计与实现

news2025/6/9 4:42:57

    • 摘 要
    • 系统设计
    • 系统实现
    • 开发环境

摘 要

随着我国市场经济的快速发展和人们生活水平的不断提高,简单的房屋出租服务已经不能满足人们的需求。如何利用先进的管理手段,提高房屋出租的管理水平,是当今社会所面临的一个重要课题。

本文采用结构化分析的方法,详细阐述了一个功能比较强大的中信房屋出租管理系统的前后台开发、操作流程和涉及的一些关键技术。首先进行了可行性分析,然后是系统分析,通过实际的业务流程调研,分析业务流程和系统的组织结构,完成了数据流分析和数据字典;然后是系统设计阶段主要完成了功能模块的划分、阐述了系统设计的思想、数据库的设计和系统设计的工具及技术。该阶段对本系统各个模块的功能进行了详细设计,形成了本系统的功能模块图;数据库设计时先进行了概念结构设计,然后进行了逻辑结构设计,最后完成了数据表的设计。

目前在本课题范围内,分析了房屋出租管理人员对房屋的管理现状和现有的用户对房屋管理人员的服务的要求。针对两者的要求,设计了一套基于SpringMVC的公寓出租管理系统。本系统的集成开发环境是Eclipse,使用MySQL作为数据库管理系统,Web服务器采用Tomcat,运用SpringMVC及Spring3.0框架技术实现。为了充分利用网络信息化的优势,本系统采用B/S结构。系统具有专门的供用户使用的前台和专门供公寓出租管理人员使用的后台。

在房屋出租管理系统的实现下,网站管理人员能够充分发挥信息化处理的优势,提高日常管理的处理速率。用户一方可以更好的享受信息化处理带来的便利。系统运行能够稳定且高效。并且人机友好程度能够显著提升。

关键词:公寓出租管理,SpringMVC,B/S

系统设计

img

系统实现

核心功能实现

在房屋出租管理系统中,核心业务用例的实现效果如下所示。受篇幅所限,将只会显示和租赁、房屋管理相关的三个模块核心功能。

(1) 用户对房屋租赁模块实现

用户对房屋进行租赁操作,采用 Ajax发送异步请求将租赁信息发送到控制层,控制层发送数据到业务逻辑层,业务逻辑层通过调用 DAO层来访问数据库从而执行插入并返回结果。

image-20230209101505543

(2) 房屋管理员对房屋管理功能模块

房屋管理人员对房屋的基本信息进行增删改查操作,采用Ajax发送异步请求将房屋信息发送到控制层,控制层发送数据到业务逻辑层,业务逻辑层通过调用 DAO层来访问数据库从而执行更改并返回结果。image-20230209101618919

(3) 房屋管理人员对租赁订单管理功能模块

房屋管理人员对用户前台下的订单信息进行增删改查操作,采用Ajax发送异步请求将租赁信息发送到控制层,控制层发送数据到业务逻辑层,业务逻辑层通过调用 DAO层来访问数据库从而执行更改并返回结果。

image-20230209101739226

@RequestMapping(value="/book_order",method=RequestMethod.POST)
	@ResponseBody
	public Map<String,String> bookOrderAct(BookOrder bookOrder,HttpServletRequest request){
		Map<String, String> ret = new HashMap<String, String>();
		if(bookOrder == null){
			ret.put("type", "error");
			ret.put("msg", "请填写正确的出租订单信息!");
			return ret;
		}
		Account account = (Account)request.getSession().getAttribute("account");
		if(account == null){
			ret.put("type", "error");
			ret.put("msg", "客户不能为空!");
			return ret;
		}
		bookOrder.setAccountId(account.getId());
		if(bookOrder.getRoomTypeId() == null){
			ret.put("type", "error");
			ret.put("msg", "房屋不能为空!");
			return ret;
		}
		if(StringUtils.isEmpty(bookOrder.getName())){
			ret.put("type", "error");
			ret.put("msg", "出租订单联系人名称不能为空!");
			return ret;
		}
		if(StringUtils.isEmpty(bookOrder.getMobile())){
			ret.put("type", "error");
			ret.put("msg", "出租订单联系人手机号不能为空!");
			return ret;
		}
		if(StringUtils.isEmpty(bookOrder.getIdCard())){
			ret.put("type", "error");
			ret.put("msg", "联系人身份证号不能为空!");
			return ret;
		}
//		if(StringUtils.isEmpty(bookOrder.getArriveDate())){
//			ret.put("type", "error");
//			ret.put("msg", "租赁时间不能为空!");
//			return ret;
//		}
//		if(StringUtils.isEmpty(bookOrder.getLeaveDate())){
//			ret.put("type", "error");
//			ret.put("msg", "结算时间不能为空!");
//			return ret;
//		}
		bookOrder.setCreateTime(new Date());
		bookOrder.setStatus(0);
		if(bookOrderService.add(bookOrder) <= 0){
			ret.put("type", "error");
			ret.put("msg", "添加失败,请联系管理员!");
			return ret;
		}
		RoomType roomType = roomTypeService.find(bookOrder.getRoomTypeId());
		//出租成功后去修改该房屋的出租数
		if(roomType != null){
			roomType.setBookNum(roomType.getBookNum() + 1);
			roomType.setAvilableNum(roomType.getAvilableNum() - 1);
			roomTypeService.updateNum(roomType);
			//如果可用的房间数为0,则设置该房屋状态已租赁
			if(roomType.getAvilableNum() == 0){
				roomType.setStatus(0);
				roomTypeService.edit(roomType);
			}
		}
		ret.put("type", "success");
		ret.put("msg", "出租成功!");
		return ret;
	}

@RequestMapping(value="/add",method=RequestMethod.POST)
	@ResponseBody
	public Map<String, String> add(RoomType roomType){
		Map<String, String> ret = new HashMap<String, String>();
		if(roomType == null){
			ret.put("type", "error");
			ret.put("msg", "请填写正确的房屋类型信息!");
			return ret;
		}
		if(StringUtils.isEmpty(roomType.getName())){
			ret.put("type", "error");
			ret.put("msg", "房屋类型名称不能为空!");
			return ret;
		}
		roomType.setAvilableNum(roomType.getRoomNum());//默认房屋数等于可用房屋数
		roomType.setBookNum(0);//设置租赁数0
		roomType.setLivedNum(0);//设置已租赁数0
		if(roomTypeService.add(roomType) <= 0){
			ret.put("type", "error");
			ret.put("msg", "添加失败,请联系管理员!");
			return ret;
		}
		ret.put("type", "success");
		ret.put("msg", "添加成功!");
		return ret;
	}
	
	/**
	 * 房屋类型信息编辑操作
	 * @param roomType
	 * @return
	 */
	@RequestMapping(value="/edit",method=RequestMethod.POST)
	@ResponseBody
	public Map<String, String> edit(RoomType roomType){
		Map<String, String> ret = new HashMap<String, String>();
		if(roomType == null){
			ret.put("type", "error");
			ret.put("msg", "请填写正确的房屋类型信息!");
			return ret;
		}
		if(StringUtils.isEmpty(roomType.getName())){
			ret.put("type", "error");
			ret.put("msg", "房屋类型名称不能为空!");
			return ret;
		}
		RoomType existRoomType = roomTypeService.find(roomType.getId());
		if(existRoomType == null){
			ret.put("type", "error");
			ret.put("msg", "未找到该数据!");
			return ret;
		}
		int offset = roomType.getRoomNum() - existRoomType.getRoomNum();
		roomType.setAvilableNum(existRoomType.getAvilableNum() + offset);
		if(roomType.getAvilableNum() <= 0){
			roomType.setAvilableNum(0);//没有可用房屋
			roomType.setStatus(0);//房型已满
			if(roomType.getAvilableNum() + existRoomType.getLivedNum() + existRoomType.getBookNum() > roomType.getRoomNum()){
				ret.put("type", "error");
				ret.put("msg", "房屋数设置不合理!");
				return ret;
			}
		}
		if(roomTypeService.edit(roomType) <= 0){
			ret.put("type", "error");
			ret.put("msg", "修改失败,请联系管理员!");
			return ret;
		}
		ret.put("type", "success");
		ret.put("msg", "修改成功!");
		return ret;
	}

开发环境

开发工具:idea、Navicat

数据库:MySQL8.0

环境配置:jdk1.8 、Tomcat8.5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Win10系统电脑开机后总是蓝屏无法使用怎么办?

Win10系统电脑开机后总是蓝屏无法使用怎么办&#xff1f;电脑开机的时候出现了蓝屏问题&#xff0c;这个情况是我们的电脑系统不兼容导致的。遇到这个问题一般是需要去进行系统的重装来解决&#xff0c;安装一个更兼容的系统就可以解决问题了。一起来看看详细的解决方法分享吧。…

前端学习第八站——CSS定位和装饰

目录 一、定位 1.1 网页常见布局方式 1.2 定位的常见应用场景 2.1 定位初体验 2.2 使用定位 3.1 静态定位 4.1 相对定位 5.1 绝对定位 6.1 子绝父相 7. 固定定位 8.1 定位的层级关系 8.2 更改定位元素的层级 9.总结 二、装饰 1.1 了解基线 1.2 文字对齐问…

安卓小游戏:小板弹球

安卓小游戏&#xff1a;小板弹球 前言 这个是通过自定义View实现小游戏的第三篇&#xff0c;是小时候玩的那种五块钱的游戏机上的&#xff0c;和俄罗斯方块很像&#xff0c;小时候觉得很有意思&#xff0c;就模仿了一下。 需求 这里的逻辑就是板能把球弹起来&#xff0c;球…

股票交易开放接口是什么意思?

在股票量化市场上&#xff0c;大家可能对股票交易开放接口的意思不太理解&#xff0c;其实换个角度来看&#xff0c;就是关于由开发团队进行开发的股票交易开放接口&#xff0c;那么对于接口的开发原理跟代码是怎么样的呢&#xff1f;一、股票交易开放接口函数的调用&#xff1…

面试的同学看这里!这套Java面试八股文,已经帮助200+人进入大厂

在看这篇文章之前&#xff0c;我想我们需要先搞明白八股文是什么&#xff1f;&#xff1f;&#xff1f; 明清科举考试的一种文体&#xff0c;也称制义、制艺、时文、八比文。八股文章就四书五经取题&#xff0c;内容必须用古人的语气&#xff0c;绝对不允许自由发挥&#xff0c…

Git 常用命令

一、基本的git命令 1、查看现在在哪个分支 git branch 2、切换到某分支 git checkout 某分支 3、添加修改后的代码到缓存区 git add . 4、添加提交代码的备注 git commit -m "注释" 5、提交代码到指定的分支 git push origin 某分支 6、从远程仓库克隆git仓库…

四 、QML常用控件的使用详解

在Qt Quick的世界里&#xff0c;window对象用于创建一个与操作系统相关的顶层窗口&#xff0c;而其他的元素&#xff0c;如Text Rectangle,Image等&#xff0c;都睡Windows提功能场景里面的显示对象&#xff0c;Window还有一个派生类&#xff0c;即是大名鼎鼎的Application Win…

基于DSP+FPGA高速运动控制器设计

基于“PC运动控制器”结构的开放式机器人运动控制系统能够充分利用PC开放程 度高、通用性好、处理能力强等特点以及运动控制器运算速度快、实时性能好、控制能 力强等特点&#xff0c;因此得到较快发展&#xff0c;成为目前的研究热点。但目前采用此种结构的开放式 机器人运动控…

3D模型深度生成网络【ShapeAssembly】

推荐&#xff1a;使用 NSDT场景设计器 快速搭建 3D场景。 我们提出了一个深度生成模型&#xff0c;该模型学习在ShapeAssembly中编写新颖的程序&#xff0c;ShapeAssembly是一种用于建模3D形状结构的特定领域语言。 执行 ShapeAssembly 程序会生成一个由部件代理长方体的分层连…

HashMap put() 方法源码分析

文章目录一、前置知识红黑树定义二、构造方法HashMap()HashMap(int initialCapacity, float loadFactor)tableSizeFor(int cap)&#xff1a;计算hashmap初始容量三、put 方法源码1. put()hash(Object key)&#xff1a;计算key的hash值2. putVal()通过 hash 计算数组下标3. resi…

jdk版本切换工具jenv使用指南

1.下载jenv包 下载链接&#xff1a;GitHub - FelixSelter/JEnv-for-Windows: Change your current Java version with one line 下载包的文件&#xff1a;JEnv.zip 然后解压缩&#xff0c;放到一个目录下&#xff0c;我这里放到了目录&#xff1a;D:\tools\JEnv 2.将JENV添…

chatGPT学习

最近看到一个火爆的AI智能聊天工具&#xff1a;ChatGPT。它的功能&#xff1a;文能写文章&#xff0c;武能改BUG&#xff0c;马斯克对它的评价是“Scary Good!”。我非常感兴趣&#xff0c;就试用了一下&#xff0c;感觉还不错&#xff0c;希望大家能喜欢。 ChatGPT&#xff0…

炼石完成近亿元A+轮融资,冲刺1500亿数据安全赛道

近日&#xff0c;炼石宣布完成近亿元A轮融资&#xff0c;本轮融资由重庆科技成果转化基金独家投资&#xff0c;由清科资本担任独家财务顾问&#xff0c;这是继安天科技、安云资本、国科嘉和、腾讯等多轮之后的新一轮投资。随着本轮资金的引入&#xff0c;炼石将更深入研发迭代以…

MASA Stack 1.0 发布会讲稿 —— 产品篇

架构 基于MASA的云原生技术架构 我们基于MASA去做了一个云原生技术架构&#xff0c;左下角的MASA Blazor主要是为我们去集成一个多端的UI能力&#xff0c;具体的使用场景将在实践篇为大家介绍——MASA Blazor如何去做多端的 接着就是集成非业务能力的MASA Framework&#xff…

1.Docker 简介

Docker 简介 什么是 Docker&#xff1f; Docker的英文翻译是“搬运工”的意思&#xff0c;他搬运的东西就是我们常说的集装箱Container&#xff0c;Container 里面装的是任意类型的 App&#xff0c;我们的开发人员可以通过 Docker 将App 变成一种标准化的、可移植的、自管理的…

C语言位运算

所谓位运算&#xff0c;就是对一个比特&#xff08;Bit&#xff09;位进行操作。比特&#xff08;Bit&#xff09;是一个电子元器件&#xff0c;8个比特构成一个字节&#xff08;Byte&#xff09;&#xff0c;它已经是粒度最小的可操作单元了。C语言提供了六种位运算符&#xf…

linux系统下centos7 或 openwrt安装 使用 SpeedTest 测速

博主博客 https://blog.uso6.com https://blog.csdn.net/dxk539687357 一、测试本地是否安装 python(已安装可以跳过) 1.在命令行中输入rpm -qa | grep python36 判断是否已经安装 python3。 2.如果没有安装输入 yum install python36 进行安装。 二、测试 CentOS 到 Speed Te…

响应式布局以及提交网站

1.慕客协作平台1. /摹客官网地址&#xff1a; https://www.mockplus.cn/ 注册一个账号2. 下载moke ps插件 3. PS 安装/摹客/蓝湖插件3. 打开PS/摹客/蓝湖插件4. 上传&#xff08;需要切图&#xff0c;需要先标注切图&#xff09;5. 查看项目6. 邀请成员进入&#xff08;分享按钮…

【Java 面试合集】简述下自定义异常的应用场景

简述下自定义异常的应用场景 1. 概述 如上图所示&#xff0c;我们想回答这个问题就要了解异常的基本结构。哪些是我们可以控制的&#xff0c;哪些是我们不能控制的。 也许有人会问了&#xff0c;其实在逻辑中可以多加判断&#xff0c;为什么要需要自定义呢。 其实判断的内容无…

rigol 普源MSO5104数字示波器技术参数

MSO5000系列数字示波器是基于RIGOL UltraVision II代技术的高性能中低端数字示波器&#xff0c;采用9英寸多点电容触摸屏&#xff0c;集7种仪器于一身。具有超高的采样带宽比和存储深度等优异的性能指标&#xff0c;以及精巧便携的外观设计。高集成度的ASIC芯片组和创新性的前端…