摘  要

随着城市化进程的加快,骑行作为一种环保、便捷的出行方式逐渐受到人们的青睐。然而,现有骑行运动往往缺乏系统化的管理平台,使得骑行活动的组织、数据记录和用户交流存在诸多不便。因此,本系统借助先进的现代化技术设计并实现一个高效友好的骑行地图微信小程序,为用户提供便捷的骑行路线规划与数据管理功能,同时为管理员提供有效的系统管理与信息发布渠道。本系统后端采用Java的SpringBoot框架实现业务逻辑和数据处理,前端则使用uni-app框架实现跨平台的小程序,数据库选用MySQL进行数据存储与管理。系统分为骑行用户和管理员两大核心部分,主要涵盖了数据分析、角色管理、开始骑行管理、停止骑行管理、系统管理、骑行公告管理、新闻管理、交流管理以及地图导航等功能,通过引入合理的流程和权限管理,确保各类用户在系统中进行高效的交互,能够实现对骑行信息的全面管理。通过整合前后端技术,最终构建与实现了一个用户友好、便捷高效的骑行管理和分享平台。该系统的实施不仅提升了骑行活动的管理效率,也增强了用户体验和交互,并进一步推动骑行文化和绿色出行理念的传播,具有良好的实践意义和推广价值。

关键词骑行地图微信小程序;SpringBoot;Java;骑行运动管理;uni-app

Abstract

With the acceleration of urbanization, cycling as an environmentally friendly and convenient way of transportation is gradually gaining popularity among people. However, existing cycling activities often lack a systematic management platform, which makes the organization, data recording, and user communication of cycling activities inconvenient. Therefore, this system utilizes advanced modern technology to design and implement an efficient and user-friendly cycling map WeChat mini program, providing users with convenient cycling route planning and data management functions, while also providing administrators with effective system management and information publishing channels. The backend of this system uses Java's SpringBoot framework to implement business logic and data processing, while the frontend uses the uni app framework to implement cross platform mini programs. The database uses MySQL for data storage and management. The system is divided into two core parts: cycling users and administrators, mainly covering functions such as data analysis, role management, start cycling management, stop cycling management, system management, cycling announcement management, news management, communication management, and map navigation. By introducing reasonable processes and permission management, it ensures efficient interaction among various users in the system and enables comprehensive management of cycling information. By integrating front-end and back-end technologies, a user-friendly, convenient, and efficient cycling management and sharing platform was ultimately built and implemented. The implementation of this system not only improves the management efficiency of cycling activities, but also enhances user experience and interaction, and further promotes the dissemination of cycling culture and green travel concepts, which has good practical significance and promotional value.

Key Words:cycling map WeChat mini program; SpringBoot; Java; Cycling sports management; uni-app

目 录

第1章 绪论

1.1 研究背景与意义

1.1.1 研究背景

1.1.2 研究意义

1.2 国内外研究现状

1.2.1 国外研究现状

1.2.2 国内研究现状

1.3 论文组织结构

第2章 相关技术介绍

2.1 Java语言

2.2 SpringBoot框架

2.3 uni-app框架

2.4 微信小程序

2.5 MySQL数据库

2.6 B/S架构

第3章 需求分析

3.1 可行性分析

3.1.1 技术可行性

3.1.2 操作可行性

3.1.3 经济可行性

3.2 功能需求分析

3.2.1 用例模型

3.2.2 功能分析

3.3 非功能需求分析

第4章 系统设计

4.1 系统架构设计

4.2 系统总体流程设计

4.2.1 用户登录流程

4.2.2 添加信息流程

4.2.3 修改信息流程

4.2.4 删除信息流程

4.3 系统总体功能设计

4.4 数据库设计

4.4.1 数据库概念设计

4.4.2 数据库表设计

第5章 系统实现

5.1 骑行用户功能实现

5.1.1 用户注册模块

5.1.2 用户登录模块

5.1.3 首页模块

5.1.4 开始骑行模块

5.1.5 导航地图模块

5.1.6 交流论坛模块

5.1.7 我的模块

5.2 管理员功能实现

5.2.1 数据分析模块

5.2.2 开始骑行管理模块

5.2.3 停止骑行管理模块

5.2.4 新闻管理模块

5.2.5 交流管理模块

第6章 系统测试

6.1 测试目的

6.2 测试用例

6.3 测试结论

第7章 结论

参考文献

致 谢

附 录

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

在现代城市中,骑行作为一种绿色交通方式,正受到越来越多人的青睐,尤其在是在年轻人群体。骑行不仅有助于减轻交通拥堵、降低环境污染,而且也有助于提升公众健康。然而,尽管骑行活动日益增多,相关的管理与服务却相对滞后,尤其是在信息共享、骑行路线规划、骑行数据记录以及骑行交流分享等方面,缺乏一个系统化的管理平台。因此,研究骑行管理系统的设计与实现显得尤为重要。同时,微信小程序作为一种轻量级的应用形式,具备快速开发、便捷使用的特点,能够有效吸引用户并提供实时服务。基于SpringBoot框架的后端技术,能够为小程序提供强大的数据处理与业务逻辑支持,实现高效、稳定的服务。

      1.  研究意义

本研究主要通过采用SpringBoot框架,结合uni-app和微信小程序技术构建一套操作简便的骑行地图微信小程序,探讨如何通过信息化手段实现骑行信息共享、数据记录与社区互动等功能,为骑行活动提供全面的管理与服务功能,提高骑行活动的管理效率和用户体验,具有重要的理论与实践价值。

