黑马苍穹外卖学习Day2

news2024/11/20 14:21:24

文章目录

    • 员工管理模块实现
      • 新增员工
        • 需求设计分析
        • 代码开发
        • 功能测试
        • 代码完善
      • 员工分页查询
        • 需求分析与设计
        • 代码开发
        • 功能测试
        • 代码完善
      • 启用禁用员工账号
        • 需求分析和设计
        • 代码开发
        • 功能测试
      • 编辑员工
        • 需求分析
        • 代码开发
      • 导入分类模块功能代码
        • 需求分析设计

员工管理模块实现

新增员工

需求设计分析

一般由产品经理设计,根据产品原型图来进行逻辑设计与开发。
在这里插入图片描述
设计接口
在这里插入图片描述
数据库设计
在这里插入图片描述

代码开发

在这里插入图片描述
在Controller层中代码

    /**
     *新增员工
     */
    @PostMapping
    @ApiOperation("新增员工")
    public Result save(@RequestBody EmployeeDTO employeeDTO){
        log.info("新增员工:{}",employeeDTO);
        employeeService.save(employeeDTO);
        return Result.success();
    }

接口类

    /**
     * 新增员工实现方法
     * @param employeeDTO
     */
    void save(EmployeeDTO employeeDTO);

实现类

   /**
     * 新增员工
     * @param employeeDTO
     */
    @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
        //TODO 后期需要改为当前登录用户的id,目前先要写死
        employee.setCreateUser(10L);
        employee.setUpdateUser(10L);

        employeeMapper.insert(employee);
    }

后端Mapper类

    /**
     * 插入员工数据
     * 数据库变量中默认kebab下划线命名方式(此为历史惯例),在Mybatis中需要通过yml进行驼峰命名转换符合变量命名习惯
     * @param employee
     */

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

开发阶段更多通过接口文档测试
在这里插入图片描述
使用接口文档进行测试
在这里插入图片描述
在这里插入图片描述

使用debug调试时初始会报401接口异常,是因为jwt令牌拦截未通过。
在这里插入图片描述
那如何测试呢?
要先通过登录接口debug获取一个令牌
在这里插入图片描述
通过左侧文档管理设置一个全局令牌,参数值即为登录接口所获得的令牌
在这里插入图片描述
再重新进行debug测试数据已封装好
在这里插入图片描述
插入成功
在这里插入图片描述

代码完善

存在问题

  • 程序对用户名相同时的数据库异常没有处理。
    解决方法
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  • 创建人,修改人ID设置为了固定的值
    解决方法在这里插入图片描述在这里插入图片描述
    在拦截器中存入,service实现类中取出
            //在拦截器中存入
            BaseContext.setCurrentId(empId);
            //Controller层
        employee.setCreateUser(BaseContext.getCurrentId());
        employee.setUpdateUser(BaseContext.getCurrentId());

员工分页查询

需求分析与设计

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

代码开发

controller层

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

