• Stars
    star
    272
  • Rank 150,679 (Top 3 %)
  • Language
    CSS
  • Created about 1 year ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

神领物流 黑马 物流项目 神领物流系统类似顺丰速运,是向C端用户提供快递服务的系统。竞品有:顺丰、中通、圆通、京东快递等。 项目产品主要有4端产品: - 用户端:基于微信小程序开发,外部客户使用,可以寄件、查询物流信息等。 - 快递员端:基于安卓开发的手机APP,公司内部的快递员使用,可以接收取派件任务等。 - 司机端:基于安卓开发的手机APP,公司内部的司机使用,可以接收运输任务、上报位置信息等。 - 后台系统管理:基于vue开发,PC端使用,公司内部管理员用户使用,可以进行基础数据维护、订单管理、运单管理等。

课程安排

  • 了解神领物流
  • 了解物流行业
  • 了解项目的技术架构
  • 了解项目的业务功能
  • 项目功能演示
  • 搭建开发环境
  • 基于现有代码进行bug修复
  • 阅读已有的代码

1、场景说明

现在的你,已经学习了目前最主流的系统架构技术《微服务技术栈》,并且呢也拿到了满意的offer,入职了一家物流公司,公司名叫:神领物流公司。

现在你的心情还是比较复杂的,既开心又担心,开心是这个offer你很满意,担心的是,听朋友说物流行业的项目业务非常复杂,技术涉及的也比较多,而自己从来没有接触过物流项目,就担心自己能不能Hold得住?万一……

不用过于担心,本套课程就是带着你一点点的了解项目,站到一个新人的角度来看待这个项目,代码从哪里拉取?开发规范是什么?有哪些环境?项目业务是什么样的? ……

image-20220725211508122.png

2、神领物流是什么?

神领物流是一个基于微服务架构体系的**【生产级】**物流项目系统,这可能是目前你能学习到的最接近企业真实场景的项目课程,其业务完整度、真实度、复杂度会让你感到惊讶,在这里你会学习到最核心的物流调度系统,也可以学习到在复杂的微服务架构体系下开发以及相关问题的解决。学完后你的收获会很“哇塞”。

2.1、公司介绍

公司从2019年开始业务快速扩张,网点数量从138家扩展至540家,车辆从170台增长到800台。同时,原有的系统非常简单,比如车辆的调度靠人工操作、所有的货物分拣依靠人员,核心订单数据手动录入,人效非常低。

随着业务不断演进,技术的不断提升,原有运输管理系统已无法满足现有快速扩展下的业务需求,但针对现有系统评估后发现,系统升级成本远高于重新研发。

因此,公司决定基于现有业务体系进行重新构建,打造一套新的TMS运输系统,直接更替原有系统。业务侧重于展示车辆调研、线路规划等核心业务流程,操作智能化,大幅度提升人效及管控效率。

2.2、组织架构

Java开发人员所在的一级部门为信息中心,主要负责集团新系统的研发、维护、更新迭代。信息中心下设3个2级部门,产品部、运维部以及开发部门,开发部门总计42人,按照以业务线划分为4个组、TMS项目组之外、WMS项目组、OMS项目、CRM组。

TMS(Transportation Management System 运输管理系统) 项目组目前共8人,其中前端3人,后端5人。后端人员根据以下功能模块拆分进行任务分配,实际业务中也不可能是一人包打天下,分工合作才是常态化操作。

2.3、产品说明

神领物流系统类似顺丰速运,是向C端用户提供快递服务的系统。竞品有:顺丰、中通、圆通、京东快递等。 项目产品主要有4端产品:

  • 用户端:基于微信小程序开发,外部客户使用,可以寄件、查询物流信息等。
  • 快递员端:基于安卓开发的手机APP,公司内部的快递员使用,可以接收取派件任务等。
  • 司机端:基于安卓开发的手机APP,公司内部的司机使用,可以接收运输任务、上报位置信息等。
  • 后台系统管理:基于vue开发,PC端使用,公司内部管理员用户使用,可以进行基础数据维护、订单管理、运单管理等。

3、物流行业系统

从广度上来说,物流系统可以理解为由多个子系统组成,这里我们以一般综合型物流系统举例,在整体框架上可以分为仓储系统WMS、运配系统TMS、单据系统OMS和计费系统BMS。

这四大系统本质上解决了物流行业的四大核心问题:怎么存放、怎么运送、怎么跟进、怎么结算。

神领物流系统,是TMS运配系统,本质上解决的是怎样运送的问题。

image.png

4、系统架构和技术架构

4.1、系统架构

4.2、技术架构

下图展现了神领物流项目使用的主要的技术:

5、功能演示

5.1、需求文档

下面将演示四端的主要功能,更多的功能具体查看各端的需求文档。

用户端 https://share.lanhuapp.com/#/invite?sid=qx01hbI7 密码: UxGE
快递员端 https://share.lanhuapp.com/#/invite?sid=qxe42Dya 密码: Nomz
司机端 https://share.lanhuapp.com/#/invite?sid=qX0NEmro 密码: yrzZ
管理端 https://share.lanhuapp.com/#/invite?sid=qX0axVem 密码: fh3i

5.2、功能架构

5.3、业务功能流程

:::info 流程说明:

  • 用户在**【用户端】**下单后,生成订单
  • 系统会根据订单生成**【取件任务】,快递员上门取件后成功后生成【运单】**
  • 用户对订单进行支付,会产生**【交易单】**
  • 快件开始运输,会经历起始营业部、分拣中心、转运中心、分拣中心、终点营业部之间的转运运输,在此期间会有多个**【运输任务】**
  • 到达终点网点后,系统会生成**【派件任务】**,快递员进行派件作业
  • 最后,用户将进行签收或拒收操作 :::

5.4、用户端

功能演示操作视频列表:

下单操作 点击查看
取消订单 点击查看
地址簿 点击查看

image.png image.png image.png

5.5、快递员端

功能演示操作视频列表:

派件操作流程 点击查看
取件操作流程 点击查看
全部取派操作流程 点击查看
搜索操作流程 点击查看
消息操作流程 点击查看

image.png image.png image.png image.png

5.6、司机端

点击查看演示视频 image.png image.png image.png image.png image.png

5.7、后台管理系统

功能演示操作视频列表:

建立机构 点击查看
新建员工 点击查看
绘制作业范围 点击查看
新建线路 点击查看
启用车辆 点击查看

QQ图片20230114151916.pngimage.png image.png image.png image.png image.png image.png image.png image.png image.png

6、开发环境

6.1、开发模式

在神领物流开发团队中,采用了分组协作开发的模式,整个开发团队分为5个小组,每个小组4~5人,不同的分组负责不同的微服务。

开发环境分为本地开发环境、测试环境、生成环境:

  • **本地开发环境:**自己的电脑环境
  • **测试环境:**在内网中搭建的一套大家都可以访问使用的环境
  • **生成环境:**最终给用户使用的环境

6.2、团队分工

目前神领物流项目拥有19个微服务,1个网关,1个parent工程,2个公共依赖工程,这些工程由上述的5个小组共同维护开发。

