物流项目学习总结(在更)

news2024/11/17 0:04:29

物流项目的分类

技术架构图(面试时面试官会要求你画出技术架构图)

功能结构图

业务功能流程

流程说明:

  • 用户在【用户端】下单后,生成订单

  • 系统会根据订单生成【取件任务】,快递员上门取件后成功后生成【运单】

  • 用户对订单进行支付,会产生【交易单】

  • 快件开始运输,会经历起始营业部、分拣中心、转运中心、分拣中心、终点营业部之间的转运运输,在此期间会有多个【运输任务】

  • 到达终点网点后,系统会生成【派件任务】,快递员进行派件作业

  • 最后,用户将进行签收或拒收操作

 微服务调度关系

物流项目使用的工具的账号和密码

名称地址用户名/密码端口
gitsl-express.com - The domain is available for purchasesl/sl12310880
mavenhttp://maven.sl-express.com/nexus/admin/admin1238081
jenkinssl-express.com - The domain is available for purchaseroot/1238090
权限管家http://auth.sl-express.com/api/authority/static/index.htmladmin/1234568764
RabbitMQsl-express.com - The domain is available for purchasesl/sl32115672
MySQL-root/1233306
nacoshttp://nacos.sl-express.com/nacos/nacos/nacos8848
neo4jhttp://neo4j.sl-express.com/browser/neo4j/neo4j1237474
xxl-jobhttp://xxl-job.sl-express.com/xxl-job-adminadmin/12345628080
EagleMapsl-express.com - The domain is available for purchaseeagle/eagle8484
seatasl-express.com - The domain is available for purchaseseata/seata7091
Gatewaysl-express.com - The domain is available for purchase-9527
adminsl-express.com - The domain is available for purchase-80
skywalkingsl-express.com - The domain is available for purchase-48080
Redis-1233216379
MongoDB-sl/12332127017

项目搭建提问

 在公司中使用几台服务器?

服务器这块我不是很清楚,因为我们是个大公司,在公司中我们的运维已经搭好了cicd的环境,我们后端人员主要使用jenkins发布写好的微服务模块。

权限认证步骤

流程图:

数据校验

数据校验使用@Validated。(可以使用在方法,方法参数,类 上)

DTO类的数据校验 

 Controller层中的方法

为了使得DTO类中的校验注解生效,我们需要在controller中添加@Validated。

但是即使在contrller中设置了对应的注解,校验还是不会生效,为了使得注解生效,这里在方法参数位置添加@Validated注解。

 在该项目中为了方便开发,直接使用aop进行环绕通知,自动设置@Validated。

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.sl.transport.common.exception.SLException;
import com.sl.transport.common.util.AspectUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 请求参数校验切面,统一对Controller中@RequestBody映射的对象进行校验,在Controller方法中无需单独处理
 * 通过aop保证对应参数的中的校验注解可以生效
 * 该切面的作用就是自动在方法参数上添加@validated
 */
@Aspect //思想aop
@Slf4j
@EnableAspectJAutoProxy
@Component
public class ValidatedAspect {

    @Resource
    private Validator validator;

    @Around("execution(* com.sl..controller.*Controller.*(..))") //设置前面切面为:每个Controller层中对应的每个方法,这里使用环绕通知
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        // 获取@RequestBody映射的对象
        Object body = AspectUtil.getBody(proceedingJoinPoint); //这里就是获取Controller方法中对应的参数
        // 不为空的body进行拦截校验
        //方法中的参数不为空就说明我们需要进行数据校验
        if (!ObjectUtil.isEmpty(body)) {
            // 进行校验
            Set<ConstraintViolation<Object>> validateResult = validator.validate(body); //就等于在对应的方法参数上添加@Validated注解
            if (CollUtil.isNotEmpty(validateResult)) {
                //没有通过校验,抛出异常,由统一异常处理机制进行处理,响应400
                String info = JSONUtil.toJsonStr(validateResult.stream()
                        .map(ConstraintViolation::getMessage).collect(Collectors.toList()));
                throw new SLException(info, HttpStatus.BAD_REQUEST.value());
            }
        }
        //校验通过,执行原方法
        return proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
    }

}

