行李寄存管理系统的设计与实现(源码+文档)

源码获取 VX:aiyougege999

摘    要

在当今社会,随着旅游和商务出行频率的不断提升,人们对行李寄存服务的需求日益增长。然而,许多现有的行李寄存服务未能提供一个既方便又高效的解决方案。针对此问题,本毕业设计项目开发了一个基于Spring Boot框架的行李寄存系统,旨在通过技术手段改善行李寄存服务,提高服务的可访问性和用户体验。本系统的开发采用了Spring Boot作为后端开发框架,利用其简化的配置和快速开发的特点,有效地提升了开发效率。前端界面采用了Thymeleaf模板引擎,与Spring Boot良好地集成,以实现简洁而响应式的用户界面设计。系统后端主要采用MySQL数据库进行数据持久化,确保了数据的安全性和稳定性。整个系统支持基本的行李寄存操作,包括用户注册登录、行李寄存申请、状态查询以及费用结算等功能。在设计和实现过程中,本项目特别注重用户操作的便捷性和系统的稳定性。通过细致的需求分析和系统设计,本系统提供了一个直观易用的平台,用户可以轻松地完成行李寄存和管理过程。同时,系统后端的稳健实现确保了处理流程的高效性和数据处理的安全性。未来工作将考虑引入更多用户反馈,对系统进行迭代优化,如改进用户界面、增加更多的功能特性以及提升系统的安全性等,以期望能提供更加完善和高效的行李寄存服务。

关键词:行李寄存、Java、Spring Boot、Thymeleaf

1绪论

1.1选题背景和意义

1.1.1选题背景

随着全球化进程的加速,人们的旅行频率显著增加,不论是出于商务还是休闲目的,都带动了旅游业和相关服务行业的蓬勃发展。在这样的大背景下,行李寄存服务作为旅行者非常需要的一个服务,其重要性日益凸显。然而,现有的行李寄存服务往往存在着许多不便之处,如服务点分布不均、使用过程繁琐、安全性难以保障等问题,这些都严重影响了用户的体验。

为了解决这些问题,越来越多的技术解决方案被提出,旨在通过现代信息技术提高服务的便捷性、安全性和效率。在这一背景下,基于Spring Boot框架的行李寄存系统应运而生。Spring Boot作为一种简化Spring应用开发的框架,以其开发简单、部署快捷、与各类技术栈集成方便等优点,成为了开发此类系统的理想选择。利用Spring Boot不仅可以提高开发效率,还可以保证系统的稳定性和扩展性[1]。

当前,互联网技术的飞速发展为传统行业带来了颠覆性的变革。特别是在服务行业,如何通过技术手段提升用户体验、优化服务流程成为了业界关注的焦点。行李寄存服务作为一个具有广泛需求的领域,急需通过技术创新来解决现有的服务瓶颈,提供更为高效、安全、方便的服务。因此,开发一个基于Spring Boot的行李寄存系统,不仅能够提升用户体验,还能为行李寄存服务提供新的解决思路,具有重要的实践价值和市场潜力。

1.1.2选题意义

提升服务便捷性:通过在线平台提供行李寄存服务,用户可以轻松寻找最近的寄存点,随时进行行李寄存和取回,极大地提升了服务的便捷性。

优化资源配置:系统能够实时监控各寄存点的状态,合理调配资源,避免某些寄存点过于拥挤而其他寄存点却资源闲置的情况,提高整体服务效率。

保障服务安全:通过技术手段对用户身份和行李安全进行保护,减少行李遗失或损坏的风险,增强用户对服务的信任。

数据分析与服务改进:系统可以收集并分析用户使用服务的数据,帮助服务提供者更好地了解用户需求,优化服务流程,提升用户满意度。

促进技术创新与应用:该项目的开发和实施将推动信息技术在传统服务行业的应用创新,为其他领域提供技术改造的参考和启示[2]。

1.2课题内容和目标

1.2.1课题内容

本研究的课题内容包括以下主要方面:

系统需求分析:深入研究和分析行李寄存服务的业务需求,包括用户需求和服务提供者需求,以及系统应满足的功能性和非功能性需求。

系统设计:设计系统的整体架构,包括前端用户界面设计、后端服务逻辑、数据库设计以及系统的安全架构,确保系统具有良好的用户体验、高效的数据处理能力和强大的安全防护。

技术选型与框架搭建:基于Spring Boot框架进行后端开发,选取合适的前端技术栈(如HTML5, CSS3, JavaScript)以及数据库系统(如MySQL),构建系统的基础开发框架。

系统实现与功能开发:在确立的框架基础上,实现系统的核心功能,包括用户注册登录、行李寄存操作、寄存点查询、费用计算与支付等。

测试与优化:对系统进行全面的测试,包括功能测试、性能测试、安全性测试等,根据测试结果对系统进行必要的优化和调整,确保系统的稳定运行和良好性能[3]。

1.2.2课题目标

本课题旨在开发一个基于Spring Boot框架的行李寄存系统,最终目标是实现一个既安全又高效、用户友好且易于扩展的在线行李寄存服务平台。通过这个平台,用户能够方便快捷地完成行李寄存与取回的整个流程,同时,服务提供者可以实时监控和管理寄存服务的运行状态,优化资源分配,提升服务质量。

具体而言,系统应能满足以下几点目标:

便捷性:通过简洁直观的用户界面,使用户能够轻松完成注册、寄存和取回等操作,大大提升服务的便利性。

安全性:采用现代化的技术手段保护用户数据和交易安全,确保用户信息和行李安全,建立用户对平台的信任。

效率性:系统能够快速响应用户请求,准确无误地处理寄存和取回等业务操作,提高整个系统的服务效率。

可扩展性:系统设计时考虑未来可能的功能扩展和技术升级,保证长期运营中的持续性和竞争力。

数据驱动:能够收集和分析用户使用数据,为服务提供者提供决策支持,进一步优化服务策略和用户体验。

通过实现这些目标,本课题不仅为行李寄存服务领域提供了一个创新的解决方案,也展示了现代Web技术在服务业中的广泛应用潜力,为类似服务领域的技术创新和应用提供了参考[4]。

2项目介绍与技术背景

2.1项目介绍

本项目旨在设计并实现一个基于Spring Boot框架的行李寄存系统,以应对全球化进程中旅行频率增加所带来的行李寄存服务需求。随着人们对于旅行便利性要求的提高,传统的行李寄存服务已经无法满足市场的需求,因此,本系统致力于通过技术创新来提供更为高效、安全、便捷的行李寄存解决方案。

该系统通过在线平台的形式,使用户能够轻松地寻找最近的寄存点,并进行行李的寄存与取回操作。系统的设计理念在于优化资源配置,通过实时监控各寄存点的状态,合理调配资源,避免资源浪费和过度拥挤的情况。同时,系统采用先进的技术手段保障服务安全,减少行李遗失或损坏的风险,增强用户对服务的信任。

在技术实现方面,系统采用了Spring Boot框架,利用其简化的配置和快速的开发特性,构建了一个稳定、高效、易于扩展的平台。系统前后端分离,前端采用HTML5、CSS3和JavaScript等技术,后端则依托于Spring Boot的强大功能,结合MySQL数据库进行数据存储,确保了数据处理的高效性和系统的稳定性。

系统的主要功能模块包括用户信息管理、角色信息管理、部门信息管理、行李寄存柜管理、用户行李寄存管理、寄存记录查询、通知公告以及修改密码和退出注销等。这些模块共同构成了一个全面的行李寄存管理解决方案,旨在为用户提供一个安全、便捷、透明的行李寄存服务,同时为管理员提供了强大的后台管理功能。

通过本项目的实施,不仅能够提升行李寄存服务的质量和效率,还能够推动信息技术在传统服务行业的应用创新,为类似服务领域的技术创新和应用提供参考。未来,本系统还有望通过引入微服务架构、人工智能算法、移动应用开发等先进技术,进一步优化服务流程和用户体验,满足市场的不断变化和发展需求。

2.2技术背景

2.2.1 SpringBoot介绍

遵循"约定大于配置"的设计理念。

Spring Boot是一款基于Spring框架基础上的一款开源框架,简化Java应用的构建、开发和部署流程。

Spring Boot的特点和优势包括:

启动运行更加快速:独特得内嵌式服务器,灵活配置Tomcat,使程序的启动变得非常快。少量配置,启动一个web应用。

配置自动化:通过自动配置来消除了大量的样板式代码,内置得自动配置框架,减轻负担。

依赖管理: Spring Boot引入了一种依赖管理的机制,允许开发者通过简单的声明来管理应用程序的依赖关系。这使得应用程序的构建和维护变得更加从容。

4.内嵌式Web服务器: SpringBoot框架支持多种内嵌式的Web容器,允许开发者选择适合其应用程序的服务器。这种方式简化了部署和维护过程。

大量的扩展: Spring Boot提供了众多的插件和扩展,以支持各种任务,如安全性、数据访问、消息队列等[6]。

总之,Spring Boot的设计目标是使Java开发变得更加简单和高效,减少了传统Spring应用程序的复杂性。它适用于构建各种类型的应用程序,从简单的Web应用到大型的微服务架构。

2.2.2 HTML

HTML(HyperText Markup Language)是标准的网页开发语言,用于创建和设计网页内容。它定义了网页的结构,允许嵌入文本、链接、图片、列表、表格等元素。HTML是构建Web页面和应用的基础,通过标签(Tags)的形式组织内容,使浏览器能够解析和显示网页。在本项目中,HTML用于构建用户界面的骨架,提供清晰、结构化的页面布局。

2.2.3 Tomcat

Apache Tomcat是一个开源的Web应用服务器,用于部署Java Servlet和JSP(JavaServer Pages)应用。它是一个轻量级的应用服务器,广泛用于开发和测试Java Web应用。Tomcat支持多种Java EE规范,如Java Servlet、JavaServer Pages、Java Expression Language等,提供了一个稳定和灵活的运行环境。在本项目中,Tomcat作为部署服务器,负责处理来自用户的请求并将其转发给后端Spring Boot应用,同时也负责向用户展示前端页面[7]。结构图如图所示:

图2.1 tomcat

3需求分析与系统设计

3.1需求分析

3.1.1用户需求分析

3.1.1.1用户群体

普通用户:需要寄存行李的个人,他们可能是旅客、学生或任何在公共场所需要临时存放个人物品的人。

系统管理员:负责管理整个系统的运作,包括用户管理、角色权限分配、行李寄存柜管理等。

