小学校园“闲书”交易平台的设计与实现
摘 要
小学校园“闲书”交易平台是为了解决小学生之间的书籍交流和阅读兴趣培养而设计的。该平台通过使用现代技术手段,如移动应用开发和互联网技术,构建了一个功能齐全的交易平台。平台支持用户注册与登录,用户可以进行图书信息发布和管理。同时,平台还提供搜索和筛选功能,方便用户寻找感兴趣的书籍。小学校园“闲书”交易平台对于小学生之间的书籍交流和阅读兴趣培养具有积极影响。通过该平台,学生能够分享和获取更多的书籍资源,培养阅读兴趣和习惯。
关键词:图书交易;Java语言;Springboot框架
Abstract
The "Idle Book" trading platform on primary school campuses is designed to facilitate book exchange and cultivate reading interests among primary school students. The platform has built a fully functional trading platform by using modern technical means, such as mobile application development and Internet technology. The platform supports user registration and login, allowing users to publish and manage book information. At the same time, the platform also provides search and filtering functions, making it convenient for users to find books of interest. The "idle book" trading platform on primary school campuses has a positive impact on the exchange of books and the cultivation of reading interests among primary school students. Through this platform, students can share and access more book resources, cultivate reading interests and habits.
Key words: Book trading; Java language; Springboot framework
目 录
第1章 绪论
1.1 研究背景与意义
1.2 开发现状
1.3 开发目的
1.4 研究内容
第2章 系统分析
2.1 可行性分析
2.1.1 技术可行性
2.1.2 经济可行性
2.1.3 社会可行性
2.2系统功能分析和描述
2.3性能分析 6
2.4系统操作流程 7
2.4.1添加信息流程 7
2.4.2操作流程 7
2.4.3删除信息流程 8
第3章 系统设计
3.1系统架构设计
3.2数据库设计
3.2.1实体ER图 13
3.2.2数据表 14
第4章 系统实现
4.1 登录模块的实现 16
4.2 通知公告模块的实现 23
4.3 闲书商城模块的实现 24
4.4 图书购买模块的实现 26
4.5 闲书商城管理模块的实现 30
第5章 系统测试 31
5.1 测试环境 31
5.2 测试目标
5.3 功能测试 31
5.4 测试结果 32
第6章 总结与展望 34
参考文献 35
致谢 37
- 绪论
- 研究背景与意义
随着社会的发展和教育的普及,学生们对于阅读的需求日益增加。然而,在学生群体中存在许多闲置的书籍,这些书籍往往被束之高阁,无法得到充分的利用。同时,学生之间分享书籍的渠道也相对有限,导致了资源浪费和信息不对称的问题。因此,小学校园“闲书”交易平台的研究旨在为学生提供一个便捷、安全的书籍交流平台。通过借助移动应用开发和互联网技术,该平台可以使学生能够轻松地交换、借阅和购买闲置书籍。这样一来,学生们可以更好地利用自己的书籍资源,培养阅读兴趣和习惯。此外,小学校园“闲书”交易平台的研究还关注学生之间的社交和合作。通过平台上的交流功能,学生们可以互相沟通、协商和共享阅读心得,促进彼此之间的交流和合作。这不仅有助于学生之间的友谊建立,还能增强他们的阅读体验和理解能力。
-
- 开发现状
国内方面,随着互联网的普及和电子商务的发展,图书交易平台得到了广泛关注和研究。一些大型电商平台,如京东、淘宝等,在图书交易领域已经取得了显著成就。这些平台提供了丰富的图书资源和便捷的交易方式,满足了用户的购买需求。此外,一些新兴的二手图书交易平台也逐渐兴起,为用户提供了闲置图书的交换和转让渠道。然而,目前国内的图书交易系统在个性化推荐、社交交流等方面仍有进一步提升的空间。
在国际上,图书交易系统的研究也取得了一定的进展。例如,美国的亚马逊公司以其强大的图书库存和智能推荐系统成为全球最大的在线图书零售商之一。除了亚马逊,国外还涌现了一些专门的二手图书交易平台,如BookFinder、AbeBooks等,为用户提供了更多的选择和便利。此外,一些图书交易系统也开始探索与社交媒体的结合,通过社交分享和评论等功能,促进用户之间的交流和互动。
-
- 开发目的
通过搭建“闲书”交易平台,旨在提供一个安全、便捷的环境,让学生能够交换和购买闲置书籍。这有助于促进小学生之间的书籍交流和分享,让更多的书籍得到充分利用。该平台的研究目的还在于通过促进学生之间的书籍交流,培养和激发他们的阅读兴趣和习惯。通过与其他同学分享和借阅不同类型的书籍,学生可以拓宽阅读领域,增加阅读的乐趣和意义。平台提供可靠的书籍交易渠道:传统的书籍交易方式可能存在信息不对称和信任问题。而研究该平台的目的是为了提供一个可靠的书籍交易渠道,确保交易的安全和公正性。通过平台上的交流功能和评价系统,用户可以相互沟通、确认交易细节,同时也可以了解交易方的信誉和口碑。
小学校园“闲书”交易平台的研究目的还在于推动数字化教育发展。通过借助移动应用开发和互联网技术,该平台提供了一个基于数字化平台的书籍交流环境,使学生能够适应数字化时代的学习和交流方式。
-
- 研究内容
小学校园“闲书”交易平台的开发及实现,所需要的工作内容:
(1)首先是确定选题,确定好所要做的系统,并对系统的背景及现在面临的一些问题等进行系统的初步确认。
(2)系统确认完成后,结合系统开发的需求进行确认系统开发所使用的技术,小学校园“闲书”交易平台的开发使用Springboot框架,数据库进行平台的搭建开发,确认好使用的技术进行技术分析,所使用的技术是否可以完成系统的实现。
(3)确定好系统使用的技术,进行在线确认系统所划分的用户角色,并且根据用户角色划分确定所要设计的功能模块,对小学校园“闲书”交易平台的设计主要划分别为管理员和用户角色,并所使用的功能模块也相应不同,但是系统的数据库实现的内容是交互的,用户可以随时根据自己的需求进行图书购买,卖家可以对闲书商城进行发布更新,对于系统工作人员可以根据自己的分管内容进行各项数据的管理操作,管理员获取到所有用户的详细数据信息,并根据需求进行第一时间处理解决。
(4)系统的功能模块确认完成后进行程序及界面的设计,设计完成后,并且通过测试来判断程序是否完善,对于系统测试,需要不同的用户进行不同的内容编辑及提交,及使用不同的测试方式找出程序中存在的漏洞,并对程序出现的漏洞问题进行在线解决处理,如果测试系统没有任何问题时,可以将系统上传进行正式操作使用。
开发任何一个系统,都要对其可行性进行分析,对其时间和资源上的限制进行考虑,这样可以减少系统开发的风险。同时,分析之后不仅能够合理的运用人力,还能在各方面资源的消耗上得到节省。下面就对技术、经济和社会三个方面来介绍。
技术可行性主要考虑当前项目所用的技术是否能够符合,在设备上是否能够满足,及各种辅助工具是否提供帮助。本系统用的是Java开发语言,调试相对简单,当前的计算机硬件配置也完全能满足开发的需求,因此在技术上是绝对可行的。软件方面:由于软件的开发平台成熟可行,它们速度快、容量大、可靠性能高、价格低,完全能满足系统的需求。采用Java编程语言,已无技术上的问题。
系统所采用的Myeclipse开发平台和Mysql后端数据库均为免费开发工具。故开发成本主要集中在后期的推广及系统维护上。相对于成本较高的C/S模式,也是选用了成本较低的B/S模式,所以经济上几乎没任何问题。
本系统是自行开发的系统,以方便高效设计小学校园“闲书”交易平台为出发点,是具有实际意义的系统,开发的环境软件和用到的数据库也都是开源代码,不存在侵权等问题,所以在社会方面也是可行的。
2.2系统流程分析
2.2.1添加信息流程
添加信息,编号系统使用自动编号模式,没有用户填写,用户添加信息输入信息,系统将自动确认的信息和数据,验证的成功是有效的信息添加到数据库,信息无效,重新输入信息。添加信息流程如图2-1所示。
2.2.2操作流程
用户想进入系统,首先进入系统登录界面,通过正确的用户名、密码,选择登录类型登录,系统会检查登录信息,信息正确,然后输入相应的功能界面,提示信息错误,登录失败。系统操作流程如图2-2所示。
2.2.3删除信息流程
用户选择要删除的信息并单击Delete按钮。系统提示是否删除信息。如果用户想要删除信息,系统将删除信息。系统数据库删除信息。删除信息流程图如图2-3所示。
图2-3 删除信息流程图
小学校园“闲书”交易平台 的系统项目的概述设计分析,主要内容有小学校园“闲书”交易平台的具体分析,进行数据库的是设计,数据采用mysql数据库,并且对于系统的设计采用比较人性化的操作设计,对于系统出现的错误信息可以及时做出处理及反馈。
基于小学校园“闲书”交易平台的设计基于现有的电脑,可以实现交换论坛、通知公告、留言板、闲书商城、读书笔记、商城管理等详细的了解及统计分析。根据系统功能需求建立的模块关系图如下图:
图3-3卖家功能模块图
数据库是信息系统的基础和核心。数据库设计的好坏直接影响到信息系统开发的成败。创建数据库表首先确定实体的属性和实体之间的关系。根据关系创建一个数据表。
4.3.1实体ER图
数据库是整个软件编程中最重要的一个步骤,对于数据库问题主要是判定数据库的数量和结构公式的创建。展示系统使用的是Mysql进行对数据库进行管理,进行保证数据的安全性、稳定性等。
概念模型的设计是为了抽象真实世界的信息,并对信息世界进行建模。它是数据库设计的强大工具。数据库概念模型设计可以通过E-R图描述现实世界的概念模型。系统的E-R图显示了系统中实体之间的链接。而且Mysql数据库是自我保护能力比较强的数据库,下图主要是对数据库实体的E-R图:
(1)闲书商城E-R图,如图3-4所示:
图3-4闲书商城实体属性图
(2)订单信息E-R图如图3-5所示:
图3-5订单信息实体图
(3)订单配送E-R图如图3-6所示:
图3-6订单配送实体图
这些功能可以充分满足小学校园“闲书”交易平台的需求。此系统功能较为全面如下图系统功能结构如图3-7所示。
图3-7系统功能结构图
4.3.2数据表
将数据库概念设计的E-R图转换为关系数据库。在关系数据库中,数据关系由数据表组成,但是表的结构表现在表的字段上。
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | book_exchange_id | int | 10 | 0 | N | Y | 图书交换ID | |
2 | publish_users | int | 10 | 0 | Y | N | 0 | 发布用户 |
3 | user_name | varchar | 64 | 0 | Y | N | 用户名称 | |
4 | book_name | varchar | 64 | 0 | Y | N | 图书名称 | |
5 | book_types | varchar | 64 | 0 | Y | N | 图书类型 | |
6 | book_images | varchar | 255 | 0 | Y | N | 图书图片 | |
7 | publishing_house_name | varchar | 64 | 0 | Y | N | 出版社名 | |
8 | damage_level | varchar | 64 | 0 | Y | N | 损坏程度 | |
9 | exchange_location | varchar | 64 | 0 | Y | N | 交换地点 | |
10 | book_introduction | text | 65535 | 0 | Y | N | 图书介绍 | |
11 | hits | int | 10 | 0 | N | N | 0 | 点击数 |
12 | praise_len | int | 10 | 0 | N | N | 0 | 点赞数 |
13 | examine_state | varchar | 16 | 0 | N | N | 未审核 | 审核状态 |
14 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
15 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | book_types_id | int | 10 | 0 | N | Y | 图书类型ID | |
2 | book_types | varchar | 64 | 0 | Y | N | 图书类型 | |
3 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
-
- 表feedback (意见反馈)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | feedback_id | int | 10 | 0 | N | Y | 意见反馈ID | |
2 | regular_users | int | 10 | 0 | Y | N | 0 | 普通用户 |
3 | user_name | varchar | 64 | 0 | Y | N | 用户名称 | |
4 | feedback_title | varchar | 64 | 0 | Y | N | 反馈标题 | |
5 | feedback_time | date | 10 | 0 | Y | N | 反馈时间 | |
6 | feedback_content | text | 65535 | 0 | Y | N | 反馈内容 | |
7 | examine_state | varchar | 16 | 0 | N | N | 未审核 | 审核状态 |
8 | examine_reply | varchar | 16 | 0 | Y | N | 审核回复 | |
9 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
10 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
-
- 表forum (论坛)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | forum_id | mediumint | 8 | 0 | N | Y | 论坛id | |
2 | display | smallint | 5 | 0 | N | N | 100 | 排序 |
3 | user_id | mediumint | 8 | 0 | N | N | 0 | 用户ID |
4 | nickname | varchar | 16 | 0 | Y | N | 昵称:[0,16] | |
5 | praise_len | int | 10 | 0 | Y | N | 0 | 点赞数 |
6 | hits | int | 10 | 0 | N | N | 0 | 访问数 |
7 | title | varchar | 125 | 0 | N | N | 标题 | |
8 | keywords | varchar | 125 | 0 | Y | N | 关键词 | |
9 | description | varchar | 255 | 0 | Y | N | 描述 | |
10 | url | varchar | 255 | 0 | Y | N | 来源地址 | |
11 | tag | varchar | 255 | 0 | Y | N | 标签 | |
12 | img | text | 65535 | 0 | Y | N | 封面图 | |
13 | content | longtext | 2147483647 | 0 | Y | N | 正文 | |
14 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
15 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
16 | avatar | varchar | 255 | 0 | Y | N | 发帖人头像: | |
17 | type | varchar | 64 | 0 | N | N | 0 | 论坛分类:[0,1000]用来搜索指定类型的论坛帖 |
-
- 表message (留言板)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | message_id | int | 10 | 0 | N | Y | 留言板ID: | |
2 | user_id | int | 10 | 0 | N | N | 0 | 用户ID: |
3 | title | varchar | 64 | 0 | Y | N | 标题: | |
4 | content | longtext | 2147483647 | 0 | N | N | 内容: | |
5 | nickname | varchar | 32 | 0 | N | N | 昵称: | |
6 | avatar | varchar | 255 | 0 | Y | N | 头像: | |
7 | | varchar | 125 | 0 | Y | N | 留言者邮箱 | |
8 | phone | varchar | 11 | 0 | Y | N | 留言者手机号码 | |
9 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
10 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
11 | reply | longtext | 2147483647 | 0 | Y | N | 回复 | |
12 | reply_state | tinyint | 4 | 0 | Y | N | 0 | 回复状态 |
-
- 表reading_notes (读书笔记)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | reading_notes_id | int | 10 | 0 | N | Y | 读书笔记ID | |
2 | regular_users | int | 10 | 0 | Y | N | 0 | 普通用户 |
3 | user_name | varchar | 64 | 0 | Y | N | 用户名称 | |
4 | book_name | varchar | 64 | 0 | Y | N | 图书名称 | |
5 | book_types | varchar | 64 | 0 | Y | N | 图书类型 | |
6 | book_authors | varchar | 64 | 0 | Y | N | 图书作者 | |
7 | note_images | longtext | 2147483647 | 0 | Y | N | 笔记图片 | |
8 | hits | int | 10 | 0 | N | N | 0 | 点击数 |
9 | praise_len | int | 10 | 0 | N | N | 0 | 点赞数 |
10 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
11 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
-
- 表slides (轮播图)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | slides_id | int | 10 | 0 | N | Y | 轮播图ID: | |
2 | title | varchar | 64 | 0 | Y | N | 标题: | |
3 | content | varchar | 255 | 0 | Y | N | 内容: | |
4 | url | varchar | 255 | 0 | Y | N | 链接: | |
5 | img | varchar | 255 | 0 | Y | N | 轮播图: | |
6 | hits | int | 10 | 0 | N | N | 0 | 点击量: |
7 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
-
- 表exchange_location (交换地点)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | exchange_location_id | int | 10 | 0 | N | Y | 交换地点ID | |
2 | exchange_location | varchar | 64 | 0 | Y | N | 交换地点 | |
3 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
4 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | exchange_records_id | int | 10 | 0 | N | Y | 交换记录ID | |
2 | exchange_users | int | 10 | 0 | Y | N | 0 | 交换用户 |
3 | user_name | varchar | 64 | 0 | Y | N | 用户名称 | |
4 | publish_users | int | 10 | 0 | Y | N | 0 | 发布用户 |
5 | book_name | varchar | 64 | 0 | Y | N | 图书名称 | |
6 | exchange_time | datetime | 19 | 0 | Y | N | 交换时间 | |
7 | exchange_content | text | 65535 | 0 | Y | N | 交换内容 | |
8 | examine_state | varchar | 16 | 0 | N | N | 未审核 | 审核状态 |
9 | examine_reply | varchar | 16 | 0 | Y | N | 审核回复 | |
10 | create_time | datetime | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间 |
11 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间 |
-
- 表forum_type (论坛分类)
编号 | 名称 | 数据类型 | 长度 | 小数位 | 允许空值 | 主键 | 默认值 | 说明 |
1 | type_id | smallint | 5 | 0 | N | Y | 分类ID:[0,10000] | |
2 | name | varchar | 16 | 0 | N | N | 分类名称:[2,16] | |
3 | description | varchar | 255 | 0 | Y | N | 描述:[0,255]描述该分类的作用 | |
4 | url | varchar | 255 | 0 | Y | N | 外链地址:[0,255]如果该分类是跳转到其他网站的情况下,就在该URL上设置 | |
5 | father_id | smallint | 5 | 0 | N | N | 0 | 上级分类ID:[0,32767] |
6 | icon | varchar | 255 | 0 | Y | N | 分类图标: | |
7 | create_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 创建时间: |
8 | update_time | timestamp | 19 | 0 | N | N | CURRENT_TIMESTAMP | 更新时间: |
为确保系统安全性,系统操作员只有在登录界面输入正确的用户名、密码、权限以及验证码,单击“登录”按钮后才能够进入本系统的主界面。
用户登录流程图如下所示。
图4-1用户登录流程图
登录界面如下图所示。
登录关键代码如下所示。
/**
* 登录
* @param data
* @param httpServletRequest
* @return
*/
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
log.info("[执行登录接口]");
String username = data.get("username");
String email = data.get("email");
String phone = data.get("phone");
String password = data.get("password");
List resultList = null;
Map<String, String> map = new HashMap<>();
if(username != null && "".equals(username) == false){
map.put("username", username);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.select(map, new HashMap<>()).getResultList();
}else{
return error(30000, "账号或密码不能为空");
}
if (resultList == null || password == null) {
return error(30000, "账号或密码不能为空");
}
//判断是否有这个用户
if (resultList.size()<=0){
return error(30000,"用户不存在");
}
User byUsername = (User) resultList.get(0);
Map<String, String> groupMap = new HashMap<>();
groupMap.put("name",byUsername.getUserGroup());
List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();
if (groupList.size()<1){
return error(30000,"用户组不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查询用户审核状态
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
String res = String.valueOf(service.runCountSql(sql).getSingleResult());
if (res==null){
return error(30000,"用户不存在");
}
if (!res.equals("已通过")){
return error(30000,"该用户审核未通过");
}
}
//查询用户状态
if (byUsername.getState()!=1){
return error(30000,"用户非可用状态,不能登录");
}
String md5password = service.encryption(password);
if (byUsername.getPassword().equals(md5password)) {
// 存储Token到数据库
AccessToken accessToken = new AccessToken();
accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
accessToken.setUser_id(byUsername.getUserId());
tokenService.save(accessToken);
// 返回用户信息
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
user.put("token", accessToken.getToken());
JSONObject ret = new JSONObject();
ret.put("obj",user);
return success(ret);
} else {
return error(30000, "账号或密码不正确");
}
}
用户点击首页的通知公告栏可以查看所有通知公告列表,可以点击某个公告进行查看,可以在公告界面下方进行点赞、评论发布等,公告信息由后台管理员进行增删改查操作。
通知公告数据展示界面如下图所示。
图4-3通知公告界面图
通知公告关键代码如下所示。
@RequestMapping("/get_list")
public Map<String, Object> getList(HttpServletRequest request) {
Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));
return success(map);
}
-
- 闲书商城模块的实现
用户点击闲书商城,可以浏览商城内的图书信息,可以点击某个图书进行详情查看,也可以在界面的搜索界面输入关键字眼进行图书的搜索。
闲书商城界面如下所示。
图4-4闲书商城界面
闲书商城关键代码如下所示。
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
service.insert(service.readBody(request.getReader()));
return success(1);
}
@Transactional
public Map<String, Object> addMap(Map<String,Object> map){
service.insert(map);
return success(1);
}
public Map<String,Object> readBody(BufferedReader reader){
BufferedReader br = null;
StringBuilder sb = new StringBuilder("");
try{
br = reader;
String str;
while ((str = br.readLine()) != null){
sb.append(str);
}
br.close();
String json = sb.toString();
return JSONObject.parseObject(json, Map.class);
}catch (IOException e){
e.printStackTrace();
}finally{
if (null != br){
try{
br.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
return null;
}
public void insert(Map<String,Object> body){
StringBuffer sql = new StringBuffer("INSERT INTO ");
sql.append("`").append(table).append("`").append(" (");
for (Map.Entry<String,Object> entry:body.entrySet()){
sql.append("`"+humpToLine(entry.getKey())+"`").append(",");
}
sql.deleteCharAt(sql.length()-1);
sql.append(") VALUES (");
for (Map.Entry<String,Object> entry:body.entrySet()){
Object value = entry.getValue();
if (value instanceof String){
sql.append("'").append(entry.getValue()).append("'").append(",");
}else {
sql.append(entry.getValue()).append(",");
}
}
sql.deleteCharAt(sql.length() - 1);
sql.append(")");
log.info("[{}] - 插入操作:{}",table,sql);
Query query = runCountSql(sql.toString());
query.executeUpdate();
}
-
- 图书购买模块的实现
图书购买功能整体流程:用户点击图书,系统跳转至图书购买详情页面,用户核对好订单编号、商品名称、购买数量、交易总额信息之后,在线购买操作,进行费用支付。
图书购买流程图如下图所示。
图4-5图书购买流程图
图书购买界面如下图所示。
图4-6图书购买界面
闲书商城管理关键代码如下所示。
@RequestMapping("/get_obj")
public Map<String, Object> obj(HttpServletRequest request) {
Query select = service.select(service.readQuery(request), service.readConfig(request));
List resultList = select.getResultList();
if (resultList.size() > 0) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("obj",resultList.get(0));
return success(jsonObject);
} else {
return success(null);
}
}
public Query select(Map<String,String> query,Map<String,String> config){
StringBuffer sql = new StringBuffer("select ");
sql.append(config.get(FindConfig.FIELD) == null || "".equals(config.get(FindConfig.FIELD)) ? "*" : config.get(FindConfig.FIELD)).append(" ");
sql.append("from ").append("`").append(table).append("`").append(toWhereSql(query, "0".equals(config.get(FindConfig.LIKE))));
if (config.get(FindConfig.GROUP_BY) != null && !"".equals(config.get(FindConfig.GROUP_BY))){
sql.append("group by ").append(config.get(FindConfig.GROUP_BY)).append(" ");
}
if (config.get(FindConfig.ORDER_BY) != null && !"".equals(config.get(FindConfig.ORDER_BY))){
sql.append("order by ").append(config.get(FindConfig.ORDER_BY)).append(" ");
}
if (config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE))){
int page = config.get(FindConfig.PAGE) != null && !"".equals(config.get(FindConfig.PAGE)) ? Integer.parseInt(config.get(FindConfig.PAGE)) : 1;
int limit = config.get(FindConfig.SIZE) != null && !"".equals(config.get(FindConfig.SIZE)) ? Integer.parseInt(config.get(FindConfig.SIZE)) : 10;
sql.append(" limit ").append( (page-1)*limit ).append(" , ").append(limit);
}
log.info("[{}] - 查询操作,sql: {}",table,sql);
return runEntitySql(sql.toString());
}
此页面的关键是编写图书,包括图书编号、封面、图书名称、作者、库存、图书介绍等。单击提交按钮以完成信息的添加。如果未写入完整的图书,例如,如果未写入图书编号,系统将给出相应的错误提示,并且无法成功输入。数据以概念的形式以onsubmit =“return checkForm()”的形式写入以进行检查,checkForm()函数是一种用于写入数据的不同类型的校对方法,是不是为空也是经过form表单中的οnsubmit=”return checkForm()来检查。
图书添加流程图如下图所示。
图4-7图书添加流程图
闲书商城管理界面如下图所示。
图4-8闲书商城管理界面图
闲书商城管理关键代码如下所示。
@PostMapping("/set")
@Transactional
public Map<String, Object> set(HttpServletRequest request) throws IOException {
service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));
return success(1);
}
public Map<String,String> readConfig(HttpServletRequest request){
Map<String,String> map = new HashMap<>();
map.put(FindConfig.PAGE,request.getParameter(FindConfig.PAGE));
map.put(FindConfig.SIZE,request.getParameter(FindConfig.SIZE));
map.put(FindConfig.LIKE,request.getParameter(FindConfig.LIKE));
map.put(FindConfig.ORDER_BY,request.getParameter(FindConfig.ORDER_BY));
map.put(FindConfig.FIELD,request.getParameter(FindConfig.FIELD));
map.put(FindConfig.GROUP_BY,request.getParameter(FindConfig.GROUP_BY));
map.put(FindConfig.MAX_,request.getParameter(FindConfig.MAX_));
map.put(FindConfig.MIN_,request.getParameter(FindConfig.MIN_));
return map;
}
public Map<String,String> readQuery(HttpServletRequest request){
String queryString = request.getQueryString();
if (queryString != null && !"".equals(queryString)) {
String[] querys = queryString.split("&");
Map<String, String> map = new HashMap<>();
for (String query : querys) {
String[] q = query.split("=");
map.put(q[0], q[1]);
}
map.remove(FindConfig.PAGE);
map.remove(FindConfig.SIZE);
map.remove(FindConfig.LIKE);
map.remove(FindConfig.ORDER_BY);
map.remove(FindConfig.FIELD);
map.remove(FindConfig.GROUP_BY);
map.remove(FindConfig.MAX_);
map.remove(FindConfig.MIN_);
return map;
}else {
return new HashMap<>();
}
}
@Transactional
public void update(Map<String,String> query,Map<String,String> config,Map<String,Object> body){
StringBuffer sql = new StringBuffer("UPDATE ").append("`").append(table).append("`").append(" SET ");
for (Map.Entry<String,Object> entry:body.entrySet()){
Object value = entry.getValue();
if (value instanceof String){
sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append("'").append(value).append("'").append(",");
}else {
sql.append("`"+humpToLine(entry.getKey())+"`").append("=").append(value).append(",");
}
}
sql.deleteCharAt(sql.length()-1);
sql.append(toWhereSql(query,"0".equals(config.get(FindConfig.LIKE))));
log.info("[{}] - 更新操作:{}",table,sql);
Query query1 = runCountSql(sql.toString());
query1.executeUpdate();
}
public String toWhereSql(Map<String,String> query, Boolean like) {
if (query.size() > 0) {
try {
StringBuilder sql = new StringBuilder(" WHERE ");
for (Map.Entry<String, String> entry : query.entrySet()) {
if (entry.getKey().contains(FindConfig.MIN_)) {
String min = humpToLine(entry.getKey()).replace("_min", "");
sql.append("`"+min+"`").append(" >= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
continue;
}
if (entry.getKey().contains(FindConfig.MAX_)) {
String max = humpToLine(entry.getKey()).replace("_max", "");
sql.append("`"+max+"`").append(" <= '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("' and ");
continue;
}
if (like == true) {
sql.append("`"+humpToLine(entry.getKey())+"`").append(" LIKE '%").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("%'").append(" and ");
} else {
sql.append("`"+humpToLine(entry.getKey())+"`").append(" = '").append(URLDecoder.decode(entry.getValue(), "UTF-8")).append("'").append(" and ");
}
}
sql.delete(sql.length() - 4, sql.length());
sql.append(" ");
return sql.toString();
} catch (UnsupportedEncodingException e) {
log.info("拼接sql 失败:{}", e.getMessage());
}
}
return "";
}
1、服务器端
操作系统:Windows 7
Web服务器:Tomcat7.0
数据库:Mysql
开发语言:Java
2、客户端
浏览器:Internet Explorer10
界面布局:DIV+CSS
分辨率:最佳效果1027*768以上像素
3、开发工具
Visual Studio Code
Myeclipse
系统测试是用于检查软件的质量、性能、可靠性等是否符合用户需求。一套严谨的、规范的、完善的测试过程将大大提高软件的质量、可信度、可靠性,降低软件的出错率,降低用户风险系数。通过在计算机上对系统进行测试试验并从中发现此系统中存在的问题和错误然后加以修改,使之更加符合用户需求。
1.测试的目的是通过测试来发现程序在执行过程中的错误的过程。
2.好的测试方案是可以检验出还未被发现的错误的方案。
3.好的测试是发现了到目前为止还未被发现的错误的测试。
4.该系统能够完成用户管理、闲书商城、读书笔记、交流论坛等功能,做到所开发的系统操作简单,尽量使系统操作不受用户对电脑知识水平的限制。
下表是系统登录功能测试用例,检测了用户名和密码的不同的输入情况,观察系统的响应情况。得出该功能达到了设计目标。
表5-1 系统登录功能测试用例
功能描述 | 用于系统登录 | |
测试目的 | 检测登录时的合法性检查 | |
测试数据以及操作 | 预期结果 | 实际结果 |
输入的用户名和密码带有非法字符 | 提示用户名或者密码错误 | 与预期结果一致 |
输入的用户名或者密码为空 | 提示用户名或者密码错误 | 与预期结果一致 |
输入的用户名和密码不存在 | 提示用户名或者密码错误 | 与预期结果一致 |
输入正确的用户名和密码 | 登录成功 | 与预期结果一致 |
下表是注册功能测试用例,检测了各种数据的输入情况,观察系统的响应情况。得出该功能达到了设计目标。
表5-2 注册功能测试用例
功能描述 | 用于用户注册 | |
测试目的 | 检测用户注册时的合法性检查 | |
测试数据以及操作 | 预期结果 | 实际结果 |
输入的手机号不合法 | 提示请输入正确的手机号码 | 与预期结果一致 |
输入的字段为空 | 提示必填项不能为空 | 与预期结果一致 |
输入的密码少于6位 | 提示密码必须为6-12位 | 与预期结果一致 |
输入的密码大于12位 | 提示密码必须为6-12位 | 与预期结果一致 |
下表是小学校园“闲书”交易平台功能的测试用例,检测了小学校园“闲书”交易平台中对图书信息的增删改查操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
前置条件;卖家登录系统。
表5-3图书信息管理的测试用例
功能描述 | 用于图书信息管理 | |
测试目的 | 检测图书信息管理时的各种操作的运行情况 | |
测试数据以及操作 | 预期结果 | 实际结果 |
点击添加图书信息,必填项合法输入,点击保存 | 提示添加成功 | 与预期结果一致 |
点击添加图书信息,必填项输入不合法,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击修改图书信息,必填项修改为空,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击修改图书信息,必填项输入不合法,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击删除图书信息,选择图书信息删除 | 提示删除成功 | 与预期结果一致 |
点击搜索图书信息,输入存在的图书信息名 | 查找出图书信息 | 与预期结果一致 |
点击搜索图书信息 ,输入不存在的在线投票名 | 不显示图书信息 | 与预期结果一致 |
下表是图书购买功能的测试用例,检测了图书购买的操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
前置条件;用户登录系统。
表5-4 图书购买的测试用例
功能描述 | 用于图书购买 | |
测试目的 | 检测图书购买时各种操作的情况 | |
测试数据以及操作 | 预期结果 | 实际结果 |
未选择图书购买,点击提交 | 提示请选择图书购买 | 与预期结果一致 |
未完善购买信息,点击提交 | 提示请完善信息 | 与预期结果一致 |
下表是订单配送功能的测试用例,检测了订单配送的操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
前置条件;卖家登录系统。
表5-5 订单配送的测试用例
功能描述 | 用于订单配送 | |
测试目的 | 检测订单配送时各种操作的情况 | |
测试数据以及操作 | 预期结果 | 实际结果 |
未填写订单配送信息,点击提交 | 提示请编辑订单配送信息 | 与预期结果一致 |
未完善配送信息,点击提交 | 提示请完善信息 | 与预期结果一致 |
-
- 测试结果
根据以上测试情况,测试结果如下表所示。
表5-6测试结果表
测试项目 | 测试结果 |
用户注册测试 | 成功 |
用户登录测试 | 成功 |
图书信息管理测试 | 成功 |
图书购买测试 | 成功 |
订单配送测试 | 成功 |
经过了几个月的努力,本小学校园“闲书”交易平台终于完成了,虽然在校期间也开发过一些小型的系统,但是都是在老师的讲解以及辅助下完成的,没有经历过开发之前的需求分析、系统分析,都是直接从系统设计开始的,因此本次开发的小学校园“闲书”交易平台对我意义重大。
在开发系统最初,首先对各个功能方面的需求进行调研,了解对于用户来说,开发的系统需要实现哪些功能才能满足其实际需求,对需求进行分析;其次选择自己比较熟悉的Java语言,Mysql数据库,使用Springboot框架来设计开发,通过知网库、学校图书馆等地方查阅、学习这些技术,掌握编程的思想和方法,然后就是对系统进行分析,从系统开发的可行性、系统实现的功能、系统应该具备的性能以及系统的操作流程方面,对系统进行全方位的分析,确定系统的最终功能,从而对系统的功能和数据库进行设计,最后就是系统的实现以及对实现的功能的测试,确保系统能够稳定的运行。
在开发的过程中暴露出了自己的很多问题,比如前期的准备还是不够充分,不能完全掌握其操作流程;在开发过程中对Java的编程掌握的还不够熟练以及对系统的环境配置上还存在很多问题,经常会导致项目在运行的时候出现错误。学无止境,通过一边查阅资料一边向导师请教,慢慢的解决了这些问题,在以后的学习、工作者我会更加严谨,通过本项目的开发,我将会收益终生!
参考文献
[1]陈蓓蕾,洪年松. 基于SpringBoot的数据库接口设计 [J]. 信息与电脑(理论版), 2023, 35 (16): 181-183.
[2]孟思明. 基于SpringBoot框架选购系统的设计与实现 [J]. 中国设备工程, 2023, (11): 94-95.
[3]饶锎月. 可持续商业模式下垂直类二手交易平台服务设计研究[D]. 江南大学, 2023.
[4]王志亮,纪松波. 基于SpringBoot的Web前端与数据库的接口设计 [J]. 工业控制计算机, 2023, 36 (03): 51-53.
[5]Yang Y . Design and Implementation of Student Information Management System Based on Springboot [J]. Advances in Computer, Signals and Systems, 2022, 6 (6):
[6]张威威,郗文豪. 校园二手书交易网站设计与制作 [J]. 现代信息科技, 2022, 6 (14): 35-37+41.
[7]李东亮. 共享发展理念下的闲置图书平台设计研究[D]. 东北石油大学, 2022.
[8]顾明. “多抓鱼”二手书交易平台服务营销策略研究[D]. 吉林大学, 2022.
[9]段春云,王海博. 互联网下大学生二手交易平台的物流网络优化研究 [J]. 中国储运, 2021, (12): 199-201.
[10]郭岩. 二手书网络交易平台的营销策略研究[D]. 陕西师范大学, 2021.
[11]Cheng F . Talent Recruitment Management System for Small and Micro Enterprises Based on Springboot Framework [J]. Advances in Educational Technology and Psychology, 2021, 5 (2):
[12]刘艺璇. 新零售业态下旧书店的经营与发展研究[D]. 河北大学, 2021.
[13]余丽娜. 校园二手图书交易网站设计与实现 [J]. 电脑知识与技术, 2020, 16 (13): 78-79.
[14]郑青青. 网络二手书平台经营现状与创新策略研究[D]. 苏州大学, 2020.
[15]蔡思琴. 我国二手书交易平台竞争战略研究[D]. 南京大学, 2019.
致谢
本逝者如斯夫,不舍昼夜。转眼间,大学生活已经接近尾声,人面对着离别与结束,总是充满着不舍与茫然,我亦如此,仍记得那年秋天,我迫不及待的提前一天到了学校,面对学校巍峨的大门,我心里充满了期待:这里,就是我新生活的起点吗?那天,阳光明媚,学校的欢迎仪式很热烈,我面对着一个个对着我微笑的同学,仿佛一缕缕阳光透过胸口照进了我心里,同时,在那天我认识可爱的室友,我们携手共同度过了这难忘的两年。如今,我望着这篇论文的致谢,不禁又要问自己:现在,我们就要说再见了吗?
感慨莫名,不知所言。遥想当初刚来学校的时候,心里总是想着工科学校会过于板正,会缺乏一些柔情,当时心里甚至有一点点排斥,但是随着我对学校的慢慢认识与了解,我才认识到了她的美丽,她的柔情,并且慢慢的喜欢上了这个校园,但是时间太快了,快到我还没有好好体会她的美丽便要离开了,但是她带给我的回忆,永远不会离开我,也许真正离开那天我的眼里会满含泪水,我不是因为难过,我只是想将她的样子映在我的泪水里,刻在我的心里。最后,感谢我的老师们,是你们教授了我们知识与做人的道理;感谢我的室友们,是你们陪伴了我如此之久;感谢每位关心与支持我的人。
少年,追风赶月莫停留,平荒尽处是春山。
免费领取项目源码,请关注❥点赞收藏并私信博主,谢谢~