全局异常处理

 问:你们是怎么处理异常的呢?

答: 在我们日常开发中,我,我们会创建一个全局的异常拦截器,通过使用@RestControllerAdvice , 创建一个全局异常处理类

通过@ExceptionHandler(对应的异常类)创建一个个处理对应异常类型的方法,最终返回友好的信息给前端。

微服务实现共享配置

对应的配置为下:

#设置共享配置所在的名字空间
#shared-config的值是一个数组
每个共享配配置需要设置:dataId, 分组
spring:
  cloud:
    nacos:
      config:
        namespace: ecae68ba-7b43-4473-a980-4ddeb6157bdc
        shared-configs: #共享配置
          - data-id: shared-spring-seata.yml
            group: SHARED_GROUP
            refresh: false
          - data-id: shared-spring-mysql.yml
            group: SHARED_GROUP
            refresh: false
          - data-id: shared-spring-mybatis-plus.yml
            group: SHARED_GROUP
            refresh: false

双token身份认证

问:单token会存在什么安全问题?有什么方法可以提高安全性?其实现步骤是什么?

单token存在的问题:

1.设置token有效时间:设置有效时长短了会导致用户需要频繁的登录,设置有效时长过长,会被非法人员获取token,通过该token干坏事。

2.没有设置token的有效时间:如果没有设置token的有效时间,token永远是有效的,在token有异常时,也无法使其失效。(token的无状态性)

解决方案: 使用双token实现三检验。

双token实现三检验的步骤:

1.解决token有效时间的方案为:设置access_token(短token),refresh_token(长token),access_token做用户认证,而refresh_token会在access_token失效的时候,用于获取新的access_token和refresh_token。(当然在通过这个过程也会判断refresh_tolen的有效性)

2.解决token的无状态性: 设置refreish的有效性和只能使用一次。(这些操作在redis中可以完成)

三次验证的流程图:

 具体流程为下:

1.在用户第一次登录时会生成access_token和refresh_token,并将refresh_token存入redis中,设置refresh_token的有效时长,这里可以使用access_refresh当key,剩余的使用次数当value。(value默认是1)

如果次数用户有access_token或refresh_token

2.判断是否存在access_token, 存在时判断token的有效性,如果是无效的则返回错误信息。如果不存在则进入第二次验证(第一次验证)

3.判断是否存在refresh_token,通过redis判断token的有效性,如果有效进入第三次验证,如果无效则直接返回登录界面。(第二次验证)

4.判断refresh_token的使用次数通过redis,如果是第一次使用则通过该token获取新的access_token和refresh_token删除旧的refresh_token,如果旧的refresh_token不是第一次使用则此时refresh_tolen在redis中是查不到的,则返回登录界面。(第三次验证)

微信小程序登录流程

 登录会取code,通过调用微信接口传入code,appid,appsecret,会获取openId和session_key。

自定义登录态,该登录态要关联openId和session_id,获取通过该自定义态获取openId和session_key。

 最终项目的实现流程为下:

运费模块总结

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

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

相关文章

【项目开发 | C语言项目 | C语言病人管理系统】

该项目旨在为医院或其他医疗机构提供一个简易的病人信息管理工具。用户可以通过命令行界面进行病人信息的增、删、查和改操作&#xff0c;并将数据持久化存储在txt文件中。 一&#xff0c;开发环境需求 操作系统 &#xff1a;Windows, Linux 开发环境工具 &#xff1a;Qt, VSC…

什么是数字资产?(修订精编版)

