Python全栈开发 Day10_用户管理系统

  • 大作业 用户管理系统
python 复制代码
python

import os

DATA_FILE = "user_info.txt"
login_dict = {"username": None, "role": None}

# ------------------------ 文件操作 ------------------------
def get_all_users():
    """读取文件,返回 {username: user_dict}"""
    user_data = {}
    if not os.path.exists(DATA_FILE):
        return user_data
    try:
        with open(DATA_FILE, "r", encoding="utf-8") as fp:
            for line in fp:
                username, password, age, role, hobby_str = line.strip().split("|")
                hobby = [h for h in hobby_str.split(", ") if h]
                user_data[username] = {
                    "username": username,
                    "password": password,
                    "age": int(age),
                    "hobby": hobby,
                    "role": role,
                }
    except Exception as e:
        print(f"读取文件失败: {e}")
    return user_data


def save_all_users(user_data):
    """将用户字典写回文件"""
    lines = []
    for info in user_data.values():
        hobby = ", ".join(info["hobby"])
        line = f"{info['username']}|{info['password']}|{info['age']}|{info['role']}|{hobby}\n"
        lines.append(line)
    with open(DATA_FILE, "w", encoding="utf-8") as fp:
        fp.writelines(lines)


# ------------------------ 辅助函数 ------------------------
def require_login():
    """检查是否已登录,未登录返回错误消息"""
    if not login_dict["username"]:
        return False, "请先登录!"
    return True, ""


def require_admin():
    """检查是否为管理员,未登录或非管理员返回错误"""
    ok, msg = require_login()
    if not ok:
        return False, msg
    if login_dict["role"] != "admin":
        return False, f"用户 {login_dict['username']} 没有权限执行此操作!"
    return True, ""


def select_user_by_id(user_data):
    """显示所有用户的编号列表,返回用户选择的用户名,若取消则返回 None"""
    if not user_data:
        print("暂无任何用户数据!")
        return None
    # 生成编号映射
    id_map = {}
    for idx, username in enumerate(user_data.keys(), start=1):
        idx_str = str(idx).zfill(3)
        print(f"ID: {idx_str}  |  用户名: {username}")
        id_map[idx_str] = username
    while True:
        choice = input("请输入用户ID (直接回车取消): ").strip()
        if not choice:
            return None
        if choice in id_map:
            return id_map[choice]
        print("无效ID,请重新输入。")


def input_hobby():
    """交互式输入爱好列表"""
    hobby_list = []
    print("请输入爱好(输入 q 结束):")
    while True:
        h = input("爱好: ").strip()
        if h == "q":
            break
        if not h:
            continue
        if h in hobby_list:
            print("爱好重复,请重新输入。")
        else:
            hobby_list.append(h)
            print(f"已添加: {h},当前爱好: {', '.join(hobby_list)}")
    return hobby_list


def input_age():
    """输入年龄,返回 (is_valid, age_or_error)"""
    age_str = input("请输入年龄: ").strip()
    if not age_str.isdigit():
        return False, "年龄必须是数字!"
    age = int(age_str)
    if age < 0 or age > 150:
        return False, "年龄超出正常范围(0~150)!"
    return True, age


# ------------------------ 核心业务函数 ------------------------
def register():
    print("\n--- 用户注册 ---")
    username = input("用户名: ").strip()
    password = input("密码: ").strip()
    ok, age_or_msg = input_age()
    if not ok:
        return False, age_or_msg
    age = age_or_msg
    hobby = input_hobby()

    # 管理员硬编码(可改为配置文件)
    role = "admin" if (username == "dream" and password == "521") else "user"

    users = get_all_users()
    if username in users:
        return False, f"用户名 {username} 已存在,请直接登录!"
    users[username] = {
        "username": username,
        "password": password,
        "age": age,
        "hobby": hobby,
        "role": role,
    }
    save_all_users(users)
    return True, f"用户 {username} 注册成功!"


def login():
    print("\n--- 用户登录 ---")
    username = input("用户名: ").strip()
    password = input("密码: ").strip()
    users = get_all_users()
    user = users.get(username)
    if not user:
        return False, f"用户 {username} 不存在,请先注册!"
    if user["password"] != password:
        return False, "用户名或密码错误!"
    login_dict["username"] = username
    login_dict["role"] = user["role"]
    return True, f"登录成功!欢迎 {username}({'管理员' if user['role'] == 'admin' else '普通用户'})"


def view_self():
    """查看自己的信息"""
    ok, msg = require_login()
    if not ok:
        return False, msg
    users = get_all_users()
    user = users.get(login_dict["username"])
    if not user:
        return False, "用户信息异常,请重新登录。"
    role_cn = "管理员" if user["role"] == "admin" else "普通用户"
    print(f"\n========== 我的信息 ==========")
    print(f"用户名: {user['username']}")
    print(f"密码: {user['password']}")
    print(f"年龄: {user['age']}")
    print(f"爱好: {', '.join(user['hobby'])}")
    print(f"身份: {role_cn}")
    print("==============================")
    return True, ""


