快递驿站取件管理系统|基于SpringBoot的快递栈系统设计与实现(二)

简介: 快递驿站取件管理系统|基于SpringBoot的快递栈系统设计与实现

快递驿站取件管理系统|基于SpringBoot的快递栈系统设计与实现(一)https://developer.aliyun.com/article/1423328


扫描取货:快递员扫描客户展示的收货二维码,得到用户取件码输入后进行确认取货

查询客户取件记录

四,核心代码展示

package com.qst.express.controller;
import com.qst.commonUtils.result.R;
import com.qst.commonUtils.user.IpAddrUtils;
import com.qst.express.service.EadminService;
import com.qst.express.utils.UserUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author znz
 * @since 2022-09-25
 */
@Api(description = "管理员模块")
@RestController
@RequestMapping("/express/eadmin")
@CrossOrigin
public class EadminController {
    @Autowired
    private EadminService eadminService;
    @ApiOperation(value = "登录")
    @PostMapping("/login")
    public R login(@RequestBody(required = false) HashMap<String,String>  admin, HttpServletRequest request) {
        String username = admin.get("username");
        String password = admin.get("password");
        System.out.println(username + " ," + password);
        boolean result = eadminService.login(username,password);
        if (result) {
            // 登录成功后操作
            // 1.更新登录时间的 和 ip 的更新
//            String ipAddr = IpAddrUtils.getIpAddr(request);
//            eadminService.updateLogin(username,ipAddr);
            //2. 存管理员手机号到session
            String adminPhone = eadminService.getAdminPhone(username);
            System.out.println("存入时管理员手机:"+adminPhone);
            UserUtil.setAdminPhone(request.getSession(),adminPhone);
            String adminPhone2 = UserUtil.getAdminPhone(request.getSession());
            System.out.println("管理员手机号:"+adminPhone2);
            //存管理员名字到session
            request.getSession().setAttribute("adminName",username);
            return R.ok().data("token","admin");
        }else {
            return R.error().message("登录失败");
        }
    }
    @ApiOperation(value = "登录信息")
    @RequestMapping("/info")
    public R info() {
        HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
        return R.ok().data("roles", "[admin]").data("name", "admin").data("avatar", "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
    }
    //登出
    @ApiOperation("登出操作")
    @PostMapping("/logout")
    public R logout(){
        return R.ok();
    }
}
package com.qst.express.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qst.commonUtils.express.RandomUtil;
import com.qst.commonUtils.result.R;
import com.qst.express.entity.Express;
import com.qst.express.entity.User;
import com.qst.express.entity.vo.ExpressVo;
import com.qst.express.service.ExpressService;
import com.qst.express.utils.AddressUtil;
import com.qst.express.utils.SMSUtil;
import com.qst.express.utils.UserUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author znz
 * @since 2022-09-25
 */
@Api(description = "快件管理")
@RestController
@RequestMapping("/e/express")
@CrossOrigin
public class ExpressController {
    @Autowired
    ExpressService expressService;
    /**
     * TODO 条件查询带分页
     * @param page
     * @param limit
     * @return
     */
    @ApiOperation(value = "快递分页查询")
    @PostMapping("/pageTeacherCondition/{page}/{limit}")
    public R pageTeacherCondition(@PathVariable("page") Integer page,
                                  @PathVariable("limit") Integer limit,
                                  @RequestBody(required = false) ExpressVo expressVo,HttpServletRequest request) {
        String adminPhone = UserUtil.getAdminPhone(request.getSession());
        System.out.println("管理员手机号:"+adminPhone);
        System.out.println("管理员名字:"+request.getSession().getAttribute("adminName"));
        // 获取用户手机号码
//        User wxUser = UserUtil.getWxUser(request.getSession());
//        String userphone = wxUser.getUphone();
//        System.out.println("wx管理员手机号:"+userphone);
        Page<Express> expressVoPage = new Page<>(page, limit);
        IPage<Express> teacherIPage = expressService.pageTeacherCondition(expressVoPage, expressVo);
        return R.ok().data("total", teacherIPage.getTotal()).data("rows", teacherIPage.getRecords());
    }
    /**
     * 用于查询数据库中的全部快递(总数+新增),待取件快递(总数+新增)
     * @return [{size:总数,day:新增},{size:待取件数,day:今日新增}]
     */
    @ApiOperation(value = "快递控制台数据")
    @GetMapping("/console")
    public R console() {
        List<Map<String, Integer>> data = expressService.console();
        return R.ok().data("expressTotal", data);
    }
    /**
     * 按月查询
     * @return
     */
    @ApiOperation(value = "按月查询")
    @GetMapping("/console-column")
    public R consoleColumn() {
        List<Map<String, Integer>> data = expressService.consoleMonth();
        return R.ok().data("expressMonth", data);
    }
    /**
     * 添加快递
     * @param express
     * @return
     */
    @ApiOperation(value = "添加快递")
    @PostMapping("/addExpress")
    public R addExpress(@RequestBody(required = false) Express express, HttpServletRequest request) {
        System.out.println(express);
        // 获取管理或快递员的手机号码
        String adminPhone = UserUtil.getAdminPhone(request.getSession());
        express.setSysphone(adminPhone);
        System.out.println(adminPhone);
        System.out.println(request.getSession().getAttribute("adminName"));
        // 生成取件码
        String code = RandomUtil.getCode();
        express.setCode(code);
        express.setIntime(new Date());
        boolean save = expressService.save(express);
        if (save) {
            String address = AddressUtil.getAddress();
            SMSUtil.send(express.getUserphone(),code,address,adminPhone);
            return R.ok();
        }else {
            return R.error();
        }
    }
    /**
     * 删除快递
     * @param expressId
     * @return
     */
    @ApiOperation(value = "删除快递")
    @DeleteMapping("/deleteExpressId/{id}")
    public R removeExpressId(@PathVariable(value = "id") String expressId){
        boolean remove = expressService.removeById(Integer.parseInt(expressId));
        if (remove) {
            return R.ok();
        }else {
            return R.error();
        }
    }
    /**
     * 批量删除快递
     * @param ids
     * @return
     */
    @ApiOperation(value = "批量删除快递")
    @PostMapping("/deletes")
    public R deltes(@RequestBody(required = false) Integer[] ids) {
        System.out.println(ids);
        boolean remove = false;
        for (Integer id : ids) {
            remove = expressService.removeById(id);
        }
        if (remove) {
            return R.ok();
        } else {
            return R.error();
        }
    }
    /**
     * 查询快递信息同id
     * @param expressId
     * @return
     */
    @ApiOperation(value = "查询快递信息同id")
    @GetMapping("/getExpressInfo/{id}")
    public R findExpressInfoById(@PathVariable(value = "id") String expressId){
        Express express = expressService.getById(expressId);
        if (express != null) {
            return R.ok().data("express",express);
        }else {
            return R.error();
        }
    }
    /**
     * 更新快递信息
     * @param express
     * @return
     */
    @ApiOperation(value = "更新快递信息")
    @PutMapping("/updateExpressInfo")
    public R updateExpressInfo(@RequestBody(required = false) Express express){
        boolean update = expressService.updateById(express);
        if (update) {
            return R.ok();
        }else {
            return R.error();
        }
    }
}
package com.qst.express.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qst.commonUtils.result.R;
import com.qst.commonUtils.user.UserUtil;
import com.qst.express.entity.Courier;
import com.qst.express.entity.Express;
import com.qst.express.entity.User;
import com.qst.express.entity.vo.ExpressVo;
import com.qst.express.entity.vo.UserVo;
import com.qst.express.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @authorznz
 * @since 2022-09-25
 */
@Api(description = "用户管理")
@RestController
@RequestMapping("/e/user")
@CrossOrigin
public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping("/console")
    public R console(HttpServletRequest request, HttpServletResponse response){
        List<Map<String, Integer>> data = userService.console();
        return R.ok().data("userConsole", data);
    }
    /**
     * TODO 条件查询带分页
     * @param page
     * @param limit
     * @return
     */
    @ApiOperation(value = "用户分页查询")
    @PostMapping("/pageUserCondition/{page}/{limit}")
    public R pageUserCondition(@PathVariable("page") Integer page,
                                  @PathVariable("limit") Integer limit,
                                  @RequestBody(required = false) UserVo userVo) {
        Page<User> userPage = new Page<>(page, limit);
        IPage<User> teacherIPage = userService.pageTeacherCondition(userPage, userVo);
        return R.ok().data("total", teacherIPage.getTotal()).data("rows", teacherIPage.getRecords());
    }
    /**
     * 添加快递员
     *
     * @return
     */
    @ApiOperation(value = "添加用户")
    @PostMapping("/addUser")
    public R addUser(@RequestBody(required = false) User user) {
        user.setCreatetime(new Date());
        boolean save = userService.save(user);
        if (save) {
            return R.ok();
        } else {
            return R.error();
        }
    }
    /**
     * 删除快递员
     * @param userId
     * @return
     */
    @ApiOperation(value = "删除用户")
    @DeleteMapping("/removeUser/{id}")
    public R removeUser(@PathVariable(value = "id") String userId) {
        boolean remove = userService.removeById(Integer.parseInt(userId));
        if (remove) {
            return R.ok();
        } else {
            return R.error();
        }
    }
    /**
     * 批量删除用户
     * @param ids
     * @return
     */
    @ApiOperation(value = "批量删除用户")
    @PostMapping("/deletes")
    public R deltes(@RequestBody(required = false) Integer[] ids) {
        System.out.println(ids);
        boolean remove = false;
        for (Integer id : ids) {
            remove = userService.removeById(id);
        }
        if (remove) {
            return R.ok();
        } else {
            return R.error();
        }
    }
    /**
     * 通过id查询快递员信息
     * @param userId
     * @return
     */
    @ApiOperation(value = "通过id查询用户信息")
    @GetMapping("/findUserById/{id}")
    public R findUserById(@PathVariable(value = "id") String userId) {
        User user = userService.getById(userId);
        if (user != null) {
            return R.ok().data("user", user);
        } else {
            return R.error();
        }
    }
    /**
     * 更新快递员信息
     * @param user
     * @return
     */
    @ApiOperation(value = "更新用户信息")
    @PutMapping("/updateUserById")
    public R updateCourierById(@RequestBody(required = false) User user){
        boolean update = userService.updateById(user);
        if (update) {
            return R.ok();
        } else {
            return R.error();
        }
    }
}