Service实现类

    /**
     * 分页查询实现类
     * @param employeePageQueryDTO
     * @return
     */
    @Override
    public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {
        //select * from employee limit 0,10
        //使用PageHelper分页插件
        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中使用xml方式,动态SQL

    <select id="pageQuery" resultType="com.sky.entity.Employee">
        select  * from employee
        <where>
            <if test="name!=null and name!=''">
#             使用concat拼接字符串
                and name like concat('%',#{name},'%')
            </if>
        </where>
#         降序排序
        order by create_time desc
    </select>
</mapper>

同时复习一下动态SQL的知识

在MyBatis中,动态SQL是一种能够根据不同条件生成不同SQL语句的机制。这使得在查询、更新、插入或删除数据时,可以根据运行时的条件动态地构建SQL语句,而不是在静态的SQL语句中硬编码所有条件。动态SQL通过在XML映射文件中使用一些特定的元素来实现,这些元素允许根据条件包含或排除不同的SQL片段。
where标签:

where标签用于在生成SQL语句时提供一个条件判断块,它会自动去除首个条件之前的多余的AND或OR。这使得可以在使用动态SQL时更灵活地拼接条件,而无需过多的考虑首个条件是否需要添加AND或OR。

<select id="findUsers" parameterType="map" resultType="User">
    SELECT * FROM users
    <where>
        <if test="username != null">
            AND username = #{username}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>

对比直接使用WHERE则需要手动添加逻辑连接符(如AND、OR)和条件语句,对于首个条件需要额外注意不要添加不必要的连接符。

<select id="findUsers" parameterType="map" resultType="User">
    SELECT * FROM users
    WHERE
        <if test="username != null">
            AND username = #{username}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
</select>

功能测试

注意token令牌过期问题需要使用接口登录获取新的token并设置全局变量
在这里插入图片描述

代码完善

问题:日期格式不规范
在这里插入图片描述
解决方案:
在这里插入图片描述
其中方式一仅对当前注解的变量有效,以后用到日期格式时需要重新添加。推荐使用第二种方式。
方法二,在WebMvcConfiguration配置类中重写父类

    /**
     * 扩展Spring MVC框架的消息转换器
     * @param converters
     */
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        log.info("扩展消息转换器..");
        //创建一个消息转换器对象
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        //需要为消息转换器设置一个对象转换器,可以将Java对象序列化为json数据
        converter.setObjectMapper(new JacksonObjectMapper());
        //将自己的消息转换器加入容器中
        converters.add(0,converter);
    }

修改成功
在这里插入图片描述

启用禁用员工账号

需求分析和设计

在这里插入图片描述
业务规则:

  • 可以对状态为“启用”的员工账号进行“禁用”操作
  • 可以对状态为“禁用”的员工账号进行“启用”操作
  • 状态为“禁用”的员工账号不能登录系统

接口文档:
在这里插入图片描述

代码开发

在启用以及禁用过程中,当用户在浏览器界面点击启用禁用按钮时,参数可以将status值由1变0,由0变1,大概率是通过前端的JavaScript 的功能逻辑实现的,后期查看前端代码再解决。
Controller层

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

@PathVariable以及前面@RequestBody 两个注解异同点总结

  • @PathVariable 主要用于从 URI 路径中提取变量值,适用于处理 RESTful 风格的请求。

  • @RequestBody 主要用于将请求体中的数据映射到方法的参数上,适用于处理 POST、PUT 等请求,接收客户端JSON 数据传递的数据。
    Service实现类

    /**
     * 启用禁用员工账号
     * @param status
     * @param id
     */
    @Override
    public void startOrStop(Integer status, Long id) {
        //update employee set staus= ? where id= ?
        Employee employee = new Employee();
        employee.setStatus(status);
        employee.setId(id);
        employeeMapper.update(employee);
    }

Mapper中的XML
因为只需要改status值即可,其实可以只写那一句status的标签但为了后续功能开发方便代码复用,所以全部判断并更新一遍。

   <update id="update" parameterType="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>
  • id=“update”:这是更新操作的唯一标识符,用于在 Java 代码中调用这个更新操作时引用该操作。
  • parameterType=“Employee”:指定了传递给 SQL 语句的参数类型为Employee。表示你可以在这个更新操作中使用Employee 类型的对象来传递参数。

在where中#{id} 中的 id 是指 Employee 对象中的属性,表示通过参数传递进来的 Employee 对象中的 id属性的值。具体的传递过程是在调用这个更新操作的 Java 代码中,通过传递一个包含 id 属性的 Employee 对象,将 id的值传递给 SQL 语句。

功能测试

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

编辑员工

需求分析

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

代码开发

根据id查询用户信息
此接口设计data中信息太多,实际上要根据id查询并回显用户信息仅用EmployeeDTO即可,不需要使用Employee可能还可以防止数据泄露提高安全性。
Controller层

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

Service实现层

    @Override
    public EmployeeDTO getById(Long id) {
        EmployeeDTO employeeDTO=employeeMapper.getById(id);
        return employeeDTO;
    }

Mapper层

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

编辑员工信息
Controller层

    /**
     * 编辑员工信息
     * @param employeeDTO
     * @return
     */
    @PutMapping
    @ApiOperation("编辑员工信息")
    public Result update(@RequestBody EmployeeDTO employeeDTO){
        log.info("编辑员工信息:{}",employeeDTO);
        employeeService.update(employeeDTO);
        return Result.success();
    }

Servcie层

    /**
     * 编辑员工信息
     * @param employeeDTO
     */
    @Override
    public void update(EmployeeDTO employeeDTO) {
        Employee employee = new Employee();
        //属性拷贝将DTO的属性赋值给employee对象
        BeanUtils.copyProperties(employeeDTO, employee);
        employee.setUpdateTime(LocalDateTime.now());
        employee.setUpdateUser(BaseContext.getCurrentId());
        employeeMapper.update(employee);
    }

导入分类模块功能代码

需求分析设计

在这里插入图片描述
在这里插入图片描述
剩余按照项目提供的代码导入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1375239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序基础学习(组件化)

&#xff08;一&#xff09;创建 找到components文件夹下面创建新的文件夹 然后再文件夹内创建component格式的文件 创建后这样 我创建的是my-info的文件夹以及my-info的components文件&#xff0c;跟着普通的页面一样 &#xff08;二&#xff09; 注册组件 找到你需要使用组…

刚开始学习 c++ 要注意哪些方面?

刚开始学习 c 要注意哪些方面&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&…

API获取商品详情电商补单及价格监控调用api

很多电商系统&#xff0c;如返利系统、ERP、OMS软件等&#xff0c;需要通过商品API接口获取商品详情信息&#xff0c;来满足业务场景需要。具体包括&#xff1a;商品的标题、价格、SKU、主图、评价等维度信息 获取key和密钥 返回数据&#xff1a; {"item": {"…

MacOS安装Miniforge、Tensorflow、Jupyter Lab等(2024年最新)

大家好&#xff0c;我是邵奈一&#xff0c;一个不务正业的程序猿、正儿八经的斜杠青年。 1、世人称我为&#xff1a;被代码耽误的诗人、没天赋的书法家、五音不全的歌手、专业跑龙套演员、不合格的运动员… 2、这几年&#xff0c;我整理了很多IT技术相关的教程给大家&#xff0…

查看Linux磁盘空间

(1)、该命令会列出当前系统所有挂载的文件系统以及它们的使用情况&#xff0c;包括总容量、已用空间、可用空间、使用百分比等信息 df -h如果查看某一个文件夹的,可以 df -h folderName (2)、计算指定目录下所有文件和子目录所占用的磁盘空间大小&#xff0c;并以人类可读的格…

创建型模式 | 工厂模式

文章目录 一、简单工厂1.1、原理1.2、核心角色1.3、UML类图1.4、代码实现1.5、总结 二、工厂模式2.1、原理2.2、关键角色2.3、代码实现2.4、总结 三、抽象工厂模式3.1、原理3.2、关键角色3.3、UML类图3.4、工厂模式与抽象工厂模式的区别 前言 工厂模式是最常用的设计模式之一&a…

ROS---激光雷达的使用

ROS—激光雷达的使用 激光雷达是现今机器人尤其是无人车领域及最重要、最关键也是最常见的传感器之一&#xff0c;是机器人感知外界的一种重要手段。本文将介绍在ROS下使用激光雷达传感器&#xff0c;我们选用的激光雷达型号为思岚A1。 使用流程如下: 硬件准备&#xff1b;软…

C++——简介、Hello World、变量常量、数据类型

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

idea编译报错(Maven项目)

idea编译报错 找不到符号 第一步&#xff1a;开启注解处理器 第二步&#xff1a;清理MVN&#xff0c;package并重新编译 第三步&#xff1a;重新导入项目&#xff1a;

本地开发环境请求服务器接口跨域的问题(vue的问题)

上面的这个报错大家都不会陌生&#xff0c;报错是说没有访问权限&#xff08;跨域问题&#xff09;。本地开发项目请求服务器接口的时候&#xff0c;因为客户端的同源策略&#xff0c;导致了跨域的问题。下面先演示一个没有配置允许本地跨域的的情况&#xff1a; 可以看到&…

【亲测有效】Win11 卸载MySQL5.7以及安装MySQL8.0.35

目录 一、卸载原来本地的mysql5.7 1.mysql服务部分 1.1停止mysql服务 1.2删除mysql服务 2.卸载 MySQL程序 3.残余文件的清理 3.1删除mysql安装的目录 3.2删除mysql数据存放的目录 3.3删除mysql自定义目录 4.清理注册表 5.删除环境变量配置 二、安装mysql8.0.35 1.…

Explain详解与索引最佳实践

Mysql安装文档参考&#xff1a;https://blog.csdn.net/yougoule/article/details/56680952 Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句&#xff0c;分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字&#xff0c;MySQL 会在查询…

全网第一篇教你怎么总结多线程知识

于「全景图」&#xff0c;我之前也有一直在构建&#xff0c;可是因为知识储备不够&#xff0c;确实很难构建出来。稍微了解过并发领域知识的人都知道&#xff0c;里面的知识点、概念多而散&#xff1a;线程安全、锁、同步、异步、阻塞、非阻塞、死锁、队列(为什么并发要跟队列扯…

2024年云服务器配置推荐,看看哪家便宜?

作为多年站长使市面上大多数的云厂商的云服务器都使用过&#xff0c;很多特价云服务器都是新用户专享的&#xff0c;本文有老用户特价云服务器&#xff0c;阿腾云atengyun.com有多个网站、小程序等&#xff0c;国内头部云厂商阿里云、腾讯云、华为云、UCloud、京东云都有用过&a…

Backtrader 文档学习-Strategy with Signals

Backtrader 文档学习-Strategy with Signals backtrader可以不通过重写策略的方式触发交易&#xff0c;尽管重写策略是首选通用的方式。 下面介绍通过使用信号也是可以实现交易触发的。 1.定义signal import backtrader as btdata bt.feeds.OneOfTheFeeds(datanamemydatana…

微信公众号使用后端代码接入开发指南

1. 部署到服务器一套后端服务 要求&#xff1a;外界通过get请求可以访问到该服务&#xff0c;并且该地址只返回文本&#xff1a;hello, this is handle view&#xff0c;这就是下面这段代码的意思 这段代码的意思就是服务匹配到/wx的get请求&#xff0c;返回文本hello, this …

【UE Niagara学习笔记】07 - 火焰的热变形效果

目录 效果 步骤 一、创建热变形材质 二、添加新的发射器 2.1 设置粒子材质 2.2 设置粒子初始大小 2.3 设置粒子持续生成 三、修改材质 四、设置粒子效果 在上一篇博客&#xff08;【UE Niagara学习笔记】06 - 制作火焰喷射过程中飞舞的火星&#xff09;的基础上继续…

机器学习之特征工程

一、背景 什么是特征&#xff1f;在机器学习中,特征是一个现象的个别可测量的属性或特征。让我们观察一束阳光&#xff0c;直接看的话&#xff0c;它是白光&#xff0c;但是我们使用三菱镜&#xff0c;它就是七种颜色的光。所以&#xff0c;选取的事物的特征不同&#xff0c;我…

能赚钱的GPT Store正式上线!如何将自己的 GPT 放到商店中?

等了两个月&#xff0c;OpenAI 的 GPT Store 今日凌晨终于上线&#xff01;上线 GPT Store 的同时&#xff0c;OpenAI 同步了最新的 GPTs 数据&#xff1a;截止到1月11日&#xff0c;用户已创建300万的GPTs&#xff01; GPTs 开发者可以通过 GPTs 来获利。OpenAI 将在今年第一季…

PLECS如何下载第三方库并导入MOSFET 的xml文件,xml库路径添加方法及相关问题

1. 首先xml库的下载&#xff0c;PLECS提供了一个跳转的链接。 https://www.plexim.com/download/thermal_models 2. 下载一个库&#xff08;以最后一个Wolfspeed为例&#xff0c;属于CREE的SiC MOSFET&#xff09; 下载这个就行&#xff0c;都包含了。不信自己可以试试再下载…