自学内容网 自学内容网

17.快递物流仓库管理系统(基于springboot和vue)

目录

1.系统的受众说明    

2.系统详细设计

2.1 需求分析

2.2 系统功能设计

2.3 开发环境分析

​​​​​​​2.4 E-R图设计

2.5 数据库设计

3. 系统实现

3.1 环境搭建

​​​​​​​3.2 员工信息管理模块

3.3 销售订单信息管理模块

​​​​​​​3.4 图表分析模块

​​​​​​​3.5 商品信息和仓库管理

​​​​​​​3.6 配送管理模块

3.7 系统管理模块

3.8 切面日志的使用


1.系统的受众说明 
   

     1 在校学习的学生,可用于日常学习使用或是毕业设计使用

     2 毕业一到两年的开发人员,用于锻炼自己的独立功能模块设计能力,增强代码编写能力。

     3 亦可以部署为商化项目使用。

     4 需要完整资料及源码,请在文末获取联系方式领取。

2.系统详细设计

2.1 需求分析

基础管理包含商品管理,来往单位,员工管理,仓库管理。

销售管理包含销售开票,销售记录。

配送管理包含申请配送,配送列表。

运输管理包含车辆资料,驾驶员资料。

图表分析包含出入库分析。

系统设置包含安全设置,操作员管理,权限列表。

日志管理包含登陆日志和操作日志。

操作员的所有权限

ROLE_EMPLOYEE; 员工权限

查看员工对员工进行增删改查操作

ROLE_WAREHOUSE;仓库权限

对仓库的管理权限查看仓库的数量名字和增删改查

ROLE_SALE;销售权限

对销售单的管理权限,查看销售的相关信息和增删改查

ROLE_COMMODITY;商品权限

对商品的管理权限查看商品的数量名字和增删改查

ROLE_ADMIN;管理员权限

所有权限

ROLE_SUPER_ADMIN超级管理员权限

所有权限

​​​​​​​2.2 系统功能设计

仓库物流网站主要是针对快递物流最后一公里的配送问题研发的,实现了取件快速认证身份,仓库快递送货上门快速下单等,方便用户取快递的过程。

本系统的用户类型较多,不同用户的功能操作业务不同,为了提升用户体验,在用户访问时,通过CAS权限控制技术,实现不同用户访问的不同的用户界面,避免用户超越权限访问内容,减少用户误操作。因此,本系统将分为三个用户界面,分别为管理员模块界面,快递模块界面和用户模块界面。管理员可以对其他用户和订单进行管理。管理员和用户可以进行登录后并使用网站。

功能模块结构图如图所示。

图 211模块结构图

2.3 开发环境分析

前端vue技术

Vue.js(通常简称为 Vue)是一个用于构建用户界面的渐进式 JavaScript 框架。它旨在通过简洁的 API 实现响应的数据绑定和组合的视图组件。Vue 的核心库专注于视图层,并且易于与其他库或已有项目整合。同时,Vue 完全有能力驱动采用单文件组件和 Vue 生态系统支持的库开发的复杂单页应用。

以下是 Vue 的一些主要特性和优势:

响应式数据绑定:Vue 采用了数据驱动视图的原理。当数据发生变化时,视图会自动更新,反之亦然。这种响应式数据绑定极大地简化了前端开发的工作。

组件化开发:Vue 允许你将 UI 拆分为独立的、可复用的组件,这有助于提高代码的可维护性和可重用性。组件可以嵌套使用,并且可以拥有自己的状态和方法。

指令系统:Vue 提供了一套简洁的指令系统,如 v-for、v-if、v-bind 等,这些指令可以帮助你轻松操作 DOM,并使得模板更易于理解和维护。

虚拟 DOM:Vue 使用虚拟 DOM 来提高渲染性能。当数据发生变化时,Vue 会计算出一个新的虚拟 DOM 树,并将其与旧的虚拟 DOM 树进行比较,然后找出差异并更新真实的 DOM。

丰富的生态系统:Vue 拥有庞大的社区和丰富的生态系统,包括各种插件、工具库和组件库,可以帮助你快速构建功能强大的应用。

