本文仅实现登录功能
一、项目构建
1.项目结构
2.创建工程
在IDEA中点击文件->新建->项目->选择maven工程并输入项目名称
二、项目代码
1.pom.xml文件内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.build.locales>zh_CN</project.build.locales>
<java.version>1.8</java.version>
<project.build.jdk>${java.version}</project.build.jdk>
<spring.boot.version>2.1.1.RELEASE</spring.boot.version>
<springboot-javafx-support.version>2.1.6</springboot-javafx-support.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring.boot.version}</version>
<exclusions>
<!-- 过滤默认logback配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<!-- javafx核心包 -->
<dependency>
<groupId>de.roskenet</groupId>
<artifactId>springboot-javafx-support</artifactId>
<version>${springboot-javafx-support.version}</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- spring-boot整合mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
</project>
2.application.properties内容
spring.datasource.driverClassName=com.mysql.jdbc.Driver
若新版的jdbc需要变更为com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/你的数据库名称?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=你的数据库账号
spring.datasource.password=你的数据库密码
3.Main.java内容
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Rectangle2D;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Screen;
import javafx.stage.Stage;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import java.io.IOException;
@SpringBootApplication
@MapperScan("mapper") //在这里输入你的mapper路径,或者在每个mapper前面加上“@mapper”注解
public class Main extends Application {
public static void main(String[] args) {
launch(Main.class, args);
}
@Override
public void start(Stage primaryStage) throws IOException {
Parent root = FXMLLoader.load(getClass().getResource("/fxml/Login.fxml"));
//获取屏幕当前分辨率
Rectangle2D screenRectangle = Screen.getPrimary().getBounds();
double width = screenRectangle.getWidth();
double height = screenRectangle.getHeight();
// 创建一个场景,并将栈面板设置为场景的内容
Scene scene = new Scene(root, (9.0/25)*width, (9.0/25)*height);
// 将场景设置为舞台的内容,并显示舞台
primaryStage.setX((width-(9.0/25)*width)/2);
primaryStage.setY((height-(16.0/25)*height)/2);
primaryStage.setResizable(false);
primaryStage.setTitle("鬼知道的什么管理系统");
primaryStage.setScene(scene);
primaryStage.show();
}
public static ApplicationContext getContext() {
return SpringApplication.run(Main.class);
}
}
4.Login.fxml内容(此文件需要在项目目录中创建一个Resource文件夹并将其设置为资源根目录)
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.control.PasswordField?>
<VBox alignment="CENTER" prefHeight="400.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.UserController">
<children>
<Label prefHeight="56.0" prefWidth="370.0" text="DFSAFDSAFDFSA">
<font>
<Font size="44.0" />
</font>
</Label>
<TextField fx:id="Username" maxHeight="-Infinity" maxWidth="-Infinity" promptText="在这里输入账号">
<font>
<Font size="15.0" />
</font>
<VBox.margin>
<Insets top="12.0" />
</VBox.margin>
</TextField>
<PasswordField fx:id="Password" maxHeight="-Infinity" maxWidth="-Infinity" promptText="在这里输入密码">
<font>
<Font size="15.0" />
</font>
<VBox.margin>
<Insets top="12.0" />
</VBox.margin>
</PasswordField>
<Button mnemonicParsing="false" prefHeight="31.0" prefWidth="201.0" text="登录" fx:id="LoginButton" onAction="#LoginButtonOnClick">
<VBox.margin>
<Insets top="12.0" />
</VBox.margin>
</Button>
<Button mnemonicParsing="false" prefHeight="33.0" prefWidth="201.0" text="注册" fx:id="RegisterButton">
<VBox.margin>
<Insets top="12.0" />
</VBox.margin>
</Button>
</children>
</VBox>
5.UserController.java代码
import de.felixroske.jfxsupport.FXMLController;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;
import mapper.UserMapper;
import org.example.Main;
import org.springframework.context.ApplicationContext;
import pojo.User;
import java.net.URL;
import java.util.ResourceBundle;
@FXMLController
public class UserController implements Initializable {
private UserMapper userMapper;
@FXML
private TextField Username;
@FXML
private PasswordField Password;
@Override
public void initialize(URL location, ResourceBundle resources) {
ApplicationContext context = Main.getContext();
userMapper = context.getBean(UserMapper.class);
System.out.println(context);
}
@FXML
public void LoginButtonOnClick(){
String UsernameValue = Username.getText().trim();
String PasswordValue = Password.getText().trim();
System.out.println("u+"+UsernameValue+"p+"+PasswordValue);
User tmp = new User();
tmp.setUsername(UsernameValue);
tmp.setPassword(PasswordValue);
try {
User user1 =userMapper.login(tmp);
System.out.println(user1.toString());
viewDialog(1);
}catch(Exception e){
e.printStackTrace();
viewDialog(2);
}
System.out.println(tmp.toString());
}
public void viewDialog(Integer x){
DialogPane dialog = new DialogPane();
if(x==1){
dialog.setContentText("登录成功~~");
}else if(x==2){
dialog.setContentText("登录失败~~");
}
dialog.getButtonTypes().add(ButtonType.OK);
Button ok = (Button)dialog.lookupButton(ButtonType.OK);
Stage dialogStage = new Stage();
Scene dialogScene = new Scene(dialog);
dialogStage.setScene(dialogScene);
dialogStage.setTitle("提示");
ok.setOnAction(event -> {
dialogStage.close();
});
dialogStage.setAlwaysOnTop(true);
dialogStage.setResizable(false);
dialogStage.show();
}
}
由于@FXMLController控制器无法由spring管理,所以直接在控制器中使用@Autowire注解会导致空指针错误,所以在Main.java中主类继承了Application并编写了一个静态方法getContext获取上下文,再通过getBean()获取指定的bean
6.User.java内容
import java.io.Serializable;
public class User implements Serializable {
private Integer id; //用户id
private String username; //用户名称
private String password; //用户密码
private String role; //用户角色
private String status; //用户状态
private String hiredate; //入职时间
private String departuredate;//离职时间
private Integer counts;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
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;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getHiredate() {
return hiredate;
}
public void setHiredate(String hiredate) {
this.hiredate = hiredate;
}
public String getDeparturedate() {
return departuredate;
}
public void setDeparturedate(String departuredate) {
this.departuredate = departuredate;
}
public Integer getCounts() {
return counts;
}
public void setCounts(Integer counts) {
this.counts = counts;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", role='" + role + '\'' +
", status='" + status + '\'' +
", hiredate='" + hiredate + '\'' +
", departuredate='" + departuredate + '\'' +
", counts=" + counts +
'}';
}
}
7.UserMapper内容
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import pojo.User;
public interface UserMapper {
@Select("select * from user where user_name=#{username} AND user_password=#{password}")
@Results(id = "userMap",value = {
@Result(id = true,column = "user_id",property = "id"),
@Result(column = "user_name",property = "username"),
@Result(column = "user_password",property = "password"),
@Result(column = "user_hiredate",property = "hiredate"),
@Result(column = "user_role",property = "role"),
@Result(column = "user_status",property = "status"),
@Result(column = "user_departuredate",property = "departuredate")
})
//用户登录
User login(User user);
}
注:在web项目当中使用ssm框架时在控制层@Controller当中使用@Autowire并不会出现空指针错误
三、运行截图
四、数据库sql文件内容
# Host: localhost (Version 5.1.55-community)
# Date: 2024-07-23 17:19:13
# Generator: MySQL-Front 6.0 (Build 1.57)
#
# Structure for table "user"
#
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`user_id` int(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`user_name` varchar(32) DEFAULT NULL COMMENT '用户名称',
`user_password` varchar(32) DEFAULT NULL COMMENT '用户密码',
`user_hiredate` varchar(32) DEFAULT NULL COMMENT '用户入职时间',
`user_role` varchar(32) DEFAULT NULL COMMENT '用户角色',
`user_departuredate` varchar(32) DEFAULT NULL COMMENT '用户离职时间',
`user_status` varchar(1) DEFAULT NULL COMMENT '用户状态(0:正常,1:禁用)',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=352 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
#
# Data for table "user"
#
INSERT INTO `user` VALUES (2,'张三','12345','2021-01-07','student',NULL,'0'),(3,'老六','qwerty','2023-06-18','student',NULL,'0'),(343,'牢大','12345','2024-05-22','student',NULL,'0'),(345,'静风','12345','2024-07-21','manager',NULL,'0'),(346,'用户1','12345','2024-07-12','student',NULL,'0'),(347,'凤溪','12345','2024-07-13','manager',NULL,'0'),(348,'月见','12345','2024-07-05','manager',NULL,'0'),(349,'用户2','12345','2024-07-06','manager',NULL,'0'),(350,'八九','12345','2024-07-06','teacher',NULL,'1'),(351,'admin','23456','2024-07-19','manager',NULL,'0');