JavaFx+MySQL实现世界树信息管理系统

一、需求分析

1.项目简介:

是《原神》游戏中提瓦特世界的世界树为该世界的一个数据库,存储了这个世界的所有信息(不包括外来者“旅行者”),本质上是一个以此为模型的简单的信息管理系统。

  1. 功能
  2. 首页

选择登录方式。分为三个等级,“超级管理员-天理”、“普通管理员-七神”、“普通角色-神之眼持有者”。

注册方式,“外来者注册(旅行者-玩家)”。

  1. 玩家的登录注册方式
    • 拥有管理员的用户名与密码可以登录管理员账号,查看比普通角色(神之眼持有者)的角色信息。
    • 玩家登录需要输入正确的用户名和密码。级别与“神之眼持有者”同一等级。
    • “注册”用户可以输入自己想要的用户名和密码,注册时密码需要输入两次,只有两次密码相同才会且用户名未被注册,才会注册成功。
  2. 查。
    • 用户登录成功后,如果为普通角色,只能查询自己 的信息,如果为管理员可以查看所有普通角色信息,如果为超级管理员可以查看所有管理员信息。
    • 可以通过输入用户名或国家来查找指定的某个或某些角色的信息,且支持模糊查询。
  3. 增。

可以增加比自己等级低的角色,使其被世界树所铭记(例如反主)。

  1. 删。

可以删除比自己等级低的角色,使其被世界树所遗忘(大慈树王)。

  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语句对表进行操作。还缺少对复杂的表关系查询的实际应用。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值