大作业-修改了主页

This commit is contained in:
Jingfan Ke 2024-06-12 00:02:55 +08:00
parent b59880f301
commit e48e752b91
20 changed files with 415 additions and 190 deletions

View File

@ -1,10 +1,102 @@
DROP TABLE IF EXISTS passengers; DROP TABLE IF EXISTS Sold;
DROP TABLE IF EXISTS Transactions;
DROP TABLE IF EXISTS Passbys;
DROP TABLE IF EXISTS Tickets;
DROP TABLE IF EXISTS Seats;
DROP TABLE IF EXISTS Users;
DROP TABLE IF EXISTS Passengers;
DROP TABLE IF EXISTS Rides;
DROP TABLE IF EXISTS Trains;
DROP TABLE IF EXISTS Stations;
CREATE TABLE passengers ( CREATE TABLE Passengers (
ID BIGINT PRIMARY KEY, ID BIGINT PRIMARY KEY,
`Name` VARCHAR (255) NOT NULL, `Name` VARCHAR ( 255 ) NOT NULL,
Phone_number BIGINT UNIQUE NOT NULL, Phone_number BIGINT UNIQUE NOT NULL,
`Password` VARCHAR (255) NOT NULL, CHECK ( REGEXP_LIKE ( ID, '^\\d{18}$' ) ),
CHECK (ID REGEXP '^\\d{18}$'), CHECK ( REGEXP_LIKE ( Phone_number, '^\\d{11}$' ) )
CHECK (Phone_number REGEXP '^\\d{11}$') );
CREATE TABLE Users (
ID INT AUTO_INCREMENT PRIMARY KEY,
`Password` VARCHAR ( 255 ) NOT NULL,
Phone_number BIGINT UNIQUE NOT NULL,
CitizenID BIGINT UNIQUE NOT NULL,
FOREIGN KEY ( Phone_number ) REFERENCES Passengers ( Phone_number ) ON DELETE CASCADE,
FOREIGN KEY ( CitizenID ) REFERENCES Passengers ( ID ) ON DELETE CASCADE
);
CREATE TABLE Stations (
ID INT AUTO_INCREMENT PRIMARY KEY,
`Name` VARCHAR ( 255 ) UNIQUE NOT NULL,
Province VARCHAR ( 255 ) NOT NULL,
City VARCHAR ( 255 ) NOT NULL
);
CREATE TABLE Trains (
ID VARCHAR ( 255 ) PRIMARY KEY,
TrainName VARCHAR ( 255 ) NOT NULL,
StationID_start INT NOT NULL,
StationID_arrive INT NOT NULL,
FOREIGN KEY ( StationID_start ) REFERENCES Stations ( ID ) ON DELETE CASCADE,
FOREIGN KEY ( StationID_arrive ) REFERENCES Stations ( ID ) ON DELETE CASCADE
);
CREATE TABLE Seats (
ID VARCHAR ( 255 ) PRIMARY KEY,
Type VARCHAR ( 255 ) NOT NULL,
TrainID VARCHAR ( 255 ) NOT NULL,
FOREIGN KEY ( TrainID ) REFERENCES Trains ( ID ) ON DELETE CASCADE
);
CREATE TABLE Tickets (
ID INT AUTO_INCREMENT PRIMARY KEY,
Price DECIMAL ( 7, 2 ) NOT NULL,
Time_start DATETIME NOT NULL,
Time_arrive DATETIME NOT NULL,
StationID_start INT NOT NULL,
StationID_arrive INT NOT NULL,
SeatID VARCHAR ( 255 ) NOT NULL,
FOREIGN KEY ( StationID_start ) REFERENCES Stations ( ID ) ON DELETE CASCADE,
FOREIGN KEY ( StationID_arrive ) REFERENCES Stations ( ID ) ON DELETE CASCADE,
FOREIGN KEY ( SeatID ) REFERENCES Seats ( ID ) ON DELETE CASCADE,
CHECK ( Time_start <= Time_arrive )
);
CREATE TABLE Transactions (
ID BIGINT AUTO_INCREMENT PRIMARY KEY,
`Time` DATETIME NOT NULL,
Paid TINYINT NOT NULL,
`User` INT NOT NULL,
PassengerID BIGINT NOT NULL,
TrainID VARCHAR ( 255 ) NOT NULL,
StationID_start INT NOT NULL,
StationID_arrive INT NOT NULL,
Time_start DATETIME NOT NULL,
Time_arrive DATETIME NOT NULL,
SeatID VARCHAR ( 255 ) NOT NULL,
FOREIGN KEY ( `User` ) REFERENCES Users ( ID ) ON DELETE CASCADE,
FOREIGN KEY ( PassengerID ) REFERENCES Passengers ( ID ) ON DELETE CASCADE,
FOREIGN KEY ( TrainID ) REFERENCES Trains ( ID ) ON DELETE CASCADE,
FOREIGN KEY ( StationID_start ) REFERENCES Stations ( ID ) ON DELETE CASCADE,
FOREIGN KEY ( StationID_arrive ) REFERENCES Stations ( ID ) ON DELETE CASCADE,
FOREIGN KEY ( SeatID ) REFERENCES Seats ( ID ) ON DELETE CASCADE,
CHECK ( Time_start < Time_arrive )
);
CREATE TABLE Sold (
TransactionID BIGINT NOT NULL,
TicketID INT NOT NULL,
FOREIGN KEY ( TransactionID ) REFERENCES Transactions ( ID ) ON DELETE CASCADE,
FOREIGN KEY ( TicketID ) REFERENCES Tickets ( ID ) ON DELETE CASCADE
);
CREATE TABLE Passbys (
StationID INT NOT NULL,
TrainID VARCHAR ( 255 ) NOT NULL,
arrive_time DATETIME NOT NULL,
leave_time DATETIME NOT NULL,
FOREIGN KEY ( StationID ) REFERENCES Stations ( ID ) ON DELETE CASCADE,
FOREIGN KEY ( TrainID ) REFERENCES Trains ( ID ) ON DELETE CASCADE,
CHECK ( arrive_time <= leave_time )
); );

