Javaの戦闘家政婦の課金システム(4) - ユーザー登録とログイン機能を達成するために

最初は、共通のJavaFXプロジェクトを作成するためにIDEAを使用して、次の図にフォルダを作成します。

使用するサードパーティ製パッケージの導入に続いて、パッケージのjarパッケージファイルフォルダを使用する必要性、導入が可能。

データベーステーブルを作成するための導入に成功したが、すでに第二の記事で覆われており、SQLパッケージファイルフォルダはSQL文の中に存在した後にデータベーステーブルを作成するために、直接実行することができます。

 

ステップ1:図に示すように、データベースによれば、エンティティクラスのテーブル構造を作成します。

ツールDateTools.javaとSimpleTools.javaツールパッケージを下げるために使用される同じ時間で2つの項目があります。

これらのファイルは、ソースコードであり、これは記載しておりません。

 

ステップ2:ビューのlogupFrame.fxmlとシーンビルダーによって設計されたビューパッケージにというファイルを作成します。

(FXMLファイルについて、各コントロールのプロパティ設定とイベントはありません、ここでそれらを、シーンBuilderを使用して表示することができます)。

<?xml version="1.0" encoding="UTF-8"?>
​
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.*?>
<HBox alignment="CENTER" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8"
      xmlns:fx="http://javafx.com/fxml/1" fx:controller="AccountSystem.controller.LogupFrameController">
    <children>
        <VBox alignment="CENTER" prefHeight="371.0" prefWidth="327.0" spacing="20.0">
            <children>
                <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
                    <children>
                        <ImageView fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true">
                            <image>
                                <Image url="@../images/welcome.png"/>
                            </image>
                        </ImageView>
                    </children>
                </HBox>
                <HBox alignment="CENTER" prefHeight="12.0" prefWidth="327.0" spacing="15.0">
                    <children>
                        <Label fx:id="nameLabel" contentDisplay="CENTER" styleClass="class_label" text="昵称:"
                               textAlignment="CENTER" textOverrun="CENTER_WORD_ELLIPSIS"/>
                        <TextField fx:id="nameTextField" promptText="请填入您的昵称:" styleClass="class_textField"/>
                    </children>
                </HBox>
                <HBox alignment="CENTER" prefHeight="0.0" prefWidth="327.0" spacing="15.0">
                    <children>
                        <Label fx:id="passwordLabel" contentDisplay="CENTER" styleClass="class_label" text="密码:"
                               textAlignment="CENTER" textOverrun="CENTER_WORD_ELLIPSIS"/>
                        <PasswordField fx:id="passwordTextField" promptText="请填入您的密码:" styleClass="class_textField"/>
                    </children>
                </HBox>
                <HBox alignment="CENTER" prefHeight="21.0" prefWidth="327.0" spacing="25.0">
                    <children>
                        <Button fx:id="loginButton" mnemonicParsing="false" onAction="#loginButtonEvent"
                                styleClass="class_button" text="注册"/>
                        <Button fx:id="logupButton" mnemonicParsing="false" onAction="#logupButtonEvent"
                                styleClass="class_button" text="登录"/>
                    </children>
                </HBox>
            </children>
            <opaqueInsets>
                <Insets/>
            </opaqueInsets>
            <HBox.margin>
                <Insets/>
            </HBox.margin>
        </VBox>
    </children>
</HBox>

してクラスにインターフェースするシーンビルダーに対応するコピー制御属性から対応するログインインタフェースコントローラFXMLコントローラクラスファイル内にあるLogupFrameController.javaパッケージを作成することによって、続きます。

package AccountSystem.controller;
​
import AccountSystem.bean.Session;
import AccountSystem.bean.User;
import AccountSystem.dao.UserDao;
import AccountSystem.tools.SimpleTools;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
​
/**
 * 登录控制器
 *
 * @author lck100
 */
public class LogupFrameController {
​
    @FXML
    private PasswordField passwordTextField;
​
    @FXML
    private TextField nameTextField;
​
    /**
     * “注册”按钮事件监听器
     */
    @FXML
    void loginButtonEvent() {
       
    }
​
    /**
     * “登录”按钮事件监听器
     */
    @FXML
    void logupButtonEvent() {
        
    }
​
}

MainAppには、次のように読み取るクラス、すなわち内のコードに続いて、プログラムを開始します。

