全栈工程师工作干货总结(二)

news2024/11/28 4:48:39

1. linux允许ROOT登录ftp

# 进入vsftpd目录
cd /etc/vsftpd

# 查看该目录包含的文件
ls

# 进入文件vsftpd.ftpusers,在root前加#注释root
vi  vsftpd.ftpusers

# 进入文件vsftpd.user_list,在root前加#注释root
vi vsftpd.user_list

2. 关于只能IP访问,域名不能访问网站的解决

我买的是腾讯云的服务器Cenos 6.5系统,自己配置的DNS域名服务器,nslookup www.xuefeng66.cn能够正常解析为115.159.201.119(若是非权威解析为该结果证明解析还存在问题,需要更改/etc/resolv.conf中的服务器地址,添加你买的域名服务器地址),解析成功后,发现通过IP可以访问,但是通过域名不能访问,终于发现时tomcat的问题

在这里插入图片描述

​​3. RSA简单加密与解密

import java.io.*;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;


public class RSADemo {
    /*
     * 产生秘钥
     */
    public static void generateKey() {
        try {
            // 指定算法
            KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
            // 确定密钥大小
            kpg.initialize(1024);
            // 产生密钥对
            KeyPair kp = kpg.genKeyPair();
            // 获取公钥
            PublicKey publicKey = kp.getPublic();
            // 获取私钥
            PrivateKey privateKey = kp.getPrivate();

            // 保存公钥
            FileOutputStream f1 = new FileOutputStream("publicKey.dat");
            ObjectOutputStream o1 = new ObjectOutputStream(f1);
            o1.writeObject(publicKey);
            o1.close();
            f1.close();

            // 保存私钥
            FileOutputStream f2 = new FileOutputStream("privateKey.dat");
            ObjectOutputStream o2 = new ObjectOutputStream(f2);
            o2.writeObject(privateKey);
            o2.close();
            f2.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*
     * 加密
     */
    public static void encrypt() {
        // 明文
        String s = "Hello World!";
        try {
            // 获取公钥及参数e,n
            FileInputStream f = new FileInputStream("publicKey.dat");
            ObjectInputStream oos = new ObjectInputStream(f);
            RSAPublicKey publicKey = (RSAPublicKey) oos.readObject();
            BigInteger e = publicKey.getPublicExponent();
            BigInteger n = publicKey.getModulus();
            System.out.println("参数e= " + e);
            System.out.println("参数n= " + n);

            // 获取明文
            byte[] content = s.getBytes("UTF-8");
            BigInteger m = new BigInteger(content);

            // 计算密文
            BigInteger c = m.modPow(e, n);
            System.out.println("密文为:" + c);

            // 保存密文
            String c1 = c.toString();
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream("encrypt.dat")));
            out.write(c1, 0, c1.length());
            out.close();//一定要记得关闭,否则会出现空指针异常
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void decrypt() {
        try {
            // 读取密文
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    new FileInputStream("encrypt.dat")));
            String content = br.readLine();
            BigInteger c = new BigInteger(content);
            // 读取私钥
            FileInputStream f1 = new FileInputStream("privateKey.dat");
            ObjectInputStream o1 = new ObjectInputStream(f1);
            RSAPrivateKey privateKey = (RSAPrivateKey) o1.readObject();
            // 获取私钥参数及解密
            BigInteger d = privateKey.getPrivateExponent();
            BigInteger n = privateKey.getModulus();
            System.out.println("参数d=" + d);
            System.out.println("参数n=" + n);
            BigInteger m = c.modPow(d, n);

            // 显示解密结果
            byte[] mt = m.toByteArray();
            for (int i = 0; i < mt.length; i++) {
                System.out.print((char) mt[i]);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        try {
            generateKey();
            encrypt();
            decrypt();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

4. DES对称密码体系加密解密

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;


public class DESDemo {

    /*
     * 将字节数组转换为十六进制字符串
     */
    public static String byteToHexString(byte[] bytes) {
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < bytes.length; i++) {
            String string = Integer.toHexString(0XFF & bytes[i]);
            if (string.length() == 1) { // 十六进制占四个字节,
                stringBuffer.append(0);
            }
            stringBuffer.append(string.toUpperCase());
        }
        return stringBuffer.toString();
    }

    /*
     * 加密方法
     */
    public static byte[] DES_CBC_Encrypt(byte[] content, byte[] keyBytes) {
        try {
            // 创建一个 DESKeySpec 对象,使用 key 中的前 8 个字节作为 DES 密钥的密钥内容
            DESKeySpec keySpec = new DESKeySpec(keyBytes);
            // 返回转换指定算法的秘密密钥的 SecretKeyFactory 对象
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            // 根据提供的密钥规范(密钥材料)生成 SecretKey 对象。
            SecretKey key = keyFactory.generateSecret(keySpec);

            // 返回实现指定转换的 Cipher 对象。
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            // 用密钥和一组算法参数初始化此 Cipher。
            cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(keySpec.getKey()));
            // 按单部分操作加密数据
            byte[] result = cipher.doFinal(content);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /*
     * 解密方法
     */
    public static byte[] DES_CBC_Decrypt(byte[] content, byte[] keyBytes) {
        try {
            DESKeySpec keySpec = new DESKeySpec(keyBytes);
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey key = keyFactory.generateSecret(keySpec);

            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(keyBytes));
            byte[] result = cipher.doFinal(content);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    public static void main(String[] args) {
        String content = "aaaaaaaabbbbbbbbaaaaaaaa";
        String key = "01234567";

        System.out.println("加密前:" + byteToHexString(content.getBytes()));
        byte[] encrypted = DES_CBC_Encrypt(content.getBytes(), key.getBytes());
        System.out.println("加密后:" + byteToHexString(encrypted));
        byte[] decrypted = DES_CBC_Decrypt(encrypted, key.getBytes());
        System.out.println("解密后:" + byteToHexString(decrypted));
    }
}

5. 基于TCP的客户端与服务器端之间的通信

使用说明:把服务器IP地址更改为自己的服务器主机IP地址即可

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JFrame;

public class Chat extends JFrame implements Runnable, ActionListener {

	private Panel topPanel_1, downPanel_1, midPanel_left, midPanel_right;
	private Label ipLabel, localNameLabel;
	private TextField ipTextField, localNameField;
	private Button createServer, searchServer, sendMessage;
	private TextArea text1, text2, text3, text4;
	private ServerSocket server;
	private Socket serverSocket, clientSocket;
	private DataOutputStream outputFromClient, outputFromServer;
	private DataInputStream inputToClient, inputToServer;
	private int scan = 2;// scan:便于区分0客户端与1服务器端的文本内容
	private int lock=0;//0:创建服务器  1:停止服务器
	/***************************** 获取主机IP 与 名称 ******************************/
	public String getIp() {
		String ip = null;
		try {
			InetAddress myLocalHost = InetAddress.getLocalHost();
			ip = myLocalHost.getHostAddress();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		return ip;
	}

	public String getName() {
		String name = null;
		try {
			InetAddress myLocalHost = InetAddress.getLocalHost();
			name = myLocalHost.getHostName();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		return name;
	}

	/***************************** 事件监听 *****************************/
	public void message() {
		createServer.addActionListener(this);
		searchServer.addActionListener(this);
		sendMessage.addActionListener(this);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == createServer && lock==0) {
			text3.setText("");
			text3.append("服务器名称为:" + getName() + "\n");
			text3.append("服务器IP为:" + getIp() + "\n");
			text3.append("端口号为:6666\n");
			text3.append("服务器已经启动,正在监听.......\n");
			this.startServer();
			scan=1;
		} else if(e.getSource() == createServer && lock==1){
			try {
				serverSocket.close();
				text3.setText("");
				text3.append("服务器关闭成功");
				lock=0;
			} catch (IOException e1) {
				text3.append("服务器关闭异常");
				e1.printStackTrace();
			}			
		}else if (e.getSource() == searchServer) {
			text4.setText("");
			text4.append("正在搜索服务器,请稍等.....\n");
			this.startClient();
			scan=0;
		} else if (e.getSource() == sendMessage) {
			if (scan == 1) {// 服务器端
				try {
					outputFromServer = new DataOutputStream(
							serverSocket.getOutputStream());
					String name = getName();
					if (text2.getText().length() > 0) {
						text1.append(name + "说:   " + text2.getText()
								+ "\n");
						outputFromServer.writeUTF(this.getName()+","+text2.getText());// 写入消息
						text2.setText("");
					} else {
						text2.setText("\n\n请输入内容\n\n");
						Thread.sleep(1000);
						text2.setText("");
					}
				} catch (InterruptedException | IOException e1) {
					e1.printStackTrace();
				}
			} else if (scan == 0 ) {// 客户端
				try {
					outputFromClient = new DataOutputStream(
							clientSocket.getOutputStream());
					String name = getName();
					if (text2.getText().length() > 0 ) {
						text1.append(name + "说:   " + text2.getText()+ "\n");
						outputFromClient.writeUTF(this.getName()+","+text2.getText());// 写入消息
						text2.setText("");
					} else if(text2.getText().length() <= 0) {
						text2.setText("\n\n请输入内容\n\n");
						Thread.sleep(1000);
						text2.setText("");
					}
				} catch (InterruptedException | IOException e1) {
					e1.printStackTrace();
				}
			}
		}
	}

	/***************************** 启动服务器 *************************************/
	public void startServer() {
		try {
			if(lock==0){
				server = new ServerSocket(6666);
				serverSocket = server.accept();
				createServer.setLabel("停止服务器");
				lock=1;
			}
		} catch (IOException e) {
			text3.setText("");
			text3.append("服务器启动错误,请重新设置后启动!\n可能是由于:\n");
			text3.append("1.端口被占用。\n");
			text3.append("2.服务器已经启动。\n");
			e.printStackTrace();
		}
	}

	/***************************** 启动客户端 *************************************/
	public void startClient() {
		try {
			clientSocket = new Socket("192.168.31.125",6666);//更改为自己服务器主机的IP地址即可
			text4.append("连接成功 ");
			searchServer.setLabel("断开连接");
		} catch (Exception e) {
			text4.append("无法连接网络");
			e.printStackTrace();
		}
	}

	/******************************* 对话内容互相显示 *****************************/
	public void messageDisplay() throws IOException {
		// 接收消息
		if (scan == 1) {// 客户端
			inputToClient = new DataInputStream(serverSocket.getInputStream());
			String receive = inputToClient.readUTF();
			String[] message=receive.split(",");
			text1.append(message[0]+"说:   "+message[1]+"\n");
		}else if(scan == 0){//服务器端
			inputToServer = new DataInputStream(clientSocket.getInputStream());
			String receive = inputToServer.readUTF();
			String[] message=receive.split(",");
			text1.append(message[0]+"说:   "+message[1]+"\n");
		}
	}

	/***************************** 创建主界面 *************************************/
	private void launchFrame() {
		// /上面部分/
		topPanel_1 = new Panel();
		ipLabel = new Label("IP地址");// 标签
		ipTextField = new TextField(getIp(), 19);
		localNameLabel = new Label("本机名称");
		localNameField = new TextField(getName(), 19);
		createServer = new Button("创建服务器");
		searchServer = new Button("搜索服务器");

		// /中部部分/
		midPanel_left = new Panel();
		midPanel_right = new Panel();
		text1 = new TextArea(20, 68);
		text2 = new TextArea(3, 68);
		text3 = new TextArea(14, 25);
		text4 = new TextArea(9, 25);

		// /底部部分/
		downPanel_1 = new Panel();
		sendMessage = new Button("发送");

		topPanel_1.add(ipLabel);// 加入面板
		topPanel_1.add(ipTextField);
		topPanel_1.add(localNameLabel);
		topPanel_1.add(localNameField);
		topPanel_1.add(createServer);
		topPanel_1.add(searchServer);

		midPanel_left.setLayout(new BorderLayout());
		midPanel_right.setLayout(new BorderLayout());
		midPanel_left.add(text1, BorderLayout.NORTH);
		midPanel_left.add(text2, BorderLayout.SOUTH);
		midPanel_right.add(text3, BorderLayout.NORTH);
		midPanel_right.add(text4, BorderLayout.SOUTH);

		downPanel_1.add(sendMessage);

		Container container = getContentPane();// 布局管理器
		container.setLayout(new BorderLayout());// 布局声明
		container.add(topPanel_1, BorderLayout.NORTH);
		container.add(midPanel_left, BorderLayout.CENTER);
		container.add(midPanel_right, BorderLayout.EAST);
		container.add(downPanel_1, BorderLayout.SOUTH);
		this.pack();// 调整此窗口的大小,以适合其子组件的首选大小和布局。
		setSize(700, 500);// 设置面板宽与高
		setTitle("点星光聊天");// 设置标题
		setResizable(false);// 大小不可变
		setVisible(true);// 设置面板可见
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 关闭时释放资源
	}

	public static void main(String[] args) throws IOException {
		Chat chat = new Chat();
		chat.launchFrame();
		chat.message();
		while(true){
			chat.messageDisplay();
		}
	}

	@Override
	public void run() {
		// TODO 自动生成的方法存根

	}
}

6. 红蓝按钮交替移动

编写一个应用程序,除了主线程外,还有两个线程:first和second。first负责模拟一个红色的按钮从坐标(10,60)运动到(100,60);second负责模拟一个绿色的按钮从坐标(100,60)运动到(200,60)。另外还有一个start按钮,当点击start按钮后,红色按钮平行移动从左边移动到右边,当红色按钮移动到绿色按钮位置后,红色按钮停止在绿色按钮起始位置,然后绿色按钮接着移动。当绿色按钮移动到指定位置后,所有按钮位置重置,然后循环执行上述过程。

public class MoveButton extends JFrame implements Runnable, ActionListener {

    private int distance = 10;
    Thread first, second;
    Button redButton, greenButton, startButton;

    public MoveButton() {

        /*
         * 创建线程
         */
        first = new Thread(this);
        second = new Thread(this);
        setLayout(null); // 清除默认布局


        /*
         * 设置红色按钮的颜色
         * 设置起始位置与大小
         * 加入窗体
         */
        redButton = new Button();
        redButton.setBackground(Color.red);
        redButton.setBounds(10, 60, 15, 15);
        add(redButton);

        /*
         * 设置红色按钮的颜色
         * 设置起始位置与大小
         * 加入窗体
         */
        greenButton = new Button();
        greenButton.setBackground(Color.green);
        greenButton.setBounds(100, 60, 15, 15);
        add(greenButton);
        /*
         * 设置开始按钮的起始位置与大小
         * 添加监听器
         * 加入窗体
         */
        startButton = new Button("start");
        startButton.addActionListener(this);
        startButton.setBounds(10, 100, 30, 30);
        add(startButton);
        setBounds(0, 0, 300, 200);// 设置窗体的起始位置与长宽
        setVisible(true);// 设置窗体可见

        /*
         * 关闭窗时释放内存资源
         */
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    /*
     * 实现按钮的移动
     * synchronized 方法控制对类成员变量的访问
     */

    private synchronized void moveComponent(Button button) {
        if (Thread.currentThread() == first) {
            while (distance > 100 && distance <= 200) {
                try {
                    wait();
                    System.out.println("你好");//线程等待,直到其他线程调用notify或notifyAll方法通知该线程醒来
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            distance += 1;
            button.setLocation(distance, 60);
            if (distance >= 100) {
                if (distance <= 200) {
                    button.setLocation(100, 60);//在蓝色按钮运动期间红色按钮始终位于蓝色按钮最初位置
                } else {
                    button.setLocation(10, 60);//当距离移动距离大于200时,蓝色按钮归位
                }

                notify();//唤醒单个等待的线程(由于约束条件的存在,此程序中势必只有一个等待的线程,故可用此方法替换)
                //notifyAll();//唤起全部等地的线程
            }
        }

        if (Thread.currentThread() == second) {
            while (distance >= 10 && distance < 100) {
                try {
                    wait();//线程等待,直到其他线程调用notify或notifyAll方法通知该线程醒来
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            distance += 1;
            button.setLocation(distance, 60);
            if (distance > 200) {
                button.setLocation(100, 60);//当距离移动距离大于200时,蓝色按钮归位
                distance = 10;//distance置初值
                notify();//
            }
        }
    }


    public void run() {
        while (true) {
            /*
             * 判断当前执行的线程是否为first
             * 如果是,调用moveComponent()方法,移动redButton
             * 线程睡眠20ms
             */
            if (Thread.currentThread() == first) {
                moveComponent(redButton);
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            /*
             * 判断当前执行的线程是否为second
             * 如果是,调用moveComponent()方法,移动greenButton
             * 线程睡眠10ms
             */
            if (Thread.currentThread() == second) {
                moveComponent(greenButton);
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /*
     * 事件监听,启动线程(由于只对startButton按钮绑定监听器,所以默认监听该按钮)
     */
    public void actionPerformed(ActionEvent e) {
        try {
            first.start();//启动线程
            second.start();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new MoveButton();
    }
}

7. JAVA根据指定URL生成二维码

public class QrCodeUtil {
    public static void main(String[] args) {
        String url = "https://www.baidu.com";
        String path = FileSystemView.getFileSystemView().getHomeDirectory() + File.separator + "testQrcode";
        String fileName = "temp.jpg";
        createQrCode(url, path, fileName);
    }

    public static String createQrCode(String url, String path, String fileName) {
        try {
            Map<EncodeHintType, String> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
            BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, 400, 400, hints);
            File file = new File(path, fileName);
            if (file.exists() || ((file.getParentFile().exists() || file.getParentFile().mkdirs()) && file.createNewFile())) {
                writeToFile(bitMatrix, "jpg", file);
                System.out.println("搞定:" + file);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {
        BufferedImage image = toBufferedImage(matrix);
        if (!ImageIO.write(image, format, file)) {
            throw new IOException("Could not write an image of format " + format + " to " + file);
        }
    }

    static void writeToStream(BitMatrix matrix, String format, OutputStream stream) throws IOException {
        BufferedImage image = toBufferedImage(matrix);
        if (!ImageIO.write(image, format, stream)) {
            throw new IOException("Could not write an image of format " + format);
        }
    }

    private static final int BLACK = 0xFF000000;
    private static final int WHITE = 0xFFFFFFFF;

    private static BufferedImage toBufferedImage(BitMatrix matrix) {
        int width = matrix.getWidth();
        int height = matrix.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
            }
        }
        return image;
    }
}

8. ElementPlus中el-select在IOS中无法唤醒软件盘解决方案

项目基于Vue3 + ElementPlus1.3

在main.js代码中

import ElementPlus from 'element-plus'
/* eslint-disable no-new */
window.$vueApp = Vue.createApp(App)
// 给组件每个生命周期,都混入一些公共逻辑, 解决IOS el-select无法唤醒软件盘问题
window.$vueApp.mixin({
  mounted () {
    if (typeof this.$el.className === 'string') {
      if (this.$el.className.split(' ').indexOf('el-select') !== -1) {
        this.$el.children[0].children[0].children[0].removeAttribute('readOnly')
        this.$el.children[0].children[0].children[0].onblur = function () {
          let _this = this
          setTimeout(() => {
            _this.removeAttribute('readOnly')
          }, 200)
        }
      }
    }
  }
})
window.$vueApp.use(ElementPlus)

9. JAVA流实现文件批量打包下载

    @ResponseBody
    public void downloadFiles(HttpServletRequest request, HttpServletResponse response, String[] filePaths) {
        if (filePaths == null || filePaths.length <= 0) {
            return ;
        }

        // 设置响应头
        response.reset();
        response.setCharacterEncoding("utf-8");
        response.setContentType("multipart/form-data");

        // 设置压缩包名称及不同浏览器中文乱码处理
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        LocalDateTime localDateTime = LocalDateTime.now();
        String filename = "电子合同" + formatter.format(localDateTime) + ".zip";

        String agent = request.getHeader("AGENT");
        try {
            if (agent.contains("MSIE") || agent.contains("Trident")) {
                    filename = URLEncoder.encode(filename, "UTF-8");
            } else {
                filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        response.setHeader("Content-Disposition", "attachment;filename=\"" + filename  + "\""); // key不区分大小写
        
        try {
            // 设置压缩流,直接写入response,实现边压缩边下载
            ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
            zipOutputStream.setMethod(ZipOutputStream.DEFLATED);

            DataOutputStream dataOutputStream = null;
            for (String filePath : filePaths) {
                String subFilename = formatter.format(LocalDateTime.now()) + filePath.substring(filePath.lastIndexOf("/") + 1);
                zipOutputStream.putNextEntry(new ZipEntry(subFilename));

                dataOutputStream = new DataOutputStream(zipOutputStream);
                BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(new File(filePath)));
                byte[] buf = new byte[8192];
                int length = 0;

                while ((length = bufferedInputStream.read(buf)) != -1) {
                    dataOutputStream.write(buf, 0 , length);
                }
                dataOutputStream.flush();
                // dataOutputStream.close(); 若在此关闭,对应资源zipOutputStream也将关闭,则压缩包内仅有一个文件
                bufferedInputStream.close();
                zipOutputStream.closeEntry();
            }

            dataOutputStream.flush();
            dataOutputStream.close();
            zipOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

10. Windows10强制停止Vmmem

wsl --shutdown

11. Windows10强制删除占用端口的进程

# 查看占用端口8082的进程
netstat -ano|findstr 8082

# 强制删除进程20380及子进程
taskkill /T /F /PID 20380

12. PostgreSQL强制删除数据库

12.1 设置数据库为禁止连接

UPDATE pg_database 
SET datallowconn = 'false' 
WHERE datname = 'db_name';

12.2 中断当前库中所有连接会话

SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = 'db_name';

12.3 删除数据库

drop database db_name;

13. 基于seaborn的正太分布图

import matplotlib.pyplot as plt
import seaborn as sns 

# rating_df类型为pandas
sns.kdeplot(rating_df['rating_our'],  fill=True,  shade=True, bw=0.8, color='#FA705C')
sns.kdeplot(rating_df['rating_customer'],  fill=True,  shade=True, bw=0.8, color='red')
plt.show()

14. 微信小程序文件下载两种方式

14.1 基本url方式下载(自定义下载文件名称)

  downloadDailyYear: function() {
    util.get(api.downloadDailyYear).then(function(res) { // 自定义get请求,可忽略
      if (res.code == 200) {
        var fileName = res.data.substring(res.data.lastIndexOf("/") + 1, res.data.indexOf("."));
        wx.downloadFile({
          url: api.appUrl + res.data,     
          // 1. 必须带有这个wx.env.USER_DATA_PATH,表示存储在用户本地 !!!
          // fileName表示自定的文件名称
          // 实际在PC端调试存储位置为类似 C:\Users\SJshe\AppData\Local\微信开发者工具\User Data\WeappFileSystem\o6zAJs3c0u3SeBVn_9MUgG6UZJ1M\wx2efdf4edd8bccb88
          filePath: wx.env.USER_DATA_PATH + "/" + fileName,
          success: function (res) {
            if (res.statusCode === 200) {
              wx.openDocument({
                filePath: res.filePath,
                fileType: ['xlsx'], // 2. 这个必须写合法类型,不然下载不了(个人认为官方应该特别说明) !!!
                success: function (res) {
                  console.log('打开文档成功')
                },
                fail: function(e) {
                  console.log(e.errMsg);
                }
              })
            }
          },
          fail: function(e) { // 强烈建议打印失败原因,便于排查
            console.log(e.errMsg);
          }
        });
      }
    });
  },

14.2 基于后台返回流的方式下载

@GetMapping(value = "/downloadDailyYear")
public BaseResponse<byte[]> downloadDailyYear(HttpSession session, @RequestParam String id, 
		@RequestParam @DateTimeFormat(iso = ISO.DATE) Date startDate, 
		@RequestParam @DateTimeFormat(iso = ISO.DATE) Date endDate) {
}
public class BaseResponse<T> {
    private String code;
    private String message;
    private T data;
    ...
}
downloadDailyYear: function () {
    var name = '';
    wx.getStorage({
      key: 'userInfo',
      success(res) {
        name += res.data.name + res.data.employeeNo;
      }
    })
    
    var year = new Date().getFullYear();
    util.get(api.downloadDailyYear, {
      'id': wx.getStorageSync('userId'),
      'startDate': year + "-" + "01-01", 
      'endDate': year + "-" + "12-31"
    }).then(function (res) {
      if (res.code == 200) {
      	// 1. 必须带有这个wx.env.USER_DATA_PATH,表示存储在用户本地 !!!
        var filePath = wx.env.USER_DATA_PATH + '/' + year + '工作周报-' + name;
        FileSystemManager.writeFile({
          filePath: filePath,
          data: res.data,
          encoding: 'base64', // 2. base64解密写入, 后台返回的byte[]数组是经过base64编码的,其他方式写入文件打开格式不对
          success: function(res) {
            wx.openDocument({
              filePath: wx.env.USER_DATA_PATH + '/' + year + '工作周报-' + name,
              fileType: ['xlsx'], // 3. 这个必须写合法类型,不然下载不了 !!!
              success: function (res) {
                console.log('打开文档成功')
              },
              fail: function (e) {
                console.log(e.errMsg);
              }
            })
          },
          fail: function (e) {
            console.log(e.errMsg);
          }
        });
      }
    });
  },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1851553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络安全学习】使用Kali做信息收集-02-<指纹识别目录扫描>

1.指纹识别 指纹识别是指通过一些特征或特定文件来识别目标网站或系统的类型、版本、组件等信息&#xff0c;以便寻找相应的漏洞或攻击方法。 主动指纹识别 通过向目标系统发送正常和异常的请求以及对文件内容的查找&#xff0c;记录响应方式&#xff0c;然后与指纹库进行对比…

C++进阶之AVL树

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 C进阶​ ​​​​算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.前言 二.插入 三.旋转 3.1右旋 …

代码随想录——分发饼干(Leetcode455)

题目链接 贪心 class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int count 0;for(int i 0, j 0; i < g.length && j < s.length; i, j){if(s[j] > g[i]){count;}else{i--;}}return count;} }

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法(以太网)

通过InoDriverShop伺服调试软件连接汇川SV660F系列伺服的具体方法(以太网) 具体连接伺服驱动器的步骤可参考以下内容: 启动InoDriverShop, 新建或打开工程 如下图所示,选择在线,选中SV660F图标,右侧通信类型选择“TCP—DCP”,点击下一步,同时要选择自己当前使用的网卡…

棉花叶子病害分类数据集3601张6类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;3601 分类类别数&#xff1a;6 类别名称:[“aphids”,“army_worm”,“bact…

SpringBoot + Vue 实现 AES 加密和 AES 工具类总结

目录 一、加密知识回顾 AES加密模式 二、Java 自定义 AES 工具类 三、SpringBoot 实现 AES 加密登陆 controller 层 server 层 四、Vue 实现 AES 加密登陆 五、前端AES工具类 六、实现结果 一、加密知识回顾 密钥是AES算法实现加密和解密的根本。对称加密算法之所以…

JDK17特性

JDK17特性 一、JAVA17概述 JDK 16 刚发布半年(2021/03/16),JDK 17 又如期而至(2021/09/14),这个时间点特殊,蹭苹果发布会的热度?记得当年 JDK 15 的发布也是同天。 Oracle 宣布,从 JDK 17 开始,后面的 JDK 带附加条款免费提供!!!Java 17+ 可以免费使用了,包括商…

当Windows台式电脑或笔记本电脑随机关机时,请先从这8个方面检查

序言 你的Windows笔记本电脑或PC是否意外关闭?笔记本电脑电池故障、电源线松动、过热、电源设置错误、驱动程序过时或电脑组件故障等问题都可能是罪魁祸首。如果你对这个问题感到沮丧,试试这些解决方案。 进行一些初步检查 与从电池中获取电力的笔记本电脑不同,台式电脑依…

Vue3 + TS + Antd + Pinia 从零搭建后台系统(四) ant-design-vue Layout布局,导航栏,标签页

书接上回本篇主要介绍&#xff1a; Layout布局&#xff0c;导航栏&#xff0c;标签页继续填充目录 按需引入组件Layout布局&#xff0c;导航栏&#xff0c;标签页css样式 按需引入组件 使用unplugin-vue-components插件完成ant-design-vue组件的按需加载。 前文中已处理过&…

调试器烧录失败的几种常见解决办法

目录 1. 检查接线、Keil配置是否正确 2. 降低下载速度 3. SWD引脚被禁用或被复用为其他功能 4. 使用CubeMX生成的工程&#xff0c;无法调试&#xff1f; 5. 能识别到芯片但是下载时弹出报错对话框&#xff08;Command not supported&#xff09; 6. 内部flash锁死&#x…

媒体邀约中媒体采访应该如何做?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 在媒体邀约中&#xff0c;媒体采访应该遵循以下几个步骤和…

用户态协议栈05—架构优化

优化部分 添加了in和out两个环形缓冲区&#xff0c;收到数据包后添加到in队列&#xff1b;经过消费者线程处理之后&#xff0c;将需要发送的数据包添加到out队列。添加数据包解析线程&#xff08;消费者线程&#xff09;&#xff0c;架构分层 #include <rte_eal.h> #inc…

ionic7 从安装 到 项目启动最后打包成 apk

报错处理 在打包的时候遇到过几个问题&#xff0c;这里记录下来两个 Visual Studio Code运行ionic build出错显示ionic : 无法加载文件 ionic 项目通过 android studio 打开报错 capacitor.settings.gradle 文件不存在 说明 由于之前使用的是 ionic 3&#xff0c;当时打包的…

模式分解的概念(上)-分解、无损连接性、保持函数依赖特性

一、分解的概念 1、分解的定义 2、判断一个关系模式的集合P是否为关系模式R的一个分解 只要满足以下三个条件&#xff0c;P就是R的一个分解 &#xff08;1&#xff09;P中所有关系模式属性集的并集是R的属性集 &#xff08;2&#xff09;P中所有不同的关系模式的属性集之间…

【计算机网络体系结构】计算机网络体系结构实验-DHCP实验

服务器ip地址 2. 服务器地址池 3. 客户端ip 4. ping Ipconfig

星闪指向遥控,做家电交互的破壁人

“面壁者罗辑&#xff0c;我是你的破壁人。” 科幻小说《三体》中&#xff0c;当人类的基础科学被三体人封锁&#xff0c;变得停步不前&#xff0c;人类启动了自救的面壁计划&#xff0c;通过一次又一次破壁&#xff0c;找到战胜三体人的办法。 现实中&#xff0c;有一点已经成…

教师数字素养标准

老师们有没有想过如何让自己的课堂更加生动、互动&#xff0c;甚至超越传统的教学模式&#xff1f;是否思考过&#xff0c;数字技术如何成为我们教学的得力助手&#xff0c;让我们的课堂焕发出新的活力&#xff1f; 数字素养&#xff0c;这个听起来充满科技感的词汇&#xff0c…

Github上传大于100M的文件(ubuntu教程)

安装Git-lfs Git Large File Storage (LFS) 使用 Git 内部的文本指针替换音频样本、视频、数据集和图形等大文件&#xff0c;同时将文件内容存储在 GitHub.com 或 GitHub Enterprise 等远程服务器上。官网下载&#xff1a;https://git-lfs.github.com/ ./install.sh上传 比如…

软银CEO孙正义:10年内将出现比人类聪明1万倍的人工智能|TodayAI

2024年6月20日&#xff0c;软银集团公司&#xff08;SoftBank&#xff09;董事长兼首席执行官孙正义在日本东京举行的公司年度股东大会上发表讲话&#xff0c;表示比人类聪明1万倍的人工智能将在10年内出现。这是他近年来一次罕见的公开露面&#xff0c;在会上他质疑了自己的人…