Compare commits

...

8 Commits

Author SHA1 Message Date
wangsiyuan c554d2d7af 创建 parse_table.py 2023-12-29 14:27:59 +08:00
wangsiyuan 9296b70ac3 更新 mysql.sql 2023-12-29 14:27:57 +08:00
wangsiyuan cff2b66bc0 更新 template.xlsx 2023-12-29 14:27:54 +08:00
wangsiyuan 9d68073dd5 更新 database_manager.py 2023-12-29 14:27:52 +08:00
wangsiyuan 894d075d55 更新 views.py 2023-12-29 14:27:49 +08:00
wangsiyuan 8021f15e58 更新 import-class.html 2023-12-29 14:27:46 +08:00
wangsiyuan b5461dbff4 更新 attendance-teacher.html 2023-12-29 14:27:44 +08:00
wangsiyuan aab814a23a 更新 get_teacher_attendance_table.js 2023-12-29 14:27:38 +08:00
8 changed files with 212 additions and 73 deletions

View File

@ -9,10 +9,10 @@ layui.use(['laypage', 'element', 'jquery', 'dropdown'], function () {
response.data.forEach(function (item) {
var $row = $('<tr></tr>');
$row.append(`<td>${item.course_id}</td>`);
$row.append(`<td>${item.course_name}</td>`);
$row.append(`<td>${item.course_code}</td>`);
$row.append(`<td>${item.credits}</td>`);
$row.append(`<td>${item.class_name + item.major}</td>`);
$row.append(`<td>${item.class_name}</td>`);
$row.append(`<td>${item.major}</td>`);
$row.append(`<td><div class="layui-btn-container">
<button type="button" class="layui-btn btn-sign-in"
data-course-id="${item.course_id}"

View File

@ -55,10 +55,10 @@
<!-- 表头 -->
<thead>
<tr>
<th>课程名称</th>
<th>课程代码</th>
<th>学分</th>
<th>班级专业</th>
<th>课程名称</th>
<th>班级</th>
<th>专业</th>
<th>签到</th>
</tr>
</thead>

View File

@ -29,7 +29,7 @@
src="//unpkg.com/outeres@0.0.10/img/layui/icon-v2.png"
class="layui-nav-img"
/>
{{ session.nickname }}
{{ session.name }}
</a>
<dl class="layui-nav-child">
<dd><a href="/home/profile">资料</a></dd> <!-- 修改这里的href指向/profile -->

View File

@ -8,6 +8,7 @@ from datetime import datetime
# 应用内部模块
from utils.time_utils import check_now_time
from utils.parse_table import parse_table
from utils.allowed_files import allowed_excel
from db.connection import MySQLPool
from db.database_manager import DatabaseManager
@ -16,7 +17,6 @@ from models.Teacher import Teacher
from models.User import User
from config import SECRET_KEY, LOGGING_CONFIG, FILE_PATH
app = Flask(__name__, static_folder='static')
app.secret_key = SECRET_KEY # 从配置文件设置
logging.basicConfig(**LOGGING_CONFIG)
@ -276,6 +276,7 @@ def download_template():
@app.route('/api/receive-excel', methods=['POST'])
def receive_excel():
number = session.get('number')
# 检查是否有文件在请求中
if 'file' not in request.files:
return jsonify({"error": "No file part"}), 400
@ -290,9 +291,10 @@ def receive_excel():
if file and allowed_excel(file.filename):
try:
# 使用 openpyxl 读取文件内容
workbook = openpyxl.load_workbook(file)
# TODO: 在这里处理你的Excel文件例如读取数据
print(workbook)
data = parse_table(file, number)
db_manager = DatabaseManager()
result = db_manager.insert_into_class_student(data)
print(result)
return jsonify({"message": "File successfully processed"}), 200
except Exception as e:
return jsonify({"error": str(e)}), 500
@ -381,6 +383,7 @@ def student_get_today_courses():
@app.route('/api/teacher-sign-in', methods=['POST'])
def teacher_sign_in():
teacher_number = session.get('number')
course_id = request.form['course_id']
course_name = request.form['course_name']
class_name = request.form['class_name']
@ -392,7 +395,7 @@ def teacher_sign_in():
print(f"course_id: {course_id},course_name: {course_name},class_name: {class_name},major_id: {major_id}")
db_manager = DatabaseManager()
data = db_manager.teacher_sign_in(course_id, course_name, class_name, major_id,date,status)
data = db_manager.teacher_sign_in(course_id, course_name, class_name, major_id, date, status,teacher_number)
return data

View File

@ -111,8 +111,34 @@ WHERE
"""
# 执行查询并返回结果
result = self.fetch(sql, (teacher_number,))
return result
class_student_sql = """SELECT course_id, course_name,class_name,major,major_id,major FROM class_student where teacher_number = %s;"""
result1 = self.fetch(sql, (teacher_number,))
result2 = self.fetch(class_student_sql, (teacher_number))
data = []
# 遍历第一个结果集
if result1:
for row in result1:
data.append({
"course_id": row['course_id'],
"course_name": row['course_name'],
"class_name": row['class_name'],
"major_id": row['major_id'],
"major": row['major']
})
# 遍历第二个结果集
if result2:
for row in result2:
data.append({
"course_id": row['course_id'],
"course_name": row['course_name'],
"class_name": row['class_name'],
"major_id": row['major_id'],
"major": row['major']
})
# 返回包含两个结果集信息的data列表
return data
def get_course_type(self):
sql = "SELECT course_name, course_type FROM course"
@ -209,25 +235,62 @@ WHERE
data.append({"course_name": course_name, "time": time})
return data
def teacher_sign_in(self, course_id, course_name, class_name, major_id, date, status):
def teacher_sign_in(self, course_id, course_name, class_name, major_id, date, status, teacher_number):
class_student_sql = "SELECT student_number FROM class_student WHERE teacher_number = %s AND major_id = %s AND class_name = %s"
class_student_result = self.fetch(class_student_sql, (teacher_number, major_id, class_name))
student_sql = "SELECT student_number FROM student WHERE class_name = %s AND major_id = %s;"
student_sql_result = self.fetch(student_sql, (class_name, major_id))
values_list = []
# 检查是否有学生编号被返回
if student_sql_result:
values_list = []
for student in student_sql_result:
# 对于每个学生编号,创建一条记录的值元组
student_number = student['student_number']
values_list.append((student_number, course_id, course_name, date, status))
# 构建一次性插入多条记录的SQL语句
attendance_sql = "INSERT INTO attendance_record (student_number, course_id, course_name, date, status) VALUES (%s, %s, %s, %s, %s)"
if class_student_result:
for class_student in class_student_result:
# 注意这里变量名已经修改为class_student
student_number = class_student['student_number']
values_list.append((student_number, course_id, course_name, date, status))
# 使用executemany一次性插入多条记录
result = self.executemany(attendance_sql, values_list)
print(result)
return {"msg": "班级签到成功,签到人数:" + str(result)}
else:
# 如果没有学生编号,可能需要处理错误或记录日志
# 如果没有任何学生编号,返回相应的消息
if not values_list:
return {"msg": "当前班级专业没有学生"}
# 构建一次性插入多条记录的SQL语句
attendance_sql = "INSERT INTO attendance_record (student_number, course_id, course_name, date, status) VALUES (%s, %s, %s, %s, %s)"
# 使用executemany一次性插入多条记录
result = self.executemany(attendance_sql, values_list)
print(f"Inserted rows: {result}")
return {"msg": "班级签到成功,签到人数:" + str(result)}
def insert_into_class_student(self, class_students):
try:
values_list = [
(
cs['teacher_number'],
cs['class_name'],
cs['student_name'],
cs['student_number'],
cs['course_id'],
cs['course_name'],
cs['major_id'],
cs['major']
)
for cs in class_students
]
sql = """INSERT INTO class_student
(teacher_number, class_name, student_name, student_number, course_id, course_name, major_id, major)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"""
result = self.executemany(sql, values_list)
return {"inserted_rows": result}
except Exception as e:
# 这里应根据实际情况记录日志或返回错误信息
print(f"An error occurred: {e}")
return {"error": str(e)}

Binary file not shown.

141
mysql.sql
View File

@ -7,9 +7,24 @@ CREATE TABLE user
status BOOLEAN NOT NULL
);
INSERT INTO user (name, number, password, identity, status)
VALUES ('学生', '1', '$2b$12$okY88GrzlUHb/Ox1ENwtqeBUnE0bgMOCPy.UKmFaTnu3El7EYX8Em', 'student', TRUE),
('老师', '2', '$2b$12$okY88GrzlUHb/Ox1ENwtqeBUnE0bgMOCPy.UKmFaTnu3El7EYX8Em', 'teacher', TRUE);
INSERT INTO user (name, number, password, status) VALUES
('教师1','G001','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('教师2','G002','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('教师3','G003','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('教师4','G004','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('学生1','X202301000001','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('学生2','X202301000002','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('学生3','X202301000003','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('学生4','X202301000004','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('学生5','X202301000005','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('学生6','X202301000006','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('学生7','X202301000007','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('学生8','X202301000008','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('学生9','X202301000009','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('学生10','X2023010000010','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('学生11','X2023010000011','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE),
('学生12','X2023010000012','$2b$12$COT85R.ice41B/ofAra2ZewTe1En3ZhF6CBKOv2WScTcy.jQAhEVO',TRUE);
@ -117,27 +132,20 @@ CREATE TABLE student
FOREIGN KEY (major_id) REFERENCES major (major_id)
);
INSERT INTO student (user_id, student_number, student_name, class_id)
VALUES (5,'王伟', 202300001000, 1),
(6,'李娜', 202300001001, 1),
(7,'张伟', 202300001002, 1),
(8,'刘洋', 202300001003, 1),
(9,'陈敏', 202300001004, 1),
(10,'杨静', 202300001005, 2),
(11,'赵媛媛', 202300001006, 2),
(12,'黄进', 202300001007, 2),
(13,'周杰', 202300001008, 2),
(14,'吴琳', 202300001009, 2),
(15,'徐涛', 202300001010, 3),
(16,'孙怡', 202300001011, 3),
(17,'朱元璋', 202300001012, 3),
(18,'马云', 202300001013, 3),
(19,'胡雪', 202300001014, 3),
(20,'郭敬明', 202300001015, 4),
(21,'林芳', 202300001016, 4),
(22,'段誉', 202300001017, 4),
(23,'曹操', 202300001018, 4),
(24,'刘备', 202300001019, 4);
INSERT INTO student (user_id, student_number, student_name, class_name,major_id)
VALUES
(5,'X202301000001','学生1','2023级01班','000'),
(6,'X202301000002','学生2','2023级01班','000'),
(7,'X202301000003','学生3','2023级01班','000'),
(8,'X202301000004','学生4','2023级01班','000'),
(9,'X202302000005','学生5','2023级02班','000'),
(10,'X202302000006','学生6','2023级02班','000'),
(11,'X202302000007','学生7','2023级02班','000'),
(12,'X202302000008','学生8','2023级02班','000'),
(13,'X202303000009','学生9','2023级03班','001'),
(14,'X202303000010','学生10','2023级03班','001'),
(15,'X202303000011','学生11','2023级03班','001'),
(16,'X202303000012','学生12','2023级03班','001');
CREATE TABLE teacher
(
@ -188,11 +196,14 @@ CREATE TABLE teacher_class_course
);
INSERT INTO teacher_class_course(teacher_number, course_id, class_name,major_id) VALUES
('G0000',1,'2023级01班','000'),
('G0000',3,'2023级01班','000'),
('G0001',2,'2023级01班','000'),
('G0001',4,'2023级01班','000');
('G0001',1,'2023级01班','000'),
('G0001',3,'2023级01班','000'),
('G0002',2,'2023级02班','000'),
('G0002',4,'2023级02班','000'),
('G0001',1,'2023级02班','000'),
('G0001',3,'2023级02班','000'),
('G0002',2,'2023级03班','001'),
('G0002',4,'2023级03班','001');
CREATE TABLE schedule
(
@ -210,26 +221,46 @@ CREATE TABLE schedule
INSERT INTO schedule (day_of_week, period_id, teacher_number, class_name, course_id) VALUES
(1,1,'G0000','2023级01班',1),
(1,2,'G0000','2023级01班',3),
(1,3,'G0001','2023级01班',2),
(1,4,'G0001','2023级01班',4),
(2,1,'G0001','2023级01班',4),
(2,2,'G0001','2023级01班',2),
(2,3,'G0000','2023级01班',1),
(2,4,'G0000','2023级01班',3),
(3,1,'G0000','2023级01班',1),
(3,2,'G0000','2023级01班',3),
(3,3,'G0001','2023级01班',2),
(3,4,'G0001','2023级01班',4),
(4,1,'G0001','2023级01班',4),
(4,2,'G0001','2023级01班',2),
(4,3,'G0000','2023级01班',1),
(4,4,'G0000','2023级01班',3),
(5,1,'G0000','2023级01班',1),
(5,2,'G0000','2023级01班',3),
(5,3,'G0001','2023级01班',2),
(5,4,'G0001','2023级01班',4);
(1,1,'G0001','2023级01班',1),
(1,2,'G0001','2023级01班',3),
(1,3,'G0002','2023级01班',2),
(1,4,'G0002','2023级01班',4),
(2,1,'G0001','2023级01班',1),
(2,2,'G0001','2023级01班',3),
(2,3,'G0002','2023级01班',2),
(2,4,'G0002','2023级01班',4),
(3,1,'G0001','2023级01班',1),
(3,2,'G0001','2023级01班',3),
(3,3,'G0002','2023级01班',2),
(3,4,'G0002','2023级01班',4),
(4,1,'G0001','2023级01班',1),
(4,2,'G0001','2023级01班',3),
(4,3,'G0002','2023级01班',2),
(4,4,'G0002','2023级01班',4),
(5,1,'G0001','2023级01班',1),
(5,2,'G0001','2023级01班',3),
(5,3,'G0002','2023级01班',2),
(5,4,'G0002','2023级01班',4),
(1,1,'G0002','2023级03班',2),
(1,2,'G0002','2023级03班',4),
(1,3,'G0001','2023级02班',1),
(1,4,'G0001','2023级02班',3),
(2,1,'G0002','2023级02班',2),
(2,2,'G0002','2023级02班',4),
(2,3,'G0001','2023级02班',1),
(2,4,'G0001','2023级02班',3),
(3,1,'G0002','2023级03班',2),
(3,2,'G0002','2023级03班',4),
(3,3,'G0001','2023级02班',1),
(3,4,'G0001','2023级02班',3),
(4,1,'G0002','2023级02班',2),
(4,2,'G0002','2023级02班',4),
(4,3,'G0001','2023级02班',1),
(4,4,'G0001','2023级02班',3),
(5,1,'G0002','2023级03班',2),
(5,2,'G0002','2023级03班',4),
(5,3,'G0001','2023级02班',1),
(5,4,'G0001','2023级02班',3);
CREATE TABLE time_period
(
@ -247,4 +278,16 @@ VALUES ('一、二节', '08:00:00', '09:30:00'),
('七、八节', '16:30:00', '18:00:00');
CREATE TABLE class_student (
id INT AUTO_INCREMENT PRIMARY KEY,
teacher_number VARCHAR(20) NOT NULL,
class_name VARCHAR(20) NOT NULL , -- 班级
student_name VARCHAR(50) NOT NULL , -- 姓名
student_number VARCHAR(20) NOT NULL UNIQUE, -- 学号
course_id INT NOT NULL , -- 课程ID
course_name VARCHAR(100) NOT NULL , -- 课程名称
major_id VARCHAR(20) NOT NULL,
major VARCHAR(255) NOT NULL
);

30
utils/parse_table.py Normal file
View File

@ -0,0 +1,30 @@
from openpyxl import load_workbook
def parse_table(file_path, number):
# 加载Excel工作簿
work_book = load_workbook(file_path)
# 选择工作簿中的第一个工作表
sheet = work_book.active
# 创建一个列表来存储所有行的数据
data = []
# 从第二行开始遍历(假设第一行是标题行)
for row in sheet.iter_rows(min_row=2, values_only=True):
# 创建一个字典来存储每行的数据
row_data = {
"teacher_number": number,
"class_name": row[0], # 班级
"student_name": row[1], # 姓名
"student_number": row[2], # 学号
"course_id": row[3], # 课程id
"course_name": row[4], # 课程
"major_id": row[5], # 专业代码
"major": row[6]
}
data.append(row_data)
# 返回解析后的数据
return data