0
Project/func/__init__.py Normal file
View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

7
Project/func/get_db.py Normal file
View File

@ -0,0 +1,7 @@
import pymysql
def get_db():
return pymysql.connect(
host='localhost', user='kejingfan',
password='KJF2811879', database='TESTDB'
)

4
Project/func/index.py Normal file
View File

@ -0,0 +1,4 @@
from flask import render_template
def index():
return render_template("index.html")

79
Project/func/modify.py Normal file
View File

@ -0,0 +1,79 @@
from flask import render_template, request, flash, redirect, url_for
from typing import Dict
from .get_db import get_db
from .verify_user import verify_user
class ModifyInfo:
def __init__(self, form:Dict[str, str]):
self.id = form['cardCode']
modifyType = form['modifyType']
self.new_password = form['encryptedNewPassword']
self.phone_number = form['mobileNo']
modifyType2command = {
'1':'delete account',
'2':'modify Password',
'3':'modify Phone_Number'
}
self.sql_dict = {
'delete account': 'DELETE FROM passengers WHERE ID = %s;',
'modify Password': 'UPDATE passengers SET `Password` = %s WHERE ID = %s;',
'modify Phone_Number': 'UPDATE passengers SET Phone_number = %s WHERE ID = %s;'
}
self.sql_args_dict = {
'delete account': (self.id,),
'modify Password': (self.new_password, self.id),
'modify Phone_Number': (self.phone_number, self.id)
}
self.ok_message_dict = {
'delete account': "删除账户成功",
'modify Password': "修改密码成功",
'modify Phone_Number': "修改手机号成功"
}
self.fail_message_dict = {
'delete account': "数据库异常,删除账户失败",
'modify Password': "数据库异常,修改密码失败",
'modify Phone_Number': "数据库异常,修改手机号失败"
}
self.command = modifyType2command[modifyType]
def get_sql(self):
return self.sql_dict[self.command]
def get_args(self):
return self.sql_args_dict[self.command]
def get_ok_message(self):
return self.ok_message_dict[self.command]
def get_fail_message(self):
return self.fail_message_dict[self.command]
def modify():
if request.method == 'GET':
return render_template('modify.html')
if request.method == 'POST':
id = request.form['cardCode']
password = request.form['encryptedPassword']
db = get_db()
cursor = db.cursor()
verify_info = verify_user(cursor, id, password)
if (verify_info == "NO_USER"):
flash("您未注册过,无法修改账号")
db.close()
return redirect(url_for('signup'))
elif (verify_info == "WRONG_PASSWORD"):
flash("密码错误")
db.close()
return redirect(url_for('modify'))
modifyInfo = ModifyInfo(request.form)
try:
cursor.execute(modifyInfo.get_sql(), modifyInfo.get_args())
db.commit()
flash(modifyInfo.get_ok_message())
except Exception as e:
db.rollback()
print(e)
flash(modifyInfo.get_fail_message())
db.close()
return redirect(url_for('index'))

