Java登录系统:如何匹配LinkedList中登录用户并返回其姓名
解决方案
针对你遇到的两个问题,通过以下步骤修改代码即可实现需求:
1. 修复登录验证逻辑,确保邮箱与密码属于同一用户
当前代码分别按邮箱、密码独立查找用户,会导致不同用户的邮箱和密码交叉匹配也能登录。正确逻辑应该是:先通过邮箱找到用户,再验证该用户的密码是否匹配输入值,只有二者同时满足才算登录成功。
2. 保存当前登录用户,避免固定取第一个用户
在Session类中新增成员变量存储当前登录用户,登录成功后赋值,后续菜单直接调用该变量获取用户信息。
3. 给SuperMarket类添加姓名访问方法
由于SuperMarket的name是私有属性,新增getName()方法对外提供姓名获取能力,无需修改原有toString方法(若需保留其返回邮箱的功能)。
修改后的关键代码
Session类修改片段
public class Session { // 新增:存储当前登录用户 private SuperMarket currentUser; private LinkedList<SuperMarket> members = new LinkedList<SuperMarket>(); // ... 原有代码保留 ... public void login() { Scanner scanner = new Scanner(System.in); System.out.print("Email: "); String email = scanner.nextLine(); System.out.print("Password: "); String password = scanner.nextLine(); // 先通过邮箱定位用户 SuperMarket user = member(email); // 验证用户存在且密码匹配 if (user != null && user.hasPassword(password)) { currentUser = user; // 保存当前登录用户 adminMenu(); // 调用当前实例的菜单方法,不要新建Session } else { System.out.println("Incorrect SuperMarket details!"); } } public void adminMenu() { System.out.println("Admin Menu:"); System.out.println("C- Add Membership"); System.out.println("R- View Membership"); System.out.println("U- Update Membership"); System.out.println("D- Delete Membership"); System.out.println("V- View Memberships"); System.out.println("M- MMS Menu"); System.out.println("X- Logout"); // 使用当前登录用户的姓名 System.out.print("Session Admin: " + currentUser.getName() + " - Menu Commands (C/R/U/D/V/M/X): "); } // ... 原有代码保留 ... }
SuperMarket类修改片段
public class SuperMarket { private String name; private String email; private String password; private Memberships Memberships; private MMSLog MMSLog; // ... 原有代码保留 ... // 新增:获取用户姓名的方法 public String getName() { return name; } // ... 原有代码保留 ... }
额外优化建议
- 原代码中
readEmail()、readPassword()各自创建Scanner实例,建议统一复用一个Scanner,减少资源消耗(上述login方法已合并处理) - 可将输入的命令字符统一转为大写(或小写),避免大小写敏感导致的命令识别问题
内容的提问来源于stack exchange,提问作者cs010101111000
相关产品推荐
相关产品推荐

