1.用户模块实现
1.1 用户信息回显
1.1.1 页面URL剖析
1.1.2 查看页面JS
1.1.3 编辑JT-SSO的Controller
`/** * 业务实现: * 1.用户通过cookie信息查问用户数据. 通过ticket获取redis中的业务数据. * 2.url申请: http://sso.jt.com/user/query/+ _ticket * 3.参数: 参数在url中. 利用restFul获取 * 4.返回值要求: SysResult对象(userJSON) */ @RequestMapping("/query/{ticket}") public JSONPObject findUserByTicket(@PathVariable String ticket, HttpServletResponse response, String callback){ String userJSON = jedisCluster.get(ticket); //1.lru算法清空数据 2.有可能cookie信息有误 if(StringUtils.isEmpty(userJSON)){ //2.应该删除cookie信息. Cookie cookie = new Cookie("JT_TICKET", ""); cookie.setMaxAge(0); cookie.setDomain("jt.com"); cookie.setPath("/"); response.addCookie(cookie); return new JSONPObject(callback,SysResult.fail()); } return new JSONPObject(callback,SysResult.success(userJSON)); }`
1.2 编辑Cookie工具API
`package com.jt.util;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class CookieUtil { //1.新增cookie public static void addCookie(HttpServletResponse response,String cookieName, String cookieValue, int seconds, String domain){ Cookie cookie = new Cookie(cookieName,cookieValue); cookie.setMaxAge(seconds); cookie.setDomain(domain); cookie.setPath("/"); response.addCookie(cookie); } //2.依据name查问value的值 public static String getCookieValue(HttpServletRequest request,String cookieName){ Cookie[] cookies = request.getCookies(); if(cookies !=null && cookies.length >0){ for (Cookie cookie : cookies){ if(cookieName.equals(cookie.getName())){ return cookie.getValue(); } } } return null; } //3.删除cookie public static void deleteCookie(HttpServletResponse response,String cookieName,String domain){ addCookie(response,cookieName,"",0, domain); }}`
1.3 用户退出操作
1.3.1 业务阐明
如果用户点击退出操作, 首先应该删除Redis中的数据 其次删除Cookie中的数据 之后重定向到零碎首页.
1.3.2 URL剖析
1.3.3 编辑UserController
`/** * 实现用户的退出操作.重定向到零碎首页 * url: http://www.jt.com/user/logout.html * 业务: * 1.删除Redis中的数据 key * 2.删除Cookie记录 */ @RequestMapping("logout") public String logout(HttpServletRequest request,HttpServletResponse response){ //1.依据JT_TICKET获取指定的ticket String ticket = CookieUtil.getCookieValue(request,"JT_TICKET"); //2.判断ticket是否为null if(!StringUtils.isEmpty(ticket)){ jedisCluster.del(ticket); CookieUtil.deleteCookie(response,"JT_TICKET","jt.com"); } return "redirect:/"; }`
2 实现商品详情展示
2.1 业务阐明
阐明: 当用户点击商品时,须要跳转到商品的展示页面中 页面名称item.jsp
2.2 重构JT-MANAGE
2.2.1创立接口
阐明:在jt-common中创立接口
2.2.2 编辑Dubbo实现类
`package com.jt.service;import com.alibaba.dubbo.config.annotation.Service;import com.jt.mapper.ItemDescMapper;import com.jt.mapper.ItemMapper;import com.jt.pojo.Item;import com.jt.pojo.ItemDesc;import org.springframework.beans.factory.annotation.Autowired;@Service(timeout = 3000)public class DubboItemServiceImpl implements DubboItemService{ @Autowired private ItemMapper itemMapper; @Autowired private ItemDescMapper itemDescMapper; @Override public Item findItemById(Long itemId) { return itemMapper.selectById(itemId); } @Override public ItemDesc findItemDescById(Long itemId) { return itemDescMapper.selectById(itemId); }}`
2.2.3 编辑YML配置文件
`server: port: 8091 servlet: context-path: /spring: datasource: #引入druid数据源 #type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true username: root password: root mvc: view: prefix: /WEB-INF/views/ suffix: .jsp#mybatis-plush配置mybatis-plus: type-aliases-package: com.jt.pojo mapper-locations: classpath:/mybatis/mappers/*.xml configuration: map-underscore-to-camel-case: truelogging: level: com.jt.mapper: debug#对于Dubbo配置dubbo: scan: basePackages: com.jt #指定dubbo的包门路 扫描dubbo注解 application: #利用名称 name: provider-manage #一个接口对应一个服务名称 一个接口能够有多个实现 registry: #注册核心 用户获取数据从机中获取 主机只负责监控整个集群 实现数据同步 address: zookeeper://192.168.126.129:2181?backup=192.168.126.129:2182,192.168.126.129:2183 protocol: #指定协定 name: dubbo #应用dubbo协定(tcp-ip) web-controller间接调用sso-Service port: 20881 #每一个服务都有本人特定的端口 不能反复.`
2.2.4 编辑ItemController
`package com.jt.controller;import com.alibaba.dubbo.config.annotation.Reference;import com.jt.pojo.Item;import com.jt.pojo.ItemDesc;import com.jt.service.DubboItemService;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping("/items")public class ItemController { @Reference(timeout = 3000) private DubboItemService itemService; /** * 实现商品详情页面跳转 * url: http://www.jt.com/items/562379.html * 参数: 562379 itemId * 返回值: item.jsp页面 * 页面取值阐明: * ${item.title } item对象 * ${itemDesc.itemDesc } itemDesc对象 * * 思路: * 1.重构jt-manage我的项目 * 2.创立中立接口DubboItemService * 3.实现业务调用获取item/itemDesc对象 */ @RequestMapping("/{itemId}") public String findItemById(@PathVariable Long itemId, Model model){ Item item = itemService.findItemById(itemId); ItemDesc itemDesc = itemService.findItemDescById(itemId); //将数据保留到request域中 model.addAttribute("item",item); model.addAttribute("itemDesc",itemDesc); return "item"; }}`
2.2.5 页面成果展示
3 购物车模块实现
3.1 创立服务提供者
3.1.1 创立我的项目JT-CART
3.1.2 增加继承/依赖/插件
`<!--2.增加依赖信息--> <dependencies> <!--依赖本质依赖的是jar包文件--> <dependency> <groupId>com.jt</groupId> <artifactId>jt-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> <!--3.增加插件--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>`
3.1.3 编辑POJO对象
`@TableName("tb_cart")@Data@Accessors(chain = true)public class Cart extends BasePojo{ //应用包装类型 @TableId(type = IdType.AUTO) private Long id; private Long uesrId; //用户ID号 private Long itemId; //商品ID号 private String itemTitle; //商品题目 private String itemImage; //图片 private Long itemPrice; //商品价格 private Integer num; //商品数量}`
3.1.4 编辑CartService接口
3.1.5 jt-cart代码构造
3.2 购物车列表页面展示
3.2.1 页面url剖析
阐明:当用户点击购物车按钮时,须要跳转到购物车展示页面. cart.jsp
页面取值: ${cartList}
要求: 只查问userId=7的购物车列表信息.之后进行页面展示
3.2.2 编辑CartController
`package com.jt.controller;import com.alibaba.dubbo.config.annotation.Reference;import com.jt.pojo.Cart;import com.jt.service.DubboCartService;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import java.util.List;@Controller@RequestMapping("/cart")public class CartController { @Reference(timeout = 3000,check = false) private DubboCartService cartService; /** * 业务需要: 依据userId查问购物车数据 * url地址: http://www.jt.com/cart/show.html * 申请参数: 动静获取userId * 返回值后果: cart.jsp页面 * 页面取值形式: ${cartList} */ @RequestMapping("/show") public String findCartListByUserId(Model model){ Long userId = 7L; List<Cart> cartList = cartService.findCartListByUserId(userId); model.addAttribute("cartList",cartList); return "cart"; }}`
3.2.3 编辑CartService
`package com.jt.service;import com.alibaba.dubbo.config.annotation.Service;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.jt.mapper.CartMapper;import com.jt.pojo.Cart;import org.springframework.beans.factory.annotation.Autowired;import java.util.List;@Servicepublic class DubboCartServiceImpl implements DubboCartService{ @Autowired private CartMapper cartMapper; @Override public List<Cart> findCartListByUserId(Long userId) { QueryWrapper<Cart> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", userId); return cartMapper.selectList(queryWrapper); }}`
3.2.4 页面成果展示
3.3 购物车数量的批改
3.3.1 业务阐明
3.3.2 页面JS剖析
3.3.3 编辑CartController
`/** * 业务: 实现购物车数量的更新 * url: http://www.jt.com/cart/update/num/562379/12 * 参数: itemId/num * 返回值: void */ @RequestMapping("/update/num/{itemId}/{num}") @ResponseBody //1.返回值转化为json 2.ajax完结标识 public void updateCartNum(Cart cart){ //key名称必须与属性的名称统一. Long userId = 7L; cart.setUserId(userId); cartService.updateCartNum(cart); }`
3.3.4 编辑CartService
`@Override public void updateCartNum(Cart cart) { //cartMapper.updateCartNum(cart); //1.筹备批改的数据 依据对象中不为null的元素当做set条件 Cart cartTemp = new Cart(); cartTemp.setNum(cart.getNum()); //2.依据对象中不为null的元素当做where条件 UpdateWrapper<Cart> updateWrapper = new UpdateWrapper<>(cart.setNum(null)); /*updateWrapper.eq("user_id", cart.getUserId()) .eq("item_id", cart.getItemId());*/ cartMapper.update(cartTemp,updateWrapper); }`
3.3.5 编辑CartMapper
`public interface CartMapper extends BaseMapper<Cart> { @Update("update tb_cart set num = #{num},updated=now() where user_id=#{userId} and item_id=#{itemId}") void updateCartNum(Cart cart);}` * 1* 2* 3* 4
3.4 购物车新增
3.4.1 购物车新增业务
当用户点击购物车按钮时实现购物车入库操作. 如果用户反复加购则应该批改购物车商品的数量.
加购胜利之后,应该重定向到购物车列表页面.
3.4.2 页面剖析
3.4.3 页面表单提交
`<form id="cartForm" method="post"> <input class="text" id="buy-num" name="num" value="1" onkeyup="setAmount.modify('#buy-num');"/> <input type="hidden" class="text" name="itemTitle" value="${item.title }"/> <input type="hidden" class="text" name="itemImage" value="${item.images[0]}"/> <input type="hidden" class="text" name="itemPrice" value="${item.price}"/> </form>`
3.4.4 页面JS解析
`<a class="btn-append " id="InitCartUrl" onclick="addCart();" clstag="shangpin|keycount|product|initcarturl">退出购物车<b></b></a>//利用post传值 function addCart(){ var url = "http://www.jt.com/cart/add/${item.id}.html"; document.forms[0].action = url; //js设置提交链接 document.forms[0].submit(); //js表单提交 }`
3.4.5 编辑CartController
`/** * 实现购物车新增 * url: http://www.jt.com/cart/add/562379.html * 参数: form表单提交 对象接管 * 返回值: 重定向到购物车列表页面中 */ @RequestMapping("/add/{itemId}") public String saveCart(Cart cart){ Long userId = 7L; cart.setUserId(userId); cartService.saveCart(cart); return "redirect:/cart/show.html"; }`
3.4.6 编辑CartService
`/** * 如果反复加购则更新数量 * 1.查问是否曾经有改数据 user_id/item_id */ @Override public void saveCart(Cart cart) { QueryWrapper<Cart> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("user_id", cart.getUserId()) .eq("item_id", cart.getItemId()); Cart cartDB = cartMapper.selectOne(queryWrapper); if(cartDB == null){ //用户第一次加购 cartMapper.insert(cart); }else { //用户须要批改数量 int num = cart.getNum() + cartDB.getNum(); cart.setNum(num); cartMapper.updateCartNum(cart); } }`