加入购物车(springboot项目)

本文档详细介绍了使用SpringBoot实现购物车系统的过程,包括用户登录、参数解析、购物车后台处理、商品详情展示、购物车查询与增删改功能。用户登录后,通过UUID生成token保存在cookie和redis中,购物车功能受限于登录状态,商品详情页面展示,购物车数据绑定及删除、编辑操作均有涵盖。
摘要由CSDN通过智能技术生成

目录

一、用户登录跳转界面

二、参数解析器以及购物车后台

 三、商品详情

四、购物车查询以及新增的前台

 五、购物车删除及修改功能


一、用户登录跳转界面

 js

$(function () {
    alert(233);
//    给登录按钮添加事件
    $("#login").click(function () {
        let mobile = $("#mobile").val();
        let password = $("#password").val();

        console.log("mobile=%s,password=%s",mobile,password);

        //1.密码加密
        //1) 定义固定盐
        let salt='f1g2h3j4';
        //2) 固定盐混淆
        let temp=salt.charAt(1)+""+salt.charAt(5)+password+salt.charAt(0)+""+salt.charAt(3);
        //3) 使用MD5完成前端第一次加密
        let pwd=md5(temp);

        //2.向后台发起登录ajax请求
        $.post('/user/toLogin',{
            mobile:mobile,
            password:pwd
        },function(rs){
            if(rs.code!=200){//登录失败
                alert(rs.msg);
            }else
                //alert(rs.msg);
              location.href="/";//登录成功跳转index.html
        },'json');
    });
});

 user.java

package com.zking.spbootpro.model;

import com.baomidou.mybatisplus.annotation.TableName;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.Date;

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * <p>
 * 用户信息表
 * </p>
 *
 * @author zking
 * @since 2022-11-05
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_user")
public class User implements Serializable {

        private  long id;

    /**
     * 昵称
     */
    private String nickname;

    /**
     * MD5(MD5(pass明文+固定salt)+salt)
     */
    private String password;

    /**
     * 随机salt
     */
    private String salt;

    /**
     * 注册时间
     */
    private Date registerDate;

    /**
     * 最后一次登录时间
     */
    private LocalDateTime lastLoginDate;

    /**
     * 登录次数
     */
    private Integer loginCount;


}

package com.zking.spbootpro.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zking.spbootpro.exception.BusinessException;
import com.zking.spbootpro.mapper.UserMapper;
import com.zking.spbootpro.model.User;
import com.zking.spbootpro.model.dto.UserDto;
import com.zking.spbootpro.service.IRedisService;
import com.zking.spbootpro.service.IUserService;
import com.zking.spbootpro.utils.CookieUtils;
import com.zking.spbootpro.utils.JsonResponseBody;
import com.zking.spbootpro.utils.JsonResponseStatus;
import com.zking.spbootpro.utils.MD5Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