修订说明 整整三年前&#xff0c;2020 年 10 月 7 日&#xff0c;我在本公众号里发表了《什么是数字资产&#xff1f;》一文。这篇文章是我们三位作者长达两个月思考的结果&#xff0c;也可以说是 Solv 创新旅程的起点。这篇文章通过对比数字世界与现实世界里的凭证类型&#x…

[论文工具] LaTeX常见错误及解决方法汇总笔记(eps2pdf失败 | 特殊符号 | 参考文献未显示或越界)

祝大家中秋国庆双节快乐&#xff01; 回过头来&#xff0c;我们在编程过程中&#xff0c;经常会遇到各种各样的问题。然而&#xff0c;很多问题都无法解决&#xff0c;网上夹杂着各种冗余的回答&#xff0c;甚至需要看自己多年前的博客来解决。为更好地从事科学研究和编程学习&…

免费服务器搭建网盘教程,给电脑挂载500G磁盘

免费服务器搭建网盘教程&#xff0c;给电脑挂载500G磁盘 请勿注册下载&#xff0c;注册下载是空白文件&#xff0c;使用免登录下载 免费搭建网盘教程&#xff0c;给电脑挂载500G磁盘 其他按照下载教程操作教程代码: 下载下来的文件pancn 文件拖到您创建的容器 手机的话点击…

linux内核分析:网络协议栈

从本质上来讲,所谓的建立连接,其实是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,并用这样的数据结构来保证面向连接的特性。TCP 无法左右中间的任何通路,也没有什么虚拟的连接,中间的通路根本意识不到两端使用了 TCP 还是 UDP。 所谓的连接…

触摸屏驱动

驱动框架 多点电容触摸芯片的接口&#xff0c;一般都为 I2C 接口&#xff0c;因此驱动主框架肯定是 I2C。 当设备树中触摸 IC的设备节点和驱动匹配以后 。进入probe入口函数。在此函数中初始化触摸 IC&#xff0c;中断和 input 子系统等 linux 里面一般都是通过中断来上报触…

PTrade获取交易日期——时间相关函数1

本系列文章将笔者平时在使用ptrade进行策略开发中使用到的与日期相关的函数进行记录&#xff0c;以便大家参考并一同改进优化。 如果读者还有其他日期相关的函数实现需求&#xff0c;也可以留言&#xff0c;大家一起讨论补充。 首先看一下ptrade提供的get_trading_day函数的用…

vivado杂项记录

文章目录 问题的解决Xilinx Vitis 启动时未响应的解决方法Spawn failed&#xff1a;No error错误vivado卡在Initializing Language Server的解决方法vivado中添加文件后出现non-module 其他关于MAX_FANOUT属性vviado 2018.3中IP的core container 问题的解决 Xilinx Vitis 启动…

typescript 分析泛型工具类Partial的实现原理理解索引查询类型

Partial实现原理 在 TypeScript 中&#xff0c;Partial 是一个非常有用的工具类型&#xff0c;它能够将一个对象类型的所有属性变为可选。Partial 的实现原理是通过使用映射类型&#xff08;Mapped Type&#xff09;和 keyof 关键字来实现的。 下面我们来看一下 Partial 的实现…

System Generator初体验FIR滤波器

文章目录 前言一、介绍1、目标2、过程 二、步骤 1&#xff1a;在 FPGA 中创建设计1、打开 Lab1_1.slx 文件2、运行仿真3、使用 System Generator 创建 FIR 滤波器<1>、从库浏览器寻找需要的模块<2>、配置系统生成器块<3>、在 FPGA 上实现设计 三、步骤 2&…

第一章 函数 极限 连续(解题方法须背诵)

&#xff08;一&#xff09;求极限的常用方法 方法1 利用有理运算法则求极限 方法2 利用基本极限求极限 方法3 利用等价无穷小求极限 方法4 利用洛必达法则求极限 方法5 利用泰勒公式求极限 方法6 利用夹逼准则求极限 方法7 利用定积分的定义求极限 方法8 利用单调有界…

