Springboot+校园健身互助平台 毕业设计-附源码221540

Springboot校园健身互助平台

摘 要

校园健身互助平台的开发宗旨:是在体育教学和训练中,学生之间或教师与学生之间相互提供场地器材、学习经验等信息。它不仅能够有效地促进学校体育健身活动的开展,还能提高师生互动交流的效率以及增进双方情感体验,从而达到培养全面发展人才的目的。

校园健身互助平台主要采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求,完善了对应的软体架设以及程序编码的工作,采取MySQL作为后台数据的主要存储单元,采用Springboot框架、JSP技术、Ajax技术进行业务系统的编码及其开发,实现了本系统的全部功能。校园健身互助平台解决了传统健身网站所带来的人力、物力和时间上的虚耗和交流深度的限定,这让交流的过程更快捷、准确、便利,同时完成校园健身互助平台的基本功能:用户注册管理、健身社区管理、热门健身管理,健身视频管理、健身运动管理、计划活动管理等。

关键词:校园健身;Springboot框架;MySQL数据库

Springboot campus fitness mutual aid platform

Abstract

The development purpose of campus fitness mutual aid platform is to provide information such as venue equipment and learning experience between students or between teachers and students in physical education teaching and training. It can not only effectively promote the development of school physical fitness activities, but also improve the efficiency of interaction and communication between teachers and students and enhance the emotional experience of both sides, so as to achieve the purpose of cultivating all-round development talents.

The campus fitness mutual aid platform mainly adopts the object-oriented development mode for software development and hardware erection, which can well meet the needs of actual use, improve the corresponding software erection and program coding, take MySQL as the main storage unit of background data, use springboot framework, JSP technology and Ajax technology for business system coding and development, and realize all the functions of the system. The campus fitness mutual aid platform solves the waste of manpower, material resources and time and the limitation of communication depth brought by the traditional fitness website, which makes the communication process faster, accurate and convenient. At the same time, it completes the basic functions of the campus fitness mutual aid platform: user registration management, fitness community management, popular fitness management, fitness video management, fitness exercise management, planned activity management, etc.

Key words: Campus fitness; Springboot framework; Mysql database

目  录

第1章 绪论

1.1 研究背景与意义

1.2 研究内容

1.3 论文组成结构

第2章 相关技术介绍

2.1 J2EE技术

2.2 MVVM模式

2.3 Mysql数据库

2.4 B/S结构

2.5JavaScript 运行模式

2.6 Spring boot框架

第3章 系统分析

3.1 可行性分析

3.1.1 经济可行性

3.1.2 操作可行性

3.1.3 需求可行性

3.2 需求分析

3.3 系统业务流程分析

3.4 系统数据流程分析

第4章 系统设计

4.1 系统架构设计

4.2 系统功能结构

4.3 功能模块设计

4.4 数据库设计

4.4.1 概念模型设计

4.4.2 逻辑结构设计

4.4.3 数据库连接设计

第5章 系统实现

5.1 登录模块的实现

5.2 用户子系统模块的实现

5.3 管理员子系统模块的实现

第6章 系统测试

6.1 测试目的

6.2 测试用例

6.3 测试结果

第7章 总结与展望

参考文献

致谢

  1. 绪论
    1. 研究背景与意义

目前高校学生参加体育锻炼的意识较好,但仍有部分学生认为锻炼时间不足;大多数学生希望能在课外或课余时间加入体育锻炼队伍;大部分同学喜欢选择自己喜爱的体育项目;多数学生每周坚持锻炼次数不超过2次,每次锻炼持续时间约1小时以上;绝大多数人愿意接受体育教师指导。主要原因是:受传统观念影响;学校场地器材缺乏;教师自身能力有限;缺少科学系统的训练方法与手段。

校园健身互助平台的开发与应用,对丰富学校体育文化建设内涵、提高学生身体素质和心理素质具有重要意义。以大学生为主体开展校园健身互助活动的构想:建立一个由政府主导,社会支持、高校参与,家庭积极参与的多元化的全民健身运动网络;依托互联网技术实现资源共享、信息共享和互动交流;搭建校内外相结合的开放式网络平台。同时还从四个方面论述了实施该构想的具体措施:(1)完善相关法律法规;(2)制定科学合理的发展规划;(3)加强组织领导;(4)加大宣传力度,营造良好的文化氛围。旨在使更多的人了解并关注体育锻炼,从而更好地推动大众健身计划的实施,促进全民健身运动健康持续地进行,最终达到终身受益之目的。