该系统的开发与实现将有效提高用户的骑行体验,使得用户可以方便地计划骑行路线、记录骑行数据,获取骑行资讯,并与他人进行分享交流。通过实现地图导航功能,为用户提供科学合理的骑行路线导航和规划建议,提升骑行体验和出行效率。同时建立氛围良好的骑行社群,用户可以分享骑行经验、交流骑行技巧,增强骑行的乐趣。对于管理员而言,系统提供的管理功能将降低信息处理的繁琐程度,实现高效的用户管理与信息发布,能够提高管理效率和服务质量。本研究通过应对当今社会对绿色出行的日益重视,可以进一步推动骑行文化的发展,促进人们对健康生活方式的追求。此外,本系统的成功实现不仅将技术与实际应用相结合,也为今后的类似运动管理系统的研发提供了可借鉴的经验与方法。

    1.  国内外研究现状
      1.  国外研究现状

国外方面,关于骑行的研究和管理系统发展相对成熟,已建立完善的骑行网络与生态系统。尤其是欧洲和北美,骑行活动在城市交通体系中占据了重要地位,相关的研究与应用也更加多元化。如美国的“Strava”作为一款专注于运动数据跟踪和社交的应用,已经吸引了大量骑行爱好者,用户可以通过平台记录骑行路线、时间及距离,并分享给朋友。同时Strava 的数据分析功能,使得用户能够更清楚地了解自己的骑行习惯,甚至可以和其他用户进行挑战和互动。国外许多城市在规划时充分考虑了骑行的便捷性和安全性。例如,荷兰的阿姆斯特丹因其发达的骑行基础建设和政策支持,形成了良好的骑行文化。同时,数据驱动的骑行管理系统在国外得到了广泛使用。国外研究者注重利用大数据分析用户的骑行行为,并针对骑行安全等问题提出了多项政策建议,指出城市自行车道的设计直接影响骑行者的安全感和骑行率,这些研究为政府和城市规划者提供了重要的参考依据。

      1.  国内研究现状

随着国内共享单车行业的兴起,骑行活动的管理和服务逐渐引起了国内研究者的关注。各大高校与科研机构开始对骑行相关数据进行挖掘与分析。例如,北京大学的研究团队通过对共享单车数据的分析,探索了用户的骑行模式与行为偏好,为政策制定提供了数据支撑。此外,如Mobike和Ofo等共享单车服务企业,也开始开发相关管理系统,建立了相对完善的骑行管理系统。这些骑行系统不仅提供实时的单车位置信息,还通过用户骑行数据分析,为用户推荐最优骑行路线,以提升用户体验和管理效率。然而,现有的管理系统往往更加关注单车投放与调度,而对骑行路线规划、骑行社区的构建等方面的研究相对不足。因此,进一步探索骑行管理系统的功能与实现路径,将为提升骑行活动的管理水平提供新的思路。

    1.  论文组织结构

本论文共分为七个主要章节,具体结构如下:

第一部分绪论,介绍研究背景与意义,回顾国内外研究现状,并概述论文的组织结构。

第二部分相关技术介绍,详细介绍与本研究相关的技术,包括Java语言、B/S框架、SpringBoot框架和MySQL数据库等技术。

第三部分需求分析,对系统的功能需求和非功能需求进行分析,明确用户和管理员的需求,并进行可行性分析,包括技术、操作和经济可行性。

第四部分系统设计,涵盖系统架构设计、总体流程设计和功能设计,并进行数据库的概念设计与表设计。

第五部分系统实现,具体描述各个功能模块的实现过程,展示系统如何根据需求进行开发。

第六部分系统测试,阐述测试的目的、方法和内容,分析测试结果并得出结论,以验证系统的稳定性和功能完整性。

最后,结论部分,总结研究的主要成果和贡献,指出存在的不足及未来的研究方向。

  1.  相关技术介绍
    1.  Java语言

Java语言是一种广泛使用的高级编程语言,具有平台无关性、面向对象特性和丰富的标准库[1]。Java的面向对象特性使得代码复用和模块化变得更加容易,促进了软件的维护和扩展。Java支持多线程编程,允许开发者在同一程序中同时执行多个任务,提升了应用程序的性能。Java语言的语法结构简洁且易于理解,吸引了大量开发者。Java的标准库包含数据结构、输入输出处理、网络编程等众多功能模块[2]。这使得开发者在构建应用程序时能够高效利用已有工具,减少重复劳动。Java广泛应用于企业级应用、移动应用、Web开发和大数据处理等领域。

    1.  SpringBoot框架

SpringBoot框架是基于Spring框架的开源项目,简化Java应用程序的开发过程。SpringBoot通过约定优于配置的理念,减少了传统Spring应用的繁琐配置,开发者可以快速搭建和部署应用程序[3]。SpringBoot框架提供了一系列默认配置,支持自动化配置,简化了应用启动的复杂性。SpringBoot内置了嵌入式Web服务器,使得开发者能够独立运行Java应用,无需外部容器。SpringBoot支持微服务架构,开发者可以轻松创建和管理多个微服务。SpringBoot集成了丰富的功能模块,包括安全、数据访问和消息中间件等,支持RESTful API和JSON数据格式的处理[4]。SpringBoot还提供了强大的监控和管理功能,允许开发者实时监控应用的健康状态和性能指标。借助SpringBoot,开发者能够高效构建和维护现代企业级应用,满足复杂业务需求。

    1.  uni-app框架