新入职的你,加入到了开发一组。

开发组/负责模块 开发一组 开发二组 开发三组 开发四组 开发五组 说明
sl-express-parent 父工程
sl-express-common 通用工程
sl-express-mq 统一消息代码
sl-express-gateway 网关
sl-express-ms-base 基础微服务
sl-express-ms-carriage 运费微服务
sl-express-ms-courier 快递员微服务
sl-express-ms-dispatch 调度微服务
sl-express-ms-driver 司机微服务
sl-express-ms-oms 订单微服务
sl-express-ms-service-scope 服务范围微服务
sl-express-ms-sms 短信微服务
sl-express-ms-track 轨迹微服务
sl-express-ms-trade 支付微服务
sl-express-ms-transport 路线微服务
sl-express-ms-transport-info 物流信息微服务
sl-express-ms-user 用户微服务
sl-express-ms-web-courier 快递员web服务
sl-express-ms-web-customer 用户web服务
sl-express-ms-web-driver 司机web服务
sl-express-ms-web-manager 后台web服务
sl-express-ms-work 运单微服务
sl-express-ms-search 搜索微服务

:::info **思考:**是否需要把所有的工程代码都拉取到本地进行编译运行?

不需要的。你只需要将自己将要负责的开发任务相关的代码拉取到本地进行开发即可,其他的服务都可以调用测试环境正在运行的服务。

另外,你有可能是没有权限拉取到其他开发组的代码的。 :::

微服务间调用关系如下:

可以看到,四个端的请求都会统一进入网关,再分发到对应的四个web微服务,再由web微服务请求其他微服务完成业务。

查看微服务间的依赖关系

6.3、软件环境

为了模拟企业中的开发环境,所以我们需要通过VMware导入linux虚拟机,该虚拟机中已经安装了课程中所需要的各种环境,包括,git、maven私服、Jenkins、MySQL、RabbitMQ等。

:::info 关于JDK版本的说明:神领物流项目使用的JDK版本为11,需要同学们统一下环境,JDK11的安装包在资料中有提供。 目录:资料\软件包\jdk-11.0.15.1_windows-x64_bin.exe :::

🔔关闭本地开发环境的防火墙(很重要!)

6.3.1、导入虚拟机

具体参考文档:虚拟机导入手册 :::danger 注意:只要按照文档导入虚拟机即可,其他软件无需自己安装,都已经安装了,并且开机自启。 ::: image-20220728162541120.png :::info 通过dps命令可以查询上述列表,dps是自定义命令。 自定义命令方法如下: :::

vim ~/.bashrc

#增加如下内容
alias dps='docker ps --format "table{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"'
#保存退出

#生效
source ~/.bashrc

6.3.2、配置本机hosts

在本机hosts文件中设置如下配置:

192.168.150.101 git.sl-express.com
192.168.150.101 maven.sl-express.com
192.168.150.101 jenkins.sl-express.com
192.168.150.101 auth.sl-express.com
192.168.150.101 rabbitmq.sl-express.com
192.168.150.101 nacos.sl-express.com
192.168.150.101 neo4j.sl-express.com
192.168.150.101 xxl-job.sl-express.com
192.168.150.101 eaglemap.sl-express.com
192.168.150.101 seata.sl-express.com
192.168.150.101 skywalking.sl-express.com
192.168.150.101 api.sl-express.com
192.168.150.101 admin.sl-express.com

打开浏览器测试:http://git.sl-express.com/ image-20220728164743695.png

看到这个页面就说明hosts已经生效。(也可以再试试其他的,比如:maven私服、jenkins等)

6.3.3、服务列表

:::danger 说明:如果通过域名访问,无需设置端口。 :::

名称 地址 用户名/密码 端口
git http://git.sl-express.com/ sl/sl123 10880
maven http://maven.sl-express.com/nexus/ admin/admin123 8081
jenkins http://jenkins.sl-express.com/ root/123 8090
权限管家 http://auth.sl-express.com/api/authority/static/index.html admin/123456 8764
RabbitMQ http://rabbitmq.sl-express.com/ sl/sl321 15672
MySQL - root/123 3306
nacos http://nacos.sl-express.com/nacos/ nacos/nacos 8848
neo4j http://neo4j.sl-express.com/browser/ neo4j/neo4j123 7474
xxl-job http://xxl-job.sl-express.com/xxl-job-admin admin/123456 28080
EagleMap http://eaglemap.sl-express.com/ eagle/eagle 8484
seata http://seata.sl-express.com/ seata/seata 7091
Gateway http://api.sl-express.com/ - 9527
admin http://admin.sl-express.com/ - 80
skywalking http://skywalking.sl-express.com/ - 48080
Redis - 123321 6379
MongoDB - sl/123321 27017

6.3.4、配置Maven私服

在本地的maven(建议版本为3.6.x)配置中配置上述的私服,配置文件参考如下: settings.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<settings
        xmlns="http://maven.apache.org/SETTINGS/1.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

    <!-- 本地仓库 -->
    <localRepository>F:\maven\repository</localRepository>

    <!-- 配置私服中deploy的账号 -->
    <servers>
        <server>
            <id>sl-releases</id>
            <username>deployment</username>
            <password>deployment123</password>
        </server>
        <server>
            <id>sl-snapshots</id>
            <username>deployment</username>
            <password>deployment123</password>
        </server>
    </servers>

    <!-- 使用阿里云maven镜像,排除私服资源库 -->
    <mirrors>
        <mirror>
            <id>mirror</id>
            <mirrorOf>central,jcenter,!sl-releases,!sl-snapshots</mirrorOf>
            <name>mirror</name>
            <url>https://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors>

    <profiles>
        <profile>
            <id>sl</id>
            <!-- 配置项目deploy的地址 -->
            <properties>
                <altReleaseDeploymentRepository>
                    sl-releases::default::http://maven.sl-express.com/nexus/content/repositories/releases/
                </altReleaseDeploymentRepository>
                <altSnapshotDeploymentRepository>
                    sl-snapshots::default::http://maven.sl-express.com/nexus/content/repositories/snapshots/
                </altSnapshotDeploymentRepository>
            </properties>
            <!-- 配置项目下载依赖的私服地址 -->
            <repositories>
                <repository>
                    <id>sl-releases</id>
                    <url>http://maven.sl-express.com/nexus/content/repositories/releases/</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                </repository>
                <repository>
                    <id>sl-snapshots</id>
                    <url>http://maven.sl-express.com/nexus/content/repositories/snapshots/</url>
                    <releases>
                        <enabled>false</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
        </profile>
    </profiles>

    <activeProfiles>
         <!-- 激活配置 -->
        <activeProfile>sl</activeProfile>
    </activeProfiles>

</settings>

6.3.5、服务版本

服务名 版本号
sl-express-parent 1.4
sl-express-common 1.2-SNAPSHOT
其他微服务 1.1-SNAPSHOT

7、开发任务

7.1、任务描述

