springboot易物二手交易平台-计算机毕业设计源码30037

摘 要

随着经济的发展和人们生活水平的提高,二手交易市场越来越繁荣。然而,传统的二手交易方式存在一些问题,比如信息传播不便、交易麻烦、信用问题等。因此,设计与实现一个易物二手交易平台来解决这些问题就变得尤为,该平台为用户提供了一个便捷的渠道,让他们可以买卖各种二手商品,并在线支付。

本文通过市场调研,根据实际要求决定采用Java开发语言,通过Springboot+jsp框架,并结合MySQL数据库进行数据存储和管理来设计与实现易物二手交易平台的各项功能,并具有操作简单,界面友好,数据安全,功能多样的特点,主要分析了用户需求和二手市场趋势,设计了一个便捷高效的易物二手交易平台,提供了一个获取二手商品信息和交易二手商品的渠道和管理工具,能够实现快速的二手交易和管理功能。系统运行实现了包括但不限于公共管理、用户管理、资讯管理、商城管理(二手商城、分类列表、订单列表、订单配送)等二手交易功能。

本系统经过功能测试,实现了检测完毕包括但不限于用户登录、用户注册、管新闻资讯添加、二手商城添加等测试,为系统的后期推广运营提供了强力的技术支撑。在对以上功能得测试过程中,发现了系统中的很多漏送并进行了完善,经过多人在线进行测试,系统完全可以正常运行,确保能够为易物二手交易平台在后期推广运营中提供了可靠的技术支持,为用户提供良好的使用体验,并为系统的发展打下了坚实的基础。

关键词:Java开发技术 Springboot+jsp框架  MySQL数据库 易物二手交易平台

ABSTRACT

With the development of the economy and the improvement of people's living standards, the second-hand trading market is becoming increasingly prosperous. However, traditional second-hand trading methods have some problems, such as inconvenient information dissemination, transaction difficulties, and credit issues. Therefore, designing and implementing a second-hand barter trading platform to solve these problems has become particularly important. The platform provides users with a convenient channel to buy and sell various second-hand goods and make online payments.

This article conducts market research and decides to use Java development language based on actual requirements. It uses the Springboot+JSP framework and combines MySQL database for data storage and management to design and implement various functions of the second-hand trading platform for barters. It has the characteristics of simple operation, user-friendly interface, data security, and diverse functions. The main analysis focuses on user needs and second-hand market trends, and designs a convenient and efficient second-hand trading platform for barters. It provides a channel and management tool for obtaining second-hand product information and trading second-hand products, which can achieve fast second-hand trading and management functions. The system has implemented second-hand transaction functions, including but not limited to public management, user management, information management, and mall management (second-hand mall, classification list, order list, order delivery).

This system has undergone functional testing and has achieved testing including but not limited to user login, user registration, news and information management, and second-hand mall addition, providing strong technical support for the later promotion and operation of the system. During the testing process of the above functions, many omissions in the system were discovered and improved. After online testing by multiple people, the system can operate normally, ensuring reliable technical support for the promotion and operation of the second-hand trading platform in the later stage, providing users with a good user experience, and laying a solid foundation for the development of the system.

Key words: Java development technology  Springboot+JSP framework  MySQL database barter    second-hand trading platform
目  录

第一章 绪论

1.1项目背景

1.2项目意义

1.3国内外研究现状

1.4开发工具介绍

1.4.1Springboot框架

1.4.2jsp技术

1.4.3MySQL数据库

第二章  需求分析

2.1系统概述

2.2系统功能需求

2.3系统性能需求

2.4可行性分析

2.5开发环境

第三章  总体设计

3.1系统总体设计

3.2功能模块设计

3.3数据库设计

第四章  详细设计及实现

4.1前台界面设计与实现

4.2后台功能设计与实现

4.3数据库连接

第五章  系统测试

5.1测试任务及目的

5.2测试计划

5.3测试用例

5.4测试结论

结  论

谢  辞

参考文献

附  录

第一章 绪论

1.1项目背景

随着经济的发展和人们生活水平的提高,二手交易市场越来越繁荣,人们的二手交易需求日益增长。然而,传统的二手交易方式存在一些问题,比如信息传播不便、交易麻烦、信用问题等。因此,设计与实现一个易物二手交易平台来解决这些问题就变得尤为,该平台为用户提供了一个便捷的渠道,让他们可以买卖各种二手商品,并在线支付。

本文通过市场调研,根据实际要求决定采用Java开发语言,通过Springboot+jsp框架,并结合MySQL数据库进行数据存储和管理来设计与实现易物二手交易平台的各项功能,并具有操作简单,界面友好,数据安全,功能多样的特点,主要分析了用户需求和二手市场趋势,设计了一个便捷高效的易物二手交易平台,提供了一个获取二手商品信息和交易二手商品的渠道和管理工具,能够实现快速的二手交易和管理功能。系统运行实现了包括但不限于公共管理、用户管理、资讯管理、商城管理(二手商城、分类列表、订单列表、订单配送)等二手交易功能。

1.2项目意义

易物二手交易平台的设计与实现对于促进二手商品的流通有着重要的意义。开发易物二手交易平台可以帮助用户轻松找到需要的二手商品,也可以帮助用户把自己不需要的商品转换成金钱。通过该平台,用户可以方便地搜索和浏览二手商品信息;用户还可获取到最新的二手商品资源和资讯信息,并可对信息进行评论,增加平台的活跃度,提高用户交互和交流。同时,平台会为用户提供安全可靠的交易环境,从而减少交易风险,有助于提升交易效率和用户体验。易物二手交易平台的商城管理功能可以让卖家更好地发布和管理自己的二手商品和订单信息,并实现信息的快速传播,提高二手交易的效率和交易成功的机率。让管理员方便快捷的管理二手交易信息,提高管理效率和服务水平。总而言之,易物二手交易平台的设计与实现有助于提升二手交易的效率和用户体验,解决传统交易方式存在的问题,并为用户提供更加便捷、安全的二手交易渠道和工具。

1.3国内外研究现状

当前,国内外的二手交易平台呈现出蓬勃发展的态势,已经存在许多知名的二手交易平台。国外知名的二手交易平台如eBay、Craigslist、Gumtree等已经成为用户二手交易的首选平台,提供了各种商品种类的交易服务。在国内,像闲鱼、转转、美团闲鱼等二手交易平台也逐渐获得了用户认可,成为了用户处理闲置物品的重要渠道,这些平台在用户体验、功能设计、交易安全等方面都有着丰富的经验。国内外的研究也在不断探索如何提高二手交易平台的用户参与度和交易效率,通过引入智能推荐、评价体系等功能来优化用户体验。因此,在设计与实现易物二手交易平台时,可以参考国内外二手交易平台的成功经验,并结合Springboot+jsp框架特点,打造一个更加完善的易物二手交易平台。

1.4开发工具介绍

1.4.1Springboot框架

Spring Boot框架是建立在Spring框架之上的快速开发框架,其核心设计理念是约定大于配置,旨在简化Spring应用程序的搭建和开发过程。相较于传统的Spring框架,Spring Boot具有诸多优势。首先,它集成了内嵌的Servlet容器(如Tomcat、Jetty),使得应用程序可以打包成可执行的JAR文件,方便部署和运行,无需额外配置独立的应用服务器。其次,Spring Boot通过自动配置的方式,根据项目中的依赖自动配置应用程序,减少了繁琐的手动配置工作,提高了开发效率。此外,Spring Boot提供了丰富的监控和管理功能,包括健康检查、性能监控、远程调试等,方便开发人员对应用程序进行管理和监控,保证应用的稳定性和可靠性。另外,Spring Boot支持集成测试,开发人员可以快速编写和运行集成测试,确保应用程序的质量和稳定性。此外,Spring Boot拥有庞大的生态系统,提供了大量的插件和扩展,支持与各种第三方库和框架的集成,为开发人员提供了丰富的功能和工具。同时,Spring Boot适用于构建微服务架构,支持RESTful风格的API开发,提供了丰富的功能和工具,方便构建和管理微服务应用。总的来说,Spring Boot框架的简化配置、内嵌容器、自动配置、监控管理、集成测试、丰富生态和微服务支持等特性,使其成为广泛应用于企业级应用开发和微服务架构的首选框架之一。其活跃的社区和丰富的支持资源,为开发人员提供了强大的工具和支持,推动着软件开发领域的不断进步和创新。

