combate de Java del sistema de facturación ama de llaves (4) - el registro del usuario y la función de inicio de sesión para lograr

El primero en utilizar idea de crear un proyecto JavaFX común, y crear una carpeta en la siguiente figura.

Seguido de la introducción de paquetes de terceros para usarse, necesita utilizar la carpeta de archivo del paquete frasco de paquete, la introducción puede ser.

Después de la introducción con éxito, para crear una tabla de base de datos ya está contemplado en el artículo segundo, y existe la carpeta de archivo del paquete de SQL en sentencias SQL se pueden ejecutar directamente, con el fin de crear una tabla de base de datos.

 

Paso 1: Crear Entidad estructura de la tabla de clase de acuerdo con la base de datos, como se muestra en la figura.

Hay dos artículos en el mismo momento de ser utilizados para disminuir herramientas DateTools.java y SimpleTools.java paquete de herramientas.

Estos archivos están en el código fuente, esto no se dice.

 

Paso 2: Crear un archivo llamado logupFrame.fxml de vista y en el paquete de vista diseñada por Escena del constructor.

(Acerca del archivo de fxml cada control de ajustes de configuración de propiedad y eventos se pueden ver usando el Generador de escena, no aquí fuera).

<?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>

Seguido de la creación de paquete LogupFrameController.java que está en el archivo de clase de entrada de interfaz del controlador fxml controlador correspondiente a y desde el atributo de control de copia correspondiente a Escena constructor de interfaz a la clase.

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() {
        
    }
​
}

Seguido por el código de la clase MainApp texto es el siguiente, es decir, iniciar el programa.

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);
    }
​
}

Al mismo tiempo añadido en el siguiente código creado LogupFrameController propiedad de la etapa, la etapa de transferencia de manera que se cierre después de una etapa de inicio de sesión de inicio de sesión con éxito.

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

Ejecutar el programa, la interfaz siguiente, pero si hace clic en el botón "Iniciar sesión" "Registro" y sin el control de eventos.

Así que para agregar un controlador de eventos para registrar y el botón de inicio de sesión, debido a la necesidad de utilizar la base de datos, y crear la clase DAO JDBCUtils.java UserDao.java en el paquete. JDBCUtils.java clase que es el enlace de base de datos y liberar recursos públicos para la clase, pero la clase es UserDao.java proceso de registro de usuario y la base de datos CRUD copia de seguridad del usuario y restablecer la clase de operaciones.

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;
    }
}

Nota: Debido a la DAO clase de una sola vez todos los métodos dieron a cabo, no se describirán las llamadas a métodos siguientes.

Incluso si el método de escritura anterior no se puede utilizar porque la información de configuración básica en la base de datos, sin embargo, por tanto, crear un archivo de carpetas con nombre en db.properties propiedades.

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

DriverName que es el nombre de la unidad, conectado a una base de datos MySQL, y el URL hace referencia a la dirección URL de conexión, donde db_bookkeepingSystem es el nombre de la base de datos que desea conectarse, y el usuario y la contraseña son el nombre de usuario de base de datos MySQL y la contraseña.

Después de la finalización de todos los eventos de registro de evento de trabajo, incluso de escritura y de ingreso de preparatorias. '

Código loginButtonEvent () método para procesar el registro es decir, leer como sigue:

    /**
     * “注册”按钮事件监听器
     */
    @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, "错误", "错误", "抱歉,您注册失败了,请重新尝试!");
            }
        }
    }

La obtención de la entrada del usuario nombre de la interfaz cuadro de usuario y contraseña, y las clases de entidad de usuario entonces encapsulados y la siguiente llamada registro paquete DAO UserDao.java () método para registrar registro () que es la transmisión de datos por insertada lograr la tabla de datos.

Si el éxito o el fracaso registrada le pedirá retroalimentación registro.

Ejecutar el proyecto de relleno en el registro de la información, la interfaz es la siguiente:

 

Seguido de un código de procesamiento de eventos de inicio de sesión es el siguiente:

    /**
     * “登录”按钮事件监听器
     */
    @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, "错误", "错误", "用户名或密码错误!");
            }
        }
    }

La primera consiste en validar la entrada del usuario, la verificación se obtuvo con éxito el paquete de información de usuario a la clase de entidad de usuario, llame al método de inicio de sesión () para verificar la UserDao.java inicio de sesión, la clase entrante es una entidad parámetros del usuario, es decir, desde la consulta de base de datos registro, una casilla de verificación de usuario devuelve la consulta con éxito y le da un inicio de sesión con éxito, el usuario hace clic en "OK" para pasar a la pantalla principal y cerca de la pantalla de inicio de sesión. También tenga en cuenta que, debido al éxito de la información de usuario registrado será utilizado en la parte posterior de la pantalla, por lo que para el éxito de la información de inicio de sesión de usuario guardados, a saber Session.setUser (loginUser);.

Ejecutar el programa, introduzca la información acaba de registrar, haga clic en "Iniciar sesión", la interfaz siguiente:

Pero después haga clic en "Aceptar", el programa va a terminar, ya que la pantalla de inicio de sesión cerrada, y la interfaz principal no se ha creado, que no se puede abrir. Es decir, código comentado "// nueva MainApp () initMainFrame () ;.".

 

 

número de micro-canales públicos de búsqueda [ programa de ejemplo de Java ] o escanear el código Fanger Wei para obtener más atención del público.

Nota: Responder a [el fondo público número 20200314 ] se puede obtener el código fuente de este capítulo.

Publicados 500 artículos originales · ganado elogios 77 · vistas 160 000 +

Supongo que te gusta

Origin blog.csdn.net/cnds123321/article/details/104270855
Recomendado
Clasificación