接下来是你加入到开发一组后接到的第一个任务,具体内容是: 后台管理系统只允许管理员登录,非管理员(司机或快递员)是没有权限登录的,现在的情况是,任何角色的人都能登录到后台管理系统,应该是当非管理员登录时需要提示没有权限。 这个可以算是一个bug修复的工作。接下来,你需要思考下,该如何解决这个问题。

解决步骤:

  • 先确定鉴权工作是在哪里完成的
    • 通过前面的系统架构,可以得知是在网关中完成的
  • 拉取到网关的代码
  • 阅读鉴权的业务逻辑
  • 了解权限系统
  • 动手编码解决问题
  • 部署,功能测试

7.1.1、部署后台管理系统

后台管理系统的部署是使用101机器的Jenkins部署的,具体参考前端部署文档。部署完成后,就可以看到登录页面。 地址:http://admin.sl-express.com/ image.png 可以看到这个页面是可以正常访问,只是没有获取到验证码,是因为验证码的获取是需要后端服务支撑的,目前并没有启动后端服务。

7.1.2、部署后端服务

后端服务需要启动如下几个服务: 目前,只启动了itcast-auth-server,其他均未启动: image.png 所以需要在Jenkins中,依次启动这几个服务,类似如下构建(需要找到对应的构建任务进行构建): image.png

启动完成: image.png 在nacos中已经完成了服务的注册: image.png

7.1.3、测试

刷新后台管理系统页面,即可成功看到验证码,说明所需要的服务已经启动完成了。 image.png 使用默认账号,shenlingadmin/123456 即可完成登录: image.png

使用非管理员账号进行测试,例如:gzsj/123456 (司机账号) 或 hdkdy001/123456 (快递员账号) 进行测试,发现依然是可以登录的。 image.png 这样,这个问题就重现了。

7.2、拉取代码

拉取代码步骤:

  • 在本地创建 sl-express 文件夹,该目录存放项目课程期间所有的代码
  • 启动idea,打开该目录 image-20220728213318073.png
  • 登录 git 服务,找到 sl-express-gateway 工程,拷贝地址,在idea中拉取代码(注意存储路径) image-20220728213450406.png image.png
  • 拉取到代码后,设置jdk版本为11 image-20220728213637258.png
  • 添加modules,将sl-express-gateway加入进来 image-20220728213945708.png
  • 成功拉取代码 image-20220728214019842.png
  • 说明:该工程会依赖 sl-express-parent,此maven依赖是通过私服拉取到的。

7.3、权限管家

在神领物流项目中,快递员、司机、管理人员都是在权限管家中进行管理的,所以他们的登录都是需要对接权限管家完成的。

具体权限管家的介绍说明参见:权限管家使用说明

7.4、测试用户登录

前面已经了解了权限管家,接下来我们将基于权限管家在sl-express-gateway中进行测试用户的登录以及对于token的校验。

7.4.1、依赖说明

对接权限管家需要引入依赖:

<dependency>
    <groupId>com.itheima.em.auth</groupId>
    <artifactId>itcast-auth-spring-boot-starter</artifactId>
</dependency>

:::info 该依赖已经导入,并且在parent中指定了版本号。

该依赖已经上传到maven中央仓库,可以直接下载,地址:https://mvnrepository.com/artifact/com.itheima.em.auth/itcast-auth-spring-boot-starter :::

7.4.2、解读配置

在bootstrap-local.yml配置文件中配置了nacos配置中心,一些参数存放到了nacos中,这些参数一般都是不同环境不一样配置的。

sl-express-gateway.properties如下:

#权限系统的配置
authority.host = 192.168.150.101
authority.port = 8764
authority.timeout = 10000
#应用id
authority.applicationId = 981194468570960001

#角色id
role.manager = 986227712144197857,989278284569131905,996045142395786081,996045927523359809
#快递员角色
role.courier = 989559057641637825
#司机角色
role.driver = 989559028277315009

#RSA公钥
sl.jwt.public-key = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC6of/EqnM2008gRpFAJJd3iGF5o6P6SuJOcKq4iJQ+62EF4WKGIGQunJjPwVNQFqDuT7ko9bRFZNnMba9A5GrFELtAK7tzO9l19JgFcCBQoU3J6ehPCCunRKz52qJuzS0yiJp0dbB2i6cb7mSCftwZavmcpzhsBaOGQd23AnAmQIDAQAB

其中applicationId、角色id都是需要在权限系统中找到。

image.png

角色id需要在数据库表中查询,表为:itcast_auth.itcast_auth_role image.png

7.4.3、测试

测试用例在AuthTemplateTest中:

    @Test
    public void testLogin() {
        //登录
        Result<LoginDTO> result = this.authTemplate.opsForLogin()
                .token("shenlingadmin", "123456");

        String token = result.getData().getToken().getToken();
        System.out.println("token为:" + token);

        UserDTO user = result.getData().getUser();
        System.out.println("user信息:" + user);

        //查询角色
        Result<List<Long>> resultRole = AuthTemplateFactory.get(token).opsForRole()
                .findRoleByUserId(user.getId());
        System.out.println(resultRole);
    }

token校验测试:

    @Test
    public void checkToken() {
        String token = "xxx.xx.xxx"; //上面方法中生成的token
        AuthUserInfoDTO authUserInfo = this.tokenCheckService.parserToken(token);
        System.out.println(authUserInfo);

        System.out.println(JSONUtil.toJsonStr(authUserInfo));
    }

:::danger **说明:**权限管家生成的token采用的是RSA非对称加密方式,项目中配置的公钥一定要与权限系统中使用的公钥一致,否则会出现无法校验token的情况。 ::: image-20220729185656492.png 项目中的公钥文件: image-20220729185825534.png

7.5、阅读鉴权代码

7.5.1、整体流程