1.4.2jsp技术

JSP(JavaServer Pages)是一种用于开发动态Web页面的Java技术,允许开发人员在HTML页面中嵌入Java代码,通过JSP引擎在服务器端动态生成网页内容。JSP技术简化了Web开发过程,使开发人员能够利用熟悉的Java知识编写动态页面,实现个性化和交互性。通过在JSP页面中嵌入Java代码,可以动态生成页面内容,包括数据库查询、业务逻辑处理等。JSP页面与Java代码逻辑分离,使页面设计和业务逻辑清晰分离,便于维护和管理。此外,JSP支持标签库功能,开发人员可以将常用功能封装成标签,提高代码的重用性和可维护性。总的来说,JSP技术为Web开发提供了一种灵活、高效的方式,使得动态Web页面的开发变得更加简单和便捷。

1.4.3MySQL数据库

MySQL数据库是一种开源的关系型数据库管理系统,由瑞典MySQL AB公司开发,后被Sun Microsystems收购,现隶属于Oracle公司。MySQL以其稳定性、高性能和开源特性而闻名。作为一种关系型数据库管理系统,MySQL采用SQL语言进行数据操作,支持多种操作系统,包括Windows、Linux和macOS。MySQL具有跨平台性,能够在不同操作系统上运行,为用户提供了灵活的选择。MySQL还支持多种存储引擎,如InnoDB、MyISAM等,用户可以根据需求选择合适的存储引擎。此外,MySQL提供了丰富的功能,如事务处理、索引、视图等,满足了各种复杂的数据处理需求。MySQL的安全性和性能优势使其成为许多企业和开发人员的首选数据库管理系统。总的来说,MySQL数据库以其稳定性、高性能、开源特性和丰富的功能而成为广泛应用于各种应用场景的数据库管理系统。


第二章  需求分析

2.1系统概述

本易物二手交易平台首先根据使用该网站的用户的角色的不同分为:注册用户,卖家用户,管理员。

本网上易物二手交易平台根据用户需求主要分为三个模块:注册用户,卖家用户,管理员。

其中注册用户模块主要实现注册用户的注册登录,能够查看首页、公告信息、新闻资讯,可以搜索和浏览二手商城,进行购买和支付商品,并对商城管理中的个人首页、订单配送、收藏等功能进行管理。

注册用户角色的用例展示如图2-1所示。

图2-1  注册用户角色用例图

卖家用户模块主要实现用户的注册登录,卖家用户的注册信息需经过管理员审核才可进行登录,能够对商城管理(二手商城、订单列表、订单配送)、个人信息、修改密码,并可查看商品销售金额统计、商品销售数量统计等数据分析图表等功能进行管理。

注册用户角色的用例展示如图2-2所示。

图2-2 卖家用户角色用例图

管理员模块主要负责公共管理、用户管理、资讯管理、商城管理(二手商城、分类列表、订单列表、订单配送)等系统信息管理,包括可进行增删等操作,能够查看主页的商品销售金额统计、商品销售数量统计等数据分析图表,并可以修改个人信息和修改密码。

管理员角色的用例展示如图2-3所示。

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

2.2系统功能需求

根据易物二手交易平台功能需求分析,主要划分为了注册用户模块和管理员模块这两大部分,以上模块又细分小功能模块。具体如下:

注册用户模块:

  1. 注册登录:游客可以通过注册成为系统用户,使用账号密码可进行登录,使用系统功能。
  2. 首页:注册用户登录系统,首先进入首页,可查看轮播图和系统其他功能。
  3. 公告信息:注册用户点击“公告信息”可查看包括关于我们、联系方式、网站介绍等管理员发布的所有公告信息,点击可查看详情。
  4. 新闻资讯:注册用户点击“新闻资讯”可查看管理员发布的所有新闻资讯信息,支持局部搜索和下拉(筛选、排序)搜索,热门文章推荐,点击可查看详情,进行点赞、收藏和评论。
  5. 二手商城:注册用户点击“新闻资讯”可查看管理员发布的所有二手商城,支持局部搜索和下拉(筛选、排序)搜索,热门商品推荐,点击可查看详情,进行收藏=,并可点击立即购买(订单备注、支付)和加入购物车操作。
  6. 商城管理:注册用户点击“商城管理”可进行我的购物车、我的订单、我的地址等操作。点击“我的购物车”,可查看所有加入购物的二手商城,点击可查看详情,并可进行删除和购买(订单备注、支付)操作;点击“我的订单”点击,可查看所有订单信息,可进行增改删查,支持下拉(订单状态、排序)搜索,点击可查看详情;点击“我的地址”,可查看所有收货地址信息,可进行新建收货地址(收货人、手机号、详细地址)操作,并可对地址进行设为默认、删除、编辑操作。
  7. 我的账户:注册用户点击“我的账户”,可对个人资料进行管理,包括修改密码和修改资料(头像、昵称、邮箱、用户姓名、用户性别)。
  8. 个人中心:注册用户点击“个人中心”可对个人首页、订单配送、收藏等信息进行管控。点击“订单配送”,可查看订单配送信息,进行查询操作,支持配送状态、签收状态搜索,可点击详情进行查看,和进行签收操作;点击“收藏”,可管理所有收藏信息,包括新闻资讯、二手商城等,进行查看和删除操作。可点击详情进行查看。

卖家用户模块:

  1. 注册登录:可以通过注册成为卖家用户,注册信息需经过管理员审核通过,才可使用账号密码可进行登录,使用系统功能,并可对个人信息和密码进行管理。
  2. 主页:卖家用户可在主页查看商品销售金额统计、商品销售数量统计等信息数据分析图。
  3. 商城管理:卖家用户点击“商城管理”可对二手商城、订单列表、订单配送等信息进行管理。点击“二手商城”,可查看自己的二手商城信息,进行增删改查操作,支持标题、分类搜索,可点击详情进行查看(封面图、主图、标题、描述、原价、卖价、库存、分类、卖家用户、商品名称、商品规格、正文)和查看评论;点击“订单列表”,可查看自己的订单信息,进行查询和和删除操作,支持订单号、商品名称、联系人姓名、状态搜索,可点击详情(联系人姓名、联系人手机、收货地址、描述、待付款、买家、订单备注)进行查看,和点击配送操作,修改配送状态;点击“订单配送”,可查看自己的订单配送信息,进行查询操作,支持商品名称、配送状态、签收状态搜索,可点击详情进行查看(订单号、商品名称、购买数量、交易总额、发货日期、配送单号、买家、收货地址、配送状态、签收状态),修改签收状态。

