苍穹外卖面试题-上

1. 苍穹外卖的模块

苍穹外卖大方向上主要分为管理端和用户端

管理端使用vue开发,主要是商家来使用,提供餐品的管理功能,主要有下面几个模块:

  • 员工模块,提供员工账号的登录功能和管理功能
  • 分类、菜品、套餐模块,分别对分类、菜品和套餐进行增删改查和启用禁用
  • 订单模块,可以搜索和查看订单,变更订单状态
  • 统计模块,统计营业额、用户、订单和销量排名,还有Excel报表导出功能
  • 工作台模块,提供今日运营数据数据以及订单、菜品、套餐的总览

用户端使用微信小程序开发,主要是给用户提供点餐功能

  • 登录模块,调用微信小程序登录接口实现登录功能

  • 菜品、套餐模块,用于查询菜品、套餐的信息

  • 购物车模块,在购物车中添加或删除套餐菜品

  • 订单模块,提供下单、微信支付、查询订单、取消订单、再来一单、催单功能。

2. 管理端账号密码的登录流程

登录的本质就是对员工表进行查询操作

  1. 首先要接收前端发送的账号和密码
  2. 然后根据账号在数据库员工表进行查询,如果没有查到,说明此账号不存在,可以直接给前端返回一个提示,如果查询到了说明这个账号存在
  3. 接下来就要进行前端传入密码和数据库查询到的密码比对,由于数据库的密码是加密保存的,所以在比对之前,还需要对前端传入的秘密进行加密;如果比对失败,说明用户提供的密码不对,可以直接给前端返回一个提示;如果比对没有问题,说明用户提供的账户和密码是正确的,此时登录成功
  4. 登录成功之后,需要生成一个标识用户身份的token,返回给前端,前端会将token保存起来
  5. 用户后面访问系统的时候,需要携带着这个token,而我们后端需要编写一个拦截器,用于拦截请求,校验token
  6. 校验通过,则放行请求,正常访问;校验失败,则禁止通行,返回提示

3. 前端小程序的微信登录流程

微信登录的核心是通过微信小程序提供的临时凭证code换取永久凭证openid的过程

  1. 首先微信小程序会向微信官方申请一个临时登录code
  2. 然后,小程序带着code向后台服务发送请求
  3. 后台接收到code后,会调用微信官方接口验证code是否合法,如果合法,官方会返回一个openid;这个openid就是此用户在我们系统中的唯一标识,同时也代表用户身份合法
  4. 后台服务接收到来着微信的openid之后,会去数据库查询一下是否存在此账户;如果存在,代表这是一个老用户,如果不存在,则代表这是一个新用户首次使用我们的系统,我们需要将其信息保存到用户表中
  5. 登录成功之后,需要生成一个标识用户身份的token,返回给前端,前端会将token保存起来
  6. 用户后面访问系统的时候,需要携带着这个token,而我们后端需要编写一个拦截器,用于拦截请求,校验token
  7. 校验通过,则放行请求,正常访问;校验失败,则禁止通行,返回提示

4. ThreadLocal 在项目中的应用

  1. ThreadLocal 称为线程局部变量,可以为每个线程单独提供一份存储空间,它的特点是:线程之内,数据共享;线程之间,数据隔离。

  2. 在我们的项目中经常使用ThreadLocal来存储用户的登录信息,具体的做法是:

    每次用户访问后台都需要经过拦截器鉴权,如果鉴权通过,我们就将登录用户的信息保存到ThreadLocal中

    接下来,在项目的各个代码中就可以轻松的从ThreadLocal中获取用户信息了

    最后,当请求访问完服务离开的时候,还会再次经过拦截器,这个时候就可以清理掉ThreadLocal中的内容了

5. 项目是如何进行异常处理的

在我们的项目中,异常处理都是通过spring的全局异常处理器来实现的,核心是两个注解:

  • 一个是@RestControllerAdvice,标注在类上,可以定义全局异常处理类对异常进行拦截
  • 一个是@ExceptionHandler,标注在异常处理类中的方法上,可以声明每个方法能够处理的异常类型

在我们的项目中,将异常分为了三大类:

在苍穹外卖项目的全局异常处理器中一般定义三种异常:

  1. 第一类是指定异常,指定异常指的是用户操作产生的与程序设计相关的异常,比如说字段重复异常、Validation校验异常等等,这类异常捕获之后,我们会根据异常的消息提示,给前端一个确定的返回结果
  2. 第二类是业务异常处理,业务异常是由于用户不正当操作产生的与业务相关的的异常,这种异常往往需要我们自定义,然后在程序的相关位置手动抛出,在抛出的时候还会指定异常提示信息。然后异常处理器捕获之后,直接将异常提示消息返回给前端
  3. 第三种异常时兜底异常,此处主要捕获的是不属于上面两种异常的异常,一般是一些程序员代码不够严谨引发的运行时异常,对于这些异常,我们处理方案是首先要把错误记录到日志系统中,然后给前端一个类似于服务器开小差了之类的统一提示

6. 项目是如何存储文件的

在我使用过的文件存储中,主要有三类存储方式

  1. 直接将文件保存到服务到硬盘,这种方式操作方便,但是扩容困难,而且安全保障不高,现在基本不再使用
  2. 使用一些付费的第三方存储服务,比如阿里云或者七牛云,这种方式无需自己公司提供服务器和相关软件,并且安全性和扩展性都不需要自己再进行考虑,但是不适合存储一些敏感文件
  3. 将文件保存在公司自己搭建的一些分布式系统中,比如我们公司用过MinIO和FastDFS,它需要我们自己准备服务器,安装维护软件,好处是文件都存放在自己的服务器上,隐私性比较好

至于如何选择服务器,我认为目前主要考虑的就是分布式文件存储系统和第三方服务

  • 如果文件是隐私性比较高,建议使用自己搭建的分布式文件存储系统
  • 如果文件隐私性不高,可以考虑使用第三方服务

我们项目中主要存储的文件是一些菜品或者套餐的图片,不涉及什么隐私问题,所以选择了阿里云服务

7. 项目是如何进行参数校验的

  1. 我们项目中的校验是使用validation技术实现的,它的核心是一些具有特定意义的注解

  2. 这些注解主要标注在请求参数或者是参数对象对应类的属性上,每个注解都有自己的校验规则。

  3. 如果我们输入的请求参数不符合对应的校验规则,系统就会抛出异常,此时我们只需要在全局异常处理器中捕获异常,然后给前端提示即可。

  4. 我们常用的注解有下面这些:

    @Null 可以标注在任意类型元素上,被标注的元素必须为null

    @NotEmpty 可以标注 在字符串,集合,数组,map上,被标注的元素必须不能为 null ,也不能是空串

    @Range 标注在字符串和数值的大小必须在指定的范围内,对于null无效

    @Digits(integer(数值的位数) =3 , fraction(小数的位数)=2)

    @size(min=,max=) 可以标注在字符串,数组,集合,map用于控制长度

    @Email 邮箱

    @URL 合法的地址

8. 如何理解分组校验

  1. 很多情况下,我们会将校验规则写到实体类中的属性上,而这个实体类有可能作为不同功能方法的参数使用,而不同的功能对象参数对象中属性的要求是不一样的。比如我们在新增和修改一个用户对象时,都会接收User对象作为请求参数,但是新增要求对象的id为空,而修改则要求id字段不能为空。这个时候就需要使用到分组校验了
  2. 分组校验其实就是定义多套校验规则,对于指定的功能,我们按照要求指定它使用哪套规则即可

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

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

相关文章

禁止谷歌浏览器自动更新

禁止谷歌浏览器自动更新 在使用Python包selenium的时候浏览器版版本发生变化后产生很多问题如: 1、直接版本不对应无法运行 2、版本不一致导致debug启动浏览器超级慢 这里是已谷歌浏览器为代表的。 禁止自动更新的方法如下: 1、WinR调出运行&#x…

Kubernetes学习笔记-Part.10 容器回退

目录 Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退 第十章 容器回退 部署过程中,如遇问题可…

竞赛选题 题目:基于深度学习的手势识别实现

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的手势识别实现 该项目较为新颖,适合作为竞赛课题…

springboot+java电脑硬件库存管理系统+jsp

现如今,信息种类变得越来越多,信息的容量也变得越来越大,这就是信息时代的标志。近些年,计算机科学发展得也越来越快,而且软件开发技术也越来越成熟,因此,在生活中的各个领域,只要存…

SQL自学通之查询--SELECT语句的使用

一、前言 1、目标 在今天你将学习到以下内容: l 如何写SQL的查询 l 将表中所有的行选择和列出 l 选择和列出表中的选定列 l 选择和列出多个表中的选定列 2、背景 在上篇中我们简要地介绍了关系型数据库系统所具有的强大功能 在对 SQL 进行了 简要的介绍中我们…

[UnityWebGL]修改webgl启动模板

