苍穹外卖开发笔记(2.管理端-员工管理 分类管理)

一、员工管理

1、新增员工

1.需求分析和设计

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.代码开发

在这里插入图片描述
后端代码开发步骤,大多数都是先从controller类编写接口,server类创建方法,Impl实现方法实现前后端数据联调,再通过Mapper将数据传输到数据库。

controller:

    /**
     * 添加员工
     *
     * @return
     */
    @PostMapping
    @ApiOperation(value = "添加员工")
    public Result save(@RequestBody EmployeeDTO employeeDTO){
        employeeService.save(employeeDTO);
        return Result.success();
    }

service:

    /**
     * 添加员工
     * @param employeeDTO
     * @return
     */
    void save(EmployeeDTO employeeDTO);

Impl:

    /**
     * 添加员工
     *
     * @param employeeDTO
     * @return
     */
    @Override
    public void save(EmployeeDTO employeeDTO) {
        Employee employee = new Employee();

        //对象属性拷贝
        BeanUtils.copyProperties(employeeDTO,employee);

        //设置账号状态,默认正确状态 1表示正常 0表示锁定
        employee.setStatus(StatusConstant.ENABLE);

        //设置密码 默认密码为123456
        employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));

        //设置当前记录的创建时间和修改时间
        employee.setCreateTime(LocalDateTime.now());
        employee.setUpdateTime(LocalDateTime.now());

        //设置当前记录创建人的id和修改人id
        //TODO 后期需要改为当前用户的id
        employee.setCreateUser(10L);
        employee.setUpdateUser(10L);

        employeeMapper.insert(employee);

    }

Mapper:

    /**
     * 新增员工
     * @param employee
     * @return
     */
    @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);

3.测试

由于初始化项目存在拦截器,我们需要把每个请求都添加上运行访问的token
在这里插入图片描述
使用swagger进行端口测试,接口目录有了我们刚才写的添加员工接口
在这里插入图片描述
点击调试,输入录入信息
在这里插入图片描述
查看响应结果
在这里插入图片描述
刷新数据库,可以看到这个接口就已经完成了
在这里插入图片描述
打开网页进行测试
在这里插入图片描述
在这里插入图片描述

4.问题1:录入的用户名已存在,抛出异常没有处理

我们只需要把异常拿出来,进行再处理。在初始化工程的时候已经定义了一个异常处理类:

GlobalExceptionHandler.java 在该类中,对特定异常进行处理

当出现用户名异常时,进行结果处理

    /**
     * 处理sql异常
     *
     * @param ex
     * @return
     */
    @ExceptionHandler
    public Result excptionHandler(SQLIntegrityConstraintViolationException ex){
        String message = ex.getMessage();
        if(message.contains("Duplicate entry")){
            String[] split = message.split(" ");
            String username = split[2];
            String msg = username + MessageConstant.ALREADY_EXISTS;
            return Result.error(msg);
        }else {
            return Result.error(MessageConstant.UNKNOWN_ERROR);
        }
    }

当再次发送相同username的信息时,会提示已经存在。
在这里插入图片描述

4.问题2:新增员工时,修改人,添加人ID为固定值

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在初始化工程时,我们已经将ThreadLocal封装为常用工具类,直接调用即可

在这里插入图片描述
在拦截器进行令牌校验时,将当前员工id放入线程中
在这里插入图片描述
在录入修改用户id时,从线程中取出id进行保存

在这里插入图片描述
再添加一个用户,可以看到修改人相关id
在这里插入图片描述

2、员工分页查询

1.需求分析设计

在这里插入图片描述
在这里插入图片描述

2.代码开发

定义后端接收前端数据的DTO
在这里插入图片描述

统一分页返回结果

在这里插入图片描述
在这里插入图片描述
controller:

    /**
     * 员工分页查询
     *
     * @return
     */
    @GetMapping("/page")
    @ApiOperation(value = "员工分页查询")
    public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO){
        PageResult pageResult = employeeService.pagequery(employeePageQueryDTO);
        return Result.success(pageResult);

    }

service:

    /**
     * 员工分页查询
     * @param employeePageQueryDTO
     * @return
     */
    PageResult pagequery(EmployeePageQueryDTO employeePageQueryDTO);

