17.快递物流仓库管理系统(基于springboot和vue)
目录
1.系统的受众说明
1 在校学习的学生,可用于日常学习使用或是毕业设计使用
2 毕业一到两年的开发人员,用于锻炼自己的独立功能模块设计能力,增强代码编写能力。
3 亦可以部署为商化项目使用。
4 需要完整资料及源码,请在文末获取联系方式领取。
2.系统详细设计
2.1 需求分析
基础管理包含商品管理,来往单位,员工管理,仓库管理。
销售管理包含销售开票,销售记录。
配送管理包含申请配送,配送列表。
运输管理包含车辆资料,驾驶员资料。
图表分析包含出入库分析。
系统设置包含安全设置,操作员管理,权限列表。
日志管理包含登陆日志和操作日志。
操作员的所有权限
ROLE_EMPLOYEE; 员工权限
查看员工对员工进行增删改查操作
ROLE_WAREHOUSE;仓库权限
对仓库的管理权限查看仓库的数量名字和增删改查
ROLE_SALE;销售权限
对销售单的管理权限,查看销售的相关信息和增删改查
ROLE_COMMODITY;商品权限
对商品的管理权限查看商品的数量名字和增删改查
ROLE_ADMIN;管理员权限
所有权限
ROLE_SUPER_ADMIN超级管理员权限
所有权限
2.2 系统功能设计
仓库物流网站主要是针对快递物流最后一公里的配送问题研发的,实现了取件快速认证身份,仓库快递送货上门快速下单等,方便用户取快递的过程。
本系统的用户类型较多,不同用户的功能操作业务不同,为了提升用户体验,在用户访问时,通过CAS权限控制技术,实现不同用户访问的不同的用户界面,避免用户超越权限访问内容,减少用户误操作。因此,本系统将分为三个用户界面,分别为管理员模块界面,快递模块界面和用户模块界面。管理员可以对其他用户和订单进行管理。管理员和用户可以进行登录后并使用网站。
功能模块结构图如图所示。
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 | 是 | |
| 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
用户登录功能是采用form提交的形式进行登陆验证,在输入用户名和密码后,通过form的post,提交方式,提交到服务器端,服务器端接受到数据,在数据库中查找,查找出这个用户,登录成功,如果查询出来没有,登录失败。
登录界面如下图所示。
图 42登陆界面
<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)!