完成了登录注册

This commit is contained in:
2025-12-14 20:08:47 +08:00
parent 32f639b5ca
commit a1812d346a
13 changed files with 719 additions and 96 deletions

View File

@@ -1,5 +1,4 @@
package backend.controller.interfaces; package backend.controller.interfaces;
import backend.service.interfaces.AuthService;
/** /**
* 登录控制器接口,用于处理用户登录和注册相关的业务逻辑 * 登录控制器接口,用于处理用户登录和注册相关的业务逻辑

View File

@@ -2,12 +2,10 @@ package backend.dao.impl;
import backend.dao.interfaces.UserDaoIF; import backend.dao.interfaces.UserDaoIF;
import backend.model.User; import backend.model.User;
import backend.utils.DBConnectionPool;
import backend.utils.DBHelper; import backend.utils.DBHelper;
import java.sql.Connection; import java.sql.*;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List; import java.util.List;
public class UserDao implements UserDaoIF { public class UserDao implements UserDaoIF {
@@ -29,7 +27,7 @@ public class UserDao implements UserDaoIF {
user.setPassword(rs.getString("password")); user.setPassword(rs.getString("password"));
user.setRole(rs.getString("role")); user.setRole(rs.getString("role"));
user.setEmail(rs.getString("email")); user.setEmail(rs.getString("email"));
user.setCreatedAt(rs.getTimestamp("createdAt")); user.setCreatedAt(String.valueOf(rs.getTimestamp("createdAt")));
} }
} catch (SQLException e) { } catch (SQLException e) {
System.out.println("查询用户失败: " + e.getMessage()); System.out.println("查询用户失败: " + e.getMessage());
@@ -53,7 +51,7 @@ public class UserDao implements UserDaoIF {
user.setPassword(rs.getString("password")); user.setPassword(rs.getString("password"));
user.setRole(rs.getString("role")); user.setRole(rs.getString("role"));
user.setEmail(rs.getString("email")); user.setEmail(rs.getString("email"));
user.setCreatedAt(rs.getTimestamp("createdAt")); user.setCreatedAt(String.valueOf(rs.getTimestamp("createdAt")));
} }
}catch (SQLException e) { }catch (SQLException e) {
System.out.println("查询用户失败: " + e.getMessage()); System.out.println("查询用户失败: " + e.getMessage());
@@ -62,8 +60,11 @@ public class UserDao implements UserDaoIF {
} }
@Override @Override
public boolean addUser(User user) { public int addUser(User user) {
Connection conn = DBHelper.getInstance().getConnection(); Connection conn = DBHelper.getInstance().getConnection();
int row=0;
if(conn==null)
return 0;
String sql = "insert into USER (username,password,role,email,createdAt) values (?,?,?,?,?)"; String sql = "insert into USER (username,password,role,email,createdAt) values (?,?,?,?,?)";
try{ try{
PreparedStatement stmt = conn.prepareStatement(sql); PreparedStatement stmt = conn.prepareStatement(sql);
@@ -71,17 +72,23 @@ public class UserDao implements UserDaoIF {
stmt.setString(2,user.getPassword()); stmt.setString(2,user.getPassword());
stmt.setString(3,user.getRole()); stmt.setString(3,user.getRole());
stmt.setString(4,user.getEmail()); stmt.setString(4,user.getEmail());
stmt.setTimestamp(5,user.getCreatedAt()); stmt.setDate(5,user.getCreatedAt());
return stmt.executeUpdate() > 0; row = stmt.executeUpdate();
stmt.close();
DBConnectionPool.releaseConnection(conn);
} catch (SQLException e) { } catch (SQLException e) {
System.out.println("添加用户失败: " + e.getMessage()); System.out.println("添加用户失败: " + e.getMessage());
} }
return false; return row;
} }
@Override @Override
public boolean updateUser(User user) { public int updateUser(User user) {
Connection conn = DBHelper.getInstance().getConnection(); Connection conn = DBHelper.getInstance().getConnection();
int row = 0;
if(conn==null)
return 0;
String sql = "update USER set username = ?,password = ?,role = ?,email = ?,createdAt = ? where id = ?"; String sql = "update USER set username = ?,password = ?,role = ?,email = ?,createdAt = ? where id = ?";
try{ try{
PreparedStatement stmt = conn.prepareStatement(sql); PreparedStatement stmt = conn.prepareStatement(sql);
@@ -89,27 +96,30 @@ public class UserDao implements UserDaoIF {
stmt.setString(2,user.getPassword()); stmt.setString(2,user.getPassword());
stmt.setString(3,user.getRole()); stmt.setString(3,user.getRole());
stmt.setString(4,user.getEmail()); stmt.setString(4,user.getEmail());
stmt.setTimestamp(5,user.getCreatedAt()); stmt.setDate(5,user.getCreatedAt());
stmt.setInt(6,user.getId()); stmt.setInt(6,user.getId());
return stmt.executeUpdate() > 0; row = stmt.executeUpdate();
stmt.close();
DBConnectionPool.releaseConnection(conn);
} catch (SQLException e) { } catch (SQLException e) {
System.out.println("更新用户失败: " + e.getMessage()); System.out.println("更新用户失败: " + e.getMessage());
} }
return false; return row;
} }
@Override @Override
public boolean deleteUser(int id) { public int deleteUser(int id) {
Connection conn = DBHelper.getInstance().getConnection(); Connection conn = DBHelper.getInstance().getConnection();
String sql = "delete from USER where id = ?"; String sql = "delete from USER where id = ?";
int row = 0;
try{ try{
PreparedStatement stmt = conn.prepareStatement(sql); PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1,id); stmt.setInt(1,id);
return stmt.executeUpdate() > 0; row = stmt.executeUpdate() ;
} catch (SQLException e) { } catch (SQLException e) {
System.out.println("删除用户失败: " + e.getMessage()); System.out.println("删除用户失败: " + e.getMessage());
} }
return false; return row;
} }
@Override @Override
@@ -126,7 +136,7 @@ public class UserDao implements UserDaoIF {
user.setPassword(rs.getString("password")); user.setPassword(rs.getString("password"));
user.setRole(rs.getString("role")); user.setRole(rs.getString("role"));
user.setEmail(rs.getString("email")); user.setEmail(rs.getString("email"));
user.setCreatedAt(rs.getTimestamp("createdAt")); user.setCreatedAt(String.valueOf(rs.getTimestamp("createdAt")));
return List.of(user); return List.of(user);
} }
}catch (SQLException e) { }catch (SQLException e) {

View File

@@ -27,21 +27,21 @@ public interface UserDaoIF {
* @param user 要添加的用户对象 * @param user 要添加的用户对象
* @return 添加成功返回true失败返回false * @return 添加成功返回true失败返回false
*/ */
boolean addUser(User user); int addUser(User user);
/** /**
* 更新用户信息 * 更新用户信息
* @param user 包含更新信息的用户对象 * @param user 包含更新信息的用户对象
* @return 更新成功返回true失败返回false * @return 更新成功返回true失败返回false
*/ */
boolean updateUser(User user); int updateUser(User user);
/** /**
* 删除用户 * 删除用户
* @param id 要删除的用户ID * @param id 要删除的用户ID
* @return 删除成功返回true失败返回false * @return 删除成功返回true失败返回false
*/ */
boolean deleteUser(int id); int deleteUser(int id);
/** /**
* 查找所有用户 * 查找所有用户

View File

@@ -0,0 +1,9 @@
package backend.model;
public class Questions {
private int id;
private String name;
private String description;
private String answer;
private int frequency;
}

View File

@@ -1,4 +1,6 @@
package backend.model; package backend.model;
import backend.utils.DBHelper;
import java.sql.*; import java.sql.*;
/** /**
@@ -50,6 +52,24 @@ public class User {
this.id = id; this.id = id;
} }
public void setId() {
Connection conn = DBHelper.getInstance().getConnection();
//根据目前最大ID值
String sql = "select max(id) from USER";
try {
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
if(rs.next()) {
id = rs.getInt(1) + 1;
this.id = id;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/** /**
* 设置用户名 * 设置用户名
* *
@@ -65,7 +85,10 @@ public class User {
* @param role 用户角色,可选值为"admin"或"user" * @param role 用户角色,可选值为"admin"或"user"
*/ */
public void setRole(String role) { public void setRole(String role) {
this.role = role; if(this.getUsername().equals("admin"))
this.role = "admin";
else
this.role = role;
} }
/** /**
@@ -91,9 +114,16 @@ public class User {
* *
* @param createdAt 用户创建时间 * @param createdAt 用户创建时间
*/ */
public void setCreatedAt(Timestamp createdAt) { public void setCreatedAt(String createdAt) {
this.createdAt = createdAt; try {
long timestamp = Long.parseLong(createdAt);
this.createdAt = new Date(timestamp);
} catch (NumberFormatException e) {
// 如果不是有效的时间戳,可以设置为当前日期或处理异常
this.createdAt = new Date(System.currentTimeMillis());
} }
}
/** /**
* 获取用户ID * 获取用户ID
@@ -145,8 +175,8 @@ public class User {
* *
* @return 用户创建时间 * @return 用户创建时间
*/ */
public Timestamp getCreatedAt() { public Date getCreatedAt() {
return createdAt; return Date.valueOf(String.valueOf(createdAt));
} }
} }

