combate Java do sistema governanta de cobrança (4) - registro de usuário e recurso de login para alcançar

O primeiro a utilizar ideia de criar um projeto JavaFX comum, e crie uma pasta na figura a seguir.

Seguido pela introdução de pacotes de terceiros para ser usado, precisa usar a pasta de arquivo de pacote pacote jar, a introdução pode ser.

Após a introdução bem sucedida, para criar uma tabela de banco de dados já está coberto no segundo artigo, e pasta de arquivo de pacote sql existe em instruções SQL podem ser executados diretamente, a fim de criar uma tabela de banco de dados.

 

Passo 1: Criar entidade estrutura da tabela de classe de acordo com a base de dados, como mostrado na FIG.

Há dois itens na mesma hora de ser usado para ferramentas DateTools.java e SimpleTools.java pacote de ferramentas diminuir.

Esses arquivos estão no código fonte, este não é indicado.

 

Passo 2: Criar um arquivo chamado logupFrame.fxml de vista e no pacote de vista desenhado por Scene Builder.

(Sobre o ficheiro fxml cada configurações e eventos de configuração de propriedade de controle pode ser visto usando o Construtor de Cena, não aqui-los).

<?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 por criar pacote LogupFrameController.java que está no login do interface do controlador fxml controlador de arquivo de classe correspondente de e para o atributo de controle de cópia correspondente a cena Builder irá interagir com a classe.

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 do código na classe MainApp ler da seguinte forma, ou seja, iniciar o 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);
    }
}

Simultaneamente adicionado na seguinte LogupFrameController código criado Stage propriedade, fase de transferência, de modo a ser fechado depois de uma fase de login login bem-sucedido.

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

Execute o programa, a seguinte interface, mas se você clicar em "Register" e botão "Login" nenhuma manipulação de eventos.

Então, para adicionar um manipulador de eventos para registrar e botão de login, devido à necessidade de usar o banco de dados, e criar JDBCUtils.java UserDao.java classe dao no pacote. classe JDBCUtils.java que é o link de banco de dados e liberar recursos públicos para a classe, mas a classe é o processo de registro UserDao.java de backup login e banco de dados CRUD do usuário e restaurar a classe operações.

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: Devido ao dao classe one-time todos os métodos deu a chamadas de método subsequentes não serão descritos.

Mesmo se o método de gravação acima não pode ser usado porque as informações de configuração básica no banco de dados ainda, então criar um arquivo de pasta db.properties nomeados nas propriedades.

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

DriverName que é o nome da unidade, conectado a um banco de dados MySQL, e url refere-se à URL de conexão, onde db_bookkeepingSystem é o nome do banco de dados que você deseja se conectar, e de usuário e senha são o login do usuário do banco de dados MySQL e senha.

Após a conclusão de todos os eventos de trabalho até escrever registro de eventos e login preparatórias. '

Código loginButtonEvent () método para processamento de registro ou seja, ter a seguinte redacção:

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

Obter o nome do usuário de entrada interface de caixa de usuário e senha, e classes de entidade de usuário, em seguida, encapsulados ea próxima chamada registar UserDao.java pacote dao () para registrar alcançar register () método que é a transmissão de dados pela inserido tabela de dados.

Se o sucesso registado ou fracasso gabarito registro imediato.

Executar o projeto, preencha o cadastro de informações, a interface é a seguinte:

 

Seguido por um código de processamento de eventos de logon é a seguinte:

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

A primeira é a entrada do usuário validar, a verificação será obtido com sucesso pacote de informações do usuário para a classe de entidade usuário, chame o método login () para verificar a UserDao.java login, a classe de entrada é um parâmetros de entidade usuário, ou seja, a partir da consulta de banco de dados uma caixa de seleção bem sucedida usuário consulta retorna registro, e dá um login bem-sucedido, o usuário clica em "OK" para ir para a tela principal e feche a tela de login. Observe também que, devido ao sucesso das informações de utilizador registado será usado na parte de trás da tela, de modo que as informações de login de usuário bem sucedido salvos, ou seja, Session.setUser (LoginUser);.

Execute o programa, insira as informações apenas registrado, clique no botão "Login", a seguinte interface:

Mas, depois clique em "OK", o programa vai acabar, porque a tela de login fechados, e a interface principal não foi criado, ele não pode ser aberto. Ou seja, código comentado "// nova MainApp () initMainFrame () ;.".

 

 

número de micro-canal público pesquisável [ Java exemplo de programa ] ou digitalizar o número de código Fanger Wei para obter mais atenção do público.

Nota: Responder para [o fundo número público 20200314 ] pode obter o código fonte deste capítulo.

Publicado 500 artigos originais · Louvor obteve 77 · vista 160 000 +

Acho que você gosta

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