You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
292 lines
10 KiB
292 lines
10 KiB
import sqlite3
|
|
import hashlib
|
|
from datetime import datetime
|
|
|
|
|
|
class UserManager(object):
|
|
permission = "NONE"
|
|
allowBorrowBook = []
|
|
allowReturnBook = []
|
|
|
|
bookLocationInfo = [[]]
|
|
bookInfos =[[]]
|
|
recordInfo = [[]]
|
|
|
|
database = None
|
|
|
|
user_id = None
|
|
|
|
@staticmethod
|
|
def getAllowBorrowBook():
|
|
if len(UserManager.allowBorrowBook) <= 0:
|
|
return ['暂无可借阅书籍']
|
|
else:
|
|
return UserManager.allowBorrowBook
|
|
|
|
@staticmethod
|
|
def getAllowReturnBook():
|
|
if len(UserManager.allowReturnBook) <= 0:
|
|
return ['暂无可归还书籍']
|
|
else:
|
|
return UserManager.allowReturnBook
|
|
|
|
@staticmethod
|
|
def init():
|
|
UserManager.database = sqlite3.connect('database.db')
|
|
|
|
cur = UserManager.database.cursor()
|
|
|
|
tables = [
|
|
("Account", '''
|
|
CREATE TABLE Account(
|
|
userID TEXT PRIMARY KEY,
|
|
passwordHash TEXT,
|
|
permission TEXT CHECK(permission IN ('Admin', 'User', 'Ban'))
|
|
)
|
|
'''),
|
|
("BookInfo", '''
|
|
CREATE TABLE BookInfo(
|
|
ISBN TEXT PRIMARY KEY,
|
|
author TEXT,
|
|
name TEXT,
|
|
category TEXT
|
|
)
|
|
'''),
|
|
("MainBook", '''
|
|
CREATE TABLE MainBook(
|
|
bookID INTEGER PRIMARY KEY,
|
|
ISBN TEXT,
|
|
borrowStatus TEXT CHECK(borrowStatus IN ('borrowed', 'available')),
|
|
FOREIGN KEY (ISBN) REFERENCES BookInfo
|
|
)
|
|
'''),
|
|
("BookLocation", '''
|
|
CREATE TABLE BookLocation(
|
|
bookID INTEGER PRIMARY KEY,
|
|
location TEXT,
|
|
FOREIGN KEY (bookID) REFERENCES MainBook
|
|
)
|
|
'''),
|
|
("BorrowRecord", '''
|
|
CREATE TABLE BorrowRecord(
|
|
bookID INTEGER,
|
|
borrowTime TEXT,
|
|
actualReturnTime TEXT,
|
|
borrowingUser TEXT,
|
|
FOREIGN KEY (bookID) REFERENCES MainBook,
|
|
FOREIGN KEY (borrowingUser) REFERENCES Account
|
|
)
|
|
''')
|
|
]
|
|
|
|
for table_name, table_query in tables:
|
|
cur.execute(f"SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}'")
|
|
if not cur.fetchone():
|
|
cur.execute(table_query)
|
|
|
|
cur.execute("SELECT COUNT(*) FROM Account")
|
|
rows = cur.fetchone()[0]
|
|
|
|
if rows == 0:
|
|
default_password = "admin"
|
|
passwordHash = hashlib.sha256(default_password.encode()).hexdigest()
|
|
cur.execute('INSERT INTO Account(userID, passwordHash, permission) VALUES(?, ?, ?)',
|
|
("admin", passwordHash, "Admin"))
|
|
|
|
UserManager.database.commit()
|
|
cur.close()
|
|
|
|
@staticmethod
|
|
def login(user_name, password):
|
|
cur = UserManager.database.cursor()
|
|
passwordHash = hashlib.sha256(password.encode()).hexdigest()
|
|
cur.execute('SELECT * FROM Account WHERE userID=? AND passwordHash=?', (user_name, passwordHash))
|
|
user = cur.fetchone()
|
|
if user:
|
|
UserManager.permission = user[2]
|
|
UserManager.user_id = user[0]
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
@staticmethod
|
|
def addBookInfo(isbn, name, author, category):
|
|
cur = UserManager.database.cursor()
|
|
cur.execute('''INSERT INTO BookInfo(isbn, author, name, category) VALUES (?, ?, ?, ?)''',
|
|
(isbn, author, name, category))
|
|
UserManager.database.commit()
|
|
|
|
@staticmethod
|
|
def addBookInstance(isbn, location):
|
|
cur = UserManager.database.cursor()
|
|
cur.execute(f"SELECT COUNT(*) FROM BookInfo WHERE ISBN=?", (isbn,))
|
|
|
|
result = cur.fetchone()
|
|
|
|
if result[0] > 0:
|
|
cur.execute('''SELECT bookID FROM MainBook ORDER BY bookID DESC''')
|
|
last = cur.fetchone()
|
|
last = last[0]
|
|
last += 1
|
|
cur.execute('''INSERT INTO MainBook(bookID, ISBN, borrowStatus) VALUES (?, ?, 'available')''', (last, isbn))
|
|
cur.execute('''INSERT INTO BookLocation(bookID, location) VALUES (?,?)''', (last, location))
|
|
UserManager.database.commit()
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
@staticmethod
|
|
def addUser(name, password, permission):
|
|
cur = UserManager.database.cursor()
|
|
passwordHash = hashlib.sha256(password.encode()).hexdigest()
|
|
cur.execute('''INSERT INTO Account(userID, passwordHash, permission) VALUES (?, ?, ?)''',
|
|
(name, passwordHash, permission))
|
|
UserManager.database.commit()
|
|
|
|
@staticmethod
|
|
def modifierUserPerm(name, permission):
|
|
cur = UserManager.database.cursor()
|
|
cur.execute('''UPDATE Account SET permission=? WHERE userID=?''', (permission, name))
|
|
UserManager.database.commit()
|
|
|
|
@staticmethod
|
|
def removeBook(book_id):
|
|
c = UserManager.database.cursor()
|
|
c.execute("DELETE FROM BorrowRecord WHERE bookID=?", (book_id,))
|
|
c.execute("DELETE FROM BookLocation WHERE bookID=?", (book_id,))
|
|
c.execute("DELETE FROM MainBook WHERE bookID=?", (book_id,))
|
|
UserManager.database.commit()
|
|
|
|
@staticmethod
|
|
def getAllCanBorrowBook():
|
|
c = UserManager.database.cursor()
|
|
c.execute("""
|
|
SELECT BookInfo.name
|
|
FROM MainBook
|
|
JOIN BookInfo ON MainBook.ISBN = BookInfo.ISBN
|
|
WHERE MainBook.borrowStatus = 'available'
|
|
""")
|
|
|
|
results = c.fetchall()
|
|
|
|
UserManager.allowBorrowBook = list(dict.fromkeys(result[0] for result in results))
|
|
|
|
@staticmethod
|
|
def getAllNeedReturnBook(user_id):
|
|
c = UserManager.database.cursor()
|
|
c.execute("""
|
|
SELECT BookInfo.name
|
|
FROM BorrowRecord
|
|
JOIN MainBook ON BorrowRecord.bookID = MainBook.bookID
|
|
JOIN BookInfo ON MainBook.ISBN = BookInfo.ISBN
|
|
WHERE BorrowRecord.borrowingUser = ? AND BorrowRecord.actualReturnTime = '未归还'
|
|
""", (user_id,))
|
|
results = c.fetchall()
|
|
|
|
UserManager.allowReturnBook = [result[0] for result in results]
|
|
|
|
@staticmethod
|
|
def getAllBookIndexByNameThatCanBorrow(book_name):
|
|
c = UserManager.database.cursor()
|
|
c.execute("""
|
|
SELECT MainBook.bookID
|
|
FROM MainBook
|
|
JOIN BookInfo ON MainBook.ISBN = BookInfo.ISBN
|
|
WHERE BookInfo.name = ?
|
|
ORDER BY MainBook.bookID
|
|
""", (book_name,))
|
|
|
|
# Fetch all results
|
|
results = c.fetchall()
|
|
|
|
# Extract book IDs
|
|
book_ids = [result[0] for result in results]
|
|
|
|
return book_ids
|
|
|
|
@staticmethod
|
|
def borrow_book(book_id):
|
|
c = UserManager.database.cursor()
|
|
|
|
borrow_time = datetime.now().strftime('%Y-%m-%d')
|
|
|
|
c.execute("""
|
|
UPDATE MainBook
|
|
SET borrowStatus = 'borrowed'
|
|
WHERE bookID = ?
|
|
""", (book_id,))
|
|
|
|
c.execute("""
|
|
INSERT INTO BorrowRecord (bookID, borrowTime,actualReturnTime, borrowingUser)
|
|
VALUES (?, ?, ?, ?)
|
|
""", (book_id, borrow_time, '未归还', UserManager.user_id))
|
|
|
|
UserManager.database.commit()
|
|
|
|
@staticmethod
|
|
def return_book(book_id):
|
|
c = UserManager.database.cursor()
|
|
actual_return_time = datetime.now().strftime('%Y-%m-%d')
|
|
c.execute("""
|
|
UPDATE MainBook
|
|
SET borrowStatus = 'available'
|
|
WHERE bookID = ?
|
|
""", (book_id,))
|
|
|
|
c.execute("""
|
|
UPDATE BorrowRecord
|
|
SET actualReturnTime = ?
|
|
WHERE bookID = ? AND borrowingUser = ? AND actualReturnTime = '未归还'
|
|
""", (actual_return_time, book_id, UserManager.user_id))
|
|
|
|
UserManager.database.commit()
|
|
|
|
@staticmethod
|
|
def get_books_location_data():
|
|
c = UserManager.database.cursor()
|
|
|
|
c.execute("""
|
|
SELECT MainBook.bookID, BookInfo.name, MainBook.ISBN, BookLocation.location
|
|
FROM MainBook
|
|
JOIN BookInfo ON MainBook.ISBN = BookInfo.ISBN
|
|
JOIN BookLocation ON MainBook.bookID = BookLocation.bookID
|
|
""")
|
|
results = c.fetchall()
|
|
|
|
UserManager.bookLocationInfo = [[str(value) for value in result] for result in results]
|
|
|
|
@staticmethod
|
|
def get_books_info_data():
|
|
c = UserManager.database.cursor()
|
|
|
|
# Execute the query
|
|
c.execute("""
|
|
SELECT BookInfo.name, BookInfo.author, BookInfo.ISBN, BookInfo.category, COUNT(MainBook.ISBN)
|
|
FROM BookInfo
|
|
LEFT JOIN MainBook ON BookInfo.ISBN = MainBook.ISBN
|
|
GROUP BY BookInfo.ISBN
|
|
""")
|
|
|
|
# Fetch all results
|
|
results = c.fetchall()
|
|
UserManager.bookInfos = [[str(value) for value in result] for result in results]
|
|
|
|
|
|
@staticmethod
|
|
def get_user_borrow_records():
|
|
c = UserManager.database.cursor()
|
|
# Execute the query
|
|
c.execute("""
|
|
SELECT BorrowRecord.borrowingUser, BorrowRecord.bookID, BookInfo.name, MainBook.ISBN, BorrowRecord.borrowTime, BorrowRecord.actualReturnTime
|
|
FROM BorrowRecord
|
|
JOIN MainBook ON BorrowRecord.bookID = MainBook.bookID
|
|
JOIN BookInfo ON MainBook.ISBN = BookInfo.ISBN
|
|
""")
|
|
|
|
# Fetch all results
|
|
results = c.fetchall()
|
|
|
|
# Convert numeric values to strings
|
|
UserManager.recordInfo = [[str(value) if isinstance(value, (int, float)) else value for value in result] for result in
|
|
results]
|