Vue+SpringBoot打造快递管理系统

在这里插入图片描述

目录

  • 一、摘要
    • 1.1 项目介绍
    • 1.2 项目录屏
  • 二、研究内容
    • 2.1 数据中心模块
    • 2.2 快递类型模块
    • 2.3 快递区域模块
    • 2.4 快递货架模块
    • 2.5 快递档案模块
  • 三、界面展示
    • 3.1 登录注册
    • 3.2 快递类型
    • 3.3 快递区域
    • 3.4 快递货架
    • 3.5 快递档案
    • 3.6 系统基础模块
  • 四、免责说明


一、摘要

1.1 项目介绍

快递管理系统包含的快递区域模块、快递货架模块、快递类型模块和快递档案模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,快递管理系统基于角色的访问控制,给快递管理员和快递工作人员使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求。

  • 前端:Vue 2.7.10

  • 后端:Spring Boot 3.1.10

  • 数据库:MySQL 8.0.31

1.2 项目录屏


二、研究内容

本课题的目的就是旨在开发一个为高校师生提供快递支持的快递管理系统

快递管理系统主要采用了JAVA编程语言,采用了Vue的开发技术,使用MYSQL数据库来支撑系统的数据流动。

本文将最终完成快递管理系统设计与实现,并通过完备的功能测试和性能测试来验证该系统的质量。系统需要支持以下功能。

  • 快递包装类型管理,实现增加、删除、修改、条件查询、导入快递包装类型。
  • 快递管理,实现增加、删除、修改、条件查询、导入快递,支持上传快递图片。
  • 快递区域管理,如大型快递包装、小型快递包装等,实现增加、删除、修改、条件查询快递区域。
  • 快递货架管理,实现增加、删除、修改、条件查询快递货架。
  • 用户档案管理,实现对终端用户数据的维护。
  • 角色管理,采用基于角色的访问控制,对于快递管理员、仓管员、顾客分配不同的菜单权限。

拟解决的主要问题如下:

  1. 如何实现快递区域和快递的档案管理、快递回收记录存档;
  2. 系统如何应对用户的高并发访问,如何确保快递管理系统的安全性。

快递管理系统的功能性需求主要包含数据中心模块、快递包装类型模块、快递区域模块、快递货架模块、快递档案模块这五大模块,系统是基于浏览器运行的web管理后端,其中各个模块详细说明如下。

2.1 数据中心模块

数据中心模块包含了快递管理系统的系统基础配置,如登录用户的管理、运营公司组织架构的管理、用户菜单权限的管理、系统日志的管理、公用文件云盘的管理。

其中登录用户管理模块,由管理员负责运维工作,管理员可以对登录用户进行增加、删除、修改、查询操作。

组织架构,指的是运营公司的组织架构,该模块适用于管理这些组织架构的部门层级和员工的部门归属情况。

用户菜单权限管理模块,用于管理不同权限的用户,拥有哪些具体的菜单权限。

系统日志的管理,用于维护用户登入系统的记录,方便定位追踪用户的操作情况。

公用云盘管理模块,用于统一化维护快递管理系统中的图片,如快递单照片、快递区域照片等等。

2.2 快递类型模块

不同的快递有不同的快递类型,可以分为大快递、小快递、易碎快递、加急件快递等等,不同类型的快递有着不同的运输方式,所以需要建立快递类型模块,对快递类型数据进行维护。其中字段包括类型名称、状态、排序值、备注、创建人、创建时间、更新人、更新时间等,快递管理员可以新增、删除、修改、条件查询快递类型,用户查询管理员发布的快递类型。

2.3 快递区域模块

一定规模的快递公司,会有多个快递区域,每个仓库存放着不同区域的快递,比如A区域存放省内的快递,B区域存放省外的快递,所以需要建立快递区域模块,对快递的区域数据进行管理,快递区域信息包括区域名称、状态、排序值、备注、创建人、创建时间、更新人、更新时间等,快递管理员可以新增、删除、修改、条件查询快递区域,用户可以查询管理员发布的快递区域数据。

2.4 快递货架模块

快递货架模块是对快递的存放货架数据进行管理。快递货架的字段包括货架名称、所属区域、货架状态、备注、创建人、创建时间、更新人、更新时间等,快递管理员可以新增、删除、修改、条件查询快递货架,用户可以查询管理员发布的快递货架数据。

