苍穹外卖学习——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,并对他进行解析,把这值传入的线程的局部变量中。

总结:

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

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

苍穹外卖项目 Day3 的学习内容主要集中在菜品管理的业务逻辑上,特别是删除菜品时的相关规则与处理。具体来说,在删除菜品时,需要首先判断该菜品是否处于起售状态。如果该菜品正处于起售状态,则不允许被删除[^1]。 此外,还需要检查该菜品是否包含在某个套餐中。如果该菜品已经被包含在一个或多个套餐中,则同样不允许删除该菜品。只有在满足可以删除的情况下,才能执行删除操作,并且在删除菜品的同时,也需要删除与之相关的口味信息[^1]。 ### 删除菜品的主要步骤 1. 判断菜品是否为起售状态,起售状态的菜品不能够被删除。 2. 检查菜品是否属于一个或多个套餐的一部分,如果是,则不能删除。 3. 如果以上两个条件都不满足,则允许删除该菜品及其关联的口味数据。 这些逻辑确保了系统的数据一致性,并避免了在业务运行过程中出现不一致或错误的状态。 ### 示例代码片段 以下是一个伪代码示例,用于展示删除菜品的基本逻辑: ```java public void deleteDish(Dish dish) { // 检查菜品是否处于起售状态 if (dish.getStatus() == 1) { // 假设1表示起售状态 throw new RuntimeException("起售状态的菜品不能删除"); } // 检查菜品是否被包含在套餐中 List<Setmeal> setmeals = setmealService.findSetmealsByDishId(dish.getId()); if (!setmeals.isEmpty()) { throw new RuntimeException("该菜品已被包含在套餐中,不能删除"); } // 删除菜品及其相关口味 dishRepository.deleteById(dish.getId()); flavorRepository.deleteByDishId(dish.getId()); } ``` ### 扩展知识点 除了上述基本逻辑外,还可以扩展一些其他功能,例如: - 添加日志记录,以便追踪删除操作的具体情况。 - 引入事务管理机制,确保删除菜品和对应口味的操作具有原子性。 - 在删除之前进行权限验证,确保用户有权限执行删除操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值