?作者介紹:大二本科網(wǎng)絡(luò)工程專業(yè)在讀,持續(xù)學(xué)習(xí)Java,努力輸出優(yōu)質(zhì)文章
?作者主頁:@逐夢蒼穹
?所屬專欄:項(xiàng)目。
1、前言
本文介紹的是用python實(shí)現(xiàn)的前后端學(xué)生管理系統(tǒng)
,前后端分離
,較為簡單易上手。使用的技術(shù)點(diǎn)為:HTML+CSS+JavaScript+Flask+sqlite+Vue+Axios。
如果想了解前后端不分離的情況,請看我這篇文章:
python實(shí)現(xiàn)前后端學(xué)生管理系統(tǒng)(前后端不分離)
2、思路總覽
下面是關(guān)于實(shí)現(xiàn)的功能的總覽:
首頁
①管理系統(tǒng)的首頁:(如有需求,可以自行使用前端框架美化)
??
其中:
注冊和登陸是鏈接:
??注冊鏈接到注冊功能頁面
??登陸鏈接到登陸功能頁面
注冊
②注冊
注冊功能頁面,注冊功能頁面自定義,需要包含如下注冊信息并對輸入內(nèi)容進(jìn)行校驗(yàn):
注冊信息 | 驗(yàn)證規(guī)則 |
---|---|
姓名 | 姓名縮寫,不能為空 |
學(xué)號 | 數(shù)字類型,不能為空 |
學(xué)院 | 不能為空 |
專業(yè) | 不能為空 |
班級 | 不能為空 |
年齡 | 17-22間的任意數(shù)字,數(shù)字類型,不能為空 |
電話 | 數(shù)字類型,不能為空 |
郵件格式 | |
用戶名 | 字母大小寫、數(shù)字、下劃線四種類型至少包含三種,字母開始,長度至少6位 |
密碼 | 字母大小寫、數(shù)字、下劃線四種類型至少包含三種,長度至少8位 |
確認(rèn)密碼 | 重復(fù)密碼 |
基本流程:驗(yàn)證成功后,這些注冊信息都需要寫入sqlite的數(shù)據(jù)庫stu.db的students表中(該表需要先單獨(dú)創(chuàng)建,字段為上面的注冊信息,名字自定義,類型要滿足需求,另外用戶名設(shè)置為主鍵,這樣表中的用戶名取值就不能相同)。然后跳轉(zhuǎn)到注冊成功頁面,該頁面有返回首頁鏈接。
登錄
③登錄
登陸功能頁面,該頁面需要輸入用戶名和密碼,輸入的用戶名和密碼與students表中已有記錄進(jìn)行比對,若用戶名和對應(yīng)密碼在表中存在則跳轉(zhuǎn)到登陸成功頁面,否則提示用戶名不存在或密碼錯誤,不跳轉(zhuǎn)。登陸成功頁面直接以表格方式顯示自己注冊的所有信息,如下:
管理員
④管理員賬號
創(chuàng)建一個admin表,字段包括管理員名和密碼,自己通過sql語句插入三條記錄,即創(chuàng)建三個管理員賬號。
網(wǎng)站有個路徑為/admin,供管理員賬號登陸的頁面:
登錄之后展示全部信息:
3、詳細(xì)代碼
3.1、項(xiàng)目目錄
3.2、static
static文件夾需要導(dǎo)入兩個框架,一個是vue.js,一個屬axios.js(這個是本項(xiàng)目實(shí)現(xiàn)前后端分離的關(guān)鍵:發(fā)送異步請求)
需要這兩個框架文件可以點(diǎn)贊收藏加關(guān)注,私聊我發(fā)給你。
3.3、templates
3.3.1、01.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>xzl</title>
<style>
h1 {color:black}
a:link {color:#9932CC;align-items:center}
</style>
</head>
<body>
<div id="app">
<br>
<h1 style="font-size:60px">歡迎訪問本站</h1><br>
<h1>
<a href="/newStudent" @click="register">注冊</a><br><br>
<a href="/enter" @click="login">登錄</a><br>
</h1>
</div>
</body>
</html>
3.3.2、02.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>xzl</title>
<style>
</style>
</head>
<body>
<div id="app" style="text-align:center;">
<h1>用戶登錄</h1><br>
<form @submit.prevent="login">
用戶名: <input type="text" v-model="username" name="user"><br><br>
密碼: <input type="password" v-model="password" name="pwd"><br><br>
<input type="submit" value="登錄" /><br><br>
</form>
<a href="/" style="color:#3CBC8D;">返回首頁</a>
</div>
<script src="static/js/vue.js"></script>
<script src="static/js/axios-0.18.0.js"></script>
<script>
new Vue({
el: '#app',
data: {
username: '',
password: '',
message: ''
},
methods: {
login() {
axios.post('/check', {
username: this.username,
password: this.password
})
.then(response => {
this.message = response.data.message;
if (response.data.redirect) {
alert(this.message)
// 進(jìn)行頁面跳轉(zhuǎn)
window.loc1ation.href = response.data.redirect;
}else {
alert(this.message)
}
})
.catch(error => {
console.error(error);
// 在這里處理請求錯誤
});
}
}
});
</script>
</body>
</html>
3.3.3、03.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>xzl</title>
<script>
function submitForm(event) {
event.preventDefault();
const name = document.getElementById('name').value;
const num = document.getElementById('number').value;
const academy = document.getElementById('academy').value;
const major = document.getElementById('major').value;
const Class = document.getElementById('Class').value;
const age = document.getElementById('age').value;
const phone = document.getElementById('phone-number').value;
const email = document.getElementById('email').value;
const user = document.getElementById('user').value;
const pwd = document.getElementById('password').value;
const repwd = document.getElementById('surePassword').value;
if (pwd !== repwd) {
document.getElementById('message').textContent = '兩次密碼不一致';
return;
}
const data = {
name: name,
num: num,
academy: academy,
major: major,
Class: Class,
age: age,
phone: phone,
email: email,
user: user,
pwd: pwd
};
fetch('/addrec', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(result => {
if (result.success) {
alert(result.message);
document.getElementById('message').textContent = '';
document.getElementById('name').value = '';
document.getElementById('number').value = '';
document.getElementById('academy').value = '';
document.getElementById('major').value = '';
document.getElementById('Class').value = '';
document.getElementById('age').value = '';
document.getElementById('phone-number').value = '';
document.getElementById('email').value = '';
document.getElementById('user').value = '';
document.getElementById('password').value = '';
document.getElementById('surePassword').value = '';
} else {
document.getElementById('message').textContent = result.message + ' ' + result.reason;
}
})
.catch(error => {
console.error('Error:', error);
document.getElementById('message').textContent = '請求失敗';
});
}
var flag = false;
function checkName() {
var name = document.getElementById("name").value;
if (name.length == 0 || name == null) {
document.getElementById("name-error").innerHTML = "名字不能為空";
flag = false;
}else {
document.getElementById("name-error").innerHTML = "";
flag=true;
}
}
function checkNumber() {
var number = document.getElementById("number").value;
if (number.length == 0 || number == null) {
document.getElementById("number-error").innerHTML = "學(xué)號不能為空";
flag = false;
} else {
var regex = /^\d+$/;
if (!regex.test(number)) {
document.getElementById("number-error").innerHTML = "學(xué)號必須是數(shù)字";
flag = false;
} else {
document.getElementById("number-error").innerHTML = "";
flag=true;
}
}
}
function checkAcademy() {
var academy = document.getElementById("academy").value;
if (academy.length == 0 || academy == null) {
document.getElementById("academy-error").innerHTML = "學(xué)院不能為空";
flag = false;
} else {
document.getElementById("academy-error").innerHTML = "";
flag=true;
}
}
function checkMajor() {
var flag = false;
var major = document.getElementById("major").value;
if (major.length == 0 || major == null) {
document.getElementById("major-error").innerHTML = "專業(yè)不能為空";
flag = false;
} else {
document.getElementById("major-error").innerHTML = "";
flag=true;
}
}
function checkCLASS() {
var classValue = document.getElementById("Class").value;
if (classValue.length == 0 || classValue == null) {
document.getElementById("Class-error").innerHTML = "班級不能為空";
flag = false;
} else {
document.getElementById("Class-error").innerHTML = "";
flag=true;
}
}
function checkAge() {
var age = document.getElementById("age").value;
if (age.length == 0 || age == null) {
document.getElementById("age-error").innerHTML = "年齡不能為空";
flag = false;
} else if (isNaN(age)) {
document.getElementById("age-error").innerHTML = "年齡必須為數(shù)字";
flag = false;
} else if (age < 17 || age > 22) {
document.getElementById("age-error").innerHTML = "年齡必須在17-22之間";
flag = false;
} else {
document.getElementById("age-error").innerHTML = "";
flag=true;
}
}
function checkPhoneNumber() {
var phoneNumber = document.getElementById("phone-number").value;
if (phoneNumber.length == 0 || phoneNumber == null) {
document.getElementById("phone-number-error").innerHTML = "電話號碼不能為空";
flag = false;
} else if (isNaN(phoneNumber)) {
document.getElementById("phone-number-error").innerHTML = "電話號碼必須為數(shù)字";
flag = false;
} else {
document.getElementById("phone-number-error").innerHTML = "";
flag = true;
}
}
function checkEmail() {
var email = document.getElementById("email").value;
if (email.length == 0 || email == null) {
document.getElementById("email-error").innerHTML = "郵箱不能為空";
flag = false;
} else {
var regex = /\S+@\S+\.\S+/;
if (!regex.test(email)) {
document.getElementById("email-error").innerHTML = "郵箱格式有誤";
flag = false;
} else {
document.getElementById("email-error").innerHTML = "";
flag=true;
}
}
}
function checkUser() {
var user = document.getElementById("user").value;
if (user.length < 6) {
document.getElementById("user-error").innerHTML = "用戶名長度不能少于6位";
flag = false;
} else {
var regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d|_)[a-zA-Z\d_]{6,}$/;
if (!regex.test(user)) {
document.getElementById("user-error").innerHTML = "用戶名必須包含字母大小寫、數(shù)字、下劃線四種類型中的至少三種";
flag = false;
} else {
document.getElementById("user-error").innerHTML = "";
flag=true;
}
}
}
function checkPassword() {
var password = document.getElementById("password").value;
if (password.length < 8) {
document.getElementById("password-error").innerHTML = "密碼長度不能少于8個字符";
flag = false;
} else {
var regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d|_)[a-zA-Z\d_]{8,}$/;
if (!regex.test(password)) {
document.getElementById("password-error").innerHTML = "密碼必須包含字母大小寫、數(shù)字、下劃線四種類型中的至少三種";
flag = false;
} else {
document.getElementById("password-error").innerHTML = "";
flag = true;
}
}
}
function checkSurePassword() {
var password1 = document.getElementById("password").value;
var password2 = document.getElementById("surePassword").value;
if(password1!=password2){
document.getElementById("surePassword-error").innerHTML = "兩次密碼不一致";
flag = false;
}else {
document.getElementById("surePassword-error").innerHTML = "";
flag=true;
}
}
function checkForm() {
var nameValid = checkName();
var numberValid = checkNumber();
var academyValid = checkAcademy();
var majorValid = checkMajor();
var classValid = checkCLASS();
var ageValid = checkAge();
var phoneNumberValid = checkPhoneNumber();
var emailValid = checkEmail();
var userValid = checkUser();
var passwordValid = checkPassword();
var surePasswordValid = checkSurePassword();
if(flag){
alert("提交成功")
return true;
}else{
alert("提交失敗")
return false;
}
}
</script>
</head>
<body>
<h1>歡迎注冊</h1>
<form onsubmit="submitForm(event)">
<h3>請?zhí)顚懩愕男畔?span id="n5n3t3z" class="token tag"></h3>
<h4>
姓名: <input type="text" name="name" id="name" onblur="checkName()">
<span id="name-error" style="color: red;"></span><br>
學(xué)號: <input type="text" name="num" id="number" onblur="checkNumber()">
<span id="number-error" style="color: red;"></span><br>
學(xué)院: <input type="text" name="academy" id="academy" onblur="checkAcademy()">
<span id="academy-error" style="color: red;"></span><br>
專業(yè): <input type="text" name="major" id="major" onblur="checkMajor()">
<span id="major-error" style="color: red;"></span><br>
班級: <input type="text" name="Class" id="Class" onblur="checkCLASS()">
<span id="Class-error" style="color: red;"></span><br>
年齡: <input type="text" name="age" id="age" onblur="checkAge()">
<span id="age-error" style="color: red;"></span><br>
電話: <input type="text" name="phone" id="phone-number" onblur="checkPhoneNumber()">
<span id="phone-number-error" style="color: red;"></span><br>
Email: <input type="text" name="email" id="email" onblur="checkEmail()">
<span id="email-error" style="color: red;"></span><br>
用戶名: <input type="text" name="user" id="user" onblur="checkUser()">
<span id="user-error" style="color: red;"></span><br>
密碼: <input type="password" name="pwd" id="password" onblur="checkPassword()">
<span id="password-error" style="color: red;"></span><br>
確認(rèn)密碼: <input type="password" name="repwd" id="surePassword" onblur="checkSurePassword()">
<span id="surePassword-error" style="color: red;"></span><br>
</h4>
<input type="submit" value="提交">
<span id="message" style="color: red;"></span><br>
<h3><a href="/" style="color:#3CBC8D;">返回首頁</a></h3>
</form>
</body>
</html>
3.3.4、04.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>xzl</title>
<style>
#customers
{
width:88%;
border-collapse:collapse;
margin: auto;
}
th {
width:200px;
font-size: 1.1em;
text-align: left;
padding-top: 5px;
padding-bottom: 4px;
background-color: blue;
color: #ffffff;
white-space: nowrap;
}
td
{
border:1px solid #98bf21;
}
</style>
</head>
<body>
<div style="text-align:center;">
<h1>學(xué)生信息表</h1><br>
<table id="students-table">
<thead>
<th>name</th>
<th>num</th>
<th>academy</th>
<th>major</th>
<th>Class</th>
<th>age</th>
<th>phone</th>
<th>email</th>
<th>user</th>
</thead>
<tbody>
</tbody>
</table>
<br>
<a href="/" style="color:#3CBC8D;">返回首頁</a>
</div>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
var user = '{{ user }}';
axios.get('/List',{
params:{
user : user
}
})
.then(function(response) {
var student = response.data; // 獲取學(xué)生信息數(shù)組
var tableBody = document.querySelector('#students-table tbody');
//students.forEach(function(student) {
var row = '<tr>' +
'<td>' + student.name + '</td>' +
'<td>' + student.num + '</td>' +
'<td>' + student.academy + '</td>' +
'<td>' + student.major + '</td>' +
'<td>' + student.Class + '</td>' +
'<td>' + student.age + '</td>' +
'<td>' + student.phone + '</td>' +
'<td>' + student.email + '</td>' +
'<td>' + student.user + '</td>' +
'</tr>';
tableBody.innerHTML += row;
//});
})
.catch(function(error) {
console.log(error);
});
});
</script>
</body>
</html>
3.3.5、05.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>xzl</title>
<style>
</style>
</head>
<body>
<div id="app" style="text-align:center;">
<h1>管理員登錄</h1><br>
<form @submit.prevent="loginAdmin">
用戶名: <input type="text" v-model="username" name="user"><br><br>
密碼: <input type="password" v-model="password" name="pwd"><br><br>
<input type="submit" value="登錄" /><br><br>
</form>
<a href="/" style="color:#3CBC8D;">返回首頁</a>
</div>
<script src="static/js/vue.js"></script>
<script src="static/js/axios-0.18.0.js"></script>
<script>
new Vue({
el: '#app',
data: {
username: '',
password: '',
message: ''
},
methods: {
loginAdmin() {
axios.post('/checkAdmin', {
username: this.username,
password: this.password
})
.then(response => {
this.message = response.data.message;
if (response.data.redirect) {
alert(this.message)
// 進(jìn)行頁面跳轉(zhuǎn)
window.location.href = response.data.redirect;
}else {
alert(this.message)
}
})
.catch(error => {
console.error(error);
// 在這里處理請求錯誤
});
}
}
});
</script>
</body>
</html>
3.3.6、06.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>xzl</title>
<style>
#customers
{
width:98%;
border-collapse:collapse;
margin: auto;
}
th {
width:200px;
font-size: 1.1em;
text-align: left;
padding-top: 5px;
padding-bottom: 4px;
background-color: #ADD8E6;
color: #ffffff;
white-space: nowrap;
}
td
{
border:1px solid #98bf21;
}
</style>
</head>
<body>
<div style="text-align:center;">
<h1>管理員權(quán)限:學(xué)生信息表</h1><br>
<table id="students-table-admin">
<thead>
<th>姓名</th>
<th>學(xué)號</th>
<th>學(xué)院</th>
<th>專業(yè)</th>
<th>班級</th>
<th>年齡</th>
<th>電話</th>
<th>郵箱</th>
<th>用戶名</th>
<th>密碼</th>
<th>delete</th>
</thead>
<tbody>
</tbody>
</table>
<br>
<a href="/" style="color:#3CBC8D;">返回首頁</a>
</div>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
axios.get('/listAdmin',{
})
.then(function(response) {
var students = response.data.students; // 獲取學(xué)生信息數(shù)組
var tableBody = document.querySelector('#students-table-admin tbody');
students.forEach(function(student) {
var row = '<tr>' +
'<td>' + student.name + '</td>' +
'<td>' + student.num + '</td>' +
'<td>' + student.academy + '</td>' +
'<td>' + student.major + '</td>' +
'<td>' + student.Class + '</td>' +
'<td>' + student.age + '</td>' +
'<td>' + student.phone + '</td>' +
'<td>' + student.email + '</td>' +
'<td>' + student.user + '</td>' +
'<td>' + student.pwd + '</td>' +
'<td><a href="/delete/' + student.user + '">刪除</a></td>' +
'</tr>';
tableBody.innerHTML += row;
});
})
.catch(function(error) {
console.log(error);
});
});
</script>
</body>
</html>
3.4、sqlite.py
sqlite.py文件的代碼是用來生成數(shù)據(jù)庫表單和管理員賬號密碼的:
import sqlite3 as sql
conn=sql.connect('database.db')
print("opened database successfully")
conn.execute('CREATE TABLE students(name TEXT,\
num INT,\
academy TEXT,\
major TEXT,\
Class TEXT,\
age INT,\
phone INT,\
email TEXT,\
user TEXT PRIMARY KEY,\
pwd TEXT)')
conn.execute('CREATE TABLE admins(admin TEXT PRIMARY KEY,pwd TEXT)')
cur=conn.cursor()
cur.execute("INSERT INTO admins (admin,pwd) VALUES('xzl1','xzl1')")
cur.execute("INSERT INTO admins (admin,pwd) VALUES('xzl2','xzl2')")
cur.execute("INSERT INTO admins (admin,pwd) VALUES('xzl3','xzl3')")
conn.commit()
print("Table created successfully")
conn.close()
運(yùn)行成功之后,會在代碼文件的同目錄下生成database.db數(shù)據(jù)庫文件:文章來源:http://www.zghlxwxcb.cn/news/detail-554917.html
3.5、flaskAxios.py
這個是該項(xiàng)目的后端服務(wù)器代碼,基于flask實(shí)現(xiàn)。類似于Java的注解web開發(fā)。其中相較于之前發(fā)布過的前后端不分離的版本,做出了一些改動,比如前后端交互的數(shù)據(jù)格式改為json,前后端響應(yīng)json之后再去響應(yīng)。文章來源地址http://www.zghlxwxcb.cn/news/detail-554917.html
# -*- coding: utf-8 -*-
# @Author:︶ㄣ釋然
# @Time: 2023/6/19 9:25
from flask import Flask, render_template, request, redirect, url_for, jsonify
import sqlite3 as sql
app = Flask(__name__)
@app.route('/')
def home():
return render_template('01.html')
@app.route('/newStudent')
def new_student():
return render_template('03.html')
@app.route('/enter')
def enter():
return render_template('02.html')
@app.route('/check', methods=['POST'])
def check():
if request.method == 'POST':
date = request.get_json()
# user = request.form.get('user')
# pwd = request.form.get('pwd')
user = date['username']
pwd = date['password']
with sql.connect("database.db") as con:
cur = con.cursor()
cur.execute('select pwd from students where user = ?', (user,))
psw = cur.fetchall()
print("psw:", psw)
if not psw:
msg = "用戶名錯誤"
print(msg)
message = {'message': msg}
return jsonify(message)
elif psw[0][0] == pwd:
msg = "登錄成功"
print(msg)
return jsonify({'message': msg, 'redirect': url_for('toHtml', user=user)})
else:
msg = "密碼錯誤"
print(msg)
return jsonify({'message': msg})
@app.route('/addrec', methods=['POST'])
def addrec():
try:
name = request.json['name']
num = request.json['num']
academy = request.json['academy']
major = request.json['major']
Class = request.json['Class']
age = request.json['age']
phone = request.json['phone']
email = request.json['email']
user = request.json['user']
pwd = request.json['pwd']
with sql.connect("database.db") as con:
cur = con.cursor()
cur.execute("INSERT INTO students (name, num, academy, major, Class, age, phone, email, user, pwd) \
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
(name, num, academy, major, Class, age, phone, email, user, pwd))
con.commit()
return jsonify({'success': True, 'message': '增加記錄成功'})
except sql.IntegrityError:
return jsonify({'success': False, 'message': '增加記錄失敗', 'reason': '可能原因?yàn)橛脩裘貜?fù)'})
except Exception as e:
return jsonify({'success': False, 'message': '增加記錄失敗', 'reason': str(e)})
# @app.route('/List/<user>')
# def List(user):
# con =sql.connect("templates/database.db")
# con.row_factory=sql.Row
# cur=con.cursor()
# cur.execute('select name,num,academy,major,Class,age,phone,email,user,pwd from students where user=(?)',(user,))
# rows=cur.fetchall()
# return render_template("testxzl04.html",rows=rows)
@app.route('/toHtml/<user>')
def toHtml(user):
return render_template("04.html", user=user)
@app.route('/toHtmlAdmin')
def toHtmlAdmin():
return render_template("06.html")
@app.route('/List')
def List():
user = request.args.get('user')
con = sql.connect("database.db")
con.row_factory = sql.Row
cur = con.cursor()
cur.execute('SELECT name, num, academy, major, Class, age, phone, email, user, pwd FROM students WHERE user = ?', (user,))
rows = cur.fetchall()
students = []
print(rows)
for row in rows:
student = {
'name': row['name'],
'num': row['num'],
'academy': row['academy'],
'major': row['major'],
'Class': row['Class'],
'age': row['age'],
'phone': row['phone'],
'email': row['email'],
'user': row['user']
}
students.append(student)
print(students[0])
# return redirect(url_for('show_students', students_json=students))
return jsonify(students[0])
@app.route('/students')
def show_students():
students_json = request.args.get('students_json')
print(students_json)
return render_template('04.html', students_json=students_json)
# return jsonify(students_json)
@app.route('/listAdmin')
def listAdmin():
con = sql.connect("database.db")
con.row_factory = sql.Row
cur = con.cursor()
cur.execute('select name,num,academy,major,Class,age,phone,email,user,pwd from students ')
rows = cur.fetchall()
students = []
print(rows)
for row in rows:
student = {
'name': row['name'],
'num': row['num'],
'academy': row['academy'],
'major': row['major'],
'Class': row['Class'],
'age': row['age'],
'phone': row['phone'],
'email': row['email'],
'user': row['user'],
'pwd': row['pwd']
}
students.append(student)
print(students)
# return render_template("testxzl06.html", rows=rows)
jsonData = {'students': students}
print(jsonData)
return jsonify(jsonData)
@app.route('/delete/<user>')
def delete(user):
try:
with sql.connect("database.db") as con:
cur = con.cursor()
cur.execute('delete from students where user=(?)', (user,))
con.commit()
print("刪除記錄成功")
msg = "刪除記錄成功"
# return redirect(url_for('listAdmin', msg=msg))
return render_template("06.html")
except:
con.rollback()
print("刪除記錄失敗")
msg = "刪除記錄失敗"
# return redirect(url_for('listAdmin', msg=msg))
return render_template("06.html")
finally:
con.close()
@app.route('/admin')
def admin():
return render_template('05.html')
@app.route('/checkAdmin', methods=['POST'])
def checkAdmin():
if request.method == 'POST':
data = request.get_json()
user = data['username']
pwd = data['password']
# user = request.form['user']
# pwd = request.form['pwd']
with sql.connect("database.db") as con:
cur = con.cursor()
cur.execute('select pwd from admins where admin=(?)', (user,))
psw = cur.fetchall()
print("psw:", psw)
if not psw:
msg = "管理員用戶名錯誤"
print(msg)
message = {'message': msg}
# return render_template("testxzl05.html",msg=msg)
return jsonify(message)
elif psw[0][0] == pwd:
msg = "登錄成功"
print(msg)
# return redirect(url_for('listAdmin'))
return jsonify({'message': msg, 'redirect': url_for('toHtmlAdmin', user=user)})
else:
msg = "管理員密碼錯誤"
print(msg)
# return render_template("testxzl05.html",msg=msg)
return jsonify({'message': msg})
if __name__ == '__main__':
app.run(debug=True)
到了這里,關(guān)于python實(shí)現(xiàn)前后端學(xué)生管理系統(tǒng)(前后端分離)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!