View File

@@ -2,27 +2,35 @@ package backend.model.enums;
/** /**
* 登录状态枚举类 * 登录状态枚举类
* 定义了系统中所有可能的登录相关状态码和对应的消息描述 * 用final保证状态信息不可变用static提供工具方法
*/ */
public enum LoginStatus { public enum LoginStatus {
SUCCESS(490,"登录成功"), // 【任务3】枚举实例状态码和描述
USER_NOT_FOUND(491,"用户不存在"), // 成功登录
PASSWORD_ERROR(492,"密码错误"), SUCCESS(200,"登录成功"),
ALREADY_LOGGED_IN(493,"重复登录"), // 密码错误
CAPTCHA_ERROR(494,"验证码错误"), PASSWORD_ERROR(901,"码错误"),
ACCOUNT_LOCKED(495,"账户被封禁"), // 验证码错误
PERMISSION_DENIED(496,"权限不足"), CAPTCHA_ERROR(902,"验证码错误"),
LOGOUT_SUCCESS(497,"登出成功"), // 用户不存在
NOT_LOGGED_IN(498,"未登录"), USER_NOT_FOUND(903,"用户不存在"),
UNKNOWN_ERROR(499,"未知错误"), //注册失败
REGISTER_FAILD(500,"注册失败"); REGISTER_FAILED(904, "注册失败,用户名已存在"),
//注册成功
REGISTER_SUCCESS(905, "注册成功"),
//两次输入密码不一致
PASSWORD_NOT_MATCH(906, "两次输入的密码不一致");
// 【任务1】定义 final修饰的属性确保状态信息不可修改
private final int code; private final int code;
private final String msg; private final String msg;
/** /**
* 构造函数,初始化状态码和消息 * 【任务2】
* 构造函数用于创建LoginStatus实例
* @param code 状态码 * @param code 状态码
* @param msg 状态消息 * @param msg 状态消息
*/ */
@@ -31,13 +39,14 @@ public enum LoginStatus {
this.msg = msg; this.msg = msg;
} }
// 静态方法根据状态码获取枚举实例static工具方法
/** /**
* 根据状态码获取对应的登录状态枚举值 * 【任务4】
* 静态方法: getByCode 根据状态码获取对应的登录状态枚举值
* @param code 状态码 * @param code 状态码
* @return 对应的LoginStatus枚举值如果未找到则返回null * @return LoginStatus 对应的LoginStatus枚举值如果找不到匹配的状态码则返回null
*/ */
public static LoginStatus getByCode(int code){ public static LoginStatus getByCode(int code){
// 遍历所有枚举值查找匹配的状态码
for(LoginStatus status:values()){ for(LoginStatus status:values()){
if(status.code==code){ if(status.code==code){
return status; return status;
@@ -46,21 +55,25 @@ public enum LoginStatus {
return null; return null;
} }
// getter方法final属性无需setter
/** /**
* 获取状态码 * 【任务5】
* @return 状态码 * 方法: getCode 获取code值
*
* @return int code值
*/ */
public int getCode() { public int getCode() {
return code; return code;
} }
/** /**
* 获取状态消息 * 任务【6】
* @return 状态消息 * 方法: getMsg 获取消息内容
*
* @return String 返回当前对象的消息字符串
*/ */
public String getMsg() { public String getMsg() {
return msg; return msg;
} }
} }

View File

@@ -0,0 +1,43 @@
package backend.service.impl;
import backend.dao.impl.UserDao;
import backend.model.enums.LoginStatus;
import backend.model.User;
import backend.utils.impl.*;
public class AuthService {
private UserDao userDao = new UserDao();
public LoginStatus login(User user) {
User dbUser = userDao.findByUsername(user.getUsername());
if(dbUser==null)
return LoginStatus.USER_NOT_FOUND;
if(dbUser.getUsername().equals(user.getUsername())&&dbUser.getPassword().equals(user.getPassword()))
return LoginStatus.SUCCESS;
else if (!dbUser.getUsername().equals(user.getUsername())) {
return LoginStatus.USER_NOT_FOUND;
}
return LoginStatus.PASSWORD_ERROR;
}
public LoginStatus register(User user) {
User dbAccount = userDao.findByUsername(user.getUsername());
if(dbAccount!=null)
return LoginStatus.REGISTER_FAILED;
//点击注册按钮后的事件
int row = userDao.addUser(user);
if(row>0)
return LoginStatus.REGISTER_SUCCESS;
else
return LoginStatus.REGISTER_FAILED;
}
public boolean hasPermission(int userId, String requiredRole) {
UserDao userDao = new UserDao();
User user = userDao.findById(userId);
if (user != null) {
return user.getRole().equals(requiredRole);
}
return false;
}
}

View File

@@ -1,48 +0,0 @@
package backend.service.interfaces;
/**
* 认证服务接口
* 提供用户认证和权限管理相关功能
*/
public interface AuthService {
/**
* 用户登录验证
* 验证用户名和密码是否匹配,如果匹配则允许用户登录系统
*
* @param username 用户名
* @param password 密码
* @return 登录成功返回true失败返回false
*/
boolean login(String username, String password);
/**
* 用户注册
* 创建新的用户账户,将用户信息存储到系统中
*
* @param username 用户名
* @param password 密码
* @param email 邮箱地址
* @return 注册成功返回true失败返回false
*/
boolean register(String username, String password, String email);
/**
* 用户登出
* 使指定用户的会话失效,结束用户的登录状态
*
* @param userId 用户唯一标识符
* @return 登出成功返回true失败返回false
*/
boolean logout(int userId);
/**
* 权限检查
* 检查指定用户是否具有所需的权限角色
*
* @param userId 用户唯一标识符
* @param requiredRole 所需的角色权限
* @return 具有权限返回true无权限返回false
*/
boolean hasPermission(int userId, String requiredRole);
}

View File

@@ -0,0 +1,49 @@
package backend.utils.impl;
import java.util.Random;
public class CaptchaUtils implements backend.utils.interfaces.CaptchaUtils{
/**
* 字符集常量,包含大小写字母和数字
*/
static final String CHAR_SET="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
/**
* 验证码长度常量默认为4位
*/
static final int CAPTCHA_LENGTH=4;
/**
* 私有构造函数,防止实例化
*/
private CaptchaUtils(){};
/**
* 生成随机验证码
*
* @return 生成的验证码字符串
*/
public static String generateCaptcha(){
Random random = new Random();
//生成随机验证码
StringBuilder sb = new StringBuilder();
for(int i=0;i<CAPTCHA_LENGTH;i++){
//生成随机数索引
int index = random.nextInt(CHAR_SET.length());
//根据索引获取随机字符
sb.append(CHAR_SET.charAt(index));
}
return sb.toString();
}
/**
* 验证用户输入的验证码是否正确
*
* @param inputCaptcha 用户输入的验证码
* @param systemCaptcha 系统生成的验证码
* @return 验证结果正确返回true错误返回false
*/
public static boolean verifyCaptcha(String inputCaptcha,String systemCaptcha){
return inputCaptcha.equals(systemCaptcha);
}
}

View File

@@ -0,0 +1,89 @@
package backend.utils.impl;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class PasswordUtils {
private static final String PREFIX = "encrypted_";
private static final SecureRandom random = new SecureRandom();
/**
* 对明文密码进行加密处理
*
* @param plainText 需要加密的明文密码字符串
* @return 加密后的密码字符串
*/
public static String encrypt(String plainText){
if (plainText == null) {
throw new IllegalArgumentException("密码不能为空");
}
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] salt = new byte[16];
random.nextBytes(salt);
md.update(salt);
byte[] hashedPassword = md.digest(plainText.getBytes());
StringBuilder sb = new StringBuilder();
sb.append(PREFIX);
for (byte b : salt) {
sb.append(String.format("%02x", b));
}
for (byte b : hashedPassword) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("SHA-256 algorithm not available", e);
}
}
/**
* 验证明文密码与已加密密码是否匹配
*
* @param plainText 明文密码字符串
* @param hashed 已加密的密码字符串
* @return 如果匹配返回true否则返回false
*/
public static boolean verify(String plainText, String hashed){
if (plainText == null || hashed == null) {
return false;
}
if (!hashed.startsWith(PREFIX)) {
return false;
}
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
String hashWithoutPrefix = hashed.substring(PREFIX.length());
if (hashWithoutPrefix.length() < 32) {
return false;
}
String saltHex = hashWithoutPrefix.substring(0, 32);
String storedHashHex = hashWithoutPrefix.substring(32);
byte[] salt = new byte[16];
for (int i = 0; i < 16; i++) {
salt[i] = (byte) Integer.parseInt(saltHex.substring(i * 2, i * 2 + 2), 16);
}
md.update(salt);
byte[] hashedPassword = md.digest(plainText.getBytes());
StringBuilder sb = new StringBuilder();
for (byte b : hashedPassword) {
sb.append(String.format("%02x", b));
}
return sb.toString().equals(storedHashHex);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("SHA-256 algorithm not available", e);
} catch (NumberFormatException e) {
return false;
}
}
}

199
src/view/LoginFrame.java Normal file
View File

@@ -0,0 +1,199 @@
package view;
import backend.model.enums.LoginStatus;
import backend.model.User;
import backend.service.impl.AuthService;
import backend.utils.impl.CaptchaUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class LoginFrame extends JFrame{
private JPanel mainPanel;//中间层面板
private JTextField usernameTextField;//用户名输入框
private JPasswordField passwordField;//密码输入框
private JTextField captchaTextField;//验证码输入框
private JLabel captchaLabel;//验证码标签
private JButton loginButton;//登录按钮
private JButton registerButton;//注册按钮
private AuthService authService = new AuthService();
public LoginFrame() {
//初始化界面
initView();
//注册监听器
initListener();
usernameTextField.setText("admin");
passwordField.setText("123456");
captchaTextField.setText(captchaLabel.getText());
}
private void initView(){
//1.设置标题
setTitle("登录");
//2.设置点击关闭时的动作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//3.中间层容器
add(initPanel());
//4.不允许窗口改变大小
setResizable(false);
//5.自动调整窗口大小 居中显示
pack();//自动调整窗口大小
setLocationRelativeTo(null);//剧中
//6.显示窗口
setVisible(true);
}
private void initListener(){
captchaLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
captchaLabel.setText(CaptchaUtils.generateCaptcha());
}
});
loginButton.addActionListener(e -> {
//点击登录按钮后的事件
String username = usernameTextField.getText();
String password = passwordField.getText();
String captcha = captchaTextField.getText();
//System.out.println("用户名" + username + " 密码" + password + " 验证码" + captcha);
if(username.equals("")||password.equals("")||captcha.equals("")) {
JOptionPane.showMessageDialog(this, "请填写完整信息!", "提示", JOptionPane.INFORMATION_MESSAGE);
return;
}
if(!CaptchaUtils.verifyCaptcha(captcha,captchaLabel.getText())){
JOptionPane.showMessageDialog(this, LoginStatus.CAPTCHA_ERROR.getMsg(), "提示", JOptionPane.INFORMATION_MESSAGE);
return;
}
User account = new User();
account.setUsername(username);
account.setPassword(password);
LoginStatus loginStatus = authService.login(account);
if(loginStatus == LoginStatus.SUCCESS) {
//进入主界面
MainFrame mainFrame = new MainFrame();
this.dispose();
}
else if(loginStatus == LoginStatus.USER_NOT_FOUND) {
JOptionPane.showMessageDialog(this, LoginStatus.USER_NOT_FOUND.getMsg(), "提示", JOptionPane.INFORMATION_MESSAGE);
return;
}
else if(loginStatus == LoginStatus.PASSWORD_ERROR) {
JOptionPane.showMessageDialog(this, LoginStatus.PASSWORD_ERROR.getMsg(), "提示", JOptionPane.INFORMATION_MESSAGE);
return;
}
else{
JOptionPane.showMessageDialog(this, loginStatus.getMsg(), "提示", JOptionPane.INFORMATION_MESSAGE);
}
});
registerButton.addActionListener(e -> {
//点击注册按钮后的事件
RegisterFrame registerFrame = new RegisterFrame();
registerFrame.setVisible(true);
registerFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
});
}
private JPanel initPanel(){
mainPanel = new JPanel();
GridLayout gridLayout = new GridLayout(6,1,10,10);
mainPanel.setLayout(gridLayout);
//第1层 空白面板 占用
mainPanel.add(new JPanel());
//第2层 账号面板
mainPanel.add(initAcountPanel());
//第3层 密码面板
mainPanel.add(initPasswordPanel());
//第4层 验证码面板
mainPanel.add(initCaptchaPanel());
//第5层 按钮面板
mainPanel.add(initButtonPanel());
//第6层 空白面板 占用
return mainPanel;
}
private JPanel initAcountPanel(){
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1,4,10,0));
JLabel label = new JLabel("用户名:");
//让label居右
label.setHorizontalAlignment(SwingConstants.RIGHT);
usernameTextField = new JTextField(15);
panel.add(label);
panel.add(usernameTextField);
panel.add(new JPanel());
return panel;
}
private JPanel initPasswordPanel(){
JPanel panel = new JPanel();
// 设置网格布局1行4列水平间距10像素
panel.setLayout(new GridLayout(1,4,10,0));
JLabel label = new JLabel("密 码:");
// 设置标签文本右对齐
label.setHorizontalAlignment(SwingConstants.RIGHT);
passwordField = new JPasswordField(15);
panel.add(label);
panel.add(passwordField);
// 添加空白面板占位
panel.add(new JPanel());
return panel;
}
private JPanel initCaptchaPanel(){
// 创建面板并设置网格布局
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1,4,10,0));
// 创建验证码标签
JLabel label = new JLabel("验证码:");
label.setHorizontalAlignment(SwingConstants.RIGHT);
// 创建验证码输入框和验证码显示标签
captchaTextField = new JTextField(4);
captchaLabel = new JLabel(CaptchaUtils.generateCaptcha());
// 将组件添加到面板中
panel.add(label);
panel.add(captchaTextField);
panel.add(captchaLabel);
return panel;
}
private JPanel initEmailPanel(){
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1,4,10,0));
JLabel label = new JLabel("邮 箱:");
label.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField emailTextField = new JTextField(15);
panel.add(label);
panel.add(emailTextField);
panel.add(new JPanel());
return panel;
}
private JPanel initButtonPanel(){
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1,4,10,0));
loginButton = new JButton("登录");
registerButton = new JButton("注册");
panel.add(new JPanel());
panel.add(loginButton);
panel.add(registerButton);
panel.add(new JPanel());
return panel;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
LoginFrame loginFrame = new LoginFrame();
loginFrame.setVisible(true);
});
}
}

