校园外卖点餐系统——Day02【员工管理业务开发】

❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注、点赞、收藏、评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉

一、完善登录功能

1. 问题分析

前面我们已经完成了后台系统的员工登录功能开发,但是还存在一个问题:用户如果不登录,直接访问系统首页面,照样可以正常访问。

这种设计并不合理,我们希望看到的效果应该是,只有登录成功后才可以访问系统中的页面,如果没有登录则跳转到登录页面。

那么,具体应该怎么实现呢?

答案就是使用过滤器或者拦截器,在过滤器或者拦截器中判断用户是否已经完成登录,如果没有登录则跳转到登录页面。


2. 代码实现

  • 创建自定义过滤器 LoginCheckFilter

    /*** 检查用户是否已经完成登录*/
    @Slf4j
    @WebFilter(filterName = "LoginCheckFilter", urlPatterns = "/*")
    public class LoginCheckFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;log.info("拦截到请求:{}", request.getRequestURI());filterChain.doFilter(request, response);}
    }
    
  • 在启动类上加入注解 @ServletComponentScan

  • 完善过滤器的处理逻辑
    1、获取本次请求的URL
    2、判断本次请求是否需要处理
    3、如果不需要处理,则直接放行
    4、判断登录状态,如果已登录,则直接放行
    5、如果未登录则返回登录结果
    在这里插入图片描述

/*** 检查用户是否已经完成登录*/
@Slf4j
@WebFilter(filterName = "LoginCheckFilter", urlPatterns = "/*")
public class LoginCheckFilter implements Filter {//路径匹配器,支持通配符public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;//1、获取本次请求的URIString requestURI = request.getRequestURI();// /backend/index.htmllog.info("拦截到请求:{}", requestURI);//定义不需要处理的请求路径String[] urls = new String[]{"/employee/login","/employee/logout","/backend/**","/front/**"};//2、判断本次请求是否需要处理boolean check = check(urls, requestURI);//3、如果不需要处理,则直接放行if(check) {log.info("本次请求{}不需要处理", requestURI);filterChain.doFilter(request, response);return;}//4、判断登录状态,如果已登录,则直接放行if(request.getSession().getAttribute("employee") != null){log.info("用户已登录,用户id为:{}", request.getSession().getAttribute("employee"));filterChain.doFilter(request, response);return;}log.info("用户未登录");//5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));return;}/*** 路径匹配,检查本次请求是否需要放行* @param urls* @param requestURI* @return*/public boolean check(String[] urls, String requestURI){for (String url : urls) {boolean match = PATH_MATCHER.match(url, requestURI);if(match) {return true;}}return false;}
}

二、新增员工

1. 需求分析

后台系统中可以管理员工信息,通过新增员工来添加后台系统用户。点击 “添加员工”按钮跳转到新增页面,如下:
在这里插入图片描述

2. 数据模型

新增员工,其实就是将我们新增页面录入的员工数据插入到employee表。需要注意,employee表中对username字段加入了唯一约束,因为username是员工的登录账号,必须是唯一的。

3. 代码开发

 /*** 新增员工* @param employee* @return*/@PostMappingpublic R<String> save(HttpServletRequest request, @RequestBody Employee employee) {log.info("新增员工,员工信息:{}", employee.toString());//设置初始密码为123456,需要进行md5加密处理employee.setPassword(DigestUtils.md5DigestAsHex("1232456".getBytes()));employee.setCreateTime(LocalDateTime.now());employee.setUpdateTime(LocalDateTime.now());//获取当前登录用户登录的idLong empId = (Long)request.getSession().getAttribute("employee");employee.setCreateUser(empId);employee.setUpdateUser(empId);employeeService.save(employee);return R.success("新增员工成功");}

前面的程序还存在一个问题,就是当我们在新增员工时输入的账号已经存在,由于employee表中对该字段加入了唯一约束,此时程序会抛出异常:
java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'heniang' for key 'idx_username'

此时需要我们的程序进行异常捕获,通常有两种处理方式:

1、在Controller方法中加入try.catch进行异常捕获

2、使用异常处理器进行全局异常捕获

/*** 全局异常处理*/
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {/*** 异常处理方法* @return*/@ExceptionHandler(SQLIntegrityConstraintViolationException.class)public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){log.error(ex.getMessage());if(ex.getMessage().contains("Duplicate entry")){String[] split = ex.getMessage().split(" ");String msg = split[2] + "已存在";return R.error(msg);}return R.error("未知错误");}
}

三、员工信息分页查询

1. 需求分析