首先需要明确的一点是四个终端都是通过sl-express-gateway进行验证与鉴权的,下面以管理员请求流程为例,其他的流程类似。 ### 7.5.2、自定义过滤器 不同终端进入Gateway的请求路径是不一样的,并且不同的终端对于token的校验和鉴权逻辑是不一样的,所以需要在网关中对于各个终端创建不同的过滤器来实现。 请求路径如下:

  • 快递员端:/courier/**
  • 用户端:/customer/**
  • 司机端:/driver/**
  • 管理端:/manager/**

具体的配置文件内容如下:

server:
  port: 9527
  tomcat:
    uri-encoding: UTF-8
    threads:
      max: 1000
      min-spare: 30
spring:
  cloud:
    nacos:
      username: nacos
      password: nacos
      server-addr: 192.168.150.101:8848
      discovery:
        namespace: ecae68ba-7b43-4473-a980-4ddeb6157bdc
        ip: 192.168.150.1
      config:
        namespace: ecae68ba-7b43-4473-a980-4ddeb6157bdc
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowed-origin-patterns: "*"
            allowed-headers: "*"
            allow-credentials: true
            allowed-methods:
              - GET
              - POST
              - DELETE
              - PUT
              - OPTION
      discovery:
        locator:
          enabled: true #表明gateway开启服务注册和发现的功能,并且spring cloud gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务
      routes:
        - id: sl-express-ms-web-courier
          uri: lb://sl-express-ms-web-courier
          predicates:
            - Path=/courier/**
          filters:
            - StripPrefix=1
            - CourierToken
            - AddRequestHeader=X-Request-From, sl-express-gateway
        - id: sl-express-ms-web-customer
          uri: lb://sl-express-ms-web-customer
          predicates:
            - Path=/customer/**
          filters:
            - StripPrefix=1
            - CustomerToken
            - AddRequestHeader=X-Request-From, sl-express-gateway
        - id: sl-express-ms-web-driver
          uri: lb://sl-express-ms-web-driver
          predicates:
            - Path=/driver/**
          filters:
            - StripPrefix=1
            - DriverToken
            - AddRequestHeader=X-Request-From, sl-express-gateway
        - id: sl-express-ms-web-manager
          uri: lb://sl-express-ms-web-manager
          predicates:
            - Path=/manager/**
          filters:
            - StripPrefix=1
            - ManagerToken
            - AddRequestHeader=X-Request-From, sl-express-gateway
        - id: sl-express-ms-trade
          uri: lb://sl-express-ms-trade
          predicates:
            - Path=/trade/notify/**
          filters:
            - StripPrefix=1
            - AddRequestHeader=X-Request-From, sl-express-gateway
itcast:
  authority:
    host: ${authority.host} #authority服务地址,根据实际情况更改
    port: ${authority.port} #authority服务端口
    timeout: ${authority.timeout} #http请求的超时时间
    public-key-file: auth/pub.key
    applicationId: ${authority.applicationId}

#角色id
role:
  manager: ${role.manager}
  courier: ${role.courier}
  driver: ${role.driver}

sl:
  noAuthPaths:
    - /courier/login/account
    - /courier/swagger-ui.html
    - /courier/webjars/
    - /courier/swagger-resources
    - /courier/v2/api-docs
    - /courier/doc.html
    - /customer/user/login
    - /customer/user/refresh
    - /customer/swagger-ui.html
    - /customer/webjars/
    - /customer/swagger-resources
    - /customer/v2/api-docs
    - /customer/doc.html
    - /driver/login/account
    - /driver/swagger-ui.html
    - /driver/webjars/
    - /driver/swagger-resources
    - /driver/v2/api-docs
    - /driver/doc.html
    - /manager/login
    - /manager/webjars/
    - /manager/swagger-resources
    - /manager/v2/api-docs
    - /manager/doc.html
    - /manager/captcha
  jwt:
    public-key: ${sl.jwt.user-secret-key}

可以看到,在配置文件中配置了注册中心、cors跨域、自定义过滤器、自定义配置、白名单路径等信息。 其中,自定义过滤器配置了4个,与处理类对应关系如下:

  • CourierToken -> com.sl.gateway.filter.CourierTokenGatewayFilterFactory
  • CustomerToken -> com.sl.gateway.filter.CustomerTokenGatewayFilterFactory
  • DriverToken **-> **com.sl.gateway.filter.DriverTokenGatewayFilterFactory
  • ManagerToken **-> **com.sl.gateway.filter.ManagerTokenGatewayFilterFactory

在GatewayFilterFactory中,继承AbstractGatewayFilterFactory类,实现GatewayFilterFactory接口中的apply()方法,返回GatewayFilter对象,即可在filter()方法中实现具体的业务逻辑。 image.png 具体的业务逻辑,在自定义TokenGatewayFilter类中完成。 :::info ❓思考: 四个终端都共用TokenGatewayFilter类,而各个终端的校验逻辑是不一样的,该怎么做呢? :::

7.5.3、TokenGatewayFilter

TokenGatewayFilter过滤器是整个项目中的校验/ 鉴权流程的具体实现,由于存在不同的终端,导致具体的校验和鉴权逻辑不一样,所以需要通过自定义接口AuthFilter实现,也就是4个端的TokenGatewayFilterFactory同时也需要实现AuthFilter接口。

在向下游服务转发请求时,会携带2个头信息,分别是userInfo和token,也就是会将用户信息和token传递下去。

package com.sl.gateway.filter;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.itheima.auth.sdk.dto.AuthUserInfoDTO;
import com.sl.gateway.config.MyConfig;
import com.sl.transport.common.constant.Constants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Slf4j
public class TokenGatewayFilter implements GatewayFilter, Ordered {

    private MyConfig myConfig;
    private AuthFilter authFilter;

    public TokenGatewayFilter(MyConfig myConfig, AuthFilter authFilter) {
        this.myConfig = myConfig;
        this.authFilter = authFilter;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //获取请求路径
        String path = exchange.getRequest().getPath().toString();
        //查看请求路径是否在白名单中
        if (StrUtil.startWithAny(path, myConfig.getNoAuthPaths())) {
            //无需校验,直接放行
            return chain.filter(exchange);
        }

        //获取header的参数
        String token = exchange.getRequest().getHeaders().getFirst(this.authFilter.tokenHeaderName());
        if (StrUtil.isEmpty(token)) {
            //没有权限
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }

        //校验token
        AuthUserInfoDTO authUserInfoDTO = null;
        try { //捕获token校验异常
            authUserInfoDTO = this.authFilter.check(token);
        } catch (Exception e) {
            log.error("令牌校验失败,token = {}, path= {}", token, path, e);
        }
        if (ObjectUtil.isEmpty(authUserInfoDTO)) {
            //token失效 或 伪造,响应401
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }

        //鉴权
        Boolean result = false;
        try { //捕获鉴权异常
            result = this.authFilter.auth(token, authUserInfoDTO, path);
        } catch (Exception e) {
            log.error("权限校验失败,token = {}, path= {}", token, path, e);
        }
        if (!result) {
            //没有权限,响应400
            exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
            return exchange.getResponse().setComplete();
        }

        //增加参数,向下游微服务传递参数
        exchange.getRequest().mutate().header(Constants.GATEWAY.USERINFO, JSONUtil.toJsonStr(authUserInfoDTO));
        exchange.getRequest().mutate().header(Constants.GATEWAY.TOKEN, token);

        //校验通过放行
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        //指定了拦截器的顺序,设置最小值确定第一个被执行
        return Integer.MIN_VALUE;
    }

}

7.5.4、AuthFilter

AuthFilter是自定义接口,用于不同客户端(用户端、司机端、快递员端、管理端)校验/鉴权逻辑的实现,该接口定义了3个方法:

  • check()方法用于校验token
  • auth()方法用于鉴权
  • tokenHeaderName()方法是默认实现,默认请求头中token参数的名为:Authorization
  • 执行流程是先校验token的有效性,再进行鉴权。
package com.sl.gateway.filter;

import com.itheima.auth.sdk.dto.AuthUserInfoDTO;
import com.sl.transport.common.constant.Constants;

/**
 * 鉴权业务的回调,具体逻辑由 GatewayFilterFactory 具体完成
 */
public interface AuthFilter {

    /**
     * 校验token
     *
     * @param token 请求中的token
     * @return token中携带的数据
     */
    AuthUserInfoDTO check(String token);

