admin管理员组

文章数量:1130349

项目背景与目的

随着信息化的发展,个人敏感文件的安全性越来越受到关注。为了让用户在本地存储文件时能够防止数据泄露,同时方便文件的管理和加密下载,本项目旨在开发一个基于桌面端的个人文件保险箱系统。给系统提供注册登录、文件加密上传、文件管理和解密下载等功能,保障用户文件的隐私与安全。

项目流程设计

用户可以通过启动程序之后:

1.注册新用户:

程序应该在根目录下创建一个文件夹,用于存储用户需要上传的文件
将新用户的数据保存到程序根目录下的数据存储文件中

2.登录:

登录时需要查找程序根目录下的数据存储文件中是否包含这个用户的账号 密码 用来当作能否成功登录的标准

3.登录成功之后 进入用户个人主页

用户个人主页包含
个人信息页面:支持显示所有信息 以及修改相关信息的按钮
个人加密文件页面:显示所有的文件 支持下载 删除 上传新文件

本篇博客主要实现“注册新用户”和“登录”功能,以下进入技术部分

一、界面开发的基本实现

窗体

这个项目显然会需要各种的窗体,故先创建一个UI(User Interface 用户界面)类
然后在这个类中实现登录界面,下为示例代码

public class UI {
    JFrame loginUI;
    
    //创建监听器对象
    LIstener lIstener = new LIstener();
    
    //登录界面 方法
    public void loginUI(){

        //基本页面
        loginUI = new JFrame();
        loginUI.setTitle("登录注册页面");
        loginUI.setSize(350,500);
        loginUI.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        loginUI.setLocationRelativeTo(null);//居中
        FlowLayout flow = new FlowLayout();//流式布局
        loginUI.setLayout(flow);

        //账号框
        JLabel label1 = new JLabel("账号");
        JTextField textField1 = new JTextField();
        Dimension dimension1 = new Dimension(300,30);
        textField1.setPreferredSize(dimension1);
        loginUI.add(label1);
        loginUI.add(textField1);

        //密码框
        JLabel label2 = new JLabel("密码");
        JPasswordField passwordField1 = new JPasswordField();
        Dimension dimension2 = new Dimension(300,30);
        passwordField1.setPreferredSize(dimension2);
        loginUI.add(label2);
        loginUI.add(passwordField1);

        //按钮
        JButton button1 = new JButton("登录");
        JButton button2 = new JButton("注册");
        button1.addActionListener(lIstener);//给按钮加监听器
        button2.addActionListener(lIstener);
        loginUI.add(button1);
        loginUI.add(button2);


        loginUI.setVisible(true);//可视化
    } 
    public static void main(String[] args) {
        UI ui = new UI();
        ui.loginUI();
    }
}

按钮功能的实现

界面上既然添加了按钮,自然要添加监听器,于是我们再创建一个Listener类,并在这个类中去实现按钮的功能

如何用一个监听器监听多个按钮

代码示例

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Listener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {

        String command = e.getActionCommand();
        if (command.equals("登录")){
            //这儿写实现登录功能的代码


        }else if (command.equals("注册")){
            //这儿写实现注册功能的代码

        }

    }
}

二、如何将用户输入的信息存入文件中

接下来实现“注册”按钮
点击按钮后,我们希望:
程序应该在根目录下创建一个文件夹,用于存储用户需要上传的文件
将新用户的数据保存到程序根目录下的数据存储文件中

我们不妨把上述问题拆分一下
1.存什么?数据怎么获得?
2.存在哪儿?怎么在根目录上创建一个文件夹,又在这个文件夹中创建一个数据存储文件?
3.怎么存?怎么将获得数据存进数据存储文件?
我们来依次解决

存什么? 引用传递

用户输入的账号、密码是在UI类中,而我们需要将这些数据拿到Listener类中进行存储。如何将一个变量存储的数据从一个类中传到另一个类中,这就涉及到引用传递了。下为代码示例:

public class LIstener implements ActionListener {

    //先在LIstener类中写属性 输入框变量
    JTextField nameField;
    JPasswordField pwdField;
    
    ...
}
//再在UI类中
//使用监听对象调用它的属性 进行初始化
        action.nameField=textField1;
        action.pwdField=textField2;
//这样完成了引用传递了

在LIstener类中用nameField.getText();pwdField.getText();语句就可获得相关数据了

存在哪儿?文件与文件夹

关于Java中File这个类,笔者专门写过一篇博客,对其不太清楚的读者,建议先去看看那篇博客。

首先,我们先用System.getProperty(“user.dir”);这个内置函数获得当前用户的工作目录路径(当前程序的根目录),然后再将用户输入的账号信息拼接上_uploads,以作为用户专属文件夹的名字,并以此创建该用户的专属文件夹。紧接着就在这个专属文件夹中创建一个数据储存文件用以存放用户的基本信息。