1.2研究内容

校园健身互助平台的开发及实现,所需要的工作内容:

(1)首先是确定选题,确定好所要做的系统,并对系统的背景及现在面临的一些问题等进行系统的初步确认。

(2)系统确认完成后,结合系统开发的需求进行确认系统开发所使用的技术,校园健身互助平台的开发使用Php技术,数据库进行平台的搭建开发,确认好使用的技术进行技术分析,所使用的技术是否可以完成校园健身互助平台的实现。

(3)确定好系统使用的技术,进行在线确认系统所划分的用户角色,并且根据用户角色划分确定所要设计的功能模块,对于校园健身互助平台的设计主要划分别为管理员和用户角色,并所使用的功能模块也相应不同,但是系统的数据库实现的内容是交互的,用户可以随时根据自己的需求进行健身运动信息了解,对于系统工作人员可以根据自己的分管内容进行在线信息的处理及操作,管理员获取到所有用户的详细数据信息,并根据需求进行第一时间处理解决。

(4)系统的功能模块确认完成后进行程序及界面的设计,设计完成后,并且通过测试来判断程序是否完善,对于系统测试,需要不同的用户进行不同的内容编辑及提交,及使用不同的测试方式找出程序中存在的漏洞,并对程序出现的漏洞问题进行在线解决处理,如果测试系统没有任何问题时,可以将系统上传进行正式操作使用。

1.3论文组成结构

根据市场调研得到的信息数据,结合研究现状,利用相关系统开发和设计方法,最终设计出校园健身互助平台。

本文共有七章,如下所示。

第一章概述了校园健身互助平台的研究目的和意义;精炼地总结了国内外在仓储领域的研究情况和未来的研究趋势,最后给出了论文的组成结构。

第二章简要概述了本文所用的开发技术和工具。

第三章简要对系统各业务流程进行需求分析、可行性分析。

第四章对校园健身互助平台进行设计。

第五章对校园健身互助平台进行实现,并贴出相关页面截图,语言描述出具体功能实现的操作方法。

第六章对校园健身互助平台采用测试用例的方式来对一些主要功能模块测试,最后得出测试结果。

第七章总结全文并对未来的研究做出展望。

  1. 相关技术介绍
    1. J2EE技术

人可以掌握多门外语,而一个计算机科学家精通的大多是编程语言,它不是人类的自然语言,比如C语言、Java、Perl等等。由于不同的公司开发出的“中间件”不够规范,所以Sun公司推出J2EE,用这个标准来解决弊病。它提供了良好的机制,让每个层次允许与之相对的服务器、组件运行,使得系统的搭建稳定可用、开发高效、维护方便。

    1. MVVM模式

MVVM模式是常用的开发模式,主要是在代码实现上将其分为M层、V层和C层。

视图(View)代表用户交互界面,一个 Web 应用就可能有很多的界面,在 MVVM 模式中,视图仅仅处理的只有数据采集、处理,还有用户的请求, 并不包括业务流程的处理,业务流程由模型(Model)来处理。

模型(Model)就是业务流程/状态的处理及业务规则的制定。模型处理业务流程的过程其它层是无法看见了的,它就像黑箱子,在接受视图请求的数据之后,然后返回最终的处理结果。MVVM 最主要的核心就是业务模型的设计,一个典型的应用例子就是目前流行的 EJB 模型,它从应用技术实现的角度对模型做了进一步的划分,以便充分利用现有的组件,但是它不能作为应用设计模型的框架。

控制器(Controller)可以理解为接收用户的请求,然后视图和模型匹配在一起,一起再完成用户请求。它有非常明显的作用在划分控制层上,可以很清晰地告诉你,它就是一个分发器,选择什么样的模型、视图,可以完成用户的什么样的请求。控制层不做所有的数据处理,比如说:用户点击一个连接,控制层接受到请求之后,并不处理业务信息,它只是向模型传递用户的信息,同时告诉模型做什么,然后选择符合需求的视图返回给用户。

    1. MySQL数据库

用MySQL这个软件,是因为它能接受多个使用者访问,而且里面存在Archive等。它会先把数据进行分类,然后分别保存在表里,这样的特别操作就会提高数据管理系统自身的速度,让数据库能被灵活运用。MySQL的代码是公开的,而且允许别人二次编译升级。这个特点能够降低使用者的成本,再搭配合适的软件后形成一个良好的网站系统。虽然它有缺点,但是综合各方面来说,它是使用者的主流运用的对象。

    1. B/S结构

