加入购物车(springboot项目)

目录

一、用户登录跳转界面

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

 三、商品详情

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

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


一、用户登录跳转界面

 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值