部门管理人员:负责特定部门内部事务的管理,如部门内用户的管理、部门资源的调配等。

3.1.1.2普通用户

安全可靠的寄存服务:用户期望行李寄存服务能够确保他们的物品安全,不被盗窃或损坏。

简便的操作流程:从寄存到取回,整个过程应简洁明了,用户可以轻松地完成所有操作。

即时的寄存信息:用户需要实时获取自己行李的寄存状态,包括寄存位置、寄存时间等。

灵活的寄存时间:用户希望系统能提供灵活的寄存时间,满足不同用户的需求。

3.1.1.3系统管理员

用户信息管理:管理员需要有效管理用户信息,包括注册信息、登录日志等。

权限和角色管理:根据不同用户的行为和需求,分配合适的权限和角色,保证系统的安全性。

寄存柜管理:有效监控和管理所有行李寄存柜的状态,包括使用情况、故障情况等。

系统维护和更新通知:能够发布系统维护和更新信息,确保用户及时了解系统状态。

3.1.2功能需求分析

本系统旨在提供一个全面的行李寄存管理解决方案,通过实现细致的权限管理和高效的数据处理,以满足不同用户的需求。系统的主要功能模块涵盖了从用户登录到行李寄存、部门管理乃至通知公告的发布等多个方面,确保了系统的全面性和实用性。以下是对每个主要功能模块需求的详细分析:

3.1.2.1用户信息管理模块

该模块负责实现用户的身份验证和登录信息的存储。

用户信息管理模块允许管理员对用户信息进行管理,包括添加新用户、编辑现有用户信息、删除用户等操作。该模块确保了用户数据的准确性和完整性,为权限分发和管理提供了基础。

3.1.2.2角色信息管理模块

角色信息管理模块负责定义不同的用户角色以及各角色的权限。系统管理员可以在此模块中创建、修改和删除角色,以及为角色分配具体的权限。通过灵活的角色和权限设置,系统能够精确地控制用户对各项功能的访问权限。

3.1.2.3部门信息管理模块

该模块用于管理系统内部的部门结构和部门信息。管理员可以通过此模块添加新部门、编辑或删除现有部门信息。部门信息管理是实现组织内部结构化管理的基础,有助于更好地分配资源和管理用户。

3.1.2.4行李寄存柜管理模块

行李寄存柜管理模块是本系统的核心之一,负责管理所有行李寄存柜的状态和信息。管理员可以监控每个寄存柜的使用状况,分配寄存柜资源,确保寄存服务的高效运行。

3.1.2.5用户行李寄存管理模块

此模块提供给用户一个界面,通过该界面用户可以提交寄存行李的请求,查询自己的寄存状态,以及完成行李的取回操作。系统需确保操作的便捷性和寄存过程的安全性。

3.1.2.6寄存记录查询模块

寄存记录查询模块允许用户和管理员查询历史寄存记录,包括寄存时间、寄存柜号和寄存状态等信息。该模块的设计旨在提供透明的寄存服务,增加用户信任感。

3.1.2.7通知公告模块

通知公告模块用于发布系统维护信息、服务更新或其他重要通知。这确保了所有用户能够及时获取重要信息,增强了系统的用户交互体验[8]。

3.1.2.8修改密码和退出注销模块

该模块允许用户安全地修改自己的密码,并提供了退出登录的功能。确保用户能够维护自己账户的安全性,同时方便用户在不同设备间切换使用系统。

通过以上模块的设计和实现,本系统旨在为用户提供一个全面、安全、便捷的行李寄存管理服务,同时为管理员提供强大

3.2数据库设计

3.2.1用户表设计

图3.1 用户表

3.2.2角色表设计 

图3.2 角色表

3.2.3菜单表设计 

图3.3 菜单表

3.2.4寄存行李柜表设计

图3.4 寄存行李柜表

3.2.5用户存放行李表设计

图3.5 用户存放行李表

3.2.6行李寄存记录表设计

图3.6 行李存放记录表

3.2.7通知公告表设计

图3.7 公告表

3.3数据库实体类属性图

用户表如图3.8所示:

图3.8 用户表ER图

角色表如图3.9所示:

图3.9 角色表ER图

菜单表如图3.10所示:

图3.10 菜单表ER图

寄存行李柜表如图3.11所示:

图3.11 寄存行李柜表ER图

用户存放行李表如图3.12所示:

图3.12 用户存放行李表ER图

行李存放记录表如图3.13所示:

图3.13 行李存放记录表ER图

公告表如图3.14所示:

图3.14 公告表ER图

系统整体ER图如图3.15所示:

图3.15 系统ER图

4系统实现

4.1登录模块

用户输入账号密码和验证码进行登录、发送请求到后台SysLoginController处理器登录方法进行数据请求验证、将处理结果返回给前端、前端根据返回的数据和结果完成对应的显示和页面跳转。

使用Shrio工具(密码加盐方式)进行加密分别将加密后的密码以及盐存与数据库中(如图4.1所示),在用户(管理员)进行登录时通过此来验证身份并进入系统[9]。

图4.1 登录密码存储

登录界面如图4.2所示:

图4.2 系统登录

关键代码:

@ResponseBody

@RequestMapping(value = "/sys/login", method = RequestMethod.POST)

public R login(String username, String password, String captcha) {

String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);

if(!captcha.equalsIgnoreCase(kaptcha)){

return R.error("验证码不正确");

}

