Python全栈开发实战:用户管理系统从零实现

2026-06-01阅读 0热度 0
Python

用户管理系统,一个看似基础的练手项目,真正要做完整、可上线,必须覆盖文件持久化、角色权限控制、交互式输入校验、数据一致性维护等关键环节。每一步考虑不周,后期返工成本成倍增加。下面这份Python代码恰恰将上述环节全部落地——从注册登录到管理员增删改查,再到文件拷贝这类扩展功能,全部在一个脚本内闭环。值得逐行拆解。

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

  • 大作业 Python 用户管理系统
pythonimport 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 sa ve_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,
    }
    sa ve_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:
        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:
        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"],
    }
    sa ve_all_users(users)
    if target_name == current_name:
        login_dict["username"] = final_username
    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]
    sa ve_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, "取消删除所有用户。"
    sa ve_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,
    }
    sa ve_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()
免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

相关阅读

更多
欢迎回来 登录或注册后,可保存提示词和历史记录
登录后可同步收藏、历史记录和常用模板
注册即表示同意服务条款与隐私政策