uni-app是一个使用Vue.js开发所有前端应用的框架,只需编写一套代码即可编译到iOS、Android、H5、以及各种小程序等多个平台,用户通过uni-app建立的移动端应用能够方便地进行各种功能操作[5]。对于需要跨多个平台部署的应用来说,uni-app能够极大地提高开发效率,减少了不同平台间开发的学习成本和维护成本。

    1.  微信小程序

微信小程序是一种不需要下载安装即可在微信内使用的应用程序,用户只需扫描二维码或搜索特定名称即可打开应用[6]。它为用户提供了一种便捷的应用体验,同时也为开发者提供了便捷的开发工具与环境,能够降低开发门槛,并且可以充分利用微信庞大的用户基础进行推广。

    1.  MySQL数据库

MySQL是一种开源关系型数据库管理系统,广泛应用于Web应用和企业级数据存储。MySQL支持结构化查询语言,允许开发者通过标准语句进行数据的创建、读取、更新和删除操作。数据库通过表格形式组织数据,支持数据完整性和约束条件的定义[7]。MySQL的存储引擎机制使得用户可以根据具体需求选择不同的存储引擎,以优化性能和功能。MySQL具有高性能和可扩展性,支持大规模数据存储和高并发访问。系统提供了丰富的用户权限管理和数据加密安全特性。MySQL能够与多种编程语言和框架兼容,广泛应用于内容管理系统、电子商务平台和数据分析等各种场景[8]。

    1.  B/S架构

B/S(Browser/Server)架构是一种基于浏览器和服务器的系统架构模式,用户通过浏览器与服务器进行交互[9]。B/S架构简化了客户端的部署和管理,用户无需在本地安装复杂的软件,只需使用标准浏览器即可访问应用程序。服务器端负责处理业务逻辑和数据存储,客户端则主要负责展示用户界面和数据交互[10]。B/S架构通常采用Web技术进行实现,包括HTML、CSS和JavaScript等。用户在浏览器中发起请求,服务器响应并返回数据。数据传输通常通过HTTP或HTTPS协议进行,B/S架构的灵活性使其适用于在线购物、信息管理系统和社交网络等各类应用场景。由于其易于扩展性,B/S架构可以方便地支持大规模用户访问,适应不断变化的业务需求。

  1.  需求分析
    1.   可行性分析
      1.  技术可行性

系统选择当前主流的Java编程语言,并采用Spring Boot作为后端开发框架,可以充分利用其强大的生态系统和自动配置能力,加速开发进程。同时,利用uni-app开发前端能够确保应用在不同平台上的兼容性和一致性,降低开发成本。微信小程序的集成也使得用户可以通过最便捷的方式访问服务。MySQL作为关系型数据库解决方案,能够提供稳定的数据存储和管理功能。另个人拥有丰富的相关技术经验,能够有效应对潜在技术挑战。整体而言,这些技术的选择都是成熟可靠的,具备较高的技术可行性。

      1.  操作可行性

本系统设计采用B/S架构,用户只需要通过浏览器或微信小程序就能访问系统,极大地降低了用户的使用门槛。同时系统具备直观友好的用户界面,支持简便的导航和功能访问,极大地提升了用户的使用体验。系统还提供了自定义的工作流程和角色权限管理,使不同层级的用户能够快速上手,完成各自的任务。所以,该系统具有很高的操作可行性。

      1.  经济可行性

系统所使用的软件为开源技术,能够降低了开发和使用费用,同时硬件成本较低,使得整体初始投入相对合理,具备较高性价比。另外微信小程序无需用户额外下载安装,降低了推广成本。在开发完成上线后,可通过广告或其他增值服务支持系统后期运维成本。因此,系统在经济上是完全可行的。

    1. 功能需求分析
      1.  用例模型

本文将对系统按照角色模块进行需求分析。UML(统一建模语言)用例图是需求分析阶段常用的工具,通过直观的图形方式表示系统的功能需求和参与者。每个用例图包含一系列用例,即系统能够执行的特定功能,以及与之交互的参与者。根据用户分析,本骑行地图微信小程序可以划分为骑行用户角色和管理员角色,各角色的用例图如下所示。

  1. 骑行用户角色用例

本骑行地图微信小程序的骑行用户角色模块主要包含注册登录、首页(轮播图、骑行公告、开始骑行、导航地图)、交流论坛、骑行资讯、我的(基本信息、评论、开始骑行、停止骑行)等功能。骑行用户角色用例图如下图3-1 所示。

图3-1  骑行用户角色用例图

  1. 管理员角色用例

本骑行地图微信小程序的管理员角色模块则涵盖了登录、数据分析、角色管理、开始骑行管理、停止骑行管理、系统管理、骑行公告管理、新闻管理、交流管理等功能。管理员角色用例图如下图3-2 所示。

图3-2  管理员角色用例图

      1.  功能分析

按照用户需求和角色用例图分析,可以得出本骑行地图微信小程序主要划分为骑行用户模块和管理员模块两大部分,各角色功能模块详细说明如下所示。

  1. 骑行用户功能模块

注册登录:提供注册登录系统功能,用户可注册创建账号并登录系统,实现第三方微信授权登录,支持对个人信息进行管控,并提供忘记密码操作。

首页:用户登录系统后首先进入首页界面,可查看轮播图、骑行公告、骑行资讯等系统概览和推荐信息,并提供开始骑行、导航地图、交流论坛等系统功能入口子功能;用户可根据自身需求选择相应功能进行操作。

骑行公告:当用户点击首页的“骑行公告”这一按钮时,可查看管理员发布的系统公告内容,让用户第一时间获取系统信息。

开始骑行:当用户点击首页的“开始骑行”这一按钮时,可进入开始骑行记录页面,支持输入添加开始骑行信息。

