猿创征文|瑞吉外卖——管理端_员工管理

个人名片:

博主:酒徒ᝰ.
专栏:瑞吉外卖
个人简介沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志一本好书,就像高级武功秘籍一样,哪怕只是从里面领悟到个一招半势,功力提升起来都是惊人的。

本项目基于B站黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis plus开发核心技术的真java实战项目。

视频链接【黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis
plus开发核心技术的真java实战项目】 https://www.bilibili.com/video/BV13a411q753?
点击观看

目录

  • 一、页面呈现
  • 二、添加员工
  • 三、编辑(修改员工)
    • 1.回显数据
      • 解决办法
    • 2.修改数据
  • 四、输入框查找
  • 五、知识点
    • 1. 消息转换器
    • 2. @pathVariable,@PathParam和RequestParam的区别:

一、页面呈现

猿创征文|瑞吉外卖——管理端_员工管理_第1张图片

分析:employee地址,GET方式,page地址。在?后面有page和pageSize
数据库中:name为非空,所以此处直接查询数据库中Employee表的所以内容。

/**
* 页面呈现——分页查询
* @param page
* @param pageSize
* @return
*/
@GetMapping("/page")
public R<Page> page(int page, int pageSize){
    //测试是否可以接收到信息
    //        log.info("page:{},pageSize:{}",page, pageSize);

    //分页构造器
    Page<Employee> pageInfo = new Page<>(page, pageSize);

    //查询Employee表中全部信息
    LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.orderByDesc(Employee::getUpdateTime);
    employeeService.page(pageInfo, queryWrapper);

    return R.success(pageInfo);
}

二、添加员工

猿创征文|瑞吉外卖——管理端_员工管理_第2张图片

分析:Post方式,employee地址
猿创征文|瑞吉外卖——管理端_员工管理_第3张图片

此表格与数据库员工表存在查询,内容不够,缺少的部分如果是非空(都是非空)就需要补全。
状态码(status)默认为1,无需补。

/**
* 添加员工信息
* @param request
* @param employee
* @return
*/
@PostMapping
public R<String> employee(HttpServletRequest request, @RequestBody Employee employee){
    //测试信息,对照数据库,查看需要补充哪些信息。
    //log.info("employee:{}",employee);//employee:Employee(id=null, name=88, username=888, password=null, phone=13452525252, sex=1, idNumber=111111111111111111, status=null, createTime=null, updateTime=null, createUser=null, updateUser=null)
    //需要补充password=null, status=null, createTime=null, updateTime=null, createUser=null, updateUser=null
    //设置初始密码 123456
    employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
    //设置其它 时间类 当前时间
    employee.setCreateTime(LocalDateTime.now());
    employee.setUpdateTime(LocalDateTime.now());
    //设置其它 名字 用户名(返回之前在登录时保存) 用户名id为Long形式
    Long empId = (Long)request.getSession().getAttribute("employee");
    employee.setCreateUser(empId);
    employee.setUpdateUser(empId);

    employeeService.save(employee);
    return R.success("添加员工成功");
}

三、编辑(修改员工)

1.回显数据

猿创征文|瑞吉外卖——管理端_员工管理_第4张图片

地址对照数据库可以发现是对照员工表中的id来进行修改的。

/**
* 数据回显
* @param id
* @return
*/
@GetMapping("/{id}")
public R<Employee> huixian(@PathVariable Long id){
    //根据前端传过来的id进行查询信息
    LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(Employee::getId, id);
    Employee employee = employeeService.getOne(queryWrapper);
    return R.success(employee);
}

功能测试:发现测试出问题了,并没有回显数据。查看日志发现,浏览器的id与数据库中的ID不一样。这是因为数据精度丢失。

解决办法

修改id将其变为字符串形式。
这里用到了之前加入的对象映射器。
在使用消息转换器将Long类型数据转换为String类型

/**
 * 消息转换器
 * @param converters the list of configured converters to extend
 */
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    //创建消息转化器对象
    MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
    //将java对象转为json对象
    messageConverter.setObjectMapper(new JacksonObjectMapper());
    converters.add(0,messageConverter);
}

2.修改数据

猿创征文|瑞吉外卖——管理端_员工管理_第5张图片

分析:PUT方法

/**
 * 修改数据
 * @param employee
 * @return
 */
@PutMapping
public R<String> employee(@RequestBody Employee employee){
    employeeService.updateById(employee);
    return R.success("修改成功");
}

四、输入框查找

猿创征文|瑞吉外卖——管理端_员工管理_第6张图片

分析:GET方式,相对于页面呈现来说,添加了一个name属性。
发现与页面呈现使用的都是@GetMapper(“/page”),所以需要在页面呈现中进行修改。
修改后为:(仅仅添加判断name是否为空的判断)

/**
 * 页面呈现——分页查询
 * @param page
 * @param pageSize
 * @return
 */
@GetMapping("/page")
public R<Page> page(int page, int pageSize, String name){
    //测试是否可以接收到信息
//    log.info("page:{},pageSize:{},name:{}",page, pageSize, name);

    //分页构造器
    Page<Employee> pageInfo = new Page<>(page, pageSize);

    //查询Employee表中全部信息
    LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.orderByDesc(Employee::getUpdateTime);

    //输入框查找添加
    if (name != null){
        queryWrapper.like(Employee::getName,name);
    }

    employeeService.page(pageInfo, queryWrapper);

    return R.success(pageInfo);
}

五、知识点

1. 消息转换器

json数据中int转string:这个可以使用快捷键,会省略很多。

/**
 * 消息转换器
 * @param converters the list of configured converters to extend
 */
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    //创建消息转化器对象
    MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
    //将java对象转为json对象
    messageConverter.setObjectMapper(new JacksonObjectMapper());
    converters.add(0,messageConverter);
}

对象映射器:这个在老师的资料里有,可以选择直接用。

package com.itheima.reggie.common;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import java.math.BigInteger;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;

/**
 * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
 * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
 */
public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);


        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))

                .addSerializer(BigInteger.class, ToStringSerializer.instance)
                .addSerializer(Long.class, ToStringSerializer.instance)
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}

2. @pathVariable,@PathParam和RequestParam的区别:

  • @pathVariable:从路径中获取变量,也就是把路径当做变量,路径问号前面
    eg:http://localhost:8080/dish?ids=1413384757047271425中的dish
  • @PathParam从请求里面获取参数,从请求来看,路径问号后面eg:http://localhost:8080/dish?ids=1413384757047271425中的1413384757047271425
  • @RequestParam是从 request
    里面拿取值,是以键值对方式来获取参数值的。获取?后面相同一个属性的多个值。eg:http://localhost:8080/test?name=李四&name1=张三中的张三,李四。

你可能感兴趣的:(瑞吉外卖,java,mybatis,spring,boot)