去年比雲端運算職類拿到全國第三後被 BAN 掉,不能再比相同職類,剛好這次年紀壓線可以報名網頁技術,自己也寫網頁一段時間了,就報名來玩看看,也有幸拿到了中區第二,可以再去全國賽玩ㄌ。
這篇文章主要是記錄一下競賽中遇到的問題及心得。
競賽環境
如競賽公告的”場地設備準備表”所述,競賽環境提供了下列幾項軟體,粗體是我有用到的:
Windows 10
Chrome、Firefox Developer Edition、內建的 Edge
- 挑習慣的用就好,反正也只會開網頁 + DevTools
其實我都用 Chrome,但它預設瀏覽器是 Edge 我懶得改
XAMPP 8.2.0
- 監評要求檔案放置於桌面 webXX 資料夾,可以改 httpd.conf 的 DocumentRoot 直接把它指過去
jQuery、jQuery UI
- jQuery UI 只用到了 button 跟 dialog
三大框架(Angular、React、Vue)
- 分區賽的題目用 Vanilla JS 就夠了
Prototype
- 這是不是很久以前的東西了
Adobe 全家統(Dreamweaver、Photoshop、Illustrator)、CorelDRAW
- 我都不會用
Visual Studio Code、Sublime Text、PHPStorm
- VS Code 沒裝套件,只有 HTML、CSS、JS 的語法提示
- PHPStorm 內建 PHP 文檔可以看,還可以開 live reload,大推 👍👍👍
- 環境提供 PHPStorm 2021.3 及 2023.3,但後者因為沒網路起用不了,只能用 2021.3
Notepad++、PS Pad、EditPlus、UltraEdit
- 這幾個都用不到
競賽過程
Day 1
中午 12:30 開放報到,人都到齊後帶隊去競賽場地,抽崗位編號然後入座,給大家 15 分鐘測試環境(測硬體、安裝軟體),電腦不會還原,隔天競賽時直接繼續用。
Day 2
早上 8:00 前報到,講解題目及注意事項大概 30 分鐘,然後就開始 4 小時的競賽。
題目會事先公告在競賽公告上的”競賽試題及說明”,當天會有紙本試題,題目會稍微修改,增加一些有的沒的 feature。
競賽結束後會叫大家把檔案複製到 USB,並把網頁打開,然後就可以離場用餐了,監評會趁這段時間先評主觀分數。
大概 13:30 開始照崗位編號叫進去 demo 評客觀分數,每個人大概 10 分鐘,評完就可以閃人了。
題目解析
這次題目是”快樂旅遊網”,主要有訪客留言、網頁管理、訪客訂餐、訪客訂房這四個功能。
訪客留言
如題目所敘,輸入資料並送出後會顯示在留言列表,可以輸入留言序號(把它當作密碼)來編輯或刪除留言。
輸入欄位有要求像要驗證格式,可以直接用 input type 或 pattern 來做。
html
<!-- Email 只少要有一個 `@` 跟 `.` --><input type="email" /><!-- 電話號碼只能輸入數字及 `-` --><input pattern="[0-9-]+" /><!-- 留言序號只能 3 位數小寫英文及數字 --><input pattern="[a-z0-9]{3}" />
輸入的資料用 mysqli 丟進資料庫,我把編輯跟刪除都寫在同一個頁面,透過網址參數 ?action=edit
來判斷要幹嘛,還有 session 來判斷是不是管理員,藉此少寫幾個頁面。
網頁管理
要先做一個登入頁面,登入後可以編輯、刪除留言,還有更改訂房資料。
登入頁面要做一個圖片驗證碼,還要可以重新產生。
我原本想說用小畫家畫個 5 張圖片然後隨機輪替,但好懶得 P 圖,最後選擇直接放一個 <p>1234</p>
然後設定 user-select: none
還有把它搞得很難看到,這樣監評也給過 XD。
現場題目還多了一個第二階段驗證碼,要產隨機的 9 宮格數字,並用拖曳的方式把它照順序排好,但這題才占 1 分,寫起來不划算果斷跳過。
登入驗證反正題目要求就那樣,直接寫死就好 🥰,然後用 $_SESSION 存一個 boolean 來判斷是否登入。
php
<?phpsession_start();if ($_POST['username'] === 'admin' && $_POST['password'] === '1234') {$_SESSION['login'] = true;header('Location: index.php');exit;}?>
編輯留言我直接使用上一段所寫的功能,加了些權限判斷讓管理員登入後可以編輯、回應還有刪除。
訂房管理… 沒時間做 PASS。
訪客訂餐
沒有任何”訂餐”的要素
給 16 張熱炒圖片,設計 RWD 頁面,題目要求寬版(>= 1024px)時一列 4 張,中版(>= 800px)時一列 2 張,窄版(< 800px)時一列 1 張。
這部分直接使用 grid layout 搭配 media query 來做即可。
css
@media (min-width: 1024px) {.img-container {grid-template-columns: repeat(4, 1fr);}}/* ...etc */.img-container {display: grid;grid-template-columns: repeat(1, 1fr);}
點擊圖片後開啟一個 dialog,有 < O >
三個按鈕,分別是減少透明度、重設透明度、增加透明度。
這部分直接使用 jQuery UI 的 dialog,透明度丟到全域變數,然後按鈕點擊時改變變數即可。
js
window.OPACITY = 1;const updateOpacity = val => {const img = document.querySelector("#dialog img");window.OPACITY = val;img.style.opacity = window.OPACITY;};$("#dialog").dialog({buttons: [{text: "<",click: () => updateOpacity(window.OPACITY - 0.1),},{text: "O",click: () => updateOpacity(1),},{text: ">",click: () => updateOpacity(window.OPACITY + 0.1),},],});
訪客訂房
寫到這邊剩下 5 分鐘,乖乖吃零食等結束。
原本還以為只有我寫不完,但看來這很正常 XD。
結語
報名時還在想我都沒寫過半行 PHP 會不會爛掉,幸好競賽前一天的臨時抱佛腳有派上用場,加上分區賽題目根本就是在考驗手刻 CSS,除了寫不完之外都很順利。
希望 7 月的全國賽競賽順利,趁這段時間給自己一點動力去碰 PHP。