易于学习和使用:Vue 的 API 设计得简洁直观,使得初学者能够快速上手。同时,Vue 的文档和社区资源也非常丰富,有助于解决学习和使用过程中的问题。

服务器端渲染 (SSR) 与静态网站生成 (SSG):Vue 支持服务器端渲染,使得首屏加载更快,并提供了更好的用户体验。此外,Vue 也支持静态网站生成,适合构建静态站点。

Vue 在前端开发中得到了广泛的应用,特别是在构建单页面应用(SPA)时。无论是开发简单的网页还是复杂的应用,Vue 都能提供强大的支持和灵活的解决方案。

IDEA

"IDEA" 通常指的是 IntelliJ IDEA,这是一个由 JetBrains 公司开发的强大的集成开发环境(IDE),主要用于 Java 语言开发,但也支持其他语言,如 Kotlin、Scala、Groovy 等。IDEA 提供了一套丰富的工具和功能,旨在提高开发者的生产力和代码质量。

以下是 IntelliJ IDEA 的一些主要特点和功能:

智能代码编辑:IDEA 提供了智能代码补全、代码格式化、代码重构、快速修复等功能,帮助开发者更高效地编写代码。

强大的调试器:内置了一个功能强大的调试器,支持断点、变量查看、线程分析等调试功能。

版本控制集成:与 Git、SVN 等版本控制系统无缝集成,支持代码提交、拉取、合并等操作。

丰富的插件生态:IDEA 支持大量的插件,开发者可以根据自己的需求安装插件,扩展 IDE 的功能。

数据库工具:提供了数据库连接、SQL 编辑、数据可视化等数据库相关的工具。

集成测试工具:支持单元测试、集成测试等,方便开发者在开发过程中进行测试。

性能分析器:内置了性能分析器,可以帮助开发者分析代码的性能瓶颈。

跨平台支持:IDEA 可以在 Windows、macOS 和 Linux 等多个操作系统上运行。

IntelliJ IDEA 分为两个版本:社区版(Community Edition)和旗舰版(Ultimate Edition)。社区版是免费的,提供了基本的 Java 开发功能;而旗舰版则包含了更多的高级功能,如 Web 开发、数据库工具、移动应用开发等,需要付费购买。

由于 IntelliJ IDEA 的出色性能和丰富的功能,它受到了广大 Java 开发者的喜爱和信赖,成为 Java 开发领域的一款主流 IDE。

数据库:MySQL

MySQL 是一个流行的开源关系型数据库管理系统(RDBMS),它使用结构化查询语言(SQL)进行数据库管理。MySQL 由瑞典 MySQL AB 公司开发,后被甲骨文公司(Oracle Corporation)收购。由于其性能高、稳定性好、易于使用和开源等特性,MySQL 广泛应用于各种网站和应用程序中,特别是 Web 开发领域。

以下是 MySQL 的一些主要特点和功能:

开源与免费:MySQL 是一个开源项目,可以免费使用和修改。这大大降低了使用成本,并促进了社区的发展和贡献。

结构化存储:MySQL 使用表(table)来存储数据,每个表由行(row)和列(column)组成,提供结构化的数据存储方式。

强大的 SQL 支持:MySQL 完全支持标准的 SQL 语言,包括数据查询、插入、更新和删除等操作。

索引:为了提高查询性能,MySQL 支持多种类型的索引,如主键索引、唯一索引、普通索引等。

事务处理:MySQL 支持 ACID(原子性、一致性、隔离性、持久性)事务,确保数据的一致性和完整性。

存储引擎:MySQL 支持多种存储引擎,如 InnoDB、MyISAM 等,每种引擎都有其特定的优势和适用场景。

视图、触发器与存储过程:MySQL 提供了视图(view)、触发器(trigger)和存储过程(stored procedure)等高级功能,增强了数据库的灵活性和可维护性。

复制与集群:MySQL 支持主从复制(master-slave replication),可以实现数据备份和读写分离。同时,也支持各种集群方案,如 NDB Cluster、Group Replication 等,以实现高可用性和负载均衡。

性能优化:MySQL 提供了丰富的性能优化工具和参数设置,可以帮助开发者和管理员优化数据库性能。

