苍穹外卖学习笔记day01
- 项目结构
- nginx反向代理
- 将前端的动态请求转发给后端服务器。
- 前后端之间的一个管理服务器,通过管理请求转发可以实现:提高访问速度;进行负载均衡;保证后端服务安全。
- 登录密码的安全问题->MD5加密方式【DigestUtils.md5DigestAsHex(password.getBytes())】
- 新增员工
- 管理端接口:/admin/employee
- 整体逻辑:
- EmployeeController:获取前端请求->调用Service层方法->返回Result对象
- 使用DTO对象接收:前端提交数据与实体类属性相差较大。
- @RequestBody注解:由于前端提交的是JSON数据(通常是POST/PUT请求),所以使用注解将JSON转为DTO对象。【@RequestParam:GET请求通常使用该注解接收URL查询参数】
- 返回Result:新增操作不需要传递参数。
- EmployeeService:传递DTO对象,调用实现类employeeServiceImpl
- EmployeeServiceImpl:拷贝DTO对象属性+设置其余属性=完整的Employee对象->传递Employee对象,调用Mapper层方法
- BeanUtils.copyProperties() :Spring框架下复制属性值的方法,属性名相同、同名属性类型兼容才可使用。
- status和password采用常量进行配置:避免硬编码,易于修改;统一管理;提高可读性。
- 动态获取员工id:
- 员工id何时产生的?登录成功,生成JWT令牌返回前端时。
- claims.put(JwtClaimsConstant.EMP_ID,employee.getId()):利用map为常量EMP_ID与id值建立联系。
- Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString()) && BaseContext.setCurrentId(empId);:后续获取令牌,通过常量EMP_ID得到id值,再将新建的empId存入ThreadLocal对象。
- ThreadLocal对象创建于BaseContext类中,类中还具有set/get/removeCurrentId()方法。
- EmployeeMapper:@Insert注解;使用 #{对象属性} 传参
- 唯一性约束问题:全局异常处理器里创建对应处理方法->收到SQLIntegrityConstraintViolationException类型的异常->检验异常消息中是否含有"Duplicate entry(重复条目)"->【Duplicate entry 'admin' for key 'employee.idx_username'】使用split分割报错信息,获取“员工name”->Result.error(想要传回的信息)
查看10道真题和解析