    /**
     * 鉴权
     *
     * @param token        请求中的token
     * @param authUserInfo token中携带的数据
     * @param path         当前请求的路径
     * @return 是否通过
     */
    Boolean auth(String token, AuthUserInfoDTO authUserInfo, String path);

    /**
     * 请求中携带token的名称
     *
     * @return 头名称
     */
    default String tokenHeaderName() {
        return Constants.GATEWAY.AUTHORIZATION;
    }

}

7.5.5、管理员校验实现

package com.sl.gateway.filter;

import com.itheima.auth.sdk.dto.AuthUserInfoDTO;
import com.itheima.auth.sdk.service.TokenCheckService;
import com.sl.gateway.config.MyConfig;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 后台管理员token拦截处理
 */
@Component
public class ManagerTokenGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> implements AuthFilter {

    @Resource
    private MyConfig myConfig;
    @Resource
    private TokenCheckService tokenCheckService;

    @Override
    public GatewayFilter apply(Object config) {
        //由于实现了AuthFilter接口,所以可以传递this对象到TokenGatewayFilter中
        return new TokenGatewayFilter(this.myConfig, this);
    }

    @Override
    public AuthUserInfoDTO check(String token) {
        //校验token
        return tokenCheckService.parserToken(token);
    }

    @Override
    public Boolean auth(String token, AuthUserInfoDTO authUserInfoDTO, String path) {
        return true;
    }
}

:::info 🔔分析: 由于auth()方法直接返回true,导致所有角色都能通过校验,也就是所有角色的用户都能登录到后台管理系统,这里就是bug原因的根本所在。 :::

7.6、解决bug

7.6.1、实现

:::info 思路: 想让管理员角色的用户通过,而非管理员角色不能通过,这里就需要对auth()方法进行实现了,现在的实现是都返回true,那当然是所有的都通过了。 所以,需要查询出当前用户的角色,查看是否具备管理员角色,如果有就放行,否则拒绝。 :::

具体代码实现:

package com.sl.gateway.filter;

import cn.hutool.core.collection.CollUtil;
import com.itheima.auth.factory.AuthTemplateFactory;
import com.itheima.auth.sdk.AuthTemplate;
import com.itheima.auth.sdk.dto.AuthUserInfoDTO;
import com.itheima.auth.sdk.service.TokenCheckService;
import com.sl.gateway.config.MyConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;

/**
 * 后台管理员token拦截处理
 */
@Component
public class ManagerTokenGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> implements AuthFilter {

    @Resource
    private MyConfig myConfig;
    @Resource
    private TokenCheckService tokenCheckService;
    //获取配置文件中的管理员角色id
    @Value("${role.manager}")
    private List<Long> managerRoleIds;

    @Override
    public GatewayFilter apply(Object config) {
        //由于实现了AuthFilter接口,所以可以传递this对象到TokenGatewayFilter中
        return new TokenGatewayFilter(this.myConfig, this);
    }

    @Override
    public AuthUserInfoDTO check(String token) {
        //校验token
        return tokenCheckService.parserToken(token);
    }

    @Override
    public Boolean auth(String token, AuthUserInfoDTO authUserInfoDTO, String path) {
        //获取AuthTemplate对象
        AuthTemplate authTemplate = AuthTemplateFactory.get(token);
        //查询该用户的角色
        List<Long> roleIds = authTemplate.opsForRole().findRoleByUserId(authUserInfoDTO.getUserId()).getData();

        //取交集,判断是否有交集即可判断出是否有权限
        Collection<Long> intersection = CollUtil.intersection(roleIds, this.managerRoleIds);
        return CollUtil.isNotEmpty(intersection);
    }
}

7.6.2、测试

测试分两种方法,分别是接口测试和功能测试,我们首先进行功能测试,然后再进行接口测试(swagger接口)。 测试无误后,可以将代码提交到git中。

7.6.2.1、功能测试

由于本地启动服务后,会在nacos中注册了2个服务: image.png 所以需要将101服务器上的网关停止掉再进行测试。docker stop sl-express-gateway 另外,需要修改101服务器上的nginx配置,让 api.sl-express.com 对应的服务指向到本地的9527端口服务(测试完成后再改回来)。 修改nginx配置:

cd /usr/local/src/nginx/conf
vim nginx.conf
#由于目前nginx正在运行中,nginx.conf是只读的,所以需要通过 wq! 命令强制保存

#配置生效
nginx -s reload

修改内容如下: image.png 使用司机账号进行测试: image.png 可以看到,司机账号无法登录。 image.png

7.6.2.2、接口测试

测试步骤:

  • 首先,测试管理员的登录,获取到token
  • 接着测试管理员请求接口资源(期望结果:正常获取到数据)
  • 更换成司机用户进行登录,并且测试请求接口资源(期望结果:响应400,没有权限)

将本地Gateway服务启动起来,访问 http://127.0.0.1:9527/manager/doc.html 即可看到【管理后台微服务接口文档】 image.png 随便测试个接口,会发现响应401: image.png 测试登录接口,需要先获取验证码再进行登录: image.png 登录成功: image.png 获取到token: image.png 设置请求头:Authorization image.png 进行功能测试: image.png 更换成司机账户测试: image.png 会发现,更换成司机账户后会响应400,符合我们的预期。

7.6.3、部署

项目的发布,我们采用Jenkins持续集成的方式,在提供的虚拟机中已经部署好了Jenkins,我们只需要进行简单的操作即可完成部署。 第一步,浏览器打开:http://jenkins.sl-express.com/  (账号:root/123) 第二步,按照如下数字标识进行操作 image-20220806102651465.png 选择默认参数: image-20220806102721738.png 第三步,查看部署控制台,点击【sl-express-gateway】进入任务详情,左侧下方查看构建历史,点击最近的一个构建图标: image-20220801091004278.png 看到如下内容,说明以及部署成功。 image-20220801091047892.png 部署成功后,可以进行正常功能测试。

8、课后练习

8.1、练习一:快递员的鉴权

难度系数:★☆☆☆☆

提示:快递员端的鉴权与管理端的鉴权类似,只是角色id不同。如果想要通过App进行登录测试,请参考前端部署文档

8.2、练习二:司机端的鉴权

难度系数:★☆☆☆☆

提示:司机端的鉴权与管理端的鉴权类似,只是角色id不同。如果想要通过App进行登录测试,请参考前端部署文档

9、面试连环问

:::info 面试官问:

  • 简单介绍下你做的物流项目。
  • 微服务项目团队如何协作?你们多少个小组开发?
  • 项目中是如何进行持续集成的?提交git后如何自动进行构建?
  • 说说统一网关中是如何进行认证与鉴权工作的?在网关中如何自定义过滤器?
  • 项目中的用户权限是如何管理的?如何与权限管家对接? :::

More Repositories

1

TyporaCrack

Typora V1.6.7 Typora Crack Typora破解 Typora 激活 Typora activation MD Markdown editor 激活
908
star
2

NavicatCracker

