摘 要
随着计算机技术的飞速发展,计算机在小区维修管理中应用的普及,利用计算机在实现小区维修的管理势在必行。当今社会正快速向信息化社会前进,信息自动化的作用也越来越大。从而使我们从繁杂的事务中解放出来,提高了我们的工作效率。目前很多物业的报修管理还处于人工管理的阶段,效率低下,已经远.远落后于当今技术的发展。所以急需一套这样的系统来进行小区维修管理平台。
要实现这样的功能,离不开后台数据库的支持。本文中数据库服务器端采用了MySQL作为后台数据库,以先进的Java技术与数据库连接,结合MySQL语句处理对信息分类,添加,删除,修改等操作,使Web与数据库紧密联系起来。
关键词:维修管理;MySQL;java;springboot
Springboot medical drug management system
Abstract
With the rapid development of computer technology and the popularity of the application of computers in the maintenance management of residential areas, it is imperative to use computers to realize the maintenance management of residential areas. Today's society is rapidly moving towards an information society, and the role of information automation is also increasing. This frees us from complicated affairs and improves our work efficiency. At present, the repair management of many properties is still in the stage of manual management, which is inefficient and far behind the development of today's technology. So there is an urgent need for such a system to carry out the community maintenance management platform.
To achieve such a function, the support of the background database is indispensable. In this paper, the database server uses MySQL as the background database, connects with the database with advanced Java technology, and processes information classification, addition, deletion, modification and other operations in combination with MySQL statements, so that the Web and the database are closely linked.
Key words:Maintenance management; MySQL; java; springboot
目录
1.1 研究目标
本论文论述的是一个简化的Web应用程序模型,基于Java技术,采用Web应用设计模式MVVM设计模式架构,使用B/S体系结构,前台为客户机浏览器,中间件服务器为Web服务器,后台为数据库服务器,使用IDEA作为开发工具,用Java语言来完成系统的开发,Java技术来设计网页,利用CSS+HTML设计网站页面布局及美化网页,根据JS脚本语言实现网页的动态性,MySQL 实现数据库的设计,用MySQL语句实现数据库的操作。我们的收费标准也很低,可以说相对来说,我们的服务又周到,设施安排又合理,我们的后台控制人员以及服务的人员可以很容易得学会。
1.2研究背景
随着科技的发展,人们对于生活质量提出了更高要求。为了保证小区正常运行和居民生命财产安全,需要做好小区维修管理工作,提高管理水平。而目前我国住宅小区普遍缺乏专业技术人员,难以开展相应工作;同时由于缺少完善的管理制度,使得许多问题出现。因此,为解决上述问题,建立一个高效,实用的管理系统是十分必要的。本文主要介绍一种基于B/S模式的小区维修管理平台的设计与实现方法,并对其功能进行阐述。该系统具有操作简单方便,界面友好等特点。可以广泛应用于各居民楼物业管理中。使小区管理更加科学,合理和规范。在一定程度上提高了居民生活水平和质量。
1.3spring boot框架介绍:
Spring框架是Java平台上的一种开源应用框架,提供具有控制反转特性的容器。尽管Spring框架自身对编程模型没有限制,但其在Java应用中的频繁使用让它备受青睐,以至于后来让它作为EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等等。Spring框架具有控制反转(IOC)特性,IOC旨在方便项目维护和测试,它提供了一种通过Java的反射机制对Java对象进行统一的配置和管理的方法。Spring框架利用容器管理对象的生命周期,容器可以通过扫描XML文件或类上特定Java注解来配置对象,开发者可以通过依赖查找或依赖注入来获得对象。Spring框架具有面向切面编程(AOP)框架,SpringAOP框架基于代理模式,同时运行时可配置;AOP框架主要针对模块之间的交叉关注点进行模块化。Spring框架的AOP框架仅提供基本的AOP特性,虽无法与AspectJ框架相比,但通过与AspectJ的集成,也可以满足基本需求。Spring框架下的事务管理、远程访问等功能均可以通过使用SpringAOP技术实现。Spring的事务管理框架为Java平台带来了一种抽象机制,使本地和全局事务以及嵌套事务能够与保存点一起工作,并且几乎可以在Java平台的任何环境中工作。Spring集成多种事务模板,系统可以通过事务模板、XML或Java注解进行事务配置,并且事务框架集成了消息传递和缓存等功能。Spring的数据访问框架解决了开发人员在应用程序中使用数据库时遇到的常见困难。它不仅对Java:JDBC、iBATS/MyBATIs、Hibernate、Java数据对象(JDO)、ApacheOJB和ApacheCayne等所有流行的数据访问框架中提供支持,同时还可以与Spring的事务管理一起使用,为数据访问提供了灵活的抽象。Spring框架最初是没有打算构建一个自己的WebMVC框架,其开发人员在开发过程中认为现有的StrutsWeb框架的呈现层和请求处理层之间以及请求处理层和模型之间的分离不够,于是创建了SpringMVC。
1.4相关技术介绍
(1)小区维修管理平台中的web后台管理中的后端不再使用古老的jsp+javabean+servlet技术,而是使用当前主流的springboot框架,它减少java配置代码,简化编程代码,目前springboot框架也是很多维修员选择的框架之一。
(2)小区维修管理平台中的web后台管理中的前端使用的是bootstrap框架,它配合ajax和jquery可以美化页面设计。
(3)流行vue框架结合jQuery技术,在jQuery基础上扩展一些插件,通过自己定义插件更好的实现前端的设计。
(4)小区维修管理平台中数据库用的mysql5.7,它执行效率高。
2 小区维修管理平台分析
通过了解对小区维修管理平台的真实需求后,将小区维修管理平台所需要的角色划分整理成了下图2-1,图2-2和图2-3。
从开发工具来看,由于小区维修管理平台是基于JAVA的,因此有很多开发工具都可以进行开发,这些功能强大的开发工具可以给我来设计小区维修管理平台带来非常大的方便。
从小区维修管理平台的本身技术来说,对于我来开发一个小区维修管理平台这个毕设是不费事的。小区维修管理平台的开发可以简单的分为前台端、后台端开发以及数据库开发。其中的大部分技术难点在我上学时已经使用过了,同时网络上很多技术点可以让我来借鉴。Web后台管理使用JAVA[9]的springboot架构开发,数据库使用mysql,页面上使用javascript[10]脚本,因此为我在开发小区维修管理平台这个毕设上省去了很多多余代码,这给我的毕设项目编写带来了极大的便利。综上所述,从技术层面来看开发小区维修管理平台是可行的。
从用户体验来看,市面上很多被广泛使用的系统案例可以让我来参考,因此我可以综合它们的页面交互设计的优点,基于我的毕设项目特点来进行改版,最后达到令用户满意的页面交互体验。综上所述,从技术层面来看开发小区维修管理平台是可行的。
从小区维修管理平台的开发成本来看,小区维修管理平台的设计和开发都是我自己完成的,没有其他成本上的开销。
从小区维修管理平台的维护成本来看,小区维修管理平台的开发遵循一套完整的代码编写规范,并且小区维修管理平台的结构设计非常灵活,遵循高内聚低耦合的原则,因此易于维护和迭代开发。
在小区维修管理平台上线之后,上线前期我会根据真实需求来调查,对使用我开发的小区维修管理平台来制定一套符合的使用费。系统运行稳定后我会将推广范围到其他的校园当中,其他校园可以使用我的小区维修管理平台,只需要缴纳一点点的定金,我会给他们引入广告投资和自营业务。
综合以上的分析,小区维修管理平台所带来的经济效益将会带来极大的收益。并且随着我的推广,来使用我开发的小区维修管理平台的市场将越来越大,小区维修管理平台带来的利润也就越来越多。因此,从经济层面来看开发小区维修管理平台的是可行的。
小区维修管理平台从角色上划分为了社区用户、维修员、管理员三种角色。
管理员用户角色:
(1)登录:管理员的账号是在数据表表中直接设置生成的,不需要进行注册;
(2)资源管理:当点击“资源管理”这一菜单的时候,会出新闻列表+新闻分类两个子菜单,可以对这两个模块进行增删改查操作;
(3)系统用户:当点击“系统用户”这一菜单的时候,会出现管理员+社区用户+维修员这三个子菜单,可以对这三个模块进行增删改查操作;
(4)交流管理:当点击“交流管理”这一菜单的时候,会出现留言板+留言分类这两个子菜单,可以对留言板进行增删改查操作;
(5)模块管理:当点击“模块”这一菜单的时候,会出现维修人员+维修上报+分配任务+情况调查+维修计划+实施维修+维修结束+回访信息+评价信息这九个子菜单,能够对折九个模块进行增删改查操作;
(6)社区公告管理:当点击“社区公告管理”这一菜单的时候,会出社区公告这一个子菜单,可以对社区公告进行增删改查操作;
社区用户角色:
(1)注册登录模块:当用户想要进入本小区维修管理平台中对资讯进行查看评论以及了解维修信息等操作的时候,就必须要登录到系统当中,要是新的用户没有小区维修管理平台的账号的话,点击“注册”按钮,就会进入到新用户注册这个界面上,用户输入对应的账号(必须填写)+密码(必须填写)+确认密码(必须填写,而且要与密码一直)+昵称+邮箱+手机号+选择用户身份等等,然后点击“注册”,系统在用户这一数据库中会查询账号是不是存在,两次密码是不是一样,都填写正确就会注册成功,然后再进行登录,如果是之前已经注册过的用户很长时间没有使用,忘记密码,也可以点击“忘记密码”进行找回;
(2)留言板:在首页导航栏上我们会看到“留言板”这一菜单,我们点击进入进去以后,会看到所有留言信息,在这个界面,我们可以点击进入进行查看、评论、点赞等;
(3)社区公告:在首页导航栏上我们会看到“社区公告”这一菜单,我们点击进入进去以后,会看到所有管理员在后台发布的公告信息;
(4)我的收藏:在“我的”下可以查看管理“我的收藏”信息,可以查看收藏,也可以对不喜欢的信息进行删除收藏;
(5)我的账户:当用户点击右上角“我的”这个按钮,会出现子菜单,点击“我的账户”可以对个人的资料以及登录系统的密码进行设置;
(6)个人中心:当用户点击右上角“我的”这个按钮,就会进入到对应的后台进行信息的管理了;
(7)维修人员:在首页导航栏上点击“维修人员”弹跳出的是维修人员列表,可以点击随意一款维修人员进行了解其具体信息。包括维修人员、工作标签、工龄等;
(8)维修上报:在“维修上报”下拉查看具体某个维修上报下方点击按钮,具体再输入上报编号、社区住址、社区用户、联系电话、上报内容等信息进行提交;
维修员角色:
(1)分配任务管理;维修员对分配任务信息进行查询管理等;
(2)实施维修管理:维修员对实施维修信息进行重置、查询、添加管理等;
(3)维修结束管理:维修员对维修结束信息进行重置、查询、添加管理等;
小区维修管理平台的非功能性需求比如小区维修管理平台的安全性怎么样,可靠性怎么样,性能怎么样,可拓展性怎么样等。具体可以表示在如下2-1表格中:
表2-1小区维修管理平台非功能需求表
安全性 | 主要指小区维修管理平台数据库的安装,数据库的使用和密码的设定必须合乎规范。 |
可靠性 | 可靠性是指小区维修管理平台能够安装用户的指示进行操作,经过测试,可靠性90%以上。 |
性能 | 性能是影响小区维修管理平台占据市场的必要条件,所以性能最好要佳才好。 |
可扩展性 | 比如数据库预留多个属性,比如接口的使用等确保了系统的非功能性需求。 |
易用性 | 用户只要跟着小区维修管理平台的页面展示内容进行操作,就可以了。 |
可维护性 | 小区维修管理平台开发的可维护性是非常重要的,经过测试,可维护性没有问题 |
2.3 系统用例分析
根据上一节功能分析,可以得出系统的用例,社区用户角色用例如图2.1所示。
![](https://i-blog.csdnimg.cn/blog_migrate/3b700fc626983d88344fb8ff256850c2.png)
图2.1 小区维修管理平台中社区用户角色用例图
管理员角色用例如图2.2所示。
![](https://i-blog.csdnimg.cn/blog_migrate/aff4ccd6e2f7220966abe009267121a7.png)
图2.2 小区维修管理平台管理员角色用例图
维修员角色用例如图2.3所示。
![](https://i-blog.csdnimg.cn/blog_migrate/600532ac20c70a2881e5a5f165a426c7.png)
图2.3 小区维修管理平台中维修员角色用例图
3 小区维修管理平台总体设计
根据第二章中小区维修管理平台的功能分析可知,小区维修管理平台中整体功能模块图如图3.1所示,
![](https://i-blog.csdnimg.cn/blog_migrate/19ef2df9d0c5234f1ff781180593e5cf.png)
图3.1 小区维修管理平台功能模块图
3.3.1 数据库概念结构设计
下面是整个小区维修管理平台中主要的数据库表总E-R实体关系图。
![](https://i-blog.csdnimg.cn/blog_migrate/d7280986e422292e22be542126f9bee4.png)
图3.2 小区维修管理平台总E-R关系图
通过上一小节中小区维修管理平台中总E-R关系图上得出一共需要创建很多个数据表。在此我主要罗列几个主要的数据库表结构设计。
situation_survey表:
类型 | 长度 | 不是null | 主键 | 注释 | |
situation_survey_id | int | 11 | 是 | 是 | 情况调查ID |
report_no | varchar | 64 | 是 | 否 | 上报编号 |
community_users | int | 11 | 否 | 否 | 社区用户 |
community_address | varchar | 64 | 否 | 否 | 社区住址 |
contact_number | varchar | 16 | 否 | 否 | 联系号码 |
report_content | text | 0 | 否 | 否 | 上报内容 |
repair_personnel | int | 11 | 否 | 否 | 维修人员 |
investigation | text | 0 | 否 | 否 | 调查情况 |
submission_date | date | 0 | 否 | 否 | 提交日期 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
examine_reply | varchar | 16 | 否 | 否 | 审核回复 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
return_visit_information表 | |||||
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
return_visit_information_id | int | 11 | 是 | 是 | 回访信息ID |
report_no | varchar | 64 | 否 | 否 | 上报编号 |
community_users | int | 11 | 否 | 否 | 社区用户 |
community_address | varchar | 64 | 否 | 否 | 社区住址 |
contact_number | varchar | 16 | 否 | 否 | 联系号码 |
repair_personnel | int | 11 | 否 | 否 | 维修人员 |
date_of_return_visit | date | 0 | 否 | 否 | 回访日期 |
return_visit_information | text | 0 | 否 | 否 | 回访信息 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
examine_reply | varchar | 16 | 否 | 否 | 审核回复 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
repair_personnel表: | |||||
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
repair_personnel_id | int | 11 | 是 | 是 | 维修人员ID |
repair_personnel | int | 11 | 否 | 否 | 维修人员 |
head_portrait | varchar | 255 | 否 | 否 | 头像 |
work_tag | varchar | 64 | 否 | 否 | 工作标签 |
working_years | int | 11 | 否 | 否 | 工龄 |
good_at_aspects | varchar | 64 | 否 | 否 | 善于方面 |
details | longtext | 0 | 否 | 否 | 详情介绍 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
perform_maintenance表: | |||||
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
perform_maintenance_id | int | 11 | 是 | 是 | 实施维修ID |
report_no | varchar | 64 | 是 | 否 | 上报编号 |
community_users | int | 11 | 否 | 否 | 社区用户 |
community_address | varchar | 64 | 否 | 否 | 社区住址 |
contact_number | varchar | 16 | 否 | 否 | 联系号码 |
repair_personnel | int | 11 | 否 | 否 | 维修人员 |
maintenance_plan | longtext | 0 | 否 | 否 | 维修计划 |
implementation_date | date | 0 | 否 | 否 | 实施日期 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
community_users表: | |||||
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
community_users_id | int | 11 | 是 | 是 | 社区用户ID |
user_name | varchar | 64 | 否 | 否 | 用户姓名 |
gender | varchar | 64 | 否 | 否 | 性别 |
community_address | varchar | 64 | 否 | 否 | 社区住址 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
user_id | int | 11 | 是 | 否 | 用户ID |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
end_of_maintenance表: | |||||
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
end_of_maintenance_id | int | 11 | 是 | 是 | 维修结束ID |
report_no | varchar | 64 | 是 | 否 | 上报编号 |
community_users | int | 11 | 否 | 否 | 社区用户 |
community_address | varchar | 64 | 否 | 否 | 社区住址 |
contact_number | varchar | 16 | 否 | 否 | 联系号码 |
repair_personnel | int | 11 | 否 | 否 | 维修人员 |
end_date | date | 0 | 否 | 否 | 结束日期 |
singular | varchar | 64 | 否 | 否 | 单数 |
maintenance_information | text | 0 | 否 | 否 | 维护信息 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
evaluation_information表: | |||||
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
evaluation_information_id | int | 11 | 是 | 是 | 评价信息ID |
repair_personnel | int | 11 | 否 | 否 | 维修人员 |
work_tag | varchar | 64 | 否 | 否 | 工作标签 |
working_years | int | 11 | 否 | 否 | 工龄 |
good_at_aspects | varchar | 64 | 否 | 否 | 善于方面 |
community_users | int | 11 | 否 | 否 | 社区用户 |
user_name | varchar | 64 | 否 | 否 | 用户姓名 |
comment_level | varchar | 64 | 否 | 否 | 评论等级 |
clarify_the_situation | text | 0 | 否 | 否 | 阐明情况 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
examine_reply | varchar | 16 | 否 | 否 | 审核回复 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
maintainer表: | |||||
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
maintainer_id | int | 11 | 是 | 是 | 维修员ID |
maintenance_staff_number | varchar | 64 | 否 | 否 | 维修员工号 |
name_of_maintainer | varchar | 64 | 否 | 否 | 维修员姓名 |
gender | varchar | 64 | 否 | 否 | 性别 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
user_id | int | 11 | 是 | 否 | 用户ID |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
maintenance_report表: | |||||
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
maintenance_report_id | int | 11 | 是 | 是 | 维修上报ID |
report_no | varchar | 64 | 否 | 否 | 上报编号 |
community_users | int | 11 | 否 | 否 | 社区用户 |
community_address | varchar | 64 | 否 | 否 | 社区住址 |
contact_number | varchar | 16 | 否 | 否 | 联系号码 |
screenshot | varchar | 255 | 否 | 否 | 截图 |
report_content | text | 0 | 否 | 否 | 上报内容 |
examine_state | varchar | 16 | 是 | 否 | 审核状态 |
examine_reply | varchar | 16 | 否 | 否 | 审核回复 |
recommend | int | 11 | 是 | 否 | 智能推荐 |
create_time | datetime | 0 | 是 | 否 | 创建时间 |
update_time | timestamp | 0 | 是 | 否 | 更新时间 |
4 小区维修管理平台设计与实现
小区维修管理平台的详细设计与实现主要是根据前面的小区维修管理平台的需求分析和小区维修管理平台的总体设计来设计页面并实现业务逻辑。主要从小区维修管理平台界面实现、业务逻辑实现这两部分进行介绍。
4.1 系统首页页面
当进入小区维修管理平台的时候,首先映入眼帘的是系统的导航栏,下面是轮播图以及系统内容,其主界面展示如下图4.1所示。
![](https://i-blog.csdnimg.cn/blog_migrate/fc3de0d7ca86c949a971b1bf941eb856.png)
图4.1 用户界面图
不是小区维修管理平台中正式用户的是可以在线进行注册的,如果你没有本小区维修管理平台的账号的话,添加“注册”,当填写上自己的账号+密码+确认密码+昵称+邮箱+手机号等后再点击“注册”按钮后将会先验证输入的有没有空数据,再次验证密码和确认密码是否是一样的,最后验证输入的账户名和数据库表中已经注册的账户名是否重复,只有都验证没问题后即可用户注册成功。注册界面实现了用户用户的注册,其注册界面展示如下图4。2所示。
![](https://i-blog.csdnimg.cn/blog_migrate/1db5f2d7bf33e081db0c8f10ef0ad1aa.png)
图4.2 注册界面图
用户注册逻辑代码如下:
/**
* 注册
* @param user
* @return
*/
@PostMapping("register")
public Map<String, Object> signUp(@RequestBody User user) {
// 查询用户
Map<String, String> query = new HashMap<>();
query.put("username",user.getUsername());
List list = service.select(query, new HashMap<>()).getResultList();
if (list.size()>0){
return error(30000, "用户已存在");
}
user.setUserId(null);
user.setPassword(service.encryption(user.getPassword()));
service.save(user);
return success(1);
}
/**
* 用户ID:[0,8388607]用户获取其他与用户相关的数据
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Integer userId;
/**
* 账户状态:[0,10](1可用|2异常|3已冻结|4已注销)
*/
@Basic
@Column(name = "state")
private Integer state;
/**
* 所在用户组:[0,32767]决定用户身份和权限
*/
@Basic
@Column(name = "user_group")
private String userGroup;
/**
* 上次登录时间:
*/
@Basic
@Column(name = "login_time")
private Timestamp loginTime;
/**
* 手机号码:[0,11]用户的手机号码,用于找回密码时或登录时
*/
@Basic
@Column(name = "phone")
private String phone;
/**
* 手机认证:[0,1](0未认证|1审核中|2已认证)
*/
@Basic
@Column(name = "phone_state")
private Integer phoneState;
/**
* 用户名:[0,16]用户登录时所用的账户名称
*/
@Basic
@Column(name = "username")
private String username;
/**
* 昵称:[0,16]
*/
@Basic
@Column(name = "nickname")
private String nickname;
/**
* 密码:[0,32]用户登录所需的密码,由6-16位数字或英文组成
*/
@Basic
@Column(name = "password")
private String password;
/**
* 邮箱:[0,64]用户的邮箱,用于找回密码时或登录时
*/
@Basic
@Column(name = "email")
private String email;
/**
* 邮箱认证:[0,1](0未认证|1审核中|2已认证)
*/
@Basic
@Column(name = "email_state")
private Integer emailState;
/**
* 头像地址:[0,255]
*/
@Basic
@Column(name = "avatar")
private String avatar;
/**
* 创建时间:
*/
@Basic
@Column(name = "create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Timestamp createTime;
@Basic
@Transient
private String code;
}
小区维修管理平台中的前台上注册后的用户是可以通过自己的账户名和密码进行登录的,当用户输入完整的自己的账户名和密码信息并点击“登录”按钮后,将会首先验证输入的有没有空数据,再次验证输入的账户名+密码和数据库中当前保存的用户信息是否一致,只有在一致后将会登录成功并自动跳转到小区维修管理平台的首页中;否则将会提示相应错误信息,用户登录界面如下图4.3所示。
![](https://i-blog.csdnimg.cn/blog_migrate/0a80002dd5760daa57efac96edcabe9d.png)
图4.3 登录界面图
用户登录的逻辑代码如下所示。
/**
* 登录
* @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.select(map, new HashMap<>()).getResultList();
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.select(map, new HashMap<>()).getResultList();
}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.select(groupMap, new HashMap<>()).getResultList();
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
String res = String.valueOf(service.runCountSql(sql).getSingleResult());
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());
tokenService.save(accessToken);
// 返回用户信息
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, "账号或密码不正确");
}
}
当点击导航栏上的“社区公告”的时候,就会进入对应的界面查看公告信息,社区公告界面如下图4.4所示。
![](https://i-blog.csdnimg.cn/blog_migrate/fb36f193aeb6eecbf40c18fb79af39a9.png)
图4.4 社区公告界面图
当用户点击“维修人员”以后就会给我们展示维修人员的列表,选择一个维修人员进入到图4.5界面中,用户可以对维修员进行评价,点击评价按钮,进入到4.6界面中,输入维修人员、工龄、社区用户、评价等级、工作标签、用户姓名等,点击“提交”按钮,就会显示评价成功。
![](https://i-blog.csdnimg.cn/blog_migrate/082e45f4f8c3fd55dbb4c65456140f1b.png)
图4.5维修人员界面图
图4.6 评价界面图
维修人员的逻辑代码如下:
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
service.insert(service.readBody(request.getReader()));
return success(1);
}
@Transactional
public Map<String, Object> addMap(Map<String,Object> map){
service.insert(map);
return success(1);
}
public Map<String,Object> readBody(BufferedReader reader){
BufferedReader br = null;
StringBuilder sb = new StringBuilder("");
try{
br = reader;
String str;
while ((str = br.readLine()) != null){
sb.append(str);
}
br.close();
String json = sb.toString();
return JSONObject.parseObject(json, Map.class);
}catch (IOException e){
e.printStackTrace();
}finally{
if (null != br){
try{
br.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
return null;
}
public void insert(Map<String,Object> body){
StringBuffer sql = new StringBuffer("INSERT INTO ");
sql.append("`").append(table).append("`").append(" (");
for (Map.Entry<String,Object> entry:body.entrySet()){
sql.append("`"+humpToLine(entry.getKey())+"`").append(",");
}
sql.deleteCharAt(sql.length()-1);
sql.append(") VALUES (");
for (Map.Entry<String,Object> entry:body.entrySet()){
Object value = entry.getValue();
if (value instanceof String){
sql.append("'").append(entry.getValue()).append("'").append(",");
}else {
sql.append(entry.getValue()).append(",");
}
}
sql.deleteCharAt(sql.length() - 1);
sql.append(")");
log.info("[{}] - 插入操作:{}",table,sql);
Query query = runCountSql(sql.toString());
query.executeUpdate();
}
用户在点击导航栏上面的留言板后,就可以搜索查看留言信息,用户根据自己的喜好可以进行交流,留言板界面如下图4.7所示。
![](https://i-blog.csdnimg.cn/blog_migrate/42c0700d40bc3712141f95efe786a453.png)
图4.7 留言板界面图
点击导航栏上的“维修上报”,可以选择上报编号、社区住址、截图、社区用户、联系号码、上报内容,然后点击“提交”按钮进行提交维修上报,维修上报界面如下图4.8所示。
![](https://i-blog.csdnimg.cn/blog_migrate/60d68bcc78fd149e6ef93c4d8d3a1cd9.png)
图4.8 维修上报界面图
维修上报界面逻辑代码如下:
@RequestMapping(value = {"/avg_group", "/avg"})
public Map<String, Object> avg(HttpServletRequest request) {
Query count = service.avg(service.readQuery(request), service.readConfig(request));
return success(count.getResultList());
}
维修员点击“实施维修信息”,选择“结束维修”按钮后就会进入到维修结束信息这个界面,输入上报编号、社区住址、维修人员、社区用户、联系号码、结束日期、维护信息以及单数等,点击“提交”就成功了;其界面展示如下图4.9所示。
![](https://i-blog.csdnimg.cn/blog_migrate/67d0e53f4e086c5afa333e6f5c83035c.png)
图4.9 实施维修界面图
实施维修管理界面逻辑代码如下:
@RequestMapping(value = {"/count_group", "/count"})
public Map<String, Object> count(HttpServletRequest request) {
Query count = service.count(service.readQuery(request), service.readConfig(request));
return success(count.getResultList());
}
此功能为管理员的功能,管理员点击“系统用户管理”菜单后,会展示出管理员+社区用户+维修员三个子菜单,任何可以对其进行增删改查操作;其界面展示如下图4.10所示。
![](https://i-blog.csdnimg.cn/blog_migrate/6cf103e700ff52f4dd04ce77cd065a91.png)
图4.10系统用户管理界面图
此功能为管理员的功能,管理员点击“资源管理”菜单后,会展示出新闻列表+新闻分类两个子菜单,任何可以对其进行增删改查操作;其界面展示如下图4.11所示。
![](https://i-blog.csdnimg.cn/blog_migrate/ea8efbd6a1f0c832658c3098db06a975.png)
图4.11资源管理界面图
资源管理界面逻辑代码如下:
@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);
}
public Map<String,String> readConfig(HttpServletRequest request){
Map<String,String> map = new HashMap<>();
map.put(FindConfig.PAGE,request.getParameter(FindConfig.PAGE));
map.put(FindConfig.SIZE,request.getParameter(FindConfig.SIZE));
map.put(FindConfig.LIKE,request.getParameter(FindConfig.LIKE));
map.put(FindConfig.ORDER_BY,request.getParameter(FindConfig.ORDER_BY));
map.put(FindConfig.FIELD,request.getParameter(FindConfig.FIELD));
map.put(FindConfig.GROUP_BY,request.getParameter(FindConfig.GROUP_BY));
map.put(FindConfig.MAX_,request.getParameter(FindConfig.MAX_));
map.put(FindConfig.MIN_,request.getParameter(FindConfig.MIN_));
return map;
}
public Map<String,String> readQuery(HttpServletRequest request){
String queryString = request.getQueryString();
if (queryString != null && !"".equals(queryString)) {
String[] querys = queryString.split("&");
Map<String, String> map = new HashMap<>();
for (String query : querys) {
String[] q = query.split("=");
map.put(q[0], q[1]);
}
map.remove(FindConfig.PAGE);
map.remove(FindConfig.SIZE);
map.remove(FindConfig.LIKE);
map.remove(FindConfig.ORDER_BY);
map.remove(FindConfig.FIELD);
map.remove(FindConfig.GROUP_BY);
map.remove(FindConfig.MAX_);
map.remove(FindConfig.MIN_);
return map;
}else {
return new HashMap<>();
}
}
@Transactional
public void update(Map<String,String> query,Map<String,String> config,Map<String,Object> body){
StringBuffer sql = new StringBuffer("UPDATE ").append("`").append(table).append("`").append(" SET ");
for (Map.Entry<String,Object> entry:body.entrySet()){
Object value = entry.getValue();
if (value instanceof String){
sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append("'").append(value).append("'").append(",");
}else {
sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append(value).append(",");
}
}
sql.deleteCharAt(sql.length()-1);
sql.append(toWhereSql(query,"0".equals(config.get(FindConfig.LIKE))));
log.info("[{}] - 更新操作:{}",table,sql);
Query query1 = runCountSql(sql.toString());
query1.executeUpdate();
}
public String toWhereSql(Map<String,String> query, Boolean like) {
if (query.size() > 0) {
try {
StringBuilder sql = new StringBuilder(" WHERE ");
for (Map.Entry<String, String> entry : query.entrySet()) {
if (entry.getKey().contains(FindConfig.MIN_)) {
String min = humpToLine(entry.getKey()).replace("_min", "");
sql.append("`"+min+"`").append(" >= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
continue;
}
if (entry.getKey().contains(FindConfig.MAX_)) {
String max = humpToLine(entry.getKey()).replace("_max", "");
sql.append("`"+max+"`").append(" <= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
continue;
}
if (like == true) {
sql.append("`"+humpToLine(entry.getKey())+"`").append(" LIKE '%").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("%'").append(" and ");
} else {
sql.append("`"+humpToLine(entry.getKey())+"`").append(" = '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("'").append(" and ");
}
}
sql.delete(sql.length() - 4, sql.length());
sql.append(" ");
return sql.toString();
} catch (UnsupportedEncodingException e) {
log.info("拼接sql 失败:{}", e.getMessage());
}
}
return "";
}
此功能为管理员的功能,管理员点击“内容管理”菜单后,会展示出留言板+留言分类两个子菜单,任何可以对其进行增删改查操作;其界面展示如下图4.12所示。
![](https://i-blog.csdnimg.cn/blog_migrate/fb962b7df8f76d0aff577bea4d7179d7.png)
图4.12 交流管理界面图
交流管理界面关键代码如下:
@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);
此功能为管理员的功能,管理员点击“模块管理”菜单后,会展示出维修人员+维修上报+分配任务+情况调查+维修计划+实施维修+维修结束+回访信息+评价信息十个子菜单,任何可以对其进行增删改查操作;其界面展示如下图4.13所示。
![](https://i-blog.csdnimg.cn/blog_migrate/1f059cf83bc5f4309a515a7cc76b981a.png)
图4.13 模块管理界面图
5小区维修管理平台测试
小区维修管理平台测试是为了检验软件是否达到设计要求,是否存在错误,通过测试的方法来检查小区维修管理平台,以便发现小区维修管理平台中的错误。测试工作是保证小区维修管理平台质量的关键。
问题1:数据库无法添加中文。
解决过程:重新创建数据库,将库的编码格式改为utf8。
效果:能在新库的表中添加中文。
问题2:控制台报错前台与后台参数不一致
解决过程:检查代码,找到报错参数完成修改,继续报错,服务器移除项目重新运行。
效果:重启项目不再报错。
问题3:报错No bean named 'sysLogServiceImpl' available找不到名为sysLogServiceImpl的bean的对象。
解决过程:询问导师报错原因,发现错误原因是未添加注解@Service,需要在在impl实现类的外面添加@Service注解。
效果:重新debug项目无报错。
问题4:启动项目时报错:Mapped Statements collection does not contain value for
解决过程:网上搜索解决办法,出错可能的原因有多个,经过努力排查,错误原因是mapper映射地址有误。在mybatis-config里重新配置地址。
效果:项目启动正常
系统测试包括:维修人员添加功能测试、评价信息功能测试、维修结束添加功能测试、维修上报功能测试这四大功能测试,如表5.1到5.4所示:
表5.1维修人员添加功能测试表
测试名称 | 测试功能 | 操作过程 | 预期结果 | 测试结果 |
维修人员添加功能模块测试 | 管理员添加维修人员功能是否正常 | 管理员登录成功后点击“添加维修人员”菜单 | 管理员根据提示并依次输头像+工作标签+工龄等,后点击“提交”按钮 | 维修人员添加信息功能正常 |
表5.2 评价信息功能测试表
测试名称 | 测试功能 | 操作过程 | 预期结果 | 测试结果 |
评价信息添加功能模块测试 | 用户添加评价信息功能是否正常 | 用户登录成功后点击“添加评价信息”菜单 | 用户根据提示并依次输入维修人员+工作标签+工龄+社区用户等,后点击“提交”按钮 | 评价信息添加信息功能正常 |
表5.3 维修结束添加功能测试表
测试名称 | 测试功能 | 操作过程 | 预期结果 | 测试结果 |
维修结束添加功能模块测试 | 维修员添加维修结束功能是否正常 | 维修员登录成功后点击“添加维修结束”菜单 | 维修员根据提示并依次输入上报编号+社区用户+社区住址+联系号码+结束日期等,后点击“提交”按钮 | 维修结束添加信息功能正常 |
表5.4维修上报功能测试表
测试功能 | 操作过程 | 预期结果 | 测试结果 | |
维修上报功能模块测试 | 维修上报功能是否正常 | 用户登录成功后点击维修人员信息中的“维修上报”按钮 | 用户根据提示填写维修上报信息点击“提交”按钮 | 维修上报信息功能正常 |
5.3 系统测试结果
通过上面章节编写小区维修管理平台的测试用例,已经测试完毕了维修人员添加功能测试、评价信息测试、维修结束添加功能测试、维修上报功能测试,通过这4大模块为小区维修管理平台的后期推广运营提供了强力的技术支撑。
至此,小区维修管理平台已经结束,在开发前做了许多的准备,在本系统的设计和开发过程中阅览和学习了许多文献资料,从中我也收获了很多宝贵的方法和设计思路,对系统的开发也起到了很重要的作用,系统的开发技术选用的都是自己比较熟悉的,比如springboot、JAVA技术、MYSQL,这些技术都是在以前的学习中学到了,其中许多的设计思路和方法都是在以前不断地学习中摸索出来的经验,其实对于我们来说工作量还是比较大的,但是正是由于之前的积累与准备,才能顺利的完成这个项目,由此看来,积累经验跟做好准备是十分重要的事情。
当然在该系统的设计与实现的过程中也离不开老师以及同学们的帮助,正是因为他们的指导与帮助,我才能够成功的在预期内完成了这个系统。同时在这个过程当中我也收获了很多东西,此系统也有需要改进的地方,但是由于专业知识的浅薄,并不能做到十分完美,希望以后有机会可以让其真正的投入到使用之中。
参考文献
[1]沈志元,张文健.基于Java技术的医院管理系统的设计与实现[J].电脑知识与技术,2022,18(32):38-40+54.DOI:10.14004/j.cnki.ckt.2022.1994.
[2]张丽景,张文川.基于对比分析法的高职“MySQL数据库”课程设计——以兰州石化职业技术大学为例[J].现代信息科技,2022,6(21):188-191.DOI:10.19850/j.cnki.2096-4706.2022.21.046.
[3]杨一帆.服务于MySQL数据库的在线监测系统设计[J].自动化技术与应用,2022,41(10):179-182.DOI:10.20033/j.1003-7241.(2022)10-0179-04.
[4]谢霜.基于Java技术的网络管理体系结构的应用[J].网络安全技术与应用,2022(10):14-15.
[5]苏婉怡,揣小龙,赵国松,王煜尧.基于Java技术的考试系统关键点研究[J].无线互联科技,2022,19(18):58-60.
[6]林佳一.混合式教学在高职MySQL数据库课程的实践研究[J].电脑知识与技术,2022,18(26):133-135.DOI:10.14004/j.cnki.ckt.2022.1737.
[7]杨迎.Java技术在嵌入式系统中的作用探讨[J].无线互联科技,2022,19(14):96-98.
[8]王曼维,杨荻,李岩,及松洁.基于SpringBoot框架的智慧医疗问诊系统设计与实现[J].中国医学装备,2022,19(03):133-136.
[9]喻佳,吴丹新.基于SpringBoot的Web快速开发框架[J].电脑编程技巧与维护,2021(09):31-33.DOI:10.16184/j.cnki.comprg.2021.09.013.
[10]Fuyuan Cheng. Talent Recruitment Management System for Small and Micro Enterprises Based on Springboot Framework[J]. Advances in Educational Technology and Psychology,2021,5(2).
[11]王超,张琪立,田广强,李晶晶.基于Springboot框架的学校机房计费管理系统的设计与实现[J].电子技术与软件工程,2020(23):159-160.
[12]Jian Chen,Chen Jian,Pan Hailan. Design of Man Hour Management Information System on SpringBoot Framework[J]. Journal of Physics: Conference Series,2020,1646(1).
[13]陈德豪,吴开泽.物业专项维修资金管理困境与管理模式研究——以广州市老旧小区为例[J].城市问题,2020(06):83-90.DOI:10.13239/j.bjsshkxy.cswt.200610.
[14]周梦.老旧小区维修改造项目管理难点分析[J].建筑与文化,2019(06):29-30.
[15]李伟毅. 住宅小区维修改造工程管理策略的思考[C]//.2017年10月建筑科技与管理学术交流会论文集.,2017:73+72.
[16]江心亮.浅谈小区维修改造施工项目作业风险分析及防控[J].现代物业(中旬刊),2016(08):29-31.DOI:10.16141/j.cnki.1671-8089.2016.08.009.
[17]初宝钧, 房地产业 住宅小区物业管理与房屋共用部位维修. 孙卫东 主编,庄河年鉴,辽宁民族出版社,2015,159,年鉴.
致 谢
时间过的很快,不知不觉,在中北大学的学习生活即将结束。毕业之际,我真诚地向帮助过我的老师、家人、同学、朋友们表达感谢。首先要感谢的是我的母校。感谢母校给了我美好的生活和优越的学习环境,使我能学到了很多知识,也不断的变得优秀;感谢家人在这四年期间一直给与我的爱和无条件的支持,让我没有后顾之忧地完成学业;感谢软件学院的任课老师们给我鼓励和认可,让我有信心去做好每一件事情;感谢同学们的帮助,让我的大学生活更有意义。在此次毕业设计的实现过程中, 我得到了老师们的耐心指导让我顺利完成了该设计。从最初的选题和开题开始,老师就给予我很多帮助,他们认真负责的态度、丰富的教学经验让我学到了很多。
同时也要感谢我敬爱的班主任和实训课程的老师,他们在各个方面都教给了我丰富的经验,在面对各种困难时如何处理。因为今年的特殊性,老师们不仅在学习中给我以精心的指导,同时还在其它方面给予我观关怀,指导老师不辞辛苦的为大家录制视频和一遍遍讲解让我心怀感激之情。在此,我真诚的感恩、感谢我的指导教师们。
还要感谢实习期间不厌其烦教导我鼓励我的技术师傅,他指导了我各个方面的技巧,尤其是编程方面,迄今我的很多技巧和编写规范都有赖于他的指导、纠正。
最后还要特别感谢身边的各位同学们,一直支持鼓励我,无论何时何种境况。我很荣幸获得同学们的帮助,也很开心能够和大家共度大学四年的时光。
最后的最后,再次发自肺腑的感谢所有帮助过我的人。
免费领取源码,请点赞关注私信博主