B/S(Browser/Server)比前身架构更为省事的架构。它借助Web server完成数据的传递交流。只需要下载浏览器作为客户端,那么工作就达到“瘦身”效果, 不需要考虑不停装软件的问题。

    1. JavaScript 运行模式:

JavaScript是一种属于网络的高级脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的

2.5.1是一种解释性脚本语言(代码不进行预编译)。

2.5.2主要用来向HTML标准通用标记语言下的一个应用)页面添加交互行为。

2.5.3可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离

2.5.4跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如WindowsLinuxMacAndroidiOS等)。

2.5.5 JavaScript脚本语言同其他语言一样,有它自身的基本数据类型,表达式和算术运算符及程序的基本程序框架。JavaScript提供了四种基本的数据类型和两种特殊数据类型用来处理数据和文字。而变量提供存放信息的地方,表达式则可以完成较复杂的信息处理。

    1. Spring 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. 系统分析
    1. 可行性分析

在软件开发的过程中系统的可行性分析是必不可少的,可行性的研究就是评估问题是否能得到解决并且是要以最少的时间和最少的代价来解决。为实现上面的目标还要必须考虑到解决这些问题的方法的优点和缺点,还要考虑到实现了这些系统规模的开发带来的经济效益。这里可以用技术的可行性,操作的可行性,经济的可行性对我们的系统进行可行性的研究。校园健身互助平台的可行性分析如下所示:

      1. 经济可行性

校园健身互助平台是在Springboot和MySQL的环境中运行的,而系统的成本也只是主要分布在软件的开发和维护上。但如果系统上线投入使用之后,不仅可以方便人们,还节省了用户的时间和精力,而且还极大限度的方便了运营者,减少了运营者的工作强度。校园健身互助平台其实也不太复杂,在开发的时候经济支出也不大,在开发系统时时间用的也不多,从时间的优势和对经济利益方面产生的好处远超过维护和管理的成本,所以开发此系统是可行合适的。

      1. 操作可行性

本系统是基于浏览器和服务器的校园健身互助平台,系统开发完成之后用户只需要在浏览器中输入正确的URL地址即可进行访问。本系统的前台页面简单明了,在没有操作指导的情况下也可以进行操作,无论是系统管理员还是普通用户在页面中所有的操作都是在浏览器中完成的,因此只要电脑在有网络的情况下,打开浏览器都能操作。而且在使用之前也不用进行相关的环境配置,因此本系统方便、简单、易于使用,所以该系统是容易并且可操作的。

    1. 需求分析

根据用户对系统的需求,要求系统简单操作,能够准确,完整的对信息进行管理。校园健身互助平台在对需求做解析后,整个系统主要分为两个部分:管理员和普通用户,每个模块下的分支功能不一样。对功能做出如下说明:

管理员模块:用户注册管理、健身社区管理、热门健身管理、 健身活动管理、健身视频管理、计划活动管理。

用户模块:健身社区、热门健身、健身视频、公告消息浏览等。

用户用例图如下所示。

图3-1 用户用例图

管理员用例图如下所示。

图3-2 管理员用例图

根据用例图,对一些重要的用例进行描述。

注册用例描述如下表所示。

表3-1 注册用例描述

用例名称

注册

参与者

用户

描述

用户填写相关注册数据完成注册成为系统的用户

前置条件

后置条件

用户填写相关注册数据并且要注册的账号不存在与系统中

事件流

  1. 用户点击注册按钮
  2. 用户填写相关注册数据
  3. 用户确认并提交注册数据
  4. 系统提示注册成功

补充说明

  1. 系统检测用户所输注册数据如不符合要求则提示并返回注册界面
  2. 系统检测用户所输账号不可用或已存在与系统中则提示并返回注册界面

登录用例描述如下表所示。

表3-1 登录用例描述

用例名称

登录

参与者

用户

描述

用户填写用户名和密码登录系统

前置条件

用户拥有账号和密码

后置条件

用户名和密码都正确

事件流

(1)用户在登录页面输入用户名和密码

(2)系统检测用户输入的用户名和密码是否正确

(3)用户名和密码正确的话,显示登录成功并返回主页面

补充说明

(a)系统检查除密码不正确,返回登录页面

个人信息管理用例描述如下表所示。

表3-1 个人信息管理用例描述

用例名称

管理和修改个人信息

参与者

用户

描述

用户查看、修改个人信息

前置条件

用户已登录到系统中

后置条件

事件流

(1)用户查看个人信息