2.5 快递档案模块

快递是快递包装服务系统的核心业务,所以需要建立快递档案模块,快递的字段包括快递类型、所属货架、收件人、收件电话、收件地址、发件人、发件电话、发件地址,快递管理员可以新增、删除、修改、条件查询快递,用户可以查询管理员发布的快递数据,也可以新增快递数据。

在这里插入图片描述

三、界面展示

3.1 登录注册

在这里插入图片描述

<Form ref="usernameLoginForm" :model="form" :rules="usernameLoginFormRules" class="form">
    <FormItem prop="username" class="loginInput">
        <Row>
            <Input v-model="form.username" size="large" clearable placeholder="登录账号" autocomplete="off">
            <Icon class="iconfont icon-yonghu" slot="prefix" style="line-height:50px" />
            </Input>
        </Row>
    </FormItem>
    <FormItem prop="password">
        <Input style="height:50px;line-height:50px" type="password" v-model="form.password" size="large" placeholder="请输入登录密码" password autocomplete="off">
        <Icon class="iconfont icon-mima1" slot="prefix" style="line-height:50px" />
        </Input>
    </FormItem>
    <FormItem prop="imgCode">
        <Row type="flex" justify="space-between" style="align-items: center;overflow: hidden;">
            <Input v-model="form.imgCode" size="large" clearable placeholder="请输入验证码" :maxlength="10" class="input-verify" />
            <div class="code-image" style="position:relative;font-size:12px;">
                <Spin v-if="loadingCaptcha" fix></Spin>
                <img :src="captchaImg" @click="getCaptchaImg" alt="验证码加载失败" style="width:110px;cursor:pointer;display:block" />
            </div>
        </Row>
    </FormItem>
</Form>

在这里插入图片描述

在这里插入图片描述

3.2 快递类型

在这里插入图片描述

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询快递包装类型")
public Result<IPage<PackageType>> getByPage(@ModelAttribute PackageType packageType ,@ModelAttribute PageVo page){
    QueryWrapper<PackageType> qw = new QueryWrapper<>();
    if(!ZwzNullUtils.isNull(packageType.getTitle())) {
        qw.like("title",packageType.getTitle());
    }
    if(!ZwzNullUtils.isNull(packageType.getStatus())) {
        qw.eq("status",packageType.getStatus());
    }
    IPage<PackageType> data = iPackageTypeService.page(PageUtil.initMpPage(page),qw);
    return new ResultUtil<IPage<PackageType>>().setData(data);
}

在这里插入图片描述

@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增快递包装类型")
public Result<PackageType> insert(PackageType packageType){
    if(Objects.equals(0,packageType.getSortOrder().compareTo(BigDecimal.ZERO))) {
        packageType.setSortOrder(BigDecimal.valueOf(iPackageTypeService.count() + 1L));
    }
    iPackageTypeService.saveOrUpdate(packageType);
    return new ResultUtil<PackageType>().setData(packageType);
}

3.3 快递区域

在这里插入图片描述

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询快递区域")
public Result<IPage<ExpressArea>> getByPage(@ModelAttribute ExpressArea expressArea ,@ModelAttribute PageVo page){
    QueryWrapper<ExpressArea> qw = new QueryWrapper<>();
    if(!ZwzNullUtils.isNull(expressArea.getTitle())) {
        qw.like("title",expressArea.getTitle());
    }
    if(!ZwzNullUtils.isNull(expressArea.getStatus())) {
        qw.like("status",expressArea.getStatus());
    }
    IPage<ExpressArea> data = iExpressAreaService.page(PageUtil.initMpPage(page),qw);
    return new ResultUtil<IPage<ExpressArea>>().setData(data);
}

在这里插入图片描述

@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增快递区域")
public Result<ExpressArea> insert(ExpressArea expressArea){
    if(Objects.equals(0,expressArea.getSortOrder().compareTo(BigDecimal.ZERO))) {
        expressArea.setSortOrder(BigDecimal.valueOf(iExpressAreaService.count() + 1L));
    }
    iExpressAreaService.saveOrUpdate(expressArea);
    return new ResultUtil<ExpressArea>().setData(expressArea);
}