管理员模块:

  1. 登录:管理员账号密码由系统生成,可使用账号密码可进行登录,使用系统功能,并可对个人信息和密码进行管理。
  2. 主页:管理员可在主页查看商品销售金额统计、商品销售数量统计等信息数据分析图表。
  3. 公共管理:管理员点击“公共管理”可对首页的轮播图和通知公告进行管理,进行增删改查操作,支持标题搜索,可点击查看详情。
  4. 用户管理:管理员点击“用户管理”可对注册用户、卖家用户和管理员进行管控,包括进行增删改查操作,点击可查看详情,卖家用户注册信息需经过管理员审核才可登录。
  5. 资讯管理:管理员点击“资讯管理”可对新闻资讯和分类列表进行管理,进行增删改查操作,新闻资讯支持标题、标签、分类搜索,可点击查看详情(封面图、标题、分类、标签、描述、正文)和查看评论;分类列表支持频道名称搜索,可点击查看详情。
  6. 商城管理:管理员点击“商城管理”可对二手商城、分类列表、订单列表、订单配送等信息进行管理。点击“二手商城”,可查看所有二手商城信息,进行增删改查操作,支持标题、分类搜索,可点击详情进行查看和查看评论;点击“分类列表”,可查看所有分类信息,进行增删改查操作,支持分类搜索,可点击详情进行查看;点击“订单列表”,可查看所有订单信息,进行查询和删除操作,支持订单号、商品名称、联系人姓名、状态搜索,可点击详情进行查看,和点击进行配送操作;点击“订单配送”,可查看所有订单配送信息,进行查询和删除操作,支持配送状态、签收状态搜索,可点击详情进行查看(订单号、商品名称、购买数量、交易总额、发货日期、配送单号、联系人、买家、收货地址、配送状态、签收状态),可点击签收,修改签收状态。

2.3系统性能需求

易物二手交易平台的性能需求比如易物二手交易平台的安全性怎么样,可靠性怎么样,性能怎么样,可扩展性怎么样等。具体可以表示在如下2-1表格中:

2-1 易物二手交易平台非功能需求表

非功能需求

描述

性能

系统应具有高性能,能够快速响应用户请求,保证交易流畅进行。

可靠性

系统应具有高可靠性,保证交易数据的安全性和完整性,避免数据丢失或损坏。

安全性

系统应具有高安全性,包括用户数据加密、防止SQL注入攻击、防止恶意软件攻击等,保护用户隐私和交易安全。

可用性

系统应具有高可用性,保证24/7在线服务,最大程度减少系统维护和故障时间。

易用性

系统应具有良好的用户界面设计,简洁明了的操作流程,方便用户快速上手和操作。

可扩展性

系统应具有良好的可扩展性,能够方便地扩展新功能和服务,满足不断增长的用户需求。

灵活性

系统应具有灵活性,能够适应不同用户群体和交易场景的需求,提供个性化定制服务。

性能调优

系统应支持性能调优功能,能够根据用户量和交易量动态调整系统性能,保证系统稳定运行。

数据备份与恢复

系统应具有数据备份和恢复功能,定期备份交易数据,确保数据安全和可靠性。

多语言支持

系统应支持多语言功能,能够提供多语言界面和交易服务,满足不同地区用户的需求。

跨平台兼容

系统应具有跨平台兼容性,能够在不同操作系统和设备上运行,提供更广泛的服务范围。

2.4可行性分析

2.4.1技术可行性

易物二手交易平台的设计与实现是一个二手信息共享和二手交易的平台,实现这个系统所采用的技术方案是基于Java实现方案,系统采用Spring、SpringMvc、Mybatis方案,结合MySQL数据库,基于非常成熟的Springboot+jsp框架来实现的。随意对于所使用的计算机没有什么硬性的要求,计算机只要可以正常的使用进行代码的编写及页面设计就可行。同时,易物二手交易平台的开发环境和配置都是可以自行安装,本系统实现功能的操作很简单,普通电脑的常见配置就可以运行本软件,并且只要粗通电脑使用的基本常识就可以流畅的使用本软件。电脑具备连接互联网的能力,并且可以正常访问系统,并不需要操作者有什么高超的能力,只需了解业务流程,并且按照专业知识进行正确操作即可。因此,在技术层面是可行的。

2.4.2运行可行性

本系统实现功能的操作很简单,普通电脑的常见配置就可以运行本软件,并且只要粗通电脑使用的基本常识就可以流畅的使用本软件。电脑具备连接互联网的能力,并且可以正常访问系统,并不需要操作者有什么高超的能力,只需了解业务流程,并且按照专业知识进行正确操作即可。因此,在运行层面是可行的。

2.5开发环境

为了更好的实现系统功能,本系统的开发语言为Java语言,开发平台开放源码Eclipse,使用Springboot+JSP框架设计与实现,配合体积小,成本低,速度快的MySQL数据库设计与实现易物二手交易平台,使得系统运行更具有稳定性和安全性,并且具有界面友好和操作简单的特点,从而完成实现系统的开发。


第三章  总体设计

3.1系统总体设计

本系统采用模块化的方式进行网站结构设计,主要模块有注册用户模块,卖家用户模块,管理员模块,通过正确地处理模块之间的内部联系、调用关系和数据关系以实现整个系统的功能。

游客在未注册时可以浏览系统信息,登录后才可以使用其他组系统功能,注册用户模块主要实现注册用户的注册登录,能够查看首页、公告信息、新闻资讯,可以搜索和浏览二手商城,进行购买和支付商品,并对商城管理中的个人首页、订单配送、收藏等功能进行管理。

卖家用户模块主要实现用户的注册登录,卖家用户的注册信息需经过管理员审核才可进行登录,能够对商城管理(二手商城、订单列表、订单配送)、个人信息、修改密码,并可查看商品销售金额统计、商品销售数量统计等数据分析图表等功能进行管理。

管理员模块主要负责公共管理、用户管理、资讯管理、商城管理(二手商城、分类列表、订单列表、订单配送)等系统信息管理,包括可进行增删等操作,能够查看主页的商品销售金额统计、商品销售数量统计等数据分析图表,并可以修改个人信息和修改密码。

3.2功能模块设计

3.2.1注册用户模块设计

在上一章节中主要对系统的功能性需求和非功能性需求进行分析,并且根据需求分析了易物二手交易平台中的用例。那么接下来就要开始对易物二手交易平台的架构、主要功能和数据库开始进行设计。易物二手交易平台根据前面章节的需求分析得出,其总体设计模块图如图3-1所示。

图3-1  系统功能模块图

3.3数据库设计

数据库设计一般包括需求分析、概念模型设计、数据库表建立三大过程,其中需求分析前面章节已经阐述,概念模型设计有概念模型和逻辑结构设计两部分。根据前面的数据流程图,结合系统的功能模块设计,设计出符合系统的各信息实体,主要包括公共管理、用户管理、资讯管理、商城管理(二手商城、分类列表、订单列表、订单配送)等。具体的数据库E-R图如图3-3所示。

图3-3 数据库总体E-R图

通过上一小节中易物二手交易平台中总E-R关系图上得出一共需要创建很多个数据表。在此我主要罗列几个主要的数据库表结构设计。

(1)注册用户表

注册用户用户表含有注册用户ID、用户姓名、用户年龄、用户性别、审核状态、用户ID、创建时间、更新时间等属性。如表3-1所示。

表3-1  注册用户表结构表(registered_users)

字段

类型

主键

外键

注释

registered_users_id

int

注册用户ID

user_name

varchar

用户姓名

user_age

varchar

用户年龄

user_gender

varchar

用户性别

examine_state

varchar

审核状态

user_id

int

用户ID

create_time

datetime

创建时间

update_time

timestamp

更新时间

(2)卖家用户表

卖家用户表含有注册卖家用户ID、卖家名称、联系方式、身份证号、审核状态、用户ID、创建时间、更新时间等属性。如表3-2所示。

表3-2 卖家用户表结构表(seller_customers )

字段