48
Project/func/signup.py Normal file
View File

@ -0,0 +1,48 @@
from flask import render_template, request, flash, redirect, url_for
from .get_db import get_db
def signup():
if request.method == 'GET':
return render_template('signup.html')
if request.method == 'POST':
id = request.form['cardCode']
name = request.form['name']
phone_number = request.form['mobileNo']
password = request.form['encryptedPassword']
db = get_db()
cursor = db.cursor()
# 检查已有用户
sql = """
SELECT COUNT(*) FROM Users \
WHERE ID = %s;
"""
try:
cursor.execute(sql, (id,))
id_exist = cursor.fetchall()[0][0]
except Exception as e:
flash("数据库异常,查询失败")
print(e)
return redirect(url_for('signup'))
if (id_exist != 0):
flash("您已注册过,请勿重复注册")
db.close()
return redirect(url_for('index'))
# 插入
sql = '''
INSERT INTO passengers (ID, `Name`, Phone_number, `Password`) \
VALUES (%s, %s, %s, %s); \
'''
try:
cursor.execute(sql, (id, name, phone_number, password))
db.commit()
flash("注册成功")
except Exception as e:
db.rollback()
print(e)
flash("数据库异常,注册失败")
db.close()
return redirect(url_for('index'))

View File

@ -0,0 +1,35 @@
from flask import flash, redirect, url_for
from pymysql.cursors import Cursor
def verify_user(cursor:Cursor, id:str, password:str) -> str:
# 检查已有用户
sql = """
SELECT COUNT(*) FROM passengers \
WHERE ID = %s;
"""
try:
cursor.execute(sql, (id,))
id_exist = cursor.fetchall()[0][0]
except Exception as e:
flash("数据库异常,查询失败")
print(e)
return redirect(url_for('signup'))
if (id_exist == 0):
return "NO_USER"
# 检查密码
sql = """
SELECT `Password` FROM passengers \
WHERE ID = %s;
"""
try:
cursor.execute(sql, (id,))
record_password = cursor.fetchall()[0][0]
except Exception as e:
flash("数据库异常,查询失败")
print(e)
return redirect(url_for('modify'))
if (record_password != password):
return "WRONG_PASSWORD"
return "USER_VERIFIED"

View File