(2)用户修改个人信息

补充说明

(a)用户可修改密码

(b)用户可修改个人资料,例如姓名,头像等

公告消息用例描述如下表所示。

表3-1 公告消息用例描述

用例名称

公告消息

参与者

管理员

描述

发布公告消息

前置条件

已登录

后置条件

公告消息内容不违规

事件流

(1)在公告消息页输入公告消息数据,提交公告消息

(2)更新并显示公告消息板

补充说明

(a)公告消息内容不能为空

健身运动用例描述如下表所示。

表3-1 健身运动用例描述

用例名称

健身运动

参与者

用户

描述

用户查看健身运动操作

前置条件

用户已登录

后置条件

该信息存在

事件流

(1)健身运动表单

补充说明

(a)健身运动表单数据不能为空

热门健身用例描述如下表所示。

表3-1 热门健身用例描述

用例名称

热门健身管理

参与者

管理员

描述

管理员提供新增、修改、删除等功能

前置条件

  1. 管理员成功登录系统
  2. 管理员只能对已存在的热门健身信息进行修改和删除

后置条件

事件流

(1)管理员查看修改热门健身

(2)管理员添加热门健身

(3)管理员删除热门健身

补充说明

(a)新添加的热门健身不符合要求时会添加失败

(b)修改的热门健身不符合要求时会修改失败

    1. 系统业务流程分析

校园健身互助平台的业务流程如下图所示。

图3-3 系统业务流程图

管理员拥有最高权限,在对各项信息进行增加、删除、修改后会更新后台数据库的内容,用户在登录后进行公告消息浏览、健身运动、健身社区、健身视频、计划活动查询等指令动作同样会更新后台数据。

    1. 系统数据流程分析

与强调控制逻辑的程序流程图不同,它更关心的是整个系统中数据的具体流动以及数据的加工处理的整个客观过程,是对数据规格的说明。也正因如此,系统数据流图作为系统结构化分析方法中极为重要的一种描述工具备受青睐。

瑜伽校园健身互助平台的顶层数据流如下图所示。

图3-4系统顶层数据流图

系统顶层数据流:外部实体为用户,第一个流程为登录验证,用户信息表返回密码验证,是否正确,正确则登录系统,错误则反馈信息,登录系统后,根据不同用户的功能选择,来读写数据库。

系统底层数据流如下图所示。

图3-5系统底层数据流图

系统底层数据流:外部实体为管理员和普通用户,数据流分别有管理员和普通用户流向系统数据流程,数据表提供数据支持,来完成逻辑操作。

  1. 系统设计
    1. 系统架构设计

由于本系统在逻辑事务处理方面对数据库的操作比较频繁所以系统在底层连接数据库时并没有使用原生的JDBC,而是把JDBC进行了封装,封装之后相当于一个连接数据库的工具DB UTIL,这样使用起来会更加方便而且这样进行封装还可以降低系统中代码的冗余,当我们需要连接和使用数据库时只需要调用这个工具里面的一个方法就可以了。而且通过封装可以把对数据库的操作独立起来,当需要连接不同种类的数据库时只需要加以修改就可以达到目的。

系统架构如下图所示。

图4-1系统架构图

    1. 系统功能结构

进入系统后首先要进行登录,验证你的身份,赋予你不同的权限。当你成功登录后,页面会有多个板块,分别是健身运动管理、用户注册管理、健身社区管理、健身视频管理、计划活动管理、热门健身管理。里面界面简单易懂,根据标示可以直接进行方便快捷的操作。

系统功能结构图如下所示。

图4-2系统功能结构图

    1. 功能模块设计

管理员账户的基本信息管理。主要提供管理员账户的基本信息录入、删除、维护和查询等功能,包括:

管理员录入管理员账户基本信息;

管理员更新、增加及删除管理员账户基本信息;

用户根据管理员账户 ID 查询基本信息;

系统管理员更改个人密码;

用户的基本信息管理。主要提供用户的基本信息录入、修改和查询功能,包括:

用户录入用户基本信息;

管理员更新、增加及删除用户基本信息;

 健身活动的基本信息管理。主要是提供 健身活动的基本信息录入、维护和查询功能,包括:

管理员录入 健身活动基本信息;

管理员更新、增加及删除 健身活动基本信息;

用户根据 健身活动 ID 查询 健身活动基本信息;

 健身视频管理。主要提供 健身视频的基本信息录入、删除、维护和查询功能, 包括:

管理员录入 健身视频信息;

