基于spring的前后端一体化积分商城系统

系统介绍

积分商城系统是一个基于Spring、MySQL和Redis等技术栈构建的全功能商城解决方案。该系统旨在为用户提供一个便捷的购物体验,并以积分作为支付和奖励的核心机制。

系统的核心功能包括商品浏览、购买下单、积分管理和订单处理。用户可以通过客户端访问系统,浏览商城中的各类商品,查看商品详情、价格、库存等信息,并将心仪的商品加入购物车。在下单过程中,用户可以选择使用积分进行支付或与其他支付方式结合使用。

积分是系统的重要特色,用户可以通过多种方式获取积分,如购买商品、参与活动、邀请好友等。积分可用于支付部分或全部商品价格,还可以用于兑换优惠券或其他福利。用户可以在系统中查看自己的积分余额,并根据积分情况做出相应的决策。

管理员通过管理端对商品、订单和用户积分进行管理和处理。他们可以添加、编辑和删除商品,设置商品的价格、库存和促销活动。同时,管理员可以查看订单信息,处理退款、发货和售后等操作。对于用户积分管理,管理员可以进行调整、奖励或扣除积分,以维护系统的积分平衡和公平性。

积分商城系统采用现代化的Web技术和RESTful API设计,使得系统具备良好的用户体验和扩展性。前端界面友好美观,响应迅速,可以适配各种设备和浏览器。后端采用分层架构,将业务逻辑、数据存储和缓存分离,提供高效的数据处理和访问性能。

积分商城系统是一个综合运用Spring、MySQL和Redis等技术构建的全功能商城解决方案,为用户和管理员提供了便捷、安全和可靠的购物和管理体验。通过积分机制的引入,系统在用户激励和促销方面具备独特的优势,为商家和消费者带来更多价值和乐趣。

系统设计

系统结构图

基于spring的前后端一体化积分商城系统_第1张图片

 积分商城系统前台模块

基于spring的前后端一体化积分商城系统_第2张图片

积分商城系统后台模块

基于spring的前后端一体化积分商城系统_第3张图片

概念模型设计

基于spring的前后端一体化积分商城系统_第4张图片

系统实现

管理员登录界面

管理员登录系统需要输入自己的姓名和密码,经过后台校验后才可以进入系统主界面

基于spring的前后端一体化积分商城系统_第5张图片

用户主界面

登录成功之后,就会跳转到用户主页面,主界面有不同的商品展示,用户可以选择满意的商品进行下单处理。普通用户主页面如图5.3所示。

基于spring的前后端一体化积分商城系统_第6张图片

管理员主界面

管理员除了可以能看到管理主界面,有员工管理,分类管理,产品管理,套餐管理,订单明细的选项。会议管理员主页面如图所示。

基于spring的前后端一体化积分商城系统_第7张图片

用户管理模块

用户管理是超级管理员角色才拥有的功能,超级管理员可以通过它来更改用户的角色属性,如图所示,以及新增、删除用户,以及管理员的搜索功能如图所示。

基于spring的前后端一体化积分商城系统_第8张图片

基于spring的前后端一体化积分商城系统_第9张图片

基于spring的前后端一体化积分商城系统_第10张图片

分类管理模块

分类管理可以将产品进行划分,便于用户端展示,可以增加产品分类和套餐分类。

基于spring的前后端一体化积分商城系统_第11张图片

产品管理模块

产品管理可以增加,删除,修改,查询相应的产品,设置商品是否停售等功能,支持批量操作。

基于spring的前后端一体化积分商城系统_第12张图片

基于spring的前后端一体化积分商城系统_第13张图片

套餐管理模块

套餐管理模块可以对套餐进行管理

基于spring的前后端一体化积分商城系统_第14张图片

订单细明模块

支持外卖员查询订单,实现派送

基于spring的前后端一体化积分商城系统_第15张图片

用户端主页模块

用户端可以看到不同的分类以及不同的商品

基于spring的前后端一体化积分商城系统_第16张图片

个人中心模块

个人中心可以查看个人余额,个人积分,最近订单,历史订单等信息

基于spring的前后端一体化积分商城系统_第17张图片

 支付模块

支付模块

基于spring的前后端一体化积分商城系统_第18张图片

核心功能实现

订单模块

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 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 wrapper=new LambdaQueryWrapper<>();
        wrapper.eq(ShoppingCart::getUserId,userId);
        List 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 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 wrapper=new LambdaQueryWrapper<>();
        wrapper.eq(ShoppingCart::getUserId,userId);
        List 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 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 "支付成功";

        }

    }
}

你可能感兴趣的:(项目实战案例,spring,java,前端)