7
src/view/MainFrame.java Normal file
View File

@@ -0,0 +1,7 @@
package view;
import javax.swing.*;
public class MainFrame {
private JPanel mainPanel;
}

223
src/view/RegisterFrame.java Normal file
View File

@@ -0,0 +1,223 @@
package view;
import backend.model.User;
import backend.model.enums.LoginStatus;
import backend.service.impl.AuthService;
import backend.utils.impl.CaptchaUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class RegisterFrame extends JFrame{
private JPanel mainPanel;//中间层面板
private JTextField usernameTextField;//用户名输入框
private JPasswordField passwordField;//密码输入框
private JPasswordField confirmPasswordField;//确认密码输入框
private JTextField captchaTextField;//验证码输入框
private JTextField emailTextField;//邮箱输入框
private JLabel captchaLabel;//验证码标签
private JButton registerButton;//注册按钮
private JButton backButton;//返回按钮
private AuthService authService = new AuthService();
public RegisterFrame() {
//初始化界面
initView();
//注册监听器
initListener();
usernameTextField.setText("admin");
passwordField.setText("123456");
captchaTextField.setText(captchaLabel.getText());
emailTextField.setText("123456@qq.com");
confirmPasswordField.setText(passwordField.getText());
}
private void initView(){
//1.设置标题
setTitle("注册");
//2.设置点击关闭时的动作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//3.中间层容器
add(initPanel());
//4.不允许窗口改变大小
setResizable(false);
//5.自动调整窗口大小 居中显示
pack();//自动调整窗口大小
setLocationRelativeTo(null);//剧中
//6.显示窗口
setVisible(true);
}
private void initListener(){
captchaLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
captchaLabel.setText(CaptchaUtils.generateCaptcha());
}
});
registerButton.addActionListener(e -> {
//点击注册按钮后的事件
String username = usernameTextField.getText();
String password = passwordField.getText();
String captcha = captchaTextField.getText();
//System.out.println("用户名" + username + " 密码" + password + " 验证码" + captcha);
if(username.equals("")||password.equals("")||captcha.equals("")) {
JOptionPane.showMessageDialog(this, "请填写完整信息!", "提示", JOptionPane.INFORMATION_MESSAGE);
return;
}
if(!CaptchaUtils.verifyCaptcha(captcha,captchaLabel.getText())){
JOptionPane.showMessageDialog(this, LoginStatus.CAPTCHA_ERROR.getMsg(), "提示", JOptionPane.INFORMATION_MESSAGE);
return;
}
if(!confirmPasswordField.getText().equals(password))
JOptionPane.showMessageDialog(this, LoginStatus.PASSWORD_NOT_MATCH.getMsg(), "提示", JOptionPane.INFORMATION_MESSAGE);
User account = new User();
account.setId();
account.setUsername(username);
account.setPassword(password);
account.setEmail(emailTextField.getText());
account.setRole("user");
account.setCreatedAt(String.valueOf(System.currentTimeMillis()));
LoginStatus loginStatus = authService.register(account);
if(loginStatus==LoginStatus.REGISTER_SUCCESS) {
this.dispose();
}
if(loginStatus == LoginStatus.SUCCESS) {
//返回注册界面
mainPanel.removeAll();
//关闭注册界面
this.dispose();
}
else if(loginStatus == LoginStatus.USER_NOT_FOUND) {
JOptionPane.showMessageDialog(this, LoginStatus.USER_NOT_FOUND.getMsg(), "提示", JOptionPane.INFORMATION_MESSAGE);
return;
}
else if(loginStatus == LoginStatus.PASSWORD_ERROR) {
JOptionPane.showMessageDialog(this, LoginStatus.PASSWORD_ERROR.getMsg(), "提示", JOptionPane.INFORMATION_MESSAGE);
return;
}
else{
JOptionPane.showMessageDialog(this, loginStatus.getMsg(), "提示", JOptionPane.INFORMATION_MESSAGE);
}
});
backButton.addActionListener(e -> {
//返回登录界面
mainPanel.removeAll();
dispose();
});
}
private JPanel initPanel(){
mainPanel = new JPanel();
GridLayout gridLayout = new GridLayout(8,1,10,10);
mainPanel.setLayout(gridLayout);
//第1层 空白面板 占用
mainPanel.add(new JPanel());
//第2层 账号面板
mainPanel.add(initAcountPanel());
//第3层 密码面板
mainPanel.add(initPasswordPanel());
//第4层 密码确认面板
mainPanel.add(initConfirmPasswordPanel());
//第5层 邮箱面板
mainPanel.add(initEmailPanel());
//第6层 验证码面板
mainPanel.add(initCaptchaPanel());
//第7层 按钮面板
mainPanel.add(initButtonPanel());
//第8层 空白面板 占用
return mainPanel;
}
private JPanel initAcountPanel(){
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1,4,10,0));
JLabel label = new JLabel("用户名:");
//让label居右
label.setHorizontalAlignment(SwingConstants.RIGHT);
usernameTextField = new JTextField(15);
panel.add(label);
panel.add(usernameTextField);
panel.add(new JPanel());
return panel;
}
private JPanel initPasswordPanel(){
JPanel panel = new JPanel();
// 设置网格布局1行4列水平间距10像素
panel.setLayout(new GridLayout(1,4,10,0));
JLabel label = new JLabel("密 码:");
// 设置标签文本右对齐
label.setHorizontalAlignment(SwingConstants.RIGHT);
passwordField = new JPasswordField(15);
panel.add(label);
panel.add(passwordField);
// 添加空白面板占位
panel.add(new JPanel());
return panel;
}
private JPanel initConfirmPasswordPanel(){
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1,4,10,0));
JLabel label = new JLabel("确认密码:");
label.setHorizontalAlignment(SwingConstants.RIGHT);
confirmPasswordField = new JPasswordField(15);
panel.add(label);
panel.add(confirmPasswordField);
panel.add(new JPanel());
return panel;
}
private JPanel initCaptchaPanel(){
// 创建面板并设置网格布局
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1,4,10,0));
// 创建验证码标签
JLabel label = new JLabel("验证码:");
label.setHorizontalAlignment(SwingConstants.RIGHT);
// 创建验证码输入框和验证码显示标签
captchaTextField = new JTextField(4);
captchaLabel = new JLabel(CaptchaUtils.generateCaptcha());
// 将组件添加到面板中
panel.add(label);
panel.add(captchaTextField);
panel.add(captchaLabel);
return panel;
}
private JPanel initEmailPanel(){
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1,4,10,0));
JLabel label = new JLabel("邮 箱:");
label.setHorizontalAlignment(SwingConstants.RIGHT);
emailTextField = new JTextField(15);
panel.add(label);
panel.add(emailTextField);
panel.add(new JPanel());
return panel;
}
private JPanel initButtonPanel(){
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1,4,10,0));
registerButton = new JButton("注册");
backButton = new JButton("返回");
panel.add(new JPanel());
panel.add(registerButton);
panel.add(backButton);
panel.add(new JPanel());
return panel;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
view.RegisterFrame registerFrame = new view.RegisterFrame();
registerFrame.setVisible(true);
});
}
}