1.加解密
    可以把明文转为密文

    1. 加密规则:数字自动加一<br /> 真实传递:1234:明文<br /> 传输:2345(密文)--接收-解析:1234<br /> 拜见过阿妈啦?(密文)(你从小拜谁为师?-明文)
    2. 1.编码格式<br /> Base64、Base64URL<br /> 特点:可以编码,也可以解码<br /> Encoder(编码-加密)/Decoder(解码-解密)<br /> 2.摘要算法<br /> 按照一定算法规则,将明文生成摘要(密文)<br /> 特点:自有加密没有解密,不可逆<br /> 常见的摘要算法:1.MD5 2.SHA 3.HMAC<br /> 摘要算法不可逆,只能加不能解<br /> 3.加解密算法<br /> 可以加密,也可以解密<br /> 又分为2类,根据密钥的类型<br /> 1.对称加解密<br /> 加密和解密使用一个密钥<br /> 典型算法:AES<br /> 2.非对称加解密<br /> 加密和解密使用一对儿密钥(公钥和私钥)<br /> 公钥加密必须使用私钥解密<br /> 私钥加密必须使用公钥解密<br /> 如果同一个字符串的密文必须一样,那么应该私钥加密,公钥解密<br /> 如果同一个字符串的密文允许不一样,那么就需要公钥加密,私钥解密<br /> <br /> 典型算法:RSA<br /> 带一个封装好工具类,走哪带哪<br />加密工具类
    package com.qyz.common.util;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.*;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.Base64;
    import java.util.HashMap;
    
    /**
     * 实现常用的加解密 方法,支持 SHA AES RSA Base64
     * @program: HungryApi
     * @description: 常用的加解密
     * @author: Feri(邢朋辉)
     * @create: 2020-06-19 10:01
     */
    public class EncryptUtil {
        public static final String SHA1 = "SHA-1";
        public static final String SHA256 = "SHA-256";
        public static final String SHA384 = "SHA-384";
        public static final String SHA512 = "SHA-512";
    
        public static final String PUBKEY = "public_key";
        public static final String PRIKEY = "private_key";
    
        //1、编码格式
        //base64 编码
        public static String base64enc(String msg) {
            return Base64.getEncoder ().encodeToString (msg.getBytes ());
        }
    
        private static String base64encByte(byte[] msg) {
            return Base64.getEncoder ().encodeToString (msg);
        }
    
        private static byte[] base64decByte(String msg) {
            return Base64.getDecoder ().decode (msg);
        }
    
        //
        // base64 解码
        public static String base64dec(String msg) {
            return new String (Base64.getDecoder ().decode (msg));
        }
    
        //MD5 摘要
        public static String md5(String msg) {
            try {
                //创建摘要算法对象
                MessageDigest messageDigest = MessageDigest.getInstance ("MD5");
                messageDigest.update (msg.getBytes ());
                return base64encByte (messageDigest.digest ());
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace ();
            }
            return null;
        }
    
        //SHA 摘要 SHA-1 SHA-256 SHA-384 SHA-512
        public static String sha(String type, String msg) {
            try {
                //创建摘要算法对象
                MessageDigest messageDigest = MessageDigest.getInstance (type);
                messageDigest.update (msg.getBytes ());
                return base64encByte (messageDigest.digest ());
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace ();
            }
            return null;
        }
    
        //创建 对称加密---密钥
        public static String createAESKey() {
            try {
                //1、创建随机key
                KeyGenerator generator = KeyGenerator.getInstance ("AES");
                generator.init (128);
                SecretKey key = generator.generateKey ();
                return base64encByte (key.getEncoded ());
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace ();
            }
            return null;
        }
        //AES 加密 返回的是base64格式
        public static String aesenc(String key, String msg) {
            SecretKeySpec secretKeySpec = new SecretKeySpec (base64decByte (key), "AES");
            try {
                Cipher cipher = Cipher.getInstance ("AES");
                cipher.init (Cipher.ENCRYPT_MODE, secretKeySpec);
                return base64encByte (cipher.doFinal (msg.getBytes ()));
            } catch (Exception e) {
                e.printStackTrace ();
            }
            return null;
        }
        //AES 解密 返回的是base64格式
        public static String aesdec(String key, String msg) {
            SecretKeySpec secretKeySpec = new SecretKeySpec (base64decByte (key), "AES");
            try {
                Cipher cipher = Cipher.getInstance ("AES");
                cipher.init (Cipher.DECRYPT_MODE, secretKeySpec);
                return new String (cipher.doFinal (base64decByte (msg)));
            } catch (Exception e) {
                e.printStackTrace ();
            }
            return null;
        }
    
        //创建-RSA 密钥 一对儿 公私钥
        public static HashMap<String, String> createRSAKey() {
            try {
                KeyPairGenerator generator = KeyPairGenerator.getInstance ("RSA");
                KeyPair keyPair = generator.generateKeyPair ();
                //创建使用私钥
                RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate ();
                //创建使用公钥
                RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic ();
                HashMap<String, String> keys = new HashMap<> ();
                keys.put (PUBKEY, base64encByte (publicKey.getEncoded ()));
                keys.put (PRIKEY, base64encByte (privateKey.getEncoded ()));
                return keys;
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace ();
            }
            return null;
        }
        /**
         * rsa 公钥-加密*/
        public static String rsaEncPub(String key,String msg){
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(base64decByte(key));
            try {
                KeyFactory keyFactory = KeyFactory.getInstance ("RSA");
                PublicKey publicKey = keyFactory.generatePublic (keySpec);
                Cipher cipher = Cipher.getInstance ("RSA");
                cipher.init (Cipher.ENCRYPT_MODE, publicKey);
                return base64encByte(cipher.doFinal(msg.getBytes()));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
        //RSA  私钥-加密
        public static String rsaEnc(String key, String msg) {
            try {
                //转换私钥
                PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec (base64decByte (key));
                KeyFactory keyFactory = KeyFactory.getInstance ("RSA");
                PrivateKey privateKey = keyFactory.generatePrivate (keySpec);
                Cipher cipher = Cipher.getInstance ("RSA");
                cipher.init (Cipher.ENCRYPT_MODE, privateKey);
                return  base64encByte(cipher.doFinal(msg.getBytes()));
            } catch (Exception e) {
                e.printStackTrace ();
            }
            return null;
        }
        //RSA  公钥-解密
        public static String rsaDec(String key, String msg) {
            try {
                //转换公钥
                X509EncodedKeySpec keySpec = new X509EncodedKeySpec (base64decByte (key));
                KeyFactory keyFactory = KeyFactory.getInstance ("RSA");
                PublicKey publicKey = keyFactory.generatePublic (keySpec);
                Cipher cipher = Cipher.getInstance ("RSA");
                cipher.init (Cipher.DECRYPT_MODE, publicKey);
                return new String (cipher.doFinal (base64decByte (msg)), "UTF-8");
            } catch (Exception e) {
                e.printStackTrace ();
            }
            return null;
        }
        /**
         * RSA  私钥-解密
         */
        public static String rsaDecPri(String key, String msg) {
            try {
                //转换私钥
                PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec (base64decByte (key));
                KeyFactory keyFactory = KeyFactory.getInstance ("RSA");
                PrivateKey privateKey = keyFactory.generatePrivate (keySpec);
                Cipher cipher = Cipher.getInstance ("RSA");
                cipher.init (Cipher.DECRYPT_MODE, privateKey);
                return new String(cipher.doFinal(base64decByte(msg)),"UTF-8");
            } catch (Exception e) {
                e.printStackTrace ();
            }
            return null;
        }
    }
    
    [https://www.hutool.cn/](https://www.hutool.cn/)<br />2.Docker<br />    Docker:容器化引擎,新型的虚拟机,具备更快的性能,简化<br />    特点:<br />        1.更高效资源使用率<br />        2.性能卓越,时间短<br />        3.一致的环境(研发、测试、生产)<br />        4.可以部署CI&CD(持续集成持续部署)<br />    概念:<br />        1.镜像:安装包,一套软件集合<br />        2.容器:通过镜像安装的软件<br />        3.数据卷:容器所需要的磁盘,虚拟的<br />        4.网络:容器可以有网络<br />        5.仓库:存储镜像的地方<br />    云平台的轻量级应用服务器,可以直接选择Docker镜像,就无需再次安装,默认安装且已启动<br />    如果服务器不带Docker,需要手动安装<br />    <br />    <br />3.Docker常用命令<br />    docker images:查看本地的镜像列表<br />    docker search 镜像名称:搜索镜像是否存在<br />    docker pull 镜像名称:版本号:下载镜像<br />    docker rmi 镜像名称:版本号:删除镜像<br />    docker create :创建容器<br />    docker start 容器名称:启动容器<br />    docker stop 容器名称:停止容器<br />    docker rm 容器名称:删除容器<br />    docker restart 容器名称:重启容器<br />    docker ps -a:查看所有容器<br />    docker ps :查看运行中的容器<br />    docker run:运行容器,如果容器不存在就创建,如果镜像不存在就下载<br />    docker logs 容器名称:查看容器的运行日志<br />    docker exec -it 容器名称 bash:进入到容器内部<br />    docker inspect 容器名称:查看容器的详细信息<br />    <br />    
    

    4.Docker配置环境
    1.安装Tomcat
    1.创建映射文件夹
    发布项目,就发布到本文件夹下面
    mkdir -p /docker/tomcat/webapp8081
    2.创建容器并启动
    docker run -d —name tomcat8081 -p 8081:8080 -v /docker/tomcat/webapp8081:/usr/local/tomcat/webapps/ tomcat:9.0.33
    解释参数:
    -d:后台运行,不会占用主窗口
    —name:为容器起个名,名称唯一
    -p:设置内外端口号,外部端口:软件本身的端口
    -v:设置磁盘映射,外部真实存在的路径:虚拟机内部路径(路径不能随便写)
    3.访问测试
    http://49.235.88.52:8081/
    2.Docker搭建Mysql
    1.执行如下命令
    docker run -d —name mysql3307 -e MYSQL_ROOT_PASSWORD=zzjava -p 3307:3306 mysql:5.7
    参数说明:
    -d:后台运行,不会占用主窗口
    —name:为容器起个名,名称唯一
    -p:设置内外端口号,外部端口:软件本身的端口
    -e:设置额外的参数,主要设置root的密码
    2.连接测试
    主机:49.235.88.52
    端口号:3307
    账号:root
    密码:zzjava
    3.Docker搭建Redis
    1.创建文件夹,执行如下命令:
    mkdir -p /docker/redis/redis6380
    2.上传Redis的配置文件
    修改:
    1.取消本机访问
    2.设置访问密码
    上传到/docker/redis/redis6380
    3.执行如下命令,创建Redis容器并启动
    docker run -d —name redis6380 -p 6380:6379 -v /docker/redis/redis6380/redis.conf:/etc/redis/redis.conf redis:6.2.1 redis-server /etc/redis/redis.conf
    4.访问测试
    主机:49.235.88.52
    端口号:6380
    密码:zzjava

    给你一台服务器,你可以把项目部署成功!

    明天任务:
    1.团队项目收尾
    1.源码完成编写
    2.文档收集(思维导图、数据库设计文档、日报完整性)
    3.汇报PPT(1.我的团队 2.我的项目 3.核心亮点 4.项目收获 5.展望未来)
    4.上线地址(二维码)
    5.Leader为组员评分(满分10分)
    周六任务:
    1.复盘-最近学的知识点
    做成思维导图
    根据真实的情况,打个评级
    A-知识点可以在项目中应用
    B-Demo会写,项目中只能CV
    C-大概知道,会写Demo
    D-听过,代码不会
    下周讲解:
    SpringBoot
    Mybatis-Plus
    Swagger
    Lombok
    Redis
    Jedis
    写写前后端项目的后端接口

    下下周:
    Vue全家桶(Vue.js Vuex Vue-cli Vue-router Axios 地图)
    正式开工前后端分离项目(APP开发-偏向于互联网项目)