public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();

        String[] userInformation = new String[INFORMATION_NUM];

        userInformation[0] = nameField.getText();
        userInformation[1] = pwdField.getText();

        String rootDir = System.getProperty("user.dir");
        String folderName = userInformation[0] + "_uploads";
        String folderPath = rootDir + File.separator + folderName;

        if (command.equals("注册")){

            //创建用户的专属文件夹
            File uploadFolder = new File(folderPath);;
            if (!uploadFolder.exists()) {
                boolean success = uploadFolder.mkdirs();
                if (success) {
                    System.out.println("已在根目录下成功创建文件夹:" + folderPath + ",用于存储用户上传文件。");
                } else {
                    System.out.println("在根目录下创建文件夹失败。");
                }
            } else {
                System.out.println("文件夹已存在:" + folderPath + ",可直接用于存储用户上传文件。");
            }

            //在用户的专属文件夹中创捷 数据存储文件
            File userBasic = new File(uploadFolder,"userBasic.txt");
            try {
                if (userBasic.createNewFile()) {
                    System.out.println("文件创建成功!");
                } else {
                    System.out.println("文件已存在。");
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
            ......

结果:

怎么存?IO流(这里主要是Output)

这里要用到一个函数

 public static void writeFile(File file, String[] lines) {
        try {
            FileWriter fw = new FileWriter(file);//基础的写入流
            BufferedWriter bw = new BufferedWriter(fw);//升级的写入流

            // 循环写入多行数据 先声明了一个字符串类型的变量用其其去遍历lines数组
            for (String line : lines) {
                bw.write(line + "\n");
            }

            bw.flush();
            bw.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

调用参数:
file - 文件对象,指定你要将数据写到那个文件中
lines - 字符串数组,即你要写的数据

 //将 账号 密码 写入数据存储文件
            writeFile(userBasic,userInformation);

到此,我们就基本实现了注册新用户这一功能。

三、实现登录

登录成功与否的判断条件

之前我们花了那么大劲,将用户注册时输入的信息存到其专属文件夹的数据储存文件中,现在他再登录时,我们只需要将其账号和密码信息读取出来,并将其与其输入的账号和密码进行比较即可。
由于用户的专属文件夹的名称是与其账号相关,故笔者这里采用通过其专属文件夹是否存在来判断用户是否存在,然后再比对密码。

怎么读信息?IO流(这里主要是Input)

值得一提的是,这里的Input又叫read,指的是将文件中的数据读取到程序的内存中。

static String[] temp;
public static void readFile(File file){
        try {
            FileReader fr = new FileReader(file);//基本的读取流
            BufferedReader br = new BufferedReader(fr);//升级的读取流

            temp = new String[INFORMATION_NUM];
            for (int i = 0;i < INFORMATION_NUM;i++){
                temp[i] = br.readLine();
            }

        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

调用参数:
file - 就是你要读的文件

//接监听器点击方法
else if (command.equals("登录")){
            //先通过能否找到专属文件 以确定该用户是否存在
            String sname = userInformation[0] + "_uploads";
            String selfFolder = rootDir + File.separator + sname;
            File sFolder = new File(selfFolder);
            if (sFolder.exists()){
                //再比对密码
                File basic = new File(sFolder,"userBasic.txt");
                readFile(basic);
                if (Objects.equals(userInformation[1], temp[1])){
                    System.out.println("登录成功!");
                    ui.hideLoginUI();
                    ui.homeUI();

                }else{
                    System.out.println("密码错误!");
                }

            }else {
                System.out.println("用户不存在!");
            }

登录成功后,跳转主页面

首先要再写一个窗体,这里就不再赘述了

//home页面 方法
    public void homeUI(){
        homeUI = new JFrame();
        homeUI.setTitle("文件保险箱");
        homeUI.setSize(350,500);
        homeUI.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        homeUI.setLocationRelativeTo(null);
        FlowLayout flow = new FlowLayout(FlowLayout.CENTER);
        homeUI.setLayout(flow);

        JButton button1 = new JButton("个人信息");
        JButton button2 = new JButton("个人文件加密");
        JButton button3 = new JButton("退出登录/切换账号");
        button1.addActionListener(lIstener);
        button2.addActionListener(lIstener);
        button3.addActionListener(lIstener);
        homeUI.add(button1);
        homeUI.add(button2);
        homeUI.add(button3);
        homeUI.setVisible(true);
    }

其次,在登录成功后,我们还需将登录界面隐藏起来

public void hideLoginUI(){
        loginUI.setVisible(false);
    }


四、项目接下来要做的

完善用户个人主页:
个人信息页面:支持显示所有信息 以及修改相关信息的按钮
个人加密文件页面: 显示所有的文件 支持下载 删除 上传新文件

未完待续!

项目背景与目的

随着信息化的发展,个人敏感文件的安全性越来越受到关注。为了让用户在本地存储文件时能够防止数据泄露,同时方便文件的管理和加密下载,本项目旨在开发一个基于桌面端的个人文件保险箱系统。给系统提供注册登录、文件加密上传、文件管理和解密下载等功能,保障用户文件的隐私与安全。

项目流程设计

用户可以通过启动程序之后:

1.注册新用户:

程序应该在根目录下创建一个文件夹,用于存储用户需要上传的文件
将新用户的数据保存到程序根目录下的数据存储文件中

2.登录:

登录时需要查找程序根目录下的数据存储文件中是否包含这个用户的账号 密码 用来当作能否成功登录的标准

3.登录成功之后 进入用户个人主页

用户个人主页包含
个人信息页面:支持显示所有信息 以及修改相关信息的按钮
个人加密文件页面:显示所有的文件 支持下载 删除 上传新文件

本篇博客主要实现“注册新用户”和“登录”功能,以下进入技术部分

一、界面开发的基本实现

窗体

这个项目显然会需要各种的窗体,故先创建一个UI(User Interface 用户界面)类
然后在这个类中实现登录界面,下为示例代码

public class UI {
    JFrame loginUI;
    
    //创建监听器对象
    LIstener lIstener = new LIstener();
    
    //登录界面 方法
    public void loginUI(){

        //基本页面
        loginUI = new JFrame();
        loginUI.setTitle("登录注册页面");
        loginUI.setSize(350,500);
        loginUI.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        loginUI.setLocationRelativeTo(null);//居中
        FlowLayout flow = new FlowLayout();//流式布局
        loginUI.setLayout(flow);

        //账号框
        JLabel label1 = new JLabel("账号");
        JTextField textField1 = new JTextField();
        Dimension dimension1 = new Dimension(300,30);
        textField1.setPreferredSize(dimension1);
        loginUI.add(label1);
        loginUI.add(textField1);

        //密码框
        JLabel label2 = new JLabel("密码");
        JPasswordField passwordField1 = new JPasswordField();
        Dimension dimension2 = new Dimension(300,30);
        passwordField1.setPreferredSize(dimension2);
        loginUI.add(label2);
        loginUI.add(passwordField1);

        //按钮
        JButton button1 = new JButton("登录");
        JButton button2 = new JButton("注册");
        button1.addActionListener(lIstener);//给按钮加监听器
        button2.addActionListener(lIstener);
        loginUI.add(button1);
        loginUI.add(button2);


        loginUI.setVisible(true);//可视化
    } 
    public static void main(String[] args) {
        UI ui = new UI();
        ui.loginUI();
    }
}

按钮功能的实现

界面上既然添加了按钮,自然要添加监听器,于是我们再创建一个Listener类,并在这个类中去实现按钮的功能

如何用一个监听器监听多个按钮

代码示例

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Listener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {

        String command = e.getActionCommand();
        if (command.equals("登录")){
            //这儿写实现登录功能的代码


        }else if (command.equals("注册")){
            //这儿写实现注册功能的代码

        }

    }
}

二、如何将用户输入的信息存入文件中

接下来实现“注册”按钮
点击按钮后,我们希望:
程序应该在根目录下创建一个文件夹,用于存储用户需要上传的文件
将新用户的数据保存到程序根目录下的数据存储文件中

我们不妨把上述问题拆分一下
1.存什么?数据怎么获得?
2.存在哪儿?怎么在根目录上创建一个文件夹,又在这个文件夹中创建一个数据存储文件?
3.怎么存?怎么将获得数据存进数据存储文件?
我们来依次解决

存什么? 引用传递

用户输入的账号、密码是在UI类中,而我们需要将这些数据拿到Listener类中进行存储。如何将一个变量存储的数据从一个类中传到另一个类中,这就涉及到引用传递了。下为代码示例:

public class LIstener implements ActionListener {

    //先在LIstener类中写属性 输入框变量
    JTextField nameField;
    JPasswordField pwdField;
    
    ...
}
//再在UI类中
//使用监听对象调用它的属性 进行初始化
        action.nameField=textField1;
        action.pwdField=textField2;
//这样完成了引用传递了

在LIstener类中用nameField.getText();pwdField.getText();语句就可获得相关数据了

存在哪儿?文件与文件夹

关于Java中File这个类,笔者专门写过一篇博客,对其不太清楚的读者,建议先去看看那篇博客。

首先,我们先用System.getProperty(“user.dir”);这个内置函数获得当前用户的工作目录路径(当前程序的根目录),然后再将用户输入的账号信息拼接上_uploads,以作为用户专属文件夹的名字,并以此创建该用户的专属文件夹。紧接着就在这个专属文件夹中创建一个数据储存文件用以存放用户的基本信息。

public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();

        String[] userInformation = new String[INFORMATION_NUM];

        userInformation[0] = nameField.getText();
        userInformation[1] = pwdField.getText();

        String rootDir = System.getProperty("user.dir");
        String folderName = userInformation[0] + "_uploads";
        String folderPath = rootDir + File.separator + folderName;

        if (command.equals("注册")){

            //创建用户的专属文件夹
            File uploadFolder = new File(folderPath);;
            if (!uploadFolder.exists()) {
                boolean success = uploadFolder.mkdirs();
                if (success) {
                    System.out.println("已在根目录下成功创建文件夹:" + folderPath + ",用于存储用户上传文件。");
                } else {
                    System.out.println("在根目录下创建文件夹失败。");
                }
            } else {
                System.out.println("文件夹已存在:" + folderPath + ",可直接用于存储用户上传文件。");
            }

            //在用户的专属文件夹中创捷 数据存储文件
            File userBasic = new File(uploadFolder,"userBasic.txt");
            try {
                if (userBasic.createNewFile()) {
                    System.out.println("文件创建成功!");
                } else {
                    System.out.println("文件已存在。");
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
            ......

结果:

怎么存?IO流(这里主要是Output)

这里要用到一个函数

 public static void writeFile(File file, String[] lines) {
        try {
            FileWriter fw = new FileWriter(file);//基础的写入流
            BufferedWriter bw = new BufferedWriter(fw);//升级的写入流

            // 循环写入多行数据 先声明了一个字符串类型的变量用其其去遍历lines数组
            for (String line : lines) {
                bw.write(line + "\n");
            }

            bw.flush();
            bw.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

调用参数:
file - 文件对象,指定你要将数据写到那个文件中
lines - 字符串数组,即你要写的数据

 //将 账号 密码 写入数据存储文件
            writeFile(userBasic,userInformation);

到此,我们就基本实现了注册新用户这一功能。

三、实现登录

登录成功与否的判断条件

之前我们花了那么大劲,将用户注册时输入的信息存到其专属文件夹的数据储存文件中,现在他再登录时,我们只需要将其账号和密码信息读取出来,并将其与其输入的账号和密码进行比较即可。
由于用户的专属文件夹的名称是与其账号相关,故笔者这里采用通过其专属文件夹是否存在来判断用户是否存在,然后再比对密码。

怎么读信息?IO流(这里主要是Input)

值得一提的是,这里的Input又叫read,指的是将文件中的数据读取到程序的内存中。

static String[] temp;
public static void readFile(File file){
        try {
            FileReader fr = new FileReader(file);//基本的读取流
            BufferedReader br = new BufferedReader(fr);//升级的读取流

            temp = new String[INFORMATION_NUM];
            for (int i = 0;i < INFORMATION_NUM;i++){
                temp[i] = br.readLine();
            }

        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

调用参数:
file - 就是你要读的文件

//接监听器点击方法
else if (command.equals("登录")){
            //先通过能否找到专属文件 以确定该用户是否存在
            String sname = userInformation[0] + "_uploads";
            String selfFolder = rootDir + File.separator + sname;
            File sFolder = new File(selfFolder);
            if (sFolder.exists()){
                //再比对密码
                File basic = new File(sFolder,"userBasic.txt");
                readFile(basic);
                if (Objects.equals(userInformation[1], temp[1])){
                    System.out.println("登录成功!");
                    ui.hideLoginUI();
                    ui.homeUI();

                }else{
                    System.out.println("密码错误!");
                }

            }else {
                System.out.println("用户不存在!");
            }

登录成功后,跳转主页面

首先要再写一个窗体,这里就不再赘述了

//home页面 方法
    public void homeUI(){
        homeUI = new JFrame();
        homeUI.setTitle("文件保险箱");
        homeUI.setSize(350,500);
        homeUI.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        homeUI.setLocationRelativeTo(null);
        FlowLayout flow = new FlowLayout(FlowLayout.CENTER);
        homeUI.setLayout(flow);

        JButton button1 = new JButton("个人信息");
        JButton button2 = new JButton("个人文件加密");
        JButton button3 = new JButton("退出登录/切换账号");
        button1.addActionListener(lIstener);
        button2.addActionListener(lIstener);
        button3.addActionListener(lIstener);
        homeUI.add(button1);
        homeUI.add(button2);
        homeUI.add(button3);
        homeUI.setVisible(true);
    }

其次,在登录成功后,我们还需将登录界面隐藏起来

public void hideLoginUI(){
        loginUI.setVisible(false);
    }


四、项目接下来要做的

完善用户个人主页:
个人信息页面:支持显示所有信息 以及修改相关信息的按钮
个人加密文件页面: 显示所有的文件 支持下载 删除 上传新文件

未完待续!

本文标签: 保险箱文件java