Compare commits
5 Commits
072a9d3359
...
cddb55c014
| Author | SHA1 | Date |
|---|---|---|
|
|
cddb55c014 | |
|
|
0557cd15c8 | |
|
|
5d66d17fe2 | |
|
|
8c79601d98 | |
|
|
8aff863916 |
|
|
@ -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 () {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
51
app/views.py
51
app/views.py
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 []
|
||||
|
||||
|
|
|
|||
15
mysql.sql
15
mysql.sql
|
|
@ -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,
|
||||
|
|
|
|||
Reference in New Issue