Impl:这里采用PageHelper实现分页相关功能

    /**
     * 分页查询
     *
     * @param employeePageQueryDTO
     * @return
     */
    @Override
    public PageResult pagequery(EmployeePageQueryDTO employeePageQueryDTO) {
        //开始分页查询
        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:

    /**
     * 分页查询
     * @param employeePageQueryDTO
     * @return
     */
    Page<Employee> pageQuery(EmployeePageQueryDTO employeePageQueryDTO);

mapper.xml:

<mapper namespace="com.sky.mapper.EmployeeMapper">
    <select id="pageQuery" resultType="com.sky.entity.Employee">
        select * from employee
        <where>
            <if test="name != null and name != ''">
                and name like concat('%',#{name},'%')
            </if>
        </where>
        order by create_time desc
    </select>
</mapper>

3.测试

设置查询第一页,每页展示两条数据
在这里插入图片描述

通过名字查询
在这里插入图片描述

4.问题:相应的时间数据格式存在问题

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3、启用禁用员工账号

1.需求分析设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.代码设计

contoller:

    /**
     * 启动禁用员工账号
     *
     */
    @PostMapping("/status/{status}")
    @ApiOperation(value = "启用禁用员工账号")
    public Result startOrStop(@PathVariable("status") Integer status, Long id){
        employeeService.startOrStop(status, id);
        return Result.success();
    }

service:

    /**
     * 启用禁用员工
     * @param status
     * @param id
     */
    void startOrStop(Integer status, Long id);

Impl:


    @Override
    public void startOrStop(Integer status, Long id) {
        Employee employee = new Employee();
        employee.setId(id);
        employee.setStatus(status);
        employeeMapper.update(employee);
    }

Mapper:

    /**
     * 更新员工信息
     *
     * @param employee
     */
    void update(Employee employee);

mapper.xml:


<select id="update" resultType="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="updateTime != null">update_Time = #{updateTime},</if>
        <if test="updateUser != null">update_User = #{updateUser},</if>
        <if test="status != null">status = #{status},</if>
    </set>
    where id = #{id}
</select>

3.测试

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4、编辑员工

1.需求设计分析

就是修改员工信息(有回显的操作-即先查,再改)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.代码设计

controller:

    /**
     * 根据id查询员工信息
     *
     */
    @GetMapping("/{id}")
    @ApiOperation(value = "根据id查询员工信息")
    public Result<Employee> getById(@PathVariable("id") Long id){
        Employee employee = employeeService.getById(id);
        return Result.success(employee);
    }

    /**
     * 修改员工信息
     * @param employeeDTO
     * @return
     */
    @PutMapping
    @ApiOperation(value = "编辑员工信息")
    public Result update(@RequestBody EmployeeDTO employeeDTO){
        employeeService.update(employeeDTO);
        return Result.success();
    }

service:

    /**
     * 根据id查询员工信息
     * @param id
     * @return
     */
    Employee getById(Long id);

    /**
     *
     * 修改员工信息
     * @param employeeDTO
     */
    void update(EmployeeDTO employeeDTO);

Impl:编辑就可以用前面设计好的修改员工信息接口update

    /**
     *
     * 根据id查询员工信息
     * @param id
     * @return
     */
    @Override
    public Employee getById(Long id) {
        return employeeMapper.getById(id);
    }

    /**
     * 修改员工信息
     *
     * @param employeeDTO
     */
    @Override
    public void update(EmployeeDTO employeeDTO) {
        Employee employee = new Employee();
        BeanUtils.copyProperties(employeeDTO, employee);
        employee.setUpdateUser(BaseContext.getCurrentId());
        employee.setUpdateTime(LocalDateTime.now());
        employeeMapper.update(employee);
    }

mapper:

    /**
     * 更新员工信息
     *
     * @param employee
     */
    void update(Employee employee);

    /**
     * 根据id查询员工信息
     * @param id
     * @return
     */
    @Select("select * from employee where id = #{id}")
    Employee getById(Long id);

3.测试

查询id为6的员工信息
在这里插入图片描述

修改id为6的员工信息
在这里插入图片描述

在这里插入图片描述

二、分类管理

1、导入分类管理代码

本功能和上面员工管理开发功能差不多,可以自己尝试编写,或直接导入相关代码

1.需求分析设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.代码开发

与上面章节功能一样,输入和输出的DTO DAO都已经在初始化工程中导入,所以我们直接对分类模块进行开发(Category).,共涉及5个新文件对应的controller,service,lmpl,mapper,mapper.xml

CategoryContoller:

package com.sky.controller.admin;

import com.sky.dto.CategoryDTO;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.CategoryService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 分类管理
 */
@RestController
@RequestMapping("/admin/category")
@Api(tags = "分类相关接口")
@Slf4j
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

    /**
     * 分类分页查询
     *
     */
    @GetMapping("/page")
    @ApiOperation(value = "分类分页查询")
    public Result<PageResult> page(CategoryPageQueryDTO categoryPageQueryDTO){
        //    //页码
        //    private int page;
        //
        //    //每页记录数
        //    private int pageSize;
        //
        //    //分类名称
        //    private String name;
        //
        //    //分类类型 1菜品分类  2套餐分类
        //    private Integer type;
        PageResult pageResult = categoryService.pagequery(categoryPageQueryDTO);
        return Result.success(pageResult);
    }

    /**
     * 新增分类
     * @param categoryDTO
     * @return
     */
    @PostMapping
    @ApiOperation(value = "新增分类")
    public Result add(@RequestBody CategoryDTO categoryDTO){
        //    //主键
        //    private Long id;
        //
        //    //类型 1 菜品分类 2 套餐分类
        //    private Integer type;
        //
        //    //分类名称
        //    private String name;
        //
        //    //排序
        //    private Integer sort;
        categoryService.add(categoryDTO);
        return Result.success();
    }

    /**
     * 启用禁用状态
     * @param status
     * @param id
     * @return
     */
    @PostMapping("/status/{status}")
    @ApiOperation(value = "启用禁用分类")
    public Result startOrStop(@PathVariable("status") Integer status, Long id){
        categoryService.startOrStop(status,id);
        return Result.success();
    }

    /**
     * 修改分类信息
     * @param categoryDTO
     * @return
     */
    @PutMapping
    @ApiOperation(value = "修改分类信息")
    public Result update(@RequestBody CategoryDTO categoryDTO){
        categoryService.update(categoryDTO);
        return Result.success();
    }

    /**
     * 根据id删除分类
     * @param id
     * @return
     */
    @DeleteMapping
    @ApiOperation(value = "根据id删除分类")
    public Result deleteById(Long id){
        categoryService.deleteById(id);
        return Result.success();
    }

    /**
     * 根据类型查询分类
     * @param type
     * @return
     */
    @GetMapping("/list")
    @ApiOperation(value = "根据类型查询分类")
    public Result<List<Category>> list(Integer type){
        List<Category> list = categoryService.list(type);
        return Result.success(list);
    }
}

CategoryService:

package com.sky.service;

import com.sky.dto.CategoryDTO;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import com.sky.result.PageResult;

import java.util.List;

public interface CategoryService {
    /**
     * 分类分页查询
     * @param categoryPageQueryDTO
     * @return
     */
    PageResult pagequery(CategoryPageQueryDTO categoryPageQueryDTO);

    /**
     * 新增分类
     * @param categoryDTO
     */
    void add(CategoryDTO categoryDTO);

    /**
     * 启用禁用状态
     * @param status
     * @param id
     */
    void startOrStop(Integer status, Long id);

    /**
     * 需要分类
     * @param categoryDTO
     */
    void update(CategoryDTO categoryDTO);

    /**
     * 根据id删除分类
     * @param id
     */
    void deleteById(Long id);

    /**
     * 根据类型查询分类
     * @param type
     * @return
     */
    List<Category> list(Integer type);
}

CategoryServiceImpl:

package com.sky.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.constant.StatusConstant;
import com.sky.context.BaseContext;
import com.sky.dto.CategoryDTO;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import com.sky.mapper.CategoryMapper;
import com.sky.result.PageResult;
import com.sky.service.CategoryService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class CategoryServiceImpl implements CategoryService {

    @Autowired
    private CategoryMapper categoryMapper;

    /**
     * 分类分页查询
     *
     * @param categoryPageQueryDTO
     * @return
     */
    @Override
    public PageResult pagequery(CategoryPageQueryDTO categoryPageQueryDTO) {
        PageHelper.startPage(categoryPageQueryDTO.getPage(),categoryPageQueryDTO.getPageSize());

        //下一条sql进行分页,自动加入limit关键字分页
        Page<Category> page = categoryMapper.pageQuery(categoryPageQueryDTO);
        return new PageResult(page.getTotal(), page.getResult());
    }

    /**
     * 新增分类
     * @param categoryDTO
     */
    @Override
    public void add(CategoryDTO categoryDTO) {
        Category category = new Category();
        BeanUtils.copyProperties(categoryDTO,category);
        category.setStatus(StatusConstant.DISABLE);
        //设置创建时间、修改时间、创建人、修改人
        category.setCreateTime(LocalDateTime.now());
        category.setUpdateTime(LocalDateTime.now());
        category.setCreateUser(BaseContext.getCurrentId());
        category.setUpdateUser(BaseContext.getCurrentId());
        categoryMapper.insert(category);
    }

    /**
     * 启用禁用商品状态
     * @param status
     * @param id
     */
    @Override
    public void startOrStop(Integer status, Long id) {
        Category category = new Category();
        category.setStatus(status);
        category.setId(id);
        categoryMapper.update(category);
    }

    /**
     * 修改分类
     * @param categoryDTO
     */
    @Override
    public void update(CategoryDTO categoryDTO) {
        Category category = new Category();
        BeanUtils.copyProperties(categoryDTO,category);
        //设置修改时间、修改人
        category.setUpdateTime(LocalDateTime.now());
        category.setUpdateUser(BaseContext.getCurrentId());
        categoryMapper.update(category);
    }

    /**
     * 删除分类
     * @param id
     */
    @Override
    public void deleteById(Long id) {


        categoryMapper.deleteById(id);
    }

    /**
     * 根据类型查询分类
     * @param type
     * @return
     */
    @Override
    public List<Category> list(Integer type) {
        return categoryMapper.list(type);
    }


}

CategoryMapper:

package com.sky.mapper;

import com.github.pagehelper.Page;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface CategoryMapper {


    /**
     * 分页分类查询
     *
     * @param categoryPageQueryDTO
     * @return
     */
    Page<Category> pageQuery(CategoryPageQueryDTO categoryPageQueryDTO);

    /**
     * 新增员工
     * @param category
     */
    @Insert("insert into category(type, name, sort, status, create_time, update_time, create_user, update_user)" +
            " VALUES" +
            " (#{type}, #{name}, #{sort}, #{status}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})")
    void insert(Category category);

    /**
     * 根据id修改分类
     * @param category
     */
    void update(Category category);

    /**
     * 根据id删除分类
     * @param id
     */
    @Delete("delete from category where id = #{id}")
    void deleteById(Long id);

    /**
     * 根据类型查询分类
     * @param type
     * @return
     */
    List<Category> list(Integer type);
}

CategoryMapper.xm:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.CategoryMapper">
    <select id="pageQuery" resultType="com.sky.entity.Category">
        select * from category
        <where>
            <if test="name != null and name !=''">
                and name like concat('%',#{name},'%')
            </if>
            <if test="type != null">
                and type = #{type}
            </if>
        </where>
        order by sort asc, create_time desc
    </select>

    <update id="update" parameterType="Category">
        update category
        <set>
            <if test="type != null">
                type = #{type},
            </if>
            <if test="name != null">
                name = #{name},
            </if>
            <if test="sort != null">
                sort = #{sort},
            </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>

    <select id="list" resultType="Category">
        select  * from category
        where status = 1
        <if test="type != null">
            and type = #{type}
        </if>
        order by sort asc,create_time desc
    </select>
</mapper>

3.测试

大致页面如下,把所有接口都调通就OK
在这里插入图片描述

三、相关知识

1、为什么后端封装了DAO类用于连接后端和数据库,前端不直接用DAO类而需要重新设计DTO类?

前端提交的数据和实体类中对应的属性差别可能较大,即数据库中的数据类别可能前端提交的数据没用,所以在开发中建议使用DTO类来统一封装前端传来的数据,前端可以选择性的传输需要的数据。
在这里插入图片描述

2、BeanUtils简化Java Bean对象之间的属性拷贝和赋值操作

BeanUtils提供了一组静态方法,可以快速地实现Bean对象之间的属性复制、属性转换、属性赋值等操作。

最常用的方法是copyProperties()方法,该方法可以将一个Bean对象的属性值复制到另一个Bean对象中。

BeanUtils.copyProperties(destination, source);

其中,destination和source都是Java Bean对象。

在使用BeanUtils进行属性复制时,会自动匹配两个Bean对象中相同名称的属性,并将源Bean对象中对应属性的值复制到目标Bean对象中。需要注意的是,两个Bean对象中的属性名称和类型必须要匹配,否则会抛出异常。

BeanUtils还提供了一些其他的方法,例如getProperty()、setProperty()、populate()等等,可以用于获取属性值、设置属性值、批量设置属性值等操作。

String value = BeanUtils.getProperty(bean, "propertyName");
BeanUtils.setProperty(bean, "propertyName", "value");

在上述代码中,我们使用getProperty()方法获取了一个Bean对象中指定属性的值,使用setProperty()方法设置了一个Bean对象中指定属性的值。

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值