系统介绍
积分商城系统是一个基于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 "支付成功";
}
}
}