try{

Subject subject = ShiroUtils.getSubject();

UsernamePasswordToken token = new UsernamePasswordToken(username, password);//md5+Jiayan

subject.login(token);

}catch (UnknownAccountException e) {

return R.error(e.getMessage());

}catch (IncorrectCredentialsException e) {

return R.error("账号或密码不正确");

}catch (LockedAccountException e) {

return R.error("账号已被锁定,请联系管理员");

}catch (AuthenticationException e) {

return R.error("账户验证失败");

}

return R.ok();

}

  }

获取验证码:首先,它尝试通过ShiroUtils.getKaptcha,

(Constants.KAPTCHA_SESSION_KEY)获取会话中存储的验证码(kaptcha)。ShiroUtils是一个自定义工具类,用于简化对Shiro相关功能的访问,而Constants.KAPTCHA_SESSION_KEY是用于在会话中存储验证码的键。

验证码验证:然后,它检查用户输入的验证码(captcha参数)是否与会话中存储的验证码相匹配,忽略大小写。如果不匹配,方法返回一个错误响应,指示“验证码不正确”。

尝试登录:

使用用户名(username)和密码(password)创建了一个UsernamePasswordToken。这里的注释“md5+Jiayan”可能意味着密码在存储或处理前可能经过了MD5加密和/或加盐处理,尽管实际的加密/散列逻辑并未在此代码段中显示[10]。

通过ShiroUtils.getSubject()获取当前用户的Subject实例。在Shiro中,Subject代表了当前用户,用于安全操作,如登录、登出和权限检查。

使用subject.login(token)尝试登录,这会触发Shiro的认证流程。

异常处理:登录过程中可能会抛出几种异常,分别对应不同的登录失败原因:

UnknownAccountException:如果用户不存在,返回错误消息。

IncorrectCredentialsException:如果密码错误,返回错误消息。

LockedAccountException:如果账号被锁定,返回错误消息。

AuthenticationException:如果发生其他类型的认证失败,返回错误消息。

成功响应:如果登录成功(即没有抛出异常),方法返回一个成功的响应。

4.2首页

此处为对系统进行简单的介绍并列举的行李寄存系统的几条意义,均为前端写死后端并无逻辑处理。

前端界面如图4.3所示:

图4.3 首页

4.3行李柜管理

此处记录这行李柜的名称、编号、备注信息、类型、使用状态、创建人等基本信息,其中有增删改查等操作。

前端界面如图4.4所示:

图4.4 行李柜管理

关键代码:

@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){
    PageUtils page = JcLuggageService.queryPage(params);
    return R.ok().put("page", page);
}

4.3.1 新增行李柜

此处功能为填写行李柜相关信息并选择行李柜类型以新增行李柜。

前端界面如图4.5所示:

图4.5 新增行李柜

关键代码:

@RequestMapping("/save")

public R save(@RequestBody JcLuggage jcLuggage){
    jcLuggage.setStu("空闲");
    jcLuggage.setNum(InvertCodeGenerator.getRandomNickname(10));
    jcLuggage.setCreateTime(new Date());
    JcLuggageService.save(jcLuggage);
    return R.ok();
}

4.3.2 删除行李柜

通过选择id前面的勾选按钮,然后单击删除按钮来实现对所选择行李柜的删除操作,

随后,页面会弹出是否删除的提示,再次单击确定将删除所选记录。

前端界面如图4.6所示:

图4.6 删除行李柜

关键代码:

@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
    JcLuggageService.removeByIds(Arrays.asList(ids));
    return R.ok();
}

4.3.3 修改行李柜信息

选择行李柜,单击修改按钮即可进入与新增按钮相同的界面来修改行李柜的基本信息。

前端界面如图4.7所示:

图4.7 修改行李柜

关键代码:

@RequestMapping("/update")
public R update(@RequestBody JcLuggage jcLuggage){
    JcLuggageService.updateById(jcLuggage);
    return R.ok();
}

4.4行李入柜管理

本界面所展示的为行李柜入柜后的名称、用户手机号、柜子编号、柜子名称、备注信息、入柜时间、管理员联系方式等基本信息,同样实现了逻辑与行李柜整体相同的增删改查操作。

前端界面如图4.8所示:

图4.8 修改行李柜

关键代码:

@Autowired
 JcLuggageServiceImpl JcLuggageServiceImpe;
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){
    PageUtils page = JcLuggageService.queryPage(params);
    return R.ok().put("page", page);
}
@RequestMapping("/getJcLuggageByType")
public R getJcLuggageByType(){
    List<JcLuggage> list = JcLuggageServiceImpe.getJcLuggageByType("空闲");
    return R.ok().put("mapList",list);
}
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
    JcLuggage JcLuggage = JcLuggageService.getById(id);
    return R.ok().put("JcLuggage", JcLuggage);
}
@RequestMapping("/save")
public R save(@RequestBody JcLuggage jcLuggage){
    jcLuggage.setStu("空闲");
    jcLuggage.setNum(InvertCodeGenerator.getRandomNickname(10));
    jcLuggage.setCreateTime(new Date());
    JcLuggageService.save(jcLuggage);
    return R.ok();
}
@RequestMapping("/update")
public R update(@RequestBody JcLuggage jcLuggage){
    JcLuggageService.updateById(jcLuggage);
    return R.ok();
}
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
    JcLuggageService.removeByIds(Arrays.asList(ids));
    return R.ok();
}

