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 文件。 他也接受了拉取請求。

我還要求學生每天晚上就他們在該專案上所做的工作寫一份簡短的報告。 如果你什麼都沒做,好吧,就寫「什麼也沒做」。 這是很好的練習,但會讓你有點緊張。 不幸的是,並不是每個人都遵守這條規則。

所有這些運動的目標都很簡單。 組成一個團隊,即使只是很短的時間,一起工作。

我希望這些人感覺到他們的工作很重要。 要明白他們不是在真空中寫球形程式碼。 他們一起做的是一個人們隨後會使用的項目。

最初的一兩週是一個累積階段。 實體和小型提交進展緩慢。 我一點一點地把它們攪動起來,工作也變得更有趣了。 聊天中的交流變得更加活躍,學生們紛紛提出自己的看法。

我相信目標已經達成。 專案完成了,這些人獲得了一些團隊合作的經驗。 這是一個可見的、有形的結果,可以向朋友展示並進一步發展。

發現

學習很有趣。

每堂課結束後我都心情激動地回來。 我努力讓每一對都獨一無二,並傳達盡可能多的知識。

當我教的小組進入決賽時真是太好了。 當人們寫下「我找到了工作,一切都很好,謝謝」時,這尤其酷。 就算是小三,就算一開始就不是最大的錢。 但最重要的是,他們朝著自己的願望邁出了一步,並且成功了。

儘管這篇文章相當長,但肯定不可能涵蓋所有要點。 因此,請在評論中寫下您的問題。

來源: www.habr.com

添加評論