navicat 激活 Navicat所有版本破解 A keygen for Navicat 16 Navicat16破解 Navicat Keygen Navicat 16 Keygen注册机(NavicatCracker) Navicat 16 破解 Navicat Premium 16 破解 Navicat破解 绿色版 MySQL
Batchfile
884
star
3

sky-take-out

黑马程序员最新Java项目实战《苍穹外卖》,最适合新手的SpringBoot+SSM企业级项目实战 相比于瑞吉外卖苍穹外卖的业务更加真实完整,用户端改为微信小程序,登录改为了微信登录,加入了统计报表,来单提醒,客户催单,订单管理等功能,业务实现了闭环。技术选型更加丰富和实用。可以认为是增强版瑞吉外卖
JavaScript
273
star
4

tjxt

天机学堂 黑马 天机学堂是一个基于微服务架构的生产级在线教育项目,核心用户不是K12群体,而是面向成年人的非学历职业技能培训平台。相比之前的项目课程,其业务完整度、真实度、复杂度都非常的高,与企业真实项目非常接近。
Java
127
star
5

heima-leadnews

黑马头条 讲义、资料、源码 heima-leadnews
CSS
68
star
6

WIN_ACTIVITE

WIN WIN7 WIN8 WIN10 WIN11 激活 OFFICE激活 HEU KMS Activator 是一款简洁高效的KMS/OEM智能激活工具,适用所有Windows, Office版本,无需联网即可一键激活,支持UEFI的KMS激活工具。KMS服务是微软对Windows, Office等产品的批量许可服务,利用KMS可以激活局域网内的产品。该工具利用KMS机制在系统搭建KMS服务器,从而实现在线或离线激活。
62
star
7

MySql_Demo01

尚硅谷 尚硅谷MySQL入门到高级-宋红康版
PLpgSQL
58
star
8

Student_management_system

学生信息管理系统 基于Java的教务管理系统、学生管理系统、课表查询系统 (Spring、SpringBoot、thymeleaf) 基于Spring的教务管理系统、学生管理系统、课表查询系统 ,包含数据库文件 本作品主要实现了一个课表查询系统,采用了SSM(Spring + SpringMVC + MyBatis)的基础架构。 后端使用Maven 进行包管理,使用spring-boot框架、模板引擎使用thymeleaf、web模块使用springMVC、数据库连接池使用Druid、数据库访问使用mybatis-plus、工具包使用hutool。前端使用H-ui模板,结合Timetables展示课程表。 系统能够实现用户的登录退出,教室、班级、院系、地点、教工、学生、用户、课程、课程
JavaScript
58
star
9

itcast_interview

黑马程序员 2023 Java面试专题课 新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)
Java
55
star
10

Passper

OFFICE(word、excel、ppt)破解 ZIP/RAR破解 PDE破解 Excel密码破解工具 Passper for Excel v3.7.0.4 中文破解版 PPT密码破解工具 Passper for PowerPoint v3.7.0.1 中文破解版 Word密码破解工具 Passper for Word v3.7.0.2 中文破解版
51
star
11

SGBlog

三更博客 三更 三更草堂 SpringBoot前后端分离项目实战-博客项目-Java项目 SpringBoot,MybatisPlus,SpringSecurity,EasyExcel,Swagger2,Redis,Echarts,Vue,ElementUI....
Vue
49
star
12

StudentManagerSystem

基于C# Windows窗体的 教务系统 学生信息管理系统 学生成绩管理系统 学生选课系统,C# + SQL Server 本系统包括两类用户:学生、管理员。管理员可以通过系统来添加管理员信息、修改管理员信息、添加学生信息、修改学生信息;开设课程、查询课程、录入成绩、统计成绩、修改成绩、修改个人密码等,而学生则可以通过系统来选择课程、查询课程、显示自己的课表、查询自己的成绩单、修改个人密码等等。
C#
38
star
13

Bandizip

解压缩工具 Bandizip v7.27 破解专业版
36
star
14

java_interview_guide_PDF

java_面试指北PDF版本(最新)
31
star
15

PythonBlogSystem

python Django博客系统 本作品主要实现了一个Django博客系统,采用前后端不分离的项目结构。 使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。Python 加 Django 是快速开发、设计、部署网站的最佳组合。 前端采用了JavaScript、BootStrap、Vuejs,axios,后端采用Python、Django(开放源码的重Web应用框架),数据存储采用MySQL数据库、Redis、Session技术, 系统能够实现用户注册、用户登录退出、用户个人中心、用户修改个人信息、用户重置密码、用户写博客、博客的分页展示、每篇博客的博客详情、用户发表对博客的评论、每篇博客的评论分页展示、用户删除自己的博客,以及用户的权限管理。
JavaScript
30
star
16

guigu-ssyx

尚硅谷Java项目实战《尚上优选》企业级Java项目 社区团购是真实居住社区内居民团体的一种互联网线上线下购物消费行为,是依托真实社区的一种区域化、小众化、本地化、网络化的团购形式。简而言之,它是依托社区和团长社交关系实现生鲜商品流通的新零售模式。
Java
29
star
17

XMind

思维导图软件 XMind 2021 v11.1.2 免激活破解版
26
star
18

idea_activate

JetBrains全家桶激活 idea Activator idea全家桶激活 JetBrains收费所有收费插件激活 idea收费所有收费插件激活 JetBrains 2017-2022所有版本激活 idea激活 phpstorm激活 pycharm激活 webstorm激活 AppCode激活 Goland激活 Rubymine激活 clion激活 datagrip激活 ride激活
Batchfile
26
star
19

MindManagerPath

MindManager 破解 激活 破解版 思维导图软件 MindManager 2022 v22.2.300 中文破解版
22
star
20

vue-rabbit

小兔鲜 Vue3小兔鲜 黑马程序员前端Vue3小兔鲜电商项目实战,vue3全家桶从入门到实战电商项目一套通关 Vue3小兔鲜电商前台 1. 长页面吸顶交互实现 2. 图片懒加载指令封装 3. 面板插槽组件等业务通用组件封装 4. SKU电商组件封装 5. 通用逻辑函数封装 6. 路由缓存问题处理 7. 基于业务逻辑的组件拆分思想 8. 支付宝三方支付
Vue
22
star
21

StudentManagement

基于C#的学生管理信息系统,ASP.NET+SQL Server+Layui 基于C#的学生管理信息系统,ASP.NET+SQL Server+Layui,包含sql文件 本系统前后端不分离 前端使用LayUI(开源模块化前端 UI 框架 ) 后端使用ASP.NET 数据库使用SqlServer 普通用户进入本系统直接进入index.aspx页面,不需要登录,可以查看班级信息、学生信息、成绩信息。在详情页面可以根据各个字段进行筛选,对数据进行二次过滤查询。 管理员用户使用/admin.aspx页面进行登录,默认用户名密码为admin,登录成功之后可以对学生进行CURD增删改查的基本操作。在添加信息时对用户输入的数据通过正则表达式进行检测是否合法,如果合法就可以成功添加,否则失败,并在页面提示用户数据非法。
JavaScript
21
star
22

GGZX