导航地图:当用户点击首页的“导航地图”这一按钮时,可进入导航地图信息展示页面,集成百度地图实时导航功能,给用户推荐最佳骑行路线,支持用户搜索和选择选择不同的路径。

交流论坛:交流论坛模块主要为用户提供交流论坛功能,支持搜索和浏览交流论坛详情内容,点赞、评论、收藏操作;提供发布内容操作,发布交流论坛贴子,分享运动路线、骑行体验等。

骑行资讯:骑行资讯模块主要提供骑行资讯信息展示,包括骑行技巧、设备推荐、户外活动等内容等文章报道等,支持搜索和浏览骑行资讯详情内容,进行点赞、评论、收藏。

我的:我的模块主要为用户提供包括基本信息、评论、开始骑行、停止骑行等子功能模块,用户可根据自身需求选择相应功能进行管理操作。具体包括,骑行用户可在“基本信息”中修改个人资料和密码;可在“评论”中跟踪和删除自己发表的评论内容;可在“开始骑行”中查看历史骑行路线,支持增改删查开始骑行信息,实现停止操作;可在“停止骑行”中更新和删除停止骑行信息。

  1. 管理员功能模块

登录:管理员通过用户名和密码进行安全登录,确保只有授权管理员才可登录系统,实现权限内管理,有权更新个人资料和修改密码。

数据分析:管理员登录系统后的第一界面,该页面主要展示系统各类数据统计分析信息及重要信息概览,并提供系统功能入口。

角色管理:管理员可对骑行用户、管理员不同用户角色进行权限管理和角色设置,可增改删查和审核封禁系统用户信息。

开始骑行管理:管理员可以管理监控开始骑行信息,支持添加编辑新的开始骑行信息,可更新和删除开始骑行信息,提供搜索功能,实现停止操作。

停止骑行管理:管理员可以管理监控停止骑行信息,支持编辑更新停止骑行信息,提供查询和删除操作。

系统管理:管理员能够管控系统的轮播图信息,允许上传和删除轮播图,支持更新图片跳转链接,提供搜索功能。

骑行公告管理:管理员能够管理骑行公告信息,支持发布和更新骑行相关系统公告,提供查询和删除操作。

新闻管理:管理员可以管理骑行资讯和资讯分类等新闻信息,支持发布新的骑行资讯,对资讯进行分类管理,方便用户查询和获取骑行资讯,允许管控资讯评论。

交流管理:管理员可管理交流论坛和论坛分类等交流信息,支持发布新的交流论坛,对论坛进行分类管理,方便用户查询和获取论坛信息,允许管控论坛评论。

    1.  非功能需求分析
  1. 可用性  

系统应具备高可用性,用户在任何时间都能顺畅访问。系统的正常运行时间应达到99.9%以上,用户不会因系统故障而影响操作体验。用户界面设计应简洁明了,降低操作复杂性。

  1. 可靠性  

系统需要具备高可靠性,在故障发生时能够快速恢复。在并发操作情况下,系统应能确保数据的一致性并定期备份,避免出现数据冲突或数据丢失现象。

  1. 安全性  

系统应实现严格的安全控制,保护用户数据的隐私和完整性。用户信息应加密存储,传输过程中的数据也需采用加密协议,防止数据泄露。系统应具备权限管理功能,不同用户只能访问相应的数据和功能。

  1. 可扩展性  

系统设计应具备良好的可扩展性,模块化设计使得新功能可以方便地集成,系统能够支持更高的用户负载而无需重构基础架构。

  1. 性能  

系统的响应时间应控制在合理范围内,通常不超过2秒。系统应支持至少500名并发用户进行操作,且不影响系统性能。

  1. 兼容性

系统应支持主流浏览器(如Chrome、Firefox、Safari、Edge)和移动设备的访问,确保用户在不同设备上具有一致的体验。如果需要与第三方系统集成,系统的API应遵循RESTful标准,并提供良好的文档支持。

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

本骑行地图微信小程序的架构设计将采用分层架构,确保系统的可扩展性和维护性。架构主要将分为前端、后端和数据库三部分。用户界面层(前端)负责与用户交互,使用uni-app实现移动端应用,支持H5和微信小程序,能够适配多个终端,提高用户体验。业务逻辑层(后端)使用Spring Boot 实现系统的核心业务逻辑,并提供RESTful接口,为前端提供数据支持,实现前后端分离,提高了系统的灵活性和可扩展性,让前端能够独立开发和更新。使用Spring Data JPA或MyBatis与数据库进行交互,提供数据的持久化操作,负责数据的CRUD(创建、读取、更新、删除)。数据库层(数据库)使用MySQL作为后端的数据库,存储用户信息、系统数据和操作日志等。该骑行地图微信小程序的架构设计充分考虑了可扩展性、维护性和用户体验,各个模块的合理分离确保系统在未来能够顺利进行优化与扩展,整个系统架构如图4-1所示。

图4-1  系统架构图

    1.  系统总体流程设计
      1.  用户登录流程

用户输入用户名和密码后,系统先检查输入是否为空,再验证用户名是否存在,若存在则通过用户名获取密码并校验。若密码正确则登录成功,否则提示密码错误。若用户名不存在或无法登录,提示用户操作无效。如图4-2所示。

图4-2 登录流程图

      1.  添加信息流程

管理员可以添加信息,用户添加可以自己权限内的信息,输入信息后,要想利用这个软件来进行系统的安全管理,首先需要登录到该软件中。添加信息流程如图4-3所示。

图4-3  添加信息流程图

      1.  修改信息流程