广泛的社区支持:由于 MySQL 的广泛应用,其社区非常活跃,拥有大量的学习资源和开发者支持。

在 Web 开发中,MySQL 通常与各种编程语言和框架结合使用,如 PHP、Python(Django、Flask)、Java(Spring、Hibernate)等,构建功能强大的后端系统。此外,MySQL 也广泛应用于数据分析、数据挖掘、电子商务、内容管理等领域。

Nodejs 运行vue前端的环境

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。它允许开发者在服务器端使用 JavaScript 来编写和运行代码。Node.js 的出现,打破了前端与后端开发的界限,使得开发者可以使用同一种语言(JavaScript)来编写全栈应用。

Node.js 的主要特点包括:

非阻塞 I/O:Node.js 采用单线程模型,利用事件循环(Event Loop)处理非阻塞 I/O 操作,使其能够高效地处理大量并发连接。

异步编程:Node.js 提供了大量的异步 API,使得开发者可以编写非阻塞的、事件驱动的代码,从而提高应用程序的性能和响应速度。

单线程:虽然 Node.js 是单线程的,但由于其非阻塞的 I/O 模型,它可以充分利用多核 CPU 的资源,通过创建多个进程(使用 child_process 或 cluster 模块)来实现并行处理。

丰富的生态系统:Node.js 拥有庞大的社区和丰富的第三方库,开发者可以轻松地找到所需的工具和框架,快速构建应用程序。

跨平台:Node.js 可以在 Windows、Linux 和 macOS 等多种操作系统上运行,使得开发者可以灵活地选择开发环境。

Node.js 的应用场景非常广泛,包括但不限于:

Web 应用开发:Node.js 可以用于构建高性能的 Web 服务器和 API 接口。

实时通信:Node.js 的非阻塞 I/O 和事件驱动特性使其非常适合用于构建实时通信应用,如聊天室、在线游戏等。

数据处理与分析:Node.js 可以用于处理大量数据,如日志分析、数据挖掘等。

物联网(IoT):Node.js 的轻量级和跨平台特性使其成为物联网应用开发的理想选择。

总之,Node.js 是一个强大而灵活的 JavaScript 运行环境,它使得开发者能够用同一种语言构建全栈应用,提高开发效率,降低维护成本。

​​​​​​​2.4 E-R图设计

在该系统中,配送订单的属性分析,具体E-R图如下图所示。

图 212 E-R图 

2.5 数据库设计

根据系统需求和各模块功能设计,在数据库设计中,设计了张数据表,分别为权限系统8张,分别为管理员、快递员、用户和龙门镖局。设计订单、代取件订单表和龙门镖局订单各1张,以及公告表、反馈表各1张。由于该物流仓库配送快递平台后续还会有更多功能和模块,因此在表的设计中还需要保证它的可扩展性。

数据库的E-R图设计后,就可以将上面的数据库概念转化为实际数据模型,及数据库的逻辑结构。

数据库实体属性和字段属性如下图所示。

(1)管理员表存放管理员信息,如下表所示。

表 22管理员表admin

名称

类型

长度

是否允许空

是否主键

id

int

11

create_at

varchar

50

email

varchar

50

password

varchar

50

roles

varchar

50