类型

主键

外键

注释

seller_customers_id

int

卖家用户ID

seller_name

varchar

卖家名称

contact_information

varchar

联系方式

id_number

varchar

身份证号

examine_state

varchar

审核状态

user_id

int

用户ID

create_time

datetime

创建时间

update_time

timestamp

更新时间

(3)商品信息表

商品信息表含产品id、标题、封面图、描述、原价、卖价、销量、商品库存、商品分类、点击量、正文、主图1、主图2、主图3、主图4、主图5、创建时间、更新时间、自定义字段、来源表、来源字段、来源ID、添加人等属性。如表3-3所示。

表3-3 商品信息表结构表(flight_information)

字段

类型

主键

外键

注释

goods_id

mediumint

产品id:[0,8388607]

title

varchar

标题:[0,125]用于产品和html的<title>标签中

img

text

封面图:用于显示于产品列表页

description

varchar

描述:[0,255]用于产品规格描述

price_ago

double

原价:[1]

price

double

卖价:[1]

sales

int

销量:[0,1000000000]

inventory

int

商品库存

type

varchar

商品分类:

续表

字段

类型

主键

外键

注释

hits

int

10

点击量:[0,1000000000]访问这篇产品的人次

content

longtext

2147483647

正文:产品的主体内容

img_1

text

65535

主图1:

img_2

text

65535

主图2:

img_3

text

65535

主图3:

img_4

text

65535

主图4:

img_5

text

65535

主图5:

create_time

timestamp

19

创建时间:

update_time

timestamp

19

更新时间:

customize_field

text

65535

自定义字段

source_table

varchar

255

来源表:

source_field

varchar

255

来源字段:

source_id

int

10

来源ID:

user_id

int

10

添加人

(4)二手商城表

二手商城表含有二手商城ID、卖家用户、卖家名称、商品规格、点击数、点赞数、标题、封面图、描述、原价、卖价、商品库存、商品分类、正文、主图1、主图2、主图3、主图4、主图5、创建时间、更新时间等属性。如表3-4所示。

表3-4  二手商城表结构表(attraction_information)

字段

类型

主键

外键

注释

second_hand_shopping_mall_id

int

二手商城ID

seller_customers

int

卖家用户

seller_name

varchar

卖家名称

product_specifications

varchar

商品规格

hits

int

点击数

praise_len

int

点赞数

cart_title

varchar

标题:[0,125]用于产品html的标签中

续表

字段

类型

主键

外键

注释

cart_img

text

封面图:用于显示于产品列表页

cart_description

varchar

描述:[0,255]用于产品规格描述

cart_price_ago

double

原价:[1]

cart_price

double

卖价:[1]

cart_inventory

int

商品库存

cart_type

varchar

商品分类:

cart_content

longtext

正文:产品的主体内容

cart_img_1

text

主图1:

cart_img_2

text

主图2:

cart_img_3

text

主图3:

cart_img_4

text

主图4:

cart_img_5

text

主图5:

create_time

datetime

创建时间

update_time

timestamp

更新时间

(5)订单表

订单表含有订单ID、订单号、商品id、商品标题、商品图片、价格、原价、数量、总价、规格、商品分类、联系人姓名、联系人邮箱、联系人手机、收件地址、邮政编码、买家ID、商家ID、创建时间、更新时间、描述、订单状态、订单备注、发货状态等属性。如表3-5所示。

表3-5 订单表表结构表(hotel_information)

字段

类型

主键

外键

注释

order_id

int

订单ID:

order_number

varchar

订单号:

goods_id

varchar

商品id:[0,8388607]

title

varchar

商品标题:

img

int

商品图片:

price

varchar

价格:

price_ago

varchar

原价:

num

datetime

数量:

price_count

datetime

总价:

norms

varchar

规格:

续表

字段

类型

主键

外键

注释

type

text

商品分类:

contact_name

int

联系人姓名:

contact_email

int

联系人邮箱:

contact_phone

联系人手机:

contact_address

收件地址:

postal_code

邮政编码:

user_id

买家ID:

merchant_id

商家ID:

create_time

创建时间:

update_time

更新时间:

description

描述:[0,255]用于产品规格描述

state

订单状态:待付款,待发货,待签收,已签收,待退款,已退款,已拒绝,已完成

remark

订单备注

delivery_state

发货状态:未配送,已配送

vip_discount

折扣

第四章  详细设计及实现

4.1前台界面设计与实现

4.1.1用户登录界面

注册用户注册后可以使用账号密码可进行登录,使用系统功能;用户登录时按照要求输入用户名和密码,系统中函数在数据库中查询用户名和密码若有匹配的则进入系统注册用户页面,否则证明非该网站用户,跳回网站首页。

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

图4-1  用户登录流程图

用户登录页面设计如下图所示。

图4-2  登录页面设计

4.1.2用户注册界面

可以通过注册成为注册用户和卖家用户,使用账号密码可进行登录,使用系统功能,卖家用户的注册信息需经过管理员审核通过,才可使用账号密码可进行登录,使用系统功能,并可对个人信息和密码进行管理等功能。

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

图4-3  用户注册流程图

用户注册页面设计如下图所示。

图4-4 用户注册页面设计

4.1.3二手商城界面

注册用户点击“新闻资讯”可查看管理员发布的所有二手商城,支持局部搜索和下拉(筛选、排序)搜索,热门商品推荐,点击可查看详情,进行收藏=,并可点击立即购买(订单备注、支付)和加入购物车操作。

二手商城立即购买流程图如下所示。

图4-5 二手商城订购机票流程图

二手商城页面设计如下图所示。

图4-6 二手商城页面设计

4.1.4商城管理界面

注册用户点击“商城管理”可进行我的购物车、我的订单、我的地址等操作。点击“我的购物车”,可查看所有加入购物的二手商城,点击可查看详情,并可进行删除和购买(订单备注、支付)操作;点击“我的订单”点击,可查看所有订单信息,可进行增改删查,支持下拉(订单状态、排序)搜索,点击可查看详情;点击“我的地址”,可查看所有收货地址信息,可进行新建收货地址(收货人、手机号、详细地址)操作,并可对地址进行设为默认、删除、编辑操作。

例如,商城管理我的购物车支付流程图如下所示。

图4-7 商城管理我的购物车支付流程图

例如,商城管理我的购物车页面设计如下图所示。

图4-8 商城管理我的购物车页面设计

4.1.5个人中心界面

注册用户点击“个人中心”可对个人首页、订单配送、收藏等信息进行管控。

点击“订单配送”,可查看订单配送信息,进行查询操作,支持配送状态、签收状态搜索,可点击详情进行查看,和进行签收操作;点击“收藏”,可管理所有收藏信息,包括新闻资讯、二手商城等,进行查看和删除操作。可点击详情进行查看。

个人中心订单配送搜索流程图如下所示。

图4-9 个人中心订单配送搜索流程图

个人中心页面设计如下图所示。

图4-10 个人中心页面设计

4.2后台功能设计与实现

4.2.1卖家用户商城管理界面

卖家用户点击“商城管理”可对二手商城、订单列表、订单配送等信息进行管理点击“二手商城”,可查看自己的二手商城信息,进行增删改查操作,支持标题、分类搜索,可点击详情进行查看(封面图、主图、标题、描述、原价、卖价、库存、分类、卖家用户、商品名称、商品规格、正文)和查看评论;点击“订单列表”,可查看自己的订单信息,进行查询和和删除操作,支持订单号、商品名称、联系人姓名、状态搜索,可点击详情(联系人姓名、联系人手机、收货地址、描述、待付款、买家、订单备注)进行查看,和点击配送操作,修改配送状态;点击“订单配送”,可查看自己的订单配送信息,进行查询操作,支持商品名称、配送状态、签收状态搜索,可点击详情进行查看(订单号、商品名称、购买数量、交易总额、发货日期、配送单号、买家、收货地址、配送状态、签收状态),修改签收状态。

