Spring Boot を触ってみたので、ある程度の大きさのものをと「架空のキャンプ場の予約アプリ」を作ってみた話です。各工程で考慮したこと等をメモしておきます。
成果物
今回作ったものです。
URL:Aozora Camp Reservation - Top
ソースコード(demoがあります):
前提
- キャンプ場の予約方法といえば、Web予約以外にも電話予約や店頭予約等が考えられます。その他の方法で受け付けた予約とWeb予約を同期させるには、別途管理者機能(アプリ)が必要となるでしょう。また、(キャンプ)サイトの在庫数を管理するのにも管理者機能が必要です。ですが、今回のアプリではそこは対象外とし、「キャンプ場のWeb予約」に絞って作っていきます。
- キャンプ場の予約機能だけ存在する、ということはまずないと思います。ここでは、既に自社HPを持っており、そこから呼び出されるアプリケーションを想定しています。
要件定義
はじめにざっくりと要件を決めて、スコープを定めます。1ヶ月で作れる程度の規模を想定しました。
ユーザーストーリー
- 利用者は、インターネット経由でキャンプ場のサイトが予約できる。
- 利用者は、会員、非会員ともにサイト予約できる。
- 利用者は、予約したいサイトの空き状況を確認できる。
- 利用者は、予約の際に確認した料金をチェックイン当日現地清算する。
- 利用者は、スマートフォンからも同じように予約できる。
- 会員は、登録した会員情報を更新できる。
- 会員は、予約内容の確認ができる。
- 会員は、予約のキャンセルができる。
今回は対象外
- メール認証、通知
- 請求、支払
- 管理者機能(アプリ)
業務ルール
- 予約は、翌日〜90日間までの分を受け付ける。
- 予約のキャンセルは、チェックインの3日前まで可能。
機能一覧
- キャンプサイト予約
- サイトタイプ一覧
- スケジュール
- 宿泊情報入力
- 予約(会員)
- 予約(非会員)
- マイページ
- ログイン
- 会員登録
- 基本情報更新
- メールアドレス変更
- パスワード変更
- 予約一覧
- 予約詳細
- 予約キャンセル
画面遷移図
DB設計
今回、RDBMSにはPostgreSQLを使います。
ER図
reservations
テーブル、reservation_details
テーブル- 料金周りは、本来であれば請求用のテーブルに分けますが、今回は手間なので
reservations
とreservation_details
に持たせています。
- 料金周りは、本来であれば請求用のテーブルに分けますが、今回は手間なので
site_types
デーブルlist_img_url
にはS3に格納した画像のURLが入ります。capacity
には宿泊可能人数が入ります。
calendar
テーブル- 日付に対応する料金タイプが登録されています。
site_availavility
テーブル- サイトタイプ及び日付別の在庫管理テーブルです。本来であれば、管理者によって管理されています。
制約
- 各テーブルの参照キーには、外部キー制約を付与しています。
reservations
テーブルは非正規化された状態です。予約者情報について言うと、会員予約の場合はmember_id
が、非会員予約の場合は予約者情報(non_member_name
,non_member_mail
,non_member_phone_number
)が入ります。今回は、チェック制約よって、テーブルを守る設計としました。正規化してテーブルを分けてしまうのもよいと思います。
「②開発編」 に続きます。