一、需求分析
1.项目简介:
是《原神》游戏中提瓦特世界的世界树为该世界的一个数据库,存储了这个世界的所有信息(不包括外来者“旅行者”),本质上是一个以此为模型的简单的信息管理系统。
- 功能
- 首页
选择登录方式。分为三个等级,“超级管理员-天理”、“普通管理员-七神”、“普通角色-神之眼持有者”。
注册方式,“外来者注册(旅行者-玩家)”。
- 玩家的登录注册方式
- 拥有管理员的用户名与密码可以登录管理员账号,查看比普通角色(神之眼持有者)的角色信息。
- 玩家登录需要输入正确的用户名和密码。级别与“神之眼持有者”同一等级。
- “注册”用户可以输入自己想要的用户名和密码,注册时密码需要输入两次,只有两次密码相同才会且用户名未被注册,才会注册成功。
- 查。
- 用户登录成功后,如果为普通角色,只能查询自己 的信息,如果为管理员可以查看所有普通角色信息,如果为超级管理员可以查看所有管理员信息。
- 可以通过输入用户名或国家来查找指定的某个或某些角色的信息,且支持模糊查询。
- 增。
可以增加比自己等级低的角色,使其被世界树所铭记(例如反主)。
- 删。
可以删除比自己等级低的角色,使其被世界树所遗忘(大慈树王)。
- 改。
可以修改某个角色在世界树所记录的信息(例如散兵)。
二、Er图
三、表关系
四、项目结构
本项目采用MVC三层框架来实现,将业务逻辑封装于控制类(Controller),当用户对用户界面(View)进行互动后,保证实体类(Modle)于用户所看到的信息保持同步与一致。
结构如下图所示:
五、功能逻辑实现
1.登录界面
import com.example.modle.GeneralAdmin;
import com.example.modle.User;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import javax.swing.*;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
public class Login extends Application {
private int width=600,height=430;
private static void main(String args){launch(args);}
@FXML
private TextField userNameT;
@FXML
private TextField passWordT;
@FXML
private Button userLoginB;
@FXML
private Button AdminLoginB;
@FXML
private Button registerB;
@FXML
private Button SuperAdminLogin;
private String userName;
private String password;
private Boolean isUser;
private Boolean isSuper;
private Boolean isLogin;
private Boolean isRegister=false;
public static ArrayList<User> users = new ArrayList<>();
public static ArrayList<GeneralAdmin> admins = new ArrayList<>();
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load((getClass().getResource("Login.fxml")));
primaryStage.setTitle("提瓦特世界树");
primaryStage.setResizable(false);
primaryStage.setScene(new Scene(root,width,height));
primaryStage.show();
}
public void registerB(ActionEvent event) throws IOException {
isRegister=true;
Parent root = FXMLLoader.load(getClass().getResource("Register.fxml"));
userLoginB.getScene().setRoot(root);
}
public void userLoginB(ActionEvent event) throws Exception {
isUser=true;
isSuper=false;
if(checkInformation()){
Parent root = FXMLLoader.load(getClass().getResource("UserTable.fxml"));
userLoginB.getScene().setRoot(root);
}
}
/*
0 核对账号密码信息方法
*/
public Boolean checkInformation() throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
//连接数据库
String url="jdbc:mysql://localhost:3306/yggdrasil_demo?&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC";
String username="root";
String password="n208966737";
//获取connection连接
Connection conn = DriverManager.getConnection(url,username,password);
String sql1 = "select t1.roleIndex,t1.username,t1.password,t1.gender,t1.country,t1.age,t1.goe, t2.thump,t2.eleWf,t2.eleEl from general_role t1\n" +
"join skill t2 on t1.skill_id = t2.id";
String sql2 = "select * from general_admin";
String sql3 = "select * from super_admin";
try {
conn.setAutoCommit(false);
Statement stat1 = conn.createStatement();
Statement stat2 = conn.createStatement();
Statement stat3 = conn.createStatement();
ResultSet rs1;
ResultSet rs2;
ResultSet rs3;
/*
获取输入框的用户名和密码
*/
String userName = userNameT.getText();
String passWord = passWordT.getText();
rs1 = stat1.executeQuery(sql1);//基本角色信息的结果集
rs2 = stat2.executeQuery(sql2);//管理员信息的结果集
rs3 = stat3.executeQuery(sql3);//超级管理员结果集
/*
判定是否登录成功
*/
isLogin=false;
while (rs1.next()) {
if (isUser) {
if (rs1.getString("username").equals(userName) && rs1.getString("password").equals(passWord)) {
User aUser = new User(rs1.getInt("roleIndex"), rs1.getString("username"), rs1.getString("gender"), rs1.getString("age"), rs1.getString("goe"), rs1.getString("country"), rs1.getString("password"), rs1.getString("thump"), rs1.getString("eleWf"), rs1.getString("eleEl"));
Iterator iter = users.iterator();
while (iter.hasNext()) {
iter.next();
iter.remove();
}
users.add(aUser);
isLogin = true;
break;
}
} else if (!isSuper && !isUser) {
while (rs2.next()) {
if (rs2.getString("username").equals(userName) && rs2.getString("password").equals(passWord)) {
isLogin = true;
break;
}
}
} else if (!isUser && isSuper) {
while (rs3.next()) {
if (rs3.getString("username").equals(userName) && rs3.getString("password").equals(passWord)) {
isLogin = true;
}
}
if (isLogin) {
while (rs2.next()) {
GeneralAdmin admin = new GeneralAdmin(rs2.getInt("roleIndex"), rs2.getString("username"), rs2.getString("password"), rs2.getString("gender"), rs2.getString("country"), rs2.getString("age"));
admins.add(admin);
}
}
}
if (isLogin && !isUser && !isSuper) {
User aUser = new User(rs1.getInt("roleIndex"), rs1.getString("username"), rs1.getString("gender"), rs1.getString("age"), rs1.getString("goe"), rs1.getString("country"), rs1.getString("password"), rs1.getString("thump"), rs1.getString("eleWf"), rs1.getString("eleEl"));
users.add(aUser);
}
}
if (!isLogin) {
JOptionPane.showMessageDialog(null, "用户名或密码错误,请重新输入", "登录失败", JOptionPane.ERROR_MESSAGE);
userNameT.setText("");
passWordT.setText("");
if (users.size() > 0) {
Iterator<User> iter = users.iterator();
while (iter.hasNext()) {
iter.next();
iter.remove();
}
} else {
Iterator<GeneralAdmin> iter = admins.iterator();
while (iter.hasNext()) {
iter.next();
iter.remove();
}
}
}
conn.commit();
}catch(Exception e){
conn.rollback();
}
return isLogin;
}
public void AdminLoginB(ActionEvent event) throws Exception {
isUser=false;
isSuper=false;
if (checkInformation()){
Parent root = FXMLLoader.load(getClass().getResource("AdminTable.fxml"));
AdminLoginB.getScene().setRoot(root);
}
}
public void SuperAdminLogin(ActionEvent event) throws Exception {
isUser=false;
isSuper=true;
if(checkInformation()){
Parent root = FXMLLoader.load(getClass().getResource("SuperAdminTable.fxml"));
SuperAdminLogin.getScene().setRoot(root);
}
}
}
二、普通用户登录界面
import com.example.modle.User;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import java.util.Iterator;
public class UserTable {
@FXML
private TableView<User> uTable;
@FXML
private TableColumn<User,Integer> id;
@FXML
private TableColumn<User,String> username;
@FXML
private TableColumn<User,String> gender;
@FXML
private TableColumn<User,String> goe;
@FXML
private TableColumn<User,String> age;
@FXML
private TableColumn<User,String> country;
@FXML
private TableColumn<User,String> thump;
@FXML
private TableColumn<User,String> eleWf;
@FXML
private TableColumn<User,String> eleEl;
@FXML
private Button exit;
private ObservableList<User> userList = FXCollections.observableArrayList();
public void initialize(){
/*
使用ableColumn的setCellValueFactory方法将属性绑定
*/
id.setCellValueFactory(new PropertyValueFactory<>("id"));
username.setCellValueFactory(new PropertyValueFactory<>("username"));
gender.setCellValueFactory(new PropertyValueFactory<>("gender"));
goe.setCellValueFactory(new PropertyValueFactory<>("goe"));
age.setCellValueFactory(new PropertyValueFactory<>("age"));
country.setCellValueFactory(new PropertyValueFactory<>("country"));
thump.setCellValueFactory(new PropertyValueFactory<>("thump"));
eleWf.setCellValueFactory(new PropertyValueFactory<>("eleWf"));
eleEl.setCellValueFactory(new PropertyValueFactory<>("eleEl"));
userList.addAll(Login.users);
uTable.setItems(userList);
}
public void exit(ActionEvent event) throws Exception{
Login.users.remove(0);
Parent root = FXMLLoader.load(getClass().getResource("Login.fxml"));
exit.getScene().setRoot(root);
}
}
三、管理员登录界面
import com.example.modle.User;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.event.ActionEvent;
import java.sql.*;
import java.util.Iterator;
public class AdminTable {
@FXML
public TableView<User> aTable;
@FXML
private TableColumn<User,Integer> id;
@FXML
private TableColumn<User,String> username;
@FXML
private TableColumn<User,String> password;
@FXML
private TableColumn<User,String> gender;
@FXML
private TableColumn<User,String> country;
@FXML
private TableColumn<User,String> age;
@FXML
private TableColumn<User,String> thump;
@FXML
private TableColumn<User,String> eleWf;
@FXML
private TableColumn<User,String> eleEl;
@FXML
private TextField name;
@FXML
private TextField cou;
@FXML
private Button check;
@FXML
private Button add;
@FXML
private Button delete;
@FXML
private Button exit;
@FXML
private Button modify;
private ObservableList<User> adminList = FXCollections.observableArrayList();
private ObservableList<User> selectUsers = FXCollections.observableArrayList();
public static User selectUser;
public void initialize() throws Exception {
getRow();
id.setCellValueFactory(new PropertyValueFactory<>("id"));
username.setCellValueFactory(new PropertyValueFactory<>("username"));
gender.setCellValueFactory(new PropertyValueFactory<>("gender"));
password.setCellValueFactory(new PropertyValueFactory<>("password"));
age.setCellValueFactory(new PropertyValueFactory<>("age"));
country.setCellValueFactory(new PropertyValueFactory<>("country"));
thump.setCellValueFactory(new PropertyValueFactory<>("thump"));
eleWf.setCellValueFactory(new PropertyValueFactory<>("eleWf"));
eleEl.setCellValueFactory(new PropertyValueFactory<>("eleEl"));
adminList.addAll(Login.users);
aTable.setItems(adminList);
}
/*
查询业务逻辑功能
*/
@FXML
public void check(ActionEvent event) throws Exception {
//获取文本框中的内容
String selectName = name.getText();
String selectCountry = cou.getText();
aTable.getItems().clear();
/*
根据姓名和国家查询(包括模糊查询)
*/
//连接数据库
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/yggdrasil_demo?&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root","n208966737");
String sql = "select t1.roleIndex, t1.username, t1.password, t1.gender, t1.country, t1.age, t1.goe, t2.thump, t2.eleWf, t2.eleEl " +
"from general_role t1 " +
"join skill t2 on t1.skill_id = t2.id " +
"where t1.username like ? and t1.country like ?";
PreparedStatement statement = conn.prepareStatement(sql);
statement.setString(1, "%" + selectName + "%");
statement.setString(2, "%" + selectCountry + "%");
ResultSet rs = statement.executeQuery();
while(rs.next()){
User aUser = new User(rs.getInt("roleIndex"), rs.getString("username"), rs.getString("gender"), rs.getString("age"), rs.getString("goe"), rs.getString("country"), rs.getString("password"), rs.getString("thump"), rs.getString("eleWf"), rs.getString("eleEl"));
selectUsers.add(aUser);
}
aTable.setItems(selectUsers);
aTable.refresh();
}
/*
增加功能
*/
public void add(ActionEvent event) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("AddStage.fxml"));
add.getScene().setRoot(root);
}
/*
删除功能
*/
public void delete(ActionEvent event) throws Exception{
// 检查是否已选择行
if (selectUser == null) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle("警告");
alert.setHeaderText(null);
alert.setContentText("请先选择一个角色以删除。");
alert.showAndWait();
return;
}
Login.users.remove(selectUser);
aTable.refresh();
check(event);
//连接数据库
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/yggdrasil_demo?&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root","n208966737");
String sql1 = "delete from general_role where roleIndex = ?";
String sql2 = "delete from skill where id = ?";
try {
conn.setAutoCommit(false);
PreparedStatement stat1 = conn.prepareStatement(sql1);
PreparedStatement stat2 = conn.prepareStatement(sql2);
stat1.setInt(1, selectUser.getId());
stat2.setInt(1, selectUser.getId());
int result1 = stat1.executeUpdate();
int result2 = stat2.executeUpdate();
conn.commit();
}catch(Exception e){
conn.rollback();
}
}
/*
修改
*/
public void modify(ActionEvent event) throws Exception{
// 检查是否已选择行
if (selectUser == null) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle("警告");
alert.setHeaderText(null);
alert.setContentText("请先选择一个角色以修改。");
alert.showAndWait();
return;
}
Parent root = FXMLLoader.load(getClass().getResource("ModifyStage.fxml"));
modify.getScene().setRoot(root);
}
/*
退出
*/
public void exit(ActionEvent event) throws Exception {
//清空表格内容
aTable.getItems().clear();
Iterator<User> iter = Login.users.iterator();
while (iter.hasNext()) {
iter.next();
iter.remove();
}
Parent root = FXMLLoader.load(getClass().getResource("login.fxml"));
exit.getScene().setRoot(root);
}
public void getRow(){
aTable.setRowFactory(a->{
TableRow<User> row = new TableRow<>();
row.setOnMouseClicked(e->{
if(e.getClickCount()==1&&(!row.isEmpty())){
selectUser = row.getItem();
}
});
return row;
});
}
}
(1)模糊查询
public void check(ActionEvent event) throws Exception {
//获取文本框中的内容
String selectName = name.getText();
String selectCountry = cou.getText();
aTable.getItems().clear();
/*
根据姓名和国家查询(包括模糊查询)
*/
//连接数据库
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/yggdrasil_demo?&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root","n208966737");
String sql = "select t1.roleIndex, t1.username, t1.password, t1.gender, t1.country, t1.age, t1.goe, t2.thump, t2.eleWf, t2.eleEl " +
"from general_role t1 " +
"join skill t2 on t1.skill_id = t2.id " +
"where t1.username like ? and t1.country like ?";
PreparedStatement statement = conn.prepareStatement(sql);
statement.setString(1, "%" + selectName + "%");
statement.setString(2, "%" + selectCountry + "%");
ResultSet rs = statement.executeQuery();
while(rs.next()){
User aUser = new User(rs.getInt("roleIndex"), rs.getString("username"), rs.getString("gender"), rs.getString("age"), rs.getString("goe"), rs.getString("country"), rs.getString("password"), rs.getString("thump"), rs.getString("eleWf"), rs.getString("eleEl"));
selectUsers.add(aUser);
}
aTable.setItems(selectUsers);
aTable.refresh();
}
(2)改
public void modify(ActionEvent event) throws Exception{
// 检查是否已选择行
if (selectUser == null) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle("警告");
alert.setHeaderText(null);
alert.setContentText("请先选择一个角色以修改。");
alert.showAndWait();
return;
}
Parent root = FXMLLoader.load(getClass().getResource("ModifyStage.fxml"));
modify.getScene().setRoot(root);
}
package com.example.yggdrasildemo;
import com.example.modle.User;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.TextField;
import javax.swing.*;
import java.io.IOException;
import java.sql.*;
public class ModifyStage {
@FXML
private TextField username;
@FXML
private TextField password;
@FXML
private TextField country;
@FXML
private TextField skillThump;
@FXML
private TextField skillEleWf;
@FXML
private TextField skillEleEl;
@FXML
private ChoiceBox<String> gender;
@FXML
private ChoiceBox<Integer> age;
@FXML
private ChoiceBox<String> goe;
@FXML
private Button commit;
@FXML
private Button exit;
private int id = AdminTable.selectUser.getId();//获取选中行角色的id
public void initialize() throws Exception {
/*
初始化信息
*/
username.setText(AdminTable.selectUser.getUsername());
password.setText(AdminTable.selectUser.getPassword());
country.setText(AdminTable.selectUser.getCountry());
skillEleEl.setText(AdminTable.selectUser.getEleEl());
skillEleWf.setText(AdminTable.selectUser.getEleWf());
skillThump.setText(AdminTable.selectUser.getThump());
gender.setValue(AdminTable.selectUser.getGender());
age.setValue(Integer.valueOf(AdminTable.selectUser.getAge()));
goe.setValue(AdminTable.selectUser.getGoe());
//添加下拉框内容
gender.getItems().add("男");
gender.getItems().add("女");
for(int i = 1 ; i<=1000 ; i++){
age.getItems().add(i);
}
goe.getItems().add("火系");
goe.getItems().add("风系");
goe.getItems().add("草系");
goe.getItems().add("雷系");
goe.getItems().add("水系");
goe.getItems().add("冰系");
goe.getItems().add("岩系");
}
public void commit(ActionEvent event) throws Exception {
/*
对修改后的角色信息进行封装
*/
//修改缓存集合中的数据
for (int i = 0; i < Login.users.size(); i++) {
User user = Login.users.get(i);
if(user.getId()==id){
//重新对user进行封装
user.setUsername(username.getText());
user.setPassword(password.getText());
user.setGender(gender.getValue());
user.setCountry(country.getText());
user.setAge(age.getValue().toString());
user.setGoe(goe.getValue());
user.setThump(skillThump.getText());
user.setEleEl(skillEleWf.getText());
user.setEleWf(skillEleEl.getText());
}
}
//修改数据库数据
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/yggdrasil_demo?&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root","n208966737");
String sql1 = "update general_role set `username` = ?, `password` = ?, `gender` = ?, `country` = ?, `age` = ?, `goe` = ? where `roleIndex` = ?";
String sql2 = "update skill set `thump` = ?, `eleWf` = ?, `eleEl` = ? where `id` = ?";
try {
conn.setAutoCommit(false);
PreparedStatement stat2 = conn.prepareStatement(sql2);
PreparedStatement stat1 = conn.prepareStatement(sql1);
stat1.setString(1, username.getText());
stat1.setString(2, password.getText());
stat1.setString(3, gender.getValue());
stat1.setString(4, country.getText());
stat1.setString(5, age.getValue().toString());
stat1.setString(6, goe.getValue());
stat1.setInt(7, id);
stat2.setString(1, skillThump.getText());
stat2.setString(2, skillEleWf.getText());
stat2.setString(3, skillEleEl.getText());
stat2.setInt(4, id);
int result2 = stat2.executeUpdate();
int result1 = stat1.executeUpdate();
if (result1 >= 0 && result2 >= 0) {
JOptionPane.showMessageDialog(null, "修改成功!", "提示", JOptionPane.OK_OPTION);
Parent root = FXMLLoader.load(getClass().getResource("AdminTable.fxml"));
commit.getScene().setRoot(root);
}
conn.commit();
}catch(Exception e){
conn.rollback();
}
}
public void exit(ActionEvent event) throws IOException {
Parent root = FXMLLoader.load(getClass().getResource("AdminTable.fxml"));
exit.getScene().setRoot(root);
}
}
(3)增
public void add(ActionEvent event) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("AddStage.fxml"));
add.getScene().setRoot(root);
}
package com.example.yggdrasildemo;
import com.example.modle.User;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.TextField;
import javax.swing.*;
import java.sql.*;
public class AddStage {
@FXML
private TextField username;
@FXML
private TextField password;
@FXML
private TextField country;
@FXML
private TextField skillThump;
@FXML
private TextField skillEleWf;
@FXML
private TextField skillEleEl;
@FXML
private ChoiceBox<String> gender;
@FXML
private ChoiceBox<Integer> age;
@FXML
private ChoiceBox<String> goe;
@FXML
private Button commit;
@FXML
private Button exit;
public void initialize() throws Exception {
//添加下拉框内容
gender.getItems().add("男");
gender.getItems().add("女");
for(int i = 1 ; i<=1000 ; i++){
age.getItems().add(i);
}
goe.getItems().add("火系");
goe.getItems().add("风系");
goe.getItems().add("草系");
goe.getItems().add("雷系");
goe.getItems().add("水系");
goe.getItems().add("冰系");
goe.getItems().add("岩系");
age.setValue(0);
}
public void commit(ActionEvent event) throws Exception{
if(password.getText().equals("")||username.getText().equals("")){
JOptionPane.showMessageDialog(null,"用户名或密码不能为空","错误",JOptionPane.ERROR_MESSAGE);
return;
}
/*
获取文本域添加的信息
*/
int addId = Login.users.size()+1;
String addUsername = username.getText();
String addPassword = password.getText();
String addCountry = country.getText();
String addSkillThump = skillThump.getText();
String addSkillEleWf = skillEleWf.getText();
String addSkillEleEl = skillEleEl.getText();
String addGender = gender.getValue();
String addGoe = goe.getValue();
Integer addAge = age.getValue();
for (int i = 0; i < Login.users.size(); i++) {
User aUser = Login.users.get(i);
if(addUsername.equals(aUser.getUsername())){
JOptionPane.showMessageDialog(null,"该用户名已存在!","错误",JOptionPane.ERROR_MESSAGE);
return;
}
}
//将添加的信息封装到User
//bug:age为null
// String ageS = addAge.toString();
User user = new User(addId,addUsername,addGender,addAge.toString().equals("")?"0":addAge.toString(),addGoe,addCountry,addPassword,addSkillThump,addSkillEleWf,addSkillEleEl);
Login.users.add(user);
/*
bug:tableview传参时出现nullpoint异常。
解决方案:在该类中修改临时存储信息的list,在admintable中实时刷新!
*/
//获取数据库链接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/yggdrasil_demo?&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root","n208966737");
String sql1 = "insert into general_role (roleIndex,username,password,gender,country,age,goe,skill_id) values (?,?,?,?,?,?,?,?)";
String sql2 = "insert into skill (id,thump,eleWf,eleEl) values (?,?,?,?)";
//开启事务
try {
conn.setAutoCommit(false);
PreparedStatement stat2 = conn.prepareStatement(sql2);
PreparedStatement stat1 = conn.prepareStatement(sql1);
stat1.setInt(1, addId);
stat1.setString(2, addUsername);
stat1.setString(3, addPassword);
stat1.setString(4, addGender);
stat1.setString(5, addCountry);
stat1.setInt(6, addAge);
stat1.setString(7, addGoe);
stat1.setInt(8, addId);
stat2.setInt(1, addId);
stat2.setString(2, addSkillThump);
stat2.setString(3, addSkillEleWf);
stat2.setString(4, addSkillEleEl);
int result2 = stat2.executeUpdate();
int result1 = stat1.executeUpdate();
if ((result1 > 0 && result2 > 0)) {
JOptionPane.showMessageDialog(null, "添加成功!", "提示", JOptionPane.OK_OPTION);
Parent root = FXMLLoader.load(getClass().getResource("AdminTable.fxml"));
commit.getScene().setRoot(root);
}
conn.commit();
}catch (Exception e){
conn.rollback();
}
// conn.close();
// stat1.close();
// stat2.close();
}
/*
退出
*/
public void exit(ActionEvent event) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("AdminTable.fxml"));
exit.getScene().setRoot(root);
}
}
(4)删
public void delete(ActionEvent event) throws Exception{
// 检查是否已选择行
if (selectUser == null) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle("警告");
alert.setHeaderText(null);
alert.setContentText("请先选择一个角色以删除。");
alert.showAndWait();
return;
}
Login.users.remove(selectUser);
aTable.refresh();
check(event);
//连接数据库
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/yggdrasil_demo?&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root","n208966737");
String sql1 = "delete from general_role where roleIndex = ?";
String sql2 = "delete from skill where id = ?";
try {
conn.setAutoCommit(false);
PreparedStatement stat1 = conn.prepareStatement(sql1);
PreparedStatement stat2 = conn.prepareStatement(sql2);
stat1.setInt(1, selectUser.getId());
stat2.setInt(1, selectUser.getId());
int result1 = stat1.executeUpdate();
int result2 = stat2.executeUpdate();
conn.commit();
}catch(Exception e){
conn.rollback();
}
}
四、超级管理员登录界面
package com.example.yggdrasildemo;
import com.example.modle.GeneralAdmin;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Iterator;
public class SuperAdminTable {
@FXML
public TableView<GeneralAdmin> aTable;
@FXML
private TableColumn<GeneralAdmin,Integer> id;
@FXML
private TableColumn<GeneralAdmin,String> username;
@FXML
private TableColumn<GeneralAdmin,String> password;
@FXML
private TableColumn<GeneralAdmin,String> gender;
@FXML
private TableColumn<GeneralAdmin,String> country;
@FXML
private TableColumn<GeneralAdmin,String> age;
@FXML
private TextField name;
@FXML
private TextField cou;
@FXML
private Button check;
@FXML
private Button add;
@FXML
private Button delete;
@FXML
private Button exit;
@FXML
private Button modify;
private ObservableList<GeneralAdmin> adminList = FXCollections.observableArrayList();
private ObservableList<GeneralAdmin> selectAdmins = FXCollections.observableArrayList();
public static GeneralAdmin admins;
public static GeneralAdmin selectAdmin;
public void initialize(){
getRow();
id.setCellValueFactory(new PropertyValueFactory<>("id"));
username.setCellValueFactory(new PropertyValueFactory<>("username"));
gender.setCellValueFactory(new PropertyValueFactory<>("gender"));
password.setCellValueFactory(new PropertyValueFactory<>("password"));
age.setCellValueFactory(new PropertyValueFactory<>("age"));
country.setCellValueFactory(new PropertyValueFactory<>("country"));
adminList.addAll(Login.admins);
aTable.setItems(adminList);
}
/*
修改
*/
public void modify(ActionEvent event) throws Exception{
// 检查是否已选择行
if (selectAdmin == null) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle("警告");
alert.setHeaderText(null);
alert.setContentText("请先选择一个角色以修改。");
alert.showAndWait();
return;
}
Parent root = FXMLLoader.load(getClass().getResource("ModifyAdminStage.fxml"));
modify.getScene().setRoot(root);
}
/*
退出
*/
public void exit(ActionEvent event) throws Exception {
//清空表格内容
aTable.getItems().clear();
Iterator<GeneralAdmin> iter = Login.admins.iterator();
while (iter.hasNext()) {
iter.next();
iter.remove();
}
Parent root = FXMLLoader.load(getClass().getResource("login.fxml"));
exit.getScene().setRoot(root);
}
public void getRow(){
aTable.setRowFactory(a->{
TableRow<GeneralAdmin> row = new TableRow<>();
row.setOnMouseClicked(e->{
if(e.getClickCount()==1&&(!row.isEmpty())){
selectAdmin = row.getItem();
}
});
return row;
});
}
public void add(ActionEvent event) throws IOException {
Parent root = FXMLLoader.load(getClass().getResource("AddAdminStage.fxml"));
add.getScene().setRoot(root);
}
public void check(ActionEvent event) {
//获取文本框中的内容
String selectName = name.getText();
String selectCountry = cou.getText();
aTable.getItems().clear();
/*
根据姓名和国家查询(包括模糊查询)
*/
for (int i = 0; i < Login.admins.size(); i++) {
GeneralAdmin admin = Login.admins.get(i);
if (admin.getUsername().contains(selectName)&&admin.getCountry().contains(selectCountry)) {
selectAdmins.add(admin);
}
}
aTable.setItems(selectAdmins);
aTable.refresh();
}
/*
删除功能
*/
public void delete(ActionEvent event) throws Exception{
// 检查是否已选择行
if (selectAdmin == null) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle("警告");
alert.setHeaderText(null);
alert.setContentText("请先选择一个角色以删除。");
alert.showAndWait();
return;
}
Login.admins.remove(selectAdmin);
aTable.refresh();
check(event);
//连接数据库
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/yggdrasil_demo?&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root","n208966737");
String sql = "delete from general_admin where roleIndex = ?";
PreparedStatement stat = conn.prepareStatement(sql);
stat.setInt(1,selectAdmin.getId());
int result = stat.executeUpdate();
}
}
五、注册界面
package com.example.yggdrasildemo;
import com.example.modle.User;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.TextField;
import javax.swing.*;
import java.sql.*;
public class Register {
@FXML
private TextField username;
@FXML
private TextField password1;
@FXML
private TextField password2;
@FXML
private TextField country;
@FXML
private TextField skillThump;
@FXML
private TextField skillEleWf;
@FXML
private TextField skillEleEl;
@FXML
private ChoiceBox<String> gender;
@FXML
private ChoiceBox<Integer> age;
@FXML
private ChoiceBox<String> goe;
@FXML
private Button commit;
@FXML
private Button exit;
public void initialize() throws Exception{
//添加下拉框内容
gender.getItems().add("男");
gender.getItems().add("女");
for(int i = 1 ; i<=1000 ; i++){
age.getItems().add(i);
}
goe.getItems().add("火系");
goe.getItems().add("风系");
goe.getItems().add("草系");
goe.getItems().add("雷系");
goe.getItems().add("水系");
goe.getItems().add("冰系");
goe.getItems().add("岩系");
}
public void commit(ActionEvent event) throws Exception{
/*
获取文本框信息
*/
String name = username.getText();
String psd1 = password1.getText();
String psd2 = password2.getText();
if(name.equals("")||psd1.equals("")||psd2.equals("")||country.equals("")||skillThump.equals("")||skillEleEl.equals("")||skillEleWf.equals("")){
JOptionPane.showMessageDialog(null,"注册内容不能为空","错误",JOptionPane.ERROR_MESSAGE);
return;
}
if(!psd1.equals(psd2)){
JOptionPane.showMessageDialog(null,"两次输入的密码不一致","错误",JOptionPane.ERROR_MESSAGE);
password1.setText("");
password2.setText("");
}else{
/*
封装注册的用户信息
*/
//将注册的用户信息添加到数据库
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/yggdrasil_demo?&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root","n208966737");
String sql1 = "insert into general_role (roleIndex,username,password,gender,country,age,goe,skill_id) values (?,?,?,?,?,?,?,?)";
String sql2 = "insert into skill (id,thump,eleWf,eleEl) values (?,?,?,?)";
String sql3 = "select * from general_role";
String sql4 = "select t1.roleIndex,t1.username,t1.password,t1.gender,t1.country,t1.age,t1.goe, t2.thump,t2.eleWf,t2.eleEl from general_role t1\n" +
"join skill t2 on t1.skill_id = t2.id";
Statement stat = conn.createStatement();
ResultSet res = stat.executeQuery(sql4);
while(res.next()){
if(name.equals(res.getString("username"))){
JOptionPane.showMessageDialog(null,"该用户名已存在!","错误",JOptionPane.ERROR_MESSAGE);
return;
}
}
try {
conn.setAutoCommit(false);
PreparedStatement stat2 = conn.prepareStatement(sql2);
PreparedStatement stat1 = conn.prepareStatement(sql1);
PreparedStatement stat3 = conn.prepareStatement(sql3);
ResultSet rs = stat3.executeQuery();
int id = 1;
while (rs.next()) {
++id;
}
stat1.setInt(1, id);
stat1.setString(2, username.getText());
stat1.setString(3, password1.getText());
stat1.setString(4, gender.getValue());
stat1.setString(5, country.getText());
stat1.setInt(6, age.getValue());
stat1.setString(7, goe.getValue());
stat1.setInt(8, id);
stat2.setInt(1, id);
stat2.setString(2, skillThump.getText());
stat2.setString(3, skillEleWf.getText());
stat2.setString(4, skillEleEl.getText());
int result2 = stat2.executeUpdate();
int result1 = stat1.executeUpdate();
if (result1 > 0 && result2 > 0) {
JOptionPane.showMessageDialog(null, "注册成功!", "提示", JOptionPane.OK_OPTION);
Parent root = FXMLLoader.load(getClass().getResource("Login.fxml"));
commit.getScene().setRoot(root);
}
conn.commit();
}catch(Exception e){
conn.rollback();
}
}
}
public void exit(ActionEvent event) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("Login.fxml"));
exit.getScene().setRoot(root);
}
}
六、项目总结
整体上来说,根据写得需求,自己一步一步实现的功能,写完还是很有成就感的,但是在页面美观设计真的是堪忧。除此之外,在写的时候,没有将执行的SQL语句封装起来,导致每次对数据库进行操作,都不得不去再获取数据库的连接对象,可以说是一个缺点。
对于MySQL学习内容的使用,主要用到了联合、内连接查询、模糊查询以及一些简单的sql语句对表进行操作。还缺少对复杂的表关系查询的实际应用。