3.4 快递货架

在这里插入图片描述

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询快递货架")
public Result<IPage<ExpressShelf>> getByPage(@ModelAttribute ExpressShelf expressShelf ,@ModelAttribute PageVo page){
    QueryWrapper<ExpressShelf> qw = new QueryWrapper<>();
    if(!ZwzNullUtils.isNull(expressShelf.getAreaId())) {
        qw.eq("area_id",expressShelf.getAreaId());
    }
    if(!ZwzNullUtils.isNull(expressShelf.getTitle())) {
        qw.like("title",expressShelf.getTitle());
    }
    if(!ZwzNullUtils.isNull(expressShelf.getStatus())) {
        qw.eq("status",expressShelf.getStatus());
    }
    IPage<ExpressShelf> data = iExpressShelfService.page(PageUtil.initMpPage(page),qw);
    return new ResultUtil<IPage<ExpressShelf>>().setData(data);
}

在这里插入图片描述

@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增快递货架")
public Result<ExpressShelf> insert(ExpressShelf expressShelf){
    if(Objects.equals(0,expressShelf.getSortOrder().compareTo(BigDecimal.ZERO))) {
        expressShelf.setSortOrder(BigDecimal.valueOf(iExpressAreaService.count() + 1L));
    }
    ExpressArea area = iExpressAreaService.getById(expressShelf.getAreaId());
    if(area == null) {
        return ResultUtil.error("区域不存在");
    }
    expressShelf.setAreaName(area.getTitle());
    iExpressShelfService.saveOrUpdate(expressShelf);
    return new ResultUtil<ExpressShelf>().setData(expressShelf);
}

3.5 快递档案

在这里插入图片描述

@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
@ApiOperation(value = "查询快递")
public Result<IPage<Express>> getByPage(@ModelAttribute Express express ,@ModelAttribute PageVo page){
    QueryWrapper<Express> qw = new QueryWrapper<>();
    User currUser = securityUtil.getCurrUser();
    QueryWrapper<User> userQw = new QueryWrapper<>();
    userQw.eq("id",currUser.getId());
    userQw.inSql("id","SELECT user_id FROM a_user_role WHERE del_flag = 0 AND (role_id = '496138616573952' OR role_id = '1635124217320181760')");
    if(iUserService.count(userQw) < 1L) {
        userQw.and(wrapper -> wrapper.eq("send_mobile", currUser.getMobile()).or().eq("receiving_mobile",currUser.getMobile()));
    }
    if(!ZwzNullUtils.isNull(express.getShelfId())) {
        qw.eq("shelf_id",express.getShelfId());
    }
    if(!ZwzNullUtils.isNull(express.getAreaId())) {
        qw.eq("area_id",express.getAreaId());
    }
    if(!ZwzNullUtils.isNull(express.getReceivingUser())) {
        qw.like("receiving_user",express.getReceivingUser());
    }
    if(!ZwzNullUtils.isNull(express.getSendUser())) {
        qw.like("send_user",express.getSendUser());
    }
    IPage<Express> data = iExpressService.page(PageUtil.initMpPage(page),qw);
    return new ResultUtil<IPage<Express>>().setData(data);
}

在这里插入图片描述

@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增快递")
public Result<Express> insert(Express express){
    ExpressShelf shelf = iExpressShelfService.getById(express.getShelfId());
    if(shelf == null) {
        return ResultUtil.error("货架不存在");
    }
    express.setShelfName(shelf.getTitle());
    express.setAreaId(shelf.getAreaId());
    express.setAreaName(shelf.getAreaName());
    iExpressService.saveOrUpdate(express);
    return new ResultUtil<Express>().setData(express);
}

3.6 系统基础模块

用户管理模块如下图所示。

在这里插入图片描述
文件管理模块如下图所示。

在这里插入图片描述
日志管理模块如下图所示。

在这里插入图片描述
个人中心模块如下图所示。

在这里插入图片描述


四、免责说明

  • 本项目仅供个人学习使用,商用授权请联系博主,否则后果自负。
  • 博主拥有本软件构建后的应用系统全部内容所有权及独立的知识产权,拥有最终解释权。
  • 如有问题,欢迎在仓库 Issue 留言,看到后会第一时间回复,相关意见会酌情考虑,但没有一定被采纳的承诺或保证。

