苍穹外卖---新增员工(P16-P20)

一、需求分析和设计

(1)产品原型

一般在做需求分析时,往往都是对照着产品原型进行分析,因为产品原型比较直观,便于我们理解业务。后台系统中可以管理员工信息,通过新增员工来添加后台系统用户。

新增员工原型:

当填写完表单信息, 点击"保存"按钮后, 会提交该表单的数据到服务端, 在服务端中需要接受数据, 然后将数据保存至数据库中。

 

(2)接口设计

找到资料-->项目接口文档-->苍穹外卖-管理端接口.html

本项目约定:

管理端发出的请求,统一使用 /admin 作为前缀

用户端发出的请求,统一使用 /user 作为前缀

(3)表设计

新增员工,其实就是将我们新增页面录入的员工数据插入到employee表。

employee表结构:

其中,employee表中的status字段已经设置了默认值1,表示状态正常

二、代码开发

(1)设计DTO类

当前端提交的数据和实体类中对应的属性差别比较大时,建议使用DTO来封装数据。由于上述传入参数和实体类有较大差别,所以自定义DTO类。

进入sky-pojo模块,在com.sky.dto包下,已定义EmployeeDTO

(2)Controller层

EmployeeController中创建新增员工方法

进入到sky-server模块中,在com.sky.controller.admin包下,在EmployeeController中创建新增员工方法,接收前端提交的参数。

/    新增员工
//    @param employeeDTO
//    @return

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

(3)Service层接口

在EmployeeService接口中声明新增员工方法

进入到sky-server模块中,com.sky.server.EmployeeService

(4)Service层实现

在EmployeeServiceImpl中实现新增员工方法

com.sky.server.impl.EmployeeServiceImpl中创建方法


 /**
     * 新增员工
     *
     * @param employeeDTO
     */
    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和修改人id
        employee.setCreateUser(10L);//目前写个假数据,后期修改
        employee.setUpdateUser(10L);

        employeeMapper.insert(employee);//后续步骤定义
    }

 (5)Mapper层

在EmployeeMapper中声明insert方法

com.sky.EmployeeMapper中添加方法

  /**
     * 插入员工数据
     * @param employee
     */
    @Insert("insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user,status) " +
            "values " +
            "(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status})")
    void insert(Employee employee);

记得把EmployeeController 中的return null 改为 result.success()

三、功能测试

代码已经发开发完毕,对新增员工功能进行测试。

功能测试实现方式:

  • 通过接口文档测试

  • 通前后端联调测试

接下来我们使用上述两种方式分别测试。

(1)接口文档测试

启动服务:访问http://localhost:8080/doc.html,进入新增员工接口,记得重新启动项目,才会出现新增员工接口

报错原因:由于JWT令牌校验失败,导致EmployeeController的save方法没有被调用

解决方法:调用员工登录接口获得一个合法的JWT令牌

复制令牌

"eyJhbGciOiJIUzI1NiJ9.eyJlbXBJZCI6MSwiZXhwIjoxNzE4Nzg4NTEyfQ.MZThMA9BMC_ijVflCMCEieCDaInKKN5YEopGQ-z4Obs"

添加令牌:

将合法的JWT令牌添加到全局参数中

文档管理-->全局参数设置-->添加参数

 

 接口测试:

其中,请求头部含有JWT令牌

查看employee表: 测试成功

 

(2)前后端联调测试

启动nginx,访问 http://localhost

登录-->员工管理-->添加员工

注意由于开发阶段前端和后端是并行开发的,后端完成某个功能后,此时前端对应的功能可能还没有开发完成, 导致无法进行前后端联调测试。所以在开发阶段,后端测试主要以接口文档测试为主。  

四、代码完善

目前,程序存在的问题主要有两个:

  • 录入的用户名已存,抛出的异常后没有处理

  • 新增员工时,创建人id和修改人id设置为固定值

接下来,我们对上述两个问题依次进行分析和解决。

(1)问题一

描述:录入的用户名已存,抛出的异常后没有处理

分析:新增username=zhangsan的用户,若employee表中之前已存在。

解决:

通过全局异常处理器来处理。

