第十一次实验课代码
添加C08~C011
This commit is contained in:
11
C11-Swing/C11-Swing.iml
Normal file
11
C11-Swing/C11-Swing.iml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
7
C11-Swing/src/Main.java
Normal file
7
C11-Swing/src/Main.java
Normal file
@@ -0,0 +1,7 @@
|
||||
import view.LoginFrame;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
new LoginFrame();
|
||||
}
|
||||
}
|
||||
74
C11-Swing/src/common/LoginStatus.java
Normal file
74
C11-Swing/src/common/LoginStatus.java
Normal file
@@ -0,0 +1,74 @@
|
||||
package common;
|
||||
|
||||
/**
|
||||
* 登录状态枚举类
|
||||
* 用final保证状态信息不可变,用static提供工具方法
|
||||
*/
|
||||
public enum LoginStatus {
|
||||
// 【任务3】枚举实例:状态码和描述
|
||||
// 成功登录
|
||||
SUCCESS(200,"登录成功"),
|
||||
// 密码错误
|
||||
PASSWORD_ERROR(901,"密码错误"),
|
||||
// 验证码错误
|
||||
CAPTCHA_ERROR(902,"验证码错误"),
|
||||
// 用户不存在
|
||||
USER_NOT_FOUND(903,"用户不存在");
|
||||
|
||||
|
||||
|
||||
// 【任务1】定义 final修饰的属性:确保状态信息不可修改
|
||||
private final int code;
|
||||
private final String msg;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 【任务2】
|
||||
* 构造函数,用于创建LoginStatus实例
|
||||
* @param code 状态码
|
||||
* @param msg 状态消息
|
||||
*/
|
||||
LoginStatus(int code, String msg) {
|
||||
this.code = code;
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
// 静态方法:根据状态码获取枚举实例(static工具方法)
|
||||
/**
|
||||
* 【任务4】
|
||||
* 静态方法: getByCode 根据状态码获取对应的登录状态枚举值
|
||||
* @param code 状态码
|
||||
* @return LoginStatus 对应的LoginStatus枚举值,如果找不到匹配的状态码则返回null
|
||||
*/
|
||||
public static LoginStatus getByCode(int code){
|
||||
for(LoginStatus status:values()){
|
||||
if(status.code==code){
|
||||
return status;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// getter方法(final属性无需setter)
|
||||
/**
|
||||
* 【任务5】
|
||||
* 方法: getCode 获取code值
|
||||
*
|
||||
* @return int code值
|
||||
*/
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
/**
|
||||
* 任务【6】
|
||||
* 方法: getMsg 获取消息内容
|
||||
*
|
||||
* @return String 返回当前对象的消息字符串
|
||||
*/
|
||||
public String getMsg() {
|
||||
return msg;
|
||||
}
|
||||
}
|
||||
|
||||
22
C11-Swing/src/po/AccountPo.java
Normal file
22
C11-Swing/src/po/AccountPo.java
Normal file
@@ -0,0 +1,22 @@
|
||||
package po;
|
||||
|
||||
public class AccountPo {
|
||||
private String username;
|
||||
private String password;
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public void setUsername(String username) {
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
}
|
||||
27
C11-Swing/src/service/AuthService.java
Normal file
27
C11-Swing/src/service/AuthService.java
Normal file
@@ -0,0 +1,27 @@
|
||||
package service;
|
||||
|
||||
import common.LoginStatus;
|
||||
import po.AccountPo;
|
||||
|
||||
public class AuthService {
|
||||
private static AccountPo dbAccount = new AccountPo();
|
||||
|
||||
static {
|
||||
dbAccount.setUsername("admin");
|
||||
dbAccount.setPassword("123456");
|
||||
}
|
||||
|
||||
public LoginStatus login(AccountPo account) {
|
||||
//1.获取用户输入的账号在数据库中查询该账号信息
|
||||
//2.账号不存在
|
||||
//3.账号存在 比较密码是否一致
|
||||
if (dbAccount.getUsername().equals(account.getUsername()) &&
|
||||
dbAccount.getPassword().equals(account.getPassword()))
|
||||
return LoginStatus.SUCCESS;
|
||||
else if (!dbAccount.getUsername().equals(account.getUsername())) {
|
||||
return LoginStatus.USER_NOT_FOUND;
|
||||
}
|
||||
return LoginStatus.PASSWORD_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
54
C11-Swing/src/utils/CaptchaUtils.java
Normal file
54
C11-Swing/src/utils/CaptchaUtils.java
Normal file
@@ -0,0 +1,54 @@
|
||||
package utils;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* 验证码工具类
|
||||
*/
|
||||
public class CaptchaUtils { // final修饰类:不能被继承
|
||||
// 【任务1】静态常量:字符集(全局固定)
|
||||
static final String CHAR_SET="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||
|
||||
// 【任务2】静态常量:验证码长度(全局固定)
|
||||
static final int CAPTCHA_LENGTH=4;
|
||||
|
||||
// 【任务3】私有构造方法:禁止创建实例(工具类无需实例化)
|
||||
private CaptchaUtils(){
|
||||
}
|
||||
|
||||
/**
|
||||
* 【任务4】
|
||||
* 静态方法:generateCaptcha 生成随机验证码
|
||||
* @return String 返回生成的随机验证码字符串
|
||||
*/
|
||||
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();
|
||||
}
|
||||
/**
|
||||
* 【任务5】
|
||||
* 静态方法:verifyCaptcha 验证验证码
|
||||
* @param inputCaptcha 用户输入的验证码
|
||||
* @param systemCaptcha 系统生成的验证码
|
||||
* @return boolean 验证结果,true表示验证通过,false表示验证失败
|
||||
*/
|
||||
public static boolean verifyCaptcha(String inputCaptcha,String systemCaptcha){
|
||||
return inputCaptcha.equalsIgnoreCase(systemCaptcha);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
for(int i=0;i<10;i++)
|
||||
System.out.println(generateCaptcha());
|
||||
|
||||
System.out.println(CaptchaUtils.verifyCaptcha(generateCaptcha(), generateCaptcha()));
|
||||
}
|
||||
|
||||
}
|
||||
192
C11-Swing/src/view/LoginFrame.java
Normal file
192
C11-Swing/src/view/LoginFrame.java
Normal file
@@ -0,0 +1,192 @@
|
||||
package view;
|
||||
|
||||
import common.LoginStatus;
|
||||
import utils.CaptchaUtils;
|
||||
import service.AuthService;
|
||||
import po.AccountPo;
|
||||
|
||||
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;
|
||||
}
|
||||
AccountPo account = new AccountPo();
|
||||
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 -> {
|
||||
//点击注册按钮后的事件
|
||||
return;
|
||||
});
|
||||
}
|
||||
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;
|
||||
}
|
||||
/**
|
||||
* 初始化账户信息面板
|
||||
* @return 包含用户名输入框的面板组件
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化密码输入面板
|
||||
* @return 包含密码标签和输入框的JPanel面板
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 初始化验证码面板
|
||||
*
|
||||
* @return 包含验证码相关组件的JPanel面板
|
||||
*/
|
||||
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 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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
7
C11-Swing/src/view/MainFrame.java
Normal file
7
C11-Swing/src/view/MainFrame.java
Normal file
@@ -0,0 +1,7 @@
|
||||
package view;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
public class MainFrame {
|
||||
JFrame frame = new JFrame();
|
||||
}
|
||||
Reference in New Issue
Block a user