def view_all_users():
    """管理员查看所有员工信息"""
    ok, msg = require_admin()
    if not ok:
        return False, msg
    users = get_all_users()
    if not users:
        return False, "暂无任何用户数据。"
    print("\n========== 所有员工信息 ==========")
    for username, info in users.items():
        role_cn = "管理员" if info["role"] == "admin" else "普通用户"
        print(f"用户名: {username} | 年龄: {info['age']} | 爱好: {', '.join(info['hobby'])} | 身份: {role_cn}")
    print("==================================")
    return True, ""


def view_one_user():
    """
    查看指定用户信息:
    - 普通用户只能查看自己
    - 管理员可以选择查看任意用户
    """
    ok, msg = require_login()
    if not ok:
        return False, msg

    users = get_all_users()
    current_role = login_dict["role"]
    current_name = login_dict["username"]

    if current_role == "user":
        # 普通用户直接查看自己
        target_name = current_name
    else:  # admin
        print("\n--- 可查看的用户列表 ---")
        target_name = select_user_by_id(users)
        if not target_name:
            return False, "未选择任何用户。"

    user = users.get(target_name)
    if not user:
        return False, f"用户 {target_name} 不存在。"

    role_cn = "管理员" if user["role"] == "admin" else "普通用户"
    print(f"\n========== 用户信息 ==========")
    print(f"用户名: {user['username']}")
    print(f"年龄: {user['age']}")
    print(f"爱好: {', '.join(user['hobby'])}")
    print(f"身份: {role_cn}")
    print("==============================")
    return True, ""


def update_user():
    """
    修改用户信息:
    - 普通用户只能修改自己的信息
    - 管理员可以修改任意用户的信息
    - 支持修改用户名、密码、年龄、爱好,留空表示不修改
    """
    ok, msg = require_login()
    if not ok:
        return False, msg

    users = get_all_users()
    current_role = login_dict["role"]
    current_name = login_dict["username"]

    if current_role == "user":
        target_name = current_name
    else:  # admin
        print("\n--- 可修改的用户列表 ---")
        target_name = select_user_by_id(users)
        if not target_name:
            return False, "未选择任何用户。"

    old_info = users.get(target_name)
    if not old_info:
        return False, f"用户 {target_name} 不存在。"

    print(f"\n正在修改用户: {target_name}(留空表示不修改)")
    new_username = input(f"新用户名(原: {target_name}): ").strip()
    new_password = input(f"新密码(原: {old_info['password']}): ").strip()
    age_input = input(f"新年龄(原: {old_info['age']}): ").strip()
    print("新爱好(留空则保留原爱好,输入 q 结束爱好输入):")
    # 爱好修改逻辑:如果要修改,则重新输入列表;否则保留原列表
    modify_hobby = input("是否修改爱好?(y/n): ").strip().lower()
    if modify_hobby == "y":
        new_hobby = input_hobby()
    else:
        new_hobby = old_info["hobby"]

    # 构造新信息
    final_username = new_username if new_username else target_name
    if final_username != target_name and final_username in users:
        return False, f"用户名 {final_username} 已存在,修改失败。"

    final_password = new_password if new_password else old_info["password"]
    if age_input:
        ok, age_val = input_age()  # 复用年龄校验
        if not ok:
            return False, age_val
        final_age = age_val
    else:
        final_age = old_info["age"]

    # 执行修改:删除旧条目,添加新条目
    del users[target_name]
    users[final_username] = {
        "username": final_username,
        "password": final_password,
        "age": final_age,
        "hobby": new_hobby,
        "role": old_info["role"],
    }
    save_all_users(users)

    # 如果修改的是当前登录用户,同步更新 login_dict
    if target_name == current_name:
        login_dict["username"] = final_username
        # role 不变

    return True, f"用户 {target_name} 信息修改成功!" + (f" 用户名已变更为 {final_username}" if final_username != target_name else "")


def delete_user():
    """删除指定用户(仅限管理员)"""
    ok, msg = require_admin()
    if not ok:
        return False, msg

    users = get_all_users()
    if not users:
        return False, "没有可删除的用户。"
    print("\n--- 可删除的用户列表 ---")
    target_name = select_user_by_id(users)
    if not target_name:
        return False, "未选择任何用户。"

    # 二次确认
    confirm = input(f"确认删除用户 {target_name} 吗?(y/n): ").strip().lower()
    if confirm != "y":
        return False, "取消删除。"

    del users[target_name]
    save_all_users(users)

    # 如果删除的是当前登录用户,清空登录状态
    if target_name == login_dict["username"]:
        login_dict.clear()
        return True, f"用户 {target_name} 已删除。您已被强制登出。"
    return True, f"用户 {target_name} 删除成功!"


