Compare commits
8 Commits
c0d0e43e73
...
c554d2d7af
| Author | SHA1 | Date |
|---|---|---|
|
|
c554d2d7af | |
|
|
9296b70ac3 | |
|
|
cff2b66bc0 | |
|
|
9d68073dd5 | |
|
|
894d075d55 | |
|
|
8021f15e58 | |
|
|
b5461dbff4 | |
|
|
aab814a23a |
|
|
@ -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}"
|
||||
|
|
|
|||
|
|
@ -55,10 +55,10 @@
|
|||
<!-- 表头 -->
|
||||
<thead>
|
||||
<tr>
|
||||
<th>课程名称</th>
|
||||
<th>课程代码</th>
|
||||
<th>学分</th>
|
||||
<th>班级专业</th>
|
||||
<th>课程名称</th>
|
||||
<th>班级</th>
|
||||
<th>专业</th>
|
||||
<th>签到</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
|
|
|||
|
|
@ -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 -->
|
||||
|
|
|
|||
13
app/views.py
13
app/views.py
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
141
mysql.sql
|
|
@ -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
|
||||
);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Reference in New Issue