苍穹外卖day02

员工管理,分类管理

在这里插入图片描述

新增员工

产品经理需求分析

在这里插入图片描述
使用请求post去请求,按照json格式去提交,后端给前端返回result

Path: /admin/employee
Method:post

请求的json就是包含上图表单里面数据
返回的数据是后端给前端:

**在controller类里面增加方法,然后在service里面增加方法,再在impl里面实现方法(从DTO传过来的参数赋值给new的employee,然后调用Mapper将数据记录到数据库之中)

其中的参数都是清一色的DTO(从前端接受的数据)**
1、技巧 只用Spring的BeanUtils.copyProperties去拷贝类的属性。
2. 设置常量类 Constant以便后期维护,在set的时候都用常量属性来set
3.返回Result.succes

 @PostMapping
    @ApiOperation("新增员工")
    public Result save(@RequestBody EmployeeDTO employeeDTO){

        System.out.println("当前线程的id" + Thread.currentThread().getId());
        
        log.info("新增员工:{}",employeeDTO);
        employeeService.save(employeeDTO);

        return Result.success();
    }

也就是controller(return Result)- >service(只是定义一个方法名)- > impl(完成功能获取employee的信息,转到Mapper去执行sql操作)- >Mapper(完成sql代码)

public void save(EmployeeDTO employeeDTO){

        Employee employee = new Employee();

        //对象属性拷贝 Spring封装的
        BeanUtils.copyProperties(employeeDTO,employee);     //从前往后面拷贝

        //设置账号的状态
        employee.setStatus(StatusConstant.ENABLE);      //就是写了一个常量类

        employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));
        employee.setCreateTime(LocalDateTime.now());
        employee.setUpdateTime(LocalDateTime.now());

        //TODO 后期改成当前登录用户的id 用户名共同值了没有异常处理

        employee.setCreateUser(10L);
        employee.setUpdateUser(10L);


        employeeMapper.insert(employee);	//专门的类去执行sql语句的操作
    }

解决用户名重复的问题!写异常处理类

 @ExceptionHandler
    public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){

获取ex.getMessage的内容,处理内容使用split,返回的是Result.error(处理的文本数据表示获得的异常)

解决创建人id问题

在login的时候其实已经生成了jwt令牌,但是需要在login里面把令牌保存下来,然后提供成service下面的其他方法使用,需要用到ThreadLocal保存下来

每一次请求其实都是单独的线程,每个线程都有单独的存储空间,所以我们可以把数据存在里面,在不用的类(service类不同方法)共享这个数据

先在拦截器里调用

BaseContext.setCurrentId(empId);

其中操作很简单,关键是ThreadLocal的概念

遇到bug&技巧

1.调用getset的时候没有自动补全:下载插件lombok
2.在写Mapper的时候用@Insert写mysql代码,没有自动补全。Insert开头黄色灯泡在这里插入图片描述
3.调试的时候需要设置一下全局参数,jwt令牌,先去登录那边获取,然后在全局参数设置一个token的,为什么叫token去application.yml配置文件设置的
4.测试的时候发现返回500,查阅的时候发现

 @Insert("insert into employee (name,username,password,phone,sex,id_number,create_time,update_time,create_user,update_user) VALUES  " +
            "(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser})")
    void insert(Employee employee);

values后面需要驼峰命名,前面一部分是mysql设置好的表的格式
5. ex.getMessage().var可以自动补全定义

员工分页查询

产品经理需求分析

在这里插入图片描述
在这里插入图片描述
请求格式是Query不是json在这里插入图片描述

需要返回一页的数据

Controller

 @GetMapping("/page")
    @ApiOperation("分页查询")
    public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO){
        log.info("员工分页查询,参数为:{}",employeePageQueryDTO);
        PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO);
        return Result.success(pageResult);
    }

@GetMapping(“/page”) 定义接口

impl

使用pagehelper插件(mybatis自带的)

public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO){
        //select * from employee limit 0,10

        PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());

		//是基于TreadLocal实现的,获得Limit 自动拼接到Mapper.xml之中
        Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO);

        long total = page.getTotal();
        List<Employee> result = page.getResult();



        return new PageResult(total,result);	//


    }

pageQuery是在Mapper里面实现的,然后实现方法是通过,EmployeeMapper.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>

    </select>
</mapper>

Preparing: SELECT count(0) FROM employee这部分是mybatisX插件帮助写的

员工分页查询,参数为:EmployeePageQueryDTO(name=null, page=1, pageSize=10)
2024-07-05 14:48:02.595 DEBUG 26312 --- [nio-8080-exec-2] c.s.m.EmployeeMapper.pageQuery_COUNT     : ==>  Preparing: SELECT count(0) FROM employee
2024-07-05 14:48:02.595 DEBUG 26312 --- [nio-8080-exec-2] c.s.m.EmployeeMapper.pageQuery_COUNT     : ==> Parameters: 
2024-07-05 14:48:02.596 DEBUG 26312 --- [nio-8080-exec-2] c.s.m.EmployeeMapper.pageQuery_COUNT     : <==      Total: 1
2024-07-05 14:48:02.597 DEBUG 26312 --- [nio-8080-exec-2] com.sky.mapper.EmployeeMapper.pageQuery  : ==>  Preparing: select * from employee LIMIT ?
2024-07-05 14:48:02.597 DEBUG 26312 --- [nio-8080-exec-2] com.sky.mapper.EmployeeMapper.pageQuery  : ==> Parameters: 10(Integer)
2024-07-05 14:48:02.598 DEBUG 26312 --- [nio-8080-exec-2] com.sky.mapper.EmployeeMapper.pageQuery  : <==      Total: 3

展示时间格式不对

第一种 按照注释的方式

