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

介绍

碰巧的是,在过去的近两年里,我一直在基辅的一所 IT 学校教授编程。 我开始这样做只是为了好玩。 我曾经写过一个编程博客,然后我就放弃了。 但向感兴趣的人讲述有用的事情的愿望并没有消失。

我的主要语言是 Java。 我在上面编写了手机游戏、无线电通信软件以及各种网络服务。 我教 Java。

这里我想讲一下我上一组的训练故事。 他们如何从开始培训到编写可用的 Web 服务。 用于寻找营养补充剂的有用网络服务。 免费、无广告、无注册、无短信。

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

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

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

在描述项目本身之前,我将告诉你一些关于小组学习过程的信息;如果没有这些,图片将是不完整的。

9个月培训

在我任教的学校,Java 课程分为两部分。 总共,该课程大约需要 2 个月,其中包括所有休息时间(新年假期、编写中级项目的时间)。

第一部分向学生介绍语言的基本概念。 变量、方法、OOP 基础知识等等。

课程的第二部分规定,学生已经或多或少地了解了如何用 Java 编写,并且可以为他提供“成人”技术堆栈。 一切都从 SQL 开始,然后是 JDBC、Hibernate。 然后是 HTTP、Servlet。 接下来是Spring,介绍一下git 和maven。 学生们撰写期末项目。

所有培训都分为多个模块。 我每周上两次课。 一堂课的时间为两个小时。

我的学习方法

我发布了5组。 两年时间似乎很多,但我几乎总是同时领导两个小组。

我尝试过不同的方法。

第一个选项是分配一对进行理论演示。 第二对是纯练习。 在我看来,这种方法确实有效,但效果不是很好。

我现在正在研究的第二个选择是不要将全部精力投入到理论中。 相反,我会用 5 到 10 分钟混合简短的理论部分,并立即用实际例子进行强化。 这种方法效果更好。

如果有足够的时间,我会把学生叫到我的地方,让他们坐在我的笔记本电脑前,让他们自己做实际例子。 它效果很好,但不幸的是需要很多时间。

不是每个人都能走到最后

对我来说,一个启示是,并不是整个小组都完成了课程。

根据我的观察,只有一半的学生写出了期末项目。 他们中的大多数在课程的第一部分就被淘汰了。 而那些到达第二部分的人通常不会掉下来。

他们因为各种原因离开。

首先是复杂性。 不管他们怎么说,Java 都不是最简单的语言。 即使要编写最简单的程序,您也需要理解类、方法的概念。 并理解为什么你需要写 公共静态无效主(字符串[] arg) 还有几个概念需要理解。

将此与 Turbo Pascal 进行比较,这是许多人(包括我)开始使用的:

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

据我所知,学校将通过引入额外的测试来解决这个问题。 现在并不是每个人都能学习Java。 这仍处于概念阶段,但这一步骤显然是正确的。

第二个原因如下图所示:

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

人们常常认为编程就是输入大量文本并从中获得很多钱。 就像文案,只有更多的钱。

现实有点不同。 很多常规代码、不明显的错误、不断的学习过程。 这很有趣,但并不适合所有人。

这些是统计数据。 起初我很沮丧,我想也许我做错了什么。 现在我了解到大多数课程的统计数据大致相同。 现在我不担心了,而是教那些有兴趣的人。

服务理念

学生完成整个课程后,就可以编写期末项目了。 有不同的想法。 他们提供待办事项表、项目管理项目和其他东西。

我想做一些简单但有用的事情。 我的标准很简单——我和我的朋友是否可以使用它。 用于搜索食品添加剂的网络服务满足了这些要求。

这个想法很简单。 当您在商店购买产品时,您会在成分中看到某种电子添加剂。 从代码中并不清楚它有多危险(而且还有许多国家禁止的危险添加剂)。

您打开网站,输入补充名称(数字,替代名称之一),然后获得补充摘要:

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

还有类似的项目。 您也可以简单地在 Google 中输入添加剂,尽管它并不总是正确显示信息。

但由于该项目是教育性的,上述困难并没有阻止我们:)

履行

大家都用Java写的, Github上的项目源代码.

我们一共7个人,包括我。 每个人都提出了拉取请求,我或小组中的其他人接受了这个拉取请求。

项目的实施从提出想法到现在看到的状态大约花了一个月的时间。

解析添加剂

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

这是测试其余点所必需的。 不需要额外的代码来填充数据库。 快速解析了几个添加剂后,我们可以进一步测试 UI、排序和过滤。

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

对于开发环境,我们使用具有本地 H2 DBMS 和默认 HTTP 端口 (8080) 的配置文件。 因此,每次启动应用程序时,数据库都会被清除。 在这种情况下,解析器拯救了我们。

搜索和过滤

重要的一点是搜索和过滤。 商店里的人必须快速点击补充剂的代码或其中一个名称,然后得到结果。

因此,Additive 实体有几个字段。 这是附加代码、替代名称、描述。 搜索是在所有字段中同时使用 Like 进行的。 如果你输入[123]或[苋菜],你会得到相同的结果。

我们根据规范做了这一切。 这是 Spring 的一部分,允许您描述基本搜索条件(例如某些字段),然后组合这些条件(OR 或 AND)。

编写了十几个规格后,您可以提出复杂的查询,例如“描述中含有[红色]一词的所有危险着色添加剂”。