尚硅谷Vue项目硅谷甄选,VUE3项目+TypeScript企业级前端项目 硅谷甄选 运营平台 vue3框架:采用vue框架最新版本,组合式API形式开发项目。 vite:构建化工具 TypeScript:TypeScript技术栈 vue-router:采用vue-router最新版本管理路由 pinia:采用pinia集中式管理状态 element-plus:UI组件库采用element-plus axios:网络交互 echarts:数据可视化大屏.....
Vue
19
star
23

atguigu_SPZX

尚硅谷Java项目《尚品甄选》 SpringBoot+SpringCloud萌新学会企业级java项目
Java
17
star
24

itcast_msbd

JAVA 黑马程序员 面试宝典全学科
15
star
25

SSM_Demo01

黑马程序员2022最新SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术
JavaScript
15
star
26

QA

黑马程序员软件测试接口自动化测试全套视频教程,从接口自动化测试入门到项目实战实操(Postman+python+Pytest自动化测试)
Python
14
star
27

heima-leadnew

黑马程序员Java微服务项目《黑马头条》快速开发全套视频教程,基于SpringBoot+SpringCloud+Nacos等企业级微服务架构项目解决方案 《黑马头条》项目采用的是SpringBoot+springcloud当下最流行的微服务为项目架构,配合spring cloud alibaba nacos作为项目的注册和配置中心。新课程采用快速开发的模式,主要解决真实企业开发的一些应用场景。深入挖掘技术和业务的解决方案,做到更加的通用,能举一反三,充分满足互联网行业中复杂的微服务技术要求。
Java
14
star
28

pinda-tms-java

中台化架构的深度物流项目 - 品达物流 - 黑马程序员
Java
13
star
29

SogouInput

搜狗输入法 v12.2.0.6275 去广告精简优化版
13
star
30

vue-music-vant

此项目为基于Vuesj的web音乐播放器App(SPA) 包括以下子模块 歌曲/歌单/MV的搜索,并分页显示搜索结果 歌曲/歌单/MV的播放功能 歌曲/歌单/MV的显示功能 歌曲/歌单/MV分页评论显示功能 歌曲歌词滚动 发现音乐、推荐歌单、最新音乐、最新MV的显示 自适应PC端和手机端的功能 音乐APP系统整体采用前后端分离的开发模式,其中前端项目是基于 Vue 技术栈的 SPA 项目 用Vue全家桶 + ElementUI + VANT + ES6 + Webpack + Axios等前端最新最热的技术 采用模块化、组件化、工程化的模式开发
Vue
12
star
31

Interview_Heima_Demo01

黑马Java八股文面试题视频教程,Java面试八股文宝典(含阿里、腾迅大厂java面试真题,java数据结构,java并发,jvm等最新java面试真题)
Java
11
star
32

MySql_Demo02

黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括
10
star
33

C--

尚硅谷 【2023最新版C++】实战项目教程,清华武老师带你零基础一套快速学会c++
C++
9
star
34

Data_Structure_Demo03

【马士兵教育】2023年左程云带你精通数据结构与算法,详解Leetcode经典算法题 算法和数据结构体系学习班 算法和数据结构新手班 左程云算法 源码
Java
9
star
35

hospital

医院管理系统 、Xx市医院数字化管理系统 这是XXx市定制的一套数字化医院管理系统,服务与中小型社区医院,为医院简化了纸质化办公流程。从挂号、就诊、复诊、挂号、住院、出院一站式流程打通,实现无纸质化开发,减少了患者就医复杂度,以及提升了医院的工作人员办事效率。 该系统是面向医院使用的,用户是护士、药师、医生。主要模块包含:门诊管理、住院管理、系统管理、统计管理、数据中心、仓库管理、排班管理、药房管理等模块。项目采用springBoot单体应用架构,整合spring、springvc、Mybatis、Redis、XXL-Job等相关技术;
HTML
8
star
36

design-patterns

尚硅谷 大厂学院 大厂学院 设计模式与框架源码 Spring、Tomcat、springBoot 源码解析
7
star
37

Xshell

NetSarang Xshell XFTP XshellPlus v7.0.0111 免激活绿色版
7
star
38

SpringSecurity_Demo04

三更 三更草堂 SpringSecurity框架教程-Spring Security+JWT实现项目级前端分离认证授权-B站最通俗易懂的Spring Security课程
Java
7
star
39

GGKT_Demo01

【尚硅谷&腾讯云】Java项目 硅谷课堂丨微服务丨在线学习平台
Java
7
star
40

algorithm

尚硅谷 大厂学院 大厂学院算法与数据结构解析
Java
6
star
41

mimissm

米米商城 小米后台管理 动力节点SSM框架项目实战|Spring+Mybatis+Springmvc框架项目实战整合-【米米商城】
Java
6
star
42

VisualCppRedist

装机必备 微软常用运行库合集 2022年6月版
6
star
43

Redis_Demo04

黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目
JavaScript
6
star
44

IDM

IDM破解 IDM下载器 Internet Download Manager (IDM) 破解
Batchfile
6
star
45

jshop-seckill

基于MYSQL的秒杀实战开发 开课吧 互联网项目实战 1.大型互联网项目架构设计实践及架构优化思路 2.压力测试实战、性能瓶颈分析及服务优化实战 3.Jvm优化原理深度剖析&Jvm优化实战剖析 4.Jvm优化原理&数据库连接池&多级缓存实战 5.多级缓存&Aop锁&分布式锁&秒杀下单优化 6.秒杀下单优化&最终消息一致&流量洪峰限流 7.服务云端部署&DevOps流水线部署模式实战
HTML
6
star
46

OfficeTool

Office安装激活工具 Office Tool Plus
VBScript
5
star
47

DevOps

尚硅谷 大厂学院 大厂-云原生 雷丰阳
Shell
5
star
48

SocketChat

C# 聊天 基于 C# WinForm sockets的在线聊天软件的设计和开发 (1) 登录注册模块:实现账户的登录和注册; (2) 好友与群组列表:显示好友和群组的列表; (3) 个人信息模块:显示和修改个人信息; (4) 系统消息模块:显示发出和收到的好友申请和入群申请,并能够对这些申请进行一些操作; (5) 发送申请模块:通过该界面对用户发出好友申请或对群组提出入群申请; (6) 单人聊天:通过该界面和好友进行一对一聊天; (7) 多人聊天:通过该界面进行群组多人聊天。
C#
5
star
49

reactor-programming

尚硅谷SpringBoot3响应式编程教程,2024最新springboot入门到实战
Java
5
star
50

SRB_Demo01

尚硅谷《尚融宝》Java微服务分布式金融项目
JavaScript
5
star
51

SpringBoot_Demo04

三更 三更草堂 2021最新SpringBoot2.5.0从入门到精通最新IDEA版通俗易懂【三更录制】-SpringBoot框架-手撕源码
Java
5
star
52

HarmonyOS

尚硅谷纯血鸿蒙项目实战硅谷租房,HarmonyOS NEXT鸿蒙星河版项目
TypeScript
5
star
53

Java_Interview_Book

Java 面试题
HTML
5
star
54

JUC