首先了解什么是WEBGGL启动模板,如下图: 其次,启动模板在哪里设置,如下图: 最后,怎么改启动模板里面的内容(提供最简单的方式,直接改官方的): 1、首先在Asset…

TypeScript编程语言学习,为学习HarmonyOS开发做准备

1. 编程语言 ArkTS是HarmonyOS优选的应用开发语言,它在TypeScript(TS)的基础上,匹配ArkUI扩展,扩展了声明式UI、状态管理等相应的能力。 JavaScript(JS),使用在Web应用开发&#xf…

RHCSA学习笔记(RHEL8) - Part2.RH134

Chapter Ⅰ 提高命令行生产率 SHELL脚本 #/bin/bash声明使用的shell翻译器 for循环 for VAR in LIST doCOMMAND1COMMAND2 done实验1:显示host1-5 #! /bin/bash for host in host{1..5} doecho $host done实验2:显示包含kernel的软件包安装时间 #! /…

CAN总线学习(STM32的CAN寄存器使用)(笔记二)

CAN总线基础基础知识的文章:CAN总线学习(CAN总线基础知识)(笔记一)-CSDN博客 在前面CAN总线基础知识和报文中介绍的是报文内容是比较全面的,STM32在CAN协议的基础上做了一些简单的简化,例如下图…

softmax实现

import matplotlib.pyplot as plt import torch from IPython import display from d2l import torch as d2lbatch_size 256 train_iter,test_iter d2l.load_data_fashion_mnist(batch_size) test_iter.num_workers 0 train_iter.num_workers 0 num_inputs 784 # 将图片…

【MySQL】-日志系统

一、背景介绍 MySQL中提供了各种各样的日志,每一个日志在不同的阶段有不同的作用,对数据的一致性和正确性得到保障,为数据恢复也提供至关重要的作用,那今天我们一起来讨论讨论MySQL中的各个日志 二、正文 binlog:…

NIO--07--Java lO模型详解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 何为 IO?先从计算机结构的角度来解读一下I/o.再从应用程序的角度来解读一下I/O 阻塞/非阻塞/同步/异步IO阻塞IO非阻塞IO异步IO举例 Java中3种常见的IO模型BIO (Blo…

Redis缓存的使用

什么是缓存 缓存就是数据交换的缓冲区,是存储数据的临时地方,一般读写性能较高。 缓存的作用: 降低后端负载提高读写效率,降低响应时间 缓存的成本: 数据一致性成本代码维护成本运维成本 Redis特点 键值型数据库…

Qt面试题

1.QT信号槽机制的优缺点 优点: 1.类型安全:需要关联的信号槽的签名必须是等同的,即信号的参数类型和参数个数和接受该信号的槽的参数类型和参数个数相同。(PS:信号函数的参数个数必须大于等于槽函数的参数个数) 2.松…

Spring 框架容器管理注解和生命周期

Spring 注解 在 Spring 框架中,大量的注解是由 Spring 容器(而不是虚拟机)进行处理和解析的。Spring 框架使用了反射和自定义的处理机制来解析注解,并根据注解的定义执行相应的逻辑。 Spring 框架中的注解主要用于配置和控制应用…

C语言之结构体

一.前言引入. 我们知道在C语言中有内置类型,如:整型,浮点型等。但是只有这些内置类 型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要名字、年龄、学号、⾝⾼、体…

Spark经典案例分享

Spark经典案例 链接操作案例二次排序案例 链接操作案例 案例需求 数据介绍 代码如下: package base.charpter7import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs.{FileSystem, Path} import org.apache.spark.SparkContext import org.a…

四、Zookeeper节点类型

目录 1、临时节点 2、永久节点 Znode有两种,分别为临时节点和永久节点。 节点的类型在创建时即被确定,并且不能改变。 1、临时节点 临时节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,

OpenCV-Python:计算机视觉介绍

目录 1.背景 2.计算机视觉发展历史 3.计算机视觉主要任务 4.计算机视觉应用场景 5.知识笔记 1.背景 OpenCV是计算机视觉的一个框架,想要学习OpenCV,需要对计算机视觉有一个大致的了解。计算机视觉是指通过计算机技术和算法来模拟人类视觉系统的能力…

Redis高效缓存:加速应用性能的利器

目录 引言 1. Redis概述 1.1 什么是Redis? 1.2 Redis的特点 2. Redis在缓存中的应用 2.1 缓存的重要性 2.2 Redis作为缓存的优势 2.3 缓存使用场景 3. Redis在实时应用中的应用 3.1 实时数据处理的挑战 3.2 Redis的实时数据处理优势 3.3 实时应用中的Red…