《苍穹外卖》全栈项目:SpringBoot+MyBatis-Plus+Redis全程跟进记录DAY1+DAY2
目录
注:基于黑马程序员开源项目,个人纪录学习过程
Day1内容
前端环境搭建:
nginx反向代理
server{
listen 80;
server_name localost;
location/api/{
proxy_pass http://localhost:8080/admin/;//反向代理
}
}
即将localtion/api 之前的地址转换为http://localhost:8080/admin/ 如http://localhost/api/employee/login 转化为http://localhost:8080/admin/employee/login
upstream webservers{
server 192.168.100.128:8080;
server 192.168.100.129:8080;
//后端Tomcat服务器端口号
}
server{
listen 80;
server_name localhost;
location/api{
proxy_pass http://webservers/admin/;//负载均衡
}
}
完善登录功能

password = DigestUtils.md5DigestAsHex(password.getBytes());
if (!password.equals(employee.getPassword())) {
throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
}
前后端分离开发流程
由于YApi停止注册新用户,这里使用的是apifox进行接口的导入(也是导入YApi)

Swagger
主要通过knife4j来生成接口文档 其中包括扫描controller包还有静态资源的映射

Swagger在开发阶段使用的框架,帮助后端开发人员做后端接口测试
完成后可以通过http://localhost:8080/doc.html 访问
Swagger常用注解

DY2内容
新增员工
一需求分析

看重合关系,返回参数形式
二.DTO设计
根据返回参数的条件和实体的重合关系设计DTO封装的范围,以及设计不重合部分的参数
package com.sky.dto;
import lombok.Data;
import java.io.Serializable;
@Data
public class EmployeeDTO implements Serializable {
private Long id;
private String username;
private String name;
private String phone;
private String sex;
private String idNumber;
}
(1)EmployeeController
@PostMapping
@ApiOperation("新增员工")
public Result save(@RequestBody EmployeeDTO employeeDTO) {
log.info("新增员工: {}", employeeDTO);
System.out.println("当前线程的id:"+Thread.currentThread().getId());
employeeService.save(employeeDTO);
return Result.success();
}
传入的如果是json数据类型,则需要@RequestBody注解
log.info("新增员工:{}",employeeDTO); {}: 表示占位符,使用后面的数据来进行替换
使用新增员工使用默认密码,所以要存入md5加密后的信息
@Insert("insert into sky.employee (username, name, password, phone, sex, id_number, status, create_time, update_time, create_user, update_user) " +
"values (#{username}, #{name}, #{password}, #{phone}, #{sex}, #{idNumber}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})")
void insert(Employee employee);
出现异常
1.录入的用户名已存,抛出的异常后没有处理
2.新增员工时,创建人id和修改人id设置为固定值
问题一解决
/**
* 处理sql异常
* @param ex
* @return
*/
@ExceptionHandler
public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
//Duplicate entry 'zhangsan' for key 'employee.idx_username'
String message=ex.getMessage();
if(message.contains("Duplicate entry")){
String[] split =message.split(" ");
String username=split[2];
//String msg=username+"已存在";
String msg=username+ MessageConstant.ALREADY_EXISTS;
return Result.error(msg);
}
else{
return Result.error(MessageConstant.ACCOUNT_NOT_FOUND);
}
}
问题二解决:
ThreadLocal介绍:
ThreadLocal 并不是一个Thread,而是Thread的局部变量。
ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。
常用方法:
public void set(T value) 设置当前线程的线程局部变量的值
public T get() 返回当前线程所对应的线程局部变量的值
public void remove() 移除当前线程的线程局部变量
ThreadLocal工具
package com.sky.context;
public class BaseContext {
public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
public static void setCurrentId(Long id) {
threadLocal.set(id);
}
public static Long getCurrentId() {
return threadLocal.get();
}
public static void removeCurrentId() {
threadLocal.remove();
}
}
//设置当前记录船舰人id
//TODO 后期需要修改为当前登录用户的id
employee.setCreateUser(BaseContext.getCurrentId());
employee.setUpdateUser(BaseContext.getCurrentId());
employeeMapper.insert(employee);
主要对先前设置的固定值设置为从线程内提取
查询employee表的记录

