E-Dobavki - 一个用 Java 和 Spring Boot 搜索食品添加剂的网络服务,由我的学生编写

介绍

碰巧的是,过去近两年我一直在基辅的一所IT学校教编程。我最初创办这个网站纯粹是出于兴趣。我以前运营过一个编程博客,后来放弃了。但我与感兴趣的人分享有用信息的愿望从未消失。

我的主要编程语言是Java。我用它编写过手机游戏、无线电通信软件和各种Web服务。Java也是我教授的语言。

我想在这里讲述一下我上一期培训班的故事。他们如何从培训伊始,最终编写出一个可用的网络服务。这是一个方便查找膳食补充剂的网络服务。免费、无广告、无需注册、无需短信。

服务本身就在这里—— E-Dobavki.com.

E-Dobavki - 一个用 Java 和 Spring Boot 搜索食品添加剂的网络服务,由我的学生编写

该项目旨在教育目的,不包含任何广告。据我了解, 本出版物您可以提供此类项目的链接。

在介绍项目本身之前,我将先简要介绍一下团队的培训过程;如果没有这部分内容,对项目的描述就不完整。

9个月的培训

在我任教的学校,Java课程分为两部分。整个课程大约需要九个月时间,包括假期(新年假期、撰写期中项目的时间)。

第一部分向学生介绍编程语言的基本概念,包括变量、方法、面向对象编程基础知识等等。

课程的第二部分假定学生已经对 Java 编程有了一定的了解,并能够接触到更成熟的技术栈。课程从 SQL 开始,然后是 JDBC 和 Hibernate,接着是 HTTP 和 Servlet,之后是 Spring,以及一些关于 Git 和 Maven 的内容。最后,学生们将完成他们的最终项目。

整个培训分为多个模块。我每周授课两次,每次课两小时。

我的教学方法

我带了五个班的学生毕业。两年内带完五个班听起来很多,但我几乎总是同时教两个班。

我尝试了不同的方法。

第一种方法是安排一组学生进行理论讲解,另一组学生进行实践讲解。这种方法虽然可行,但我觉得效果并不理想。

我目前采用的第二种方法是避免用整节课的时间讲解理论。相反,我会穿插一些5到10分钟的简短理论讲解,并立即用实际例子加以巩固。这种方法效果更好。

如果时间允许,我会叫学生们到我的办公桌前,让他们坐在我的笔记本电脑前,然后让他们自己完成练习题。这种方法效果很好,但可惜的是,非常耗时。

并非每个人都能走到最后。

让我感到惊讶的是,并非所有学员都能完成整个课程。

据我观察,只有一半的学生会完成最终项目。大多数学生在课程的第一阶段就退出了。而那些坚持到第二阶段的学生通常都会继续学下去。

他们离开的原因各不相同。

首先是复杂性。不管别人怎么说,Java 都不是最容易掌握的语言。即使是编写最简单的程序,你也需要理解类和方法的概念。而且,你还需要理解为什么需要编写…… public static void main(String[] arg) 还有一些概念需要理解。

相比之下,Turbo Pascal 是许多人(包括我)的入门语言:

begin
    writeln("Первая программа");
end.

据我所知,学校将通过增加测试来解决这个问题。当然,这样一来,就不是每个人都能学习Java了。目前这还处于概念阶段,但这显然是正确的举措。

第二个原因如下图所示:

E-Dobavki - 一个用 Java 和 Spring Boot 搜索食品添加剂的网络服务,由我的学生编写

人们常常认为编程就是敲很多文字然后赚很多钱。这就像做文案撰稿人,只不过收入更高而已。

实际情况略有不同。其中包含大量日常编码工作、难以发现的漏洞,以及持续不断的学习过程。这很有趣,但并不适合所有人。

这是统计数据。起初,我挺沮丧的;我以为是不是自己哪里做错了。现在我意识到,大多数课程的统计数据都差不多。现在我不再为此烦恼了;我只教那些感兴趣的人。

这项服务的理念

学生们完成所有课程后,就到了撰写最终项目的时候了。大家提出了各种各样的想法,比如待办事项清单、项目管理项目等等。