管理员更新、增加 健身视频基本信息;

管理员根据 健身视频 ID 查询 健身视频基本信息;

用户根据个人信息导航栏查询 健身视频信息;

    1. 数据库设计

一个好的系统它的后台数据库一定要考虑的全面,这和我们建造房子一个概念,房子不是随心所欲建起来的,一切都是在合理设计的基础是实现的,地基打牢固了房子才能建的更高。数据库如果设计的很合理,而且每个方面都能考虑到了那么这个系统才能不会出现大的问题。

      1. 概念模型设计

本系统在数据库中存放了多张表,分别是用户表、健身社区表、健身运动表、健身视频表、计划活动表、视频分类表。

系统的主要实体间关系E-R图如下图所示。

图4-7系统E-R图

      1. 逻辑结构设计

此环节把概念转变成数据。由于整个数据库所处理的信息过多,就只展示几个表。

名称

类型

长度

不是null

主键

注释

registered_user_id

int

11

注册用户ID

gender

varchar

64

性别

school_name

varchar

64

学校名称

personal_profile

varchar

64

个人简介

sports_preference

varchar

64

运动偏好

height

varchar

64

身高

weight

varchar

64

体重

birthday

varchar

64

生日

examine_state

varchar

16

审核状态

recommend

int

11

智能推荐

user_id

int

11

用户ID

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

名称

类型

长度

不是null

主键

注释

video_classification_id

int

11

视频分类ID

video_type

varchar

64

视频类型

recommend

int

11

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

名称

类型

长度

不是null

主键

注释

registration_group_id

int

11

报名组团ID

activity_title

varchar

64

活动标题

activity_type

varchar

64

活动类型

group_time

date

0

组团时间

activity_location

varchar

64

活动地点

registered_user

int

11

报名用户

recommend

int

11

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

名称

类型

长度

不是null

主键

注释

planned_activities_id

int

11

计划活动ID

activity_name

varchar

64

活动名称

activity_type

varchar

64

活动类型

user

int

11

用户

height

varchar

64

身高

weight

varchar

64

体重

remarks

varchar

64

备注

recommend

int

11

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

名称

类型

长度

不是null

主键

注释

group_fitness_id

int

11

组团健身ID

activity_title

varchar

64

活动标题

activity_type

varchar

64

活动类型

event_cover

varchar

255

活动封面

group_time

date

0

组团时间

sponsor

int

11

发起人

activity_location

varchar

64

活动地点

activity_summary

longtext

0

活动概要

hits

int

11

点击数

examine_state

varchar

16

审核状态

examine_reply

varchar

16

审核回复

recommend

int

11

智能推荐

timer_title

varchar

64

计时器标题

timing_start_time

datetime

0

计时开始时间

timing_end_time

datetime

0

计时结束时间

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

名称

类型

长度

不是null

主键

注释

fitness_video_id

int

11

健身视频ID

video_name

varchar

64

视频名

video_type

varchar

64

视频类型

video_cover

varchar

255

视频封面

difficulty

varchar

64

难度

position

varchar

64

部位

video_file_

varchar

255

视频文件

hits

int

11

点击数

praise_len

int

11

点赞数

recommend

int

11

智能推荐

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

名称

类型

长度

不是null

主键

注释

fitness_activities_id

int

11

健身活动ID

activity_name

varchar

64

活动名称

activity_type

varchar

64

活动类型

event_cover

varchar

255

活动封面

activity_details

longtext

0

活动详情

hits

int

11

点击数

praise_len

int

11

点赞数

recommend

int

11

智能推荐

timer_title

varchar

64

计时器标题

timing_start_time

datetime

0

计时开始时间

timing_end_time

datetime

0

计时结束时间

create_time

datetime

0

创建时间

update_time

timestamp

0

更新时间

  1. 系统实现
    1. 登录模块的实现

该登录模块利用js进行设计,JavaScript函数CheckSubmit()对输入框是否为空进行验证,使用js的技术结合MySQL 2012数据库的查询语句进行登录信息的验证。首先从文本框中分别获得账号user_name和密码user_pw,使用Sql语句“select * from t_user where user_name=‘”+user_name+“’ and user_pw=‘”+user_pw+“’”将查询结果赋给rs结果集,若rs.next()返回值为空,表示数据库找不到该用户数据,若rs.next()返回值不为空,则显示登录成功,进入主界面。

用户登录流程图如下所示。

5-1用户登录流程