4.5行李出柜管理

4.5.1 出柜管理界面展示

本初设计与入柜基本相同,所展示信息也相同但是取消了增删改查等操作,取而代之的是“取出物品”的按钮。

前端界面如图4.9所示:

图4.9 出柜管理界面

关键代码:

@RestController
@RequestMapping("/sys/JcUserDeposit")
public class JcUserDepositController extends AbstractController {
    @Autowired
    private JcUserDepositService JcUserDepositService;
    @Autowired
    JcLuggageService jcLuggageService;
    @Autowired
    JcLuggageServiceImpl jcLuggageServiceImpl;
    @Autowired
    JcRecordService jcRecordService;
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params){
        PageUtils page = JcUserDepositService.queryPage(params);
        return R.ok().put("page", page);
    }
    @RequestMapping("/Mylist")
    public R Mylist(@RequestParam Map<String, Object> params){
        params.put("userId",String.valueOf(getUserId()));
        PageUtils page = JcUserDepositService.queryPage(params);
        return R.ok().put("page", page);
    }
    @RequestMapping("/MylistTake")
    public R MylistTake(@RequestParam Map<String, Object> params){
        params.put("userId",String.valueOf(getUserId()));
        PageUtils page = JcUserDepositService.queryPage(params);
        return R.ok().put("page", page);
    }
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        JcUserDeposit JcUserDeposit = JcUserDepositService.getById(id);
        return R.ok().put("JcUserDeposit", JcUserDeposit);
    }
    @RequestMapping("/save")
    public R save(@RequestBody JcUserDeposit JcUserDeposit){
        //修改柜子使用状态
        JcLuggage jcLuggage = jcLuggageServiceImpl.getJcLuggageByNum(JcUserDeposit.getLuggageNum());
        jcLuggage.setStu("已使用");
        jcLuggageService.saveOrUpdate(jcLuggage);

        JcUserDeposit.setCreateTime(new Date());
        JcUserDeposit.setUsername(getUser().getUsername());
        JcUserDeposit.setUserId(getUserId().intValue());
        JcUserDeposit.setAdminUser(jcLuggage.getCreateBy());
        JcUserDeposit.setLuggageStu("使用中");
        JcUserDepositService.save(JcUserDeposit);

//        保存操作记录
        JcRecord jcRecord=new JcRecord();
        jcRecord.setUsername(getUser().getUsername());
        jcRecord.setJcTime(new Date());
        jcRecord.setLuggaeTitle(JcUserDeposit.getLuggageTitle());
        DateFormat df2 = DateFormat.getDateTimeInstance();
         String date=df2.format(new Date());
        jcRecord.setInfo("用户【"+getUser().getUsername()+"】于【"+date+"】在"
                +"【"+JcUserDeposit.getLuggageTitle()+"】"
                +"存放了"+"【"+JcUserDeposit.getBz()+"】");
        jcRecordService.save(jcRecord);
        return R.ok();
    }
    @RequestMapping("/update")
    public R update(@RequestBody JcUserDeposit JcUserDeposit){
        JcUserDepositService.updateById(JcUserDeposit);
        return R.ok();
    }
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        JcUserDepositService.removeByIds(Arrays.asList(ids));
        return R.ok();
    }
}

4.5.2 “取出物品”按钮

单击取出物品即可将物品取出,同时保留信息,按钮变为灰色不可再次点击。

前端界面如图4.10所示:

图4.10 取出物品按钮

关键代码:

@RequestMapping("/take")
    public R list(@RequestParam("id") Integer id, @RequestParam("stu") String stu){
        JcUserDeposit  userDeposit= JcUserDepositService.getById(id);
        userDeposit.setLuggageStu("物品已取出");
        JcUserDepositService.saveOrUpdate(userDeposit);
        userDeposit.getLuggageNum();
        JcLuggagejcLuggage = jcLuggageServiceImpl.getJcLuggageByNum(userDeposit.getLuggageNum());
        jcLuggage.setStu("空闲");
        jcLuggageServiceImpl.saveOrUpdate(jcLuggage);
        //保存操作记录
        //保存操作记录
        JcRecord jcRecord=new JcRecord();
        jcRecord.setUsername(getUser().getUsername());
        jcRecord.setJcTime(new Date());
        jcRecord.setLuggaeTitle(userDeposit.getLuggageTitle());
        DateFormat df2 = DateFormat.getDateTimeInstance();
        String date=df2.format(new Date());
        jcRecord.setInfo("用户【"+getUser().getUsername()+"】于【"+date+"】在"
                +"【"+userDeposit.getLuggageTitle()+"】"
                +"取出了"+"【"+userDeposit.getBz()+"】");
        jcRecordService.save(jcRecord);
        return R.ok();
    }

代码首先记录行李柜的信息为“物品已经取出”,然后将行李柜当前状态改为空闲,保存并记录信息:某某用户在什么什么柜子取出了什么什么[11]。

4.6存取记录管理

4.6.1 存取记录界面展示

本页面主要展示了上方取出物品所记录的信息,并附带取出的时间,同时支持,条件查询以及对记录的删除操作。前端界面如图4.11所示

图4.11 存取记录界面

关键代码:

@Autowired
private JcRecordService JcRecordService;
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){
    PageUtils page = JcRecordService.queryPage(params);
    return R.ok().put("page", page);
}
@RequestMapping("/test")
public R test2(){
    List<JcRecord> list = JcRecordService.list();
    return R.ok().put("mapList",list);
}
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
    JcRecord JcRecord = JcRecordService.getById(id);
    return R.ok().put("JcRecord", JcRecord);
}
@RequestMapping("/save")
public R save(@RequestBody JcRecord JcRecord){
    JcRecordService.save(JcRecord);
    return R.ok();
}
@RequestMapping("/update")
public R update(@RequestBody JcRecord JcRecord){
    JcRecordService.updateById(JcRecord);
    return R.ok();
}
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
    JcRecordService.removeByIds(Arrays.asList(ids));
    return R.ok();
}

4.6.2查询记录

在查询输入框内输入要查询的内容,单击查询按钮展示查询结果。

前端界面如图4.12所示[12]:

4.12 条件查询

关键代码:

@Override
public PageUtils queryPage(Map<String, Object> params) {
    String info = (String)params.get("info");
    IPage<JcRecord> page = this.page(
        new Query<JcRecord>().getPage(params),
        new QueryWrapper<JcRecord>()
            .like(StringUtils.isNotBlank(info),"info", info)
    );
    return new PageUtils(page);
}

首先从前端传过来的params中获取索要查询的info信息,然后建立分页,通过mybatis-plus自带的QueryWrapper直接组装,通过.like的方法进行对于信息的模糊查询,进而返回查询结果。

4.7公告信息管理

此处用于展示公告,包含标题、内容、创建时间等基本信息。同包含对公告的增删改查等操作。前端界面如图4.13所示:

4.13 公告信息

关键代码:

@RequestMapping("/list")
public R list(@RequestParam  Map<String, Object> params){
    PageUtils page = informmService.queryPage(params);
    return R.ok().put("page", page);
}
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
    Inform inform = informmService.getById(id);
    return R.ok().put("inform", inform);
}
@RequestMapping("/save")
public R save(@RequestBody Inform inform){
    inform.setCreateTime(new Date());
    informmService.save(inform);
    return R.ok();
}
@RequestMapping("/update")
public R update(@RequestBody Inform inform){
    informmService.updateById(inform);
    return R.ok();
}
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
    informmService.removeByIds(Arrays.asList(ids));
    return R.ok();
}

4.8我的行李存取功能、

4.8.1我的入柜

此页面显示我的所有入柜信息,同时支持条件查询以及新增按钮。前端界面如图4.14所示:

4.14 我的入柜

关键代码:

    //取出物品
    @RequestMapping("/take")
    public R list(@RequestParam("id") Integer id, @RequestParam("stu") String stu){
        JcUserDeposit  userDeposit= JcUserDepositService.getById(id);
        userDeposit.setLuggageStu("物品已取出");
        JcUserDepositService.saveOrUpdate(userDeposit);
        userDeposit.getLuggageNum();
        JcLuggage jcLuggage = jcLuggageServiceImpl.getJcLuggageByNum(userDeposit.getLuggageNum());
        jcLuggage.setStu("空闲");
        jcLuggageServiceImpl.saveOrUpdate(jcLuggage);
//        保存操作记录
        //        保存操作记录
        JcRecord jcRecord=new JcRecord();
        jcRecord.setUsername(getUser().getUsername());
        jcRecord.setJcTime(new Date());
        jcRecord.setLuggaeTitle(userDeposit.getLuggageTitle());
        DateFormat df2 = DateFormat.getDateTimeInstance();
        String date=df2.format(new Date());
        jcRecord.setInfo("用户【"+getUser().getUsername()+"】于【"+date+"】在"
                +"【"+userDeposit.getLuggageTitle()+"】"
                +"取出了"+"【"+userDeposit.getBz()+"】");
        jcRecordService.save(jcRecord);

        return R.ok();
    }

    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params){
        PageUtils page = JcUserDepositService.queryPage(params);
        return R.ok().put("page", page);
    }

    @RequestMapping("/Mylist")
    public R Mylist(@RequestParam Map<String, Object> params){
        params.put("userId",String.valueOf(getUserId()));
        PageUtils page = JcUserDepositService.queryPage(params);
        return R.ok().put("page", page);
    }

4.8.2我的出柜

同前面出柜管理相似,包含查询以及“取出物品按钮”,前端界面如图4.15所示:

4.15 我的出柜