package AccountSystem;
​
import AccountSystem.controller.LogupFrameController;
import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
​
import java.io.IOException;
​
public class MainApp extends Application {
​
    @FXML
    private Stage primaryStage;
​
    @FXML
    private HBox rootLayout;
​
    @Override
    public void start(Stage primaryStage) {
        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("管家婆系统");
        initLogupFrame();
    }
​
    /**
     * 操作结果:登录界面
     */
    private Scene initLogupFrame() {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("view/logupFrame.fxml"));
            rootLayout = (HBox) loader.load();
​
            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);
            primaryStage.setResizable(false);
​
            LogupFrameController controller = loader.getController();
            controller.setLogupStage(primaryStage);
​
            primaryStage.show();
            return scene;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
​
    public static void main(String[] args) {
        launch(args);
    }
​
}

同時に、次のコードLogupFrameControllerで追加ログイン成功ログイン段階の後に閉鎖されるように、ステージのプロパティ、転送ステージを作成しました。

    private Stage logupStage;
​
    public Stage getLogupStage() {
        return logupStage;
    }
​
    public void setLogupStage(Stage logupStage) {
        this.logupStage = logupStage;
    }

プログラムは、次のインターフェイスを実行していますが、「登録」と「ログイン」ボタンなしイベント処理をクリックします。

だから、登録するイベントハンドラを追加して、ログインボタン、データベースを使用する必要性に起因して、パッケージにJDBCUtils.java UserDao.javaのDAOクラスを作成します。データベース・リンクで、クラスのパブリックリソースを解放しますが、クラスは、ユーザーのログインとCRUDデータベースバックアップUserDao.java登録プロセスであり、業務クラスを復元​​JDBCUtils.javaクラス。

JDBCUtils.java

package AccountSystem.dao;
​
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
​
/**
 * 连接JDBC类
 */