尚硅谷 大厂学院 大厂-JUC 周阳 大厂高阶班之 JUC并发编程与源码分析 尚硅谷讲师:周阳 2021.3V2.6
C++
4
star
55

FMMall_Demo01

千锋教育最强Java项目《锋迷商城》Java电商项目全套400+集完整版,挑战大厂拿高薪!(涛哥主讲)
JavaScript
4
star
56

stock_parent

黑马程序员 今日指数项目 后台
Java
4
star
57

xuecheng-plus

学成在线 后端 黑马程序员Java企业级实战开发《学成在线》微服务项目,基于SpringCloud、SpringCloudAlibaba技术栈开发,项目搭建到选课支付学习全通关
JavaScript
4
star
58

Software_Design_Engineer_Demo01

软考 软考资料 软件设计师历年真题 计算机技术与软件专业技术资格(水平)考试
4
star
59

FlinkTutorial-1.17

尚硅谷大数据Flink1.17实战教程从入门到精通
Java
4
star
60

frontend-quickstart

前端工程化 - 快速通关 (4h)
Vue
3
star
61

springcloud2024

尚硅谷2024最新SpringCloud教程,springcloud从入门到大牛
HTML
3
star
62

Adobe

嬴政天下 Adobe CS6-2022 全家桶大师版 v12.2
3
star
63

msbd

JAVA 面试宝典和简历模板V3
3
star
64

guigu-oa

尚硅谷Java项目《云尚办公》企业级ssm项目,Java实战项目 OA项目 包含全套笔记 前后端代码
HTML
3
star
65

Hospital_Appointment_Registration_System_Demo01

尚医通 尚硅谷 Java微服务+分布式+全栈项目【尚医通】
HTML
3
star
66

pinda-authority

黑马程序员Java品达通用权限项目,基于SpringCloud SpringBoot 的微服务框架的权限管理解决方案
Java
3
star
67

Jshop

jshop基于当前流行技术组合的前后端分离商城系统: SpringBoot2+MybatisPlus+SpringSecurity+jwt+redis+Vue的前后端分离的商城系统, 包含商城、拼团、砍价、商户管理、 秒杀、优惠券、积分、分销、会员、充值、多门店等功能
Java
3
star
68

Data_Structure_Demo04

黑马 数据结构与算法 JAVA 2023新版Java数据结构与算法视频教程,java高级程序员必会的数据结构与算法
JavaScript
2
star
69

Lock_Demo01

【尚硅谷】分布式锁全家桶丨一套搞定Redis/Zookeeper/MySQL实现分布式锁
HTML
2
star
70

ZC_Demo01

基于Java的众筹系统的设计与实现 java springboot 众筹系统
JavaScript
2
star
71

SublimeText

代码编辑器 Sublime Text v4.1.2.6 中文破解版
Python
2
star
72

RESP

redis可视化工具 resp 2022.4.2.0.0 RedisDesktopManager 破解 RDM redis redis客户端
2
star
73

Flink

尚硅谷 大厂学院 大数据与人工智能
2
star
74

chating

基于C#的基础网络聊天室 CSkin皮肤 实现互发消息 互发图片 互发小文件 窗体抖动 新消息提示音 托盘图标闪烁
C#
2
star
75

atguigu_C

尚硅谷C语言零基础教程(宋红康c语言程序设计精讲,含C语言考研真题)
C
2
star
76

RPC

尚硅谷 大厂学院 RPC框架核心源码深度解析
Java
2
star
77

IObitUninstallerPro

卸载工具 IObit Uninstaller Pro v11.6.0.7 中文破解版
2
star
78

SpringSecurity_Demo05

【尚硅谷】SSM项目教程,SSM+SpringBoot+SpringSecurity框架整合项目
Java
2
star
79

pd-sms-backend

黑马程序员Java大型分布式微服务闪聚支付项目,Java移动支付全生态系统,掌握大厂支付核心技术
Java
2
star
80

JUC_Demo01

【遇见狂神说】8.15秋招经验分享【遇见狂神说】JUC视频笔记 【遇见狂神说】Linux视频笔记 【遇见狂神说】MyBatisPlus视频笔记 【遇见狂神说】POI视频笔记 【遇见狂神说】基础面试题 【遇见狂神说】汇编入门视频笔记 【遇见狂神说】英语单词整理 【遇见狂神说】贪吃蛇代码
Java
2
star
81

heima-ruoyi-vue3-ai

黑马程序员Java最新AI+若依框架项目开发新方案视频教程,基于RuoYi-Vue3前后端分离版本,从前端到后端再到AI智能化应用全通关
CSS
2
star
82

atguigu_interview_fourth

尚硅谷Java面试题第4季,最新大厂java面试真题 尚硅谷周阳
HTML
2
star
83

atguigu_vue3

尚硅谷Vue3入门到实战,最新版vue3+TypeScript前端开发教程 禹神YYDS,千万播放新版Vue3教程来了! 基于Vue3的setup语法糖讲解,全程采用TypeScript+组合式API编码,贴心准备TypeScript快速上手笔记!带你快速上手纯血版Vue3!
Vue
2
star
84

dkd

dkd帝可得后台管理系统 IoT帝可得是一个基于物联网概念下的智能售货机运营管理系统 帝可得
Java
2
star
85

PinDa-Authority_Demo01

品达通用权限系统 品达 通用权限 黑马程序员Java品达通用权限项目,基于SpringCloud SpringBoot 的微服务框架的权限管理解决方案
Vue
2
star
86

Vue_Demo02

尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通
JavaScript
1
star
87

Mybatis_Demo04

三更草堂 2021最新Mybatis框架教程IDEA通俗易懂版
1
star
88

Redis_Demo02

狂神说Redis笔记
Java
1
star
89

SpringSource

尚硅谷 大厂学院 微服务框架核心源码深度解析
Java
1
star
90

monitor

尚硅谷 大厂学院 监控专题
1
star
91

JVM

尚硅谷 大厂学院 大厂JVM 大厂JVM\JVM与GC调优 尚硅谷 宋红康 深入拆解一线大厂JVM
Java
1
star
92

RabbitMQ_Demo02

黑马程序员RabbitMQ全套教程,rabbitmq消息中间件到实战
Java
1
star
93

MindManagerCrack

MindManagerCrack mindmanager破解补丁
1
star
94

WinRAR

解压缩工具 WinRAR v6.11 简体中文汉化破解版
1
star
95

ShangPinHui_Demo01

尚硅谷VUE项目实战,前端项目-尚品汇(大型\重磅)
Vue
1
star
96

OnlineeEucation_Demo01

尚硅谷 谷粒学苑 微服务 全栈在线教育实战项目
JavaScript
1
star
97

SoftwareDesignPattern_Demo01

黑马程序员 java 设计模式
HTML
1
star
98

SoftwareEngineering_Demo01

软件工程课件 软件工程导论 (第6版)课件
1
star
99

ShardingSphere_Demo02

尚硅谷2022新版ShardingSphere5实战教程(快速入门掌握核心)
Java
1
star
100

shuhongfan.github.io

舒洪凡的博客
CSS
1
star