(2员工表存放各站点的工作人员信息,如下表所示。

表 23员工表employee

名称

类型

长度

是否允许空

是否主键

id

int

11

address

varchar

50

create_at

varchar

50

department

varchar

50

gender

varchar

50

id_card

varchar

50

name

varchar

50

phone

varchar

11

update_at

varchar

50

(3)司机表存放使用该网站系统的司机信息,如下表所示。

表 24司机配送员表driver

名称

类型

长度

是否允许空

是否主键

id

int

11

address

varchar

50

create_at

varchar

50

driving

varchar

50

gender

varchar

50

id_card

varchar

50

license

varchar

50

name

int

11

phone

varchar

score

varchar

update_at

varchar

(4)销售订单表存放销售订单信息,如下表所示。

表 25销售表sale

名称

类型

长度

是否允许空

是否主键

id

int

11

commodity

varchar

50

company

varchar

500

count

varchar

11

create_at

varchar

500

description

varchar

50

number

varchar

50

pay

bit

1

phone

varchar

11

price

varchar

50

(5)库存inventory信息表,如下表所示。

表3- 1库存表inventory

名称

类型

长度

是否允许空

是否主键

id

int

11

cid

varchar

255

count

varchar

8000

location

varchar

50

name

varchar

11

wid

varchar

50

(6)商品表信息,如下表所示。

表 26商品表commodity

名称

类型

长度

是否允许空

是否主键

id

int

11

count

varchar

50

create_at

varchar

11

description

varchar

500

name

varchar

50

price

varchar

50

update_at

varchar

50

(7)仓库表用来存放用户信息仓库表,如下表所示。

表 27仓库表warehouse

名称

类型

长度

是否允许空

是否主键

id

int

11

create_at

varchar

255

name

varchar

255

principle

varchar

50

(8)交通工具vehicle,如下表所示。

表 28交通工具表vehicle

名称

类型

长度

是否允许空

是否主键

id

int

11

create_at

varchar

50

driving

varchar

50

number

varchar

50

type

varchar

50

3. 系统实现

3.1 环境搭建

搭建基于springboot和vue仓库快递物流配送平台首先需要搭建springboot环境。Spring MVC 用于 Web 层,相当于 Controller,处理请求并作出响应;MyBatis 作为持久层的框架,可以自由的控制 SQL,更加简捷地完成数据库操作;Spring 的依赖注入可以减少代码的耦合,可以装配 Bean,另外其 AOP、事务管理尤其方便,同时,Spring 可以将各层进行整合。springboot框架相比于SSM更轻量灵活,也更符合敏捷开发的需求。[13]

在设计并建立数据库后,首先建立了所需的包并导入了项目所用的jar包。框架结构图如下图所示。

 

图 41前后端项目结构图

后端总配置:

server:
 port: 8088
spring:
 mail:
   host: smtp.qq.com
   protocol: smtp
   default-encoding: UTF-8
   #发件人
   username: abc@qq.com
   #授权码
   password: hmps234234
   port: 465
   properties:
     mail:
       debug: true
       smtp:
         ssl:
           enable: true
 datasource:
   driver-class-name: com.mysql.cj.jdbc.Driver
   url: jdbc:mysql://localhost:3306/wmsadmin?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2b8&allowPublicKeyRetrieval=true
   username: root
   password: root
 jpa:
   hibernate:
     ddl-auto: update
   open-in-view: false
   show-sql: true
#设置日志级别会给root根节点设置,代表整体应用的级别
logging:
 level:
   root: info

前端与后端连接参数:

import request from "axios"

import {message} from 'ant-design-vue'

import router from '../router/index'

var token = localStorage.getItem("token")

var service = request.create({

    baseURL: 'http://localhost:8088/api',

    timeout: 50000

});

service.interceptors.response.use(

    response => {

        const res = response.data;

        //判断response状态

        if (!res.status) message.error('请求错误: ' + res.msg)

        if (res.code === 403) router.push("/403")

        return res

    },

    error => {

        message.error(error)

        router.push('/500')

        return Promise.reject(error)

    }

);

console.log("执行request.js2");

export default service

    1. 用户登录模块

用户登录功能是采用form提交的形式进行登陆验证,在输入用户名和密码后,通过form的post,提交方式,提交到服务器端,服务器端接受到数据,在数据库中查找,查找出这个用户,登录成功,如果查询出来没有,登录失败。

登录界面如下图所示。

图 42登陆界面

<template>

  <div class="login_container">

  <div class="login-box">

    <div>

      <div class="title">物流快递仓库管理系统</div>

      <a-tabs @change="tabClick" default-active-key="1" :tabBarStyle="{ textAlign: 'center' }">

        <a-tab-pane key="1" tab="密码登陆">

          <a-input

              v-model="form.email"

              size="large"

              style="margin-top: 10px"

              class="input"

              placeholder="邮箱">

            <a-icon slot="prefix" type="mail"/>

          </a-input>

          <a-input-password

              v-model="form.password"

              size="large"

              class="input"

              placeholder="密码">

            <a-icon slot="prefix" type="lock"/>

          </a-input-password>

        </a-tab-pane>

        <a-tab-pane key="2" tab="验证码登陆" force-render>

          <a-input

              v-model="form.email"

              size="large"

              style="margin-top: 10px"

              class="input"

              placeholder="邮箱">

            <a-icon slot="prefix" type="mail"/>

          </a-input>

          <div style="display: flex">

            <a-input

                v-model="form.code"

                size="large"

                class="input"

                placeholder="验证码">

              <a-icon slot="prefix" type="safety-certificate"/>

            </a-input>

            <a-button class="code-btn" :loading="sendLoading" @click="sendEmail">

              获取验证码

            </a-button>

          </div>

        </a-tab-pane>

      </a-tabs>

      <div style="margin-bottom: 20px;display: flex;justify-content: space-around;">

        <a-checkbox v-model="form.remember" style="display: inline;">自动登录</a-checkbox>

        <!-- <a-button type="link" to="/init">没有账号?点我注册 </a-button> -->

        <router-link to="/init">没有账号?点我注册</router-link>

      </div>

      <a-button :loading="submitLoading" class="submit-btn" type="primary" @click="submitLogin">

        确认登陆

      </a-button>

      <div class="des">管理员登录</div>

    </div>

  </div>

</div>

</template>

​​​​​​​3.2 员工信息管理模块

import com.example.api.annotation.Log;
import com.example.api.model.entity.Employee;
import com.example.api.model.enums.BusincessType;
import com.example.api.service.EmployeeService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

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

@RestController
@RequestMapping("/api/employee")
@PreAuthorize("hasAnyRole('ROLE_SUPER_ADMIN' ,'ROLE_EMPLOYEE')")
public class EmployeeController {

   @Resource
   private EmployeeService employeeService;

   @Log(moudle = "员工管理",type = BusincessType.QUERY)
   @GetMapping("")
   public List<Employee> findAll() {
       return employeeService.findAll();
   }

   @Log(moudle = "员工管理",type = BusincessType.QUERY)
   @GetMapping("/{id}")
   public Employee findById(@PathVariable String id) {
       return employeeService.findById(id);
   }

   @Log(moudle = "员工管理",type = BusincessType.INSERT)
   @PostMapping("")
   public Employee save(@RequestBody Employee employee) {
       return employeeService.save(employee);
   }

   @Log(moudle = "员工管理",type = BusincessType.UPDATE)
   @PutMapping("")
   public void update(@RequestBody Employee employee) {
       employeeService.update(employee);
   }

   @Log(moudle = "员工管理",type = BusincessType.DELETE)
   @DeleteMapping("")
   public void delete(String id) {
       employeeService.delete(id);
   }

}

图 43员工管理

添加界面如下图所示。

图 44员工信息添加

3.3 销售订单信息管理模块

销售订单管理模块包含 公司打款账号,商品数量预留电话,总计界面如下图所示。

图 45销售订单界面

代码:

package com.example.api.controller;

import com.example.api.model.entity.Sale;
import com.example.api.service.SaleService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

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

@RestController
@RequestMapping("/api/sale")
@PreAuthorize("hasAnyRole('ROLE_SUPER_ADMIN' ,'ROLE_SALE')")
public class SaleController {
   @Resource
   private SaleService saleService;

   @PostMapping("")
   public Sale save(@RequestBody Sale sale) {
       return saleService.save(sale);
   }

   @GetMapping("")
   public List<Sale> findAll() {
       return saleService.findAll();
   }

   @GetMapping("/search/{name}")
   public List<Sale> search(@PathVariable String name) {
       return saleService.searchByCompany(name);
   }

}

​​​​​​​3.4 图表分析模块

快递人员管理是对物流的种类信息进行管理,如下图所示。

图 46入库分析界面

代码


@GetMapping("analyze")
public List<CommodityChartVo> analyze(Integer type) {
   return recordService.analyzeCommodity(type);
}

​​​​​​​3.5 商品信息和仓库管理

在仓库中,经常遇到,今天的课程全在南区,但快递却在北区的菜鸟驿站,一来一回要花费半小时。以及,有些时候,用户会收到一些非常重的快递,但并不是每次都能找到用户来搬。在这种情况下开发了代取件功能。

用户收到菜鸟驿站的快递短信通知后,登陆网站,写上自己的快递基本信息,如大概重量,以及自己的宿舍楼层,以及报酬等,愿意接单的其他用户会在进入网站时看到此条信息,接单并联系送货的时间。在送达后会进行互相评分并进行评价。

查看代取件订单时如下图所示

图 47商品信息管理界面

仓库如下图所示。

图 48仓库管理界面

其主要实现代码如下所示

package com.example.api.controller;
import com.example.api.annotation.Log;
import com.example.api.model.entity.Warehouse;
import com.example.api.model.enums.BusincessType;
import com.example.api.service.WarehouseService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

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

@RestController
@RequestMapping("/api/warehouse")
@PreAuthorize("hasAnyRole('ROLE_SUPER_ADMIN' ,'ROLE_WAREHOUSE')")
public class WarehouseController {

   @Resource
   private WarehouseService warehouseService;

   @Log(moudle = "仓库管理",type = BusincessType.INSERT)
   @PostMapping("")
   public Warehouse save(@RequestBody Warehouse warehouse) {
       return warehouseService.save(warehouse);
   }

   @Log(moudle = "仓库管理",type = BusincessType.QUERY)
   @GetMapping("")
   public List<Warehouse> findAll() {
       return warehouseService.findAll();
   }

   @Log(moudle = "仓库管理",type = BusincessType.DELETE)
   @DeleteMapping("")
   public void delete(String id) {
       warehouseService.delete(id);
   }

}

​​​​​​​3.6 配送管理模块

管理员可以发布或修改公告,所有用户可见。公告管理界面如下图所示。

图 49申请配送管理界面

3.7 系统管理模块

快递人员信息修改是员工可以对自己的编号密码地址等进行修改,如下图所示。

图 410操作员管理界面

图 411修改登陆人信息界面

图 412 权限列表

3.8 切面日志的使用

package com.example.api.aspect;

import com.example.api.annotation.Log;
import com.example.api.model.entity.SystemLog;
import com.example.api.service.SystemLogService;
import com.example.api.utils.IpUtil;
import com.example.api.utils.JwtTokenUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.time.LocalDateTime;

@Aspect
@Component
public class LogAspect {
   @Autowired
   private SystemLogService logService;

   /*
       表明切点
    */
   @Pointcut("@annotation(com.example.api.annotation.Log)")
   public void pt(){}

   /*
      环绕通知
    */
   @Around("pt()")
   public Object Around(ProceedingJoinPoint point) throws Throwable {
       //记录开始时间
       long beginTime = System.currentTimeMillis();
       Object res = null;
       try {
           //执行方法
           res = point.proceed();
       }finally {
           //计算执行时长
           long time = System.currentTimeMillis() - beginTime;
           recordLog(point);
       }
       return res;
   }

   private void recordLog(ProceedingJoinPoint point){
       //获取当前请求对象
       ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
       HttpServletRequest request = requestAttributes.getRequest();
       //获取目标方法签名
       MethodSignature signature = (MethodSignature) point.getSignature();
       Method method = signature.getMethod();
       Log annotation = method.getAnnotation(Log.class);
       //封装日志对象
       SystemLog systemLog = new SystemLog();
       systemLog.setModule(annotation.moudle());
       systemLog.setBusincessType(annotation.type().getName());
       systemLog.setIp(IpUtil.getIpAddr(request));
       systemLog.setTime(LocalDateTime.now());
       //获取方法的全路径
       systemLog.setMethod(signature.getDeclaringTypeName()+"."+signature.getName());
       //获取token,并解析token来获取当前账号
       String token = request.getHeader(JwtTokenUtil.TOKEN_HEADER);
       systemLog.setAccount(JwtTokenUtil.getUsername(token));
       //持久化到数据库
       logService.record(systemLog);
   }
}


原文地址:https://blog.csdn.net/qq_24907431/article/details/143374175

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!