在使用Spring数据库方面,我发现它非常方便。 在处理复杂查询时尤其如此。 我知道这有其自身的开销,并且手动编写和优化的 SQL 查询将运行得更快。

但我也坚持这样的观点:没有必要提前优化一切。 第一个版本应该可以启动、工作并允许更换各个部件。 如果有负载,这些单独的部分就需要重写。

安保行业

这很简单。 有些用户具有 ADMIN 角色 - 他们可以编辑添加内容、删除添加内容以及添加新添加内容。

还有其他用户(注册或未注册)。 他们只能浏览添加剂列表并搜索他们需要的添加剂。

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

用户可以注册。 现在它没有给出任何东西。 如果学生继续开发服务并引入一些个性化功能,那么注册就会派上用场。

响应能力和引导程序

下一点是适应性。 就我们的服务而言(至少我们是这么认为的),大多数用户将使用手机。 并且您需要通过手机快速查看补充内容。

为了不遭受 CSS 的困扰,我们采用了 Bootstrap。 便宜,开朗,而且看起来不错。

我不能称这个界面是理想的。 主页更是如此,添加剂详细描述的页面很窄;在手机上需要做得更宽。

我只能说我尽量少干扰工作。 这仍然是一个学生项目。 当然,这些家伙稍后将能够纠正这些时刻。

一分钟 SEO 优化

由于我两年多以来一直密切关注网站和与 SEO 相关的一切,因此如果没有至少基本的 SEO 优化,我就无法发布项目。

事实上,我为每个附加组件制作了标题和描述的模板生成。 URL 几乎是 CNC,但可以更短。

我还添加了出勤计数器。 将该网站添加到 Yandex Webmaster 和 Google Search Console 以监控来自搜索引擎的警告。

那还不够。 您还需要添加 robots.txt 和 sitemap.xml 以进行完整索引。 但同样,这是一个学生项目。 我会告诉他们需要做什么,如果他们愿意,他们就会去做。

您需要附加 SSL 证书。 免费的 Let's Encrypt 也可以使用。 我为 Spring Boot 做了这个。 做起来并不难,PS的信任度也随之增加。

该项目的下一步是什么?

那么,事实上,选择权就在于球员们。 该项目的最初想法还包括一个带有添加剂链接的产品数据库。

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

即使在项目开始时,我就知道我们不会有任何产品:)因此,我们只从添加剂开始。

现在您可以添加产品并介绍其他产品。 包子。 如果是一个庞大的数据库,就会有用户。

部署方式

该项目部署在VPS、Aruba Cloud上。 这是我们能找到的最便宜的 VPS。 我已经在我的项目中使用这个提供商一年多了,我对此感到非常满意。

VPS特点:1 GB RAM,1个CPU(我不知道频率),20 GB SSD。 对于我们的项目来说这已经足够了。

该项目是使用通常的 mvn clean 包构建的。 结果是一个 fat jar - 一个具有所有依赖项的可执行文件。

为了使这一切自动化一点,我编写了几个 bash 脚本。

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

第二个脚本启动组装的 jar,并向其传递所需配置文件的名称。 该配置文件包含数据库连接信息。

DB - MySQL 在同一 VPS 上。

项目重启总数包括:

  • 通过 SSH 登录 VPS
  • 下载最新的 git 更改
  • 运行本地jar.sh
  • 杀死正在运行的应用程序
  • 运行启动生产.sh

此过程需要三分钟。 对于这样一个小项目,这对我来说似乎是一个明智的选择。

复杂性

创建该项目的主要困难在于组织方面。

有一群人似乎知道如何编程,但不是很好。 他们知道一些东西,但他们仍然不能真正应用它。 现在他们需要在一个月内完成该项目。

我在这个小组中确定了一名有条件的小组组长。 他保留了一份包含任务列表、分发任务并控制任务接受情况的 Google 文档。 他还接受了拉取请求。

我还要求学生每天晚上就他们在该项目上所做的工作写一份简短的报告。 如果你什么都没做,好吧,就写“什么也没做”。 这是很好的练习,但会让你有点紧张。 不幸的是,并不是每个人都遵守这条规则。

所有这些运动的目的都很简单。 组建一个团队,即使只是很短的时间,一起工作。

我希望这些人感到他们的工作很重要。 要明白他们并不是在真空中编写球形代码。 他们一起做的是一个人们随后会使用的项目。

最初的一两周是一个积累阶段。 实体和小型提交进展缓慢。 我一点一点地把它们搅动起来,工作也变得更有趣了。 聊天中的交流变得更加活跃,学生们纷纷提出自己的看法。

我相信目标已经达到。 项目完成了,这些人获得了一些团队合作的经验。 这是一个可见的、有形的结果,可以向朋友展示并进一步发展。

发现

学习很有趣。

每节课结束后我都心情激动地回来。 我努力让每一对都独一无二,并传达尽可能多的知识。

当我教的小组进入决赛时真是太好了。 当人们写下“我找到了工作,一切都很好,谢谢”时,这尤其酷。 哪怕是小三,哪怕一开始就不是最大的钱。 但最重要的是,他们朝着自己的愿望迈出了一步,并且成功了。

尽管这篇文章相当长,但肯定不可能涵盖所有要点。 因此,请在评论中写下您的问题。

来源: habr.com

添加评论