Compare commits

..

5 Commits

Author SHA1 Message Date
wangsiyuan cddb55c014 更新 mysql.sql 2023-12-26 19:01:17 +08:00
wangsiyuan 0557cd15c8 更新 database_manager.py 2023-12-26 19:01:14 +08:00
wangsiyuan 5d66d17fe2 更新 views.py 2023-12-26 19:01:12 +08:00
wangsiyuan 8c79601d98 更新 import-class.html 2023-12-26 19:01:09 +08:00
wangsiyuan 8aff863916 更新 attendance-teacher.html 2023-12-26 19:01:06 +08:00
5 changed files with 182 additions and 21 deletions

View File

@ -6,7 +6,7 @@
<meta name="renderer" content="webkit"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<link href="static/css/layui.css" rel="stylesheet">
<link href="/static/css/layui.css" rel="stylesheet">
</head>
<body>
@ -14,14 +14,14 @@
<div class="layui-header">
<div class="layui-logo layui-hide-xs layui-bg-black">网上上课点名系统</div>
<!-- 头部区域可配合layui 已有的水平导航) -->
<ul class="layui-nav layui-layout-left">
<!-- 移动端显示 -->
<li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft">
<i class="layui-icon layui-icon-spread-left"></i>
</li>
<li class="layui-nav-item layui-hide-xs"><a href="/attendance-teacher/attendance">签到</a></li>
<li class="layui-nav-item layui-hide-xs"><a href="/attendance-teacher/import-class">导入班级</a></li>
</ul>
<ul class="layui-nav layui-layout-left">
<!-- 移动端显示 -->
<li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft">
<i class="layui-icon layui-icon-spread-left"></i>
</li>
<li class="layui-nav-item layui-hide-xs"><a href="/attendance-teacher/attendance">签到</a></li>
<li class="layui-nav-item layui-hide-xs"><a href="/attendance-teacher/import-class">导入班级</a></li>
</ul>
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item layui-hide layui-show-sm-inline-block">
<a href="javascript:;">
@ -50,10 +50,29 @@
</ul>
</div>
</div>
<div class="layui-body">
<table id="attendanceTable" class="layui-table">
<!-- 表头 -->
<thead>
<tr>
<th>课程名称</th>
<th>课程代码</th>
<th>学分</th>
<th>班级名称</th>
<th>专业</th>
<th>签到</th>
</tr>
</thead>
<tbody>
<!-- 表格数据将在这里填充 -->
</tbody>
</table>
<div id="pagination"></div>
</div>
</div>
<script src="static/jquery.min.js"></script> <!-- 确保已经引入jQuery -->
<script src="static/layui.js"></script>
<script src="/static/jquery.min.js"></script> <!-- 确保已经引入jQuery -->
<script src="/static/layui.js"></script>
<script>
// 请求后端获取菜单数据
$.get('/api/menu', function (menuItems) {
@ -67,8 +86,70 @@
layui.element.render('nav', 'test');
});
layui.use(['laypage', 'element', 'jquery', 'dropdown'], function () {
var laypage = layui.laypage;
var $ = layui.jquery;
function renderTable(page) {
// 发送GET请求到服务器端点
$.get('/api/get-teacher-attendance-table?page=' + page, function (response) {
var $tbody = $('#attendanceTable tbody');
$tbody.empty(); // 清空表格内容
// 遍历返回的数据数组
response.data.forEach(function (item) {
// 创建新的行并填充数据
var $row = $('<tr></tr>');
$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}</td>`);
$row.append(`<td>${item.major}</td>`);
$row.append(`
<td>
<div class="layui-btn-group">
<button class="layui-btn layui-btn-normal layui-btn-sm dropdown-toggle" type="button">
签到 <span class="layui-icon layui-icon-down"></span>
</button>
<dl class="dropdown-menu" style="display:none;">
<dd><a href="javascript:void(0);" onclick="markAttendance(this, 'present')">出勤</a></dd>
<dd><a href="javascript:void(0);" onclick="markAttendance(this, 'absent')">缺席</a></dd>
<dd><a href="javascript:void(0);" onclick="markAttendance(this, 'late')">迟到</a></dd>
<dd><a href="javascript:void(0);" onclick="markAttendance(this, 'excused')">请假</a></dd>
</dl>
</div>
</td>
`);
$tbody.append($row);
});
// 渲染分页控件
laypage.render({
elem: 'pagination', // 分页容器的id
count: response.count, // 总条数
limit: 10, // 每页显示条数
curr: page, // 当前页
jump: function (obj, first) {
if (!first) { // 首次不执行
renderTable(obj.curr); // 根据页码加载数据
}
}
});
});
}
// 初始加载第一页
renderTable(1);
});
layui.use(['jquery'], function () {
var laypage = layui.laypage;
// 普通用法
laypage.render({
elem: 'attendance_teacher_page',
count: 100 // 数据总数
});
var $ = layui.jquery; // 获取Layui的jQuery对象
$('#logoutLink').on('click', function () {

View File

@ -77,8 +77,8 @@
</div>
</div>
<script src="static/jquery.min.js"></script> <!-- 确保已经引入jQuery -->
<script src="static/layui.js"></script>
<script src="/static/jquery.min.js"></script> <!-- 确保已经引入jQuery -->
<script src="/static/layui.js"></script>
<script>
// 请求后端获取菜单数据
$.get('/api/menu', function (menuItems) {

View File

@ -96,8 +96,8 @@ def get_menu():
# 从session中获取用户角色
if 'role' in session:
role = session['role']
menu_items = db_manager.get_meun(role)
print(menu_items)
menu_items = db_manager.get_menu(role)
# print(menu_items)
# 转换菜单项为期望的格式并返回
formatted_menu_items = [
@ -130,6 +130,7 @@ def course_info():
if request.method == "GET":
return render_template('course-info.html')
@app.route('/api/get-course-info', methods=['GET'])
def get_course_info():
db_manager = DatabaseManager()
@ -141,24 +142,70 @@ def get_course_info():
def course_checkin():
return render_template('attendance.html')
@app.route('/announcement', methods=['GET', 'POST'])
def announcement():
return render_template('announcement.html')
@app.route('/attendance-teacher', methods=['GET', 'POST'])
def announcement_teacher():
return render_template('attendance-teacher.html')
@app.route('/attendance-reminder', methods=['GET', 'POST'])
def attendance_reminder():
return render_template('attendance-reminder.html')
@app.route('/course-category', methods=['GET', 'POST'])
def course_category():
return render_template('course-category.html')
@app.route('/attendance-teacher/import-class', methods=['GET'])
def import_class():
return render_template('import-class.html')
@app.route('/attendance-teacher/attendance', methods=['GET'])
def teacher_attendance():
return render_template('attendance-teacher.html')
from flask import request
@app.route('/api/get-teacher-attendance-table', methods=['GET'])
def get_current_teacher_courses():
phone_number = session.get('username')
# 获取分页参数
page = request.args.get('page', 1, type=int) # 如果没有提供,默认为第一页
limit = request.args.get('limit', 10, type=int) # 如果没有提供默认每页10条
# 获取所有课程数据
db_manager = DatabaseManager()
all_course_data = db_manager.get_current_teacher_courses(phone_number)
# 计算分页的起始和结束索引
start = (page - 1) * limit
end = start + limit
# 获取当前页的数据
current_page_data = all_course_data[start:end]
# 构建响应字典
response = {
'msg': 'ok' if current_page_data else 'no_data',
'count': len(all_course_data), # 数据的总数
'data': current_page_data # 当前页的课程信息列表
}
# 将查询结果转换为JSON格式并返回
return jsonify(response)
if __name__ == '__main__':
app.run(debug=True)

View File

@ -1,4 +1,3 @@
import pymysql
from db.connection import MySQLPool
import bcrypt
@ -57,12 +56,12 @@ class DatabaseManager:
# 使用bcrypt进行密码验证
if bcrypt.checkpw(password_attempt.encode('utf-8'), stored_hash.encode('utf-8')):
# 密码匹配,返回登录成功,身份和状态
return {'valid': True, 'identity': identity, 'status': status,'nickname': nickname}
return {'valid': True, 'identity': identity, 'status': status, 'nickname': nickname}
# 密码不匹配或用户不存在,返回登录失败
return {'valid': False}
def get_meun(self, role):
def get_menu(self, role):
sql = "SELECT menu_name,path FROM menu_items WHERE role=%s ORDER BY `order`"
result = self.fetch(sql, (role,))
return result
@ -71,3 +70,28 @@ class DatabaseManager:
sql = "SELECT course_name, course_code, instructor_name, credits, description FROM courses"
result = self.fetch(sql)
return result
def get_current_teacher_courses(self, phone_number):
# 根据电话号码查询user_id
user_sql = "SELECT user_id FROM user WHERE phone_number = %s"
user_result = self.fetch(user_sql, (phone_number,))
if user_result:
user_id = user_result[0]['user_id']
# 使用联合查询获取该老师的所有课程信息及班级信息
course_class_sql = """
SELECT c.course_name, c.course_code, c.credits, cl.class_name, cl.major
FROM class_courses cc
JOIN courses c ON cc.course_id = c.course_id
JOIN classes cl ON cc.class_id = cl.class_id
WHERE cc.user_id = %s
"""
courses_classes_result = self.fetch(course_class_sql, (user_id,))
# 组织和返回信息
if courses_classes_result:
# print(courses_classes_result)
return courses_classes_result
return []

View File

@ -1,5 +1,5 @@
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT AUTO_INCREMENT PRIMARY KEY,
nickname VARCHAR(50) NOT NULL,
phone_number VARCHAR(15) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
@ -8,7 +8,9 @@ CREATE TABLE user (
);
INSERT INTO user (nickname, phone_number, password, identity, status) VALUES
('Alice', '1', '$2b$12$okY88GrzlUHb/Ox1ENwtqeBUnE0bgMOCPy.UKmFaTnu3El7EYX8Em', 'student', TRUE);
('学生', '1', '$2b$12$okY88GrzlUHb/Ox1ENwtqeBUnE0bgMOCPy.UKmFaTnu3El7EYX8Em', 'student', TRUE),
('老师', '2', '$2b$12$okY88GrzlUHb/Ox1ENwtqeBUnE0bgMOCPy.UKmFaTnu3El7EYX8Em', 'teacher', TRUE);
@ -72,10 +74,17 @@ CREATE TABLE class_courses (
class_course_id INT AUTO_INCREMENT PRIMARY KEY,
class_id INT NOT NULL,
course_id INT NOT NULL,
user_id INT NOT NULL,
FOREIGN KEY (class_id) REFERENCES classes(class_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
FOREIGN KEY (course_id) REFERENCES courses(course_id),
FOREIGN KEY (user_id) REFERENCES user(user_id),
);
INSERT INTO class_courses(class_id,course_id,user_id) VALUES
(1,2,2),
(1,3,2),
(2,6,2);
CREATE TABLE classes (
class_id INT AUTO_INCREMENT PRIMARY KEY,
class_name VARCHAR(255) NOT NULL,