今の会社では社員に対して技術書の購入を推奨(会社費用)する制度を設けています。
各自読み終わった本は所定の書棚に格納するのですが、その冊数も徐々に増え始め、今後の増加も見越して、そういった書籍を管理するためのシステムを作成することにしました。
今回は、登録と検索を作成しました。将来的には機能を拡張していく予定です。
レポジトリ
この記事の内容のコードは次のレポジトリに掲載しました
https://github.com/michihosokawa/MiniBookManagementSystem
前提
社内で各技術者が購入した技術書を、社員(100人超)で共有することを想定しています。
構成
次のような構成にしました
- Python
- flask
- Elasticsearch
- Vue.js
※将来的なメンテナンスの省力化を考え、内部で流通するデータはJSON形式です
WebAPIの利用
書籍データを手作業で入力しようとすると、手間がかかるし、入力ミスが発生することがあります。
書籍登録に負担を感じるようだと、書籍登録自体が敬遠されてしまい、管理システムの意義が損なわれる恐れがあります。
そこで、すべての書籍に割り振られているISBNコード(13桁)を用いることにします。
(ISBNコードがない一部書籍などは、今回は対象外とします。)
入力されたISBNコードから書籍情報(JSON)を補完し、それを登録するシステムを考えることにします。
書籍情報がJSONデータで取得できるWebAPIとして、次のようなものがあります。
-
Google Books API
- 利用のための登録不要
- 1000件/日の制限
-
openBD
- 利用のための登録不要
今回は、Google Books APIを採用しました。
XMLやHTMLで取得できるAPIもありますが、そこから必要情報を抜き出す手間をかけたくありませんでした。
JSON形式で取得し、その中から必要な項目を参照し、書籍情報を取得します。
flask
WebFrameworkの選択肢として、Djangoとflaskを考えました。
今回は、諸般の事情からflaskを採用しました。
Elasticsearch
データの管理にはElasticsearchを使用します。
- JSONデータを管理できる
- 検索機能
- 自然言語処理部(大文字小文字同一視など)が、設定レベルで実現できる
- 処理をプログラムとして記述する必要がない
- JSON記述による論理式での検索
- 自然言語処理部(大文字小文字同一視など)が、設定レベルで実現できる
Vue.js
フロントには、Vue.jsを使いました。
得意分野ではないので、他で使っていたものを流用した形です。
Vue.jsとflaskを同時に使おうとすると、テンプレートエンジンの記述が競合してしまい。うまく動作しません。
今回は、Vue.jsのテンプレートしか使うつもりがなかったので、flask(jinja)側の記述を差し替えることで対応しました。
今後の拡張(予定)
- 基本機能の補足
- 一覧表示機能
- 登録失敗時のエラー処理
- 基本機能の拡充
- ISBNコードの入力
- キー入力ではなく、カメラでのスキャンによる入力
- 欠落書籍対応
- GoogleBooksAPIには格納されていない書籍情報があります
- 存在しないものに対しては、openBD の情報も使うことで網羅性が上がることが期待できます
- 書影
- 書影をカメラ撮影して登録することを考えます
- 撮影は、表紙の外側に映った個所を削除して形状を補正したうえで登録したいです
- ISBNコードの入力
- 管理機能の拡張
- 各種管理情報の入力
- 登録者、購入日 など
- 貸し出し管理機能
- 借りた人、貸出日、返却予定日
- 紛失書籍の対応
- 各種管理情報の入力