def delete_all_users():
    """清空所有用户数据(仅限管理员)"""
    ok, msg = require_admin()
    if not ok:
        return False, msg

    confirm = input("警告:此操作将删除所有用户数据,确认吗?(y/n): ").strip().lower()
    if confirm != "y":
        return False, "取消删除所有用户。"
    save_all_users({})  # 保存空字典
    login_dict.clear()  # 清空登录状态
    return True, "所有用户数据已清空。您已被强制登出。"


def add_employee():
    """管理员添加新员工"""
    ok, msg = require_admin()
    if not ok:
        return False, msg

    print("\n--- 添加新员工 ---")
    username = input("用户名: ").strip()
    if not username:
        return False, "用户名不能为空。"
    password = input("密码: ").strip()
    if not password:
        return False, "密码不能为空。"

    ok, age_or_msg = input_age()
    if not ok:
        return False, age_or_msg
    age = age_or_msg

    hobby = input_hobby()
    role_choice = input("身份 (1.管理员 0.普通用户): ").strip()
    if role_choice == "1":
        role = "admin"
    elif role_choice == "0":
        role = "user"
    else:
        return False, "无效身份选项,请输入 1 或 0。"

    users = get_all_users()
    if username in users:
        return False, f"用户名 {username} 已存在,无法添加。"
    users[username] = {
        "username": username,
        "password": password,
        "age": age,
        "hobby": hobby,
        "role": role,
    }
    save_all_users(users)
    return True, f"员工 {username} 添加成功!"


def copy_file():
    """文件拷贝(仅限管理员)"""
    ok, msg = require_admin()
    if not ok:
        return False, msg

    src = input("请输入源文件路径: ").strip()
    if not os.path.exists(src):
        return False, "源文件不存在。"
    dst_dir = input("请输入目标目录: ").strip()
    if not os.path.exists(dst_dir):
        return False, "目标目录不存在。"
    new_name = input("新文件名(留空则使用原文件名): ").strip()
    if not new_name:
        new_name = os.path.basename(src)
    dst = os.path.join(dst_dir, new_name)

    try:
        # 二进制拷贝,兼容所有文件类型
        with open(src, "rb") as f_src:
            with open(dst, "wb") as f_dst:
                f_dst.write(f_src.read())
        return True, f"文件已从 {src} 复制到 {dst}"
    except Exception as e:
        return False, f"拷贝失败: {e}"


# ------------------------ 主菜单 ------------------------
def show_menu():
    print("""
***************** 员工管理系统 ***************** 
    1. 注册
    2. 登录
    3. 查看我的信息
    4. 查看所有员工信息(管理员)
    5. 查看指定用户信息
    6. 修改用户信息
    7. 删除用户(管理员)
    8. 删除所有用户(管理员)
    9. 添加员工(管理员)
   10. 文件拷贝(管理员)
   11. 退出
***************** 员工管理系统 ***************** 
    """)



def main():
    # 功能字典映射
    func_map = {
        "1": register,
        "2": login,
        "3": view_self,
        "4": view_all_users,
        "5": view_one_user,
        "6": update_user,
        "7": delete_user,
        "8": delete_all_users,
        "9": add_employee,
        "10": copy_file,
        "11": "exit",
    }

    while True:
        show_menu()
        choice = input("请输入功能编号: ").strip()
        if choice not in func_map:
            print("无效编号,请重新选择。")
            continue
        func = func_map[choice]
        if func == "exit":
            print("感谢使用,再见!")
            break
        ok, msg = func()
        if msg:
            print(msg if ok else f"错误:{msg}")
        print("-" * 50)


if __name__ == "__main__":
    main()
相关推荐
databook1 小时前
用 SymPy 解决 Manim 曲线绘制速度不均的问题
python·数学·动效
宇宙无敌程序员菜鸟1 小时前
浅玩CRUD Agent
python
程序大视界1 小时前
【Python系列课程】Python入门教程
开发语言·人工智能·python
morning_judger1 小时前
Agent系列(二)-记忆系统的设计
开发语言·python·机器学习
RSTJ_16251 小时前
PYTHON+AI LLM DAY SIXTY-ONE
开发语言·python
TickDB2 小时前
智谱GLM-4 接金融数据:工具描述多写三个字,模型少犯一类错
人工智能·python·websocket·行情数据 api·行情 api
用户0332126663672 小时前
使用 Python 在 Excel 中查找并高亮显示
python
sugar__salt2 小时前
Prompt工程实战指南:规范设计、LLM接口封装与避坑技巧
人工智能·python·prompt
码界筑梦坊3 小时前
282-基于Python的豆瓣音乐可视化分析推荐系统
开发语言·python·信息可视化·数据分析·flask·vue