システム概要
目的
本システムはキャンパス図書を管理することが目的で制作されました。
システム名を図書管理システム
Qiitaの記事を、図書システムの取扱説明書の代りとします。
プログラムの詳細に関しては、GitHub上のREADME.mdを確認してください
過去情報
本システムには、それ以前に使用されていたシステムを元に再設計をしています。
図書管理システムVersion1→スプレッドシートの設計のため、使用非推奨
図書管理システムVersion2→システム設計中止
図書管理システムVersion3(本システム)
環境
開発環境
- 開発環境は以下のとおりです。
- M1 MacBook Air
- Mac OS Ventura 13.4.1
- Python3.11.4
- venvを使用
モジュール
モジュールインポート
import base64
import hashlib
import logging
import os
import random
import secrets
import sqlite3
import string
import time
from datetime import date
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from urllib.parse import urlparse
from ics import Calendar, Event
import arrow
import flask
from flask import render_template, url_for, request, redirect, jsonify, send_file
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
使用モジュールのリファレンスリンク
警告
ライブラリのリンクを表示すると、表示文字数が多くなるので、ご注意ください
使用モジュールのリファレンスリンク
警告
このモジュール説明はAIを使用して記述されています。
参考程度にしてください
base64: base64
hashlib: hashlib
logging: logging
os: os
random: random
secrets: secrets
sqlite3: sqlite3
string: string
time: time
date: date
encoders: encoders
MIMEBase: MIMEBase
MIMEMultipart: MIMEMultipart
MIMEText: MIMEText
urlparse: urlparse
Calendar: Calendar
Event: Event
arrow: arrow
flask: Flask
render_template: render_template
url_for: url_for
request: request
redirect: redirect
jsonify: jsonify
send_file: send_file
Credentials: Credentials
build: build
ログデータ
ログデータの内容
ログデータはPythonプログラムを実行した日付を元に、処理を開始されます。
停止するまでの間、そのセッションは開始日のログデータに保存され続けます。
一例
2023/01/01にアプリを起動
日付を超えて2023/01/03にプログラム停止
>>2023-01-01.log
にデータが保存されます。
ログのファイルの生成と保存期間
保存期間は、ログファイル名に基づく生成日付から7日分に指定されています。
その期間がすぎると、プログラム再スタート時に削除処理が行われるので、ご注意ください
logging.basicConfig(filename=f'logs/{today}.log', level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
(levelname)s - %(message)s')
logging.debug('デバッグメッセージ')
logging.info('一般情報メッセージ')
logging.warning('警告メッセージ')
logging.error('エラーメッセージ')
logging.critical('重大エラーメッセージ')
# 一週間よりも古い日付を計算
today = datetime.now()
one_week_ago = (today - timedelta(days=7)).strftime('%Y-%m-%d.log')
# ログファイルのあるディレクトリのパス
files = os.listdir('./logs')
for file in files:
if one_week_ago > file:
os.remove(f"logs/{file}")
else:
pass
セッション
Flaskの制約
Flaskでは、アプリの再スタート時に一度初期化されるようになっています。
また、再スタートしない場合でも、ログインされている情報は7日間でセッションアウトするように設計されています。
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)
定期実行プログラムについて
図書管理システムでは1時間おきにメール等の処理を定期実行しています。
以下は返却当日のメール送信と、その日の送信チェックデータベース生成関数および、Flaskアプリケーション実行を含みます
def run_flask_app():
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)
app.run(host='0.0.0.0', port=9000)
def other_code():
while True:
import datetime
now = datetime.datetime.now()
h = now.hour
if h > 7 and h < 16:
new_date_in()
return_mail_post()
time.sleep(1)
print("実行")
time.sleep(60)
pass
import threading
if __name__ == '__main__':
flask_thread = threading.Thread(target=run_flask_app)
flask_thread.start()
other_code()
実行
Flaskでは、実行時にhostを0,0,0,0に設定することで同じLAN内からアクセスすることができるようになっています。
もし実行できない場合はhostのアドレスやport番号を変更してください
app.run(host='0.0.0.0', port=9000)
各ページの利用方法について
レイアウトが多少異なる場合がありますが、
基本的に操作性は変わりませんので、ご安心ください
メニュー
メニューの説明
このメニュー説明はAIを使用して記述されています。
参考程度にしてください
-
ホーム(トップ)ページへ移動するための家のマークです。ここからはピックアップの本を確認することができます。
-
アカウントのページへ移動するための人のマークです。ログインページやアカウントに関する情報を確認することができます。
-
本の検索ページへ移動するための虫眼鏡マークです。ここから本の検索が可能です。
-
貸出ページへ移動するための本のマークです。アカウントを持っている人はここから本を貸出することができます。
-
返却ページへ移動するための本棚マークです。貸出時に付与される貸出IDを入力することで、本を返却することができます。
-
新規本の登録ページへ移動するための記述マークです。ただし、図書委員会など限られた権限を持つ人のみがアクセスできます。ここでは新しい本を登録することができます。
-
棚卸し機能であるしおりマークです。同様に、図書委員会など限られた権限を持つ人のみがアクセスできます。ここでは年度末に本の棚卸しを行うことができます。
-
ログイン中の情報や各種操作マニュアルなどのリンクが搭載されているinfoマークです。
トップページ
図書システムでのトップページに当たります。
新規で購入した本をメインに表示しています。
本の画像をクリックすると、対象の本をGoogle検索で検索することができます。
アクセスURL
/
アカウント
アカウントログインページになります。
アカウントを作成している場合ここで、ユーザーIDとパスワードを入力してサインインします。
アカウントの情報更新などもできます。
アカウント未作成の場合やパスワードを忘れた場合は作成や、リセットが必要です。
アクセスURL
/account
パスワードのリセットページ
アカウントを作成していた場合、でパスワードを忘れしまった場合はこちらからリセットトークンを含むメールを送信します。
対象のユーザーIDと登録時に使用したメールアドレスを入力してください。
ユーザーIDがわからない場合は、図書委員会に声をかけてください。
リセットメールからパスワードをリセットするリングが送られてくるので、メール送信後にメールフォルダを確認してください。
そのURLにアクセスすることでパスワードリセットできます。
アクセスURL
/reset_account
アカウント新規作成
アカウントを持っていないひとが、新規でアカウントを登録するページです。
- メールアドレス
- パスワード
- 希望するログインID
- 使う人の名前(ニックネーム可)
などを入力します。
アクセス権限レベルは一般ユーザーは「Level1」で大丈夫です。
Level3以上のアカウント作成には、許可されたアカウントの認証が必要です。
アクセスURL
/new_account
詳細は アカウントを作る を確認してください。
本の検索
本の検索をすることができます。
キーワード入力欄に本の名前などを入力してください
チェックマークをつけると、その本に関連しそうなワードも調べることができます。
アクセスURL
/search
本の貸出
このページはログインしている人のみが、アクセスすることができます。
本の裏に貼ってあるバーコードのうちA10,,,,から始まる8桁のバーコードをスキャナで読み込むか、手打ちしてください。
貸出可能な本のみが、こちらに追加されます。
貸出したい本がきまったら、貸出ボタンを押してください。
しばらくしてシステムから自動でメールが配信されます。
※もしこない場合は、迷惑メールフォルダを確認してください
例の中では202307142,,から始まる返却コードが返却時に必要なIDです。
添付ファイルの中に、返却コードをバーコード化したものが含まれるので、そちらを利用して返却することもできます。
また、カレンダーファイルも添付されているので、画像の中だと、一番上の「本の返却日のお知らせ」の下の方にある「カレンダーに追加」というところを押して、カレンダーに追加することが可能になっています。詳細は公式ページを確認してください
アクセスURL
/lending
本の返却
貸出した本の返却をするページです。
貸出した時や、返却日のお知らせなどのメールに返却コード(バーコードも可)が記載されています。
そのコードを入力して返却を完了させてください。
アクセスURL
/return
新本登録
新本登録はアクセスレベル3以上の権限がないと実行できません。
新本登録の際は管理番号を新しい本に貼ってそのコードを管理番号とします。
管理番号のあとに、ISBNを入力してください
APIを使用して基本情報を取得します
注意点としては、APIが情報を引っ張って来れない場合があります、この場合は、空白の場所を手動で入力してください
また、この紐づけ作業を謝ると、以後のデータが誤ったものになるので、十分に注意してください。
アクセスURL
/new-book
棚卸し
本の棚卸しページです。
キャンパスに蔵書している本の棚卸しと、棚卸し終了後にCSVファイルを出力することができます。
アカウントレベルが2,4,5のアカウントでアクセスすることができます。
アクセスURL
/inventory
アカウントを作る
アカウント作成の動画を添付していますのでご確認ください
:::note info
まずは、アカウント作成ページヘ移動してください
URLにアクセスしてください
/new_account
有効なメールアドレス
パスワード (大文字 小文字 数字 のすべてを含む)
ログインID(Twitterで言うところの@~~~~~に当たる部分) (学籍番号推奨)
名前(NN太郎など)
を入力してください
次にアカウントの権限レベルを選択します。
一般ユーザー(図書委員会などではない人)はLevel1を選択してください。
Level1を選択すると自動で認証用IDと認証パスワードが入力されますので、その欄を触らないでください
次にアカウント登録ボタンを押します。
正常に次に進むと、画像のようにメールに送信された数字を入力するように指示するページが表示されます。
別のタブでメールを開いて6桁の数字を入力してください
認証番号を入力して、以下のようなページが表示されれば、登録完了です。
アクセスレベル別の権限
※詳細はGitHub #axesslevelを参照してください
Access Level | 実行可能処理 |
---|---|
Access Level 1 | 貸出 返却 |
Access Level 2 | ログの出力と確認 |
Access Level 3 | 新本登録 |
Access Level 4 | データベースの編集(削除) |
Access Level 5 | ユーザーの新規追加 パスワードリセット |
エラー対処
エラーIDの見方
エラーIDの内容は、以下の文字列で構成されます。
(例)"ERR-3-001"
"ERR" はエラーIDであることを示します。
"4" は操作に必要なアクセスレベルを示します。
"001" はエラーメッセージです。エラーの理由と解決に使用できます。
(エラーの詳細詳細はGitHub上のエラーIDの種類と対処方法を確認してください。)
その他エラー
このエラー説明はAIを使用して記述されています。
参考程度にしてください
エラーには様々な種類のものがあります。
それは、意図されていないエラーが発生した場合などは、また別のエラーが発生します。
その一例が404Not Foundです
以下におおよそのエラーの種類を記載します。
ErrorCode | ErrorMessage | ErrorDescription |
---|---|---|
400 Bad Request | 不正なリクエスト | クライアントから送信されたリクエストが不正であることを示します。 |
401 Unauthorized | 認証が必要です | クライアントが認証を行う必要があることを示します。 |
403 Forbidden | アクセスが禁止されています | クライアントがリソースにアクセスする権限を持っていないことを示します。 |
404 Not Found | ページが見つかりません | クライアントがリクエストしたリソースが存在しないことを示します。 |
500 Internal Server Error | サーバ内部エラー | サーバ内で予期しないエラーが発生したことを示します。 |
503 Service Unavailable | サービス利用不可 | サーバが一時的にリクエストを処理できない状態であることを示します。 |