千路里庵 | 武蔵野猫式
千路里庵ライブラリ構想
Notionを管理DBにした、小さな図書館システムを作る。漫画、本、ゲーム、資料の個人管理から始めて、小さな会社でも使える軽量な蔵書・貸出管理へ育てる。
開発実験へ戻る概要
千路里庵の次の開発案として、Notionを管理DBにした「小さな図書館システム」を作る。
最初は自分用の漫画・本・ゲーム・資料の管理から始める。将来的には、小さな会社、個人事務所、店舗、サークル、部室などで使える軽量な蔵書・資料管理システムに発展させる。
大規模な図書館システムを作るのではなく、Notionを管理画面として使い、千路里庵側のWebフロントから一覧表示・ISBN登録・貸出返却をできるようにする。
基本方針
- 管理DBはNotion。
- 表示・操作画面は千路里庵サイト。
- APIサーバーはRaspberry Pi 5上に置く。
- 既存のトレードシステムとはDocker Composeで分離する。
- 書誌情報はISBNからopenBD APIで取得する。
- バーコードリーダーはUSBまたはBluetoothのキーボード入力扱いを想定する。
- Notion APIトークンはフロントに出さず、APIサーバー側で管理する。
作りたいもの
個人用途
漫画、本、ゲーム、資料を管理する。何を持っているか、どこまで買ったか、紙か電子か、どこに置いたか、読み返したいか、処分候補か、公開してよいものかを整理する。
小規模組織用途
小さな会社やチームで、社内本・技術書・参考資料・マニュアルなどを管理する。どこにあるか、貸出中か、誰が借りているか、返却予定日はいつかを見える化する。
システム構成
Notion
管理画面として使う。蔵書DB、利用者DB、貸出履歴DB、申請DBを持たせる。
千路里庵フロント
利用者が見る画面。最初は蔵書一覧とISBN登録画面だけでよい。将来的に本の詳細ページ、利用者申請フォーム、貸出ボタン、返却ボタン、検索、タグ絞り込み、貸出状況表示を追加する。
APIサーバー
Raspberry Pi 5上で動かす。Notion API、openBD API、貸出処理、重複チェックなどを担当する。
バーコードリーダー
最初は安いUSB/Bluetoothバーコードリーダーを使う。キーボード入力扱いで、ISBN入力欄にフォーカスした状態でスキャンする。
Raspberry Pi Zero Wにカメラを付けて自作バーコードリーダー化する案もあるが、無印Zero Wだと画像処理が重く、読み取りの安定性にも不安がある。そのため、まずは市販バーコードリーダーで実用フローを固める。
開発段階
v0.1: ISBN登録と一覧表示
- Notionに蔵書DBを作る。
- 千路里庵側にライブラリ一覧ページを作る。
- Notion APIから「公開可」の蔵書データだけ取得して表示する。
- ISBN入力画面を作る。
- ISBNからopenBDで書誌情報を取得する。
- 取得したタイトル・著者・出版社・発売日・表紙URLなどを確認画面に表示する。
- 登録ボタンでNotionの蔵書DBに登録する。
- ISBN重複チェックを行う。
v0.2: 利用者管理
本格ログインは作らず、まずは申請ベースにする。Notionに利用者DBを作り、千路里庵側の申請フォームから登録する。管理者がNotion上で承認済みにし、利用者コードを付与する。
v0.3: 貸出・返却処理
本の詳細ページに「借りる」「返す」を追加する。貸出時はメールアドレス+利用者コードで本人確認し、蔵書DBの貸出状態を更新し、貸出履歴DBに記録する。
v0.4以降
予約、返却期限、延滞表示、貸出不可資料、複数冊所蔵、管理番号ラベル印刷、検索、タグ絞り込み、漫画の所持巻管理、電子書籍と紙書籍の区別、処分候補リスト、社内資料管理、ラズパイ端末化、自作バーコードスキャナ化を検討する。
Notion DB設計案
蔵書DB / Books
タイトル、ISBN、種別、著者、出版社、発売日、表紙URL、所蔵状態、媒体、置き場所、貸出可否、貸出状態、現在の利用者、貸出日、返却予定日、公開可否、表示用コメント、管理メモを持たせる。
利用者DB / Users
氏名、メール、所属、ステータス、利用者コード、承認日、メモを持たせる。
貸出履歴DB / Loan History
履歴名、蔵書、利用者、処理種別、処理日、返却予定日、実返却日、状態、メモを持たせる。
申請DB / Requests
申請名、申請種別、申請者名、メール、対象蔵書、申請日時、ステータス、管理メモを持たせる。
API設計案
- GET /api/books : 公開可の蔵書一覧を返す。
- GET /api/books/:id : 蔵書詳細を返す。
- POST /api/books/lookup : ISBNから書誌情報を取得する。
- POST /api/books/register : ISBN検索結果をNotion蔵書DBに登録する。
- POST /api/users/request : 利用者申請をNotionに登録する。
- POST /api/loans/borrow : 利用者確認後、貸出処理を行う。
- POST /api/loans/return : 返却処理を行う。
画面設計案
/library
蔵書一覧ページ。タイトル、種別、著者、貸出状態、表示用コメントを表示する。検索・絞り込みは後回しでよい。
/library/register
ISBN登録画面。バーコードリーダー利用を想定し、ISBN入力欄を大きく置く。入力欄にフォーカスした状態でバーコードを読み、Enterで検索実行。openBDの検索結果を表示し、内容確認後にNotionへ登録する。
/library/:id
蔵書詳細ページ。貸出状態、置き場所、コメントを表示する。将来的に「借りる」「返す」を追加する。
/library/user-request
利用者申請フォーム。氏名、メール、所属などを入力してNotionへ登録する。
ISBN登録仕様
ISBNは13桁を基本とする。バーコードリーダーから入力された文字列に余計な改行や空白がある場合は除去する。978または979で始まる13桁のみISBNとして扱う。ISBN-10対応は後回しでよい。
重複チェックは必須。同じISBNが既にNotionに存在する場合は、新規登録せず既存データを返す。
将来的に同一ISBNを複数冊持つ場合は、「書誌DB」と「所蔵DB」を分ける。v0.1では1冊=Notion 1ページでよい。
Raspberry Pi 5への配置方針
Raspberry Pi 5上に配置する。既にトレードシステムが動いているため、混ぜない。Docker Composeで別プロジェクトとして管理する。
- ディレクトリを分ける。
- ポートを分ける。
- .envを分ける。
- ログを分ける。
- Docker Composeでサービス分離する。
- トレードシステムのネットワーク・環境変数・DBには触らない。
- CPUやメモリを食いすぎないよう、最初は軽量構成にする。
外部公開するかは後で判断する。最初はLAN内、またはCloudflare Tunnel経由で確認できればよい。
セキュリティ方針
Notion APIトークンは絶対にブラウザへ渡さない。APIサーバー側の .env に保存する。.env はGitHubにコミットしない。.env.example だけを置く。
ISBN登録画面は、当面は自分だけが使う前提でよい。公開ページと管理ページを分ける。
貸出・返却APIを実装する場合は、最低限、メールアドレス+利用者コード確認を行う。