JMeter界面和字体的调整

一、界面直接调整 二、调整界面比例&#xff08;分辨率&#xff09; jmeter.hidpi.modetrue jmeter.hidpi.scale.factor2.0用记事本打开 将如下代码中的第一行和第五行的注释去掉即可 #jmeter.hidpi.modetrue # HiDPI scale factor #jmeter.hidpi.scale.factor1.0 # Suggeste…

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第三周测验

课程1_第3周_测验题 目录&#xff1a;目录 第一题 1.以下哪一项是正确的&#xff1f; A. 【  】 a [ 2 ] ( 12 ) a^{[2](12)} a[2](12)是第12层&#xff0c;第2个训练数据的激活向量。 B. 【  】X是一个矩阵&#xff0c;其中每个列都是一个训练示例。 C. 【  】 a 4 […

互联网Java工程师面试题·MyBatis 篇·第一弹

目录 1、什么是 Mybatis&#xff1f; 2、Mybaits 的优点 3、MyBatis 框架的缺点 4、MyBatis 框架适用场合 5、MyBatis 与 Hibernate 有哪些不同&#xff1f; 6、#{}和${}的区别是什么&#xff1f; 7、当实体类中的属性名和表中的字段名不一样 &#xff0c;怎么办 &#x…

ERROR 6400 --- [ main] com.zaxxer.hikari.pool.HikariPool : root - Exception

在引用的日志中&#xff0c;报告了Hikari连接池初始化期间的异常。具体异常信息是"Exception during pool initialization"。这个异常可能是由于与MySQL数据库的通信链接失败导致的。在引用中也提到了与SSL连接相关的错误。 根据引用中提供的代码&#xff0c;可以看到…

docker方式启动一个java项目-Nginx本地有代码,并配置反向代理

文章目录 案例导入说明1.安装MySQL1.1.准备目录1.2.运行命令1.3.修改配置1.4.重启 2.导入SQL3.导入Demo工程3.1.分页查询商品&#xff08;仔细看代码&#xff0c;很多新的MP编程技巧&#xff09;3.2.新增商品3.3.修改商品3.4.修改库存3.5.删除商品3.6.根据id查询商品3.7.根据id…

html 高性能 简易轮播图

目标 实现简易轮播图动画效果 设计理念 无论有多少个轮播图&#xff0c;仅使用常数个轮播图tab&#xff0c;通过js替换更新dom内容&#xff0c;实现性能优化&#xff1b;使用bfc避免回流&#xff0c;&#xff08;重绘是基本上无法避免&#xff0c;不在考虑&#xff09;&#…

CompletableFuture异步回调

CompletableFuture异步回调 CompletableFutureFuture模式CompletableFuture详解1.CompletableFuture的UML类关系2.CompletionStage接口3.使用runAsync和supplyAcync创建子任务4.设置子任务回调钩子5.调用handle()方法统一处理异常和结果6.线程池的使用 异步任务的串行执行thenA…

【做题笔记】多项式/FFT/NTT

HDU1402 - A * B Problem Plus 题目链接 大数乘法是多项式的基础应用&#xff0c;其原理是将多项式 f ( x ) a 0 a 1 x a 2 x 2 a 3 x 3 ⋯ a n x n f(x)a_0a_1xa_2x^2a_3x^3\cdotsa_nx^n f(x)a0​a1​xa2​x2a3​x3⋯an​xn中的 x 10 x10 x10&#xff0c;然后让大数的…

20230922 比赛总结

反思 A 考场降智&#xff0c;没想到拆分成 2 α 5 β x 2^{\alpha}5^{\beta}x 2α5βx 的形式&#xff0c;一直在卡精度&#xff08;thx anti) B 又是随机题&#xff0c;又是 b l bl bl 题&#xff0c;差点又被区分了 C 我是 s b sb sb&#xff0c;排序顺序有点小问题…