public class JDBCUtils {
    /**
     * 加载驱动,并建立数据库连接
     *
     * @return 返回数据库链接对象
     * @throws SQLException           抛出SQLException
     * @throws ClassNotFoundException 抛出ClassNotFoundException
     * @throws IOException            抛出IOException
     */
    static Connection getConnection() throws SQLException, ClassNotFoundException, IOException {
        // 实例化Properties对象
        Properties properties = new Properties();
        // 加载properties配置文件
        properties.load(new FileInputStream(new File("src\\AccountSystem\\properties\\db.properties")));
        // 通过键名获取对应的值
        String driverName = properties.get("driverName").toString();
        String url = properties.get("url").toString();
        String user = properties.get("user").toString();
        String password = properties.get("password").toString();
        // 数据库驱动
        Class.forName(driverName);
        // 获取数据库链接对象
        Connection connection = DriverManager.getConnection(url, user, password);
        return connection;
    }
​
    /**
     * 关闭数据库连接,释放资源
     *
     * @param stmt Statement对象
     * @param conn Connection对象
     */
    static void release(Statement stmt, Connection conn) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            stmt = null;
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
​
    /**
     * 关闭数据库连接,释放资源
     *
     * @param rs   ResultSet对象
     * @param stmt Statement对象
     * @param conn Connection对象
     */
    static void release(ResultSet rs, Statement stmt, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
        release(stmt, conn);
    }
​
    /**
     * Java代码实现MySQL数据库导出
     *
     * @param userName     进入数据库所需要的用户名
     * @param password     进入数据库所需要的密码
     * @param savePathName 数据库导出文件保存路径加名字
     * @param databaseName 要导出的数据库名
     * @return 返回true表示导出成功,否则返回false。
     */
    public static boolean backup(String userName, String password, String savePathName, String databaseName) {
        try {
//            String stmt = "mysql -uroot -padmin myDB < " + "c:/sql.sql";
            String stmt = "mysqldump -u" + userName + " -p" + password + " " + databaseName + " > " + savePathName;
            String[] cmd = {"cmd", "/c", stmt};
            Process process = Runtime.getRuntime().exec(cmd);
            if (process.waitFor() == 0) {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return false;
    }
​
    /**
     * 操作结果:恢复数据库,前提是数据库里有该数据库名字,否则无法恢复(所以应该先创建一个数据库)
     *
     * @param username     用户名
     * @param password     用户数据库密码
     * @param databasename 数据库名字
     * @param filePathName 数据库文件路径及名字加后缀
     * @return boolean 如果恢复成功则返回true,否则返回false
     */
    public static boolean recover(String username, String password, String databasename, String filePathName) {
        try {
//            String stmt = "mysql -uroot -padmin myDB < " + "c:/sql.sql";
            String stmt = "mysql -u" + username + " -p" + password + " " + databasename + " < " + filePathName;
            String[] cmd = {"cmd", "/c", stmt};
            Process process = Runtime.getRuntime().exec(cmd);
            if (process.waitFor() == 0) {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return false;
    }
​
}

UserDao.java

package AccountSystem.dao;
​
import AccountSystem.bean.User;
​
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
​
public class UserDao {
    private Connection connection = null;
​
    /**
     * 操作结果:实现按用户名与密码查询用户的方法
     *
     * @param userName 用户名
     * @param password 用户密码
     * @return Users Users对象
     */
    public User login(String userName, String password) {
        User user = new User();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            connection = JDBCUtils.getConnection();
            String sql = "select * from tb_users where uName=? and uPassword=?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, userName);
            preparedStatement.setString(2, password);
            // 执行查询
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                user.setUserId(resultSet.getInt(1));
                user.setUserName(resultSet.getString(2));
                user.setUserPassword(resultSet.getString(3));
                user.setUserImagePath(resultSet.getString(4));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(resultSet, preparedStatement, connection);
        }
        return user;
    }
​
    /**
     * 实现用户注册
     *
     * @param user 用户
     * @return 用户注册成功返回true,否则返回false
     */
    public boolean register(User user) {
        PreparedStatement preparedStatement = null;
        int num = 0;
        try {
            connection = JDBCUtils.getConnection();
            String sql = "insert into tb_users(uName,uPassword,uImagePath) values(?,?,?)";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, user.getUserName());
            preparedStatement.setString(2, user.getUserPassword());
            preparedStatement.setString(3, user.getUserImagePath());
            // 执行插入,返回受影响行数
            num = preparedStatement.executeUpdate();
            // 判断是否注册成功
            return num > 0;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(preparedStatement, connection);
        }
        return false;
    }
​
    /**
     * 根据用户ID查询用户信息
     *
     * @param userId 用户id
     * @return 返回查询到的用户信息
     */
    public User selectUserById(int userId) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        User user = new User();
        try {
            //获得数据的连接
            conn = JDBCUtils.getConnection();
            //获得Statement对象
            stmt = conn.createStatement();
            // 拼装SQL语句
            String sql = "select * from tb_users where uId=" + userId;
            //发送SQL语句
            rs = stmt.executeQuery(sql);
            // 循环添加数据
            while (rs.next()) {
                user.setUserId(rs.getInt(1));
                user.setUserName(rs.getString(2));
                user.setUserPassword(rs.getString(3));
                user.setUserImagePath(rs.getString(4));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(rs, stmt, conn);
        }
        return user;
    }
​
    /**
     * 更新用户数据
     *
     * @param user 要更新的用户数据
     * @return 如果更新成功则返回true,否则返回false
     */
    public boolean updateUser(User user) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //获得数据的连接
            conn = JDBCUtils.getConnection();
            //获得Statement对象
            stmt = conn.createStatement();
            // 拼接SQL语句
            String sql = "update tb_users set uName='" + user.getUserName() + "',uPassword='" + user.getUserPassword() + "',uImagePath='" + user.getUserImagePath() + "' where uId=" + user.getUserId() + ";";
            //发送SQL语句,获取受影响行数
            int num = stmt.executeUpdate(sql);
            //判断是否更改成功
            return num > 0;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(rs, stmt, conn);
        }
        return false;
    }
}

注:すべてのメソッドが出たため、ワンタイムクラスDAOに、後続のメソッド呼び出しが説明されることはありません。

上記の書き込み方法は、データベース内の基本的な設定情報ので使用はまだ、その性質フォルダにdb.propertiesという名前のファイルを作成します。することができない場合でも、

driverName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_bookkeepingSystem
user=root
password=admin

MySQLデータベースに接続し、ドライブの名前で、URLはdb_bookkeepingSystemはあなたが接続するデータベースの名前であり、ユーザとパスワードは、MySQLデータベースのユーザーのログイン名とパスワードです接続URLを参照するにDriverName。

すべての準備作業が完了した後も、イベント登録とログインイベントを書き込みます。"

