快递驿站取件管理系统|基于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)快递懒人排行榜功能模块:在前台系统中将所以用户的快递信息进行总排名、年排名、月排名的信息展示。