关键代码:

 @RequestMapping("/MylistTake")
    public R MylistTake(@RequestParam Map<String, Object> params){
        params.put("userId",String.valueOf(getUserId()));
        PageUtils page = JcUserDepositService.queryPage(params);
        return R.ok().put("page", page);
    }

    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        JcUserDeposit JcUserDeposit = JcUserDepositService.getById(id);
        return R.ok().put("JcUserDeposit", JcUserDeposit);
    }
    @RequestMapping("/save")
    public R save(@RequestBody JcUserDeposit JcUserDeposit){
        //修改柜子使用状态
        JcLuggage jcLuggage = jcLuggageServiceImpl.getJcLuggageByNum(JcUserDeposit.getLuggageNum());
        jcLuggage.setStu("已使用");
        jcLuggageService.saveOrUpdate(jcLuggage);

        JcUserDeposit.setCreateTime(new Date());
        JcUserDeposit.setUsername(getUser().getUsername());
        JcUserDeposit.setUserId(getUserId().intValue());
        JcUserDeposit.setAdminUser(jcLuggage.getCreateBy());
        JcUserDeposit.setLuggageStu("使用中");
        JcUserDepositService.save(JcUserDeposit);

//        保存操作记录
        JcRecord jcRecord=new JcRecord();
        jcRecord.setUsername(getUser().getUsername());
        jcRecord.setJcTime(new Date());
        jcRecord.setLuggaeTitle(JcUserDeposit.getLuggageTitle());
        DateFormat df2 = DateFormat.getDateTimeInstance();
         String date=df2.format(new Date());
        jcRecord.setInfo("用户【"+getUser().getUsername()+"】于【"+date+"】在"
                +"【"+JcUserDeposit.getLuggageTitle()+"】"
                +"存放了"+"【"+JcUserDeposit.getBz()+"】");
        jcRecordService.save(jcRecord);
        return R.ok();
    }
    @RequestMapping("/update")
    public R update(@RequestBody JcUserDeposit JcUserDeposit){
        JcUserDepositService.updateById(JcUserDeposit);
        return R.ok();
    }
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        JcUserDepositService.removeByIds(Arrays.asList(ids));
        return R.ok();
    }

4.9系统设置

本模块为对整个系统的管理包含用户管理、部门管理、角色管理、菜单管理等功能,其功能为本框架自带,此处就不一一赘述,前端界面如图4.16所示:

4.16 系统设置

关键代码:

/**
 * 角色列表
 */
@RequestMapping("/list")
@RequiresPermissions("sys:role:list")
public R list(@RequestParam Map<String, Object> params){
    PageUtils page = sysRoleService.queryPage(params);

    return R.ok().put("page", page);
}
/**
 * 角色列表
 */
@RequestMapping("/select")
@RequiresPermissions("sys:role:select")
public R select(){
    List<SysRoleEntity> list = sysRoleService.list();
    
    return R.ok().put("list", list);
}
/**
 * 角色信息
 */
@RequestMapping("/info/{roleId}")
@RequiresPermissions("sys:role:info")
public R info(@PathVariable("roleId") Long roleId){
    SysRoleEntity role = sysRoleService.getById(roleId);
    
    //查询角色对应的菜单
    List<Long> menuIdList = sysRoleMenuService.queryMenuIdList(roleId);
    role.setMenuIdList(menuIdList);

    //查询角色对应的部门
    List<Long> deptIdList = sysRoleDeptService.queryDeptIdList(new Long[]{roleId});
    role.setDeptIdList(deptIdList);
    
    return R.ok().put("role", role);
}
/**
 * 保存角色
 */
@SysLog("保存角色")
@RequestMapping("/save")
@RequiresPermissions("sys:role:save")
public R save(@RequestBody SysRoleEntity role){
    ValidatorUtils.validateEntity(role);
    
    sysRoleService.saveRole(role);
    
    return R.ok();
}
/**
 * 修改角色
 */
@SysLog("修改角色")
@RequestMapping("/update")
@RequiresPermissions("sys:role:update")
public R update(@RequestBody SysRoleEntity role){
    ValidatorUtils.validateEntity(role);
    
    sysRoleService.update(role);
    
    return R.ok();
}
/**
 * 删除角色
 */
@SysLog("删除角色")
@RequestMapping("/delete")
@RequiresPermissions("sys:role:delete")
public R delete(@RequestBody Long[] roleIds){
    sysRoleService.deleteBatch(roleIds);
    
    return R.ok();
}

5测试

5.1测试的意义

对系统进行测试是软件开发过程中的一个关键步骤,它确保了软件质量和可靠性,降低了在生产环境中出现故障的风险。以下是进行系统测试的主要意义:

发现和修复缺陷:测试可以揭露软件中的错误或缺陷,使开发团队能够在产品发布前对其进行修复,减少客户遇到问题的可能性[13]。

验证功能需求:通过测试来验证软件是否符合业务需求。确保所有功能按预定目标正确无误地工作,满足用户和市场的需求。

保证软件质量:系统测试有助于评估软件的整体质量,包括其性能、安全性、可用性、兼容性等多个方面。

减少维护成本:早期发现并修复缺陷可以大幅降低长期的维护成本。相较于产品发布后修复,早期解决问题通常更简单、成本更低。

提高用户信心:软件经过彻底的测试,用户可以对产品的稳定性和性能有更多信心,这有助于建立品牌声誉和客户忠诚度。

满足法规要求:某些软件产品可能需要符合特定的行业标准或法律法规。通过系统测试可以确保软件符合这些必要的合规性要求。

评估性能和负载能力:测试能够评估软件在高负载和高压力情况下的表现,保证软件在实际运行环境中能够稳定工作。

测试结果:所有接口以及单元功能均可以正常输出结果[4]。

5.2功能测试

功能测试如表6.1所示:

6.1 功能测试

功能模块

输入

实际输出

期望输出

1

用户登录

用户名: "testUser", 密码: "123456"

登录成功,用户角色:"普通用户"

登录成功,用户角色:"普通用户"

2

用户信息管理

新用户信息输入

新用户添加成功

新用户添加成功

3

角色信息管理

创建新角色:角色名:"管理员",权限:"ALL_ACCESS"

角色创建成功

角色创建成功

4

部门信息管理