我想要开发一款简单实用的产品。我的标准很简单:我和我的朋友们能用得上吗?一款用于查找膳食补充剂的网站服务符合这些要求。

这个想法很简单。当你在商店购买商品时,你会看到成分表中列出某种E编号的添加剂。但这个代码并不能告诉你它有多危险(而且很多国家都禁用某些危险添加剂)。

你打开网站,输入补充剂的名称(编号,或别名之一),即可获得该补充剂的摘要:

E-Dobavki - 一个用 Java 和 Spring Boot 搜索食品添加剂的网络服务,由我的学生编写

还有其他类似的项目。你也可以直接在谷歌搜索栏里输入插件名称,不过搜索结果并不总是能正确显示信息。

但由于这个项目具有教育意义,上述困难并没有阻止我们🙂

履行

大家都是用Java编写的, 该项目的源代码托管在 GitHub 上。.

我们一共七个人,包括我。每个人都会提交一个拉取请求,然后由我或者组里的其他人接受。

从最初的想法到你今天看到的成果,这个项目大约花了一个月的时间才完成。

解析插件

其中一名学生做的第一件事,除了创建基本数据库框架(实体、存储库等)之外,就是解析现有信息站点的插件。

这是测试其他功能所必需的。无需编写额外的代码来填充数据库。快速解析了一些新增数据后,我们就可以继续测试用户界面、排序和筛选功能了。

Spring Boot 允许您创建多个配置文件。配置文件是一个包含设置的文件。

在开发环境中,我们使用了一个配置了本地 H2 数据库管理系统和默认 HTTP 端口 (8080) 的配置文件。这确保了每次应用程序启动时数据库都会被清空。解析器在这种情况下发挥了关键作用。

搜索和过滤

搜索和筛选功能至关重要。商店用户应该能够快速输入补充剂代码或任何产品名称,并获得搜索结果。

因此,添加剂实体包含多个字段,包括添加剂代码、别名和描述。搜索会同时跨所有字段进行匹配。无论您输入 [123] 还是 [amaranth],都会得到相同的结果。

我们使用规范完成了所有这些操作。Spring 的规范部分允许您描述基本的搜索条件(例如,按特定字段搜索),然后将这些条件组合起来(OR 或 AND)。

通过编写十几个规范,您可以创建复杂的查询,例如“所有描述中包含[红色]一词的危险着色剂”。

我发现 Spring 在数据库操作方面非常方便,尤其是在处理复杂查询时。我知道这会带来一些开销,手动编写并优化 SQL 查询会更快。

但我认为没有必要一开始就对所有部分进行优化。第一个版本应该能够启动、运行,并且允许替换单个组件。如果负载增加,则需要重写这些组件。

安保防护

很简单。有些用户拥有管理员角色——他们可以编辑插件、删除插件以及添加新的插件。

还有其他用户(无论是否注册)。他们只能浏览插件列表,并搜索自己需要的插件。

Spring Security 用于权限隔离。用户数据存储在数据库中。

用户可以注册。目前,注册没有任何实际好处。如果学生们继续完善这项服务并引入个性化功能,注册将会变得有用。

响应式设计和 Bootstrap

下一点是适应性。就我们的服务而言(至少据我们观察),大多数用户都会使用手机。而通过移动设备,用户需要能够快速查看插件。

为了避免编写 CSS 的麻烦,我们使用了 Bootstrap。它价格低廉、界面友好,而且看起来也不错。

我不会说这个界面完美无缺。主页基本还可以,但补充信息页面太窄了;在移动设备上需要更宽一些。

我只能说,我尽量少干预他们的工作。毕竟,这是个学生项目。当然,学生们之后也能解决这些问题。

一分钟SEO优化

由于我从事网站和 SEO 相关工作已经两年多了,所以我不可能发布一个没有至少基本的 SEO 优化的项目。

实际上,我为每个补充材料都创建了模板生成的标题和描述。URL 已经相当友好,虽然还可以更短一些。

我还添加了流量计数器。我已将网站添加到 Yandex 网站管理员工具和 Google Search Console,以便监控搜索引擎警告。

