完成了登录注册
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
package backend.controller.interfaces;
|
||||
import backend.service.interfaces.AuthService;
|
||||
|
||||
/**
|
||||
* 登录控制器接口,用于处理用户登录和注册相关的业务逻辑
|
||||
|
||||
@@ -2,12 +2,10 @@ package backend.dao.impl;
|
||||
|
||||
import backend.dao.interfaces.UserDaoIF;
|
||||
import backend.model.User;
|
||||
import backend.utils.DBConnectionPool;
|
||||
import backend.utils.DBHelper;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.*;
|
||||
import java.util.List;
|
||||
|
||||
public class UserDao implements UserDaoIF {
|
||||
@@ -29,7 +27,7 @@ public class UserDao implements UserDaoIF {
|
||||
user.setPassword(rs.getString("password"));
|
||||
user.setRole(rs.getString("role"));
|
||||
user.setEmail(rs.getString("email"));
|
||||
user.setCreatedAt(rs.getTimestamp("createdAt"));
|
||||
user.setCreatedAt(String.valueOf(rs.getTimestamp("createdAt")));
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
System.out.println("查询用户失败: " + e.getMessage());
|
||||
@@ -53,7 +51,7 @@ public class UserDao implements UserDaoIF {
|
||||
user.setPassword(rs.getString("password"));
|
||||
user.setRole(rs.getString("role"));
|
||||
user.setEmail(rs.getString("email"));
|
||||
user.setCreatedAt(rs.getTimestamp("createdAt"));
|
||||
user.setCreatedAt(String.valueOf(rs.getTimestamp("createdAt")));
|
||||
}
|
||||
}catch (SQLException e) {
|
||||
System.out.println("查询用户失败: " + e.getMessage());
|
||||
@@ -62,8 +60,11 @@ public class UserDao implements UserDaoIF {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addUser(User user) {
|
||||
public int addUser(User user) {
|
||||
Connection conn = DBHelper.getInstance().getConnection();
|
||||
int row=0;
|
||||
if(conn==null)
|
||||
return 0;
|
||||
String sql = "insert into USER (username,password,role,email,createdAt) values (?,?,?,?,?)";
|
||||
try{
|
||||
PreparedStatement stmt = conn.prepareStatement(sql);
|
||||
@@ -71,17 +72,23 @@ public class UserDao implements UserDaoIF {
|
||||
stmt.setString(2,user.getPassword());
|
||||
stmt.setString(3,user.getRole());
|
||||
stmt.setString(4,user.getEmail());
|
||||
stmt.setTimestamp(5,user.getCreatedAt());
|
||||
return stmt.executeUpdate() > 0;
|
||||
stmt.setDate(5,user.getCreatedAt());
|
||||
row = stmt.executeUpdate();
|
||||
stmt.close();
|
||||
DBConnectionPool.releaseConnection(conn);
|
||||
} catch (SQLException e) {
|
||||
System.out.println("添加用户失败: " + e.getMessage());
|
||||
}
|
||||
return false;
|
||||
return row;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateUser(User user) {
|
||||
public int updateUser(User user) {
|
||||
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 = ?";
|
||||
try{
|
||||
PreparedStatement stmt = conn.prepareStatement(sql);
|
||||
@@ -89,27 +96,30 @@ public class UserDao implements UserDaoIF {
|
||||
stmt.setString(2,user.getPassword());
|
||||
stmt.setString(3,user.getRole());
|
||||
stmt.setString(4,user.getEmail());
|
||||
stmt.setTimestamp(5,user.getCreatedAt());
|
||||
stmt.setDate(5,user.getCreatedAt());
|
||||
stmt.setInt(6,user.getId());
|
||||
return stmt.executeUpdate() > 0;
|
||||
row = stmt.executeUpdate();
|
||||
stmt.close();
|
||||
DBConnectionPool.releaseConnection(conn);
|
||||
} catch (SQLException e) {
|
||||
System.out.println("更新用户失败: " + e.getMessage());
|
||||
}
|
||||
return false;
|
||||
return row;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean deleteUser(int id) {
|
||||
public int deleteUser(int id) {
|
||||
Connection conn = DBHelper.getInstance().getConnection();
|
||||
String sql = "delete from USER where id = ?";
|
||||
int row = 0;
|
||||
try{
|
||||
PreparedStatement stmt = conn.prepareStatement(sql);
|
||||
stmt.setInt(1,id);
|
||||
return stmt.executeUpdate() > 0;
|
||||
row = stmt.executeUpdate() ;
|
||||
} catch (SQLException e) {
|
||||
System.out.println("删除用户失败: " + e.getMessage());
|
||||
}
|
||||
return false;
|
||||
return row;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -126,7 +136,7 @@ public class UserDao implements UserDaoIF {
|
||||
user.setPassword(rs.getString("password"));
|
||||
user.setRole(rs.getString("role"));
|
||||
user.setEmail(rs.getString("email"));
|
||||
user.setCreatedAt(rs.getTimestamp("createdAt"));
|
||||
user.setCreatedAt(String.valueOf(rs.getTimestamp("createdAt")));
|
||||
return List.of(user);
|
||||
}
|
||||
}catch (SQLException e) {
|
||||
|
||||
@@ -27,21 +27,21 @@ public interface UserDaoIF {
|
||||
* @param user 要添加的用户对象
|
||||
* @return 添加成功返回true,失败返回false
|
||||
*/
|
||||
boolean addUser(User user);
|
||||
int addUser(User user);
|
||||
|
||||
/**
|
||||
* 更新用户信息
|
||||
* @param user 包含更新信息的用户对象
|
||||
* @return 更新成功返回true,失败返回false
|
||||
*/
|
||||
boolean updateUser(User user);
|
||||
int updateUser(User user);
|
||||
|
||||
/**
|
||||
* 删除用户
|
||||
* @param id 要删除的用户ID
|
||||
* @return 删除成功返回true,失败返回false
|
||||
*/
|
||||
boolean deleteUser(int id);
|
||||
int deleteUser(int id);
|
||||
|
||||
/**
|
||||
* 查找所有用户
|
||||
|
||||
9
src/backend/model/Questions.java
Normal file
9
src/backend/model/Questions.java
Normal 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;
|
||||
}
|
||||
@@ -1,4 +1,6 @@
|
||||
package backend.model;
|
||||
import backend.utils.DBHelper;
|
||||
|
||||
import java.sql.*;
|
||||
|
||||
/**
|
||||
@@ -50,6 +52,24 @@ public class User {
|
||||
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,6 +85,9 @@ public class User {
|
||||
* @param role 用户角色,可选值为"admin"或"user"
|
||||
*/
|
||||
public void setRole(String role) {
|
||||
if(this.getUsername().equals("admin"))
|
||||
this.role = "admin";
|
||||
else
|
||||
this.role = role;
|
||||
}
|
||||
|
||||
@@ -91,9 +114,16 @@ public class User {
|
||||
*
|
||||
* @param createdAt 用户创建时间
|
||||
*/
|
||||
public void setCreatedAt(Timestamp createdAt) {
|
||||
this.createdAt = createdAt;
|
||||
public void setCreatedAt(String createdAt) {
|
||||
try {
|
||||
long timestamp = Long.parseLong(createdAt);
|
||||
this.createdAt = new Date(timestamp);
|
||||
} catch (NumberFormatException e) {
|
||||
// 如果不是有效的时间戳,可以设置为当前日期或处理异常
|
||||
this.createdAt = new Date(System.currentTimeMillis());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取用户ID
|
||||
@@ -145,8 +175,8 @@ public class User {
|
||||
*
|
||||
* @return 用户创建时间
|
||||
*/
|
||||
public Timestamp getCreatedAt() {
|
||||
return createdAt;
|
||||
public Date getCreatedAt() {
|
||||
return Date.valueOf(String.valueOf(createdAt));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,27 +2,35 @@ package backend.model.enums;
|
||||
|
||||
/**
|
||||
* 登录状态枚举类
|
||||
* 定义了系统中所有可能的登录相关状态码和对应的消息描述
|
||||
* 用final保证状态信息不可变,用static提供工具方法
|
||||
*/
|
||||
public enum LoginStatus {
|
||||
SUCCESS(490,"登录成功"),
|
||||
USER_NOT_FOUND(491,"用户不存在"),
|
||||
PASSWORD_ERROR(492,"密码错误"),
|
||||
ALREADY_LOGGED_IN(493,"重复登录"),
|
||||
CAPTCHA_ERROR(494,"验证码错误"),
|
||||
ACCOUNT_LOCKED(495,"账户被封禁"),
|
||||
PERMISSION_DENIED(496,"权限不足"),
|
||||
LOGOUT_SUCCESS(497,"登出成功"),
|
||||
NOT_LOGGED_IN(498,"未登录"),
|
||||
UNKNOWN_ERROR(499,"未知错误"),
|
||||
REGISTER_FAILD(500,"注册失败");
|
||||
// 【任务3】枚举实例:状态码和描述
|
||||
// 成功登录
|
||||
SUCCESS(200,"登录成功"),
|
||||
// 密码错误
|
||||
PASSWORD_ERROR(901,"密码错误"),
|
||||
// 验证码错误
|
||||
CAPTCHA_ERROR(902,"验证码错误"),
|
||||
// 用户不存在
|
||||
USER_NOT_FOUND(903,"用户不存在"),
|
||||
//注册失败
|
||||
REGISTER_FAILED(904, "注册失败,用户名已存在"),
|
||||
//注册成功
|
||||
REGISTER_SUCCESS(905, "注册成功"),
|
||||
//两次输入密码不一致
|
||||
PASSWORD_NOT_MATCH(906, "两次输入的密码不一致");
|
||||
|
||||
|
||||
// 【任务1】定义 final修饰的属性:确保状态信息不可修改
|
||||
private final int code;
|
||||
private final String msg;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 构造函数,初始化状态码和消息
|
||||
* 【任务2】
|
||||
* 构造函数,用于创建LoginStatus实例
|
||||
* @param code 状态码
|
||||
* @param msg 状态消息
|
||||
*/
|
||||
@@ -31,13 +39,14 @@ public enum LoginStatus {
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
// 静态方法:根据状态码获取枚举实例(static工具方法)
|
||||
/**
|
||||
* 根据状态码获取对应的登录状态枚举值
|
||||
* 【任务4】
|
||||
* 静态方法: getByCode 根据状态码获取对应的登录状态枚举值
|
||||
* @param code 状态码
|
||||
* @return 对应的LoginStatus枚举值,如果未找到则返回null
|
||||
* @return LoginStatus 对应的LoginStatus枚举值,如果找不到匹配的状态码则返回null
|
||||
*/
|
||||
public static LoginStatus getByCode(int code){
|
||||
// 遍历所有枚举值查找匹配的状态码
|
||||
for(LoginStatus status:values()){
|
||||
if(status.code==code){
|
||||
return status;
|
||||
@@ -46,21 +55,25 @@ public enum LoginStatus {
|
||||
return null;
|
||||
}
|
||||
|
||||
// getter方法(final属性无需setter)
|
||||
/**
|
||||
* 获取状态码
|
||||
* @return 状态码
|
||||
* 【任务5】
|
||||
* 方法: getCode 获取code值
|
||||
*
|
||||
* @return int code值
|
||||
*/
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取状态消息
|
||||
* @return 状态消息
|
||||
* 任务【6】
|
||||
* 方法: getMsg 获取消息内容
|
||||
*
|
||||
* @return String 返回当前对象的消息字符串
|
||||
*/
|
||||
public String getMsg() {
|
||||
return msg;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
43
src/backend/service/impl/AuthService.java
Normal file
43
src/backend/service/impl/AuthService.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
49
src/backend/utils/impl/CaptchaUtils.java
Normal file
49
src/backend/utils/impl/CaptchaUtils.java
Normal 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);
|
||||
}
|
||||
}
|
||||
89
src/backend/utils/impl/PasswordUtils.java
Normal file
89
src/backend/utils/impl/PasswordUtils.java
Normal 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
199
src/view/LoginFrame.java
Normal 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
7
src/view/MainFrame.java
Normal file
@@ -0,0 +1,7 @@
|
||||
package view;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
public class MainFrame {
|
||||
private JPanel mainPanel;
|
||||
}
|
||||
223
src/view/RegisterFrame.java
Normal file
223
src/view/RegisterFrame.java
Normal 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);
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user