完成了登录注册
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
package backend.controller.interfaces;
|
package backend.controller.interfaces;
|
||||||
import backend.service.interfaces.AuthService;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 登录控制器接口,用于处理用户登录和注册相关的业务逻辑
|
* 登录控制器接口,用于处理用户登录和注册相关的业务逻辑
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查找所有用户
|
* 查找所有用户
|
||||||
|
|||||||
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;
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
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