例如商城管理二手商城添加流程图如下所示。

图4-11 卖家用户商城管理二手商城添加流程图

卖家用户商城管理页面设计如下图所示。

图4-12 卖家用户商城管理页面设

4.2.2主页界面

卖家用户和管理员可在主页查看商品销售金额统计、商品销售数量统计等信息数据分析图表。

例如,主页查看流程图如下所示。

图4-13 主页查看流程图

例如,卖家主页页面设计如下图所示。

图4-14 卖家主页页面设计

4.2.3管理员登录模块

管理员账号密码由系统生成,可使用账号密码可进行登录,使用系统功能,并对个人信息和密码进行管理。

管理员登录流程图如下所示。

图4-15 管理员登录流程图

管理员登录页面设计如下图所示。

图4-16 管理员登录页面设计

4.2.4公共管理界面

可对首页的轮播图和通知公告进行管理,进行增删改查操作,支持标题搜索,可点击查看详情。

公共管理流程图如下所示。

图4-17 公共管理流程图

公共管理页面设计如下图所示。

图4-18 公共管理页面设计

4.2.5用户管理界面

可对注册用户和管理员进行管控,包括进行增删改查操作,点击可查看详情。

用户管理流程图如下所示。

图4-19 用户管理流程图

用户管理页面设计如下图所示。

图4-20 用户管理页面设计

4.2.6管理员商城管理界面

可查看所有管理员商城管理,进行增改删查操作,支持航班号、航班分类、机票类型,可点击查看详情(航班号、航班分类、机票类型、机票票价、出发地点、目的地点、起飞时间、到达时间、图片、购票须知)和查看评论。

例如,管理员商城管理订单配送流程图如下所示。

图4-21 管理员商城管理订单配送流程图

管理员商城管理页面设计如下图所示。

图4-22 管理员商城管理页面设计

4.3数据库连接

从Springboot+jsp架构的原理可知,二手商城推荐系统分析系统的各大模块的实现均需要对数据库的数据进行操作,具体包括查询数据、写入数据、更新数据和删除数据。

数据库查询流程图如下图所示。

图4-23 数据库查询流程图

数据库配置文件关键代码如下:

db = SQLAlchemy()

app = Springboot+jsp(__name__, static_folder='static')

# 数据库链接配置

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@127.0.0.1:3306/projectxxxxx'

app.secret_key = 'v&#prqo7t*(!ktb+8r=+83@#_$n1pg_xig$j=6v^r3#$i)wx87'

db.init_app(app)

app.config['UPLOAD_FOLDER'] = 'static/upload'


第五章  系统测试

5.1测试任务及目的

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

5.2测试计划

测试计划是在软件开发过程中制定的一项计划,目的是确保软件的质量和可靠性。对于易物二手交易平台的设计与实现,以下是具体的测试计划:

功能模块测试:对于每个实体和功能模块,编写相应的功能模块测试用例,确保代码的运行正常。测试用户注册功能,包括验证输入的合法性和保存用户信息到数据库。测试商品发布功能,包括验证输入的合法性和保存商品信息到数据库。测试商品搜索功能,确保搜索结果符合预期等。

集成测试:对不同模块之间的交互进行测试,确保系统的整体功能正常工作。测试用户登录功能,包括验证用户输入的账号和密码,正确登录和错误登录的处理。测试商品详情功能,包括查看商品详细信息和相关操作。测试购物车功能,包括商品添加、删除和结算等操作。

界面测试:对系统的界面进行测试,确保用户操作的便捷性和友好性。测试用户注册界面,验证界面的输入控件和提示信息是否正确。测试商品展示界面,确保商品信息的显示和交互功能的正常。测试购物车界面,包括商品数量和总价的计算等功能。

性能测试:测试系统在不同负载情况下的性能表现,包括并发访问、响应时间等。

测试用户注册功能的性能,模拟多个用户同时注册验证响应时间和并发处理能力。测试商品搜索功能的性能,模拟多个用户同时进行搜索验证响应时间和并发处理能力。

安全测试:测试系统的安全性,包括防止信息泄露、数据加密、权限控制等。

测试用户登录功能的安全性,模拟攻击尝试破解密码或登录其他用户账号。测试敏感信息的保护,模拟非法请求获取用户私密信息。

5.3测试用例

5.3.1登录模块测试用例

下表是系统登录功能测试用例,检测了用户名和密码的不同的输入情况,观察系统的响应情况。得出该功能达到了设计目标。

表5-1 系统登录功能测试用例

测试用例编号

YL_01

测试用例名称

系统使用者登录

测试用例描述

登录者输入用户名、密码和验证码

系统入口

浏览器

步骤

预期结果

实际结果

输入正确的用户名、密码和验证码

提示“登录成功”,并进入系统

预期结果

输入错误的用户名、密码和验证码

提示“登录失败”,并返回登录界面

预期结果

不输入用户名、密码和验证码

提示“请输入完整”

预期结果

5.3.2注册模块测试用例

下表是注册功能测试用例,检测了各种数据的输入情况,观察系统的响应情况。得出该功能达到了设计目标。

表5-2 注册功能测试用例

测试用例编号

YL_02

测试用例名称

系统使用者注册账号

测试用例描述

使用者输入用户名、密码以及个人信息进行账号注册

系统入口

浏览器

步骤

预期结果

实际结果

输入系统不存在的用户名、密码和个人信息

提示“注册成功” 

预期结果

输入系统已存在的用户名

提示“注册失败”,并返回注册界面

预期结果

不输入用户名、密码和个人信息

提示“请输入完整”

预期结果

5.3.3新闻资讯添加模块测试用例

下表是二手商城功能的测试用例,检测了二手商城中对二手商城的增加,删除,修改,查询操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。

前置条件;管理员登录系统。

表5-3 新闻资讯添加的测试用例

测试用例编号

YL_04

测试用例名称

系统使用者进行添加新闻资讯

续表

测试用例描述

使用者输入新闻资讯标题、内容

等信息

系统入口

浏览器

步骤

预期结果

实际结果

输入完整的新闻资讯标题

和内容

提示“添加成功”,并进入系统

预期结果

不输入的资讯标题和内容

提示“请输入完整”

预期结果

5.3.4二手商城添加模块测试用例

下表是商城管理功能的测试用例,检测了商城管理中对商城管理的增加,删除,修改,查询操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。

前置条件;管理员、卖家用户登录系统。

表5-4 二手商城添加的测试用例

测试用例编号

YL_04

测试用例名称

系统使用者进行添加二手商城商品信息

测试用例描述

使用者输入信息标题、内容等信息

系统入口

浏览器

步骤

预期结果

实际结果

输入完整的商品标题

和内容

提示“添加成功”,并进入系统

预期结果

不输入的商品标题和内容

提示“请输入完整”

预期结果

5.4测试结论

通过编写易物二手交易平台的测试用例,已经检测完毕包括但不限于用户登录、用户注册、管新闻资讯添加、二手商城添加等测试,为系统的后期推广运营提供了强力的技术支撑。在对以上功能得测试过程中,发现了系统中的很多漏送并进行了完善,经过多人在线进行测试,系统完全可以正常运行,当然在后期的维护中系统将不断完善。这些测试确保了保证本次设计的已实现的功能能够正常运行并且相关数据库的信息也同样保证正确;为易物二手交易平台在后期推广运营中提供了可靠的技术支持,为用户提供良好的使用体验,并为系统的发展打下了坚实的基础。


