当前位置: 首页 > news >正文

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

个人名片:

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

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

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

目录

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

一、页面呈现

在这里插入图片描述

分析: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);
}

二、添加员工

在这里插入图片描述

分析:Post方式,employee地址
在这里插入图片描述

此表格与数据库员工表存在查询,内容不够,缺少的部分如果是非空(都是非空)就需要补全。
状态码(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.回显数据

在这里插入图片描述

地址对照数据库可以发现是对照员工表中的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.修改数据

在这里插入图片描述

分析:PUT方法

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

四、输入框查找

在这里插入图片描述

分析: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=张三中的张三,李四。

相关文章:

  • springcloud springboot nacos版本对应
  • Windows安装Visual Studio2019+OpenCV配置
  • 单片机——硬件系统
  • jenkins一键部署搭建
  • 【022】Vue+Springboot+mysql汽车销售系统课设(含源码、数据库、运行教程、实验报告)
  • 【Golang开发面经】字节跳动(三轮技术面)
  • SpringCloud Stream详解
  • 【苹果家庭推送iMessage位置推送】群发安装软件获取home目录路径的函数: NSString *homeDir = NSHomeDirectory()
  • 【Python基础入门7】程序的组织结构、range函数及pass语句
  • 基于hough霍夫变换的铁栏栅断裂处的检测算法matlab仿真
  • 学C++要不要先学C语言?
  • 基于JSP的房屋租赁系统
  • 13.Spring security权限管理
  • Python Matplotlib库:统计图补充
  • 猿创征文|数据结构-单链表详解(含完整代码)
  • Babel配置的不完全指南
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Joomla 2.x, 3.x useful code cheatsheet
  • JS函数式编程 数组部分风格 ES6版
  • LeetCode算法系列_0891_子序列宽度之和
  • tab.js分享及浏览器兼容性问题汇总
  • 初识 webpack
  • 订阅Forge Viewer所有的事件
  • 排序(1):冒泡排序
  • 前嗅ForeSpider中数据浏览界面介绍
  • 使用agvtool更改app version/build
  • 算法-图和图算法
  • 用jQuery怎么做到前后端分离
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • MyCAT水平分库
  • #HarmonyOS:软件安装window和mac预览Hello World
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (4)STL算法之比较
  • (二)c52学习之旅-简单了解单片机
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (南京观海微电子)——COF介绍
  • (实战篇)如何缓存数据
  • (一)Neo4j下载安装以及初次使用
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • ***监测系统的构建(chkrootkit )
  • ***原理与防范
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .net专家(张羿专栏)
  • @ComponentScan比较
  • @Documented注解的作用
  • @Mapper作用
  • @软考考生,这份软考高分攻略你须知道