首页 > 其他分享 >苍穹外卖day02

苍穹外卖day02

时间:2024-07-05 20:01:44浏览次数:20  
标签:status Mapper day02 update Result 外卖 employee 苍穹 id

员工管理,分类管理

在这里插入图片描述

新增员工

产品经理需求分析

在这里插入图片描述
使用请求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,所以用上面的代码就可以,

标签:status,Mapper,day02,update,Result,外卖,employee,苍穹,id
From: https://blog.csdn.net/weixin_45803409/article/details/140187276

相关文章

  • 金蝶云·苍穹追光者开发大赛,点燃高校AI应用创新之火
    在2024年的政府工作报告中,"人工智能+"行动被提出,标志着人工智能成为推动我国新质生产力发展的关键力量。与此同时,今年的高考作文有一道题目也聚焦于人工智能,再次凸显了这一领域的社会关注度和影响力。作为行业领军企业,金蝶早已预见这一新赛道的发展潜力,并于2023年率先发布......
  • 程序员失业后不要再去送外卖、开滴滴了,做AI大模型他不香吗?_程序员失业后都去哪了
    前言面对失业,程序员们往往会感到迷茫和不安,尤其是那些在这个行业工作多年却仍感到未能取得满意成就的人。转行似乎是一条艰难的道路,但事实上,除了常见的选择如外卖、跑腿和网约车之外,程序员们还有更多的岗位可以选择。对于那些担心自己在原有行业无法胜任的人,转行并不意味......
  • SpingMvc-Day02
    SpringMVC:表述层作用:1.接受前端参数[SpringMVC简化] 2.调用业务逻辑 3.响应前端数据[SpringMVC简化]SpringMVC组件: 1.DispatcherServlet:处理全部请求 2.handlerMapping:缓存handler方法和地址 3.handlerAdapter:适配器、参数和相应简化 4.ViewResovler视图解释器:查找视图页面......
  • 基于java+springboot+vue实现的校园外卖服务系统(文末源码+Lw)292
    摘   要传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,外卖信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的校园外卖服务系统。本......
  • 【苍穹外卖】P18通过前端页面添加员工,传过来的值为空
    漏掉了注解@RequestBodypublicResultsave(@RequestBodyEmployeeDTOemployeeDTO){//把漏掉的@RequestBody加上log.info("新增员工:{}",employeeDTO);employeeService.save(employeeDTO);returnResult.success();}重新启动项目......
  • Day02基础语法
    基础语法1、注释单行注释//多行注释/**/文档注释2、标识符关键字所有标识符都应该以字母(A-Z,a-z),美元符($),或下划线(_)开始首字母后可以是字母(A-Z,a-z),美元符($),或下划线(_)或数字的任意字符组合不能用关键字作为变量名和方法名标识符大小写敏感可以使用中文命名,但不建......
  • 餐厅在线点餐小程序源码系统可外卖配送 带完整的安装代码包以及搭建部署教程
    系统概述在当今数字化时代,餐厅在线点餐小程序已成为餐饮行业的重要工具。它不仅为消费者提供了便捷的点餐体验,也为餐厅提高了运营效率和服务质量。小编给大家分享一款餐厅在线点餐小程序源码系统,该系统不仅支持在线点餐,还具备外卖配送功能,同时提供完整的安装代码包以及搭建部......
  • HarmonyOS APP应用开发项目- MCA助手(Day02持续更新中~)
    简言:gitee地址:https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5注:此App参照此教程进行二次修改:https://www.bilibi......
  • 【TWVRP】遗传算法求解带时间窗的载重约束外卖配送车辆路径规划问题【含Matlab源码 14
    ......
  • 【秋招刷题打卡】Day02-二分系列之-二分查找
    Day02-二分系列之-二分查找前言给大家推荐一下咱们的陪伴打卡小屋知识星球啦,详细介绍=>笔试刷题陪伴小屋-打卡赢价值丰厚奖励<=⏰小屋将在每日上午发放打卡题目,包括:一道该算法的模版题(主要以力扣,牛客,acwing等其他OJ网站的题目作为模版)一道该算法的应用题(主要以往......