大数据正式京淘11 朴灿烈づ我的快乐病毒、 2022-06-01 09:16 192阅读 0赞 # 大数据正式京淘11 # ### 注册业务模块 ### * 注册 * ![YRyUmwL.png][] * 注册的逻辑 1. 用户填写信息+ajax异步校验,给出相应的提示 2. 注册成功:添加用户的信息到数据库 ### 登录业务模块 ### * 登录 * ![o2KVSZ5.png][] * 登录的逻辑 1. 用户填写信息,简单判空校验 2. 后台数据的校验 3. 登录成功:展示主页和用户的部分信息;写入redis缓存--不同服务器都可以访问用户数据,解决session不共享数据的问题;并将key值写入到Cookie中返回给客户 ### 登出业务模块 ### * 登出 * 登出的逻辑 1. 将该用户的cookie删除 2. 跳转到相应的界面 # 购物车子项目 # ### 搭建购物车 ### 1. 新建maven的web项目 2. 更改项目的配置 3. 导入相应的配置文件 4. 测试运行 5. 项目整体的结构 * ![WatV38M.png][] ### 购物车查询模块 ### * 设计 1. url地址访问购物车的界面 2. nginx转换地址 3. jt\_web找到相应的界面,同时从jt\_cart获取数据 4. 展示所有的购物车信息 ### 购物车添加模块 ### * 设计 1. url地址访问购物车的添加界面 2. nginx转换地址 3. jt\_web找到相应的商品添加界面,同时从jt\_cart获取数据 4. 展示添加的商品信息 ### 购物车商品数量添加模块 ### * 设计 1. url地址访问购物车的界面 2. nginx转换地址 3. jt\_web找到相应的界面,点击“-”或“+”,增减商品的数量,同时用ajax实时从jt\_cart获取数据 4. 展示商品的数量信息 ### 购物车删除模块 ### * 设计 1. url地址访问购物车的界面 2. nginx转换地址 3. jt\_web找到相应的界面,点击删除商品 4. 展示删除后的所有的购物车信息 # 购物车部分代码展示 # ### 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的安全性 ### * 解决办法 1. 让redis过期 * set方法中设置过期时间 2. 二次校验--短信 * 利用工具包,运营商提供的接口 * 后台提供两个参数【手机号,随机数】 * 用户输入账号,密码,验证码(随机数) * 后台校验【账号+密码+验证码】 ### 3.不同系统的对接 ### * js请求【前台中发起请求】:jsonp返回 * HttpClient请求【后台中发起请求】:json返回 ### 4.406错误 ### * 后台操作不当: * 用类似“\*.html”的路径访问 * 控制层可以拦截到 * 返回出错--406 * 问题的本质: * 当用类似静态的路径访问后台时,框架会自动认为之后的操作会和静态文件有关系 * 而且会自动加入一些访问静态文件的配置,导致应该返回的数据累赘 * 最终目标不能识别,产生错误 * 解决 * 将请求的路径写成动态请求的方式,即不要以形如“.html”等的请求出现 ### 5.数据库冗余字段 ### * 数据库解读 * 同一个用户可以有众多的不同的商品 * 冗余字段设计--单表设计,没有关联,需要从item查出来保存在这里 1. 商品id 2. 商品标题 3. 商品主图 4. 商品价格 * 冗余数据的处理方式 * 方式一:通过前台传来的数据直接以itemId访问后台查询这些冗余数据 * 方式二:前台的数据先到达Cart服务,然后提取出itemId然后访问后台把冗余信息找出来 * 原则:系统间的依赖越少越好--即系统的访问次数越少越好 ### 6.购物车的操作设计user\_id和Item\_id ### 1. 联合主键key【user\_id,item\_id】 2. 形如queryWhere的条件查询,记得改造cart对象,只有不变的数据才能到数据库查到真正的数据 ### 等等的小问题,你出错了吗~.~ ### # 补充-设计之美 # * ![vI4XUbs.png][] [YRyUmwL.png]: https://i.imgur.com/YRyUmwL.png [o2KVSZ5.png]: https://i.imgur.com/o2KVSZ5.png [WatV38M.png]: https://i.imgur.com/WatV38M.png [vI4XUbs.png]: https://i.imgur.com/vI4XUbs.png
相关 大数据正式京淘3 大数据正式京淘3 EasyUI简介 文档 每个组件的easyui有属性、方法和事件。用户可以方便地扩展。 属性 Dear 丶/ 2022年06月02日 12:51/ 0 赞/ 207 阅读
相关 大数据正式京淘2 大数据正式京淘2 项目统一 编码:UTF-8 环境:JDK1.8 Maven:3.5 数据库:5.5 项目支撑系统搭建 新建w 末蓝、/ 2022年06月02日 12:27/ 0 赞/ 188 阅读
相关 大数据正式京淘1 大数据正式京淘1 技术点 Spring、SpringMVC、Mybatis框架 富客户端EasyUI、KindEditor图文控件 Maven项目 梦里梦外;/ 2022年06月02日 12:26/ 0 赞/ 148 阅读
相关 大数据正式京淘正式14 大数据正式京淘正式14 传统的检索方式 1.文本检索/windows检索 全文检索、全文遍历 加载到内存中 缺点:数据一多,无法高效查询 蔚落/ 2022年06月01日 13:54/ 0 赞/ 159 阅读
相关 大数据正式京淘12 大数据正式京淘12 【前台我的购物车系统】 展示购物车信息 ![d5hGk2y.png][] 添加商品到购物车 ![HsO6UvE.png 电玩女神/ 2022年06月01日 10:25/ 0 赞/ 309 阅读
相关 大数据正式京淘10 大数据正式京淘10 数据库的读写分离 电商项目京淘项目的瓶颈有哪些 1. 数据库瓶颈 2. IO【图片(文件)的上传】 我就是我/ 2022年06月01日 07:19/ 0 赞/ 195 阅读
相关 大数据正式京淘9 大数据正式京淘9 redis集群总结 引入槽道:14384个虚拟槽道,扩展节点,无需修改代码 删除节点 1. 线路割接 2. 心已赠人/ 2022年06月01日 06:23/ 0 赞/ 214 阅读
相关 大数据正式京淘8 大数据正式京淘8 Redis集群 为什么用redis集群 Redis哨兵的缺点 1. 横向扩展不方 爱被打了一巴掌/ 2022年06月01日 05:36/ 0 赞/ 290 阅读
还没有评论,来说两句吧...