三. gitee提交记录
2025-08-01
- 提交说明:新增用户
-查看详情:[Gitee 提交记录]苍穹外卖基础项目DAY1+新增员工板块 · 3e587ca · jh11/sky-take-out - Gitee.com
员工分页查询
一.端口信息
二.代码实现
利用pagehelpher插件来实现
Controller层:
//匹配路径
@GetMapping("/page")
@ApiOperation("员工分页查询")
public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO) {
log.info("员工分页查询。参数为:{}", employeePageQueryDTO);
PageResult pageResult=employeeService.pageQuery(employeePageQueryDTO);
return Result.success(pageResult);
}
Services层
/**
* 分页查询
* @param employeePageQueryDTO
* @return
*/
public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
//select * from employee limit 0
//开始分页查询
PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());
Page<Employee> page= employeeMapper.pageQuery(employeePageQueryDTO);
long total = page.getTotal();
List<Employee> records= page.getResult();
return new PageResult(total,records);
}
Mapper层 用的mybatis的映射文件
/**
* 分页查询
* @param employeePageQueryDTO
* @return
*/
Page<Employee> pageQuery(EmployeePageQueryDTO employeePageQueryDTO);
xml文件
<select id="pageQuery" resultType="com.sky.entity.Employee">
select * from sky.employee
<where>
<if test="name !=null and name !=''">
and name like concat('%',#{name},'%')
</if>
</where>
order by create_time desc
</select>
三.代码完善 (日期问题)
方案一:直接加注解
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
方案二:添加转换器
/**
* 拓展spring mvc框架的消息转化器
* @param converters
*/
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters){
log.info("拓展消息转换器");
//创建一个消息转换器对象
MappingJackson2HttpMessageConverter converter =new MappingJackson2HttpMessageConverter();
//需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据
converter.setObjectMapper(new JacksonObjectMapper());
//将自己的消息转换器加入容器中,加入0是将自己加进去的转换器能第一个使用
converters.add(0,converter);
}
}
四.gitee提交记录
2025-08-01
- 提交说明: 员工分页查询
-查看详情:[Gitee 提交记录]
员工分页查询业务代码开发 · 7f3108a · jh11/sky-take-out - Gitee.com
启用禁用员工账号
一.接口信息
二.代码实现
Controller层
@PostMapping("/status/{status}")
@ApiOperation("启用禁用员工账号")
public Result startOrstop(@PathVariable Integer status,long id ) {
log.info("启用禁用员工账号:{},{}", status,id);
employeeService.startOrstop(status,id);
return Result.success();
}
Service层
/**
* 启用禁用员工账号
* @param status
* @param id
*/
public void startOrstop(Integer status, long id) {
//update employee set status=? where id =?
Employee employee=new Employee();
employee.setStatus(status);
employee.setId(id);
employeeMapper.update(employee);
}
Mapper层
@Autofill(value = OperationType.UPDATE)
void update(Employee employee);
xml文件
<update id="update" parameterType="Employee">
update employee
<set>
<if test="name!= null">name = #{name},</if>
<if test="username != null">username = #{username},</if>
<if test="password != null">password = #{password},</if>
<if test="phone != null">phone = #{phone},</if>
<if test="sex != null">sex = #{sex},</if>
<if test="idNumber != null">id_number = #{idNumber},</if>
<if test="status != null">status = #{status},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="updateUser != null">update_user = #{updateUser},</if>
</set>
where id =#{id}
</update>
三.测试
四.gitee提交记录
2025-08-01
- 提交说明: 启用禁用员工账号
-查看详情:[Gitee 提交记录]
启用禁用员工账号业务代码开发 · ce66bda · jh11/sky-take-out - Gitee.com
编辑员工
一.接口信息

二.代码实现
根据id查询员工信息
Controller层
@GetMapping("/{id}")
@ApiOperation("根据id查询员工信息")
public Result<Employee> getById(@PathVariable long id) {
Employee employee=employeeService.getById(id);
return Result.success(employee);
}
Service层
/**
* 根据id查询员工信息
* @param id
* @return
*/
public Employee getById(long id) {
Employee employee= employeeMapper.getById(id);
employee.setPassword("*****");
return employee;
}
Mapper层
@Select("select * from sky.employee where id=#{id}")
Employee getById(long id);
编辑员工信息
Controller层
@PutMapping
@ApiOperation("编辑员工信息")
public Result update(@RequestBody EmployeeDTO employeeDTO) {
log.info("编辑员工信息:{}", employeeDTO);
employeeService.update(employeeDTO);
return Result.success();
}
Service层
/**
* 编辑员工信息
* @param employeeDTO
*/
public void update(EmployeeDTO employeeDTO) {
Employee employee=new Employee();
BeanUtils.copyProperties(employeeDTO,employee);
//employee.setUpdateTime(LocalDateTime.now());
//employee.setUpdateUser(BaseContext.getCurrentId());
employeeMapper.update(employee);
}
三.测试
查询员工信息

编辑员工信息
四.gitee 提交记录
2025-08-01
- 提交说明:编辑员工
-查看详情:[Gitee 提交记录]
编辑员工业务代码的开发 · e49d009 · jh11/sky-take-out - Gitee.com
分类管理模块功能
一.文件预览

二.测试


三.gitee提交记录
2025-08-01
- 提交说明:分类管理模块
-查看详情:[Gitee 提交记录]
更多推荐
所有评论(0)