游乐游手机版
首页/AI教程/文章详情

Python全栈开发第10天用户管理系统实战开发教程

时间:2026-06-01 18:37
用户管理系统(User Management System)长期以来一直是开发者们热衷的经典练手项目。然而,要真正打造一个功能完备、逻辑严谨、具备上线潜力的系统,涉及的技术要点其实相当广泛:文件持久化存储、多角色权限控制、交互式输入校验、数据一致性维护……任何一个环节考虑不周,后期都可能需要耗费数倍

用户管理系统(User Management System)长期以来一直是开发者们热衷的经典练手项目。然而,要真正打造一个功能完备、逻辑严谨、具备上线潜力的系统,涉及的技术要点其实相当广泛:文件持久化存储、多角色权限控制、交互式输入校验、数据一致性维护……任何一个环节考虑不周,后期都可能需要耗费数倍精力来修复漏洞。下面这份完整的 Python 用户管理系统代码,恰恰将这些关键环节都一一落地实现——从用户注册登录,到管理员的增删改查操作,再到文件拷贝等附加功能,全部整合在一个脚本中形成闭环。无论是 Python 初学者还是想夯实全栈开发能力的开发者,都值得深入拆解分析。

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

  • 大作业 用户管理系统
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()
来源:https://juejin.cn/post/7645981434772111412
上一篇AI生活助手AI Pickup Lines使用体验怎么样 下一篇HairstyleAI虚拟形象效果与使用测评
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
RAG四标融合企业知识资产体系四库协同GEO优化实践
AI教程 · 2026-07-01

RAG四标融合企业知识资产体系四库协同GEO优化实践

生成式AI正在彻底改写信息检索的底层逻辑。传统SEO依赖关键词堆砌和外链建设的策略,在大模型的内容采信规则下已经基本失效。取而代之的,是生成式引擎优化(GEO)。它不再关注外链数量,而是重点衡量你的知识是否结构化、证据链是否坚实、信源是否可靠——这些维度才是RAG(检索增强生成)架构真正看重的核心指

一个普通上班人分享WorkBuddy使用心得与真实体验
AI教程 · 2026-07-01

一个普通上班人分享WorkBuddy使用心得与真实体验

前言 最近我开始使用WorkBuddy——这是腾讯推出的一款AI办公工作台。差不多用了一周时间,趁印象还新鲜,把真实的使用感受记录下来,给还在犹豫的朋友做个参考。不吹不黑,只说实际体验。 初印象:不只是聊天机器人 之前用过不少AI工具,大多数就是个对话框,你问它答,答完就结束了。WorkBuddy不

AI幻觉变真功能实战教程:App Inventor 2视频录制拓展一周开发实录
AI教程 · 2026-07-01

AI幻觉变真功能实战教程:App Inventor 2视频录制拓展一周开发实录

先讲一个颇具戏剧性的开端。 这件事的开端颇显荒诞——有用户前来咨询,称AI Pro版的介绍中提到我们有一款“视频录制拓展”。团队全体成员都感到困惑,翻遍产品列表,发现根本不存在该组件。AI那种“一本正经胡说八道”的能力,这次确实让我们陷入尴尬。 按常理,此事到此便可结束——一句“抱歉,暂时没有这个拓

别再混淆OLAP和SQL-on-Hadoop两者查询本质不同
AI教程 · 2026-07-01

别再混淆OLAP和SQL-on-Hadoop两者查询本质不同

OLAP和SQL-on-Hadoop虽都使用SQL查询数据,但本质不同。SQL-on-Hadoop负责海量数据批量计算与ETL,查询速度秒级至分钟级;OLAP通过预聚合实现毫秒级多维分析,适合BI报表。两者在数据平台分工协作,前者是后厨加工,后者是前台快速服务。

GEO优化深度解析:AI偏好FAQ还是长文内容?
AI教程 · 2026-07-01

GEO优化深度解析:AI偏好FAQ还是长文内容?

在GEO优化中,AI对内容形式无统一偏好:FAQ在简单查询中引用率41%,长文在复杂查询中达58%。内容应基于用户意图选择形式,FAQ适配简单事实类问题,长文建立主题权威,两者互补而非替代。