结  论

在本次易物二手交易平台的设计和实现过程中,我们运用了先进的技术和创新的方法,成功地实现了多项功能。通过使用前端jsp技术,我们打造了一个直观友好的用户界面,并提供了首页、公告信息、新闻资讯、二手商城、商城管理(个人首页、订单配送、收藏)等核心功能。同时,我们采用后端Springboot开发技术和数据库来支持数据存储、用户认证、系统管理和逻辑处理等方面,实现了管理员和卖家用户的主页、商城管理等管理功能。

易物二手交易平台具有巨大的潜力和商业价值。通过协同过滤算法,系统能够提供个性化、精准的二手商城信息推荐,提升用户体验和满意度。同时,系统还具备高效、稳定和可扩展的特点,为二手交易行业的发展和创新带来了巨大的潜力。未来,我们可以进一步引入更多的数据源,探索新的算法和模型,实现多维度的推荐,鼓励用户参与和互动,并在多平台上进行开发和部署。通过不断优化和创新,这样的系统将为用户带来更好的二手交易观影体验,帮助二手交易行业发现新的市场机会和优化运营策略。总之,基于Springboot+jsp架构的易物二手交易平台在二手交易行业具有广阔的发展前景,我们期待着它在未来为用户和二手交易产业带来更大的价值和影响力。

同时,我们将继续关注最新的技术趋势和行业标准,不断更新和升级系统的技术架构和功能。进一步提升和完善TravelHub易物二手交易平台。例如,我们可以探索使用大数据和信息化分析技术来推荐个性化的二手交易,提供更精准的用户体验;还可以继续优化系统的用户界面和交互体验,使其更加直观友好。

我们相信,通过不断学习和应用新技术,我们可以为用户提供更丰富、便捷和安全的二手交易服务。同时,我们也要密切关注市场需求和用户反馈,不断优化和改进系统,以满足用户的期待和追求。让我们携手并进,在技术和创新的道路上不断前行,为二手交易领域的发展贡献我们的力量。

谢  辞

时间过得飞快,马上就要毕业了,在此,我想用真挚的心意向一些特别的人们表达我的感激之情。

我要衷心感谢我的父母和家人。他们一直以来给予我无私的支持和鼓励,是我坚强的后盾。他们的理解与支持让我能够专注于学业,并为我提供了一个温暖的家庭环境。没有他们,我无法顺利完成这篇论文。

接下来,我要感谢我的导师。感谢您在整个研究过程中给予我的耐心指导和宝贵建议。您的专业知识和经验对我产生了深远的影响。您的教诲和指导使我能够更好地理解和运用所学知识,在研究中取得了显著的进展。我非常感激您的辛勤付出和悉心指导。

此外,我要感谢我的同学和朋友们。在这段学习旅程中,你们给予了我无尽的支持和鼓励。我们一起度过了难忘的时光,互相帮助、相互学习。你们的智慧和见解为我提供了新的思路和灵感,使我的论文更加丰富和有深度。

最后,我要感谢所有为这篇论文提供支持和帮助的人们,包括实验室的工作人员、图书馆的工作人员以及其他相关专业领域的专家和学者。你们的专业知识和资源为我的研究提供了重要的支持和参考,使我能够深入探索和展示我的观点。

在完成这篇论文的过程中,我不仅获得了学术上的收获,还结交了许多宝贵的友谊和支持。再次向所有给予我帮助和支持的人们表示衷心的感谢!!

参考文献

  1. 周继祥,毛陈陈,白坤明.二手产品销售模式对供应链定价影响研究[J].价格理论与实践,2023,(12):184-188.DOI:10.19851/j.cnki.CN11-1010/F.2023.12.493.
  2. 艾钰承,朱海风,刘舟.基于SpringBoot的“喵站”宠物服务平台的设计与实现[J].科技资讯,2023,21(22):22-25.DOI:10.16661/j.cnki.1672-3791.2305-5042-0756.
  3. 殷梅雨,肖月,周慧珍.基于“互联网+”的校园二手交易平台发展对策研究[J].现代商贸工业,2023,44(23):23-25.DOI:10.19311/j.cnki.1672-3198.2023.23.008.
  4. 崔臣,宋甲旭.基于SpringBoot的校园二手交易系统研究[J].无线互联科技,2023,20(18):31-34.
  5. 周姣.基于微服务架构的高校二手物品交易系统设计与实现[J].电脑知识与技术,2023,19(22):67-70.DOI:10.14004/j.cnki.ckt.2023.1248.
  6. 莫竞西,孟洁冰.中国各地二手交易市场蓬勃发展[J].英语世界,2023,42(08):24-29.
  7. 张先进,比力格亚尔·阿不力孜,李飞帆等.高校二手物品中介信息化平台良性运行路径探析[J].中国新通信,2023,25(13):51-53.
  8. Heng L ,Yuxing L .Design and implementation of a standardized review system for gas station safety production based on SpringBoot[C]//[出版者不详],2023:
  9. 刘晓爽.基于消费者行为的二手奢侈品交易平台“只二”营销策略优化研究[D].中原工学院,2023.DOI:10.27774/d.cnki.gzygx.2023.000192.
  10. 李顺,康雄杰.当前经济背景下校园二手交易平台的构建——以邵阳学院为例[J].财富时代,2023,(05):88-90.
  11. 饶锎月.可持续商业模式下垂直类二手交易平台服务设计研究[D].江南大学,2023.DOI:10.27169/d.cnki.gwqgu.2023.002036.
  12. 鉴冉冉,赵畅,向生雯等.绿色消费理念下二手交易平台的经营管理优化路径研究[J].商场现代化,2023,(07):26-28.DOI:10.14013/j.cnki.scxdh.2023.07.008.
  13. 王海峰,孙海涛,曾佳峰.大学跳蚤市场网站设计与实现[J].电子制作,2023,31(08):65-68.DOI:10.16589/j.cnki.cn11-3571/tn.2023.08.010.
  14. 王志亮,纪松波.基于SpringBoot的Web前端与数据库的接口设计[J].工业控制计算机,2023,36(03):51-53.
  15. 田松涛,段元梅.基于SpringBoot的线上商城平台设计[J].无线互联科技,2022,19(01):56-57.
  16. 陈冰.基于SpringBoot的校园二手商品交易系统的设计与实现[D].华中师范大学,2021.DOI:10.27159/d.cnki.ghzsu.2021.003139.
  17. 姜启雯,罗薇,马康.校园二手物品交易平台的设计案例[J].电子技术,2021,50(04):64-67.
  18. Chen J ,Jian C ,Hailan P .Design of Man Hour Management Information System on SpringBoot Framework[J].Journal of Physics: Conference Series,2020,1646(1):012136-.
  19. 张子欣,高敏,王斯宇等.校园内部二手交易平台研究[J].合作经济与科技,2020,(09):84-87.DOI:10.13665/j.cnki.hzjjykj.2020.09.034.
  20. 贾志勇.基于SpringBoot的下沉市场交易平台的设计与实现[D].安徽大学,2020.DOI:10.26917/d.cnki.ganhu.2020.000917.

附  录

附录一:《大连交通大学毕业设计(论文)软件使用说明书》

使用电脑端登录即可

附录二:《大连交通大学毕业设计(论文)软件程序源代码》

连接数据库的文件在Resources 文件夹下的application.yml文件,代码如下:

server:

  port: 5000

  servlet:

    context-path: /api