系统中的员工很多的时候,如果在一个页面中全部展示出来会显得比较乱,不便于查看,所以一般的系统中都会以分页的方式来展示列表数据。
在这里插入图片描述

2. 代码开发

在开发代码之前,需要梳理一下整个程序的执行流程:

  • 页面发送ajax请求,将分页查询参数(page.pageSize、name)提交到服务端
  • 服务端Controller接收页面提交的数据并调用Service查询数据
  • Service调用Mapper操作数据库,查询分页数据
  • Controller将查询到的分页数据响应给页面
  • 页面接收到分页数据并通过ElementUI的Table组件展示到页面上

配置MP分页插件:

/*** 配置MP的分页插件*/
@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());return mybatisPlusInterceptor;}
}

员工信息分页查询:

/*** 员工信息分页查询* @param page* @param pageSize* @param name* @return*/@GetMapping("/page")public R<Page> page(int page, int pageSize, String name) {log.info("page = {},pageSize = {},name = {}" ,page,pageSize,name);//构造分页构造器Page pageInfo = new Page(page, pageSize);//构造条件构造器LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper();//添加过滤条件queryWrapper.like(StringUtils.isNotEmpty(name), Employee::getName,name);//添加排序条件queryWrapper.orderByDesc(Employee::getUpdateTime);//执行查询employeeService.page(pageInfo, queryWrapper);return R.success(pageInfo);}

3. 功能测试

在这里插入图片描述


四、启用/禁用员工账号

1. 需求分析

在员工管理列表页面,可以对某个员工账号进行启用或者禁用操作。账号禁用的员工不能登录系统,启用后的员工可以正常登录。

需要注意,只有管理员(admin用户)可以对其他普通用户进行启用、禁用操作,所以普通用户登录系统后启用、禁用按钮不显示。

2. 代码开发

在开发代码之前,需要梳理一下整个程序的执行过程:

1、页面发送ajax请求,将参数(id、 status)提交到服务端

2、服务端Controller接收页面提交的数据并调用Service更新数据

3、Service调用Mapper操作数据库
在这里插入图片描述

根据id修改员工信息:

	/*** 根据id修改员工信息* @param employee* @return*/@PutMappingpublic R<String> update(HttpServletRequest request, @RequestBody Employee employee) {log.info(employee.toString());Long empId = (Long)request.getSession().getAttribute("employee");employee.setUpdateTime(LocalDateTime.now());employee.setUpdateUser(empId);employeeService.updateById(employee);return R.success("员工信息修改成功");}

测试过程中没有报错,但是功能并没有实现,查看数据库中的数据也没有变化。观察控制台输出的SQL:
在这里插入图片描述
SQL执行的结果是更新的数据行数为0,仔细观察id的值,和数据库中对应记录的id值并不相同:
在这里插入图片描述


代码修复
通过观察控制台输出的SQL发现页面传递过来的员工id的值和数据库中的id值不一致,这是怎么回事呢?

分页查询时服务端响应给页面的数据中id的值为19位数字,类型为long。

页面中js处理long型数字只能精确到前16位,所以最终通过ajax请求提交给服务端的时候id就改变了。

前面我们已经发现了问题的原因,即js对long型数据进行处理时丢失精度,导致提交的id和数据库中的id不一致。

如何解决这个问题?

我们可以在服务端给页面响应json数据时进行处理,将long型数据统一转为String字符串


具体实现步骤

(1) 提供对象转换器JacksonobjectMapper,基于Jackson进行Java对象到json数据的转换

/*** 对象映射器:基于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) 在WebMvcConfig配置类中扩展Spring mvc的消息转换器,在此消息转换器中使用提供的对象转换器进行Java对象到json数据的转换

 /*** 扩展mvc框架的消息转换器* @param converters*/@Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {log.info("扩展消息转换器...");//创建消息转换器对象MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();//设置对象转换器,底层使用Jackson将Java对象转为jsonmessageConverter.setObjectMapper(new JacksonObjectMapper());//将上面的消息转换器对象追加到mvc框架的转换器集合中converters.add(0,messageConverter);}

3. 功能测试

在这里插入图片描述


五、编辑员工信息

1. 需求分析

在员工管理列表页面点击编辑按钮,跳转到编辑页面,在编辑页面回显员工并进行修改,最后点击按钮完成编辑操作。
在这里插入图片描述


2. 代码实现

在开发代码之前需要梳理一下操作过程和对应的程序的执行流程:
1、点击编辑按钮时,页面跳转到add.html,并在url中携带参数[员工id]

2、在add.html页面获取url中的参数[员工id]

3、发送ajax请求,请求服务端,同时提交员工id参数

4、服务端接收请求,根据员工id查询员工信息,将员工信息以json形式响应给页面

	 /*** 根据id查询员工信息* @param id* @return*/@GetMapping("/{id}")public R<Employee> getById(@PathVariable Long id) {log.info("根据id查询员工信息...");Employee employee = employeeService.getById(id);if (employee != null) {return R.success(employee);}return R.error("没有查询到对应员工信息");}

5、页面接收服务端响应的json数据,通过VUE的数据绑定进行员工信息回显

6、点击保存按钮,发送ajax请求,将页面中的员工信息以json方式提交给服务端

7、服务端接收员工信息,并进行处理,完成后给页面响应

8、页面接收到服务端响应信息后进行相应处理

注意: add.html页面为公共页面,新增员工和编辑员工都是在此页面操作,所以该代码部分与之前添加员工代码对应,不需要重写。


创作不易,如果有帮助到你,请给文章点个赞和收藏,让更多的人看到!!!
关注博主不迷路,内容持续更新中。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

餐道中台如何赋能餐饮零售企业?

前不久&#xff0c;餐道A轮融资1亿元&#xff0c;是近期餐饮行业信息化领域最大的一笔。这家公司融资的目的是为了加强“SaaS 业务数据双中台”系统研发。那么&#xff0c;这家公司是谁&#xff0c;为什能拿到融资&#xff0c;此次融资之后会朝着何处发展&#xff0c;为业内带来…

餐饮行业管理系统技术开发详细步骤详解

一. 项目介绍 本系统主要应用在餐饮行业&#xff0c;可以适用于中餐、西餐、快餐、火锅、烤肉等&#xff0c;主要功能分前端和后端两部分。前端主要完成就餐客户的餐厅预定及点菜环节&#xff0c;后端主要完成餐厅、餐桌的设置&#xff0c;菜品的设置等 系统分为前端和后台两…

教你如何实现门店餐饮快速裂变的解决方案

随着互联网市场的迅速发展&#xff0c;很多实体店受到电商行业的影响&#xff0c;客流量是越来越少&#xff0c;再加上这几年的疫情影响&#xff0c;实体店真的是越来越难做了特别是餐饮行业&#xff0c;以至于身边随处可见的门店关门、转让。难道就实体店就走向谷底了吗&#…

外卖项目01---软件开发整体介绍

目录 一、软件开发整体介绍 03 1.1软件开发流程 03 1.2角色分工 1.3软件环境 二、外卖项目介绍 04 2.1项目介绍 2.2产品原型展示 2.3技术选型 2.4功能架构 2.5项目上线后的角色分类 三、开发环境搭建 05 3.1数据库环境搭建 3.2maven项目搭建 06 四、后台登陆功…

如何为餐饮商家打造代运营解决方案?

外卖行业成餐饮主战场之一&#xff0c;食咖助力商户抢占流量入口 外卖行业是目前餐饮的另外一个非常重要的主战场&#xff0c;作为其细分领域&#xff0c;外卖代运营主要集中在产业图谱中的平台端口&#xff0c;食咖代运营的核心&#xff0c;是运营团队落地助力商户抢占线上的…

案例:基于大数据的餐饮公司会员营销及O2O应用策略

来源&#xff1a;软件定义世界 主讲嘉宾&#xff1a;龚光宇&#xff0c;上海一茶一坐餐饮有限公司CIO&CMO&#xff0c;来自台湾&#xff0c;24年IT工作经验&#xff0c;2004年加入上海一茶一坐餐饮有限公司任CIO&#xff0c;2012年兼任CMO&#xff0c;2011年IT经理世界中国…

餐饮企业提升用户价值,从基于点单链路的精细化运营开始

近几年&#xff0c;餐饮业的经营增长面临着巨大挑战&#xff0c;在这种情况下&#xff0c;餐饮企业如何提升用户价值&#xff0c;提高多风险下持续增长的动力呢&#xff1f;神策数据杨丽月聚焦用户运营&#xff0c;围绕“一条链路&#xff0c;四个指标”&#xff0c;跟大家分享…

Whale帷幄 - 餐饮店怎么运营管理 餐饮门店运营管理方案

您在管理门店时&#xff0c;是否有这些烦恼&#xff1f; 数据四处分散&#xff0c;难以统一采集治理门店规范不一致&#xff0c;难以远程实时监督线下门店体验差&#xff0c;难以洞察顾客轨迹门店运营成本高&#xff0c;难以评估业绩ROI 帷幄空间数据平台&#xff08;SDP&…

外卖项目05---套餐管理业务开发

套餐&#xff1a;一组菜品的集合 点击之后就会弹出下面的界面&#xff1a; 上面是后台的管理操作&#xff0c;下面是处理完成后在用户端展示的界面效果&#xff1a; 目录 一、新增套餐 70 1.1需求分析 70 1.2数据模型 70 1.3新增套餐---代码开发---准备工作&梳理交互过…

校园外卖点餐系统——Day04【菜品管理业务开发】

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

小饭馆拓客营销流程,小饭馆宣传推广方案

基于目前持续回暖的餐饮行业&#xff0c;小饭馆起死回生&#xff0c;业绩翻倍&#xff0c;关键在于营销推广。那么如何进行小饭馆的推广&#xff1f;今天我们就和各位聊聊小饭馆引流推广应该如何做&#xff01; 小饭馆营销推广流程 小饭馆引流推广方案主要包含如下&#xff1a…

基于python Django 餐馆点菜管理系统

问题描述&#xff1a; 随着网络的迅速发展&#xff0c;越来越多的人开始接受甚至时依赖了网络营业的这种交易形式&#xff0c;传统的点菜模式不仅浪费时间&#xff0c;效率低下&#xff0c;而且特别耗费成本与人力&#xff0c;因此不少商家开始使用网上点菜系统。网上点菜系统是…

软件测试项目实战,一比一还原可以写进简历的

项目一&#xff1a;ShopNC商城 项目概况&#xff1a; ShopNC商城是一个电子商务B2C电商平台系统&#xff0c;功能强大&#xff0c;安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城&#xff0c;系统PC后台是基于ThinkPHP MVC构架开发的跨…

软件测试【个人简历】展示模板

个人简历 就职目标&#xff1a;软件测试工程师 简历是我们求职的第一步&#xff0c;也是非常重要的一步。 如果你简历写的一塌糊涂&#xff0c;那么你瞬间就会被淘汰&#xff0c;那么一份好的简历应该怎么写呢&#xff1f; 一般分为如下几部分内容&#xff1a; 1、个人基本…

软件测试电商项目实战(写进简历没问题)

前言 说实话&#xff0c;在找项目的过程中&#xff0c;我下载过&#xff08;甚至付费下载过&#xff09;N多个项目、联系过很多项目的作者&#xff0c;但是绝大部分项目&#xff0c;在我看来&#xff0c;并不适合你拿来练习&#xff0c;它们或多或少都存在着“问题”&#xff…

如何介绍简历中的项目呢?请看软件测试老师的分享

项目经验与工作经验是相辅相成的&#xff0c;但较之于工作经验&#xff0c;项目经验更侧重于表现求职者在某个专业领域内的技能水平&#xff08;技能水平决定了工资水平&#xff09;。因而&#xff0c;技术类岗招聘的时候&#xff0c;更注重项目经验。项目介绍是有套路的&#…

软件测试的简历里面,项目介绍要怎么写好呢

一、如果你是做功能测试&#xff08;项目介绍可以这样&#xff09; 项目一&#xff1a;2019/4-至今 项目简介&#xff1a;该项目是题库/考勤APP&#xff0c;主要的功能有题库、考勤、用户信息系统、直播视频、社区板块。迭代了多少次xxx,目前正在正常运营xxx. 负责模块&#…

详解9个写进简历的数据分析项目

核心知识点覆盖 Excel、Python、SQL、Pandas、Numpy、Matplotlib、Power BI、PyEcharts可视化、数据指标、波士顿矩阵、数据建模、AARRR模型、漏斗模型、RFM模型、A\BTest、逻辑回归、线性回归、预测分析、K近邻算法、网络爬虫、数据化运营、用户画像体系构建 9大企业项目实战 …

可以写进简历的软件测试项目实战经验(包含电商、银行、app等)

目录 目录 前言&#xff1a; 1、项目名称: 家电购 2、项目名称: 瑞德商城 3、项目名称:随意读(APP) 4、项目&#xff1a;东海农村商行 总结 前言&#xff1a; 今天给大家带来几个软件测试项目的实战总结及经验&#xff0c;适合想自学、转行或者面试的朋友&#xff0c;可…

postmessage通信

在业务中&#xff0c;有一种开发形式为&#xff1a;多个子系统集成为一个父系统。每个系统之间都管理着不同的业务与逻辑&#xff0c;他们是互不干涉的。 那么&#xff0c;我们如何在父系统页面中操作子系统中的内容呢&#xff1f; 首先通过vite初始化两个项目。 父系统端口…