@TOC
springboot0762租房网站
JAVA简介
Java主要采用CORBA技术和安全模型,可以在互联网应用的数据保护。它还提供了对EJB(Enterprise JavaBeans)的全面支持,java servlet API,Java(java server pages),和XML技术。JAVA语言是一种面向对象的语言,它通过提供最基本的方法来完成指定的任务,开发者只需要知道一些概念就能够编写出一些应用程序。Java程序相对较小,其代码能够在小机器上运行。Java是一种计算机编程语言,具有封装、继承和多态性三个主要特性,广泛应用于房东Web应用程序开发和移动应用程序开发。
Java语言和一般编译器以及直译的区别在于,Java首先将源代码转换为字节码,然后将其转换为JVM的可执行文件,JVM可以在各种不同的JVM上运行。因此,实现了它的跨平台特性。虽然这使得Java在早期非常缓慢,但是随着Java的开发,它已经得到了改进。
2.2 MySql数据库
Mysql的语言是非结构化的,用户可以在数据上进行工作。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。并且因为Mysql的语言和结构比较简单,但是功能和存储信息量很强大,所以得到了普遍的应用。
Mysql数据库在编程过程中的作用是很广泛的,为用户进行数据查询带来了的方便。Mysql数据库的应用因其灵活性强,功能强大,所以在实现某功能时只需要一小段代码,而不像其他程序需要编写大段代码。总体来说,Mysql数据库的语言相对要简洁很多。
数据流程分析主要就是数据存储的储藏室,它是在计算机上进行的,而不是现实中的储藏室。数据的存放是按固定格式,而不是无序的,其定义就是:长期有固定格式,可以共享的存储在计算机存储器上。数据库管理主要是数据存储、修改和增加以及数据表的建立。为了保证系统数据的正常运行,一些有能力的处理者可以进行管理而不需要专业的人来处理。数据表的建立,可以对数据表中的数据进行调整,数据的重新组合及重新构造,保证数据的安全性。介于数据库的功能强大等特点,本系统的开发主要应用了Mysql进行对数据的管理。 #########
2.3 B/S架构
B/S结构的特点也非常多,例如在很多浏览器中都可以做出信号请求。并且可以适当的减轻用户的工作量,通过对客户端安装或者是配置少量的运行软件就能够逐步减少用户的工作量,这些功能的操作主要是由服务器来进行控制的,由于该软件的技术不断成熟,最主要的特点就是与浏览器相互配合为软件开发带来了极大的便利,不仅能够减少开发成本,还能够不断加强系统的软件功能,层层相互独立和展现层是该B/S结构完成相互连接的主要特性。
2.4 Spring Boot框架
Spring Boot是Pivotal团队的一个新框架,旨在简化新Spring应用程序的初始设置和开发。该框架使用特定的配置方法,无需开发人员定义样板配置。通过这种方式,Spring Boot旨在成为蓬勃发展的快速应用程序开发领域的领导者。 Spring Boot特点: 1、创建一个单独的Spring应用程序; 2、嵌入式Tomcat,无需部署WAR文件; 3、简化Maven配置; 4、自动配置Spring; 5、提供生产就绪功能,如指标,健康检查和外部配置; 6、绝对没有代码生成和XML的配置要求; 安装步骤:
最基本的是,Spring Boot是一个可以被任何项目的构建系统使用的库集合。 为简单起见,该框架还提供了一个命令行界面,可用于运行和测试Boot应用程序。 可以从Spring存储库手动下载和安装框架的已发布版本,包括集成的CLI(命令行界面)。 更简单的方法是使用Groovy enVironment Manager(GVM),它负责处理Boot版本的安装和管理。 可以从GVM命令行GVM install springboot安装Boot及其CLI。 在OS X上安装Boot时可以使用Homebrew包管理器。要完成安装,首先使用brew tap pivotal / tap切换到pivotal存储库,然后执行brew install springboot命令。
#########
2.5 ECLIPSE 开发环境
ECLIPSE 支持广泛、兼容性高并且功能强大,是一个Eclipse 插件集合,普遍适应于JAVA和J2EE的系统开发,支持 JDBC,Hibernate,AJAX,Struts,Java Servlet,Spring,EJB3等市面上存在的几乎所有数据库链接工具和主流Eclipse产品 开发工具。
ECLIPSE 在业内是所熟知的开发工具,该平台在开发的过程中运用的就是该工具。ECLIPSE 又被称之为房东级的工作平台,它是以Eclipse IDE为基础的。ECLIPSE 可以帮助我们进行数据库的研发和J2EE的使用,除此之外,还可以提高系统的运营能力,这突出表现在服务器的整合过程中。ECLIPSE 的功能相当完备,能够为J2EE的集成提供必要的环境支持,从而完成编码、测试、调试及发布等功能。它可以支持Java,HTML,SQL,Javascript,Struts, CSS等。
8
第3章 需求分析
3.1 需求分析
开发系统的过程中,去调查用户的功能诉求,对需要存在的功能进行需求分析是特别重要的,且对于系统的开发有着实际的意义,设计租房网站通过对用户的需求进行分析,结合实际情况进行开发研究,对用户的所有需求做出一个完整的基本的框架,然后一步一步的完成、实现。需求分析可以为系统的开发提供一个目标,只有按照这个目标进行开发设计,才能进行完整的开发,这样设计出的系统才有使用的意义,才能在竞争激烈的软件市场中生存,才能真正的帮助人们解决问题,提高实际的效率。
3.2 系统可行性分析
3.2.1 技术可行性
本系统采取的是目前应用最广泛的程序进行技术的支持,主要的技术支持是java语言,他作为一个相当成熟的语言程序,在众多的软件开发中起着很大作用。而且用java语言编辑出来程序可以直接运行,不需要借助其他的翻译器进行翻译。所以在技术方面是完全可以行的。
3.2.2 经济可行性
本项目开发的初衷就是为了节约,因为系统开发的所有过程都是我自己开发的,而且在开发过程使用到的技术也都是市面上常见的容易操作的,所以不需要请专业的人士花资金来进行系统的开发,而且在项目开发的过程中我也学到了更多的知识。开发的这个软件可以在网络中进行免费的下载,对计算机的软硬件没有很高的要求,因此这个项目是非常实惠的,在经济方面是完全可性的。
3.2.3 操作可行性
操作可行性也就是系统的可用性,一个系统的操作是否容易决定着这个系统的使用度,在系统的操作方面的设计我都是采取简洁易懂的方式,操作的整个菜单界面整齐有序,所有的功能都有序的排列,不会出现重叠或者需要转换的现象,用户想要哪方面的操作都可以直接进行操作,所以该系统任何人都可以进行操作,不需要有相关专业的技术这样用户在操作起来就容易很多。
3.3 项目设计目标与原则
1、关于租房网站的基本要求
(1)功能要求:首页、个人中心、用户管理、房屋类型管理、房屋信息管理、预约看房管理、在线签约管理、租赁评价管理、交流论坛、系统管理等功能模块。
(2)性能:因为租房网站管理中有很多的信息需要存储,因此对于系统的存储量有很大的要求,需要有一个强大的数据库的支持才能确保所有的信息都能安全稳定的进行存储。
(3)安全与保密要求:用户都必须注册、登录才能进入系统。
(4)环境要求:支持Windows系列、Vista系统等多种操作系统使用。
2、设计原则
本租房网站采用Java技术,Mysql数据库开发,充分保证了系统稳定性、完整性。
(1)系统响应效率:由于是租房网站,因此就需要系统的响应效率是非常高的,并且可以支持很多人同时进行系统的使用。
(2)界面简洁清晰:系统界面要简单有序,所有的功能一目了然。
(3)储存性高:因为是租房网站,所以就会在数据库要求上比较严格,信息录入的比较多,而且丰富复杂, 这就需要一个强大的数据库来存放更多的数据和保证数据的时时性。
(4)易学性:系统的设计一定要简单,使得用户使用起来非常好的顺手。
(5)稳定性需求:该系统在使用过程中必须保持稳定,不要出现卡顿、模糊等情况。
(6)稳定性:由于是租房网站,因此系统运行必须要十分的稳定。
3.4 系统流程分析
用户需要拥有属于自己的账号和密码,且必须正确,这样才能顺利登录到系统中。进入网站后,用户可以自行查询信息,在租房信息的详情页面,可以直接进行操作。具体流程如下图3-1所示:
图3-1 用户操作流程图
为了保证系统的安全性,要使用本系统对系统信息进行管理,必须先登陆到系统中。其具体登录流程图如图3-2所示:
图3-2 系统操作流程图
第4章 架构设计
4.1 系统体系结构
租房网站的结构图4-1所示:
网
络
管理员
服务器和程序
用户
图4-1 系统结构
登录系统结构图,如图4-2所示:
租房网站登录界面
用户登录
密码正确
管理员界面
用户界面
图4-2 登录结构图
系统结构图,如图4-3所示:
图4-3 系统结构图
4.2 数据库实体设计
数据库的功能就是对系统中所有的数据进行存储和管理。所有的数据可以在数据库中产时间的进行存储,方便用户的使用。而且所有的数据库中的数据也应该具有一定的共享性,任何的系统可以对一些数据进行使用,同时还应该保持一定的独立性,每一个数据库中的数据都有很强的安全性,可以被很好的存放到数据库,没有进行身份的验证是不能对这些数据进行查看和使用的。数据库的设计需要明确每一个实体之间的联系,系统的E-R图如下图所示::
管理员实体主要存储管理信息包括用户名、密码、角色。管理员信息属性图如图4-4所示。
图4-4 管理员信息实体属性图
1、在线签约信息实体图如图4-5所示:
图4-5在线签约信息实体图
2、预约看房信息实体图如图4-6所示:
图4-6预约看房信息实体图
4.3 数据库表设计
当租房网站在运行的时候,数据库要能确保自己的独立性,想要哪部分的数据就选择相应的设置选项,对应的数据就会以表格的形式展现出来。当对这一个功能进行设置,他就会与数据库进行连接,会在对话框中弹出相应的数据源。
表4-1 allusers表
|列名|数据类型|长度|约束| | :-: | :-: | - | :-: | |id|int|11|NOT NULL| |username|varchar|50|default NULL| |pwd|varchar|50|
default NULL| |cx|varchar|50|
default NULL|
表4-2 fangwuxinxi表
|列名|数据类型|长度|约束| | :-: | :-: | - | :-: | |id|int|11|NOT NULL| |addtime|varchar|50|default NULL| |fangwumingcheng|varchar|50|default NULL| |fangwuleixing|varchar|50|default NULL| |tupian|varchar|50|default NULL| |zulinfangshi|varchar|50|default NULL| |chaoxianglouceng|varchar|50|default NULL| |mianji|varchar|50|default NULL| |fangwuzhuangtai|varchar|50|default NULL| |xiaoqu|varchar|50|default NULL| |xiangxidizhi|varchar|50|default NULL| |yuezujiage|varchar|50|default NULL| |yajin|varchar|50|default NULL| |fangwuxiangqing|varchar|50|default NULL| |faburiqi|varchar|50|default NULL|
表4-3:yonghu表
|列名|数据类型|长度|约束| | :-: | - | :-: | :-: | |id|int|11|NOT NULL | |addtime|varchar|50|default NULL| |yonghuming|varchar|50|default NULL| |mima|varchar|50|default NULL| |xingming|varchar|50|default NULL| |xingbie|varchar|50|default NULL| |touxiang|varchar|50|default NULL| |shouji|varchar|50|default NULL| |shenfenzheng|varchar|50|default NULL|
表4-4:yuyuekanfang表
|列名|数据类型|长度|约束| | :-: | - | :-: | :-: | |id|int|11|NOT NULL | |addtime|varchar|50|default NULL| |yuyuebianhao|varchar|50|default NULL| |fangwumingcheng|varchar|50|default NULL| |fangwuleixing|varchar|50|default NULL| |tupian|varchar|50|default NULL| |mianji|varchar|50|default NULL| |fangwuzhuangtai|varchar|50|default NULL| |xiaoqu|varchar|50|default NULL| |yuezujiage|varchar|50|default NULL| |zulinyueshu|varchar|50|default NULL| |zulinjine|varchar|50|default NULL| |yajin|varchar|50|default NULL| |yuyueriqi|varchar|50|default NULL| |yonghuming|varchar|50|default NULL| |shouji|varchar|50|default NULL| |shenfenzheng|varchar|50|default NULL| |sfsh|varchar|50|default NULL| |shhf|varchar|50|default NULL|
表4-5:zaixianqianyue表
列名 | 数据类型 | 长度 | 约束 |
---|---|---|---|
id | int | 11 | NOT NULL |
addtime | varchar | 50 | default NULL |
hetongbianhao | varchar | 50 | default NULL |
fangwumingcheng | varchar | 50 | default NULL |
fangwuleixing | varchar | 50 | default NULL |
xiaoqu | varchar | 50 | default NULL |
yuezujiage | varchar | 50 | default NULL |
zulinyueshu | varchar | 50 | default NULL |
zulinjine | varchar | 50 | default NULL |
yajin | varchar | 50 | default NULL |
hetongjine | varchar | 50 | default NULL |
shengxiaoriqi | varchar | 50 | default NULL |
youxiaoqizhi | varchar | 50 | default NULL |
hetongneirong | varchar | 50 | default NULL |
yonghuming | varchar | 50 | default NULL |
shouji | varchar | 50 | default NULL |
sfsh | varchar | 50 | default NULL |
shhf | varchar | 50 | default NULL |
第5章 系统实现
5.1 管理员登录
管理员输入个人的用户名、密码、角色登录系统,这时候系统的数据库就会在进行查找相关的信息,如果我们输入的用户名、密码、角色不正确,数据库就会提示出错误的信息提示,同时会提示管理员重新输入自己的用户名、密码、角色,直到账号密码输入成功后,会提登录成功的信息。网站管理员登录效果图如图5-1所示:
图5-1管理员登录界面
5.2 管理员功能模块
5.2.1用户管理
管理员对用户管理进行详情、删除、修改操作。程序成效图如下图5-2所示:
图5-2用户管理界面图
5.2.2房屋类型管理
管理员对房屋类型管理进行详情、删除、修改操作。程序效果图如下图5-3所示:
图5-3房屋类型管理界面
5.2.3房屋信息管理
管理员对房屋信息管理进行详情、修改以及删除等操作。程序效果图如下图5-4所示:
图5-4房屋信息管理界面
5.2.4房屋资讯
管理员对房屋资讯进行详情、删除、修改以及查看等操作。程序效果图如下图5-5所示:
图5-5房屋资讯界面
5.2.5预约看房管理
管理员可以对预约看房管理进行修改、详情等操作。程序效果图如下图5-6所示:
图5-6预约看房管理界面
5.2.6在线签约管理
管理员可以对在线签约管理进行修改、详情等操作。程序效果图如下图5-7所示:
图5-7在线签约管理界面
5.2.7交流论坛
管理员可以对交流论坛进行修改、详情等操作。程序效果图如下图5-8所示:
图5-8交流论坛界面
5.3 用户功能模块
用户进入系统可以对首页、个人中心、预约看房管理、在线签约管理、租赁评价管理、我的收藏管理进行相对应操作。程序成效图如下图5-9所示:
图5-9用户功能界面图
5.3.1 预约看房管理
用户通过预约看房管理进行详情、修改、删除等操作。程序效果图如下图5-10所示:
图5-10预约看房管理界面
5.3.2 在线签约管理
用户通过在线签约管理进行详情、删除等操作。程序效果图如下图5-11所示:
图5-11在线签约管理界面
5.3.2 租赁评价管理
用户通过租赁评价管理进行详情、删除等操作。程序效果图如下图5-12所示:
图5-12租赁评价管理界面
CommonUtil.java
package com.utils;
import java.util.Random;
public class CommonUtil {
/**
* 获取随机字符串
*
* @param num
* @return
*/
public static String getRandomString(Integer num) {
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < num; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}
}
FileUtil.java
package com.utils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 类说明 :
*/
public class FileUtil {
public static byte[] FileToByte(File file) throws IOException {
// 将数据转为流
@SuppressWarnings("resource")
InputStream content = new FileInputStream(file);
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100];
int rc = 0;
while ((rc = content.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, rc);
}
// 获得二进制数组
return swapStream.toByteArray();
}
}
UserController.java
package com.controller;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UserEntity;
import com.service.TokenService;
import com.service.UserService;
import com.utils.CommonUtil;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;
/**
* 登录相关
*/
@RequestMapping("users")
@RestController
public class UserController{
@Autowired
private UserService userService;
@Autowired
private TokenService tokenService;
/**
* 登录
*/
@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
if(user==null || !user.getPassword().equals(password)) {
return R.error("账号或密码不正确");
}
String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
return R.ok().put("token", token);
}
/**
* 注册
*/
@IgnoreAuth
@PostMapping(value = "/register")
public R register(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);
if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
return R.error("用户已存在");
}
userService.insert(user);
return R.ok();
}
/**
* 退出
*/
@GetMapping(value = "logout")
public R logout(HttpServletRequest request) {
request.getSession().invalidate();
return R.ok("退出成功");
}
/**
* 密码重置
*/
@IgnoreAuth
@RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request){
UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
if(user==null) {
return R.error("账号不存在");
}
user.setPassword("123456");
userService.update(user,null);
return R.ok("密码已重置为:123456");
}
/**
* 列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,UserEntity user){
EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/list")
public R list( UserEntity user){
EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
ew.allEq(MPUtil.allEQMapPre( user, "user"));
return R.ok().put("data", userService.selectListView(ew));
}
/**
* 信息
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") String id){
UserEntity user = userService.selectById(id);
return R.ok().put("data", user);
}
/**
* 获取用户的session用户信息
*/
@RequestMapping("/session")
public R getCurrUser(HttpServletRequest request){
Long id = (Long)request.getSession().getAttribute("userId");
UserEntity user = userService.selectById(id);
return R.ok().put("data", user);
}
/**
* 保存
*/
@PostMapping("/save")
public R save(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);
if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
return R.error("用户已存在");
}
userService.insert(user);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody UserEntity user){
// ValidatorUtils.validateEntity(user);
UserEntity u = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername()));
if(u!=null && u.getId()!=user.getId() && u.getUsername().equals(user.getUsername())) {
return R.error("用户名已存在。");
}
userService.updateById(user);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
userService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}
menu.js
const menu = {
list() {
return [{"backMenu":[{"child":[{"buttons":["新增","查看","修改","删除"],"menu":"用户","menuJump":"列表","tableName":"yonghu"}],"menu":"用户管理"},{"child":[{"buttons":["新增","查看","修改","删除"],"menu":"房屋类型","menuJump":"列表","tableName":"fangwuleixing"}],"menu":"房屋类型管理"},{"child":[{"buttons":["新增","查看","修改","删除","查看评论"],"menu":"房屋信息","menuJump":"列表","tableName":"fangwuxinxi"}],"menu":"房屋信息管理"},{"child":[{"buttons":["查看","修改","删除","审核","签约"],"menu":"预约看房","menuJump":"列表","tableName":"yuyuekanfang"}],"menu":"预约看房管理"},{"child":[{"buttons":["查看","修改","删除"],"menu":"在线签约","menuJump":"列表","tableName":"zaixianqianyue"}],"menu":"在线签约管理"},{"child":[{"buttons":["查看","修改","删除","审核","报表"],"menu":"租赁评价","menuJump":"列表","tableName":"zulinpingjia"}],"menu":"租赁评价管理"},{"child":[{"buttons":["新增","查看","修改","删除"],"menu":"交流论坛","tableName":"forum"}],"menu":"交流论坛"},{"child":[{"buttons":["新增","查看","修改","删除"],"menu":"房屋资讯","tableName":"news"},{"buttons":["新增","查看","修改","删除"],"menu":"在线客服","tableName":"chat"},{"buttons":["新增","查看","修改","删除"],"menu":"轮播图管理","tableName":"config"}],"menu":"系统管理"}],"frontMenu":[{"child":[{"buttons":["查看","预约"],"menu":"房屋信息列表","menuJump":"列表","tableName":"fangwuxinxi"}],"menu":"房屋信息模块"}],"hasBackLogin":"是","hasBackRegister":"否","hasFrontLogin":"否","hasFrontRegister":"否","roleName":"管理员","tableName":"users"},{"backMenu":[{"child":[{"buttons":["查看","修改","删除"],"menu":"预约看房","menuJump":"列表","tableName":"yuyuekanfang"}],"menu":"预约看房管理"},{"child":[{"buttons":["查看","审核","支付","评价"],"menu":"在线签约","menuJump":"列表","tableName":"zaixianqianyue"}],"menu":"在线签约管理"},{"child":[{"buttons":["查看","修改","删除"],"menu":"租赁评价","menuJump":"列表","tableName":"zulinpingjia"}],"menu":"租赁评价管理"},{"child":[{"buttons":["查看","删除"],"menu":"我的收藏管理","tableName":"storeup"}],"menu":"我的收藏管理"}],"frontMenu":[{"child":[{"buttons":["查看","预约"],"menu":"房屋信息列表","menuJump":"列表","tableName":"fangwuxinxi"}],"menu":"房屋信息模块"}],"hasBackLogin":"是","hasBackRegister":"否","hasFrontLogin":"是","hasFrontRegister":"是","roleName":"用户","tableName":"yonghu"}]
}
}
export default menu;