C/S架构NIO文件管理系统【上】

设计过程:

  • 整个系统需要哪些功能?
    登陆,注册,搜索文件,上传文件,浏览文件目录,选择文件下载,浏览自己上传的文件并可以选择进行下载/删除/重命名
  • 实现功能的面板需要几个?
    6个——登陆、注册、功能面板、文件目录、文件管理、下载
  • 面板之间的跳转通过哪个部件?
    按钮
  • 每个面板内含有哪些元素?
    • 基本上是Label、Button、TextFiled
    • 特殊的有PasswordField、FileChooser、ProgressBar、CheckBox、ScrollPane
  • 每个元素对应的功能是什么?
    • Label:说明文字
    • Button:进行操作
    • TextFiled:文本框,输入数据
    • PasswordField:密码输入框,隐藏明文密码
    • FileChooser:文件选择窗口,上传文件的选择/下载路径的选择
    • ProgressBar:进度条,上传/下载/删除的完成进度
    • CheckBox:多选框,选择文件目录
    • ScrollPane:滚动条
  • 操作后不同结果的提示是什么?
    • 成功——提示成功
    • 失败——提示失败及可能原因
    • 进度——如删除则显示进度条

数据库设计

此篇主要是面板设计,与后端及server的互动不多,所以数据库设计并不完整
下篇会将所有C/S互动补充完整

Client

面板

