delete_pending

This commit is contained in:
superlishunqin 2025-06-12 10:41:08 +08:00
parent b7b8b0f50f
commit fd27daa012
2 changed files with 518 additions and 75 deletions

View File

@ -255,10 +255,6 @@
class="btn btn-outline-info btn-sm">
<i class="fas fa-calendar-check me-1"></i>查看考勤详情
</a>
<a href="{{ url_for('admin.pending_leaves') }}?student_search={{ student.student_number }}"
class="btn btn-outline-success btn-sm">
<i class="fas fa-file-alt me-1"></i>查看请假记录
</a>
<button class="btn btn-outline-primary btn-sm" onclick="exportStudentData()">
<i class="fas fa-download me-1"></i>导出数据
</button>
@ -359,77 +355,6 @@
</div>
</div>
</div>
<!-- 最近请假记录 -->
{% if leave_records %}
<div class="row">
<div class="col-12">
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex justify-content-between align-items-center">
<h6 class="m-0 font-weight-bold text-primary">
<i class="fas fa-file-alt me-2"></i>最近请假记录
</h6>
<a href="{{ url_for('admin.pending_leaves') }}?student_search={{ student.student_number }}"
class="btn btn-primary btn-sm">
<i class="fas fa-eye me-1"></i>查看全部
</a>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover">
<thead class="table-light">
<tr>
<th>请假日期</th>
<th>请假原因</th>
<th>申请时间</th>
<th>状态</th>
</tr>
</thead>
<tbody>
{% for leave in leave_records %}
<tr>
<td>
{{ leave.leave_start_date.strftime('%Y-%m-%d') }}
{% if leave.leave_start_date != leave.leave_end_date %}
至 {{ leave.leave_end_date.strftime('%Y-%m-%d') }}
{% endif %}
</td>
<td>
<div class="text-truncate" style="max-width: 300px;"
title="{{ leave.leave_reason }}">
{{ leave.leave_reason }}
</div>
</td>
<td>
<small class="text-muted">
{{ leave.created_at.strftime('%Y-%m-%d %H:%M') }}
</small>
</td>
<td>
{% if leave.status == '待审批' %}
<span class="badge bg-warning">
<i class="fas fa-clock me-1"></i>待审批
</span>
{% elif leave.status == '已批准' %}
<span class="badge bg-success">
<i class="fas fa-check me-1"></i>已批准
</span>
{% else %}
<span class="badge bg-danger">
<i class="fas fa-times me-1"></i>已拒绝
</span>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
{% endif %}
</div>
{% endblock %}

518
create_admin.py Normal file
View File