五,项目总结

项目的目标将本系统初步分为两个部分,面向用户和快递员的前台系统,面向管理的后台管理系统。前台系统为快递员提供了快件查询、快件入库、快件出库、快递签收、个人中心的服务,为用户提供了单号查询快件、个人中心、懒人排行榜的服务;后台系统为管理员提供了快递员信息管理、快件信息管理、用户信息管理、控制台可视化分析服务,分为以下几个功能模块:

(1)快递信息管理功能模块:管理员可以对快递的增加入库、删除出库、修改快件信息、查询快件信息进行管理。

(2)快递员信息管理功能模块:管理员通过后台系统可以录入快递员信息,从而赋予快递一些特权,管理用户快件的入库和出库、对快递员信息的修改、快递员的删除、快递员信息的查询。

(3)用户信息管理功能模块:管理员可以在后台增加新用户、修改用户信息、查询用户信息、注销用户信息的操作。

(4)控制台可视化功能模块:管理员可以在后台系统查看全国快件分布情况、用户注册总人数、快递栈库存快件总数、快递待取件数、快递日入库数量的信息。

(5)登录注册功能模块:使用短信注册技术进行注册登录,如果是第一次使用则为注册,反之登录,同时系统会通过手机号码进行判断该用户是为快递员还是用户,从而让不同角色用户进入前台系统能够使用的功能模块不一样。