新部门信息输入

部门添加成功

部门添加成功

5

行李寄存柜管理

寄存柜编号:"A1", 状态:"空闲"

寄存柜状态更新为:"空闲"

寄存柜状态更新为:"空闲"

6

用户行李寄存管理

用户ID:"U1001",寄存请求

行李寄存成功,寄存柜:"A1"

行李寄存成功,寄存柜:"A1"

7

寄存记录查询

查询用户ID:"U1001"的寄存记录

显示用户ID:"U1001"的所有寄存记录

显示用户ID:"U1001"的所有寄存记录

8

通知公告

发布公告:内容:"系统将于周末进行维护"

公告发布成功

公告发布成功

9

修改密码和退出注销

用户名:"testUser",旧密码:"123456",新密码:"654321"

密码修改成功,用户注销

密码修改成功,用户注销

6总结与展望

6.1总结

本项目成功地设计并实现了一个基于Spring Boot框架的行李寄存管理系统。在项目的研究与开发过程中,我们深入分析了当前行李寄存服务面临的挑战,并针对这些问题提出了创新的技术解决方案。通过采用现代化的信息技术,我们开发了一个高效、安全、用户友好的在线行李寄存服务平台,极大地提升了行李寄存服务的便捷性和安全性。

研究成果主要体现在以下几个方面:

系统设计与实现:我们基于Spring Boot框架,成功构建了一个稳定、可扩展的后端服务。前端界面采用HTML5、CSS3和JavaScript等技术,实现了直观友好的用户交互体验。

功能模块开发:项目实现了包括用户信息管理、角色权限管理、行李寄存柜管理、行李寄存操作、寄存记录查询、通知公告发布等核心功能模块,满足了不同用户群体的需求。

安全性与稳定性:通过引入加密存储、输入验证等安全措施,系统在保护用户数据和交易安全方面表现出色,增强了用户对平台的信任。

性能优化:系统经过全面的测试,包括功能测试、性能测试和安全性测试,确保了在各种条件下的稳定运行和良好性能。

用户体验提升:系统的易用性和便捷性得到了用户的认可,显著提高了行李寄存服务的效率和用户满意度。

技术创新:项目的实施推动了信息技术在传统服务行业的应用创新,为行李寄存服务领域提供了新的解决思路和技术参考。

6.2展望

展望未来,本行李寄存管理系统有多方面的提升和发展空间。随着技术的不断进步和用户需求的不断演变,系统需要不断迭代更新以保持其竞争力和实用性。

在技术层面,可以考虑采用微服务架构来替代目前的单体架构,这将使系统更加模块化,便于维护和扩展。同时,微服务架构有利于实现更高效的负载均衡和更好的服务可用性。随着人工智能技术的成熟,系统可以整合机器学习算法来优化行李寄存柜的分配策略,提升资源利用率。

从功能扩展的角度,系统未来可以加入更多的用户个性化功能,例如基于用户历史行为的寄存推荐、行李追踪服务、以及与本地交通或旅游服务的整合,为用户提供更加便捷的旅行体验。随着移动设备的普及,开发一个配套的移动应用将极大提升用户的便利性,使得用户可以随时随地管理自己的行李寄存需求。

安全方面,系统将继续强化数据保护和隐私安全措施。随着国家和地区对数据保护法规的更新,系统需要确保其合规性,并采取最新的加密技术来保护用户数据。另外,采用基于区块链的技术来增强交易记录的不可篡改性和透明度,也是未来可探索的方向。

参考文献

[1]计文柯.Spring技术内幕:深入解析Spring架构与设计原理[M].机械工业出版社,2012年.

[2]王奕玮,李卉妍.共享经济背景下智能行李寄存桩发展探析[J].财讯, 2020年.

[3]田中裕纪,三轮悟士,下田美由纪,等.行李寄存系统.2024年

[4]辻本和史,矶村琢也,大井崇资.行李寄存机.2024年

[5]王慧,梁明玉.放下吧——互联网+行李寄存新模式探讨[J].现代营销:经营版, 2019(6):1.DOI:CNKI:SUN:XIXJ.0.2019-06-069.

[6]吴雅刘倩雯朱艳燕.智能化行李寄存与配送服务的探索——以厦门市为例[J].移动信息, 2022(8):0181-0183.

[7]王克俭.自助行李寄存处:CN 201220590690[P][2024-03-28].

[8]李文博.智能行李寄存系统[J].电子产品世界:10.3969.1005-5517.2019.1.012.

[9]田丹,吴晓艳.自动计费寄存系统的设计与实现[J].民营科技, 2016(7):1.DOI:10.3969/j.issn.1673-4033.2016.07.055.

[10]李伟强,王东,宁政通,等.一种基于Java的仓库管理系统及方法[P].CN111507669A[2024-03-28].

[11]唐芳芳.基于Java的仓库管理系统的设计与实现[J].数码世界, 2020(1):1.

[12]吴科璋.一种快捷布署的寄存管理系统终端设备[P][2024-03-28].

[13]王军辉.居民寄存管理系统:CN107665547A[2024-03-28].

[14]阮祥发.寄存处管理及控制系统的研究[C]//中国计算机学会.中国计算机学会, 1998.

[15]潘杨凡.24 小时宠物寄存管理系统的设计与实现[J].  2016.

关注vx扫码免费获取源码+文档:

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值