2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

図書管理システム

Last updated at Posted at 2023-07-18

システム概要

目的

本システムはキャンパス図書を管理することが目的で制作されました。
システム名を図書管理システム
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

/

image.png

アカウント

アカウントログインページになります。
アカウントを作成している場合ここで、ユーザーIDとパスワードを入力してサインインします。
アカウントの情報更新などもできます。
アカウント未作成の場合やパスワードを忘れた場合は作成や、リセットが必要です。

アクセスURL

/account

image.png

パスワードのリセットページ

アカウントを作成していた場合、でパスワードを忘れしまった場合はこちらからリセットトークンを含むメールを送信します。
対象のユーザーIDと登録時に使用したメールアドレスを入力してください。
ユーザーIDがわからない場合は、図書委員会に声をかけてください。

リセットメールからパスワードをリセットするリングが送られてくるので、メール送信後にメールフォルダを確認してください。
そのURLにアクセスすることでパスワードリセットできます。

アクセスURL

/reset_account

image.png

アカウント新規作成

アカウントを持っていないひとが、新規でアカウントを登録するページです。

  • メールアドレス
  • パスワード
  • 希望するログインID
  • 使う人の名前(ニックネーム可)
    などを入力します。
    アクセス権限レベルは一般ユーザーは「Level1」で大丈夫です。
    Level3以上のアカウント作成には、許可されたアカウントの認証が必要です。

上記と同様のことになりますが、アカウント作成時のLevelは一般ユーザーは必ず1を選択してください。
Level1の場合アカウンの認証IDの入力などは、自動入力されるので、触らないでください。
image.png

アクセスURL

/new_account

image.png

詳細は アカウントを作る を確認してください。


本の検索

本の検索をすることができます。
キーワード入力欄に本の名前などを入力してください
チェックマークをつけると、その本に関連しそうなワードも調べることができます。

アクセスURL

/search

image.png

本の詳細を見るには、検索結果からその本のタイトルをクリックしてください
その本の詳細等を確認することができます。
image.png


本の貸出

このページはログインしている人のみが、アクセスすることができます。
本の裏に貼ってあるバーコードのうちA10,,,,から始まる8桁のバーコードをスキャナで読み込むか、手打ちしてください。
image.png
貸出可能な本のみが、こちらに追加されます。
貸出したい本がきまったら、貸出ボタンを押してください。

しばらくしてシステムから自動でメールが配信されます。
※もしこない場合は、迷惑メールフォルダを確認してください
image.png

例の中では202307142,,から始まる返却コードが返却時に必要なIDです。
添付ファイルの中に、返却コードをバーコード化したものが含まれるので、そちらを利用して返却することもできます。
また、カレンダーファイルも添付されているので、画像の中だと、一番上の「本の返却日のお知らせ」の下の方にある「カレンダーに追加」というところを押して、カレンダーに追加することが可能になっています。詳細は公式ページを確認してください

アクセスURL

/lending

image.png


本の返却

貸出した本の返却をするページです。
貸出した時や、返却日のお知らせなどのメールに返却コード(バーコードも可)が記載されています。
そのコードを入力して返却を完了させてください。

アクセスURL

/return

image.png


新本登録

新本登録はアクセスレベル3以上の権限がないと実行できません。
新本登録の際は管理番号を新しい本に貼ってそのコードを管理番号とします。
管理番号のあとに、ISBNを入力してください
APIを使用して基本情報を取得します

注意点としては、APIが情報を引っ張って来れない場合があります、この場合は、空白の場所を手動で入力してください
また、この紐づけ作業を謝ると、以後のデータが誤ったものになるので、十分に注意してください。

アクセスURL

/new-book

image.png


棚卸し

本の棚卸しページです。
キャンパスに蔵書している本の棚卸しと、棚卸し終了後にCSVファイルを出力することができます。
アカウントレベルが2,4,5のアカウントでアクセスすることができます。

アクセスURL

/inventory

image.png
image.png


アカウントを作る

アカウント作成の動画を添付していますのでご確認ください
:::note info

まずは、アカウント作成ページヘ移動してください
URLにアクセスしてください

/new_account

image.png
この画面が表示されたら成功です。

有効なメールアドレス
パスワード (大文字 小文字 数字 のすべてを含む)
ログインID(Twitterで言うところの@~~~~~に当たる部分) (学籍番号推奨)
名前(NN太郎など)
を入力してください
image.png

次にアカウントの権限レベルを選択します。
一般ユーザー(図書委員会などではない人)はLevel1を選択してください。
image.png
Level1を選択すると自動で認証用IDと認証パスワードが入力されますので、その欄を触らないでください

次にアカウント登録ボタンを押します。

正常に次に進むと、画像のようにメールに送信された数字を入力するように指示するページが表示されます。
別のタブでメールを開いて6桁の数字を入力してください
image.png
image.png

認証番号を入力して、以下のようなページが表示されれば、登録完了です。
image.png

アクセスレベル別の権限
※詳細は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の種類と対処方法を確認してください。)
image.png

その他エラー

このエラー説明はAIを使用して記述されています。
参考程度にしてください

エラーには様々な種類のものがあります。
それは、意図されていないエラーが発生した場合などは、また別のエラーが発生します。
その一例が404Not Foundです
image.png

以下におおよそのエラーの種類を記載します。

ErrorCode ErrorMessage ErrorDescription
400 Bad Request 不正なリクエスト クライアントから送信されたリクエストが不正であることを示します。
401 Unauthorized 認証が必要です クライアントが認証を行う必要があることを示します。
403 Forbidden アクセスが禁止されています クライアントがリソースにアクセスする権限を持っていないことを示します。
404 Not Found ページが見つかりません クライアントがリクエストしたリソースが存在しないことを示します。
500 Internal Server Error サーバ内部エラー サーバ内で予期しないエラーが発生したことを示します。
503 Service Unavailable サービス利用不可 サーバが一時的にリクエストを処理できない状態であることを示します。
2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?