/**
 * <p>
 * 用户信息表 服务实现类
 * </p>
 *
 * @author zking
 * @since 2022-11-04
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private IRedisService redisService;

    @Override
    public JsonResponseBody toLogin(UserDto userDto, HttpServletRequest req, HttpServletResponse resp) {
//        1.5.1)判断mobile和password是否为空
//        1.5.2)判断mobile格式是否正确
//        1.5.3)根据用户手机号码查询用户是否存在
        User user = userMapper.selectOne(new QueryWrapper<User>()
                .eq("id", userDto.getMobile()));

//        1.5.4)校验账号
        if (user == null)
            throw new BusinessException(JsonResponseStatus.USER_USERNAME_ERROR);

//        前台传递到后台的密码,要进过工具类md5加密一次,才有可能跟数据库密码匹配上
        String pwd = MD5Utils.formPassToDbPass(userDto.getPassword(), user.getSalt());
//        1.5.5)校验密码
        if(!pwd.equals(user.getPassword()))
            throw new BusinessException(JsonResponseStatus.USER_PASSWORD_ERROR);

        //6.将登陆用户对象与token令牌进行绑定保存到cookie和redis
        //创建登陆令牌token
        String token= UUID.randomUUID().toString().replace("-","");
        //将token令牌保存到cookie中
        CookieUtils.setCookie(req,resp,"token",token,7200);
        //将登陆token令牌与用户对象user绑定到redis中
        redisService.setUserToRedis(token,user);
        //将用户登陆的昵称设置到cookie中
        CookieUtils.setCookie(req,resp,"nickname",user.getNickname());
        return new JsonResponseBody<>();
    }
}
 

二、参数解析器以及购物车后台

代码

<!--返回顶部-->
<div class="gotop">
    <a href="javascript:void(0)" οnclick="check()">
        <dl>
            <dt><img src="img/gt1.png"/></dt>
            <dd>去购<br />物车</dd>
        </dl>
    </a>
    <a href="#" class="dh">
        <dl>
            <dt><img src="img/gt2.png"/></dt>
            <dd>联系<br />客服</dd>
        </dl>
    </a>
    <a href="${ctx}/page/mygxin.html">
        <dl>
            <dt><img src="img/gt3.png"/></dt>
            <dd>个人<br />中心</dd>
        </dl>
    </a>
    <a href="#" class="toptop" style="display: none">
        <dl>
            <dt><img src="img/gt4.png"/></dt>
            <dd>返回<br />顶部</dd>
        </dl>
    </a>
    <p>400-800-8200</p>
</div>

<!-------------------login-------------------------->
<!--footer-->
<div class="footer">
    <div class="top">
        <div class="wrapper">
            <div class="clearfix">
                <a href="#2" class="fl"><img src="img/foot1.png"/></a>
                <span class="fl">7天无理由退货</span>
            </div>
            <div class="clearfix">
                <a href="#2" class="fl"><img src="img/foot2.png"/></a>
                <span class="fl">15天免费换货</span>
            </div>
            <div class="clearfix">
                <a href="#2" class="fl"><img src="img/foot3.png"/></a>
                <span class="fl">满599包邮</span>
            </div>
            <div class="clearfix">
                <a href="#2" class="fl"><img src="img/foot4.png"/></a>
                <span class="fl">手机特色服务</span>
            </div>
        </div>
    </div>
    <p class="dibu">最家家居&copy;2013-2017公司版权所有 京ICP备080100-44备0000111000号<br />
        违法和不良信息举报电话:400-800-8200,本网站所列数据,除特殊说明,所有数据均出自我司实验室测试</p>
</div>
<script src="js/jquery-1.12.4.min.js" type="text/javascript" charset="utf-8"></script>
<script>
    function check() {
        $.get('/shopCar/check',{},function(rs){
            if(rs.code!=200){
                alert('请先登录后再购买商品!');
            }else
                location.href='/shopCar/queryShopCar';
        },'json');
    }
</script>
UserArgumentResovler  参数解析器
package com.zking.spbootpro.config;

import com.zking.spbootpro.exception.BusinessException;
import com.zking.spbootpro.model.User;
import com.zking.spbootpro.service.IredisService;
import com.zking.spbootpro.utils.CookieUtils;
import com.zking.spbootpro.utils.JsonResponseStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.servlet.HandlerExceptionResolver;

import javax.servlet.http.HttpServletRequest;

/**
 * 参数解析器
 * @author 锦鲤
 * @site www.lucy.com
 * @company xxx公司
 * @create  2022-11-07 18:25
 */

@Component
public class UserArgumentResovler implements HandlerMethodArgumentResolver {

    @Autowired
     private IredisService  iredisService;

    /**
     * supportsParameter的方法返回值
     * true:会使用下面resolveArgument
     * false:则不调用
     * @param methodParameter
     * @return
     */
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.getParameterType()== User.class;
    }

    /**
     * resolveArgument;
     * 具体的业务代码处理
     * @param methodParameter
     * @param modelAndViewContainer
     * @param nativeWebRequest
     * @param webDataBinderFactory
     * @return
     * @throws Exception
     */
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
       HttpServletRequest request =(HttpServletRequest) nativeWebRequest.getNativeRequest();
       String token = CookieUtils.getCookieValue(request,"token");
        if(token==null){
            throw  new BusinessException(JsonResponseStatus.TOKEN_EEROR);
        }
        User user=  iredisService.getUserToRedis(token);
        if(user ==null){
            throw  new BusinessException(JsonResponseStatus.TOKEN_EEROR);
        }

        return user;
    }
}

 WebConfig  