下载本系统代码或使用本系统的用户,必须同意以下内容,否则请勿下载!

  1. 出于自愿而使用/开发本软件,了解使用本软件的风险,且同意自己承担使用本软件的风险。
  2. 利用本软件构建的网站的任何信息内容以及导致的任何版权纠纷和法律争议及后果和博主无关,博主对此不承担任何责任。
  3. 在任何情况下,对于因使用或无法使用本软件而导致的任何难以合理预估的损失(包括但不仅限于商业利润损失、业务中断与业务信息丢失),博主概不承担任何责任。
  4. 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flink ML 的新特性解析与应用

摘要&#xff1a;本文整理自阿里巴巴算法专家赵伟波&#xff0c;在 Flink Forward Asia 2023 AI特征工程专场的分享。本篇内容主要分为以下四部分&#xff1a; Flink ML 概况在线学习的设计与应用在线推理的设计与应用特征工程算法与应用 一、Flink ML 概况 Flink ML 是 Apache…

MySQL运维实战(7.2) MySQL复制server_id相关问题

作者&#xff1a;俊达 主库server_id没有设置 主库没有设置server_id Got fatal error 1236 from master when reading data from binary log: Misconfigured master - server_id was not set主库查看server_id mysql> show variables like server_id; ----------------…

Spring Boot 笔记 029 用户模块

1.1 用户信息需要在多个链接使用&#xff0c;所以需要用pinia持久化 1.1.1 定义store import {defineStore} from pinia import {ref} from vue const useUserInfoStore defineStore(userInfo,()>{//定义状态相关的内容const info ref({})const setInfo (newInfo)>{i…

基于ElementUI封装省市区四级联动下拉选择

基于ElementUI封装的省市区下拉级联选择 效果 数据 最新省市区JSON数据获取&#xff1a;https://xiangyuecn.github.io/AreaCity-JsSpider-StatsGov/ 参数说明 参数说明inputNumShow下拉框的数量&#xff0c;最多4个defaultAddress默认显示省市区 例&#xff1a;[‘安徽’, …

C语言:指针的进阶讲解

目录 1. 二级指针 1.1 二级指针是什么&#xff1f; 1.2 二级指针的作用 2. 一维数组和二维数组的本质 3. 指针数组 4. 数组指针 5. 函数指针 6. typedef的使用 7. 函数指针数组 7.1 转移表 1. 二级指针 如果了解了一级指针&#xff0c;那二级指针也是可以很好的理解…

Redis(十六)缓存预热+缓存雪崩+缓存击穿+缓存穿透

文章目录 面试题缓存预热缓存雪崩解决方案 缓存穿透解决方案 缓存击穿解决方案案例&#xff1a;高并发聚划算业务 总结表格 面试题 缓存预热、雪崩、穿透、击穿分别是什么?你遇到过那几个情况?缓存预热你是怎么做的?如何避免或者减少缓存雪崩?穿透和击穿有什么区别?他两是…

JDK下载安装

资源展示 安装说明 傻瓜式安装&#xff0c;下一步即可。建议&#xff1a;安装路径不要有中文或者空格等特殊符号。本套课程会同时安装JDK8 和 JDK17&#xff0c;并以JDK17为默认版本进行讲解。 安装步骤 &#xff08;1&#xff09;双击jdk-17_windows-x64_bin.exe文件&#…

免费多域名证书,最多支持保护250个域名

随着企业规模扩大和多元化发展&#xff0c;拥有多个域名的需求变得普遍&#xff0c;此时&#xff0c;多域名SSL证书应运而生&#xff0c;并且这一类型的证书已经发展到能够安全地支持多达250个不同域名的加密需求。 多域名SSL证书&#xff0c;也称为SAN&#xff08;Subject Alt…

RocketMQ生产环境常见问题分析与总结

RocketMQ生产环境常见问题分析与总结 如何保证消息不丢失 消息丢失场景 对于跨网络的节点可能会丢消息&#xff0c;因为MQ存盘都会先写入OS的PageCache中&#xff0c;然后再让OS进行异步刷盘&#xff0c;如果缓存中的数据未及时写入硬盘就会导致消息丢失 生产端到Broker端Brok…