进入到sky-server模块,com.sky.hander包下,GlobalExceptionHandler.java添加方法

	/**
     * 处理SQL异常
     * @param ex
     * @return
     */
    @ExceptionHandler
    public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
        //Duplicate entry 'zhangsan' for key 'employee.idx_username'
        String message = ex.getMessage();
        if(message.contains("Duplicate entry")){
            String[] split = message.split(" ");
            String username = split[2];
            String msg = username + MessageConstant.ALREADY_EXISTS;
            return Result.error(msg);
        }else{
            return Result.error(MessageConstant.UNKNOWN_ERROR);
        }
    }

进入到sky-common模块,在MessageConstant.java添加

 

public static final String ALREADY_EXISTS = "已存在";

再次,接口测试:

 

(2)问题二

描述:新增员工时,创建人id和修改人id设置为固定值

针对第二个问题,需要通过某种方式动态获取当前登录员工的id

员工登录成功后会生成JWT令牌并响应给前端  

后续请求中,前端会携带JWT令牌,通过JWT令牌可以解析出当前登录员工id

思考:解析出登录员工id后,如何传递给Service的save方法?

通过ThreadLocal进行传递。

(3)ThreadLocal

介绍:

ThreadLocal 并不是一个Thread,而是Thread的局部变量。 ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。

常用方法:

  • public void set(T value) 设置当前线程的线程局部变量的值

  • public T get() 返回当前线程所对应的线程局部变量的值

  • public void remove() 移除当前线程的线程局部变量

注意:客户端发送的每次请求,后端的Tomcat服务器都会分配一个单独的线程来处理请求

 

五、代码提交

六、问题解决 

(1)private EmployeeMapper employeeMapper;报红

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

System.Data.OracleClient.OracleException:“ORA-12571: TNS: 包写入程序失败

System.Data.OracleClient.OracleException:“ORA-12571: TNS: 包写入程序失败 解决方法: 首先%oracle_home%/network/admin下的sqlnet.ora文件,把SQLNET.AUTHENTICATION_SERVICES (NTS)加个 # 注释掉就好了

防爆监测系统:工业安全百科

防爆监测系统,作为现代工业安全领域的重要组成部分,对于预防和控制爆炸事故具有不可替代的作用。该系统集成了先进的传感技术、信号处理技术以及自动控制技术,实现对工业生产环境中潜在爆炸因素的实时监测和预警。 防爆监测系统能够精确识别…

RIP与OSPF发布默认路由(华为)

#交换设备 RIP与OSPF发布默认路由 合理使用默认路由可以很大程度上减少本地路由表的大小,并可以较好的隐藏一个网络中的路由信息,保护自身网络的隐秘性 另外如果在同一个路由器两端使用了不同的路由协议,那么如果不做路由引入或者发布默认…

vscode插件开发之 - Treeview视图

一些测试类插件,往往需要加载测试文件,并执行这些测试文件。以playwright vscode为例,该插件可以显示目录下所有的测试文件。如下图所示,显示了tests目录下的所有xxx.spec.js文件,那么如何在vscode插件开发中显示TreeV…

解锁TikTok内容趋势——高效获取TikTok标签信息接口

一、引言 在TikTok这个全球热门的短视频平台上,标签(Hashtags)是用户和内容创作者连接、发现新内容的重要工具。为了帮助品牌、市场分析师、内容创作者等更好地理解和利用TikTok上的内容趋势,我们推出了一款全新的接口服务&#…

正则表达式之三剑客grep

正则表达式匹配的是文本内容,linux的文本三剑客 都是针对文本内容 grep 过滤文本内容 sed 针对文本内容进行增删改查 awk 按行取列 文本三剑客都是按行进行匹配。 grep grep 的作用就是使用正则表达式来匹配文本内容 选项: -m …

赋能AI未来,景联文科技推出高质量亿级教育题库、多轮对话以及心理大模型数据

当前,大模型正如雨后春笋般不断涌现,不断推动着大模型产业的应用实践进入加速发展的新阶段。 景联文科技是AI数据服务公司,提供海量优质大模型数据集,涵盖文本、图像、视频、音频等多类型数据,致力于为不同训练阶段的算…

注意力机制简介

为了减少计算复杂度,通过借鉴生物神经网络的一些机制,我们引入了局部连接、权重共享以及汇聚操作来简化神经网络结构。神经网络中可以存储的信息量称为网络容量。一般来讲,利用一组神经元来存储信息的容量和神经元的数量以及网络的复杂度成正…

【机器学习300问】126、词嵌入(Word Embedding)是什么意思?