package com.zking.spbootpro.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * @author 锦鲤
 * @site www.lucy.com
 * @company xxx公司
 * @create  2022-11-07 18:42
 *
 */
@Configuration
public class WebConfig  implements WebMvcConfigurer {

    @Autowired
    private UserArgumentResovler userArgumentResovler;

    /**
     * 配置静态资源访问映射,使用了WebMvcConfigurer会覆盖原有的application.yml文件中的静态资源配置
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
    }

    /**
     * 添加自定义的参数解析器
     * @param resolvers
     */
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(userArgumentResovler);
    }
}

购物车后台搭建

实体类ShopCar 、ShopCarItem 

package com.zking.spbootpro.model.vo;

import java.util.*;

/**
 * @author 锦鲤
 * @company xxx公司
 * @create  2022-11-07 10:36
 * <p>
 * view object
 * 购物车对象
 */
public class ShopCar {
   private List<ShopCarItem> items= new ArrayList<ShopCarItem>();

    public List<ShopCarItem> getItems() {
        return items;
    }

    public void setItems(List<ShopCarItem> items) {
        this.items = items;
    }

    //    增加
    public void add(ShopCarItem shopCarItem) {
//        1.当购物车存在该商品时
        for (ShopCarItem item : items) {
            if (Objects.equals(shopCarItem.getGid(), item.getGid())) {
                item.setQuantity(item.getQuantity() + 1);
                return;
            }
        }
//        2.当购物车不存在该商品时
        items.add(shopCarItem);
    }

    //    删除    1,2,3
    public void delete(String gids) {
        List<String> gidList = Arrays.asList(gids.split(","));
        Iterator<ShopCarItem> it = items.iterator();
        while (it.hasNext()) {
            ShopCarItem next = it.next();
            if (gidList.contains(next.getGid()+"")) {
                it.remove();
            }
        }
    }

    //    修改
    public void update(ShopCarItem shopCarItem) {
        for (ShopCarItem item : items) {
            if (Objects.equals(shopCarItem.getGid(), item.getGid())) {
                item.setQuantity(shopCarItem.getQuantity());
            }
        }
    }


//    查询



//    小计
}
package com.zking.spbootpro
### 回答1: Spring Boot商城项目是使用Spring Boot框架开发的电子商务平台。它可以帮助开发人员快速构建基于微服务架构的高效、稳定、可扩展的商城系统。该项目通常包含以下功能:用户管理、商品管理、购物车、订单管理、支付系统、物流管理等。 ### 回答2: SpringBoot商城项目是一个使用SpringBoot框架开发的电商平台,可以实现用户注册登录、商品浏览、购物车管理、订单管理等功能。 首先,用户可以通过注册登录功能进行账户的创建和登录。用户注册时需要填写一些基本信息,如用户名、密码、手机等,然后使用这些信息进行登录。登录后,用户可以浏览商品加入购物车、下订单等操作。 其次,商城项目还提供了商品浏览功能。用户可以按照不同的分类、价格等条件浏览商品,查看商品的详细信息,如图片、价格、库存等。用户可以通过搜索功能找到特定的商品,并可以将感兴趣的商品加入购物车。 再次,购物车管理功能允许用户将商品加入或从购物车中删除。用户可以随时查看购物车中的商品数量和总价,还可以修改商品的数量。用户可以选择结算购物车内的商品,生成订单。 最后,商城项目还提供了订单管理功能。在结算购物车中的商品后,会生成订单,用户可以查看订单的详细信息,如订单号、商品明细、收货地址等。用户还可以取消订单、查看物流信息等操作。 总之,SpringBoot商城项目通过使用SpringBoot框架来简化开发,实现了用户注册登录、商品浏览、购物车管理、订单管理等功能,为用户提供了一个完善的电商平台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值