登陆面板举例

  • 结构

    Alt text

  • 用户表

    Alt text

    环境

  • Windows Server 2019
  • phpStudy V8.0下载页面
    • 启动Apache
    • 启动Mysql
  • Client端:VScode
    • 配置Java:Java SE 8u251
    • 通过VScode自身安装Java
      • 随便打开一个Java文件
      • 右下角弹出Java安装进行安装即可
  • Server端:Eclipse IDE
    • 下载页面
    • 下载后解压为文件夹放到合适的位置如: C:\Program Files 即可
    • 将文件夹内的应用程序快捷方式到桌面方便使用

      文件目录架构

  • client 点击查看大图

    4.png

  • server

    Alt text

  • import java.awt.Font;
    
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;
    
    public class admin extends JFrame{
       private int count=0;
       private JButton bt1;//登陆按钮
       private JButton bt2;//注册按钮
       private JLabel jl_1;//登录的版面
       private JFrame jf_1;//登陆的框架
       private JTextField jtext1;//用户名
       private JPasswordField jtext2;//密码
       private JLabel jl_admin;
       private JLabel jl_password;
       public admin (String a,String b){//初始化登陆界面
           Font font =new Font("黑体", Font.PLAIN, 15);//设置字体
           jf_1=new JFrame("登陆界面");
           jf_1.setSize(400, 320);
           //给登陆界面添加背景图片
           ImageIcon bgim = new ImageIcon(admin.class.getResource("back.png")) ;//背景图案
           bgim.setImage(bgim.getImage().
                                        getScaledInstance(bgim.getIconWidth(),
                                                          bgim.getIconHeight(), 
                                                          Image.SCALE_DEFAULT));  
           jl_1=new JLabel();
           jl_1.setIcon(bgim);
           jl_admin=new JLabel("用户名");
           jl_admin.setBounds(20, 50, 60, 50);
           jl_admin.setFont(font);
           jl_password=new JLabel("密  码");
           jl_password.setBounds(20, 120, 60, 50);
           jl_password.setFont(font);
           bt1=new JButton("登陆");         //更改成loginButton
           bt1.setBounds(70, 210, 100, 50);
           bt1.setFont(font);
           bt2=new JButton("注册");
           bt2.setBounds(230, 210, 100, 50);
           bt2.setFont(font);
           //加入文本框
           jtext1=new JTextField(a);
           jtext1.setBounds(110, 50, 250, 40);
           jtext1.setFont(font);
           jtext2=new JPasswordField(b);//密码输入框
           jtext2.setEchoChar('*');//设置密文显示
           jtext2.setBounds(110, 120, 250, 40);
           jtext2.setFont(font);
           //元素加入面板
           jl_1.add(jtext1);
           jl_1.add(jtext2);
           jl_1.add(jl_admin);
           jl_1.add(jl_password);
           jl_1.add(bt1);
           jl_1.add(bt2);
           jf_1.add(jl_1);
           jf_1.setVisible(true);
           jf_1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           jf_1.setLocation(300,200);
           //登陆点击事件
           ActionListener bt1_ls=new ActionListener() {
               @Override
               public void actionPerformed(ActionEvent arg0) {
                   String admin=jtext1.getText();
                   char[] password=jtext2.getPassword();
                   String str=String.valueOf(password); //将char数组转化为string类型
                   //判断用户名和密码
                   if(admin.equals("Uling")&&str.equals("22dd66cc")){
                       System.out.println(admin);
                       System.out.println(str);
                       new mainLayout(admin);//跳转界面
                       jf_1.dispose();//销毁当前界面
                   }
                   else {
                       count++;
                       System.out.println("error");
                       JOptionPane.showMessageDialog(null, "登录失败");
                       if(count==3){//密码输入错三次直接退出
                            JOptionPane.showMessageDialog(null, "即将退出,再见");
                            jf_1.dispose();
                       }
                   }
               }
           };
           bt1.addActionListener(bt1_ls);
           bt2.addActionListener(new ActionListener(){//对注册按钮添加监听事件
               @Override
               public void actionPerformed(ActionEvent arg0) {
                   new register();//进入都到注册窗体中
                   jf_1.dispose();
               }
               
           });
       }
       public static void main(String[] args) {
           //初始化登陆界面
           new admin("Uling","22dd66cc");
       }
    }

    其他面板详细举例见《P2P:局域网内文件传输【带界面】》

    进度条的使用

  • public class Down extends JFrame{
        public Down(){
            JFrame jf=new JFrame();
            jf.setTitle("下载界面");
            jf.setLayout(null);
            jf.setSize(400,300);
            jf.setLocation(500,200);
            jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//关闭选项
            JPanel fun = new Fun(jf); 
            fun.setBounds(20,10,360,200);
            fun.setBorder(BorderFactory.createTitledBorder("")); 
            jf.add(fun);
            jf.setVisible(true);
        }
    
        public static void main(String[] args) {
            new Down();
        }
    }
    class Fun extends JPanel implements ActionListener {
        JButton download;
        Timer timer;
        JProgressBar jpb;
        JFrame jf;
        public Fun(JFrame jf) {
            this.jf=jf;
            this.setLayout(null);
            setSize(360, 200);//设置宽、高
    		timer = new Timer(50, this); // 创建一个计时器,计时间隔为50毫秒
            download=new JButton("开始下载");
            download.setBounds(20,115,100,30);
            jpb = new JProgressBar();
            jpb.setOrientation(JProgressBar.HORIZONTAL);//设置进度条的方向:平行
            jpb.setMinimum(0);//最小值为0
            jpb.setMaximum(100);//最大值为100
            jpb.setValue(0);//赋初始值
            jpb.setStringPainted(true);//true:进度条呈现进度字符串
            jpb.setBounds(130,120,200,20);
            this.add(download);
            this.add(jpb);
            download.addActionListener(this);
        }
        @Override
        public void actionPerformed(ActionEvent e) {
    		if (e.getSource() == timer) {//监听到有动作发生的某个控件(定时器)
    			int value = jpb.getValue();//返回进度条的当前值
    			jpb.setValue(0);//将进度条回复0值
    			if (value < 100) {//若当前进度未满
    				value++;//自加
    				jpb.setValue(value);//将进度条重新赋值
    			} else {
    				timer.stop();//进度条已满则停止Timer,使它停止向其监听器发送动作事件
    			}
    		}
            else if ((JButton) e.getSource() == download){//文件下载
                download.setEnabled(false);
                if(path==null){//错误提示
                    JOptionPane.showMessageDialog(null, "未选择保存路径","错误",JOptionPane.ERROR_MESSAGE);
                    download.setEnabled(true);
                }
                else{
                    try {
                        timer.start();
                        /*下载开始。。。操作*/
                        }
                    }catch (IOException q) {
                        System.out.println("异常");
                        download.setEnabled(true);
                    }
                }
            }
        }
    }
    

    文件选择窗口

  • 文件选择
  • public class Up extends JFrame{
      public Up(){
          JFrame jf=new JFrame();
          jf.setTitle("Up");
          jf.setLayout(null);
          jf.setSize(400,300);
          jf.setLocation(500,200);
          jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//关闭选项
          JPanel fun = new Fun(jf); 
          fun.setBounds(20,10,360,200);
          fun.setBorder(BorderFactory.createTitledBorder("")); 
          jf.add(fun);
          jf.setVisible(true);
      }
    
      public static void main(String[] args) {
          new Up();
      }
    }
    class Fun extends JPanel implements ActionListener {
      JFileChooser jfc;//文件选择窗口
      JTextField file_path;
      JButton look;
      JFrame jf;
      String path,name;
      public Fun(JFrame jf) {
          this.jf=jf;
          this.setLayout(null);
          setSize(360, 200);//设置宽、高
          jfc = new JFileChooser();
          file_path=new JTextField("待发送文件:");
          file_path.setBounds(40,60,200,30);
          look= new JButton("浏览");
          look.setBounds(240,60,80,30);
          this.add(download_path);
          this.add(file_path);
          this.add(look);
          look.addActionListener(this);
      }
      @Override
      public void actionPerformed(ActionEvent e) {
          int result;
          if ((JButton) e.getSource() == look){//浏览按钮被按下
              jfc.setApproveButtonText("确定");//文件选择窗口中的 approvebutton 内使用的文本
              jfc.setDialogTitle("选择文件窗口");//文件选择窗口中的标题栏
              result = jfc.showOpenDialog(this);
              //null———显示在当前电脑显示器屏幕的中央
              //this———显示在当前你编写的程序屏幕中央
              //返回一个DialogResult,对应你按的按钮【如:单击“关闭”按钮会隐藏窗体,并将DialogResult属性设置为DialogResult.Cancel  】
              if (result == JFileChooser.APPROVE_OPTION) // 当用户按下文件选择窗口中的确定
              {
                  path = new String(jfc.getSelectedFile().getPath());//文件路径
                  //getSelectedFile()返回选中的文件
                  //getPath()将此抽象路径名转换为一个路径名字符串
                  name= new String(jfc.getSelectedFile().getName());//文件名
                  file_path.setText("文件:" + name + "待上传!");
              }
          }
      }
    }

    参考链接

    基于NIO的Socket通信(使用Java NIO的综合示例讲解)

    PS:还差server与client的互动没有完成等完成了再分享

  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值