这还不够。我们还需要添加 robots.txt 和 sitemap.xml 文件才能实现完整索引。不过话说回来,这只是个学生项目。我会告诉他们需要做什么,如果他们愿意,他们就会去做。

你需要添加一个 SSL 证书。免费的 Let's Encrypt 就可以。我之前在 Spring Boot 项目中就是这么做的。这很简单,而且还能提高搜索引擎的信任度。

该项目下一步是什么?

剩下的基本上就看他们的了。最初的项目构想还包括一个产品数据库,其中包含指向营养补充剂的链接。

输入“士力架”,看看它含有哪些食品添加剂。

项目伊始,我就知道我们不会生产任何食品🙂 所以我们一开始只生产添加剂。

现在您可以添加产品并实现其他功能。如果数据库内容全面,就能找到用户。

部署方式

该项目部署在 Aruba Cloud 的虚拟专用服务器 (VPS) 上。这是我们能找到的最便宜的 VPS。我使用这家服务商的服务已经一年多了,非常满意。

VPS配置:1GB内存,1颗CPU(我不知道主频),20GB固态硬盘。这对于我们的项目来说绰绰有余。

该项目使用标准的 `mvn clean package` 命令构建。生成的包是一个包含所有依赖项的胖 JAR 文件——一个可执行文件。

为了使这些操作稍微自动化一些,我编写了一些 bash 脚本。

第一个脚本会删除旧的 jar 文件并创建一个新的 jar 文件。

第二个脚本运行编译好的 jar 文件,并传入所需配置文件的名称。该配置文件包含数据库连接信息。

数据库 - MySQL,位于同一台 VPS 上。

项目重启总共包括:

  • 通过 SSH 访问 VPS。
  • 下载最新的 Git 编辑版本
  • 运行 local-jar.sh
  • 终止正在运行的应用程序
  • 运行 launch-production.sh

这个过程需要三分钟,对于这样一个小型项目来说,这似乎是一个合理的选择。

复杂性

项目创建过程中遇到的主要困难是组织方面的困难。

有一群人似乎懂编程,但水平不高。他们掌握了一些知识,但还无法真正运用。而现在,他们需要在一个月内完成一个项目。

我为这个团队指派了一位名义上的团队负责人。他们维护着一个包含任务清单的 Google 文档,负责分配任务并监控任务的完成情况。他们也接受拉取请求。

我还要求学生们每天晚上写一份关于项目工作的简短报告。如果他们什么都没做,也没关系,就写“什么都没做”。这是一个很好的练习,能迫使你稍微挑战一下自己。可惜的是,并非所有人都遵守了这条规定。

所有这些活动的目的很简单:组建一个团队,即使只是短暂的,也要共同努力。

我希望团队成员能感受到他们的工作意义重大。他们希望明白,他们编写的代码并非孤立存在,而是在一个最终会被人们使用的项目上共同协作。

头一两周进展比较缓慢。创作和提交进度都很慢。但一点一点地,我终于让一切步入正轨,工作也变得更加有趣。聊天内容变得更加活跃,学生们也开始贡献自己的力量。

我认为目标已经达成。项目已经完成,团队成员也积累了一定的团队合作经验。我们已经取得了看得见摸得着的成果,可以向朋友们展示,并进行进一步的开发。

发现

学习很有趣。

每次下课后,我都情绪激动。我力求让每一堂课都独具特色,并尽可能多地传授知识。

看到我指导的团队打进决赛,我感到非常欣慰。尤其当队员们写信告诉我“我找到工作了,一切都好,谢谢”时,我更是激动不已。即使只是初级职位,即使一开始薪水不是最高的,但最重要的是,他们朝着梦想迈出了一步,而且他们成功了。

虽然这篇文章篇幅较长,但肯定无法涵盖所有​​要点。所以,请在评论区留下您的问题。

来源: habr.com

为具有 DDoS 保护、VPS VDS 服务器的站点购买可靠的主机 🔥 购买具备 DDoS 防护的可靠网站托管服务,包括 VPS 和 VDS 服务器 | ProHoster