@ -1,179 +1,22 @@
from flask import Flask, render_template, request, flash, redirect, url_for from flask import Flask
import pymysql
from pymysql.cursors import Cursor
import os import os
from typing import Dict
import func.index
import func.signup
import func.modify
app = Flask(__name__) app = Flask(__name__)
app.secret_key = os.environ.get('SECRET_KEY', 'OPTIONALSECRETKEY') app.secret_key = os.environ.get('SECRET_KEY', 'OPTIONALSECRETKEY')
def get_db():
return pymysql.connect(
host='localhost', user='kejingfan',
password='KJF2811879', database='TESTDB'
)
@app.route("/") @app.route("/")
def index(): def index():
return render_template("index.html") return func.index.index()
@app.route("/signup.html", methods=('GET', 'POST')) @app.route("/signup.html", methods=('GET', 'POST'))
def signup(): def signup():
if request.method == 'GET': return func.signup.signup()
return render_template('signup.html')
if request.method == 'POST':
id = request.form['cardCode']
name = request.form['name']
phone_number = request.form['mobileNo']
password = request.form['encryptedPassword']
db = get_db()
cursor = db.cursor()
# 检查已有用户
sql = """
SELECT COUNT(*) FROM passengers \
WHERE ID = %s;
"""
try:
cursor.execute(sql, (id,))
id_exist = cursor.fetchall()[0][0]
except Exception as e:
flash("数据库异常,查询失败")
print(e)
return redirect(url_for('signup'))
if (id_exist != 0):
flash("您已注册过,请勿重复注册")
db.close()
return redirect(url_for('index'))
# 插入
sql = '''
INSERT INTO passengers (ID, `Name`, Phone_number, `Password`) \
VALUES (%s, %s, %s, %s); \
'''
try:
cursor.execute(sql, (id, name, phone_number, password))
db.commit()
flash("注册成功")
except Exception as e:
db.rollback()
print(e)
flash("数据库异常,注册失败")
db.close()
return redirect(url_for('index'))
def verify_user(cursor:Cursor, id:str, password:str) -> str:
# 检查已有用户
sql = """
SELECT COUNT(*) FROM passengers \
WHERE ID = %s;
"""
try:
cursor.execute(sql, (id,))
id_exist = cursor.fetchall()[0][0]
except Exception as e:
flash("数据库异常,查询失败")
print(e)
return redirect(url_for('signup'))
if (id_exist == 0):
return "NO_USER"
# 检查密码
sql = """
SELECT `Password` FROM passengers \
WHERE ID = %s;
"""
try:
cursor.execute(sql, (id,))
record_password = cursor.fetchall()[0][0]
except Exception as e:
flash("数据库异常,查询失败")
print(e)
return redirect(url_for('modify'))
if (record_password != password):
return "WRONG_PASSWORD"
return "USER_VERIFIED"
class ModifyInfo:
def __init__(self, form:Dict[str, str]):
self.id = form['cardCode']
modifyType = form['modifyType']
self.new_password = form['encryptedNewPassword']
self.phone_number = form['mobileNo']
modifyType2command = {
'1':'delete account',
'2':'modify Password',
'3':'modify Phone_Number'
}
self.sql_dict = {
'delete account': 'DELETE FROM passengers WHERE ID = %s;',
'modify Password': 'UPDATE passengers SET `Password` = %s WHERE ID = %s;',
'modify Phone_Number': 'UPDATE passengers SET Phone_number = %s WHERE ID = %s;'
}
self.sql_args_dict = {
'delete account': (self.id,),
'modify Password': (self.new_password, self.id),
'modify Phone_Number': (self.phone_number, self.id)
}
self.ok_message_dict = {
'delete account': "删除账户成功",
'modify Password': "修改密码成功",
'modify Phone_Number': "修改手机号成功"
}
self.fail_message_dict = {
'delete account': "数据库异常,删除账户失败",
'modify Password': "数据库异常,修改密码失败",
'modify Phone_Number': "数据库异常,修改手机号失败"
}
self.command = modifyType2command[modifyType]
def get_sql(self):
return self.sql_dict[self.command]
def get_args(self):
return self.sql_args_dict[self.command]
def get_ok_message(self):
return self.ok_message_dict[self.command]
def get_fail_message(self):
return self.fail_message_dict[self.command]
@app.route("/modify.html", methods=('GET', 'POST')) @app.route("/modify.html", methods=('GET', 'POST'))
def modify(): def modify():
if request.method == 'GET': return func.modify.modify()
return render_template('modify.html')
if request.method == 'POST':
id = request.form['cardCode']
password = request.form['encryptedPassword']
db = get_db()
cursor = db.cursor()
verify_info = verify_user(cursor, id, password)
if (verify_info == "NO_USER"):
flash("您未注册过,无法修改账号")
db.close()
return redirect(url_for('signup'))
elif (verify_info == "WRONG_PASSWORD"):
flash("密码错误")
db.close()
return redirect(url_for('modify'))
modifyInfo = ModifyInfo(request.form)
try:
cursor.execute(modifyInfo.get_sql(), modifyInfo.get_args())
db.commit()
flash(modifyInfo.get_ok_message())
except Exception as e:
db.rollback()
print(e)
flash(modifyInfo.get_fail_message())
db.close()
return redirect(url_for('index'))

