Compare commits

...

5 Commits

Author SHA1 Message Date
wangsiyuan f3ef70b096 更新 User.py 2023-12-25 16:43:50 +08:00
wangsiyuan b863ac4c8c 更新 database_manager.py 2023-12-25 16:43:47 +08:00
wangsiyuan ba6aa5fbb5 更新 connection.py 2023-12-25 16:43:42 +08:00
wangsiyuan b47b0cb8b9 更新 config.py 2023-12-25 16:43:38 +08:00
wangsiyuan f5e4386ba3 更新 views.py 2023-12-25 16:43:32 +08:00
5 changed files with 84 additions and 50 deletions

View File

@ -1,9 +1,16 @@
from flask import Flask, request, redirect, url_for, render_template, session, jsonify from flask import Flask, request, redirect, url_for, render_template, session, jsonify
from db.connection import MySQLPool
from config import SECRET_KEY from config import SECRET_KEY
from db.database_manager import DatabaseManager
from models.User import User
app = Flask(__name__) app = Flask(__name__)
app.secret_key = SECRET_KEY # 从配置文件设置 app.secret_key = SECRET_KEY # 从配置文件设置
# 一个全局MySQLPool对象用于管理数据库连接
mysql_pool = MySQLPool()
@app.route('/') @app.route('/')
def index(): def index():
# 如果用户已登录,则重定向到主页;否则,重定向到登录页面 # 如果用户已登录,则重定向到主页;否则,重定向到登录页面
@ -11,42 +18,53 @@ def index():
return redirect(url_for('home')) return redirect(url_for('home'))
else: else:
return render_template('login.html') return render_template('login.html')
@app.route('/register', methods=['GET', 'POST']) @app.route('/register', methods=['GET', 'POST'])
def register(): def register():
if request.method == 'POST': if request.method == 'POST':
# 解析JSON数据而不是表单数据
data = request.get_json() data = request.get_json()
nick_name = data['nickname'] # print(data)
print(nick_name) user = User(
# 处理注册逻辑... nickname=data.get('nickname'),
return jsonify({"success": True, "message": "注册成功"}) # 返回JSON响应 phone_number=data.get('cellphone'), # 确保JSON中的键和这里匹配
password=data.get('password'),
identity=data.get('identity'),
is_active=True # 或者根据你的逻辑设置
)
db_manager = DatabaseManager()
if not db_manager.user_exists(user.phone_number):
db_manager.insert_user(user)
return jsonify({"success": True, "message": "注册成功"})
else:
return jsonify({"success": False, "message": "用户已存在"})
else: else:
return render_template('register.html') return render_template('register.html')
@app.route('/login', methods=['GET', 'POST']) @app.route('/login', methods=['GET', 'POST'])
def login(): def login():
if request.method == 'GET': if request.method == 'GET':
return render_template('login.html') return render_template('login.html')
else: else:
username = request.form['username'] phone_number = request.form['username']
password = request.form['password'] password = request.form['password']
print(username, password) db_manager = DatabaseManager()
# 验证用户名和密码... # 验证用户名和密码...
if valid_login(username, password): if db_manager.valid_login(phone_number, password):
# 登录成功 # 登录成功
session['username'] = username session['username'] = phone_number
return jsonify(success=True, message="登录成功") return jsonify(success=True, message="登录成功")
else: else:
# 登录失败 # 登录失败
return jsonify(success=False, message="无效的用户名或密码") return jsonify(success=False, message="无效的用户名或密码")
@app.route('/forget', methods=['GET', 'POST']) @app.route('/forget', methods=['GET', 'POST'])
def forget_page(): def forget_page():
return render_template('forget.html') return render_template('forget.html')
@app.route('/home') @app.route('/home')
def home(): def home():
if 'username' in session: if 'username' in session:
@ -54,6 +72,7 @@ def home():
else: else:
return redirect("login") return redirect("login")
@app.route('/logout') @app.route('/logout')
def logout(): def logout():
# 清除session中的所有信息 # 清除session中的所有信息
@ -62,10 +81,5 @@ def logout():
return redirect('/login') return redirect('/login')
def valid_login(username, password):
# 这里应该是验证用户名和密码的逻辑,比如查询数据库等等
# 假设用户名是admin且密码是secret
return username == '1' and password == '1'
if __name__ == '__main__': if __name__ == '__main__':
app.run(debug=True) app.run(debug=True)

View File

