基于java的快递管理系统的设计与实现

本文介绍了开发的高校快递管理系统,包括数据中心、快递类型、区域、货架和档案模块,采用JAVA、Vue和SpringBoot技术,MySQL数据库支持,实现用户权限管理与高并发访问,确保系统安全。详细描述了各模块功能和接口实现。
摘要由CSDN通过智能技术生成

在这里插入图片描述


一、摘要

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. 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。

在这里插入图片描述

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
学生实训任务单 5-2 【作业 5-4】 物流快递系统程序设计 当人们在购物网站下单后, 订单中的货物就会通过快递送达客户手中,分析快递 系统完成的任务,包含这样几个实体:交通工具、快递任务、货物定位。下面依 次设计相关类和接口,实现:输出送货前、送货、送货后的交通工具、送货人、 快递单号、定位地址等信息。 1. 在物流快递系统中,首先需要定义运输货物的交通工具类 Transportation.java。 (1)由于交通工具可能有很多种,所以,将交通工具类定义为一个抽象类。 (2)Transportation.java 类中需要定义 交通工具编号 number、类型 model、运货负责人 admin 三个成员变量,用于存储交通工具的编号、类型和 负责人信息。 (3)定义交通工具抽象类的无参构造和给 3 个成员变量初始化的构造方法。 (4)创建 3 个成员变量的 get/set 方法。 (5)定义一个抽象的运输方法 tarnsport()。 2. 交通工具需要进行保养,定义一个交通工具保养接口 Careable.java,该 接口中包含车辆保养的方法 upKeep()。 (提示:接口中的方法原则上默认为抽 象方法)。 3. 定义一个专用运输车类 Ztransportatin.java。 (1)专用运输车类 Ztransportatin.java,继承交通工具类,并实现保养 接口。 (2)定义专用运输车辆类的无参构造和 3 个参数的构造(这里 3 个参数,是从 父类继承的)。 (3)实现父类的抽象方法 transport(),输出"运输进行中…"语句。 (4) 实现接口Careable.java的抽象方法upKeep(), 输出 "车辆保养完毕! " 信息。 4. 在货物运输中,需要对运输车辆定位,以便随时跟随货物的位置信息。定位 功能可以使用 GPS,而考虑到能够实现定位功能的设备可能有很多,例如手机, 定位仪等,可以定义 GPS 接口,以及实现了该接口的仪器类。 (1) 定义 GPS 接口, 该接口中仅仅包含一个显示定位坐标的方法 showPoint()。 (提示:接口中的方法都是抽象方法)。 5. 定义 GPS 接口实现类 Phone.java,拥有定位功能。 (1)定义 Phone.java 类的无参构造。 (2) 重写定位方法 showPoint(), 返回定位坐标字符串, 例如: "123,456" . 6. 物流快递系统中,快递是一个实体,因此,需要定义快递任务类,包含快递 单号和货物重量的属性,以及货物发送前、发送途中和送到后的方法。 (1)定义快递任务类 SendTask.java,包含快递单号 number、货物重量 goodsWeight 三个成员变量。 (2)定义无参构造和给 2 个成员变量初始化的构造方法。 (3)货物在运输前、运输时和运输后,都需要检查和记录,因此,需要定义 3 个方法。 送货前的准备方法: sendBefore(), 无参, 输出文字信息, 以及货物重量、 快递单号等信息。输出如下图所示。 发送货物方法:send(),2 个参数,抽象类 Transportation 变量,接 口 GPS 变量,分别接收交通工具对象和定位坐标;实现输出运货人、交通工 具编号、交通工具类型信息。输出效果如下图所示。 送货后操作方法:sendAfter(),1 个参数,以抽象类 Transportation 变量为参数,接收交通工具对象。输出效果如下图所示。 7. 定义测试类,实例化对象并传入数据,测试运行结果。 (1)创建快递任务类对象,并初始化。 (2)通过快递任务类变量,访问 sendBefore()方法,输出快递送货前准备工 作。 (3)创建专用交通工具类对象,并初始化为: "Z205" "大卡车" "秦承斌"。 (4)创建手机类对象。 (5) 通过快递任务类变量, 访问 send ()方法, 以创建的专用交通工具类对象、 手机类对象为实参,输出快递送货信息。 (6)通过快递任务类变量,访问 sendAfter()方法,输出送货后信息。 输出总效果如下图所示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡晗靓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值