spring:

  mvc:

    static-path-pattern: /upload/**

  resources:

    static-locations: file:此处填写地址/project93355/server/src/main/resources/static

datasource:    

jdbc:mysql://127.0.0.1:3306/projectxxxxx?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8

    username: root

    password: root

    driver-class-name: com.mysql.cj.jdbc.Driver

    type: com.alibaba.druid.pool.DruidDataSource

  jackson:

    property-naming-strategy: CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

    default-property-inclusion: ALWAYS

    time-zone: GMT+8

    date-format: yyyy-MM-dd HH:mm:ss

  servlet:

    multipart:

      max-file-size: 500MB

      max-request-size: 500MB

  redis:

    host: 127.0.0.1

    port: 6379

    password:

    database: 2

    lettuce:

      pool:

        max-idle: 30

        min-idle: 10

        max-active: 30

        max-wait: 10000

mybatis-plus:

  mapper-locations: classpath*:mapper/*.xml

  type-aliases-package: com.project.demo.entity

  configuration:

    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

    use-column-label: true

    map-underscore-to-camel-case: false

    lazy-loading-enabled: true

    aggressive-lazy-loading: false

use-generated-keys: true

项目启动文件Application.java,代码如下:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

@EnableJpaRepositories

@MapperScan("com.project.demo.dao")

public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class,args);

    }

}

登陆拦截管理器,在config文件夹下的WebAppConfig.java文件,代码如下:

package com.project.demo.config;

@Configuration

@Slf4j

public class WebAppConfig implements WebMvcConfigurer {

    @Override

    public void addInterceptors(InterceptorRegistry registry) {

        //登录拦截的管理器

        InterceptorRegistration registration = registry.addInterceptor(loginInterceptor());

        //拦截的地址

        registration.addPathPatterns("/**");

        //根据需要拦截,一般设置所有地址拦截,放行公共连接

    }

    @Bean

    public LoginInterceptor loginInterceptor(){

        return new LoginInterceptor();

    }

}

登陆接受管理器,在interceptor文件夹下的LoginInterceptor.java文件,控制请求头代码如下:

package com.project.demo.interceptor;

@Slf4j

public class LoginInterceptor implements HandlerInterceptor {

    private String tokenName = "x-auth-token";

    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String token = request.getHeader(this.tokenName);

        setHeader(request, response);

        log.info("[请求接口] - {} , [请求类型] - {}",request.getRequestURL().toString(),request.getMethod());

        if (request.getRequestURL().toString().contains("/api/user/login")){

            return true;

        }

        else if (request.getRequestURL().toString().contains("/api/user/state")){

            return true;

        }

        else if (request.getRequestURL().toString().contains("/api/user/register")){

            return true;

        }

    }

    @Override

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {

        //更新token

    }

    @Override

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }

    private void failure(HttpServletRequest request, HttpServletResponse response) throws IOException {

        response.setHeader("Content-type", "application/json;charset=UTF-8");

        response.setStatus(401);

        response.sendRedirect("https://www.baidu.com");

    }

    private void setHeader(HttpServletRequest request, HttpServletResponse response) {

        //跨域的header设置

        response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin"));

        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH");

        response.setHeader("Access-Control-Allow-Credentials", "true");

        response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));

        response.setHeader("Access-Control-Max-Age", "1800");

        //防止乱码,适用于传输JSON数据

        response.setHeader("Content-Type", "application/json;charset=UTF-8");

        response.setStatus(HttpStatus.OK.value());

    }

}

组装sql语句,在constant文件夹下的FindConfig.java文件,代码如下:

package com.project.demo.constant;

public class FindConfig {

    public static String PAGE = "page";

    public static String SIZE = "size";

    public static String LIKE = "like";

    public static String ORDER_BY = "orderby";

    public static String FIELD = "field";

    public static String GROUP_BY = "groupby";

    public static String MIN_ = "_min";

    public static String MAX_ = "_max";

    public static String SQLHWERE = "sqlwhere";

}

项目采用三层架构controller(每一个实体对应一个controller),entity(项目表实体),service

,Controller 均继承自BaseController,注入两个对象,一个是实体类(以Auth为例),另一个是其AuthService:

@RestController

@RequestMapping("auth")

public class AuthController extends BaseController<Auth, AuthService> {

    /**

     * 服务对象

     */

    @Autowired

    public AuthController(AuthService service) {

        setService(service);

    }

}

Controller用于spring控制请求的地址

新增一条数据,通过post传入一个json对象,然后经过request.getReader(),最后经过readBody()转成一个Map,含有String和Object,key用的是字段名,Object存放数据,最终得到Map,insert用拼装sql,读取body,组装成一个insert对象,runCountSql()语句,代码如下:

    @PostMapping("/add")

    @Transactional

    public Map<String, Object> add(HttpServletRequest request) throws IOException {

        service.insert(service.readBody(request.getReader()));

        return success(1);

    }

public Map<String, Object> addMap(Map<String,Object> map){

    service.insert(map);

     return success(1);

 }

修改一个数据,原理与add基本一致,不同点在于通过readConfig()读取关键字,以及通过readQuery()获取URL后面?指定位置的标识,转成Map对象后,执行update操作,同样通过拼接的sql语句执行,执行过程读取query,toWhereSql()语句完成数据库操作,body为修改对象的值,代码如下:

    @PostMapping("/set")

@Transactional

    public Map<String, Object> set(HttpServletRequest request) throws IOException {

        service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));

        return success(1);

    }

删除一条数据,通过readQuery(),获取URL后面的对象地址,删除FROM具体的table,query删除查询FindConfig语句,代码如下:

    @RequestMapping(value = "/del")

    @Transactional

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

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

        return success(1);

    }

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

        QueryWrapper wrapper = new QueryWrapper<E>();

        toWhereWrapper(query, "0".equals(config.get(FindConfig.GROUP_BY)),wrapper);

        baseMapper.delete(wrapper);

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

    }

通过请求的参数获取一条数据,通过readQuery(),获取URL后面的对象地址,查询FindConfig语句,select筛选Map对象,FIELD为查询字段,未传输的情况下传入“*”,代码如下:

    @RequestMapping("/get_obj")

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

        List resultList = service.selectBaseList(service.select(service.readQuery(request), service.readConfig(request)));

        if (resultList.size() > 0) {

            JSONObject jsonObject = new JSONObject();

            jsonObject.put("obj",resultList.get(0));

            return success(jsonObject);

        } else {

            return success(null);

        }

    }

通过请求的参数获取列表数据,代码如下:

    @RequestMapping("/get_list")

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

        Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));

        return success(map);

    }

获取某个组下面的数量,代码如下:

    @RequestMapping(value = {"/count_group", "/count"})

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

        Integer value= service.selectSqlToInteger(service.groupCount(service.readQuery(request), service.readConfig(request)));

        return success(value);

    }

获取某个组下面的总计值,代码如下:

    @RequestMapping(value = {"/sum_group", "/sum"})

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

        Integer value = service.selectSqlToInteger(service.sum(service.readQuery(request), service.readConfig(request)));

        return success(value);

    }

图片/文件/视频等的上传方法通过MultipartFile,代码如下:

   @PostMapping("/upload")

    public Map<String, Object> upload(@RequestParam("file") MultipartFile file) {

        log.info("进入方法");

        if (file.isEmpty()) {

            return error(30000, "没有选择文件");

        }

        try {

            //判断有没路径,没有则创建

            String filePath = System.getProperty("user.dir") + "/src/main/resources/static/";

            File targetDir = new File(filePath);

            if (!targetDir.exists() && !targetDir.isDirectory()) {

                if (targetDir.mkdirs()) {

                    log.info("创建目录成功");

                } else {

                    log.error("创建目录失败");

                }

            }

            String fileName = file.getOriginalFilename();

            File dest = new File(filePath + fileName);

            log.info("文件路径:{}", dest.getPath());

            log.info("文件名:{}", dest.getName());

            file.transferTo(dest);

            JSONObject jsonObject = new JSONObject();

            jsonObject.put("url", "/api/upload/" + fileName);

            return success(jsonObject);

        } catch (IOException e) {

            log.info("上传失败:{}", e.getMessage());

        }

        return error(30000, "上传失败");

    }