以下の通り、すなわち登録を処理するためのコードloginButtonEvent()メソッドを読み取ります。

    /**
     * “注册”按钮事件监听器
     */
    @FXML
    void loginButtonEvent() {
        // 判断用户是否输入用户名和密码
        if (nameTextField.getText().equals("") || passwordTextField.getText().equals("")) {
            SimpleTools.informationDialog(Alert.AlertType.WARNING, "提示", "警告", "请按照文本框内容提示正确填写内容!");
        } else {
            // 实例化UserDao对象
            UserDao userDao = new UserDao();
            // 封装用户输入的数据到User实体类
            User user = new User(nameTextField.getText(), SimpleTools.MD5(passwordTextField.getText()), "src\\AccountSystem\\images\\panda.png");
            // 注册用户,并返回注册结果
            boolean isLoginSuccess = userDao.register(user);
            // 对注册结果进行反馈
            if (isLoginSuccess) {
                SimpleTools.informationDialog(Alert.AlertType.INFORMATION, "提示", "信息", "恭喜您,注册成功,欢迎使用本系统!");
            } else {
                SimpleTools.informationDialog(Alert.AlertType.ERROR, "错误", "错误", "抱歉,您注册失败了,请重新尝试!");
            }
        }
    }

挿入された上でのデータ送信である方法)ユーザ入力ボックスインタフェースのユーザ名とパスワードを取得し、その後、カプセル化されたユーザエンティティ・クラスと次のコール(登録達成登録するUserDao.javaのDAOパック()メソッドを登録しますデータテーブル。

登録成功または失敗意志プロンプト登録フィードバックするかどうか。

次のように情報レジスタのプロジェクト、塗りつぶしを実行し、インターフェイスは次のとおりです。

 

ログオンイベント処理コードに続く次の通りであります:

    /**
     * “登录”按钮事件监听器
     */
    @FXML
    void logupButtonEvent() {
        // 判断用户是否输入用户名和密码
        if (nameTextField.getText().equals("") || passwordTextField.getText().equals("")) {
            SimpleTools.informationDialog(Alert.AlertType.WARNING, "提示", "警告", "请按照文本框内容提示正确填写内容!");
        } else {
            // 实例化UserDao对象
            UserDao userDao = new UserDao();
            // 登录用户
            User loginUser = userDao.login(nameTextField.getText(), SimpleTools.MD5(passwordTextField.getText()));
            // 对是否登录成功进行判断
            if (loginUser.getUserName() != null && loginUser.getUserPassword() != null) {
                // 设置通信对象,建立登录成功通信
                Session.setUser(loginUser);
                // 在弹出的提示框种获取用户反馈
                boolean b = SimpleTools.informationDialog(Alert.AlertType.INFORMATION, "提示", "信息", "恭喜" + Session.getUser().getUserName() + ",登录成功,欢迎使用本系统!");
                // 如果用户确定登录,则跳转到主界面
                if (b) {
                    // 打开主窗口
                    // new MainApp().initMainFrame();
                    // 跳转到主界面后,关闭登录界面
                    logupStage.close();
                }
            } else {
                SimpleTools.informationDialog(Alert.AlertType.ERROR, "错误", "错误", "用户名或密码错误!");
            }
        }
    }

最初のログインUserDao.javaを検証するlogin()メソッドをコールし、検証が成功ユーザエンティティ・クラスへのユーザ情報のパッケージを取得し、検証のユーザ入力である、着信クラス、すなわち、データベースクエリから、ユーザエンティティのパラメータであります記録、成功したクエリを返すユーザーのチェックボックスと近いログイン画面をメイン画面にジャンプしてログインに成功するために、ユーザーがクリックし、「OK」を与えます。登録ユーザ情報の成功のためには、そう、すなわちSession.setUser(loginUser)、保存されて成功したユーザのログイン情報に、画面の奥に使用される、ということにも注目すべき;。

プログラムを実行し、ちょうど登録された情報を入力し、「ログイン」は、次のインターフェイスをクリックしてください:

ログイン画面が閉じられ、メインインターフェイスが作成されていないので、しかし、「OK」をクリックした後、プログラムが終了します、それは開くことができません。すなわち、コメントコード "//新しいMainAppに()initMainFrame();."。

 

 

検索可能な公共のマイクロチャネル番号[ Javaの例のプログラム ]以上の世間の注目を得るためにFanger魏のコード番号をスキャンします。

注: [パブリック数の背景に返信20200314この章のソースコードを入手することができます]。

公開された500元の記事 ウォン称賛77 ビュー160 000 +

おすすめ

転載: blog.csdn.net/cnds123321/article/details/104270855