springboot庀材二手房交易平台
摘 要
在互联网飞速发展的当下,开发庀材二手房交易平台是为了利用互联网和科学技术来满足二手房交易市场日益增长的需求,提供一个方便快捷的平台供用户进行二手房交易。通过开发此系统,可以解决传统二手房交易中信息不透明、中介费高昂等问题,提供更便捷、透明、安全的交易环境。
本文通过市场调研,根据实际要求决定采用Spring Boot框架,利用Java语言进行开发,并通过MySQL数据库进行数据存储,设计与实现庀材二手房交易平台。主要分析了用户需求和二手房交易存在的问题,设计了一个安全、高效、便捷、智能的集二手房信息获取、购买交易和交流交互的庀材二手房交易平台,旨在为用户提供便捷有效的二手房交易服务和为管理员提供高效的二手房交易管理工具。系统运行实现了用户登录、注册、系统用户、广告信息管理、广告展位管理、展位购买管理、二手房源管理、房屋咨询管理、房屋约看管理、房屋预订管理、房屋交易管理、房屋过户管理、在线客服管理、系统管理、公告信息管理、资源管理等多元的庀材二手房交易管理功能模块。
本系统经过功能测试,已经检测完毕包括但不限于检测了用户登录、注册、广告信息查看、二手房源添加、广告展位搜索、密码修改等方面的功能测试,显示功能在测试中表现良好,并且符合预期。用户能够成功登录系统,查看各项信息并完成相应操作任务,确保系统能够稳定运行,未发现严重问题。因此,从整体捡来,系统通过这几大模块的功能测试,各功能模块均正常运作,符合设计要求,能够保证相关数据库的信息也同样正确,为庀材二手房交易平台管理系统的后期推广运营提供了强力的技术支撑。
关键词:Springboot 庀材二手房交易平台 Java语言 MySQL数据库
ABSTRACT
With the rapid development of the Internet and information technology, the purpose of developing Picai second-hand housing trading platform is to use the Internet and science and technology to meet the growing demand of the second-hand housing trading market and provide a convenient and fast platform for users to trade second-hand housing. By developing this system, problems such as information opacity and high intermediary fees in traditional second-hand housing transactions can be solved, providing a more convenient, transparent, and secure trading environment.
This article, based on market research and practical requirements, decides to use the Spring Boot framework, develop using Java language, and store data through MySQL database to design and implement a first-hand housing trading platform. We mainly analyzed user needs and the problems existing in second-hand housing transactions, and designed a safe, efficient, convenient, and intelligent second-hand housing transaction platform that integrates information acquisition, purchase transactions, and communication interaction. The aim is to provide users with convenient and effective second-hand housing transaction services and administrators with efficient second-hand housing transaction management tools. The system has implemented multiple functional modules for second-hand housing transaction management, including user login, registration, system user, advertising information management, advertising booth management, booth purchase management, second-hand housing management, housing consultation management, housing appointment management, housing reservation management, housing transaction management, housing transfer management, online customer service management, system management, announcement information management, resource management, etc.
This system has undergone functional testing and has been tested, including but not limited to user login, registration, advertising information viewing, second-hand property addition, advertising booth search, password modification, etc. The display function has performed well in the test and meets the expectations. The user is able to successfully log in to the system, view various information, and complete corresponding operational tasks, ensuring that the system can run stably and no serious problems are found. Therefore, from an overall perspective, the system has passed the functional testing of these major modules, and all functional modules are operating normally, meeting the design requirements, ensuring that the information in the relevant databases is also correct. This provides strong technical support for the later promotion and operation of the Xiancai Second hand Housing Trading Platform Management System.
Key words:Springboot first-hand material second-hand housing trading platform Java MySQL database
目 录
第一章 绪论
1.1项目背景
在互联网飞速发展的当下,开发庀材二手房交易平台是为了利用互联网和科学技术来满足二手房交易市场日益增长的需求,提供一个方便快捷的平台供用户进行二手房交易。通过开发此系统,可以解决传统二手房交易中信息不透明、中介费高昂等问题,提供更便捷、透明、安全的交易环境。
本文通过市场调研,根据实际要求决定采用Spring Boot框架,利用Java语言进行开发,并通过MySQL数据库进行数据存储,设计与实现庀材二手房交易平台。主要分析了用户需求和二手房交易存在的问题,设计了一个安全、高效、便捷、智能的集二手房信息获取、购买交易和交流交互的庀材二手房交易平台,旨在为用户提供便捷有效的二手房交易服务和提供高效的二手房交易管理工具,提高庀材二手房交易的成功率和交易盈利。
1.2项目意义
随着人们生活水平的提高,二手房交易市场逐渐兴起,为了方便人们进行二手房的买卖和信息服务,开发一个庀材二手房交易平台具有重要意义。通过该平台可以提供便捷的信息发布获取,交易购买和管理服务功能,满足不同用户群体的需求,能够为二手房交易市场提供一个规范化、信息透明的平台,促进市场的健康发展。
庀材二手房交易平台的搭建能够为普通用户提供一个方便快捷的搜索、浏览和发布二手房源,实现在线交易支付,帮助他们更轻松地找到心仪的房屋并进行看房、咨询和购买,或者对自己的二手房源进行发布。为经纪人提供一个有效的推广和管理渠道,帮助他们更好地展示房源信息和促成交易。通过该平台管理员能够方便管理房屋资讯、广告信息、广告展位、二手房源、在线客服等内容,实现实时更新系统信息,确保平台的正常运行。同时,该平台能够提升二手房交易市场的透明度和规范性,促进市场的健康有序发展,保障用户和交易双方的权益,此外,可以提升二手房交易市场的信息化水平,让房源信息更加容易获取和比较,促进用户对市场的信任和使用。
因此,设计和实现庀材二手房交易平台具有积极的社会意义和经济意义,有助于促进二手房交易市场的发展和提升用户手房交易体验。
1.3国内外研究现状
在国内外,许多研究机构和学者对二手房市场、电子商务平台、房地产信息系统以及区块链在房地产领域的应用展开了研究。他们的成果涵盖了市场规模分析、信息系统设计、用户交互体验、安全性等多个方面,为二手房交易平台的设计和实现提供了宝贵的理论支持和实践经验。这些研究成果为开发团队提供了丰富的参考资料,有助于提升平台的功能性、易用性以及安全性,并为二手房交易平台的设计和实现提供借鉴和参考。
许多研究机构和学者对二手房市场进行了大量研究,包括市场规模、供需状况、价格趋势等方面的分析,这些研究可以为平台的市场定位和策略制定提供参考。同时,一些学者研究了房地产信息系统在信息采集、处理、展示等方面的应用,这对于二手房交易平台的信息管理和展示功能设计有一定启发。同时关于电子商务平台的设计研究可以为二手房交易平台的用户交互、支付系统、推荐系统等方面提供参考,以提升用户体验。
此外,一些研究围绕区块链技术在房地产交易中的应用展开,探讨了去中心化、不可篡改、安全性等特点对交易过程的价值,这方面的研究可为平台的安全性和信任建设提供借鉴。
总体而言,国内外相关领域的研究成果为二手房交易平台的设计提供了丰富的理论支持和实践经验,为开发人员和设计团队提供了宝贵的参考资料。通过借鉴和结合这些研究成果,可以更好地设计和实现二手房交易平台,提升其功能性、易用性和安全性。
1.4开发工具介绍
1.4.1Springboot框架
Spring Boot是一个基于Spring框架的开源框架,它可以帮助开发者快速构建基于Spring的应用程序。Spring Boot的设计目标是让开发者能够轻松地创建独立的、生产级别的Spring应用程序,并且尽可能减少配置文件的编写。Spring Boot提供了一套自动化配置机制,开发者可以使用注解来简化配置,减少样板式代码的编写,从而提高开发效率。Spring Boot内置了嵌入式的HTTP服务器,如Tomcat、Jetty和Undertow,让开发者可以将应用程序打包成一个可执行的JAR文件,直接运行在内置的服务器上,无需外部的Web容器。Spring Boot还提供了许多功能强大且易于集成的特性,如Actuator监控、Spring Data集成、Spring Security安全等,可以帮助开发者快速构建出功能完善的应用程序。总的来说,Spring Boot框架的出现大大简化了Spring应用程序的开发流程,降低了入门门槛,使得开发者可以更专注于业务逻辑的实现而不是繁琐的
1.4.2Java技术
Java是一种流行的编程语言,能够面向对象的高级编程语言,具有简单、可移植、安全和高性能等特点,在软件开发领域广泛应用。其可移植性得益于Java虚拟机(JVM),使得Java程序可以在不同平台上运行,只需编写一次代码。Java注重安全性,提供了字节码验证、异常处理和访问控制等安全机制,确保程序的稳定和安全,能够帮助开发者轻松构建可靠、可移植和安全的应用程序。Java是美国sun公司所推出的一款程序设计语言,其能够在多个平台内应用,具有良好兼容性,进而其凭借自身优势在数据中心、个人PC与科技超级计算机等平台内广泛应用,具有目前最为庞大的开发者专业社群。
1.4.3MySQL数据库
MySQL经过多次的更新,功能层面已经非常的丰富和完善了,从MySQL4版本到5版本进行了比较大的更新,在商业的实际使用中取得了很好的实际应用效果。最新版本的MySQL支持对信息的压缩,同时还能进行加密能更好的满足对信息安全性的需求。同时经过系统的多次更新,数据库自身的镜像功能也得到了很大的增强,运行的流畅度和易用性方面有了不小的进步,驱动的使用和创建也更加的高效快捷。最大的变动还是进行了空间信息的显示优化,能更加方便的在应用地图上进行坐标的标注和运算。强大的备份功能也保证了用户使用的过程会更加安心,同时支持的Office特性还支持用户的自行安装和使用。在信息的显示形式上也进行了不小的更新,增加了两个非常使用的显示区,一个是信息区,对表格和文字进行了分类处理,界面的显示更加清爽和具体。第二是仪表的信息控件,能在仪表信息区进行信息的显示,同时还能进行多个信息的比对,为用户的实际使用带来了很大的便捷。
数据库管理系统的总体结构图如下图所示。
图1-1 数据库组成结构
第二章 需求分析
2.1系统概述
本庀材二手房交易平台首先根据使用该网站的用户的角色的不同分为:普通用户,经纪人,管理员。
本网上庀材二手房交易平台根据用户需求主要分为三个模块:普通用户,经纪人,管理员。
其中普通用户模块主要实现普通用户的注册登录,能够查看首页、公告信息、房屋资讯,可以搜索和浏览广告信息、广告展位、二手房源信息,实现在线购买、咨询、约看、预订和支付操作,能够和在线客服进行咨询沟通,并对可以对展位购买、二手房源、房屋咨询、房屋约看、房屋预订、房屋交易、房屋过户、在线客服等功能进行管理。
普通用户角色的用例展示如图2-1所示。
图2-1 普通用户角色用例图
经纪人模块主要实现用户的注册登录,经纪人的账号信息由管理员添加,使用添加的账号密码才可进行登录,能够二手房源管理、房屋预订管理、房屋交易管理、房屋过户管理等功能进行管理,并可以修改个人信息和修改密码。
经纪人角色的用例展示如图2-2所示。
图2-2 经纪人角色用例图
管理员模块主要负责公系统用户、广告信息管理、广告展位管理、展位购买管理、二手房源管理、房屋咨询管理、房屋约看管理、房屋预订管理、房屋交易管理、房屋过户管理、在线客服管理、系统管理、公告信息管理、资源管理等系统功能模块的维护和更新,保证系统正常运行,并可以修改个人信息和修改密码。
管理员角色的用例展示如图2-3所示。
图2-3 管理员角色用例图
2.2系统功能需求
根据庀材二手房交易平台功能需求分析,主要划分为了普通用户、经纪人和管理员三大模块,各模块又再细分小功能模块。具体如下:
普通用户模块:
- 注册登录:游客可以以通过注册,填写账包括号+设置密码+确认密码+昵称+身份等必要注册信息,进行注册成为系统普通用户,注册成功后,可以使用账号密码进行登录,使用系统功能。
- 首页:当普通用户经过登录进入系统,映入眼帘的是导航栏,下面是轮播图、公告信息、房屋资讯、广告信息推荐、广告展位推荐、二手房源推荐等,并可以使用系统其他功能。
- 公告信息:当普通用户点击“公告信息”这一按钮,可以查看包括关于我们、联系方式、网站介绍等所有管理员发布的公告详情信息。
- 房屋资讯:当普通用户点击“房屋资讯”这一按钮,可以查看管理员发布的所有房屋资讯详情信息,可通过局部、筛选、排序进行进行搜索,可通过热门文章推荐,并可以对房屋资讯进行点赞、收藏和评论。
- 广告信息:当普通用户点击“广告信息”这一按钮,可以查看管理员发布的所有广告信息详情信息,可通过广告标题、广告类型、排序进行搜索,并可一进行收藏操作。
- 广告展位:当普通用户点击“广告展位”这一按钮,可以查看管理员发布的所有广告展位详情信息,可通过展位标题、展位类型、排序进行搜索,并可以进行购买操作。
- 二手房源:当普通用户点击“二手房源”这一按钮,可以查看管理员发布的所有二手房源详情信息,可通过房屋名称、所在地区、房屋面积、房屋户型、排序进行搜索,并可以进行咨询、约看、预订、收藏操作。
- 在线客服:当普通用户点击“在线客服”这一按钮,可以对在线客服发起咨询,填写并提交咨询信息。
- 我的账户:当普通用户点击“我的账户”这一按钮,可以对个人资料进行管理,包括查看和修改个人资料,修改账号密码。
- 个人中心:当普通用户点击“个人中心”这一按钮,可以对个人首页、展位购买、二手房源、房屋咨询、房屋约看、房屋预订、房屋交易、房屋过户、在线客服、收藏等信息进行管控,可以查看以上各项功能的详情信息。例如,可以对自己提交的展位购买进行支付操作;可以增改删查自己的二手房源信息;可以查询房屋咨询和在线客服信息,进入详情页查看给自己的咨询回复,并且可以回复自己的二手房源咨询信息;查询和管理自己的房屋约看、房屋预订、房屋交易、房屋过户、收藏信息。
经纪人模块:
- 登录:经纪人账号信息由管理员添加,可以使用添加的账号密码即可进行登录,使用系统功能,同时可以对个人信息和密码进行管控。
- 二手房源管理:当经纪人点击“二手房源”这一按钮,可以查看自己的二手房源详情信息,进行查询操作,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索。
- 房屋预订管理:当经纪人点击“房屋预订”这一按钮,可以查看自己的房屋预订详情信息,进行查询操作,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索,并可以点击房屋交易,录入并提交房屋交易信息。
- 房屋交易管理:当经纪人点击“房屋交易”这一按钮,可以查看自己的房屋交易详情信息,进行查询操作,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索,并可以点击房屋过户,录入并提交房屋过户信息。
- 房屋过户管理:当经纪人点击“房屋过户”这一按钮,可以查看自己的房屋过户详情信息,进行查询操作,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索。
管理员模块:
- 登录:管理员账号密码由系统生成,可以使用账号密码可以进行登录,是系统最高权限拥有者使用系统功能,并可以对个人信息和密码进行管控。
- 后台首页:管理员登录进入系统后首页进入的后台首页界面,可以查看广告信息统计、房屋预订统计等信息数据分析图表。
- 系统用户:管理员可以对普通用户、经纪人和管理员进行管控,包括进行增删改查操作,可以查看普通用户、经纪人和管理员的详情信息,经纪人账号信息由管理员添加。
- 广告信息管理:当管理员点击“广告信息”这一按钮,可以查看所有广告信息详情信息,进行增删改查操作,可通过广告标题、广告类型进行搜索。
- 广告展位管理:当管理员点击“广告展位”这一按钮,可以查看所有广告展位详情信息,进行增删改查操作,可通过展位标题、展位类型进行搜索。
- 展位购买管理:当管理员点击“展位购买”这一按钮,可以查看所有展位购买详情信息,进行查询和删除操作,可通过展位标题、展位类型、用户姓名、支付状态进行搜索,并可点击支付,修改支付状态。
- 二手房源管理:当管理员点击“二手房源”这一按钮,可以查看所有二手房源详情信息,进行查询和删除操作,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索。
- 房屋咨询管理:当管理员点击“房屋咨询”这一按钮,可以查看所有房屋咨询详情信息,进行查询和删除操作,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索。
- 房屋约看管理:当管理员点击“房屋约看”这一按钮,可以查看所有房屋约看详情信息,进行查询和删除操作,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索。
- 房屋预订管理:当管理员点击“房屋预订”这一按钮,可以查看所有房屋预订详情信息,进行查询和删除操作,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索,并可以点击房屋交易,录入并提交房屋交易信息。
- 房屋交易管理:当管理员点击“房屋交易”这一按钮,可以查看所有房屋交易详情信息,进行查询和删除操作,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索,并可以点击房屋过户,录入并提交房屋过户信息。
- 房屋过户管理:当管理员点击“房屋过户”这一按钮,可以查看所有房屋过户详情信息,进行查询和删除操作,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索。
- 在线客服管理:当管理员点击“在线客服”这一按钮,可以查看所有在线客服详情信息,进行增删改查操作,可以进行回复用户咨询内容,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索。
- 系统管理:管理员点击“系统管理”这一按钮,可以对首页的轮播图进行管理,查看所有轮播图详情信息,进行增删改查操作,可通过标题进行搜索。
- 公告信息管理:管理员点击“公告信息”这一按钮,可以对公告信息进行管理,查看所有公告详情信息,进行增删改查操作,可通过标题进行搜索。
- 资源管理:管理员点击“资源管理”这一按钮,可以对房屋资讯和资讯分类进行管理,查看所有房屋资讯和资讯分类信息,进行增删改查操作。
- 个人信息:管理员点击“个人信息”这一按钮,可以查看个人信息详情信息,并可以修改个人信息的头像、昵称、邮箱。
- 修改密码:管理员点击“修改密码”这一按钮,可以对账号密码进行修改操作,修改后,需要用新密码进行登录。
2.3系统性能需求
庀材二手房交易平台的性能需求比如庀材二手房交易平台的安全性怎么样,可靠性怎么样,性能怎么样,可扩展性怎么样等。具体可以表示在如下2-1表格中:
图2-1 庀材二手房交易平台非功能需求表
安全性 | 主要指庀材二手房交易平台数据库的安装,数据库的使用和密码的设定必须合乎规范。 |
可靠性 | 可靠性是指庀材二手房交易平台能够按照用户提交的指示进行操作,经过测试,可靠性90%以上。 |
性能 | 性能是影响庀材二手房交易平台占据市场的必要条件,所以性能最好要佳才好。 |
可扩展性 | 比如数据库预留多个属性,比如接口的使用等确保了系统的非功能性需求。 |
易用性 | 用户只要跟着庀材二手房交易平台的页面展示内容进行操作,就可以了。 |
可维护性 | 庀材二手房交易平台开发的可维护性是非常重要的,经过测试,可维护性没有问题 |
2.4可行性分析
2.4.1技术可行性
现这个庀材二手房交易平台实所采用的开发方案是使用Java开发语言,采用非常成熟的Springboot框架,利用MySQL数据库进行快速搭建。Java作为一种常用的编程语言,具有广泛的应用领域和成熟的开发生态系统。它提供了丰富的库和工具,使开发人员能够轻松构建各种功能模块。MySQL作为一种关系型数据库管理系统,具有数据完整性高、稳定性好的特点。而Spring Boot作为一个成熟的开发框架,提供了快速开发和部署应用程序的能力。所使用的各种开发工具都能够从网上免费下载,节省开发成本,并且这些技术和工具,在学校本人都学习过,所以,与本人自行搭建操作是没有问题的,也无需额外的费用,同时开发与实现所使用的计算机只要可以正常的编辑系统代码的编写和设计系统界面即可。因此,庀材二手房交易平台的开发环境和配置都是可以自行安装,并且这些研发工作环境都使得此系统功能更为完整,使整个设计更为个性化,使用者功能也更为简洁方便。本平台具备了易于运行、容易管理、交互性较好的优点,在实际操作上也是非常简单的。只要具备一定的电脑知识即可顺利使用该平台的各项功能。
所以,其研发具有技术可行。
2.4.2运行可行性
本系统实现的功能操作简单,界面友好,并且由于服务器的基础上开发的,在实现系统的各项功能后,用户无需指导便可自行学习操作完成。因此只要在电脑联网的情况下,就可以通过浏览器里即可登录系统,使用系统功能,并且不需要配置复杂运行环境,只需一个网址便可进入系统。所以,其研发具有运行可行。
2.5开发环境
为了更好的实现系统功能,本系统的开发语言为Java语言,开发平台选用开放源码Eclipse,动态网站设计用JSP实现,数据库则选用体积小,成本低,速度快的MySQL来设计与实现庀材二手房交易平台,使得庀材二手房交易平台更具界面友好、数据安全、操作简单、处理高效。
第三章 总体设计
3.1系统总体设计
本系统采用模块化的方式进行网站结构设计,主要模块有普通用户模块,经纪人模块,管理员模块,通过正确地处理模块之间的内部联系、调用关系和数据关系以实现整个系统的功能。
游客在未注册时可以浏览系统信息,登录后才可以使用其他组系统功能,其中普通用户模块主要实现普通用户的注册登录,能够查看首页、公告信息、房屋资讯,可以搜索和浏览广告信息、广告展位、二手房源信息,实现在线购买、咨询、约看、预订和支付操作,能够和在线客服进行咨询沟通,并对可以对展位购买、二手房源、房屋咨询、房屋约看、房屋预订、房屋交易、房屋过户、在线客服等功能进行管理。经纪人模块主要实现用户的注册登录,经纪人的注册信息需经过管理员审核才可进行登录,能够对商城管理(广告展位、二手房源列表、二手房源配送)、个人信息、修改密码,并可查看商品销售金额统计、商品销售数量统计等数据分析图表等功能进行管理。
经纪人模块主要实现用户的注册登录,经纪人的账号信息由管理员添加,使用添加的账号密码才可进行登录,能够二手房源管理、房屋预订管理、房屋交易管理、房屋过户管理等功能进行管理,并可以修改个人信息和修改密码。
管理员模块主要负责公系统用户、广告信息管理、广告展位管理、展位购买管理、二手房源管理、房屋咨询管理、房屋约看管理、房屋预订管理、房屋交易管理、房屋过户管理、在线客服管理、系统管理、公告信息管理、资源管理等系统功能模块的维护和更新,保证系统正常运行,并可以修改个人信息和修改密码。
系统主要的数据访问方式是通过浏览器页面用户可以进入系统,系统可以自动对用户向服务器发送的请求进行处理,处理请求是在系统后台中进行的,用户在浏览器页面上进行相应操作,就能够看到服务端传递的处理结果。 庀材二手房交易平台主要分为视图-模型-控制三层架构设计。在视图层中,主要是操作在服务器端向客户端反馈并显示的数据,在模型层中,主要处理相关的业务逻辑、数据整合等,最后的控制层它介于视图和模型之间,主要是调整两层之间的关系,最终落实数据的传递。系统架构图如下图所示。
图3-1系统架构图
3.2功能模块设计
3.2.1普通用户模块设计
在上一章节中主要对系统的功能性需求和非功能性需求进行分析,并且根据需求分析了高校田径运动会信息管理系统中的用例。那么接下来就要开始对高校田径运动会信息管理系统的架构、主要功能和数据库开始进行设计。高校田径运动会信息管理系统根据前面章节的需求分析得出,其总体设计模块图如图3-2所示。
图3-2 系统功能模块图
3.3数据库设计
数据库设计一般包括需求分析、概念模型设计、数据库表建立三大过程,其中需求分析前面章节已经阐述,概念模型设计有概念模型和逻辑结构设计两部分。根据前面的数据流程图,结合系统的功能模块设计,设计出符合系统的各信息实体,主要包括公告信息、房屋资讯、广告信息、广告展位、二手房源、在线客服、我的账户、个人中心(个人首页、展位购买、二手房源、房屋咨询、房屋约看、房屋预订、房屋交易、房屋过户、在线客服、收藏)等。具体的数据库E-R图如图3-3所示。
图3-3 数据库总体E-R图
通过上一小节中庀材二手房交易平台中总E-R关系图上得出一共需要创建很多个数据表。
在此我主要罗列几个主要的数据库表结构设计。
(1)普通用户表
普通用户用户表含有普通用户ID、用户姓名、用户年龄、用户性别、审核状态、用户ID、创建时间、更新时间等属性。如表3-1所示。
表3-1 普通用户表结构表(registered_users)
字段 | 类型 | 主键 | 外键 | 注释 |
registered_users_id | int | 是 | 普通用户ID | |
user_name | varchar | 用户姓名 | ||
user_age | varchar | 用户年龄 | ||
user_gender | varchar | 用户性别 | ||
examine_state | varchar | 审核状态 | ||
user_id | int | 用户ID | ||
create_time | datetime | 创建时间 | ||
update_time | timestamp | 更新时间 |
(2)经纪人表
经纪人表含有经纪人ID、经纪人姓名、经纪人性别、经纪人年龄、审核状态、用户ID、创建时间、更新时间等属性。如表3-2所示。
表3-2 经纪人结构表(agent )
字段 | 类型 | 主键 | 外键 | 注释 |
agent_id | int | 是 | 经纪人ID | |
broker_name | varchar | 经纪人姓名 | ||
gender_of_agent | varchar | 经纪人性别 | ||
age_of_agent | varchar | 经纪人年龄 | ||
examine_state | varchar | 审核状态 | ||
user_id | int | 用户ID | ||
create_time | datetime | 创建时间 | ||
update_time | timestamp | 更新时间 |
(3)广告信息表
广告信息表含广告信息ID、广告标题、广告类型、广告标签、广告描述、广告封面、广告内容、创建时间、更新时间等属性。如表3-3所示。
表3-3 广告信息结构表(advertising_information )
字段 | 类型 | 主键 | 外键 | 注释 |
advertising_information_id | int | 是 | 广告信息ID | |
advertising_title | varchar | 广告标题 | ||
advertising_type | varchar | 广告类型 |
续表
字段 | 类型 | 主键 | 外键 | 注释 |
advertising_tags | varchar | 广告标签 | ||
advertising_description | varchar | 广告描述 | ||
advertising_cover | varchar | 广告封面 | ||
advertising_content | longtext | 广告内容 | ||
create_time | datetime | 创建时间 | ||
update_time | timestamp | 更新时间 |
(4)广告展位表
广告展位表含有广告展位ID、展位标题、展位类型、每月价格、展位标签、
展位封面、展位简介、创建时间、更新时间。如表3-4所示。
表3-4 广告展位结构表(advertising_booth )
字段 | 类型 | 主键 | 外键 | 注释 |
advertising_booth_id | int | 是 | 广告展位ID | |
booth_title | varchar | 展位标题 | ||
booth_type | varchar | 展位类型 | ||
monthly_price | int | 每月价格 | ||
booth_labels | varchar | 展位标签 | ||
booth_cover | varchar | 展位封面 | ||
booth_introduction | text | 展位简介 | ||
create_time | datetime | 创建时间 | ||
update_time | timestamp | 更新时间 |
(5)二手房源表
二手房源表含有二手房源ID、房源用户、房屋名称、所在地区、房屋地址、房屋类型、房屋面积、房屋户型、房屋价格、房屋视频、经纪人、配套设施、房屋照片、创建时间、更新时间等属性。如表3-5所示。
表3-5 二手房源表结构表(second_hand_housing_sources )
字段 | 类型 | 主键 | 外键 | 注释 |
second_hand_housing_sources_id | int | 是 | 二手房源ID |
续表
字段 | 类型 | 主键 | 外键 | 注释 |
housing_users | int | 房源用户 | ||
house_name | varchar | 房屋名称 | ||
location | varchar | 所在地区 | ||
house_address | varchar | 房屋地址 | ||
house_type | varchar | 房屋类型 | ||
housing_area | varchar | 房屋面积 | ||
house_layout | varchar | 房屋户型 | ||
house_prices | int | 房屋价格 | ||
house_video | varchar | 房屋视频 | ||
agent | int | 经纪人 | ||
supporting_facilities | text | 配套设施 | ||
house_photos | varchar | 房屋照片 | ||
create_time | datetime | 创建时间 | ||
update_time | timestamp | 更新时间 |
在线客服表含有在线客服ID、普通用户、用户姓名、咨询时间、咨询内容
回复内容、创建时间、更新时间等属性。如表3-6所示。
表3-6 在线客服结构表(online_service )
字段 | 类型 | 主键 | 外键 | 注释 |
online_service_id | int | 是 | 在线客服ID | |
regular_users | int | 普通用户 | ||
user_name | varchar | 用户姓名 | ||
consultation_time | datetime | 咨询时间 | ||
consultation_content | text | 咨询内容 | ||
reply_content | text | 回复内容 | ||
create_time | datetime | 创建时间 | ||
update_time | timestamp | 更新时间 |
第四章 详细设计及实现
4.1前台界面设计与实现
4.1.1用户登录界面
用户登录时按照要求正确输入账号和密码,若账号和密码若正确匹配的则进入系统前台页面,否则则登录失败,跳回网站首页。
用户登录流程图如下所示。
图4-1 用户登录流程图
用户登录页面设计如下图所示。
图4-2 登录页面设计
4.1.2用户注册界面
普通用户注册后可以使用账号密码可进行登录,使用系统功能;用户登录时按照要求输入用户名和密码,系统中函数在数据库中查询用户名和密码若有匹配的则进入系统普通用户页面,否则证明非该网站用户,跳回网站首页。
用户注册流程图如下所示。
图4-3 用户注册流程图
用户注册页面设计如下图所示。
图4-4 用户注册页面设计
4.1.3广告信息界面
当普通用户点击“广告信息”这一按钮,可以查看管理员发布的所有广告信息详情信息,可通过广告标题、广告类型、排序进行搜索,并可一进行收藏操作。
广告信息搜索流程图如下所示。
图4-5 广告信息搜索流程图
广告信息页面设计如下图所示。
图4-6 广告信息详情页面设计
4.1.4广告展位界面
普通用户点击“广告展位”这一按钮,可以查看管理员发布的所有广告展位详情信息,可通过展位标题、展位类型、排序进行搜索,并可以进行购买操作。
广告展位购买流程图如下所示。
图4-7 广告展位购买流程图
广告展位页面设计如下图所示。
图4-8 广告展位页面设计
4.1.5二手房源界面
当普通用户点击“二手房源”这一按钮,可以查看管理员发布的所有二手房源详情信息,可通过房屋名称、所在地区、房屋面积、房屋户型、排序进行搜索,并可以进行咨询、约看、预订、收藏操作。
例如,二手房源咨询、约看、预订流程图如下所示。
图4-9 二手房源咨询、约看、预订流程图
二手房源页面设计如下图所示。
图4-10 二手房源详情页面设计
4.1.6在线客服界面
当普通用户点击“在线客服”这一按钮,可以对在线客服发起咨询,填写并提交咨询信息。
在线客服咨询流程图如下所示。
图4-11 在线客服咨询流程图
在线客服页面设计如下图所示。
图4-12 在线客服页面设计
4.1.7个人中心界面
当普通用户点击“个人中心”这一按钮,可以对个人首页、展位购买、二手房源、房屋咨询、房屋约看、房屋预订、房屋交易、房屋过户、在线客服、收藏等信息进行管控,可以查看以上各项功能的详情信息。例如,可以对自己提交的展位购买进行支付操作;可以增改删查自己的二手房源信息;可以查询房屋咨询和在线客服信息,进入详情页查看给自己的咨询回复,并且可以回复自己的二手房源咨询信息;查询和管理自己的房屋约看、房屋预订、房屋交易、房屋过户、收藏信息。
例如,个人中心二手房源管理添加流程图如下所示。
图4-13 个人中心二手房源管理添加流程图
个人中心页面设计如下图所示。
图4-14 个人中心页面设计
4.2后台功能设计与实现
4.2.1登录模块
管理员账号密码由系统生成,经纪人账号信息由管理员添加,管理员和经纪人可使用账号密码可进行登录,进入后台首页界面,并能够使用系统功能,和对个人信息和密码进行管理。
登录流程图如下所示。
图4-15 登录流程图
登录页面设计如下图所示。
图4-16 登录页面设计
4.2.2管理员系统用户界面
管理员可以对普通用户、经纪人和管理员进行管控,包括进行增删改查操作,可以查看普通用户、经纪人和管理员的详情信息,经纪人账号信息由管理员添加。
系统用户流程图如下所示。
图4-17 管理员系统用户流程图
系统用户页面设计如下图所示。
图4-18 管理员系统用户页面设计
4.2.3管理员广告信息界面
当管理员点击“广告信息”这一按钮,可以查看所有广告信息详情信息,进行增删改查操作,可通过广告标题、广告类型进行搜索。
广告信息流程图如下所示。
图4-19 管理员广告信息流程图
广告信息页面设计如下图所示。
图4-20 管理员广告信息页面设计
4.2.4管理员展位购买界面
当管理员点击“展位购买”这一按钮,可以查看所有展位购买详情信息,进行查询和删除操作,可通过展位标题、展位类型、用户姓名、支付状态进行搜索,并可点击支付,修改支付状态。
展位购买管理流程图如下所示。
图4-21 管理员展位购买流程图
展位购买页面设计如下图所示。
图4-22 管理员展位购买添加页面设计
4.2.5管理员二手房源管理界面
当管理员点击“二手房源”这一按钮,可以查看所有二手房源详情信息,进行查询和删除操作,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索。
二手房源管理流程图如下所示。
图4-23 管理员二手房源管理流程图
二手房源管理页面设计如下图所示。
图4-24 管理员二手房源管理页面设计
4.2.6管理员在线咨询管理界面
当管理员点击“在线客服”这一按钮,可以查看所有在线客服详情信息,进行增删改查操作,可以进行回复用户咨询内容,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索。
在线咨询管理流程图如下所示。
图4-25 管理员在线咨询管理流程图
在线咨询管理页面设计如下图所示。
图4-26 管理员在线咨询管理页面设计
4.2.7经纪人房屋预订管理界面
当经纪人点击“房屋预订”这一按钮,可以查看自己的房屋预订详情信息,进行查询操作,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索,并可以点击房屋交易,录入并提交房屋交易信息。
房屋预订管理流程图如下所示。
图4-27 经纪人房屋预订管理流程图
房屋预订管理页面设计如下图所示。
图4-28 经纪人房屋预订管理添加页面设计
4.2.8经纪人房屋交易管理界面
当经纪人点击“房屋交易”这一按钮,可以查看自己的房屋交易详情信息,进行查询操作,可通过房屋名称、所在地区、房屋面积、房屋户型进行搜索,并可以点击房屋过户,录入并提交房屋过户信息。
房屋交易管理流程图如下所示。
图4-29 经纪人房屋交易管理流程图
房屋交易管理页面设计如下图所示。
图4-30 经纪人房屋交易管理页面设计
4.3数据库连接
从Springboot+jsp架构的原理可知,广告信息推荐系统分析系统的各大模块的实现均需要对数据库的数据进行操作,具体包括查询数据、写入数据、更新数据和删除数据。
数据库查询流程图如下图所示。
图4-31 数据库查询流程图
数据库配置文件关键代码如下:
db = SQLAlchemy()
app = Springboot+jsp(__name__, static_folder='static')
# 数据库链接配置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@127.0.0.1:3306/projectxxxxx'
app.secret_key = 'v&#prqo7t*(!ktb+8r=+83@#_$n1pg_xig$j=6v^r3#$i)wx87'
db.init_app(app)
app.config['UPLOAD_FOLDER'] = 'static/upload'
第五章 系统测试
5.1测试任务及目的
系统测试就是以发现程序错误或不稳定性而执行程序的过程。因此,在这个产品被投入使用前,首先需要进行试用,这是重要的环节。考虑到某个部分的开发没有缺陷情况下,把各种模块拼接,也有一定概率就存在矛盾。这就好比每个人都很独特,但聚在一起就显得杂乱无章,需要保证有默契的配合。对于测试,要看它的各项内容是否契合的原则。若与最初定下的标准有一定程度上的出入,那么就需要做出一些调整,让最终的大方向朝着目标前进。
5.2测试计划
测试有白盒测试和黑盒测试两种方式。
其中,白盒测试是将软件看成一个透明的白盒子,按照程序的内部控制结构和处理技术逻辑来选定测试用例、软件系统测试的逻辑路径及过程需要进行管理测试,又称玻璃盒测试。因此白盒测试需要选择足够多的测试用例,覆盖尽可能多的代码来发现程序中的错误。
黑盒测试,也称为功能测试。它将需软件看作一个黑盒,像一个注册用户一样来模拟软件的使用流程。黑盒测试通过大量的输入边界值或错误数据,来检查是否可产生正确的输出。
本系统测试 主要选择黑盒测试,少量采用白盒测试。通过测试达到以下测试目的:
1.检查各大功能模块的运行,确保其能够正确运行,并检查各页面的完整性,保证页面完整。
2.检查各个接口是否可以正确地输入和输出,保证数据流通稳定可行。
3.检查数据结构,保证其和外部接口没有访问错误,访问顺利。
4.检查原计划的性能需求有没有完成,运行流畅。
5.3测试用例
5.3.1登录模块测试用例
下表是系统登录功能测试用例,检测了用户名和密码的不同的输入情况,观察系统的响应情况。得出该功能达到了设计目标。
表5-1 系统登录功能测试用例
用例名称 | 用户登录系统 |
目的 | 测试用户通过正确的用户名和密码可否登录功能 |
前提 | 未登录的情况下 |
测试流程 | 1) 进入登录页面 2) 输入正确的用户名和密码 |
续表例
预期结果 | 用户名和密码正确的时候,跳转到登录成功界面,反之则显示错误信息,提示重新输入 |
实际结果 | 实际结果与预期结果一致 |
5.3.2注册模块测试用例
下表是注册功能测试用例,检测了各种注册数据的输入情况,观察系统的响应情况。得出该功能达到了设计目标。
表5-2 注册功能测试用例
用例名称 | 用户注册账号 |
目的 | 测试用户通过正确的注册信息可否进行注册 |
前提 | 未注册的情况下 |
测试流程 | 1) 进入注册页面 2) 输入正确的注册信息 |
预期结果 | 注册信息都正确的时候,跳转到登录成功界面,反之则显示错误信息,提示重新输入 |
实际结果 | 实际结果与预期结果一致 |
5.3.3广告信息查看模块测试用例
下表是广告信息查看功能的测试用例,检测了广告信息功能中对广告信息的展示查看操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
表5-3 广告信息查看的测试用例
用例名称 | 广告信息查看 |
目的 | 测试广告信息查看功能 |
前提 | 用户登录系统 |
测试流程 | 点击广告信息列表 |
预期结果 | 可以查看到展示的所有广告信息 |
实际结果 | 实际结果与预期结果一致 |
5.3.4二手房源添加模块测试用例
下表是二手房源添加功能的测试用例,检测了在二手房源中对二手房源进行增加操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
表5-4 二手房源添加的测试用例
用例名称 | 二手房源发布测试用例 |
目的 | 测试二手房源发布功能 |
前提 | 管理员、用户正常登录情况下 |
测试流程 | 1)管理员在后台点击二手房源管理,用户在前台点击个人中心二手房源,然后点击添加后并填写信息。 2)点击进行提交。 |
预期结果 | 提交以后,页面首页会显示新的二手房源信息 |
实际结果 | 实际结果与预期结果一致 |
5.3.5广告展位搜索模块测试用例
下表是广告展位搜索功能的测试用例,检测了在广告展位中对广告展位进行搜索操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
表5-5 广告展位搜索的测试用例
用例名称 | 广告展位搜索测试 |
目的 | 测试广告展位搜索功能 |
前提 | 管理员、用户登录系统 |
测试流程 | 1)在搜索框填入搜索关键字。 2)点击搜索按钮。 |
预期结果 | 页面显示包含有搜索关键字的广告展位 |
实际结果 | 实际结果与预期结果一致 |
5.3.6密码修改模块测试用例
下表是密码修改功能的测试用例,检测了管理员、普通用户、经纪人进行修改密码的操作。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
表5-6 密码修改的测试用例
用例名称 | 密码修改测试用例 |
目的 | 测试管理员、普通用户、经纪人密码修改功能 |
前提 | 管理员用户正常登录情况下 |
测试流程 | 1)进行密码修改并完成填写。 2)点击进行提交。 |
预期结果 | 使用新的密码可以登录 |
实际结果 | 实际结果与预期结果一致 |
5.4测试结论
通过编写庀材二手房交易平台的部分测试用例,已经检测完毕包括但不限于检测了用户登录、注册、广告信息查看、二手房源添加、广告展位搜索、密码修改等方面的功能测试,显示功能在测试中表现良好,并且符合预期。用户能够成功登录系统,查看各项信息并完成相应操作任务,确保系统能够稳定运行,未发现严重问题。因此,从整体捡来,系统通过这几大模块的功能测试,各功能模块均正常运作,符合设计要求,能够保证相关数据库的信息也同样正确,为庀材二手房交易平台管理系统的后期推广运营提供了强力的技术支撑。
结 论
本文总结了庀材二手房交易平台的项目背景、项目意义、研究现状,介绍了相关的开发工具和开发技术,然后阐述了系统的具体业务需求,并根据系统需求对系统结构以及功能模块等进行了详细地设计,将整个系统划分为多个不同的功能模块。在分析系统功能需求时,对整个系统的总体架构以及功能模块等进行了分析,并选择合适的系统开发技术完成了对各个模块的开发工作。系统开发完成之后进行了部署,同时进行了系统的测试过程,通过测试证明了系统在功能以及性能等方面都达到了预期的要求,具有较高的稳定性与可靠性。
利用Spring Boo、Java、MySQL开发的庀材二手房交易平台是一个涉及多个技术领域的复杂项目。该系统利用Spring Boot框架快速搭建后端服务,使用Java作为主要编程语言,MySQL作为数据库存储数据。实现了包括但不限于系统用户、广告信息管理、广告展位管理、展位购买管理、二手房源管理、房屋咨询管理、房屋约看管理、房屋预订管理、房屋交易管理、房屋过户管理、在线客服管理、系统管理、公告信息管理、资源管理等功能模块,提升庀材二手房交易成功率和管理服务水平,推进庀材二手房交易向便捷化、智能化、信息化发展。
在系统开发过程中,充分利用Spring Boot框架的优势,简化开发流程,提高开发效率。通过模块化设计,将系统分解为独立的功能模块,有助于提高代码复用性和系统可维护性。系统测试阶段编写了详细的测试用例,确保各功能模块的正常运作,保证系统质量和稳定性。
同时,在本次项目中我也暴露了诸多问题。对于Java的编程知识有所欠缺,环境配置和算法上出现诸多问题,时常导致项目运行出错,或者目标的实现有问题。或者实现想法时算法未优化,使得代码冗长,程序运行不顺畅。通过总结项目经验和反思挑战,个人可以不断改进工作流程,提高技术水平和解决问题的能力。这样的经验积累和反思将有助于个人在未来的项目中更好地应对挑战,提供更优质的软件解决方案,为用户带来更好的体验和价值。
谢 辞
至此论文结束,感谢您的阅读。逝者如斯夫,不舍昼夜。转眼间,大学生活便已经接近尾声,在此,我想用真挚的心意向一些特别的人们表达我的感激之情。
在此我要特别的感谢我的导师,虽然我在实习期间很忙,论文撰写的时候经常是停停改改,但是我的导师依旧十分的负责,时不时的询问我的任务进展情况,跟进我的论文进度,在指导老师的帮助下,我逐步完成了自己的论文和程序,从导师身上也学习到很多知识和经验,这些知识和经验令我受益匪浅。同时我也从导师身上看到了自己的不足,不论是在技术层面上还是在对待工作的态度上,导师如同明镜一般照出了我的缺点我的不足。同时,我还要感谢在我实习期间在论文和程序上帮助过我的同学和社会人士,此前我对于springboot方面的一些知识还不了解,是他们在我编写程序过程中给了我很多的启发和感想,也帮助了我对于程序的调试和检测。没有他们我是不能顺利完成本次毕业设计的。此外,我要衷心感谢我的父母和家人。他们一直以来给予我无私的支持和鼓励,是我坚强的后盾。他们的理解与支持让我能够专注于学业,并为我提供了一个温暖的家庭环境。没有他们,我无法顺利完成这篇论文。至此,我的毕业设计就花上了一个圆满的句号了。
少年,追风赶月莫停留,平荒尽处是春山。
参考文献
- 吴铎思,马安妮.二手房“去中介”难在哪里[N].工人日报,2024-03-05(007).DOI:10.28277/n.cnki.ngrrb.2024.001065.
- 夏金彪.发挥“房东直售”在二手房交易市场中的“鲶鱼效应”[N].中国经济时报,2024-02-28(002).DOI:10.28427/n.cnki.njjsb.2024.000130.
- 孙铁强,刘俊,于洪健,等.基于SpringBoot框架的在线监测和专家系统的研究[J].自动化应用,2024,65(04):15-16+19.DOI:10.19769/j.zdhy.2024.04.006.
- 翟祥栩,陈谦民,陈宗玉.基于SpringBoot的农业大数据一站式分析预测平台的设计与实现[J].现代信息科技,2023,7(24):6-10+15.DOI:10.19850/j.cnki.2096-4706.2023.24.002.
- 吴昊,张丹.基于SpringBoot框架的大学生网上兼职系统设计与实现[J].电脑知识与技术,2023,19(35):68-72.DOI:10.14004/j.cnki.ckt.2023.1860.
- 崔臣,宋甲旭.基于SpringBoot的校园二手交易系统研究[J].无线互联科技,2023,20(18):31-34.
- 邵子尧,姜怡,南林娜,等.基于区块链的长租房可靠交易系统设计与实现[J].智能计算机与应用,2023,13(04):84-90.
- Yang Y .Design and Implementation of Student Information Management System Based on Springboot[J].Advances in Computer, Signals and Systems,2022,6(6):
- 陈小燕,朱映辉,余晓春.基于SpringBoot+Vue的好农物商城的设计与实现[J].电脑知识与技术,2022,18(22):37-39.DOI:10.14004/j.cnki.ckt.2022.1535.
- Hejing W .Commerce Middle Office Management System Based on Springboot[J].International Journal of Advanced Network, Monitoring and Controls,2022,7(2):32-45.
- 李元博,王法胜.校园二手商品交易平台设计与实现[J].电脑知识与技术,2021,17(29):64-67+84.DOI:10.14004/j.cnki.ckt.2021.2807.
- 张阿嫱.杭州上线官方二手房交易平台[N].中国城市报,2021-08-30(A05).DOI:10.28056/n.cnki.nccsb.2021.000938.
- 王苏皖,徐伟业,马湘蓉.基于JAVA的校园二手物交易网站设计[J].电子技术与软件工程,2021,(13):148-149.
- 唐苏旭.基于SpringBoot的房屋租赁系统的设计与实现[D].首都经济贸易大学,2021.DOI:10.27338/d.cnki.gsjmu.2021.000801.
- 陈冰.基于SpringBoot的校园二手商品交易系统的设计与实现[D].华中师范大学,2021.DOI:10.27159/d.cnki.ghzsu.2021.003139.
- 陆献恒,黄琳.基于Java web的学校二手交易市场系统设计[J].信息系统工程,2021,(02):94-95.
- Chen G ,Xu J .Design and implementation of efficient Learning platform based on SpringBoot Framework[J].Journal of Electronics and Information Science,2020,6(1):
- 王超,张琪立,田广强,等.基于Springboot框架的学校机房计费管理系统的设计与实现[J].电子技术与软件工程,2020,(23):159-160.
- 贾志勇.基于SpringBoot的下沉市场交易平台的设计与实现[D].安徽大学,2020.DOI:10.26917/d.cnki.ganhu.2020.000917.
- 周国良.基于区块链的二手房交易系统的设计[J].信息与电脑(理论版),2020,32(01):79-82.
连接数据库的文件在Resources 文件夹下的application.yml文件,代码如下:
server:
port: 5000
servlet:
context-path: /api
spring:
mvc:
static-path-pattern: /upload/**
resources:
static-locations: file:此处填写地址/project93355/server/src/main/resources/static
datasource:
jdbc:mysql://127.0.0.1:3306/projectxxxxx?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
jackson:
property-naming-strategy: CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
default-property-inclusion: ALWAYS
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
servlet:
multipart:
max-file-size: 500MB
max-request-size: 500MB
redis:
host: 127.0.0.1
port: 6379
password:
database: 2
lettuce:
pool:
max-idle: 30
min-idle: 10
max-active: 30
max-wait: 10000
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
type-aliases-package: com.project.demo.entity
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
use-column-label: true
map-underscore-to-camel-case: false
lazy-loading-enabled: true
aggressive-lazy-loading: false
use-generated-keys: true
项目启动文件Application.java,代码如下:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableJpaRepositories
@MapperScan("com.project.demo.dao")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
登陆拦截管理器,在config文件夹下的WebAppConfig.java文件,代码如下:
package com.project.demo.config;
@Configuration
@Slf4j
public class WebAppConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//登录拦截的管理器
InterceptorRegistration registration = registry.addInterceptor(loginInterceptor());
//拦截的地址
registration.addPathPatterns("/**");
//根据需要拦截,一般设置所有地址拦截,放行公共连接
}
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
}
登陆接受管理器,在interceptor文件夹下的LoginInterceptor.java文件,控制请求头代码如下:
package com.project.demo.interceptor;
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
private String tokenName = "x-auth-token";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader(this.tokenName);
setHeader(request, response);
log.info("[请求接口] - {} , [请求类型] - {}",request.getRequestURL().toString(),request.getMethod());
if (request.getRequestURL().toString().contains("/api/user/login")){
return true;
}
else if (request.getRequestURL().toString().contains("/api/user/state")){
return true;
}
else if (request.getRequestURL().toString().contains("/api/user/register")){
return true;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
//更新token
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
private void failure(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setHeader("Content-type", "application/json;charset=UTF-8");
response.setStatus(401);
response.sendRedirect("https://www.baidu.com");
}
private void setHeader(HttpServletRequest request, HttpServletResponse response) {
//跨域的header设置
response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
response.setHeader("Access-Control-Max-Age", "1800");
//防止乱码,适用于传输JSON数据
response.setHeader("Content-Type", "application/json;charset=UTF-8");
response.setStatus(HttpStatus.OK.value());
}
}
组装sql语句,在constant文件夹下的FindConfig.java文件,代码如下:
package com.project.demo.constant;
public class FindConfig {
public static String PAGE = "page";
public static String SIZE = "size";
public static String LIKE = "like";
public static String ORDER_BY = "orderby";
public static String FIELD = "field";
public static String GROUP_BY = "groupby";
public static String MIN_ = "_min";
public static String MAX_ = "_max";
public static String SQLHWERE = "sqlwhere";
}
项目采用三层架构controller(每一个实体对应一个controller),entity(项目表实体),service
,Controller 均继承自BaseController,注入两个对象,一个是实体类(以Auth为例),另一个是其AuthService:
@RestController
@RequestMapping("auth")
public class AuthController extends BaseController<Auth, AuthService> {
/**
* 服务对象
*/
@Autowired
public AuthController(AuthService service) {
setService(service);
}
}
Controller用于spring控制请求的地址
新增一条数据,通过post传入一个json对象,然后经过request.getReader(),最后经过readBody()转成一个Map,含有String和Object,key用的是字段名,Object存放数据,最终得到Map,insert用拼装sql,读取body,组装成一个insert对象,runCountSql()语句,代码如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
service.insert(service.readBody(request.getReader()));
return success(1);
}
public Map<String, Object> addMap(Map<String,Object> map){
service.insert(map);
return success(1);
}
修改一个数据,原理与add基本一致,不同点在于通过readConfig()读取关键字,以及通过readQuery()获取URL后面?指定位置的标识,转成Map对象后,执行update操作,同样通过拼接的sql语句执行,执行过程读取query,toWhereSql()语句完成数据库操作,body为修改对象的值,代码如下:
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));
return success(1);
}
删除一条数据,通过readQuery(),获取URL后面的对象地址,删除FROM具体的table,query删除查询FindConfig语句,代码如下:
@RequestMapping(value = "/del")
@Transactional
public Map<String, Object> del(HttpServletRequest request) {
service.delete(service.readQuery(request), service.readConfig(request));
return success(1);
}
public void delete(Map<String,String> query,Map<String,String> config){
QueryWrapper wrapper = new QueryWrapper<E>();
toWhereWrapper(query, "0".equals(config.get(FindConfig.GROUP_BY)),wrapper);
baseMapper.delete(wrapper);
log.info("[{}] - 删除操作:{}",wrapper.getSqlSelect());
}
通过请求的参数获取一条数据,通过readQuery(),获取URL后面的对象地址,查询FindConfig语句,select筛选Map对象,FIELD为查询字段,未传输的情况下传入“*”,代码如下:
@RequestMapping("/get_obj")
public Map<String, Object> obj(HttpServletRequest request) {
List resultList = service.selectBaseList(service.select(service.readQuery(request), service.readConfig(request)));
if (resultList.size() > 0) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("obj",resultList.get(0));
return success(jsonObject);
} else {
return success(null);
}
}
通过请求的参数获取列表数据,代码如下:
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
获取某个组下面的数量,代码如下:
@RequestMapping(value = {"/count_group", "/count"})
public Map<String, Object> count(HttpServletRequest request) {
Integer value= service.selectSqlToInteger(service.groupCount(service.readQuery(request), service.readConfig(request)));
return success(value);
}
获取某个组下面的总计值,代码如下:
@RequestMapping(value = {"/sum_group", "/sum"})
public Map<String, Object> sum(HttpServletRequest request) {
Integer value = service.selectSqlToInteger(service.sum(service.readQuery(request), service.readConfig(request)));
return success(value);
}
图片/文件/视频等的上传方法通过MultipartFile,代码如下:
@PostMapping("/upload")
public Map<String, Object> upload(@RequestParam("file") MultipartFile file) {
log.info("进入方法");
if (file.isEmpty()) {
return error(30000, "没有选择文件");
}
try {
//判断有没路径,没有则创建
String filePath = System.getProperty("user.dir") + "/src/main/resources/static/";
File targetDir = new File(filePath);
if (!targetDir.exists() && !targetDir.isDirectory()) {
if (targetDir.mkdirs()) {
log.info("创建目录成功");
} else {
log.error("创建目录失败");
}
}
String fileName = file.getOriginalFilename();
File dest = new File(filePath + fileName);
log.info("文件路径:{}", dest.getPath());
log.info("文件名:{}", dest.getName());
file.transferTo(dest);
JSONObject jsonObject = new JSONObject();
jsonObject.put("url", "/api/upload/" + fileName);
return success(jsonObject);
} catch (IOException e) {
log.info("上传失败:{}", e.getMessage());
}
return error(30000, "上传失败");
}
注册页UserController.java,传入user对象,并将"user_id"、 "state"、 "user_group"、"login_time"、"phone"、"phone_state"、 "username"、"nickname"、"password"、"email"、"email_state"、"avatar"、"create_time"输入,重点是 "username"、"nickname"、"password"必须输入,通过获取username,数据库查询是否有该用户,如果存在,则提示“用户已存在”,否则执行将UserId置为空(数据库表中该字段已设置自动递增),代码如下:
/**
* 注册
* @param user
* @return
*/
@PostMapping("register")
public Map<String, Object> signUp(@RequestBody User user) {
// 查询用户
Map<String, String> query = new HashMap<>();
Map<String,Object> map = JSON.parseObject(JSON.toJSONString(user));
query.put("username",user.getUsername());
List list = service.selectBaseList(service.select(query, new HashMap<>()));
if (list.size()>0){
return error(30000, "用户已存在");
}
map.put("password",service.encryption(String.valueOf(map.get("password"))));
service.insert(map);
return success(1);
}
注册页password则使用了MD5加密,代码如下:
public String encryption(String plainText) {
String re_md5 = new String();
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
re_md5 = buf.toString();
} catch (Exception e) {
e.printStackTrace();
}
return re_md5;
}
登录页,首先传入"username"、"email"、"phone"、"password",用户可通过用户名、邮箱、手机号进行登陆,通过判断resultList来确定查询结果,然后执行查询用户组UserGroup,用户组里面不存在,依然报“用户不存在”,执行完以上代码,最后涉及到用户带有“审核”的,会查询examine_state(用户的审核状态),数据库表user_group中含有source_table和source_field进行查询,以上步骤完成,对输入的密码进行存储Token到数据库,匹对账号和密码,数据库中的AccessToken为令牌,用于身份认证,其代码如下:
/**
* 登录
* @param data
* @param httpServletRequest
* @return
*/
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
log.info("[执行登录接口]");
String username = data.get("username");
String email = data.get("email");
String phone = data.get("phone");
String password = data.get("password");
List resultList = null;
Map<String, String> map = new HashMap<>();
if(username != null && "".equals(username) == false){
map.put("username", username);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.selectBaseList(service.select(map, new HashMap<>()));
}else{
return error(30000, "账号或密码不能为空");
}
if (resultList == null || password == null) {
return error(30000, "账号或密码不能为空");
}
//判断是否有这个用户
if (resultList.size()<=0){
return error(30000,"用户不存在");
}
User byUsername = (User) resultList.get(0);
Map<String, String> groupMap = new HashMap<>();
groupMap.put("name",byUsername.getUserGroup());
List groupList = userGroupService.selectBaseList(userGroupService.select(groupMap, new HashMap<>()));
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String res = service.selectExamineState(userGroup.getSourceTable(),byUsername.getUserId());
if (res==null){
return error(30000,"用户不存在");
}
if (!res.equals("已通过")){
return error(30000,"该用户审核未通过");
}
}
//查询用户状态
if (byUsername.getState()!=1){
return error(30000,"用户非可用状态,不能登录");
}
String md5password = service.encryption(password);
if (byUsername.getPassword().equals(md5password)) {
// 存储Token到数据库
AccessToken accessToken = new AccessToken();
accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
accessToken.setUser_id(byUsername.getUserId());
Duration duration = Duration.ofSeconds(7200L);
redisTemplate.opsForValue().set(accessToken.getToken(), accessToken,duration);
// 返回用户信息
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
user.put("token", accessToken.getToken());
JSONObject ret = new JSONObject();
ret.put("obj",user);
return success(ret);
} else {
return error(30000, "账号或密码不正确");
}
}
找回密码,接收用户输入的用户名、密码、验证码,并进行条件判断,代码如下:
/**
* 找回密码
* @param form
* @return
*/
@PostMapping("forget_password")
public Map<String, Object> forgetPassword(@RequestBody User form,HttpServletRequest request) {
JSONObject ret = new JSONObject();
String username = form.getUsername();
String code = form.getCode();
String password = form.getPassword();
// 判断条件
if(code == null || code.length() == 0){
return error(30000, "验证码不能为空");
}
if(username == null || username.length() == 0){
return error(30000, "用户名不能为空");
}
if(password == null || password.length() == 0){
return error(30000, "密码不能为空");
}
// 查询用户
Map<String, String> query = new HashMap<>();
query.put("username",username);
List list = service.selectBaseList(service.select(query, service.readConfig(request)));
if (list.size() > 0) {
User o = (User) list.get(0);
JSONObject query2 = new JSONObject();
JSONObject form2 = new JSONObject();
// 修改用户密码
query2.put("user_id",o.getUserId());
form2.put("password",service.encryption(password));
service.update(query, service.readConfig(request), form2);
return success(1);
}
return error(70000,"用户不存在");
}
修改密码,通过请求data,获取旧密码,并将新密码重新赋值,期间都是需要通过加密,代码如下:
/**
* 修改密码
* @param data
* @param request
* @return
*/
@PostMapping("change_password")
public Map<String, Object> change_password(@RequestBody Map<String, String> data, HttpServletRequest request){
// 根据Token获取UserId
String token = request.getHeader("x-auth-token");
Integer userId = tokenGetUserId(token);
// 根据UserId和旧密码获取用户
Map<String, String> query = new HashMap<>();
String o_password = data.get("o_password");
query.put("user_id" ,String.valueOf(userId));
query.put("password" ,service.encryption(o_password));
int count = service.selectBaseCount(service.count(query, service.readConfig(request)));
if(count > 0){
// 修改密码
Map<String,Object> form = new HashMap<>();
form.put("password",service.encryption(data.get("password")));
service.update(query,service.readConfig(request),form);
return success(1);
}
return error(10000,"密码修改失败!");
}
免费领取项目源码,请关注❤点赞收藏并私信博主,谢谢-