用户首先选择需要修改的记录,输入修改后的数据,系统判断输入数据是否合法。若数据不合法,提示重新输入;若数据合法,则将修改后的数据写入数据库,完成操作后流程结束。修改信息流程图如图4-4所示。

图4-4  修改信息流程图

      1.  删除信息流程

用户选择需要删除的记录后,系统判断是否确认删除。若未确认,返回选择环节;若确认删除,则更新数据库,删除对应记录,完成操作后流程结束。删除信息流程图如图4-5所示。

图4-5  删除信息流程图

    1.  系统总体功能设计

根据需求分析的结果,可以将骑行地图微信小程序的功能划分为不同的模块。该系统主要可以划分为骑行用户和管理员两大模块,每个模块负责实现特定的功能,又可细分不同子模块,并与其他模块进行协作。本骑行地图微信小程序的功能结构图如图4-6所示。

图4-6  系统功能结构图

    1.  数据库设计
      1.  数据库概念设计

概念设计是数据库设计的第一步,其主要目标是对系统的数据需求进行全面的理解和抽象。在进行数据库设计时,概念设计可以帮助明确系统的整体结构和需求。在这一阶段,需要确定实体、属性以及它们之间的关系,为后续的数据库表设计奠定基础。接下来,将深入探讨数据库表设计的具体细节,实现更高效的数据存储和管理。本骑行地图微信小程序全局E-R图如图4-7所示。

图4-7  系统总体E-R图

      1.  数据库表设计

数据库表设计的重点是将概念模型转换为实际的数据库结构,包括表的创建、字段的定义及数据类型的选择。每个实体通常对应于数据库中的一张表,而实体的属性则转化为表的字段。以下是系统的数据库表设计具体内容展示,在此主要罗列部分主要功能数据表结构。

表4-1 cycling_user(骑行用户)

编号

字段名

类型

长度

是否非空

是否主键

注释

1

cycling_user_id

int

骑行用户ID

2

user_name

varchar

64

用户姓名

3

user_phone

varchar

64

用户电话

4

user_city

varchar

64

用户城市

5

examine_state

varchar

16

审核状态

6

user_id

int

用户ID

7

create_time

datetime

创建时间

8

update_time

timestamp

更新时间

表4-2 article(文章)

编号

字段名

类型

长度

是否非空

是否主键

注释

1

article_id

mediumint

文章id

2

title

varchar

125

标题

3

type

varchar

64

文章分类

4

hits

int

点击数

5

praise_len

int

点赞数

6

create_time

timestamp

创建时间

7

update_time

timestamp

更新时间

8

source

varchar

255

来源

9

url

varchar

255

来源地址

10

tag

varchar

255

标签

11

content

longtext

4294967295

正文

12

img

varchar

255

封面图

13

description

text

65535

文章描述

表4-3 forum(论坛)

编号

字段名

类型

长度

是否非空

是否主键

注释

1

forum_id

mediumint

论坛ID

2

display

smallint

排序

3

user_id

mediumint

用户ID

4

nickname

varchar

16

昵称

5

praise_len

int

点赞数

6

hits

int

访问数

7

title

varchar

125

标题

8

keywords

varchar

125

关键词

9

description

varchar

255

描述

10

url

varchar

255

来源地址

11

tag

varchar

255

标签

12

img

text

65535

封面图

13

content

longtext

4294967295

正文

14

create_time

timestamp

创建时间

15

update_time

timestamp

更新时间

16

avatar

varchar

255

发帖人头像

17

type

varchar

64

论坛分类

18

istop

int

是否置顶

表4-4 start_riding(开始骑行)

编号

字段名

类型

长度

是否非空

是否主键

注释

1

start_riding_id

int

开始骑行ID

2

cycling_user

int

骑行用户

3

user_name

varchar

64

用户姓名

4

user_city

varchar

64

用户城市

5

real_time_speed

varchar

64

实时时速

6

sports_mileage

varchar

64

运动里程

7

start_time

datetime

开始时间

8

average_speed

varchar

64

平均速度

9

route_arrangement

text

65535

路线安排

10

stop_riding_limit_times

int

停止限制次数

11

create_time

datetime

创建时间

12

update_time

timestamp

更新时间

表4-5 stop_riding(停止骑行)

编号

字段名

类型

长度

是否非空

是否主键

注释

1

stop_riding_id

int

停止骑行ID

2

cycling_user

int

骑行用户

3

user_name

varchar

64

用户姓名

4

user_city

varchar

64

用户城市

5

real_time_speed

varchar

64

实时时速

6

sports_mileage

varchar

64

运动里程

7

start_time

datetime

开始时间

8

average_speed

varchar

64

平均速度

9

route_arrangement

text

65535

路线安排

10

end_time

datetime

结束时间

11

create_time

datetime

创建时间

12

update_time

timestamp

更新时间

13

source_table

varchar

255

来源表

14

source_id

int

来源ID

15

source_user_id

int

来源用户

  1.  系统实现
    1.  骑行用户功能实现
      1.   用户注册模块

用户可以通过注册功能创建个人账户,便于使用系统提供的各项服务。用户在注册界面,填写用户名、密码、邮箱、手机号等基本信息,点击“注册”按钮,系统进行数据校验,若信息有效,则创建账户。界面如下图所示。

图5-1  用户注册界面

      1.  用户登录模块

用户通过登录功能访问其个人账户,享受个性化的服务。用户需在登录界面输入已注册的用户名或邮箱及密码进行登录。用户成功登录后,系统将用户引导至首页,显示个性化内容。若登录失败,系统会提示错误信息(如用户名或密码错误),并实现第三方微信授权登录。界面如下图所示。