(6)个人中心功能模块:因为使用的是手机短信登录注册,所以当用户登陆系统后需要在个人中心进行实名认证,修改个人信息。

(7)快递单号搜索查询功能模块:在前台系统,不同角色用户都可以通过该功能使用快递单号进行快递详细的查询。

(8)录入快递功能模块:快递员可以在前台系统将快递信息进行入库操作。

(9)取件出库功能模块:快递可以通过取件码或者通过微信对用户的取件码进行扫码出库。

(10)快递懒人排行榜功能模块:在前台系统中将所以用户的快递信息进行总排名、年排名、月排名的信息展示。

相关文章
|
1月前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
160 1
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
存储 安全 Java
打造智能合同管理系统:SpringBoot与电子签章的完美融合
【10月更文挑战第7天】 在数字化转型的浪潮中,电子合同管理系统因其高效、环保和安全的特点,正逐渐成为企业合同管理的新宠。本文将分享如何利用SpringBoot框架实现一个集电子文件签字与合同管理于一体的智能系统,探索技术如何助力合同管理的现代化。
106 4
|
2月前
|
前端开发 Java Apache
SpringBoot实现电子文件签字+合同系统!
【10月更文挑战第15天】 在现代企业运营中,合同管理和电子文件签字成为了日常活动中不可或缺的一部分。随着技术的发展,电子合同系统因其高效性、安全性和环保性,逐渐取代了传统的纸质合同。本文将详细介绍如何使用SpringBoot框架实现一个电子文件签字和合同管理系统。
99 1
|
2月前
|
文字识别 安全 Java
SpringBoot3.x和OCR构建车牌识别系统
本文介绍了一个基于Java SpringBoot3.x框架的车牌识别系统,详细阐述了系统的设计目标、需求分析及其实现过程。利用Tesseract OCR库和OpenCV库,实现了车牌图片的识别与处理,确保系统的高准确性和稳定性。文中还提供了具体的代码示例,展示了如何构建和优化车牌识别服务,以及如何处理特殊和异常车牌。通过实际应用案例,帮助读者理解和应用这一解决方案。
|
3月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
236 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
3月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
183 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统
|
1月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
43 0
|
2月前
|
机器学习/深度学习 移动开发 自然语言处理
基于人工智能技术的智能导诊系统源码,SpringBoot作为后端服务的框架,提供快速开发,自动配置和生产级特性
当身体不适却不知该挂哪个科室时,智能导诊系统应运而生。患者只需选择不适部位和症状,系统即可迅速推荐正确科室,避免排错队浪费时间。该系统基于SpringBoot、Redis、MyBatis Plus等技术架构,支持多渠道接入,具备自然语言理解和多输入方式,确保高效精准的导诊体验。无论是线上医疗平台还是大型医院,智能导诊系统均能有效优化就诊流程。
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
174 1