This repository has been archived on 2024-09-30. You can view files and clone it, but cannot push or open issues/pull-requests.
SmartRollCall/db/database_manager.py

98 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from db.connection import MySQLPool
import bcrypt
class DatabaseManager:
def __init__(self):
# 使用MySQLPool初始化数据库连接池
self.pool = MySQLPool()
def fetch(self, query, params=None):
conn = self.pool.get_connection()
try:
cursor = conn.cursor()
cursor.execute(query, params or ())
result = cursor.fetchall()
return result
finally:
cursor.close()
conn.close()
def execute(self, query, params=None):
conn = self.pool.get_connection()
try:
cursor = conn.cursor()
cursor.execute(query, params or ())
conn.commit()
return cursor.rowcount
finally:
cursor.close()
conn.close()
def user_exists(self, phone_number):
sql = "SELECT 1 FROM user WHERE phone_number=%s LIMIT 1"
result = self.fetch(sql, (phone_number,))
return len(result) > 0
def insert_user(self, user):
sql = """
INSERT INTO user (nickname, phone_number, password, identity, is_active)
VALUES (%s, %s, %s, %s, %s)
"""
data = (user.nickname, user.phone_number, user.password, user.identity, user.is_active)
# print(data)
return self.execute(sql, data)
def valid_login(self, phone_number, password_attempt):
# SQL查询获取用户的哈希密码身份和状态
sql = "SELECT password, identity, status,nickname FROM user WHERE phone_number=%s LIMIT 1"
result = self.fetch(sql, (phone_number,))
if result:
stored_hash = result[0]['password'] # 假设结果是密码字段
identity = result[0]['identity'] # 用户身份
status = result[0]['status'] # 用户状态
nickname = result[0]['nickname']
# 使用bcrypt进行密码验证
if bcrypt.checkpw(password_attempt.encode('utf-8'), stored_hash.encode('utf-8')):
# 密码匹配,返回登录成功,身份和状态
return {'valid': True, 'identity': identity, 'status': status, 'nickname': nickname}
# 密码不匹配或用户不存在,返回登录失败
return {'valid': False}
def get_menu(self, role):
sql = "SELECT menu_name,path FROM menu_items WHERE role=%s ORDER BY `order`"
result = self.fetch(sql, (role,))
return result
def get_all_courses(self):
sql = "SELECT course_name, course_code, instructor_name, credits, description FROM courses"
result = self.fetch(sql)
return result
def get_current_teacher_courses(self, phone_number):
# 根据电话号码查询user_id
user_sql = "SELECT user_id FROM user WHERE phone_number = %s"
user_result = self.fetch(user_sql, (phone_number,))
if user_result:
user_id = user_result[0]['user_id']
# 使用联合查询获取该老师的所有课程信息及班级信息
course_class_sql = """
SELECT c.course_name, c.course_code, c.credits, cl.class_name, cl.major
FROM class_courses cc
JOIN courses c ON cc.course_id = c.course_id
JOIN classes cl ON cc.class_id = cl.class_id
WHERE cc.user_id = %s
"""
courses_classes_result = self.fetch(course_class_sql, (user_id,))
# 组织和返回信息
if courses_classes_result:
# print(courses_classes_result)
return courses_classes_result
return []