注册页UserController.java,传入user对象,并将"user_id"、 "state"、 "user_group"、"login_time"、"phone"、"phone_state"、 "username"、"nickname"、"password"、"email"、"email_state"、"avatar"、"create_time"输入,重点是 "username"、"nickname"、"password"必须输入,通过获取username,数据库查询是否有该用户,如果存在,则提示“用户已存在”,否则执行将UserId置为空(数据库表中该字段已设置自动递增),代码如下:

    /**

     * 注册

     * @param user

     * @return

     */

    @PostMapping("register")

    public Map<String, Object> signUp(@RequestBody User user) {

        // 查询用户

        Map<String, String> query = new HashMap<>();

        Map<String,Object> map = JSON.parseObject(JSON.toJSONString(user));

        query.put("username",user.getUsername());

        List list = service.selectBaseList(service.select(query, new HashMap<>()));

        if (list.size()>0){

            return error(30000, "用户已存在");

        }

        map.put("password",service.encryption(String.valueOf(map.get("password"))));

        service.insert(map);

        return success(1);

}     

注册页password则使用了MD5加密,代码如下:

    public String encryption(String plainText) {

        String re_md5 = new String();

        try {

            MessageDigest md = MessageDigest.getInstance("MD5");

            md.update(plainText.getBytes());

            byte b[] = md.digest();

            int i;

            StringBuffer buf = new StringBuffer("");

            for (int offset = 0; offset < b.length; offset++) {

                i = b[offset];

                if (i < 0)

                    i += 256;

                if (i < 16)

                    buf.append("0");

                buf.append(Integer.toHexString(i));

            }

            re_md5 = buf.toString();

        } catch (Exception e) {

            e.printStackTrace();

        }

        return re_md5;

}

登录页,首先传入"username"、"email"、"phone"、"password",用户可通过用户名、邮箱、手机号进行登陆,通过判断resultList来确定查询结果,然后执行查询用户组UserGroup,用户组里面不存在,依然报“用户不存在”,执行完以上代码,最后涉及到用户带有“审核”的,会查询examine_state(用户的审核状态),数据库表user_group中含有source_table和source_field进行查询,以上步骤完成,对输入的密码进行存储Token到数据库,匹对账号和密码,数据库中的AccessToken为令牌,用于身份认证,其代码如下:

 /**

     * 登录

     * @param data

     * @param httpServletRequest

     * @return

     */

    @PostMapping("login")

    public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {

        log.info("[执行登录接口]");

        String username = data.get("username");

        String email = data.get("email");

        String phone = data.get("phone");

        String password = data.get("password");

        List resultList = null;

        Map<String, String> map = new HashMap<>();

        if(username != null && "".equals(username) == false){

            map.put("username", username);

            resultList = service.selectBaseList(service.select(map, new HashMap<>()));

        }

        else if(email != null && "".equals(email) == false){

            map.put("email", email);

            resultList = service.selectBaseList(service.select(map, new HashMap<>()));

        }

        else if(phone != null && "".equals(phone) == false){

            map.put("phone", phone);

            resultList = service.selectBaseList(service.select(map, new HashMap<>()));

        }else{

            return error(30000, "账号或密码不能为空");

        }

        if (resultList == null || password == null) {

            return error(30000, "账号或密码不能为空");

        }

        //判断是否有这个用户

        if (resultList.size()<=0){

            return error(30000,"用户不存在");

        }

        User byUsername = (User) resultList.get(0);

        Map<String, String> groupMap = new HashMap<>();

        groupMap.put("name",byUsername.getUserGroup());

        List groupList = userGroupService.selectBaseList(userGroupService.select(groupMap, new HashMap<>()));

        if (groupList.size()<1){

            return error(30000,"用户组不存在");

        }

        UserGroup userGroup = (UserGroup) groupList.get(0);

        //查询用户审核状态

        if (!StringUtils.isEmpty(userGroup.getSourceTable())){

            String res = service.selectExamineState(userGroup.getSourceTable(),byUsername.getUserId());

            if (res==null){

                return error(30000,"用户不存在");

            }

            if (!res.equals("已通过")){

                return error(30000,"该用户审核未通过");

            }

        }

        //查询用户状态

        if (byUsername.getState()!=1){

            return error(30000,"用户非可用状态,不能登录");

        }

        String md5password = service.encryption(password);

        if (byUsername.getPassword().equals(md5password)) {

            // 存储Token到数据库

            AccessToken accessToken = new AccessToken();

            accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));

            accessToken.setUser_id(byUsername.getUserId());

            Duration duration = Duration.ofSeconds(7200L);

            redisTemplate.opsForValue().set(accessToken.getToken(), accessToken,duration);

            // 返回用户信息

            JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));

            user.put("token", accessToken.getToken());

            JSONObject ret = new JSONObject();

            ret.put("obj",user);

            return success(ret);

        } else {

            return error(30000, "账号或密码不正确");

        }

    }

找回密码,接收用户输入的用户名、密码、验证码,并进行条件判断,代码如下:

    /**

     * 找回密码

     * @param form

     * @return

     */

    @PostMapping("forget_password")

    public Map<String, Object> forgetPassword(@RequestBody User form,HttpServletRequest request) {

        JSONObject ret = new JSONObject();

        String username = form.getUsername();

        String code = form.getCode();

        String password = form.getPassword();

        // 判断条件

        if(code == null || code.length() == 0){

            return error(30000, "验证码不能为空");

        }

        if(username == null || username.length() == 0){

            return error(30000, "用户名不能为空");

        }

        if(password == null || password.length() == 0){

            return error(30000, "密码不能为空");

        }

        // 查询用户

        Map<String, String> query = new HashMap<>();

        query.put("username",username);

        List list = service.selectBaseList(service.select(query, service.readConfig(request)));

        if (list.size() > 0) {

            User o = (User) list.get(0);

            JSONObject query2 = new JSONObject();

            JSONObject form2 = new JSONObject();

            // 修改用户密码

            query2.put("user_id",o.getUserId());

            form2.put("password",service.encryption(password));

            service.update(query, service.readConfig(request), form2);

            return success(1);

        }

        return error(70000,"用户不存在");

    }

修改密码,通过请求data,获取旧密码,并将新密码重新赋值,期间都是需要通过加密,代码如下:

    /**

     * 修改密码

     * @param data

     * @param request

     * @return

     */

    @PostMapping("change_password")

    public Map<String, Object> change_password(@RequestBody Map<String, String> data, HttpServletRequest request){

        // 根据Token获取UserId

        String token = request.getHeader("x-auth-token");

        Integer userId = tokenGetUserId(token);

        // 根据UserId和旧密码获取用户

        Map<String, String> query = new HashMap<>();

        String o_password = data.get("o_password");

        query.put("user_id" ,String.valueOf(userId));

        query.put("password" ,service.encryption(o_password));

        int count = service.selectBaseCount(service.count(query, service.readConfig(request)));

        if(count > 0){

            // 修改密码

            Map<String,Object> form = new HashMap<>();

            form.put("password",service.encryption(data.get("password")));

            service.update(query,service.readConfig(request),form);

            return success(1);

        }

        return error(10000,"密码修改失败!");

    }

免费领取项目源码,请关注❥点赞收藏并私信博主,谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值