图5-2  用户登录界面

      1.  首页模块

首页是用户进入系统后的第一界面,是用户获取信息和进行操作的主要入口。该界面主要提供系统搜索功能和系统功能导航栏,展示轮播图、骑行公告、骑行资讯等系统概览和推荐信息,并提供开始骑行、导航地图、交流论坛等系统功能入口子功能;用户可根据自身需求选择相应功能进行操作。界面如下图所示。

图5-3  首页界面

      1.  开始骑行模块

当用户点击首页的“开始骑行”这一按钮时,可进入开始骑行记录页面,支持输入添加开始骑行信息。界面如下图所示。

图5-4  开始骑行记录界面

      1.  导航地图模块

当用户点击首页的“导航地图”这一按钮时,可进入导航地图信息展示页面,集成百度地图实时导航功能,给用户推荐最佳骑行路线,支持用户搜索和选择选择不同的路径。界面如下图所示。

图5-5  导航地图界面

      1.  交流论坛模块

交流论坛模块主要为用户提供交流论坛功能,支持搜索和浏览交流论坛详情内容,点赞、评论、收藏操作;提供发布内容操作,发布交流论坛贴子,分享运动路线、骑行体验等。界面如下图所示。

图5-6  交流论坛界面

      1.  我的模块

我的模块主要为用户提供包括基本信息、评论、开始骑行、停止骑行等子功能模块,用户可根据自身需求选择相应功能进行管理操作。界面如下图所示。

图5-7  我的界面

具体包括,骑行用户可在“基本信息”中修改个人资料和密码;可在“评论”中跟踪和删除自己发表的评论内容;可在“开始骑行”中查看历史骑行路线,支持增改删查开始骑行信息,实现停止操作;可在“停止骑行”中更新和删除停止骑行信息。例如,开始骑行界面如下图所示。

图5-8  开始骑行界面

    1.   管理员功能实现
      1. 数据分析模块

管理员登录系统后的第一界面,该页面主要展示系统各类数据统计分析信息及重要信息概览,并提供系统功能入口。界面如下图所示。

图5-9  数据分析界面

      1.  开始骑行管理模块

管理员可以管理监控开始骑行信息,支持添加编辑新的开始骑行信息,可更新和删除开始骑行信息,提供搜索功能,实现停止操作。界面如下图所示。

图5-10  开始骑行管理界面

      1.  停止骑行管理模块

管理员可以管理监控停止骑行信息,支持编辑更新停止骑行信息,提供查询和删除操作。界面如下图所示。

图5-11  停止骑行管理界面

      1.  新闻管理模块

管理员可以管理骑行资讯和资讯分类等新闻信息,支持发布新的骑行资讯,对资讯进行分类管理,方便用户查询和获取骑行资讯,允许管控资讯评论。界面如下图所示。

图5-12  新闻管理界面

      1.  交流管理模块

管理员可管理交流论坛和论坛分类等交流信息,支持发布新的交流论坛,对论坛进行分类管理,方便用户查询和获取论坛信息,允许管控论坛评论。界面如下图所示。

图5-13  交流管理界面

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

测试的主要目的是确保系统的功能和性能满足预期的需求,同时识别和修复潜在的缺陷。通过系统测试,可以验证各个功能模块的正确性和稳定性,确保系统在不同使用场景下的表现符合设计要求。测试目的包括确认系统功能的完整性、验证数据处理的准确性、评估系统的性能和安全性。测试还可以提高用户满意度,保证用户在使用系统时获得流畅和可靠的体验。通过全面的测试,可以降低后期维护成本,减少系统上线后出现故障的风险,从而保障系统的长期稳定运行。

    1.  测试用例

在本系统中,测试方法主要依赖于测试用例的设计与执行。测试用例是根据系统需求文档编写的,覆盖所有功能模块及其边界情况。每个测试用例包含输入数据、预期结果和实际结果的对比,以验证系统的功能是否按预期工作。

用户注册功能测试用例表是用来验证用户能否成功注册成为系统用户的测试用例。用户注册功能测试用例如下表所示。

表6-1  用户注册功能测试用例

测试描述

测试用例

预期结果

结论

正常用户注册

根据提示输入完整正确的注册信息并点击注册

注册成功,跳转至登录页面

与预期一致

注册时用户名已存在

输入已存在的用户名

提示用户名已存在

与预期一致

注册时邮箱格式错误

输入无效的邮箱格式

提示邮箱格式错误

与预期一致

注册时必填信息未填写

注册信息未填写完整

提示请输入完整信息

与预期一致

用户登录功能测试用例表是用来验证用户能否成功登录成为系统用户的测试用例。用户登录功能测试用例如下表所示。

表6-2  用户登录功能测试用例

测试描述

测试用例

预期结果

结论

正常用户登录

输入正确的用户名和密码

登录成功,跳转至系统首页

与预期一致

登录时用户名错误

输入错误的用户名

提示用户名或密码错误

与预期一致

登录时密码错误

输入错误的密码

提示用户名或密码错误

与预期一致

开始骑行管理功能测试用例表是用来验证用户和管理员能否正确管理开始骑行的测试用例。开始骑行管理功能测试用例如下表所示。

表6-3  开始骑行管理功能测试用例

测试描述

测试用例

预期结果

结论

开始骑行查看功能测试

用户打开开始骑行页面

页面正常加载,显示开始骑行列表及操作选项

与预期一致

开始骑行搜索功能测试

输入关键字搜索特定开始骑行内容

