系统介绍
积分商城系统是一个基于Spring、MySQL和Redis等技术栈构建的全功能商城解决方案。该系统旨在为用户提供一个便捷的购物体验,并以积分作为支付和奖励的核心机制。
系统的核心功能包括商品浏览、购买下单、积分管理和订单处理。用户可以通过客户端访问系统,浏览商城中的各类商品,查看商品详情、价格、库存等信息,并将心仪的商品加入购物车。在下单过程中,用户可以选择使用积分进行支付或与其他支付方式结合使用。
积分是系统的重要特色,用户可以通过多种方式获取积分,如购买商品、参与活动、邀请好友等。积分可用于支付部分或全部商品价格,还可以用于兑换优惠券或其他福利。用户可以在系统中查看自己的积分余额,并根据积分情况做出相应的决策。
管理员通过管理端对商品、订单和用户积分进行管理和处理。他们可以添加、编辑和删除商品,设置商品的价格、库存和促销活动。同时,管理员可以查看订单信息,处理退款、发货和售后等操作。对于用户积分管理,管理员可以进行调整、奖励或扣除积分,以维护系统的积分平衡和公平性。
积分商城系统采用现代化的Web技术和RESTful API设计,使得系统具备良好的用户体验和扩展性。前端界面友好美观,响应迅速,可以适配各种设备和浏览器。后端采用分层架构,将业务逻辑、数据存储和缓存分离,提供高效的数据处理和访问性能。
积分商城系统是一个综合运用Spring、MySQL和Redis等技术构建的全功能商城解决方案,为用户和管理员提供了便捷、安全和可靠的购物和管理体验。通过积分机制的引入,系统在用户激励和促销方面具备独特的优势,为商家和消费者带来更多价值和乐趣。
系统设计
系统结构图
积分商城系统前台模块
积分商城系统后台模块
概念模型设计
系统实现
管理员登录界面
管理员登录系统需要输入自己的姓名和密码,经过后台校验后才可以进入系统主界面
用户主界面
登录成功之后,就会跳转到用户主页面,主界面有不同的商品展示,用户可以选择满意的商品进行下单处理。普通用户主页面如图5.3所示。
管理员主界面
管理员除了可以能看到管理主界面,有员工管理,分类管理,产品管理,套餐管理,订单明细的选项。会议管理员主页面如图所示。
用户管理模块
用户管理是超级管理员角色才拥有的功能,超级管理员可以通过它来更改用户的角色属性,如图所示,以及新增、删除用户,以及管理员的搜索功能如图所示。
分类管理模块
分类管理可以将产品进行划分,便于用户端展示,可以增加产品分类和套餐分类。
产品管理模块
产品管理可以增加,删除,修改,查询相应的产品,设置商品是否停售等功能,支持批量操作。
套餐管理模块
套餐管理模块可以对套餐进行管理
订单细明模块
支持外卖员查询订单,实现派送
用户端主页模块
用户端可以看到不同的分类以及不同的商品
个人中心模块
个人中心可以查看个人余额,个人积分,最近订单,历史订单等信息
支付模块
支付模块
核心功能实现
订单模块
package com.frx01.reggie.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.frx01.reggie.common.BaseContext; import com.frx01.reggie.common.CustomException; import com.frx01.reggie.entity.*; import com.frx01.reggie.mapper.OrderMapper; import com.frx01.reggie.mapper.UserMapper; import com.frx01.reggie.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** * @version 1.0 * @date 2022/6/6 21:04 */ @Slf4j @Service public class OrderServiceImpl extends ServiceImpl<OrderMapper, Orders> implements OrderService { @Autowired private ShoppingCartService shoppingCartService; @Autowired private UserService userService; @Autowired private AddressBookService addressBookService; @Autowired private OrderDetailService orderDetailService; @Autowired private UserMapper userMapper; /** * 用户下单 * @param orders */ @Transactional @Override public void submit(Orders orders) { //获得当前用户Id Long userId = BaseContext.getCurrentId(); //查询当前用户的购物车数据 LambdaQueryWrapper<ShoppingCart> wrapper=new LambdaQueryWrapper<>(); wrapper.eq(ShoppingCart::getUserId,userId); List<ShoppingCart> shoppingCarts = shoppingCartService.list(wrapper); if(shoppingCarts==null||shoppingCarts.size()==0){ throw new CustomException("购物车为空,不能下单"); } //查询用户数据 User user = userService.getById(userId); //查询地址数据 Long addressBookId = orders.getAddressBookId(); AddressBook addressBook = addressBookService.getById(addressBookId); if(addressBook==null){ throw new CustomException("用户地址信息有误,不能下单"); } long orderId = IdWorker.getId();//订单号 AtomicInteger amount=new AtomicInteger(0); List<OrderDetail> orderDetails=shoppingCarts.stream().map((item)->{ OrderDetail orderDetail=new OrderDetail(); orderDetail.setOrderId(orderId); orderDetail.setNumber(item.getNumber()); orderDetail.setDishFlavor(item.getDishFlavor()); orderDetail.setDishId(item.getDishId()); orderDetail.setSetmealId(item.getSetmealId()); orderDetail.setName(item.getName()); orderDetail.setImage(item.getImage()); orderDetail.setAmount(item.getAmount()); amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue()); return orderDetail; }).collect(Collectors.toList()); orders.setId(orderId); orders.setOrderTime(LocalDateTime.now()); orders.setCheckoutTime(LocalDateTime.now()); orders.setStatus(2); orders.setAmount(new BigDecimal(amount.get()));//总金额 orders.setUserId(userId); orders.setNumber(String.valueOf(orderId)); orders.setUserName(user.getName()); orders.setConsignee(addressBook.getConsignee()); orders.setPhone(addressBook.getPhone()); orders.setAddress((addressBook.getProvinceName() == null ? "" : addressBook.getProvinceName()) + (addressBook.getCityName() == null ? "" : addressBook.getCityName()) + (addressBook.getDistrictName() == null ? "" : addressBook.getDistrictName()) + (addressBook.getDetail() == null ? "" : addressBook.getDetail())); //向订单表插入数据,一条数据 this.save(orders); BigDecimal bd2 = new BigDecimal(100.00); BigDecimal amount1 = orders.getAmount().divide(bd2); //个人积分增加 userMapper.add(userId,amount1); //向订单明细表插入数据,多条数据 orderDetailService.saveBatch(orderDetails); //清空购物车数据 shoppingCartService.remove(wrapper); } @Transactional @Override public void submit2(Orders orders) { //获得当前用户Id Long userId = BaseContext.getCurrentId(); //查询当前用户的购物车数据 LambdaQueryWrapper<ShoppingCart> wrapper=new LambdaQueryWrapper<>(); wrapper.eq(ShoppingCart::getUserId,userId); List<ShoppingCart> shoppingCarts = shoppingCartService.list(wrapper); if(shoppingCarts==null||shoppingCarts.size()==0){ throw new CustomException("购物车为空,不能下单"); } //查询用户数据 User user = userService.getById(userId); // if(user.getScores()-5<=0){ // throw new CustomException("积分不足,不能下单"); // }else{ // userMapper.sub(userId); // } //查询地址数据 Long addressBookId = orders.getAddressBookId(); AddressBook addressBook = addressBookService.getById(addressBookId); if(addressBook==null){ throw new CustomException("用户地址信息有误,不能下单"); } long orderId = IdWorker.getId();//订单号 AtomicInteger amount=new AtomicInteger(0); List<OrderDetail> orderDetails=shoppingCarts.stream().map((item)->{ OrderDetail orderDetail=new OrderDetail(); orderDetail.setOrderId(orderId); orderDetail.setNumber(item.getNumber()); orderDetail.setDishFlavor(item.getDishFlavor()); orderDetail.setDishId(item.getDishId()); orderDetail.setSetmealId(item.getSetmealId()); orderDetail.setName(item.getName()); orderDetail.setImage(item.getImage()); orderDetail.setAmount(item.getAmount()); amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue()); return orderDetail; }).collect(Collectors.toList()); orders.setId(orderId); orders.setOrderTime(LocalDateTime.now()); orders.setCheckoutTime(LocalDateTime.now()); orders.setStatus(2); orders.setAmount(new BigDecimal(amount.get()));//总金额 orders.setUserId(userId); orders.setNumber(String.valueOf(orderId)); orders.setUserName(user.getName()); orders.setConsignee(addressBook.getConsignee()); orders.setPhone(addressBook.getPhone()); orders.setAddress((addressBook.getProvinceName() == null ? "" : addressBook.getProvinceName()) + (addressBook.getCityName() == null ? "" : addressBook.getCityName()) + (addressBook.getDistrictName() == null ? "" : addressBook.getDistrictName()) + (addressBook.getDetail() == null ? "" : addressBook.getDetail())); //向订单表插入数据,一条数据 this.save(orders); //向订单明细表插入数据,多条数据 orderDetailService.saveBatch(orderDetails); //清空购物车数据 shoppingCartService.remove(wrapper); } @Override public String subscore(int money) { //获得当前用户Id Long userId = BaseContext.getCurrentId(); //查询用户数据 User user = userService.getById(userId); int mymoney = user.getMoney(); int myscore = user.getScores(); double costmoney = money*0.7,costscore = money*0.3; // 余额不足 if(costmoney > mymoney){ return "请充值"; } if(costscore>myscore){ if( mymoney - (costscore-myscore)-costmoney<0){ //如果我的余额减去不足的积分再减去本来要消费的金额后小于0 return "请充值"; }else { //经费充足 userMapper.sub_score(myscore,userId); userMapper.sub_money((int) ((int) (costscore-myscore)+costmoney),userId); return "支付成功"; } }else{//此时余额和积分都充足 userMapper.sub_score((int) costscore,userId); userMapper.sub_money((int) costmoney,userId); return "支付成功"; } } }
项目地址:
https://gitee.com/yishangyishang/Points_mall_system-master.git