目录

Day1内容

前端环境搭建:

nginx反向代理

完善登录功能

前后端分离开发流程

Swagger

DY2内容

新增员工

一需求分析

二.DTO设计

 出现异常

ThreadLocal介绍:

三. gitee提交记录

 员工分页查询

一.端口信息​编辑​

二.代码实现

三.代码完善 (日期问题)

四.gitee提交记录

启用禁用员工账号

一.接口信息​编辑​

二.代码实现

Service层

三.测试

四.gitee提交记录

编辑员工

一.接口信息 

 二.代码实现

根据id查询员工信息

编辑员工信息

三.测试

查询员工信息

编辑员工信息

​编辑四.gitee 提交记录

分类管理模块功能

一.文件预览

二.测试 

三.gitee提交记录  


注:基于黑马程序员开源项目,个人纪录学习过程

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

nginx  反向代理的好处:  

1、隐藏后端真实地址,提升安全

2、统一接入与负载均衡

3、静态资源缓存加速

nginx负载均衡

底层是通过反向代理来实现的  weight代表权重

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/;//负载均衡    

    }

}

完善登录功能

将密码进行加密存储,提高安全性,主要使用了MD5加密算法

// 对前端的密码进行MD5加密算法

 password = DigestUtils.md5DigestAsHex(password.getBytes());
​
        if (!password.equals(employee.getPassword())) {
            throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
        }
                        

前后端分离开发流程

确定接口文档---> 前后端并行开发----> 前后端联调

由于YApi停止注册新用户,这里使用的是apifox进行接口的导入(也是导入YApi)

Swagger

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

区分Yapi与Swagger   (同时使用到)

Yapi主要是设计阶段使用的工具,管理和维护接口

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 提交记录]

分类管理模块功能代码 · 87e0664 · jh11/sky-take-out - Gitee.com

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