目标开始骑行成功显示在界面

与预期一致

开始骑行添加功能测试

点击添加开始骑行,输入添加内容并提交

成功加载到开始骑行添加界面,信息输入并保存添加成功

与预期一致

开始骑行修改功能测试

选择修改开始骑行内容,输入修改内容并提交

加载到目标开始骑行编辑界面,信息输入并保存更新成功

与预期一致

开始骑行删除功能测试

选择开始骑行内容,点击删除按钮

开始骑行成功从开始骑行列表中删除

与预期一致

停止骑行管理功能测试用例表是用来验证用户和管理员能否正确管理停止骑行的测试用例。停止骑行管理功能测试用例如下表所示。

表6-4  停止骑行管理功能测试用例

测试描述

测试用例

预期结果

结论

停止骑行查看功能测试

用户打开停止骑行页面

页面正常加载,显示停止骑行列表及操作选项

与预期一致

停止骑行搜索功能测试

输入关键字搜索特定停止骑行内容

目标停止骑行成功显示在界面

与预期一致

停止骑行添加功能测试

点击添加停止骑行,输入添加内容并提交

成功加载到停止骑行添加界面,信息输入并保存添加成功

与预期一致

停止骑行修改功能测试

选择修改停止骑行内容,输入修改内容并提交

加载到目标停止骑行编辑界面,信息输入并保存更新成功

与预期一致

停止骑行删除功能测试

选择停止骑行内容,点击删除按钮

停止骑行成功从停止骑行列表中删除

与预期一致

骑行资讯管理功能测试用例表是用来验证管理员能否正确管理骑行资讯的测试用例。骑行资讯管理功能测试用例如下表所示。

表6-5  骑行资讯管理功能测试用例

测试描述

测试用例

预期结果

结论

骑行资讯查看功能测试

管理员打开骑行资讯管理页面

页面正常加载,显示骑行资讯列表及操作选项

与预期一致

骑行资讯搜索功能测试

输入关键字搜索特定骑行资讯内容

目标骑行资讯成功显示在界面

与预期一致

骑行资讯添加功能测试

点击添加骑行资讯,输入添加内容并提交

成功加载到骑行资讯添加界面,信息输入并保存添加成功

与预期一致

骑行资讯修改功能测试

选择修改骑行资讯内容,输入修改内容并提交

加载到目标骑行资讯编辑界面,信息输入并保存更新成功

与预期一致

骑行资讯删除功能测试

选择骑行资讯内容,点击删除按钮

骑行资讯成功从骑行资讯列表中删除

与预期一致

交流论坛管理功能测试用例表是用来验证用户和管理员能否正确管理交流论坛的测试用例。交流论坛管理功能测试用例如下表所示。

表6-6  交流论坛管理功能测试用例

测试描述

测试用例

预期结果

结论

交流论坛查看功能测试

用户打开交流论坛页面

页面正常加载,显示交流论坛列表及操作选项

与预期一致

交流论坛搜索功能测试

输入关键字搜索特定交流论坛内容

目标交流论坛成功显示在界面

与预期一致

交流论坛添加功能测试

点击发布交流论坛,输入添加内容并提交

成功加载到交流论坛添加界面,信息输入并保存添加成功

与预期一致

交流论坛修改功能测试

选择修改交流论坛内容,输入修改内容并提交

加载到目标交流论坛编辑界面,信息输入并保存更新成功

与预期一致

交流论坛删除功能测试

管理员选择交流论坛内容,点击删除按钮

交流论坛成功从交流论坛列表中删除

与预期一致

    1.  测试结论

通过对用户注册、用户登录、开始骑行、停止骑行、骑行资讯、交流论坛等核心功能的测试,所有关键功能模块均能按照预期工作,系统主要业务逻辑和操作无误。用户能够成功注册并登录系统实现各项操作,支持增改删查自己的开始骑行和停止骑行信息,可浏览管理员发布的骑行资讯信息,允许发布和管控自己的交流帖子。管理员可以快速高效地管理开始骑行、停止骑行、骑行资讯、交流论坛等各类系统信息,保证信息的及时更新,维护系统的正常运转。同时在测试过程中未发现明显的用户体验问题,所有操作均能够顺利完成且反馈及时准确。同时,系统能够在不同操作下保持稳定运行,未出现异常崩溃或数据丢失现象。

  1.  结论

本文基于SpringBoot技术设计并实现了一个骑行地图微信小程序系统,旨在为骑行用户提供便捷的管理与服务功能。通过对国内外骑行及相关运动管理系统发展现状的分析,本文总结了当前领域的研究情况和痛点,并提出了系统的设计目标。系统采用前后端分离架构,后端使用SpringBoot框架实现业务逻辑,前端使用uni-app、微信小程序等技术构建用户界面,数据库选用MySQL进行数据存储。系统功能涵盖骑行用户模块和管理员模块两大部分,骑行用户可通过平台快速获取骑行公告、资讯及交流分享信息,支持记录和分享自己骑行信息,实现地图导航信息。管理员则负责管理和更新系统各类信息,包括发布公告及资讯,管控用户的骑行信息,保证交流社区的良好氛围,确保系统正常运转。通过功能测试,系统各项功能均运行正常,达到了预期设计目标。

系统的实现为骑行管理和分享提供了一个高效、透明且用户友好的思路方案。通过优化信息记录共享流程和简化管理操作,系统显著提升了用户体验和管理效率。同时,系统的模块化设计和可扩展性为未来功能升级提供了便利。测试结果表明,系统在功能完整性、操作流畅性及数据安全性方面均表现良好。

