Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 12 additions & 33 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,19 @@

[▶ Live Demo](https://venture-ferris.curihaosity.xyz)

一個把 2018 年台北市商業處「勇闖摩天輪」團隊實境解謎活動網站,從 2018 年老舊
的 CodeIgniter 3 專案重構為 Rails 8.1 的技術作品集專案。
一個把 2018 年台北市商業處「勇闖摩天輪」團隊實境解謎活動網站,從 2018 年老舊的 CodeIgniter 3 專案重構為 Rails 8.1 的技術作品集專案。

![遊戲流程展示](docs/images/demo.gif)

點首頁「▶ 直接體驗(Demo)」即可單人跑完取隊名、選職業、地圖解謎到 Boss
戰的完整流程,不需要湊滿 4 人;Demo 模式下 Boss 血量與時限都已調降,方便
一個人在幾分鐘內體驗到結算畫面(正式站部署在東京、有 auto-suspend,第一次
打開可能要等一兩秒喚醒機器)。
點首頁「▶ 直接體驗(Demo)」即可單人跑完取隊名、選職業、地圖解謎到 Boss 戰的完整流程,不需要湊滿 4 人;Demo 模式下 Boss 血量與時限都已調降,方便一個人在幾分鐘內體驗到結算畫面(正式站部署在東京、有 auto-suspend,第一次打開可能要等一兩秒喚醒機器)。

## 專案簡介

原案是 2018 年在台北大直美麗華旁舉辦的線下團隊實境解謎活動:玩家掃序號登
入、組隊、選職業,依序破解 11 道謎題並「打王」,最後依時間、提示使用次數、
職業加成計算總分,兌換獎品序號。
原案是 2018 年在台北大直美麗華旁舉辦的線下團隊實境解謎活動:玩家掃序號登入、組隊、選職業,依序破解 11 道謎題並「打王」,最後依時間、提示使用次數、職業加成計算總分,兌換獎品序號。

這個 repo 是該遊戲玩法邏輯的完整重寫,用來展示如何把一個「前端幾乎沒有任何
伺服器端把關」的 10 年前 PHP 專案,改寫成一個資料驗證、權限控管都在伺服器端
完成的現代 Rails 應用。
這個 repo 是該遊戲玩法邏輯的完整重寫,用來展示如何把一個「前端幾乎沒有任何伺服器端把關」的 10 年前 PHP 專案,改寫成一個資料驗證、權限控管都在伺服器端完成的現代 Rails 應用。

> 原案的活動素材、美術與品牌名稱版權屬原主辦單位所有,本專案僅作**技術重構
> 展示**用途,不用於任何商業或活動用途。詳見下方〈素材授權註記〉。
> 原案的活動素材、美術與品牌名稱版權屬原主辦單位所有,本專案僅作**技術重構展示**用途,不用於任何商業或活動用途。詳見下方〈素材授權註記〉。

## 重構亮點

Expand All @@ -33,8 +24,7 @@
- **前端零 jQuery、零 CSS 框架 CDN。** 舊站整套 jQuery/jQuery UI/Bootstrap 4/Font Awesome 已移除,拼圖拖拉改寫為原生 Pointer Events 引擎,視覺層改用 Tailwind CSS v4。細節見 [ARCHITECTURE.md「前端」](docs/ARCHITECTURE.md#frontend)。
- **正規化 schema,計分邏輯有黃金值測試護欄。** 9 張表的正規化決策(含 8 條刻意保留的非正規設計)逐一論證於 `docs/SCHEMA_REDESIGN.md`;重構前後計分測試斷言值逐位元不變。細節見 [ARCHITECTURE.md「刻意保留的非正規設計」](docs/ARCHITECTURE.md#non-normalized-design)。

完整論述、架構總覽(Models/ERD/路由)、相較原作的新增功能全文,見
[`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)。
完整論述、架構總覽(Models/ERD/路由)、相較原作的新增功能全文,見[`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)。

**技術棧**:Rails 8.1/PostgreSQL/Hotwire(Turbo + Stimulus)/Tailwind CSS v4/Dart Sass/部署 Fly.io(東京)+ Cloudflare。

Expand All @@ -47,17 +37,14 @@ bin/rails db:seed # 3. 灌入 11 題/demo 隊伍/序號池/
bin/rails server # 4. 啟動伺服器 → http://localhost:3000
```

首頁「▶ 直接體驗(Demo)」按鈕會當場建立一支全新單人示範隊伍並直接登入,
不需湊滿 4 人即可跑完全部關卡+Boss 戰+結算+兌獎。
首頁「▶ 直接體驗(Demo)」按鈕會當場建立一支全新單人示範隊伍並直接登入,不需湊滿 4 人即可跑完全部關卡+Boss 戰+結算+兌獎。

後台入口 `/admin/login`:

- **operator**(一般帳號):`admin@venture-ferris.example`,密碼由 `ADMIN_PASSWORD` 環境變數指定(`ADMIN_PASSWORD=xxx bin/rails db:seed`;未設定時預設 `changeme`,僅供本機示範)。
- **viewer**(唯讀展示帳號,帳密刻意公開):`demo-admin@venture-ferris.example` / `walkthrough2026`,可瀏覽後台所有頁面,但任何寫入操作都會被伺服器端 `Admin::BaseController#block_viewer_writes` 擋下。

> ⚠️ 正式環境的後台密碼=部署時設定的 `ADMIN_PASSWORD` secret,不是預設值
> `changeme`;帳號建立後才改 secret 不會自動更新既有密碼,需另外更新資料庫
> 中的 `Admin` 記錄。
> ⚠️ 正式環境的後台密碼=部署時設定的 `ADMIN_PASSWORD` secret,不是預設值 `changeme`;帳號建立後才改 secret 不會自動更新既有密碼,需另外更新資料庫中的 `Admin` 記錄。

### 測試

Expand Down Expand Up @@ -88,21 +75,13 @@ CI(`.github/workflows/ci.yml`)在每個 PR 上會跑上述四項,外加 `b

## 素材授權註記

本專案沿用的怪物立繪、地圖、Boss 場景等美術素材(`app/assets/images/*`)與
活動品牌名稱(頁尾「Escapeholics密室逃脫」等),版權屬 2018 年原活動主辦
單位(臺北市商業處、臺北市商圈產業聯合會)與原委製廠商所有。本專案僅作為
**Rails 重構技術展示**,不含任何商業用途,亦不含原站的真實使用者資料、金鑰
或帳密。
本專案沿用的怪物立繪、地圖、Boss 場景等美術素材(`app/assets/images/*`)與活動品牌名稱(頁尾「Escapeholics密室逃脫」等),版權屬 2018 年原活動主辦單位(臺北市商業處、臺北市商圈產業聯合會)與原委製廠商所有。本專案僅作為**Rails 重構技術展示**,不含任何商業用途,亦不含原站的真實使用者資料、金鑰或帳密。

## 已知限制

- 題目原文(含第 1、2、9 題的拼圖/熊讚互動題)已於 2026-08-29 依尋回的原始
SQL dump 還原本貌。
- `mon10.gif` 從未存在——第 10/11 題考證後確認是同一隻「摩天輪魔王」的雙型態
連戰,非素材遺失。
- 題目原文(含第 1、2、9 題的拼圖/熊讚互動題)已於 2026-08-29 依尋回的原始 SQL dump 還原本貌。
- `mon10.gif` 從未存在——第 10/11 題考證後確認是同一隻「摩天輪魔王」的雙型態連戰,非素材遺失。

完整考證過程見 [ARCHITECTURE.md「已知限制(完整版)」](docs/ARCHITECTURE.md#known-limitations)。

已部署 Fly.io(東京,auto-suspend)+ rack-attack 節流與每日 demo 資料清理排
程,完整流程見 `docs/DEPLOYMENT.md`,維運細節見
[ARCHITECTURE.md「部署與維運細節」](docs/ARCHITECTURE.md#deployment-details)。
已部署 Fly.io(東京,auto-suspend)+ rack-attack 節流與每日 demo 資料清理排程,完整流程見 `docs/DEPLOYMENT.md`,維運細節見[ARCHITECTURE.md「部署與維運細節」](docs/ARCHITECTURE.md#deployment-details)。