用户登录流程:用户只有输入正确的用户名和密码才会成功进入系统,用户输入用户名密码后点击登录按钮,系统会进行校验该用户名是否存在,如果用户名与密码不匹配或者用户名不存在,则返回主界面。

系统登录界面如下图所示。

图5-2系统登录界面

登录功能的逻辑代码如下所示。

/**

     * 登录

     * @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, "账号或密码不正确");

        }

}

    1. 用户子系统模块的实现
      1. 用户首页模块

在浏览器的地址栏里输入http://localhost:8080/index.jsp 地址,就可以跳转到校园健身互助平台的首页,首页是由4个页面组成的,包括top、left、down和center等页面,这里也是浏览者访问系统的入口,通过@ include引入。

首页载入流程图如下所示。

5-3首页载入流程

首页载入流程:系统先连接数据库,显示界面参数初始化,读取数据库的数据表,读取html显示模板,对数据按添加时间排序,按照模板设计位置显示数据,刷新显示界面,断开数据库连接。

首页如下图所示。

图5-4首页界面

其中载入首页的主要代码如下。

@RequestMapping(value )

    @Transactional

    public Map<String, Object> del(HttpServletRequest request) {

        service.delete(service.readQuery(request), service.readConfig(request));

        return success(1);

}

    @Transactional

    public void delete(Map<String,String> query,Map<String,String> config){

        StringBuffer sql = new StringBuffer("DELETE FROM ").append("`").append(table).append("`").append(" ");

        sql.append(toWhereSql(query, "0".equals(config.get(FindConfig.GROUP_BY))));

        log.info("[{}] - 删除操作:{}",table,sql);

        Query query1 = runCountSql(sql.toString());

        query1.executeUpdate();

    }

      1. 用户注册模块

系统的用户通过自行注册生成,在系统首页点击用户注册菜单,系统跳转到对应的注册页面。点击重置按钮,清空所填数据,点击注册按钮完成注册。

用户注册流程图如下所示。

5-5用户注册流程

注册个人信息实现流程为:填写个人信息,系统使用JQuery选择器获取在网页中输入的注册信息,再对联系方式、登录密码等信息进行验证,验证通过后用Ajax异步请求方式向服务器发送请求并把数据传送到后台,然后验证用户名是否已存在,如果已存在则注册失败提示“用户名已存在”;如果用户表中没有该用户名则把用户信息加入数据库,把操作状态以json字符串方式返回到前台。Ajax请求成功接收到返回的数据时会触发成功回调函数,然后解析返回的json字符串,系统根据返回信息弹出提示框,注册成功后返回登录页。

用户注册界面如下图所示。

图5-6用户注册界面

用户注册页面的逻辑代码如下。

/**

     * 注册

     * @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;

}

      1. 健身活动推荐模块

管理员发布健身活动信息推荐后,推荐信息在系统前台显示,用户浏览健身活动信息,包括活动名称、活动类型,选择相应的活动推荐,通过id传参,找到该信息,在add.jsp提交健身活动推荐表单,生成推荐记录。

  健身活动推荐流程如下图所示。

图5-7健身活动推荐流程

  健身活动推荐界面如下图所示。

图5-8健身活动推荐界面

  健身活动推荐的主要逻辑代码:

 @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 "";

    }

    1. 管理员子系统模块的实现
      1. 用户管理模块

管理员对用户的管理,在yhzhgl.jsp实现管理员用户的管理,包括录入、删除、修改,修改密码通过SESSION获取用户名,然后输入新密码,提交到mod.jsp中,使用sql命令更新密码。

用户管理的界面如下图所示。

图5-9用户管理界面

      1. 健身活动管理模块

用户在系统前台后,数据库的健身活动表生成健身活动信息,管理员在jianshenhuodong _list.jsp录入,进行管理。

  健身活动管理如下图所示。

图5-10  健身活动管理界面

  健身活动管理的主要逻辑代码如下所示。

@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();

    }

}

      1. 健身视频管理模块

管理员在jianshenshipin_add.jsp发布 健身视频信息,跳转至健身视频添加表单,包括健身视频名称、类型等,信息提交后,数据库的健身视频信息表刷新数据,系统将 健身视频信息展示出来。

 健身视频管理的界面如所示。

图5-11 健身视频管理界面

      1. 计划活动管理模块

 计划活动管理包括新增计划活动信息、删除 计划活动信息、计划活动信息查询等,以 计划活动信息新增为例,在视图层请求信息新增,反馈后,调用业务逻辑层,通过业务逻辑层的接口调用底层的数据逻辑层完成数据库联动操作。

 计划活动添加的流程如所示。

图5-12 计划活动添加管理流程

 计划活动管理的界面如所示。

图5-13 计划活动管理界面

  1. 系统测试
    1. 测试目的

在这个产品被投入使用前,首先需要进行试用,这是重要的环节。考虑到某个部分的开发没有缺陷情况下,把各种模块拼接,也有一定概率就存在矛盾。这就好比每个人都很独特,但聚在一起就显得杂乱无章,需要保证有默契的配合。对于测试,要看它的各项内容是否契合的原则。若与最初定下的标准有一定程度上的出入,那么就需要做出一些调整,让最终的大方向朝着目标前进。

    1. 测试用例
      1. 登录测试 

登录测试用例如下表所示。

表6-1登录测试用例

输入

输出

用户名

密码

用户名或密码不能为空

蔡徐坤

123

用户名不能为汉字,请重新输入

789

789

用户名或密码错误

678

123456

登录成功

      1. 注册测试 

注册测试用例如下表所示。

表6-2注册测试用例

输入

输出

用户名

密码

确认密码

邮箱

请输入完整

001

001

001

001@qq.com

注册成功

002

002

003

002@qq.com

注册失败,两次密码不一致

003

003

003

003.com

注册失败,邮箱格式不正确

      1.  公告消息管理测试 

 公告消息测试用例如下表所示。

表6-4添加 公告消息测试用例

输入

输出

标题

类别

内容

备注

添加失败

 公告消息1

A

1

添加成功

A

1

添加失败,标题不能为空

 公告消息2

1

添加失败,请选择类别

      1. 健身活动 管理测试 

健身活动 测试用例如下表所示。

表6-4添加健身活动 测试用例

输入

输出

名称

类别

内容

备注

添加失败

健身活动 1

A

100

添加成功

A

100

添加失败,名称不能为空

健身活动 2

100

添加失败,请选择类别

      1. 计划活动测试 

计划活动测试用例如下表所示。

表6-5计划活动测试用例

输入

输出

名称

类别

内容

标题

添加失败

计划活动1

A

100

001

添加成功

A

100

001

添加失败,名称不能为空

计划活动2

100

001

添加失败,请选择类别

    1. 测试结果

经过测试,得到测试结果如下表所示。

表6-6测试结果

测试项目

内容和目的

测试结果

用户登录

输入正确用户名与密码

可以登录

输入错误用户名与密码

提示错误的信息

健身活动管理(添加,修改,删除)

输入正确信息

成功完成

输入错误信息

操作失败

修改登录密码

修改新的密码

成功完成

用户管理(添加,修改,删除)

输入正确信息

成功完成

输入错误信息

操作失败

健身视频管理(添加,修改,删除)

输入正确信息

成功完成

输入错误信息

操作失败

热门健身管理(添加,修改,删除)

输入正确信息

成功完成

输入错误信息

操作失败

计划活动管理(添加,修改,删除)

输入正确信息

成功完成

输入错误信息

操作失败

  1. 总结与展望

本次毕业论文的主要是开发一个安全可靠,操作简易,同时具备业务可扩展的校园健身互助平台。本文详细的论述了校园健身互助平台的设计和开发,本系统的所有事务逻辑都是按照系统的需求分析进行设计的,系统有普通用户和系统管理员两种角色,系统大大增加了客户的体验程度,由于是对局部进行操作那么就减少了一些繁琐而又不必要的操作,减轻了服务器对页面解析的负担。

与其他系统相比,本系统有自身的优点,

例如:

(1)创新性强;

(2)业务逻辑性强,安全性高,在一些重要的功能模块需要通过审查之后才可使用;

(3)移植性高,在所有Window平台都可使用。

当然也还有很多需要进一步改进的地方:

(1)系统大多数页面都是全局刷新,缺乏局部刷新,这将增加服务器的压力,如果有大量用户在同一时间段操作同一个功能模块,可能会导致查询缓慢;

(2)页面没有经过专业的UI设计,美观程度不及其他市场其他网站系统,有待改善。

参考文献

  1. 安鹏.高校健身健美运动助力校园“阳光体育”的可行性研究——以广东海洋大学为例[J].当代体育科技,2022,12(02):46-49.
  2. 李汪洋,邓维均. 后疫情时期健身气功校园使命担当与文化建设研究[C]//.保护·研究·传承——2021年中国体育非物质文化遗产国际会议墙报交流论文集.,2021:364.DOI:10.26914/c.cnkihy.2021.051297.

[3]彭江科. 健身气功“八段锦”进校园的价值及推广策略[C]//.保护·研究·传承——2021年中国体育非物质文化遗产国际会议书面交流论文集.,2021:397.DOI:10.26914/c.cnkihy.2021.053106.

[4]齐顺发,徐莉. 全民健身视阈下民族传统体育进校园的价值导向与路径研究[C]//.2021年全国武术教育与健康大会暨民族传统体育进校园研讨会论文摘要汇编2021:212-213.DOI:10.26914/c.cnkihy.2021.041469.

[5]柴于晴,周红艳. 基于SWOT分析的健身气功在高校的推广应用研究[C]//.2021年全国武术教育与健康大会暨民族传统体育进校园研讨会论文摘要汇编2021:61-62.DOI:10.26914/c.cnkihy.2021.041331.

[6]孙童心,朱佳滨. 文化差异与主体认知:健身气功融入校园文化的鸿沟[C]//.2021年全国武术教育与健康大会暨民族传统体育进校园研讨会论文摘要汇编2021:24-25.DOI:10.26914/c.cnkihy.2021.043454.

[7]武仔超. 全民健身战略下民族传统体育校园中发展的研究[C]//.2021年全国武术教育与健康大会暨民族传统体育进校园研讨会论文摘要汇编2021:89.DOI:10.26914/c.cnkihy.2021.043516.

[8]王程林,高飞,赵瑞国,张厚喜. 全民健身背景下校园手球课程开展的必要性与路径研究[C]//.第三届“全民健身 科学运动”学术交流大会论文集.,2021:63-64.DOI:10.26914/c.cnkihy.2021.048568.

[9]冯伟,冯英歌.高校校园健身跑“健体育魂”的现实困境与优化路径[J].广东职业技术教育与研究,2021(05):177-180.DOI:10.19494/j.cnki.issn1674-859x.2021.05.052.

[10]吕茹茹.全民健身战略下民族传统体育进校园研究[J].武术研究,2021,6(08):146-147.DOI:10.13293/j.cnki.wskx.009136.

[11]芮守倩,吕刚,郑晓莹.大学校园健身会所展示设计研究[J].中国建筑装饰装修,2021(01):146-147.

[12]傅锦涛.从体育健身角度看校园体育文化建设[J].当代体育科技,2020,10(26):82-84.DOI:10.16655/j.cnki.2095-2813.2002-1000-0605.

[13]黄文胜.“校园APP健身跑”融入大学生体育课的实验教学模式探究[J].实验室研究与探索,2020,39(03):186-189.

[14]王海贤.基于全民健身的校园冰雪运动发展策略研究[J].当代体育科技,2020,10(06):182-183.DOI:10.16655/j.cnki.2095-2813.2020.06.182.

[15]宋海泉. 科学健身视角下校园体育教学模式创新研究[C]//.2019年国际科技创新与教育发展学术会议论文集.,2019:291-292.

[16]王宁. 基于智慧校园视角下的青少年自我健身管理研究[D].青岛大学,2019.DOI:10.27262/d.cnki.gqdau.2019.000012.

[17]吕慧.高校校园健身活动开展现状探析[J].体育科技文献通报,2019,27(01):151-152.DOI:10.19379/j.cnki.issn.1005-0256.2019.01.065.

致谢

经过几个月时间的努力终于完成了这篇文章,在文章的写作与研究的过程中遇到了很多困难,都在同学和老师的帮助下解决了。尤其非常感谢我最敬爱的老师,他对我进行了无私的指导和帮助,不厌其烦的帮助进行文章的修改。老师严谨的治学态度、渊博的学术知识、诲人不倦的敬业精神以及宽容的待人风范使我获益颇丰。此外,在校图书馆查找资料的时候,图书馆的老师也给我提供了很多方面的支持与帮助。在此,向帮助和指导过我的老师表示最衷心的感谢!感谢这篇文章所涉及到的各位学者。本文引用了数位学者的文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇文章的写作。感谢我的同学、朋友以及所在单位的同事,在我写文章的过程中给与了我很多素材和帮助,还在文章的撰写和排版过程中提供热情的帮助。同时,感谢我的室友对我的热心指导和帮助,经常有不懂之处都是大家在帮助我,才使得我比较顺利的完成了这篇文章。由于我水平有限,所写文章难免有不足之处,恳请各位老师和学友批评和指正!

点赞+收藏+关注  →  私信领取本源代码、数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值