Mybatis总结--传参二

#叫做占位符 Mybatis是封装的JDBC 增强版 内部还是用的jdbc 每遇到一个#号 这里就会变为&#xff1f;占位符 一个#{}就是对应一个问号 一个占位符 用这个对象执行sql语句没有sql注入的风险 八、多个参数-使用Param 当 Dao 接口方法有多个参数&#xff0c;需要通过名称使…

获取图片的颜色的RGB

shiftwins获取截图 然后打开画图软件&#xff0c;ctrlv 然后用吸管工具&#xff0c;吸取 然后编辑颜色&#xff0c;就有

【群智能算法转让】一种新的群智能算法||一种超越隐喻的元启发算法||一种基于数学的群智能算法

1、简介 本次全新出推出一个新的基于种群的元启发算法&#xff0c;基于数学中求解非线性方程组的基本思想而开发的&#xff0c;性能不错 新算法转让Q1 top级&#xff08;一种基于数学的超越隐喻的元启发式算法&#xff09; 新的群智能算法转让&#xff0c;新的元启发式算法转…

NATS学习笔记(一)

NATS是什么&#xff1f; NATS是一个开源的、轻量级、高性能的消息传递系统&#xff0c;它基于发布/订阅模式&#xff0c;由Apcera公司开发和维护。 NATS的功能 发布/订阅&#xff1a;NATS的核心是一个发布/订阅消息传递系统&#xff0c;允许消息生产者发布消息到特定的主题…

RAG中如何解决上下文知识连贯性问题 || 如何更好的切分和组织非结构化的文档数据

当信息蕴含在较长的上下文时&#xff0c;基于片段的搜索召回&#xff0c;一定会丢失数据&#xff0c;导致最终无法正确的回答问题。 实际上复杂的问题&#xff0c;这里只是说问题本身倾向于从全文获取答案&#xff0c;而不仅仅是基于片段。 斯坦福论文提出的核心问题和解决思路…

抖店创业者必看!2024年开店营业执照的类型有哪些?开哪个类型?

大家好&#xff0c;我是电商花花。 最近还是有不少人问花花做抖音小店要营业执照吗&#xff1f;个人店可以吗&#xff1f; 目前开抖音小店主要有个人店、个体工商户、企业店这三种店铺类型。 今天来给大家说一下做抖音小店都有什么类型&#xff0c;以及都有什么区别&#xf…

MacOs 围炉夜话

文章目录 一、安装 Mac 一、安装 Mac macOS是一套由苹果开发的运行于Macintosh系列电脑上的操作系统。macOS是首个在商用领域成功的图形用户界面操作系统。 VM虚拟机怎么安装mac os&#xff1f;&#xff08;全教程&#xff09; 虚拟机&#xff1a;VMware Workstation 17 pro W…

企业微信应用开发:使用Cpolar域名配置进行本地接口回调的调试指南

文章目录 1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 企业微信开发者在应用的开发测试阶段&#xff0c;应用服务通常是部署在开发环境&#xff0c;在有数据回调的开发场…

【蓝桥备赛】字串简写

字串简写 数据范围 字符串的长度为5*10的五次方&#xff0c;on方时间复杂度会很大。 才用动态规划的思想&#xff0c;dp[i]以i开头的的可能性&#xff0c;因为长度必须大于等于k&#xff0c;当i小于k的时候&#xff0c;如果等于第一个字符&#xff0c;s1时&#xff0c;dp[…

图像压缩感知的MATLAB实现(OMP)

前面实现了 压缩感知的图像仿真&#xff08;MATLAB源代码&#xff09; 效果还不错&#xff0c;缺点是速度慢如牛。 下面我们采用OMP对其进行优化&#xff0c;提升速度。具体代码如下&#xff1a; 仿真 构建了一个MATLAB文件&#xff0c;所有代码都在一个源文件里面&#xf…

系统保护规则(Sentinel)

系统保护规则 CPU使用率 设置 为了方便产生现象&#xff0c; 设置了使用率朝贡国10% 就触发保护 效果 入口QPS 设置 针对 所有接口的平均 QPS 阈值 效果 访问次数很多的情况下&#xff0c;即可出现
最新文章