大数据正式京淘11
注册业务模块
- 注册
- 注册的逻辑
- 用户填写信息+ajax异步校验,给出相应的提示
- 注册成功:添加用户的信息到数据库
登录业务模块
- 登录
- 登录的逻辑
- 用户填写信息,简单判空校验
- 后台数据的校验
- 登录成功:展示主页和用户的部分信息;写入redis缓存--不同服务器都可以访问用户数据,解决session不共享数据的问题;并将key值写入到Cookie中返回给客户
登出业务模块
- 登出
- 登出的逻辑
- 将该用户的cookie删除
- 跳转到相应的界面
- 登出的逻辑
购物车子项目
搭建购物车
- 新建maven的web项目
- 更改项目的配置
- 导入相应的配置文件
- 测试运行
- 项目整体的结构
购物车查询模块
- 设计
- url地址访问购物车的界面
- nginx转换地址
- jt_web找到相应的界面,同时从jt_cart获取数据
- 展示所有的购物车信息
购物车添加模块
- 设计
- url地址访问购物车的添加界面
- nginx转换地址
- jt_web找到相应的商品添加界面,同时从jt_cart获取数据
- 展示添加的商品信息
购物车商品数量添加模块
- 设计
- url地址访问购物车的界面
- nginx转换地址
- jt_web找到相应的界面,点击“-”或“+”,增减商品的数量,同时用ajax实时从jt_cart获取数据
- 展示商品的数量信息
购物车删除模块
- 设计
- url地址访问购物车的界面
- nginx转换地址
- jt_web找到相应的界面,点击删除商品
- 展示删除后的所有的购物车信息
购物车部分代码展示
Controller层
package com.peng.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.peng.pojo.Cart;
import com.peng.service.CartService;
import com.peng.vo.SysResult;
@Controller("cartController")
@RequestMapping("/cart")
public class CartController {
@Autowired
@Qualifier("cartService")
private CartService cartService;
// 查询我的所有的购物车信息
@RequestMapping("/query/{userId}")
@ResponseBody
public SysResult queryMyCart(@PathVariable Long userId) {
List<Cart> cartList = cartService.queryMyCart(userId);
return SysResult.oK(cartList);
}
// 保存我的购物车
@RequestMapping("/save")
@ResponseBody
public SysResult saveCart(Cart cart) {
try {
cartService.saveCart(cart);
return SysResult.oK();
} catch (Exception e) {
return SysResult.build(201, "保存失败");
}
}
// 更新商品的数量--购买时点击数量进行的操作
@RequestMapping("/update/num/{userId}/{itemId}/{num}")
@ResponseBody
public SysResult updateNum(@PathVariable Long userId, @PathVariable Long itemId, @PathVariable Long num) {
try {
// 封装一个对象
Cart cart = new Cart();
cart.setUserId(userId);
cart.setItemId(itemId);
cart.setNum(Integer.parseInt(Long.toString(num)));
cartService.updateNum(cart);
return SysResult.oK();
} catch (Exception e) {
return SysResult.build(201, "更新失败");
}
}
// 删除购物车
@RequestMapping("/delete/{userId}/{itemId}")
@ResponseBody
public SysResult deleteCart(@PathVariable Long userId, @PathVariable Long itemId) {
try {
// 构造中间参数
Cart cart = new Cart();
cart.setUserId(userId);
cart.setItemId(itemId);
cartService.deleteCart(cart);
return SysResult.oK();
} catch (Exception e) {
return SysResult.build(201, "删除失败");
}
}
}
Service层
-
Service接口
package com.peng.service; import java.util.List; import com.peng.pojo.Cart; public interface CartService { /** * 通过userId查询所有的购物车信息 * * @param userId * @return */ List<Cart> queryMyCart(Long userId); /** * 保存购物车的信息 * * @param cart */ void saveCart(Cart cart); /** * 更新数量 * * @param cart */ void updateNum(Cart cart); /** * 删除商品 * * @param cart */ void deleteCart(Cart cart); }
-
Service实现类
package com.peng.service.impl; import java.util.Date; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import com.peng.mapper.CartMapper; import com.peng.pojo.Cart; import com.peng.service.BaseService; import com.peng.service.CartService; @Service("cartService") public class CartServiceImpl extends BaseService<Cart> implements CartService { @Autowired @Qualifier("cartMapper") private CartMapper cartMapper; @Override public List<Cart> queryMyCart(Long userId) { return cartMapper.queryMyCart(userId); } @Override public void saveCart(Cart cart) { /* 判断商品是否存在--不存在,新增;存在,更新 */ // 不能直接用传进来的cart来查询--不准确,改造一下 Cart cart_new = new Cart(); cart_new.setUserId(cart.getUserId()); cart_new.setItemId(cart.getItemId()); // 查询 Cart isExitQueryCart = super.queryByWhere(cart_new); // 判断 if (null == isExitQueryCart) {// 不存在--进行新增 cart.setCreated(new Date()); cart.setUpdated(cart.getCreated()); cartMapper.insertSelective(cart); } else {// 存在--进行更新 isExitQueryCart.setNum(isExitQueryCart.getNum() + cart.getNum()); isExitQueryCart.setUpdated(new Date()); cartMapper.updateByPrimaryKeySelective(isExitQueryCart); } } @Override public void updateNum(Cart cart) { cartMapper.updateNum(cart); } @Override public void deleteCart(Cart cart) { cartMapper.delete(cart); } }
Mapper接口【注:其他没有的方法用的通用mapper】
#
package com.peng.mapper;
import java.util.List;
import com.peng.pojo.Cart;
public interface CartMapper extends SysMapper<Cart> {
/**
* 通过userId查询所有的购物车信息
*
* @param userId
* @return
*/
List<Cart> queryMyCart(Long userId);
/**
* 更新商品的数量
*
* @param cart
*/
void updateNum(Cart cart);
}
Mapper文件
#
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.peng.mapper.CartMapper">
<select id="queryMyCart" resultType="Cart">
select * from tb_cart
where
user_id=#{userId}
order by created desc
</select>
<!-- 更新商品的数量 -->
<update id="updateNum" parameterType="Cart">
update tb_cart set num=#{num} where user_id=#{userId} and item_id=#{itemId}
</update>
</mapper>
问题集锦
1.Cookie
-
Cookie是和域名相绑定的,nginx路径转换的时候带不过去
-
解决:在nginx下的配置文件中配置
proxy_set_header X-Forwarded-Host $host;
server { listen 80; server_name www.jt.com; #charset koi8-r; #access_log logs/host.access.log main; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; location / { proxy_pass http://127.0.0.1:8082; proxy_connect_timeout 600; proxy_read_timeout 600; } }
-
2.Cookie的安全性
- 解决办法
- 让redis过期
- set方法中设置过期时间
- 二次校验--短信
- 利用工具包,运营商提供的接口
- 后台提供两个参数【手机号,随机数】
- 用户输入账号,密码,验证码(随机数)
- 后台校验【账号+密码+验证码】
- 让redis过期
3.不同系统的对接
- js请求【前台中发起请求】:jsonp返回
- HttpClient请求【后台中发起请求】:json返回
4.406错误
- 后台操作不当:
- 用类似“*.html”的路径访问
- 控制层可以拦截到
- 返回出错--406
- 问题的本质:
- 当用类似静态的路径访问后台时,框架会自动认为之后的操作会和静态文件有关系
- 而且会自动加入一些访问静态文件的配置,导致应该返回的数据累赘
- 最终目标不能识别,产生错误
- 解决
- 将请求的路径写成动态请求的方式,即不要以形如“.html”等的请求出现
5.数据库冗余字段
- 数据库解读
- 同一个用户可以有众多的不同的商品
- 冗余字段设计--单表设计,没有关联,需要从item查出来保存在这里
- 商品id
- 商品标题
- 商品主图
- 商品价格
- 冗余数据的处理方式
- 方式一:通过前台传来的数据直接以itemId访问后台查询这些冗余数据
- 方式二:前台的数据先到达Cart服务,然后提取出itemId然后访问后台把冗余信息找出来
- 原则:系统间的依赖越少越好--即系统的访问次数越少越好
6.购物车的操作设计user_id和Item_id
- 联合主键key【user_id,item_id】
- 形如queryWhere的条件查询,记得改造cart对象,只有不变的数据才能到数据库查到真正的数据