人类的文字,作为一种高度抽象化的符号系统,承载着丰富而复杂的信息。为了让电脑也能像人类一样理解并处理这些文字,科学家们不断探索各种方法,以期将人类的语言转化为计算机能够理解的格式。 一、One-Hot编码的不足 在自然语言处…

原生js制作svg 图标生成动态 tab栏切换效果(结尾附代码)

svg 图标生成动态 tab 栏 先看效果: 我想做一个 tab 栏比较美观的效果,当然切换的数据可以自己做一下,这里不演示,说一下特效如何制作。 当我点击时要将空心变为实心的这么一个效果,所以准备两个五角星样式一个是空…

【AI大模型】在健康睡眠监测中的深度融合与实践案例

文章目录 1. 应用方案2. 技术实现2.1 数据采集与预处理2.2 构建与训练模型2.3 个性化建议生成 3. 优化策略4. 应用示例:多模态数据融合与实时监测4.1 数据采集4.2 实时监测与反馈 5. 深入分析模型选择和优化5.1 LSTM模型的优势和优化策略5.2 CNN模型的优势和优化策略…

DeepSpeed Pipeline并行

DeepSpeed为了克服一般Pipeline并行的forward时weights,和backward时计算梯度的weights, 二者不相同的问题,退而求其次,牺牲性能,采用gradient-accumulate方式,backward时只累积梯度至local,并不更新weights&#xff1…

手机录屏声音怎么录?2个小妙招教会你

手机录制好的视频怎么没有声音?你是否也遇到了这个难题?在日常生活中,手机录屏功能已经成为我们生活和工作中的得力助手。而录屏的声音,作为录屏功能的重要组成部分,更是为我们的录制体验增添了不少色彩。那么&#xf…

如何提升外链网站的收录率?

要提高外链网站的收录率,要明确的一点是,被收录的外链才能发挥最大的作用,因此,提升收录率是首要任务。一个有效的方法是使用GPC爬虫池,这样可以大幅度提高谷歌蜘蛛对众多外链网站页面的抓取频率 通过GPC爬虫池的引导…

基于CLIP 建模用于假图像检测探索与应用

概述 论文地址:https://arxiv.org/pdf/2402.12927 源码地址:https://github.com/sohailahmedkhan/CLIPping-the-Deception 本研究探讨了如何使用 CLIP 这一图像和语言的多模态底层模型来检测伪造图像。这项研究的一个重要创新点是,它建立了…

Linux C编译器从零开发三

AST语法树 BNF抽象 expr equality equality relational ("" relational | "!" relational)* relational add ("<" add | "<" add | ">" add | ">" add)* add mul ("" …

2024年光电信息、光学工程与机器视觉国际学术会议(OIOEMV 2024)

2024年光电信息、光学工程与机器视觉国际学术会议(OIOEMV 2024) 2024 International Conference on Optoelectronic Information, Optical Engineering and Machine Vision 会议地点&#xff1a;厦门&#xff0c;中国 网址&#xff1a;www.oioemv.com 邮箱: oioemvsub-conf…

如何在前端项目中用字体图标替换图片,方便减小打包体积和统一切换颜色

1.进入阿里妈妈矢量图标图库 地址&#xff1a;阿里妈妈矢量图 2.搜索自己想要的图标 3.添加自己想要的图标 4.把刚才选的图标&#xff0c;添加到自己要下载的项目 5.把项目下载到本地 6.引入iconfont.css 在div上增加对应的类名就可以啦 下载的所有类名都在下面的demo_index…

校园学生选课系统

摘 要 如今&#xff0c;随着互联网技术的不断推进与发展&#xff0c;信息技术已经在各行各业得到了应用。当前&#xff0c;高等院校也应该紧跟时代步伐&#xff0c;紧紧地依靠技术的发展&#xff0c;在信息化技术的服务和应用的基础上&#xff0c;对高校教育环节中存在的问题进…

跟张良均老师学大数据人工智能|企业项目试岗实训开营

我国高校毕业生数量连年快速增长&#xff0c;从2021年的909万人到2022年的1076万人&#xff0c;再到2023年的1158万人&#xff0c;预计到2024年将达到1187万人&#xff0c;2024年高校毕业生数量再创新高。 当年高校毕业生人数不等于进入劳动力市场的高校毕业生人数&#x…