@ -0,0 +1,518 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
创建管理员用户的脚本
使用方法: python create_admin.py
"""
import sys
import os
from getpass import getpass
# 添加项目根目录到Python路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from init_db import create_app
from app.models import db, User
from app.utils.database import safe_add_and_commit
def create_admin_user():
"""创建管理员用户"""
app = create_app()
with app.app_context():
print("=" * 50)
print("创建管理员用户")
print("=" * 50)
# 输入管理员信息
while True:
student_number = input("请输入管理员账号(学号格式): ").strip()
if not student_number:
print("账号不能为空,请重新输入!")
continue
# 检查账号是否已存在
existing_user = User.query.filter_by(student_number=student_number).first()
if existing_user:
print(f"账号 {student_number} 已存在!")
choice = input("是否要更新该用户为管理员?(y/n): ").lower()
if choice == 'y':
# 更新现有用户为管理员
existing_user.role = 'admin'
# 询问是否要重置密码
reset_pwd = input("是否要重置密码?(y/n): ").lower()
if reset_pwd == 'y':
while True:
password = getpass("请输入新密码: ")
if len(password) < 6:
print("密码长度至少6位请重新输入")
continue
confirm_password = getpass("请确认密码: ")
if password != confirm_password:
print("两次输入的密码不一致,请重新输入!")
continue
existing_user.set_password(password)
break
success, error = safe_add_and_commit(existing_user)
if success:
print(f"用户 {student_number} 已成功更新为管理员!")
else:
print(f"更新失败: {error}")
return
else:
continue
else:
break
# 输入密码
while True:
password = getpass("请输入管理员密码: ")
if len(password) < 6:
print("密码长度至少6位请重新输入")
continue
confirm_password = getpass("请确认密码: ")
if password != confirm_password:
print("两次输入的密码不一致,请重新输入!")
continue
break
# 创建管理员用户
admin_user = User(
student_number=student_number,
role='admin',
is_active=True
)
admin_user.set_password(password)
# 保存到数据库
success, error = safe_add_and_commit(admin_user)
if success:
print(f"\n✅ 管理员用户创建成功!")
print(f"账号: {student_number}")
print(f"角色: 管理员")
print(f"状态: 激活")
else:
print(f"\n❌ 创建失败: {error}")
def batch_create_admins():
"""批量创建管理员用户"""
app = create_app()
with app.app_context():
print("=" * 50)
print("批量创建管理员用户")
print("=" * 50)
print("输入格式: 账号,密码")
print("例如: admin001,123456")
print("输入 'done' 完成输入")
print("-" * 50)
admin_list = []
while True:
user_input = input("请输入管理员信息(账号,密码): ").strip()
if user_input.lower() == 'done':
break
if ',' not in user_input:
print("格式错误!请使用 '账号,密码' 格式")
continue
try:
student_number, password = user_input.split(',', 1)
student_number = student_number.strip()
password = password.strip()
if not student_number or not password:
print("账号和密码都不能为空!")
continue
if len(password) < 6:
print("密码长度至少6位")
continue
# 检查是否已存在
existing_user = User.query.filter_by(student_number=student_number).first()
if existing_user:
print(f"账号 {student_number} 已存在,跳过...")
continue
admin_list.append((student_number, password))
print(f"✓ 已添加: {student_number}")
except ValueError:
print("格式错误!请使用 '账号,密码' 格式")
continue
if not admin_list:
print("没有有效的管理员信息,退出...")
return
# 确认创建
print(f"\n准备创建 {len(admin_list)} 个管理员用户:")
for student_number, _ in admin_list:
print(f"- {student_number}")
confirm = input("\n确认创建?(y/n): ").lower()
if confirm != 'y':
print("已取消创建")
return
# 批量创建
success_count = 0
fail_count = 0
for student_number, password in admin_list:
admin_user = User(
student_number=student_number,
role='admin',
is_active=True
)
admin_user.set_password(password)
success, error = safe_add_and_commit(admin_user)
if success:
print(f"{student_number} 创建成功")
success_count += 1
else:
print(f"{student_number} 创建失败: {error}")
fail_count += 1
print(f"\n批量创建完成:")
print(f"成功: {success_count}")
print(f"失败: {fail_count}")
def list_admins():
"""列出所有管理员用户"""
app = create_app()
with app.app_context():
print("=" * 50)
print("管理员用户列表")
print("=" * 50)
admins = User.query.filter_by(role='admin').all()
if not admins:
print("暂无管理员用户")
return
print(f"{'序号':<4} {'账号':<15} {'状态':<8} {'创建时间':<20} {'最后登录':<20}")
print("-" * 70)
for i, admin in enumerate(admins, 1):
status = "激活" if admin.is_active else "禁用"
created_at = admin.created_at.strftime('%Y-%m-%d %H:%M:%S') if admin.created_at else "未知"
last_login = admin.last_login.strftime('%Y-%m-%d %H:%M:%S') if admin.last_login else "从未登录"
print(f"{i:<4} {admin.student_number:<15} {status:<8} {created_at:<20} {last_login:<20}")
def main():
"""主函数"""
while True:
print("\n" + "=" * 50)
print("管理员用户管理")
print("=" * 50)
print("1. 创建单个管理员用户")
print("2. 批量创建管理员用户")
print("3. 查看管理员列表")
print("4. 退出")
print("-" * 50)
choice = input("请选择操作 (1-4): ").strip()
if choice == '1':
create_admin_user()
elif choice == '2':
batch_create_admins()
elif choice == '3':
list_admins()
elif choice == '4':
print("再见!")
break
else:
print("无效选择,请重新输入!")
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("\n\n程序被中断退出")
except Exception as e:
print(f"\n程序运行出错: {e}")
import traceback
traceback.print_exc()
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
创建管理员用户的脚本
使用方法: python create_admin.py
"""
import sys
import os
from getpass import getpass
# 添加项目根目录到Python路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from init_db import create_app
from app.models import db, User
from app.utils.database import safe_add_and_commit
def create_admin_user():
"""创建管理员用户"""
app = create_app()
with app.app_context():
print("=" * 50)
print("创建管理员用户")
print("=" * 50)
# 输入管理员信息
while True:
student_number = input("请输入管理员账号(学号格式): ").strip()
if not student_number:
print("账号不能为空,请重新输入!")
continue
# 检查账号是否已存在
existing_user = User.query.filter_by(student_number=student_number).first()
if existing_user:
print(f"账号 {student_number} 已存在!")
choice = input("是否要更新该用户为管理员?(y/n): ").lower()
if choice == 'y':
# 更新现有用户为管理员
existing_user.role = 'admin'
# 询问是否要重置密码
reset_pwd = input("是否要重置密码?(y/n): ").lower()
if reset_pwd == 'y':
while True:
password = getpass("请输入新密码: ")
if len(password) < 6:
print("密码长度至少6位请重新输入")
continue
confirm_password = getpass("请确认密码: ")
if password != confirm_password:
print("两次输入的密码不一致,请重新输入!")
continue
existing_user.set_password(password)
break
success, error = safe_add_and_commit(existing_user)
if success:
print(f"用户 {student_number} 已成功更新为管理员!")
else:
print(f"更新失败: {error}")
return
else:
continue
else:
break
# 输入密码
while True:
password = getpass("请输入管理员密码: ")
if len(password) < 6:
print("密码长度至少6位请重新输入")
continue
confirm_password = getpass("请确认密码: ")
if password != confirm_password:
print("两次输入的密码不一致,请重新输入!")
continue
break
# 创建管理员用户
admin_user = User(
student_number=student_number,
role='admin',
is_active=True
)
admin_user.set_password(password)
# 保存到数据库
success, error = safe_add_and_commit(admin_user)
if success:
print(f"\n✅ 管理员用户创建成功!")
print(f"账号: {student_number}")
print(f"角色: 管理员")
print(f"状态: 激活")
else:
print(f"\n❌ 创建失败: {error}")
def batch_create_admins():
"""批量创建管理员用户"""
app = create_app()
with app.app_context():
print("=" * 50)
print("批量创建管理员用户")
print("=" * 50)
print("输入格式: 账号,密码")
print("例如: admin001,123456")
print("输入 'done' 完成输入")
print("-" * 50)
admin_list = []
while True:
user_input = input("请输入管理员信息(账号,密码): ").strip()
if user_input.lower() == 'done':
break
if ',' not in user_input:
print("格式错误!请使用 '账号,密码' 格式")
continue
try:
student_number, password = user_input.split(',', 1)
student_number = student_number.strip()
password = password.strip()
if not student_number or not password:
print("账号和密码都不能为空!")
continue
if len(password) < 6:
print("密码长度至少6位")
continue
# 检查是否已存在
existing_user = User.query.filter_by(student_number=student_number).first()
if existing_user:
print(f"账号 {student_number} 已存在,跳过...")
continue
admin_list.append((student_number, password))
print(f"✓ 已添加: {student_number}")
except ValueError:
print("格式错误!请使用 '账号,密码' 格式")
continue
if not admin_list:
print("没有有效的管理员信息,退出...")
return
# 确认创建
print(f"\n准备创建 {len(admin_list)} 个管理员用户:")
for student_number, _ in admin_list:
print(f"- {student_number}")
confirm = input("\n确认创建?(y/n): ").lower()
if confirm != 'y':
print("已取消创建")
return
# 批量创建
success_count = 0
fail_count = 0
for student_number, password in admin_list:
admin_user = User(
student_number=student_number,
role='admin',
is_active=True
)
admin_user.set_password(password)
success, error = safe_add_and_commit(admin_user)
if success:
print(f"{student_number} 创建成功")
success_count += 1
else:
print(f"{student_number} 创建失败: {error}")
fail_count += 1
print(f"\n批量创建完成:")
print(f"成功: {success_count}")
print(f"失败: {fail_count}")
def list_admins():
"""列出所有管理员用户"""
app = create_app()
with app.app_context():
print("=" * 50)
print("管理员用户列表")
print("=" * 50)
admins = User.query.filter_by(role='admin').all()
if not admins:
print("暂无管理员用户")
return
print(f"{'序号':<4} {'账号':<15} {'状态':<8} {'创建时间':<20} {'最后登录':<20}")
print("-" * 70)
for i, admin in enumerate(admins, 1):
status = "激活" if admin.is_active else "禁用"
created_at = admin.created_at.strftime('%Y-%m-%d %H:%M:%S') if admin.created_at else "未知"
last_login = admin.last_login.strftime('%Y-%m-%d %H:%M:%S') if admin.last_login else "从未登录"
print(f"{i:<4} {admin.student_number:<15} {status:<8} {created_at:<20} {last_login:<20}")
def main():
"""主函数"""
while True:
print("\n" + "=" * 50)
print("管理员用户管理")
print("=" * 50)
print("1. 创建单个管理员用户")
print("2. 批量创建管理员用户")
print("3. 查看管理员列表")
print("4. 退出")
print("-" * 50)
choice = input("请选择操作 (1-4): ").strip()
if choice == '1':
create_admin_user()
elif choice == '2':
batch_create_admins()
elif choice == '3':
list_admins()
elif choice == '4':
print("再见!")
break
else:
print("无效选择,请重新输入!")
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("\n\n程序被中断退出")
except Exception as e:
print(f"\n程序运行出错: {e}")
import traceback
traceback.print_exc()