//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

第二种 使用WebMvcConfiguration类来解决

/**
     * 扩展Spring MVC框架的消息转化器
     * @param converters
     */
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {

        log.info("启动消息转化器。。。");
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

        converter.setObjectMapper(new JacksonObjectMapper());

        converters.add(0,converter);
    }

bug&技巧

1.在写Mapper的时候没有报错,无法自动生成pagehelper的相关代码,下载插件,mybatisX

启用禁用员工账号

产品分析

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

controller

如果需要返回数据的话,
public result<返回的数据>
如果不返回数据
就public result就行了

@PostMapping("/status/{status}")
    @ApiOperation("启动禁用员工账号")
    public Result startOrStop(@PathVariable  Integer status,Long id){       //路径参数加PathVariable 路径参数就是/(status)

        log.info("启动禁用员工账号:{},{}",status,id);

        employeeService.startOrStop(status,id);
        return Result.success();
    }

serviceimpl

使用builder更加装逼,再使用Mapper去调用sql语句

public void startOrStop(Integer status, Long id){
        //update employee set status = ? where id = ?
//        Employee employee = new Employee();
//        employee.setStatus(status);

        Employee employee = Employee.builder()
                .status(status)
                .id(id)
                .build();

        employeeMapper.update(employee);


    }

Mapper

因为动态修改属性,所以使用Mapper映射文件去使用,

<update id="update" parameterType="com.sky.entity.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">idNumber = #{idNumber},</if>
            <if test="updateTime !=null">updateTime = #{updateTime},</if>
            <if test="updateUser !=null">updateUser = #{updateUser},</if>
            <if test="status !=null">status = #{status},</if>
        </set>
        where id = #{id}
    </update>

修改的时候回显员工信息

修改信息时候回显

分析需要id查询,需要返回整个employee的信息去显示
首先是使用Get在controller里面请求,

@GetMapping("/{id}")
    @ApiOperation("根据id获取员工的资料")
    public Result<Employee> getById(@PathVariable Long id){

        log.info("编辑员工信息,id为{}",id);

        Employee employee   = employeeService.getById(id);
        return Result.success(employee);
    }

serice

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

        Employee employee    = employeeMapper.getById(id);
        employee.setPassword("******");

        return employee;
    }

Mapper

 @Select("select * from employee where id = #{id}")
    Employee getById(Long id);

这里我出现错误,把@select写成了@Insert是不对的,修改完之后就有回显了

修改员工的信息

Put方法controller参数是DTO,不需要return就返回Result.success

service里面就参数DTO,去BeanUtils从DTO变成正常Employee类

记得要updateTime 和User更改修改的时间和修改人

然后就调用之前写好的Mapper类里面的update函数(封装到Mapper.xml)里面

 public void update(EmployeeDTO employeeDTO){

        Employee employee = new Employee();
        BeanUtils.copyProperties(employeeDTO,employee);


        employee.setUpdateTime(LocalDateTime.now());
        employee.setUpdateUser(BaseContext.getCurrentId());

        employeeMapper.update(employee);
    }

bug

去调试的时候发现,updateTime是没有的

Cause: java.sql.SQLSyntaxErrorException: Unknown column 'updateTime' in 'field list'
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column 'updateTime' in 'field list'] with root cause

原因是xml文档里面是错误的

<update id="update" parameterType="com.sky.entity.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}
    </update>

update_Time = #{updateTime}

还有一个错误

 @PutMapping
    @ApiOperation("编辑员工信息")
    public Result update(@RequestBody EmployeeLoginDTO employeeLoginDTO){
        log.info("编辑员工信息:{}",employeeLoginDTO);


        employeeService.update(employeeLoginDTO);


        return Result.success();

    }

@PutMapping后面没有网址参数了,获取的是employee页面的里面自带的json格式,所以我们在传参的时候需要把**@RequestBody**给加上,才能正确的返回DTO的值

发现我全部用的EmployeeloginDTO,这个时候需要的是全部的DTO。。。。。。。。。。。。。。。。。。
全部改完就好了

导入分类模块功能代码

知识

GET:

用途:用于从服务器获取数据。
特性:请求通常是幂等的(多次请求对服务器的资源不会产生不同的结果),请求参数通常包含在URL中。
例子:访问网页、获取API数据等。
POST:

用途:用于向服务器发送数据以创建新的资源。
特性:请求不是幂等的(多次相同的请求可能会产生不同的结果),请求数据包含在请求体中。
例子:提交表单、上传文件等。
PUT:

用途:用于向服务器发送数据以更新现有资源。
特性:请求通常是幂等的,整个资源数据包含在请求体中。
例子:更新用户信息、更改文件内容等。
DELETE:

用途:用于从服务器删除指定的资源。
特性:请求通常是幂等的。
例子:删除用户账户、移除文件等。

总结

新增员工接受网页TDO,转Employee,去Mapper里面Insert,直接使用注释@Insert就能完成,不返回内容只返回success

分页查询,使用Mybatis的pagehelper类去完成代码,传入pageDTO(可以其实是没有在前端输入参数的,是通过TreadLocal自动获取的内容)就可以,DTO包括了页码和每页最大的页数,返回的是PageResult(成员属性就是页码和每页最大的页数)
其中,Mapper使用了XML文件去完成这个操作

 <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>

    </select>

禁用设置
需要页面属性做status做参数,所以接受的前面加上了**@PathVariable** ,没有返回所以success就行,sql本质是update,所以使用了xml完成了所有的update但是在命名上要注意驼峰和下划线_,传给Mapper的时候update函数接受的都是整个employee

编辑员工
传入的是网页参数要加上@RquestBody参数,本质还是update,所以用上面的代码就可以,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值