View File

@ -1 +1,3 @@
SECRET_KEY='ILOVEDATABASETECH' FLASK_APP=main FLASK_ENV=development flask run SECRET_KEY='ILOVEDATABASETECH' FLASK_APP=main FLASK_ENV=development flask run \
--host 0.0.0.0 \
--port 5000 # default 5000

View File

@ -0,0 +1,95 @@
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #ffffff;
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
}
header {
background-color: rgba(28, 108, 178, 0.9);
color: white;
padding: 20px 0;
text-align: center;
width: 100%;
}
nav ul {
list-style: none;
padding: 0;
margin: 0;
}
nav ul li {
display: inline;
margin: 0 10px;
}
nav ul li a {
color: white;
text-decoration: none;
font-weight: bold;
}
main {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
}
.background-container {
width: 100%;
max-width: 1500px;
height: 600px; /* Adjust according to the desired size */
background-image: url('/static/images/banner-login-20200629.jpg');
background-size: cover;
background-position: center;
background-repeat: no-repeat;
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
.content {
background-color: rgba(255, 255, 255, 0.8);
padding: 20px;
border-radius: 10px;
text-align: center;
position: absolute;
}
h2 {
color: #1c6cb2;
}
.links {
margin-top: 20px;
}
.links .btn {
background-color: #1c6cb2;
color: white;
padding: 10px 20px;
text-decoration: none;
border-radius: 5px;
margin: 10px;
display: inline-block;
}
.links .btn:hover {
background-color: #155a8c;
}
footer {
background-color: rgba(28, 108, 178, 0.9);
color: white;
text-align: center;
padding: 10px 0;
width: 100%;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

View File

@ -0,0 +1,8 @@
window.onload = function() {
// Display flashed messages, if any
const messages = [];
// Assuming messages are added via server-side templating
if (messages.length > 0) {
alert(messages.join("\n"));
}
};

View File

@ -1,24 +1,36 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh-CN"> <html lang="zh-CN">
<head> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>我的12306官网</title> <title>我的12306官网</title>
<script> <link rel="stylesheet" href="{{ url_for('static', filename='css/index.css') }}">
window.onload = function() { <script src="{{ url_for('static', filename='js/index.js') }}" defer></script>
{% with messages = get_flashed_messages() %}
{% if messages %}
var message = "";
{% for msg in messages %}
message += "{{ msg }}\n";
{% endfor %}
alert(message);
{% endif %}
{% endwith %}
};
</script>
</head> </head>
<body> <body>
<h1>Coming soon~</h1> <header>
<div><a href="signup.html">点击跳转注册</a></div> <h1>中国铁路12306</h1>
<div><a href="modify.html">点击跳转修改账号</a></div> <nav>
<ul>
<li><a href="{{ url_for('index') }}">首页</a></li>
<li><a href="{{ url_for('signup') }}">注册</a></li>
<li><a href="{{ url_for('modify') }}">修改账号</a></li>
</ul>
</nav>
</header>
<main>
<div class="background-container">
<div class="content">
<h2>尽享精彩出行服务</h2>
<div class="links">
<a class="btn" href="{{ url_for('signup') }}">点击跳转注册</a>
<a class="btn" href="{{ url_for('modify') }}">点击跳转修改账号</a>
</div>
</div>
</div>
</main>
<footer>
<p>&copy; 2024 中国铁路12306. 保留所有权利。</p>
</footer>
</body> </body>
</html> </html>