尽管本研究已经取得了一定的成果,但在未来的发展中仍有改进的空间。例如,可以增加更多的数据分析功能,引入智能AI和大数据技术,使得骑行数据的分析更为精准,从而为用户提供个性化的骑行建议和健康管理服务。同时可以考虑与智能穿戴设备相结合,实现实时监测骑行者的健康状况,并为骑行者提供更多的安全保障。随着技术的不断进步和用户需求的变化,通过结合用户反馈持续迭代与优化,可以进一步提升骑行地图小程序的性能和用户满意度,为日益增长的骑行市场提供更优质的服务。

参考文献

  1. 张帅.计算机软件Java编程特点与技术探究[J].科技资讯,2024,22(17):23-25.DOI:10.16661/j.cnki.1672-3791.2404-5042-5333.
  2. 尹应荆.JAVA编程语言在计算机软件开发中的应用[J].石河子科技,2023,(05):45-47.
  3. 郭甲天,陈婷,向阳.一种基于SpringBoot框架校园宿舍管理系统的设计与实现[J].电脑知识与技术,2024,20(07):37-40.DOI:10.14004/j.cnki.ckt.2024.0444.
  4. 王志亮,纪松波.基于SpringBoot的Web前端与数据库的接口设计[J].工业控制计算机,2023,36(03):51-53.
  5. 张玮,廖若飞.基于uni-App的小程序开发技术路线及系统研究[J].无线互联科技,2024,21(22):41-44.
  6. 张强志,郑庆,黄志芳,等.校园学习生活小助手微信小程序的设计与实现[J].电脑知识与技术,2025,21(07):61-63.DOI:10.14004/j.cnki.ckt.2025.0322.
  7. 王希,戴靓婕.MySQL数据库技术在Web动态网页设计中的运用研究[J].软件,2024,45(07):77-79.
  8. 李艳杰.MySQL数据库下存储过程的综合运用研究[J].现代信息科技,2023,7(11):80-82+88.
  9. 王志涛.基于B/S模式的项目管理信息系统开发与设计[J].办公自动化,2024,29(24):84-86.
  10. 张丹丹,李弘.基于B/S架构的办公管理系统设计与开发[J].铁路通信信号工程技术,2024,21(09):44-48+106.
  11. Monga M ,Sadhukhan S .Analysis of urban cyclists’ behaviour using GSR: a scoping review[J].Transport Reviews,2025,45(2):216-238.
  12. Zhu Y .Contract Management System Based on SpringBoot and Vue[J].Advances in Computer, Signals and Systems,2024,8(5):
  13. 高博涵.基于健康骑行环境的地图类APP界面设计[D].西安理工大学,2024.DOI:10.27398/d.cnki.gxalu.2024.000379.
  14. 杨青,任静,杨若男,等.“骑迹”——个性化骑行平台市场可行性分析[C]//冶金工业教育资源开发中心.“AI赋能,智能办公”行政管理人员综合能力提升研讨会论文集.武汉学院;,2024:14-18.DOI:10.26914/c.cnkihy.2024.013498.
  15. 卢长鹏,张业男,周敏.Java程序设计项目化教程[M].化学工业出版社:202403.298.
  16. 陈晓庆,黄南坤,李文俊,等.云伴运动小程序的设计与实现[J].现代计算机,2023,29(19):110-113.
  17. 易擎阳.骑行社交类App用户的使用动机研究[D].上海体育学院,2022.DOI:10.27315/d.cnki.gstyx.2022.000270.
  18. 刘俊聪.垂直类体育APP的分众化传播策略研究[D].天津师范大学,2022.DOI:10.27363/d.cnki.gtsfu.2022.001111.
  19. 陈佳宽,周子昂,高云杰,等.校园社交运动微信小程序的设计与实现[J].信息与电脑(理论版),2021,33(15):116-118.
  20. 邹军华,黄佳乐,郑筱钒.基于微信小程序的运动伙伴选择平台设计与实现[J].中国教育技术装备,2021,(12):26-28.

致 谢

在本项目的实施过程中,许多人给予了我无私的支持和帮助,令我深感感谢。

我要衷心感谢我的指导老师。不仅在项目的初期提供了宝贵的建议,还在整个过程中给予了我细致入微的指导。专业知识和严谨态度始终激励着我,让我在遇到困难时能够保持信心,继续前行。每一次的讨论都让我对项目有了更深刻的理解,帮助我克服了许多技术难题。

我也要感谢参与用户测试的同学们。你们的反馈和建议为我们系统的优化提供了重要的参考,帮助我们更好地理解用户需求。正是因为有了你们的参与,我们才能够不断改进,提升系统的用户体验。感谢所有支持我的家人和朋友。你们的理解与鼓励让我在项目的紧张时刻始终能够保持积极的心态,成为我前进的动力。每当我遇到挑战时,想到你们的支持,我就能够重新振作,继续努力。最后,我要感谢所有在我职业发展过程中给予帮助的人。每一次的交流与分享都让我受益匪浅,拓宽了我的视野,让我在这条道路上走得更加坚定。

项目的完成不仅是我个人努力的结果,更是许多人共同支持与协作的成果。在此,我再次向所有关心和支持我的人表达衷心的感谢。希望未来我们能够继续携手,共同创造更多的价值和成就。

附 录

附录A  系统核心代码设计

连接数据库的文件在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

项目采用三层架构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,"密码修改失败!");

}

【关注博主 →免费赠送完整源码+数据库】

【关注博主 →免费赠送完整源码+数据库】

【关注博主 →免费赠送完整源码+数据库】

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