瑞吉外卖-后台系统功能

目录

  • 前言
  • 后台系统登录功能
    • 需求分析
    • 代码实现
      • 实体类
      • Mapper层
      • Service层
      • Controller层
    • 总结
  • 后台系统退出功能
    • 需求分析
    • 代码实现
    • 总结
  • 后台登录优化
    • 需求分析
    • 代码实现
      • 方法一:过滤器
      • 方法二:拦截器
    • 总结

前言

所有的命名要符合开发规范,本项目中不再解释命名对应的是哪一个模块,以及变量名的意思

后台系统登录功能

需求分析

后台系统登录主要需要实现以下功能

  • 前端传递用户名密码,后端可以接收
  • 后端对用户名密码在数据库中进行校验,发送校验结果给前端
  • 后端发送数据格式需要包含data(处理结果),code(处理结果编码),msg(操作成功或失败的提示)
  • 将员工id放入session,方便之后进行权限验证,防止直接通过网页访问页面跳过登录
  • 员工登录成功后,页面跳转到后台系统首页面(backend/index.html),显示当前登录用户的姓名
    需求分析

代码实现

建议把静态资源backend目录下的js下的request.js目录进行修改

(function (win) {axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'// 创建axios实例const service = axios.create({// axios中请求配置有baseURL选项,表示请求URL公共部分baseURL: '/',// 超时timeout: 1000000})

将timeout尽量改大,这样方便进行调试,不会超时

实体类

创建entity包并在其中创建Employee实体类
如果druid版本太低,时间类不建议使用localDate,改用Date

package com.cjgn.entity;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.time.LocalDateTime;//使用lombok自动生成实体类代码
@Data
//员工实体类
public class Employee {private Long id;//姓名private String name;//用户名private String username;private String password;private String phone;private String sex;//身份证private String idNumber;private Integer status;//如果druid版本太低改用Date@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;@TableField(fill = FieldFill.INSERT)private Long createUser;@TableField(fill = FieldFill.INSERT_UPDATE)private Long updateUser;
}

Mapper层

package com.cjgn.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cjgn.entity.Employee;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
}

Service层

EmployeeService.java

package com.cjgn.service;import com.cjgn.entity.Employee;public interface EmployeeService {/*** 通过用户名密码查询* @param employee* @return*/public Employee getByEmployee(Employee employee);
}

EmployeeServiceImpl.java

package com.cjgn.service.impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cjgn.entity.Employee;
import com.cjgn.mapper.EmployeeMapper;
import com.cjgn.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;@Service
public class EmployeeServiceImpl implements EmployeeService {@Autowiredprivate EmployeeMapper employeeMapper;@Overridepublic Employee getByEmployee(Employee employee) {//1、将页面提交的密码password进行md5处理String password = employee.getPassword();password = DigestUtils.md5DigestAsHex(password.getBytes());String username = employee.getUsername();//2、根据用户名密码去数据库查询LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();wrapper.eq(null != username, Employee::getUsername, username).eq(null!=password,Employee::getPassword,password);Employee employee1 = employeeMapper.selectOne(wrapper);return employee1;}
}

Controller层

Result.java
记得注入get和set方法

package com.cjgn.contorller;import lombok.Data;import java.util.HashMap;
import java.util.Map;//通用结果类
@Data
public class Result {//数据private Object data;//传递消息private String msg;//结果代码private Integer code;//动态数据private Map map = new HashMap();//三个值都有的构造方法public Result(Object data, Integer code,String msg) {this.data = data;this.msg = msg;this.code = code;}//只有消息和编码的构造方法,用于失败的时候用public Result(Integer code,String msg) {this.msg = msg;this.code = code;}//无参构造方法public Result() {}public Result add(String key,Object value){this.map.put(key,value);return this;}
}

Code.java

package com.cjgn.contorller;public class Code {//根据前端的代码,成功的编码为1,失败的编码为0public static final Integer OK = 1;public static final Integer ERR = 0;
}

EmployeeController.java

package com.cjgn.contorller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cjgn.entity.Employee;
import com.cjgn.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;
import java.nio.charset.StandardCharsets;@RestController
@RequestMapping("/employee")
public class EmployeeController {@Autowiredprivate EmployeeService employeeService;/*** 员工登录功能* 使用的post请求* @param request* @param employee* @return*/@PostMapping("/login")public Result Login(HttpServletRequest request,@RequestBody Employee employee){Employee employee1 = employeeService.getByEmployee(employee);//判断对象是否为空,空:查询失败,非空:查询成功//code:非空为1,空或者status为0的时候为0Integer code;String msg;//查询为空if(null==employee1){code = Code.ERR;msg = "登录失败";}//账号已禁用else if(employee1.getStatus()==0){code = Code.ERR;msg = "登录失败";}//查询不为空且账号启用则登录成功else {//设置session,把员工的id存入request.getSession().setAttribute("employee",employee1.getId());code = Code.OK;msg = "登录成功";}//只需要穿是否查询成功的结果就可以,不需要传输datareturn new Result(employee1,code,msg);}
}

总结

完成登录功能后,就可以使用账号密码,进行用户登录,并跳转到后台的界面,用户id也被储存到session中。方便之后的使用。 一定要注意Result类中要注入get和set方法,否则会报错


后台系统退出功能

需求分析

后台退出系统主要需要实现以下功能

  • 点击右侧的退出按扭发送请求到后端,删除对应session,然后退出到登录页面

代码实现

EmployeeController.java

    /*** 员工退出* @param request* @return*/@PostMapping("/logout")public Result logout(HttpServletRequest request){//删除sessionrequest.getSession().removeAttribute("employee");//返回前端数据return new Result(Code.OK,"退出成功");}

总结

退出功能相对简单,只需对前端发送的ajax请求进行处理,删除登录设置的session,然后返回前端一个退出成功的数据,就可以实现退出和页面的跳转。(这里的页面跳转由前端执行)


后台登录优化

需求分析

  • 问题:之前的登录系统存在一个漏洞,用户如果直接通过url去访问index.html主页是可以访问的,显然这不是我们想要的效果。
  • 优化:使用过滤器或拦截器,判断用户是否进行登录,如果没有登录就跳转到登录界面
  • 效果:用户只有登录后才能访问主页,否则会跳转回登录界面
    过滤器

代码实现

首先在pom文件中导入fastjson依赖

 		<!--fastjson--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency>

这里采用两种不同的方法分别实现

方法一:过滤器

  1. 在springboot的运行类中添加@ServletComponentScan注解
  2. 创建filter包并在其下创建类LoginCheckFilter

LoginCheckFilter.java

package com.cjgn.filter;import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.fastjson.JSON;
import com.cjgn.contorller.Code;
import com.cjgn.contorller.Result;
import org.springframework.util.AntPathMatcher;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/**拦截器类* @author DELL*/
@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();System.out.println("本次拦截路径"+requestURI);//定义不需要处理的路径String[] urls = new String[]{"/employee/login","/employee/logout","/backend/**","/front/**"};//2、判断本次请求是否需要处理boolean check = this.check(urls, requestURI);//3、不需要处理直接放行if (check){System.out.println("不需要处理");filterChain.doFilter(servletRequest,servletResponse);}//4、判断登录状态,如果已经登录则放行else if (request.getSession().getAttribute("employee")!=null){System.out.println("已登录");filterChain.doFilter(servletRequest,servletResponse);}//5、如果没有登录则跳转到登录页面else {//使用response传回json数据response.getWriter().write(JSON.toJSONString(new Result(Code.ERR,"NOTLOGIN")));System.out.println("未登录");}}/*** 进行路径匹配,检查本次请求是否需要放心* @param requestURI* @return*/public boolean check(String[] urls,String requestURI){//进行逐个匹配for (String url : urls) {boolean match = PATH_MATCHER.match(url, requestURI);if(match){//匹配成功返回truereturn true;}}//匹配失败返回falsereturn false;}
}

方法二:拦截器

  1. 在controller包下创建LoginInterceptor类
  2. 创建config包并在其中创建WebMvcConfig类

LoginInterceptor.java

package com.cjgn.contorller;import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 使用拦截器实现过滤器功能*/
@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String requestURI = request.getRequestURI();System.out.println("本次拦截路径" + requestURI);//4、判断登录状态,如果已经登录则放行if (request.getSession().getAttribute("employee") != null) {System.out.println("已登录");return true;}//5、如果没有登录则跳转到登录页面else {//使用response传回json数据response.getWriter().write(JSON.toJSONString(new Result(Code.ERR, "NOTLOGIN")));System.out.println("未登录");return false;}}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

WebMvcConfig.java

要注意这个类最好去实现WebMvcConfigurer接口。最好不要继承WebMvcConfigurationSupport类,虽然功能大致相同,但采用继承的话可能导致静态资源SpringMvc拦截,即使放在static目录下也没用。

package com.cjgn.comfig;import com.cjgn.contorller.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.ArrayList;
import java.util.List;@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;/*** 加入拦截路径和放行的路径* @param registry*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {//使用列表去装放行的路径List<String> urls = new ArrayList<>();urls.add( "/employee/login");urls.add( "/employee/logout");urls.add( "/backend/**");urls.add( "/front/**");urls.add("/error");registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns(urls);}
}

总结

添加拦截器或过滤器后,当前端发送请求时,会在拦截器或过滤器中进行处理,通过一系列判断,来决定是否放行这个请求。一般来说如果完成登录则不拦截请求,如果未登录就访问,则跳转回登录界面。

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

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

相关文章

【瑞吉外卖】day09:用户地址簿功能、菜品展示、购物车、下单

目录 1. 用户地址簿功能 1.1 需求分析 1.2 数据模型 1.3 导入功能代码 1.4 功能测试 2. 菜品展示 2.1 需求分析 2.2 前端页面分析 2.3 代码开发 2.4 功能测试 3. 购物车 3.1 需求分析 3.2 数据模型 3.3 前端页面分析 3.4 准备工作 3.5 代码开发 3.6 功能测试 …

外卖管理系统(一)

内容 软件开发整体介绍 瑞吉外卖项目介绍 开发环境搭建 后台登录功能开发 后台退出功能开发 1. 软件开发整体介绍 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程&#xff0c; 以及软件开发过程中涉及到的岗位角色&#xff0c;角色的分工、职责&#x…

外卖订餐管理系统

需求分析 项目概述 外卖订餐系统分成前台订餐管理子系统、店家信息管理子系统和后台管理子系统这三个子系统。用户通过此平台可以浏览菜品、查询菜品、查询店家&#xff0c;注册登录后可以提交订单、查询订单、管理个人信息等&#xff1b;商家通过此平台注册登录后可以接单、…

基于android的外卖在线订餐系统app

本外卖订餐系统是一个Android 客户端JSP Servlet服务端应用程序&#xff0c;启动Android上的应用程序后可以登录、查看菜品等,再者学校学生人数的增加&#xff0c;学生对餐饮服务的要求更加高&#xff1b;许多学生不满足于学校食堂的餐饮或嫌学校食堂就餐排队时间长&#xff0c…

瑞吉外卖订单后台和用户端功能

项目场景&#xff1a; 在编写瑞吉外卖的订单功能的时候&#xff0c;还是按照惯例&#xff0c;订单的一些功能是我们自己做&#xff0c;毕竟都看了一百多集视频了&#xff0c;自己应该能写一点东西了。 遇到的坑&#xff1a; 后台的订单列表功能&#xff0c;有一个输入订单号查询…

瑞吉外卖 —— 2、后台登录和登出

目录 1、后台登录功能 1.1、接口分析 1.1.2、登录校验逻辑 1.2、代码 1.2.1、统一的返回结果实体类 1.2.2、controller 方法 1.3、测试 2、后台退出功能 2.1、分析 2.2、代码 3、未登录访问首页跳转到登录页面 3.1、分析 3.2、代码 1、后台登录功能 1.1、接口分析…

外卖点餐APP-02(后台--员工管理)

&#xff08;一&#xff09;登录 实现思路&#xff1a; 接收到用户登录输入的用户名和密码&#xff0c;封装到了emp对象中对密码进行MD5加密创建条件构造器添加sql查询判断条件&#xff0c;emp对象中的Username等于Employee数据表中的Username调用MyBatis-Plus的方法查询数据库…

瑞吉外卖-移动端菜品展示功能,购物车添加菜品及修改等功能,用户下单功能及历史订单派送功能

整理记录下学习整个瑞吉外卖项目&#xff0c;详细代码可在我的Gitee仓库瑞吉外卖实战克隆下载学习使用&#xff01; 12.菜品展示 12.1 需求分析 12.2 更改前台页面使其正常显示 由于购物车功能还未进行开发&#xff0c;所以修改main.js中的cartListJson函数中访问固定数据&a…

外卖点餐APP-04(后台--菜品管理)

&#xff08;一&#xff09;新增 controller层思路&#xff1a; 调用service处理响应处理结果 PostMapping public R<String> save(RequestBody DishDto dishDto){dishService.saveWithFlavors(dishDto);return R.success("新增成功&#xff01;"); } servi…

瑞吉外卖:后台系统登录和退出功能

文章目录 需求分析代码开发创建实体类导入返回结果类Rcontroller、service与mapperlogin.html防止非法访问 需求分析 点击登录按钮后&#xff0c;浏览器以POST方式向employee/login提交username和password&#xff0c;服务器经过处理后向浏览器返回某种格式的数据&#xff0c;…

服装销售数据分析

目录&#xff1a; 一、项目背景介绍 二、数据源 三、分析流程 四、分析框架 五、知识点总结 一、项目背景介绍&#xff1a; 某服装经销商经营多个女装品牌&#xff0c;每个品牌设有线下店铺。该公司老板及销售总监需在每日营业结束后查看当日销售数据。以往主要由业务员手动整…

创建报价单或销售凭证,提示无定价确定过程能被确定,消息号V1212

创建报价单&#xff0c;提示无定价确定过程能被确定&#xff0c;消息号V1212。 解决方案&#xff1a; spro 》销售和分销——》基本功能——》定价——》定价控制——》定价并分配定价过程 1&#xff09;将凭证定价程序分配给订单类型 2&#xff09;设置定价程序确定&#xff0…

ChatGPT工作提效之layedit上传多附件的解决方案(layedit赋值、layui.js底层修改、追加模式多附件上传)

ChatGPT工作提效系列文章目录 ChatGPT工作提效之初探路径独孤九剑遇强则强ChatGPT工作提效之在程序开发中的巧劲和指令(创建MySQL语句、PHP语句、Javascript用法、python的交互)ChatGPT工作提效之生成开发需求和报价单并转为Excel格式ChatGPT工作提效之小鹅通二次开发批量API对…

Zia和ChatGPT如何协同工作?

有没有集成ChatGPT的CRM系统推荐&#xff1f;Zoho CRM已经正式与ChatGPT集成。下面我们将从使用场景、使用价值和使用范围等方面切入讲述CRMAI的应用和作用。 Zia和ChatGPT如何协同工作&#xff1f; Zia和ChatGPT是不同的人工智能模型&#xff0c;在CRM中呈现出共生的关系。 …

AIGC持续火爆大模型争相推出,庞大市场造就算力供应模式演变

本图由AI生成 文/王吉伟 近期的AIGC领域仍旧火爆异常。 但火的不只是AIGC应用&#xff0c;还有巨头之间的AI竞赛&#xff0c;以及接连不断上新的AI大模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;。 面对ChatGPT带来的技术冲击&#xff0c;为了研发谷歌多…

ChatGPT实现命名实体识别(NER, named entity recognization)和词性归类

语义分析词格分类 命名实体识别(NER, named entity recognization)和词性归类是 NLP 技术中的关键一环。过去 NLP 领域有不少流行的开源项目专注在这个领域&#xff0c;如 Spacy、NLTK 等等。我们来试试 ChatGPT 在这方面的表现情况如何。我们从"四渡赤水"的百度百科…

突发!两所知名大学,曝合并!校方紧急回应:校长将亲自说明!

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 来源丨联合新闻网 编辑丨3D视觉工坊 点击进入—>3D视觉工坊学习交流群 我国台湾又有“国立”大学传出合并的消息&#xff0c;台湾中山大学与台湾高雄大学传将重启合并协商&#xff0c;有网友曝光中山大学发…

从 Uber 数据泄露事件我们可以学到什么?

Uber 数据泄露始于一名黑客从暗网市场购买属于一名 Uber 员工的被盗凭证。最初尝试使用这些凭据连接到 Uber 的网络失败&#xff0c;因为该帐户受 MFA 保护。为了克服这一安全障碍&#xff0c;黑客通过 What’s App 联系了 Uber 员工&#xff0c;并假装是 Uber 的安全人员&…

点击率预估

点击率预估是广告技术的核心算法之一&#xff0c;它是很多广告算法工程师喜爱的战场。一直想介绍一下点击率预估&#xff0c;但是涉及公式和模型理论太多&#xff0c;怕说不清楚&#xff0c;读者也不明白。所以&#xff0c;这段时间花了一些时间整理点击率预估的知识&#xff0…

老鸟教你如何精确评估开发时间

一个程序员能否精确评估开发时间&#xff0c;是一件非常重要的事情。如果你掌握了这项技能&#xff0c;你在别人的眼里就会是这样&#xff1a; 靠谱经验十足对需求很了解延期风险小合格的软件工程师正规军&#xff0c;不是野路子 评估开发时间的重要性 首先&#xff0c;在一…