@ -1,4 +1,5 @@
# config.py # config.py
import pymysql
# app secretkey # app secretkey
SECRET_KEY = 'sUNiJ7QPulxrbmZD' SECRET_KEY = 'sUNiJ7QPulxrbmZD'
@ -6,9 +7,10 @@ SECRET_KEY = 'sUNiJ7QPulxrbmZD'
# 数据库连接配置 # 数据库连接配置
DB_CONFIG = { DB_CONFIG = {
'host': '42.193.20.110', 'host': '42.193.20.110',
'port': 8006, # 注意端口是数字,不是字符串
'user': 'test', 'user': 'test',
'password': 'X7gq9lbxqpDGbyCi', 'password': 'X7gq9lbxqpDGbyCi',
'database': 'test_db', 'database': 'test_db',
'charset': 'utf8mb4', 'charset': 'utf8mb4',
'cursorclass': 'pymysql.cursors.DictCursor' 'cursorclass': pymysql.cursors.DictCursor
} }

View File

@ -20,16 +20,3 @@ class MySQLPool:
def get_connection(self): def get_connection(self):
# 从连接池中获取一个连接 # 从连接池中获取一个连接
return self.pool.connection() return self.pool.connection()
# 使用上下文管理器自动处理连接的开启和关闭
def execute(self, sql, args=None):
with self.get_connection() as connection:
with connection.cursor() as cursor:
cursor.execute(sql, args)
if sql.strip().lower().startswith("select"):
# 如果是查询操作,返回所有结果
return cursor.fetchall()
else:
# 如果是增、删、改操作,提交事务并返回影响的行数
connection.commit()
return cursor.rowcount

View File

@ -1,28 +1,55 @@
import pymysql import pymysql
from config import DB_CONFIG from db.connection import MySQLPool
import bcrypt
class DatabaseManager: class DatabaseManager:
def __init__(self): def __init__(self):
self.connection = pymysql.connect(**DB_CONFIG) # 使用MySQLPool初始化数据库连接池
self.pool = MySQLPool()
def fetch(self, query, params=None): def fetch(self, query, params=None):
# 实现查询逻辑 conn = self.pool.get_connection()
pass try:
cursor = conn.cursor()
cursor.execute(query, params or ())
result = cursor.fetchall()
return result
finally:
cursor.close()
conn.close()
def insert(self, query, params=None): def execute(self, query, params=None):
# 实现插入逻辑 conn = self.pool.get_connection()
pass try:
cursor = conn.cursor()
cursor.execute(query, params or ())
conn.commit()
return cursor.rowcount
finally:
cursor.close()
conn.close()
def update(self, query, params=None): def user_exists(self, phone_number):
# 实现更新逻辑 sql = "SELECT 1 FROM user WHERE phone_number=%s LIMIT 1"
pass result = self.fetch(sql, (phone_number,))
return len(result) > 0
def delete(self, query, params=None): def insert_user(self, user):
# 实现删除逻辑 sql = """
pass 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 close(self): def valid_login(self, phone_number, password_attempt):
# 关闭数据库连接 # SQL查询获取用户的哈希密码
self.connection.close() sql = "SELECT password FROM user WHERE phone_number=%s LIMIT 1"
result = self.fetch(sql, (phone_number,))
# 可能还包含其他数据库操作方法... if result:
stored_hash = result[0]['password'] # 假设结果是密码字段
# 使用bcrypt进行密码验证
if bcrypt.checkpw(password_attempt.encode('utf-8'), stored_hash.encode('utf-8')):
return True # 密码匹配,登录成功
return False # 密码不匹配或用户不存在,登录失败

View File

@ -1,10 +1,14 @@
import bcrypt
class User: class User:
def __init__(self, nickname, phone_number, password, identity, is_active): def __init__(self, nickname, phone_number, password, identity, is_active):
self.nickname = nickname # 用户昵称 self.nickname = nickname # 用户昵称
self.phone_number = phone_number # 手机号 self.phone_number = phone_number # 手机号
self.password = password # 密码 self.password = self.hash_password(password) # 哈希密码
self.identity = identity # 身份(老师或学生) self.identity = identity # 身份(老师或学生)
self.is_active = is_active # 状态(是否可用) self.is_active = is_active # 状态(是否可用)
def hash_password(self, password):
return bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
def __str__(self): def __str__(self):
return f"User({self.nickname}, {self.phone_number}, {'Teacher' if self.identity == 'teacher' else 'Student'}, {'Active' if self.is_active else 'Inactive'})" return f"User({self.nickname}, {self.phone_number}, {'Teacher' if self.identity == 'teacher' else 'Student'}, {'Active' if self.is_active else 'Inactive'})"