苍穹外卖学习——day02 项目日记

今日完结任务:

完善了管理端的登录功能,并实现了新增员工的接口开发。

今日收获:

1.学会了使用Git来进行项目的代码管理与版本控制。

2.nginx反向代理

将前段发送的动态请求有nginx转发到后端服务器上。之所以不通过浏览器直接请求到后端服务器,而是需要通过nginx反向代理。

  • 提高访问速度

        因为nginx本身可以缓存,如果访问的是统一接口,并且已经做了数据缓存,那么nginx可以直接返回数据,不需要再次访问服务端。

  • 进行负载均衡

        如果我们浏览器端有大量的请求,负载均衡就是把这些请求按照我们指定的方式均衡的分配给集群的每台服务器。其实就是多个服务器轮转的接收客户端的请求,减轻单个服务器的压力。

  • 保证后端服务安全

        若使用浏览器直接访问后端服务器,可能会暴露后端服务器的地址。所以要通过nginx作为请求访问的入口,请求到达nginx后转发给后端的具体服务。

3.完善登录功能——密码加密

通过spring提供的DigestUtils工具类的方法md5DigestAsHex实现。并且在数据库里也要进行加密修改。

//密码比对
        // 对前段传过来的明文密码进行md5加密处理
        password = DigestUtils.md5DigestAsHex(password.getBytes());

4.实现新增员工接口

  • Contorller层的代码:      
  • Service层实现类的代码:

  • Mapper层的代码:
/**
     * 新增员工
     * @param employee
     */
    @Insert("insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user,status) " +
            "values " +
            "(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status})")
    void insert(Employee employee);

5.通过全局异常处理(处理用户名重复的情况)

通过添加handler包中的全局异常处理类中的自定义异常处理方法来解决新增员工时输入的用户名重复的情况。主要就是在控制台中 记录下异常信息,然后创建一个返回异常的方法。


    /**
     * 处理输入的用户名重复的情况
     */
    @ExceptionHandler
    public Result exceptionHandler(SQLIntegrityConstraintViolationException ex) {
        //Duplicate entry 'zhangsan' for key 'employee.idx_username'
        String msg = ex.getMessage();
        if (msg.contains("Duplicate entry")) {
            String[] split = msg.split(" ");
            String s = split[2];
            // 用户名已存在
            String message = s + MessageConstant.ALREADY_EXISTS;
            return Result.error(message);
        } else {
            // 其他未知错误
            return Result.error(MessageConstant.UNKNOWN_ERROR);
        }
    }

6.ThreadLocal,Thread的局部变量

        ThreadLocal为每一线程提供了一个单独的存储空间,它具有线程隔离的作用,只有在同一个线程(同一个前端请求)内才可以获取到他的值。

        在多线程编程中,使用ThreadLocal可以解决线程安全的问题。比如,在一个线程池中运行了多个线程,而这些线程需要共享一个全局变量。但每个线程对这个遍历进行的是不同的更新操作,这时就可以使用ThreadLocal为每个线程提供独立的线程局部变量的变量副本。解决了多线程下的数据共享问题。

        通过ThreadLocal中的set和get方法来设置和获取线程局部变量。但是要及时的调用remove()方法来释放资源以避免内存泄漏。

public class ThreadLocalExample {

    // 定义一个 ThreadLocal 变量
    private static ThreadLocal<Integer> threadLocalValue = ThreadLocal.withInitial(() -> 0);

    public static void main(String[] args) {
        // 创建两个线程
        Thread threadA = new Thread(() -> {
            threadLocalValue.set(100); // 设置值
            System.out.println("Thread A: " + threadLocalValue.get()); // 获取值
            threadLocalValue.remove(); // 清除值
        });

        Thread threadB = new Thread(() -> {
            threadLocalValue.set(200); // 设置值
            System.out.println("Thread B: " + threadLocalValue.get()); // 获取值
            threadLocalValue.remove(); // 清除值
        });

        // 启动线程
        threadA.start();
        threadB.start();
    }
}

        通过ThreadLocal实现了表明是谁对新增员工进行了创建与修改。那么我们就需要拿到此时的token,并对他进行解析,把这值传入的线程的局部变量中。

总结:

从今天开始写了一些代码,又复习了很多知识点,学到了很多新的知识点。明天又是一天课,得抓紧点了!!

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值