CHM_attendance/create_admin.py
2025-06-12 10:41:08 +08:00

519 lines
16 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()