文章目录
- 一、项目演示
- 二、项目介绍
- 三、运行截图
- 四、主要代码
- 1.查询运费金额代码
- 2.寄快递提交订单代码
- 3.签到获取积分代码
一、项目演示
项目演示地址:视频地址
二、项目介绍
项目描述:这是一个基于SpringBoot+uniApp框架开发的物流快递寄件小程序系统。首先,这是一个前后端分离的项目,前端分为用户端和管理端,用户端使用微信小程序(uniApp开发),管理端使用Web页面(Vue开发)。然后这项目代码简洁规范,注释说明详细,易于理解和学习。其次,这项目功能丰富,具有一个物流快递寄件小程序系统该有的所有功能。
项目功能:此项目分为三个角色:普通用户、配送员和管理员。普通用户有登录注册、查运费、寄快递、查询订单详情、签到、兑换优惠券、管理个人地址、管理个人信息、查看个人优惠券信息、管理自己的意见反馈信息、查看公告和轮播图信息等等功能。配送员除了拥有普通用户的所有功能之外,还拥有记录自己配送订单的详情信息。管理员有登录、查看数据统计信息、管理所有用户信息、管理所有轮播图信息、管理所有公告信息、管理所有优惠券信息、管理所有收费规则信息、管理所有订单信息和管理所有意见反馈信息等等功能。
应用技术:SpringBoot + uniApp + Vue3 + MySQL + MyBatis + Redis + ElementUI-Plus + uni-ui + Vite + TypeScript + 百度地图
运行环境:IntelliJ IDEA2019.3.5 + MySQL5.7(项目压缩包中自带) + Redis5.0.5(项目压缩包中自带) + JDK1.8 + Maven3.6.3(项目压缩包中自带)+ Node16.20.2(项目压缩包中自带)+ 微信开发者工具(项目压缩包中自带)+ Visual Studio Code(项目压缩包中自带)
三、运行截图
四、主要代码
1.查询运费金额代码
/*** 查询运费金额* @param feeCalcDTO* @return*/@Overridepublic ResponseDTO<BigDecimal> calcSendFee(FeeCalcDTO feeCalcDTO) {// 收费规则类型int ruleType = 0;// 取出寄件地址AddressDTO sendAddressDTO = feeCalcDTO.getSendAddressDTO();// 取出收件地址AddressDTO receiveAddressDTO = feeCalcDTO.getReceiveAddressDTO();// 判断是否是同城、省内、省外if(sendAddressDTO.getCity().equals(receiveAddressDTO.getCity())) {ruleType = RuleTypeEnum.CITY.getCode();} else if (sendAddressDTO.getProvince().equals(receiveAddressDTO.getProvince())) {ruleType = RuleTypeEnum.INSIDE.getCode();} else if (!sendAddressDTO.getProvince().equals(receiveAddressDTO.getProvince())) {ruleType = RuleTypeEnum.OUTSIDE.getCode();}// 查出符合的收费规则数据RuleExample ruleExample = new RuleExample();int finalRuleType = ruleType;List<Rule> ruleList = ruleMapper.selectByExample(ruleExample).stream().filter(e -> e.getType() == finalRuleType).collect(Collectors.toList());if(ruleList.size() == 0) {return ResponseDTO.errorByMsg(CodeMsg.DATA_ERROR);}Rule rule = ruleList.get(0);BigDecimal totalPrice = rule.getBasePrice().add(new BigDecimal(feeCalcDTO.getWeight() - 1).multiply(rule.getNextPrice()));return ResponseDTO.success(totalPrice);}
2.寄快递提交订单代码
/*** 提交订单操作* @param orderDTO* @return*/@Overridepublic ResponseDTO<Boolean> submitOrder(OrderDTO orderDTO) {// 进行统一表单验证CodeMsg validate = ValidateEntityUtil.validate(orderDTO);if (!validate.getCode().equals(CodeMsg.SUCCESS.getCode())) {return ResponseDTO.errorByMsg(validate);}if(CommonUtil.isEmpty(orderDTO.getUserId())) {return ResponseDTO.errorByMsg(CodeMsg.DATA_ERROR);}User user = userMapper.selectByPrimaryKey(orderDTO.getUserId());if(user == null) {return ResponseDTO.errorByMsg(CodeMsg.USER_NOT_EXIST);}Order order = CopyUtil.copy(orderDTO, Order.class);// 封装地址信息 计算价格// 寄件地址AddressDTO sendAddressDTO = new AddressDTO();sendAddressDTO.setCity(order.getSendCity());sendAddressDTO.setProvince(order.getSendProvince());// 收件地址AddressDTO receiveAddressDTO = new AddressDTO();receiveAddressDTO.setCity(order.getReceiveCity());receiveAddressDTO.setProvince(order.getReceiveProvince());FeeCalcDTO feeCalcDTO = new FeeCalcDTO();feeCalcDTO.setSendAddressDTO(sendAddressDTO);feeCalcDTO.setReceiveAddressDTO(receiveAddressDTO);feeCalcDTO.setWeight(order.getWeight());// 计算费用ResponseDTO<BigDecimal> calcSendFeeResp = ruleService.calcSendFee(feeCalcDTO);if (!calcSendFeeResp.getCode().equals(CodeMsg.SUCCESS.getCode())) {return ResponseDTO.errorByMsg(CodeMsg.RULE_CALC_ERROR);}order.setPrice(calcSendFeeResp.getData());// 判断是否使用优惠券if(!CommonUtil.isEmpty(orderDTO.getCouponItemId())) {CouponItem couponItem = couponItemMapper.selectByPrimaryKey(orderDTO.getCouponItemId());if(!CouponStateEnum.WAIT.getCode().equals(couponItem.getState()) || couponItem.getCouponTime().getTime() < new Date().getTime()) {return ResponseDTO.errorByMsg(CodeMsg.COUPON_STATE_ERROR);}if(order.getPrice().compareTo(couponItem.getCouponPrice()) > -1) {order.setPrice(order.getPrice().subtract(couponItem.getCouponPrice()));} else {order.setPrice(new BigDecimal(0));}couponItem.setState(CouponStateEnum.USE.getCode());if(couponItemMapper.updateByPrimaryKeySelective(couponItem) == 0) {return ResponseDTO.errorByMsg(CodeMsg.COUPON_USE_ERROR);}}order.setId(UuidUtil.getShortUuid());order.setCreateTime(new Date());if(orderMapper.insertSelective(order) == 0) {throw new RuntimeException(CodeMsg.ORDER_ADD_ERROR.getMsg());}// 记录订单详情OrderItem orderItem = new OrderItem();orderItem.setId(UuidUtil.getShortUuid());orderItem.setOrderId(order.getId());orderItem.setCreateTime(new Date());orderItem.setState(OrderStateEnum.WAIT_PICK.getCode());orderItem.setContent("您已成功下订单,请耐心等待取件师傅与您联系取货哈,如有问题可联系客服咨询!");if(orderItemMapper.insertSelective(orderItem) == 0) {throw new RuntimeException(CodeMsg.ORDER_ITEM_ADD_ERROR.getMsg());}return ResponseDTO.successByMsg(true, "下单成功!");}
3.签到获取积分代码
/*** 签到获取积分操作* @param rateDTO* @return*/@Overridepublic ResponseDTO<Boolean> signScore(RateDTO rateDTO) {if(CommonUtil.isEmpty(rateDTO.getUserId())) {return ResponseDTO.errorByMsg(CodeMsg.DATA_ERROR);}// 获取登录用户信息User user = userMapper.selectByPrimaryKey(rateDTO.getUserId());if(user == null) {return ResponseDTO.errorByMsg(CodeMsg.USER_NOT_EXIST);}Rate rate = new Rate();rate.setId(UuidUtil.getShortUuid());rate.setCreateTime(new Date());rate.setUserId(user.getId());rate.setType(RateTypeEnum.SIGN.getCode());if(user.getSignDay() == 6) {user.setSignDay(7);user.setScore(user.getScore() + RuntimeConstant.SURPRISE_SIGN_SCORE);rate.setScore(RuntimeConstant.SURPRISE_SIGN_SCORE);rate.setDescription("签到获得惊喜积分");} else {user.setSignDay(user.getSignDay() + 1);user.setScore(user.getScore() + RuntimeConstant.NORMAL_SIGN_SCORE);rate.setScore(RuntimeConstant.NORMAL_SIGN_SCORE);rate.setDescription("签到获得积分");}rate.setNowScore(user.getScore());// 存储积分变化明细数据if(rateMapper.insertSelective(rate) == 0) {return ResponseDTO.errorByMsg(CodeMsg.RATE_SAVE_ERROR);}// 更新用户信息if(userMapper.updateByPrimaryKeySelective(user) == 0) {throw new RuntimeException(CodeMsg.USER_EDIT_ERROR.getMsg());}return ResponseDTO.successByMsg(true, "签到成功!");}