同步视频分享:https://www.bilibili.com/video/BV19oxteZEi3/?share_source=copy_web&vd_source=23299b0b57096c0bbced9f14616531b8
该项目旨在帮助初学者更好地掌握 Java 编程语言,了解基础的业务结构,并为学生在完成 Java 课程的期末大作业时提供参考和借鉴。
一、项目演示
1.1 登录界面
1.2 管理界面
1.3 用户管理界面
1.4 新增用户界面
二、技术介绍
- jdk17
三、项目启动
源码地址:https://gitee.com/huang-jianmingm/shop-manager-system
3.1 进入giee拉取项目
使用IDEA打开项目:
粘贴刚刚的地址,然后克隆:
3.2 移动数据存储文件
项目的基础结构如上图所示,database 目录中存放着我们的序列化文件,这些文件用于数据存储。我们需要将 database 目录下的文件移动到配置文件中指定的路径,这样才能正确读取到数据。具体如下图所示,文件移动到和 ser.properties 中配置的位置一致。具体为何要这样子防止,在代码介绍时解释。
3.3 启动
找到项目启动类直接启动即可,启动后使用账号:admin;密码:123456进行登录。
四、项目结构
4.1 项目总体结构
4.2 gui结构介绍
4.3 pojo和service
五、代码介绍
5.1 启动类
public class ShopManagerSystem {
public static void main(String[] args) {
// 展示登录界面
LoginView.showLoginUI();
}
}
该类是整个项目的入口
5.2 登录功能
启动后进入登录界面,如下图所示:
具体登录代码:
// 按钮
JButton jbu = new JButton("登陆");
jf.add(jbu); //给窗体添加一个按钮对象
// 添加登录监听器
jbu.addActionListener(e -> {
String username = jtf1.getText();
String password = jtf2.getText();
// 获取用户信息
Map<String, User> userHashMap = UserMapper.getUserHashMap();
// 验证账号和密码,如果正确显示登陆成功的界面
if (userHashMap.get(username) == null) { // 账号错误
JOptionPane.showMessageDialog(jf, "账号不存在", "提示", JOptionPane.ERROR_MESSAGE);
} else if (!userHashMap.get(username).getPassword().equals(password)) { // 密码错误
JOptionPane.showMessageDialog(jf, "密码错误", "提示", JOptionPane.ERROR_MESSAGE);
} else {
// 登录成功进入管理界面
LoginView.closeLoginUI();
ManagerView.init(userHashMap.get(username).getNickname());
}
});
- 当输入账号和密码之后就会触发登录监听器,执行登录监听器的代码
- 在监听器中获取我们刚刚输入的账号和密码,和数据文件中的用户做对比,如果匹配则登录成功,否则登录失败。
获取数据文件中用户的具体代码:
public class UserMapper {
// 用户信息的哈希映射
private static Map<String, User> userHashMap = new HashMap<>();
// 用户信息 -> 数据存储
private static List<User> userList;
// 静态初始化块,在类加载时执行,用于初始化用户信息
static {
// 初始化系统用户
userList = new ArrayList<>();
SerializeUtil<User> userSerializeUtil = new SerializeUtil<>();
userList.addAll(userSerializeUtil.deserializeObj("user"));
// userList.add(new User("1", "admin", "123456", "管理员", "admin"));
// userList.add(new User("2", "common", "123456", "员工", "worker"));
userList.forEach(user -> userHashMap.put(user.getUsername(), user));
}
// 获取用户信息的静态方法
public static Map<String, User> getUserHashMap() {
return userHashMap;
}
public static List<User> getUserList() {
return userList;
}
}
- 当UserMapper加载时,静态代码块会随着类加载而加载,在静态代码块中对数据文件中的对象进行序列化
- 将序列化后的数据封装到Map数据结构中
序列化工具类:SerializeUtil,主要涉及到了IO流的读取,具体详情可查看代码。
5.3 管理界面功能
管理界面如下图所示,其中主要包含基础的增删改查功能。这里,功能的实现并不复杂,复制的主要是页面的构建,具体可查看对应的代码,代码中都有注释。
public class UserServiceImpl implements UserService {
@Override
public void addUser(User user) {
List<User> userList = UserMapper.getUserList();
long count = userList.stream().filter(u -> Objects.equals(u.getId(), user.getId()) || Objects.equals(u.getUsername(), user.getUsername())).count();
if (count > 0) throw new RuntimeException("主键或账号已存在");
userList.add(user);
}
@Override
public void updateUser(User user) {
List<User> userList = UserMapper.getUserList();
// 根据id找到要修改的用户
User temp = userList.stream().filter(u -> Objects.equals(u.getId(), user.getId())).findFirst().orElse(null);
// 修改用户信息
assert temp != null;
temp.setNickname(user.getNickname());
temp.setPassword(user.getPassword());
temp.setUsername(user.getUsername());
temp.setRole(user.getRole());
}
@Override
public void deleteById(String id) {
List<User> userList = UserMapper.getUserList();
User temp = userList.stream().filter(u -> Objects.equals(u.getId(), id)).findFirst().orElse(null);
userList.remove(temp);
}
@Override
public User queryUserById(String id) {
List<User> userList = UserMapper.getUserList();
return userList.stream().filter(u -> Objects.equals(u.getId(), id)).findFirst().orElse(null);
}
@Override
public List<User> queryUser(String nickname) {
List<User> userList = UserMapper.getUserList();
return userList.stream().filter(u -> u.getNickname().contains(nickname)).collect(Collectors.toList());
}
}
- 首先通过UserMapper获取用户数据的List集合
- 新增、修改、编辑、删除、查询list集合