淘淘商城第十一天
1第十天内容回顾
1、单点登录系统
a)分布式环境下session共享。
b)Session放到redis中。
c)使用uuid生成一个token
d)Token放到cookie中。
e)根据token或用户信息。
2、sso系统集成portal
a)用户登录注册功能都跳转到sso系统。
b)登录完成后跳转首页。
c)首页需要在加载完成后,需要从cookie中取token,调用sso系统的服务(jsonp)
根据token查询用户信息,把用户名显示到首页。
d)使用拦截器实现用户强制登录。
e)回调页面的实现
2课程计划
1、购物车的实现
2、订单系统的实现。
3购物车
3.1 分析
1、添加购物车不需要用户登录。购物车的数据应该放到cookie中。
2、当向购物车添加同一款商品时,购物车中商品的数量增加。
3、购物车中可以删除商品
4、购物车中可以修改商品数量。商品的总价需要重新计算。
5、点击“结算”按钮要求用户登录。
3.2 添加购物车
3.2.1分析
请求的url:/cart/add/${itemId}.html
1、接收商品id,根据商品id取商品的图片、title、单价,需要包含商品的数量。并且把数据保存到列表中。
2、把商品数据转换成json数据,保存到cookie中。对购物车数据进行转码。
3、展示添加购物车成功页面。
3.2.2Service
参数:
1、商品id
2、商品数量
业务逻辑:
1、接收商品id
2、从cookie中购物车商品列表
3、从商品列表中查询列表是否存在此商品
4、如果存在商品的数量加上参数中的商品数量
5、如果不存在,调用rest服务,根据商品id获得商品数据。
6、把商品数据添加到列表中
7、把购物车商品列表写入cookie
8、返回TaotaoResult
返回值:TaotaoResult
购物车商品POJO:
publicclass CartItem {
private Long id;
private String title;
private Long price;
private Integer num;
private String image;
}
@Service
publicclass CartServiceImpl implements CartService {
@Autowired
private ItemService itemService;
@Value("${COOKIE_EXPIRE}")
private Integer COOKIE_EXPIRE;
@Override
public TaotaoResult addCart(Long itemId, Integer num,
HttpServletRequest request, HttpServletResponse response) { // 1、接收商品id
// 2、从cookie中购物车商品列表
List
// 3、从商品列表中查询列表是否存在此商品
boolean haveFlg = false;
for (CartItem cartItem : itemList) {
//如果商品存在数量相加
// 4、如果存在商品的数量加上参数中的商品数量
if (cartItem.getId().longValue() == itemId) {
cartItem.setNum(cartItem.getNum() + num);
haveFlg = true;
break;
}
}
// 5、如果不存在,调用rest服务,根据商品id获得商品数据。
if (!haveFlg) {
TbItem item = itemService.getItemById(itemId);
//转换成CartItem
CartItem cartItem = new CartItem();
cartItem.setId(itemId);
cartItem.setNum(num);
cartItem.setPrice(item.getPrice());
cartItem.setTitle(item.getTitle());
if (StringUtils.isNotBlank(item.getImage())) {
String image = item.getImage();
String[] strings = image.split(",");
cartItem.setImage(strings[0]);
}
//添加到购物车商品列表
// 6、把商品数据添加到列表中
itemList.add(cartItem);
}
// 7、把购物车商品列表写入cookie
CookieUtils.setCookie(request, response, "TT_CART", JsonUtils.objectToJson(itemList), COOKIE_EXPIRE, true);
// 8、返回TaotaoResult
return TaotaoResult.ok();
}
/**
* 取购物车商品列表
*
Title: getCartItemList
*
Description:
* @param request
* @return
*/
private List
//从cookie中取商品列表
String json = CookieUtils.getCookieValue(request, "TT_CART", true);
//把json转换成java对象
List
return list==null?new ArrayList
} catch (Exception e) {
returnnew ArrayList
}
}
}
3.2.3Controller
请求的url:/cart/add/{itemId}.html?num=1
接收两个参数:
1、商品id
2、商品数量
调用Service添加到购物车
返回jsp页面,添加成功页面。
@Controller
publicclass CartController {
@Autowired
private CartService cartService;
@RequestMapping("/cart/add/{itemId}")
public String addCart(@PathVariable Long itemId, Integer num,
HttpServletResponse response, HttpServletRequest request) { TaotaoResult result = cartService.addCart(itemId, num, request, response);
return"cartSuccess";
}
}
3.2.4Jsp
3.3 展示购物车商品列表
3.3.1分析
请求的url:/cart/cart
没有参数。
从cookie中取购物车商品列表,在页面展示。
Jsp页面需要一购物车商品列表即可。
3.3.2Service
没有参数,直接从cookie中取购物车商品列表返回。
返回值:List
@Override
public List
return list;
}
3.3.3Controller
接收请求,请求的url:/cart/cart
调用Service取商品列表,传递给jsp。
@RequestMapping("/cart/cart")
public String showCartList(HttpServletRequest request, Model model) { List
//把商品列表传递给jsp
model.addAttribute("cartList", list);
return"cart";
}
3.4 修改购物车商品数量
3.4.1分析
修改商品数量js:
请求的url:/cart/update/num/{itemId}/{num}.action
1、把购物车商品列表从cookie中取出来
2、根据itemId找到对应的商品
3、使用参数中的数量更新数量。
4、需要把购物车商品列表写回cookie。
5、返回json数据
3.4.2Service层
接收两个参数:
1、商品id
2、商品数量
业务逻辑:
1、把购物车商品列表从cookie中取出来
2、根据itemId找到对应的商品
3、使用参数中的数量更新数量。
4、需要把购物车商品列表写回cookie。
5、返回TaotaoResult
@Override
public TaotaoResult updateCartItem(long itemId, Integer num, HttpServletRequest request, HttpServletResponse response) {
// 从cookie中取购物车商品列表
List
//根据商品id查询商品
for (CartItem cartItem : itemList) {
if (cartItem.getId() == itemId) {
//更新数量
cartItem.setNum(num);
break;
}
}
//写入cookie
CookieUtils.setCookie(request, response, "TT_CART", JsonUtils.objectToJson(itemList), COOKIE_EXPIRE, true);
return TaotaoResult.ok();
}
3.4.3Controller
请求的url:/cart/update/num/{itemId}/{num}.action
从url中取两个参数,调用Service更新商品数量。
返回TaotaoResult。(返回json格式的数据)
@RequestMapping("/cart/update/num/{itemId}/{num}")
@ResponseBody
public TaotaoResult updateCartItemNum(@PathVariable Long itemId, @PathVariable Integer num, HttpServletResponse response, HttpServletRequest request) {
TaotaoResult result = cartService.updateCartItem(itemId, num, request, response);
return result;
}
3.5 删除购物车商品
3.5.1分析
需要的参数是商品id,根据商品id删除cookie中的商品列表中对应的商品。重新写入cookie。返回逻辑视图,购物车页面。
3.5.2Service
1、接收商品id
2、从cookie中取购物车商品列表
3、找到对应id的商品
4、删除商品。
5、再重新把商品列表写入cookie。
6、返回成功
参数:商品ID
返回值:TaotaoResult
@Override
public TaotaoResult deleteCartItem(long itemId, HttpServletRequest request, HttpServletResponse response) {
// 1、接收商品id
// 2、从cookie中取购物车商品列表
List
// 3、找到对应id的商品
for (CartItem cartItem : itemList) {
if (cartItem.getId() == itemId) {
// 4、删除商品。
itemList.remove(cartItem);
break;
}
}
// 5、再重新把商品列表写入cookie。
CookieUtils.setCookie(request, response, "TT_CART", JsonUtils.objectToJson(itemList), COOKIE_EXPIRE, true);
// 6、返回成功
return TaotaoResult.ok();
}
3.5.3Controller
接收商品id,调用Service删除商品,返回购物车页面。
请求的url:/cart/delete/{itemId}
@RequestMapping("/cart/delete/{itemId}")
public String deleteCartItem(@PathVariable Long itemId,
HttpServletResponse response, HttpServletRequest request) {
TaotaoResult result = cartService.deleteCartItem(itemId, request, response);
return"redirect:/cart/cart.html";
}
3.6 购物车畅想
1、未登录的情况下,可以把购物车写入cookie。
2、已经登录的情况下,需要把购物车写入redis
3、登录时判断cookie中有购物车商品,应该吧cookie中的购物车商品列表转移到redis中。
Key:用户id
Value:购物车商品列表
4、如果想redis中转移商品时,redis的购物车中已经有商品,此时,需要把商品合并。如果是同一款商品数量叠加,如果新商品就合并商品。
作业
4订单系统的实现
4.1 分析
1、订单确认页面,确认购买的商品、使用优惠券或积分、确认配送地址。
2、确认页面有一个订单提交按钮,点击按钮生成订单。
3、生成订单需要调用服务。需要发布一个生成订单服务。
需要创建一订单系统。
4.2 创建订单系统
需要直接使用关系数据库。
使用的技术:
Mybatis
Spring
Springmvc
Redis
可以参考taotao-rest创建。
4.2.1创建工程
4.2.2依赖的jar包
Pom.xml
xsi:schemaLocation="https://www.sodocs.net/doc/ac4692584.html,/POM/4.0.0 https://www.sodocs.net/doc/ac4692584.html,/xsd/maven-4.0.0.xsd">
4.2.3框架整合
参考taotao-rest
5创建订单服务
5.1 分析
1、接收json数据,需要使用@RequestBody注解。对应提交的json数据格式创建一个pojo 接收。
需要使用的表:
tb_order 订单表
tb_order_item 订单明细表
tb_order_shipping 物流表
可以使用订单相关的三个表对应的pojo封装一个pojo接收提交的json数据。
publicclass OrderInfo extends TbOrder{
private List
private TbOrderShipping orderShipping;
public List
return orderItems;
}
publicvoid setOrderItems(List
this.orderItems = orderItems;
}
public TbOrderShipping getOrderShipping() {
return orderShipping;
}
publicvoid setOrderShipping(TbOrderShipping orderShipping) {
this.orderShipping = orderShipping;
}
}
2、接收json数据后,把数据插入到响应的表中。
tb_order 订单表
tb_order_item 订单明细表
tb_order_shipping 物流表
订单号的生成:要求可读性号,不能太长应该是纯数字的。
1、Uuid
2、取毫秒
3、使用redis的incr命令(redis是单线程,不会重复)
补全订单的相关字段。
插入到响应的表中。
3、返回TaotaoResult其中包含订单号。
5.2 Dao层
向tb_order 订单表tb_order_item 订单明细表tb_order_shipping 物流表插入数据,可以使用逆向工程。
5.3 Service
一、插入订单表
1、接收数据OrderInfo
2、生成订单号
3、补全字段
4、插入订单表
二、插入订单明细
1、生成订单明细id,使用redis的incr命令生成。
2、补全字段
3、插入数据
三、插入物流表
1、补全字段
2、插入数据
四、返回TaotaoResult包装订单号。
参数:OrderInfo
返回值:TaotaoResult
@Service
publicclass OrderServiceImpl implements OrderService {
@Autowired
private TbOrderMapper orderMapper;
@Autowired
private TbOrderItemMapper orderItemMapper;
@Autowired
private TbOrderShippingMapper orderShippingMapper;
@Autowired
private JedisClient jedisClient;
@Value("${REDIS_ORDER_GEN_KEY}")
private String REDIS_ORDER_GEN_KEY;
@Value("${ORDER_ID_BEGIN}")
private String ORDER_ID_BEGIN;
@Value("${REDIS_ORDER_DETAIL_GEN_KEY}")
private String REDIS_ORDER_DETAIL_GEN_KEY;
@Override
public TaotaoResult createOrder(OrderInfo orderInfo) {
// 一、插入订单表
// 1、接收数据OrderInfo
// 2、生成订单号
//取订单号
String id = jedisClient.get(REDIS_ORDER_GEN_KEY);
if (StringUtils.isBlank(id)) {
//如果订单号生成key不存在设置初始值
jedisClient.set(REDIS_ORDER_GEN_KEY, ORDER_ID_BEGIN);
}
Long orderId = jedisClient.incr(REDIS_ORDER_GEN_KEY);
// 3、补全字段
orderInfo.setOrderId(orderId.toString());
//状态:1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭
orderInfo.setStatus(1);
Date date = new Date();
orderInfo.setCreateTime(date);
orderInfo.setUpdateTime(date);
// 4、插入订单表
orderMapper.insert(orderInfo);
// 二、插入订单明细
// 2、补全字段
List
for (TbOrderItem orderItem : orderItems) {
// 1、生成订单明细id,使用redis的incr命令生成。
Long detailId = jedisClient.incr(REDIS_ORDER_DETAIL_GEN_KEY);
orderItem.setId(detailId.toString());
//订单号
orderItem.setOrderId(orderId.toString());
// 3、插入数据
orderItemMapper.insert(orderItem);
}
// 三、插入物流表
TbOrderShipping orderShipping = orderInfo.getOrderShipping();
// 1、补全字段
orderShipping.setOrderId(orderId.toString());
orderShipping.setCreated(date);
orderShipping.setUpdated(date);
// 2、插入数据
orderShippingMapper.insert(orderShipping);
// 返回TaotaoResult包装订单号。
return TaotaoResult.ok(orderId);
}
}
5.4 Controller
发布服务。
接收客户端发送的数据,接收json格式的数据使用@RequestBody OrderInfo 来接收数据,调用Service生成订单,返回TaotaoResult。
@Controller
publicclass OrderController {
@Autowired
private OrderService orderService;
@RequestMapping(value="/order/create", method=RequestMethod.POST)
@ResponseBody
public TaotaoResult createOrder(@RequestBody OrderInfo orderInfo) {
try {
TaotaoResult result = orderService.createOrder(orderInfo);
return result;
} catch (Exception e) {
e.printStackTrace();
return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
}
}
}
6创建订单portal的处理
6.1 分析
1、显示订单确认页面
2、提交订单处理
6.2 显示订单确认页面
请求的url:/order/order-cart
1、商品数据从购物车中获得。
2、访问此页面要求用户登录。
3、需要根据用户id查询常用地址列表(待实现)。
6.2.1Service
可以使用购物车Service
6.2.2Controller
取购物车商品列表,传递给jsp。
@Controller
@RequestMapping("/order")
publicclass OrderController {
@Autowired
private CartService cartService;
@RequestMapping("/order-cart")
public String showOrderCart(Model model, HttpServletRequest request) { //取购物车商品列表
List
model.addAttribute("cartList", list);
return"order-cart";
}
}
6.3 提交订单
6.3.1处理分析
在订单确认页面点击“提交订单按钮”进行提交订单的处理。把表单的内容提交给taotao-portal的后台,后台调用taotao-order发布的服务生成订单。展示订单提交成功页面,并且展示订单号。
接收表单的内容:
使用OrderInfo来接收。
需要通过token取用户对象,使用userid和昵称
配置拦截器,在拦截器中把用户对象放入request。
6.3.2Service
接收表单的内容OrderInfo,调用taotao-order的服务,生成订单。提交数据格式是json格式。返回TaotaoResult,其中包含订单号,取出订单号,并返回。
参数:OrderInfo
返回值:String 订单号
@Service
publicclass OrderServiceImpl implements OrderService {
@Value("${ORDER_BASE_URL}")
private String ORDER_BASE_URL;
@Value("${ORDER_CREATE_URL}")
private String ORDER_CREATE_URL;
@Override
public String createOrder(OrderInfo orderInfo) {
//把OrderInfo转换成json
String json = JsonUtils.objectToJson(orderInfo);
//提交订单数据
String jsonResult = HttpClientUtil.doPostJson(ORDER_BASE_URL + ORDER_CREATE_URL, json);
//转换成java对象
TaotaoResult taotaoResult = TaotaoResult.format(jsonResult);
//取订单号
String orderId = taotaoResult.getData().toString();
return orderId;
}
}
6.3.3Controller
接收提交的订单信息,使用OrderInfo接收。调用Service创建订单,跳转到成功页面,并且把订单号传递给页面。
请求的url:/order/create
@RequestMapping(value="/create", method=RequestMethod.POST)
public String createOrder(OrderInfo orderInfo, Model model, HttpServletRequest request) { //取用户信息
TbUser user = (TbUser) request.getAttribute("user");
//补全orderIn的属性
orderInfo.setUserId(user.getId());
orderInfo.setBuyerNick(user.getUsername());
//调用服务
String orderId = orderService.createOrder(orderInfo);
//把订单号传递个页面
model.addAttribute("orderId", orderId);
model.addAttribute("payment", orderInfo.getPayment());
DateTime dateTime = new DateTime();
dateTime = dateTime.plusDays(3);
model.addAttribute("date", dateTime.toString("yyyy-MM-dd"));
//返回逻辑视图
return"success"; }
淘淘商城第六天1内容复习 1、前台系统的搭建 a)服务层 b)表现层 2、首页的展示 3、商品类目展示 a)使用ajax跨域调用服务。 b)使用jsonp实现 2课程计划 1、首页的内容展示:轮播图展示。 2、Cms系统的实现。 3、Taotao-rest发布服务。 4、表现层调用服务,展示轮播图。 3首页轮播图展示 3.1 首页内容管理思路 首页展示的内容都应该可以通过后台来管理。 1、内容的分组 2、分组下还可以有小组 3、广告项目中有图片 4、标题 5、价格 6、链接 7、内容 第一块:内容的分组管理,应该是一个树形结构。 第二块:内容管理。 图片、链接、标题、价格、内容。 使用两个表来保存内容数据: 1、内容分类表:
2、内容表: Cms系统:内容管理系统。
4内容分类管理 4.1 展示分类列表 4.1.1分析 初始化easyUI的tree控件url:/content/category/list 请求的参数:id,父节点id 返回结果:json数据(EasyUITreeNode列表) 是一个列表,列表中每个元素包含三个属性: 1、Id 2、Text 3、state 4.1.2Dao层 从tb_content_category表中取数据,根据parentid查询分类列表。可以使用逆向工程生成的代码。 4.1.3Service层 接收一个parentId,根据parentID查询节点列表。创建一个EasyUITreeNode列表。返回。参数: Long parentId 返回值:
List
[转] 广州服装批发内幕全攻略 广州服装货源进货内幕全攻略 众所周知,广州是全球闻名的服装和小商品批发地之一。但是在这块寸土寸金之地,同样有着不同的价格,作为一个生意人,一个长期的优质货源有多么重要不言而喻。我接触过许多外地来的朋友都抱怨:广州这么大,好货源哪里找呢?确实,即使是广州市内,也有很多挂羊头卖狗肉的地方,举个例子,我曾经在广园新村看见一个箱子40元,在一德路就卖180,还声称广州最低价!这是这两天亲眼看到的。同时,一笔经济账将外来的朋友压的喘不过气来,多数朋友选择在广州火车站商圈住宿,每天的住宿费动辄两三百元,加上其他费用,每天三百元是打不住的。就算如此,也很难清楚火车站商圈的货源,更别说更多有优质货源的其他地方了,好多朋友来了两天就草草的结束广州的“打货”之旅,不但没有找到优质的货源,反而要因此经常往返于广州真是得不偿失。根据我在广州1年的工作经验和同事朋友的帮助,加之我一直非常想跳出来做生意,可以说将广州各大批发市场跑的烂熟。今天就来整理一下广州服装货源,希望对寻找货源的新手们有所帮助,不敢说价格全国最低的,毕竟别人做生意也要赚钱,但是绝对全国绝大多数市场打货的主流集散地,为什么我敢这么说呢,因为我是武汉人,武汉有个华中批发重镇,天下第一街汉正街,相信各位也有所耳闻吧,但是相对这里的货源,价格还是不是一个档次的,我有些朋友做汉正街的都是跑到广州来拿货,有的甚至在白马拿货(白马的价格是比较高的),所以对于个体散户,今天列举的货源优势不言而喻。如果是大批发人士还是去中山的一些小镇小作坊拿货吧,1W件起打包不选款的那种,价格相当便宜。 1.广州火车站商圈 广州白马商圈:以火车站为依托,以外贸为旗号(当然确实不少外贸精品,这里老外也多嘿嘿。但我可以爆个内幕,俺朋友家里是做服装的,白马附近好多服装是沙河或者十三行的低档货,常常拿10来块的货在这边卖50,80甚至更多的也有),也包括往站西那边走的路上几个纯外贸服装的商城和火车站的地五大道,地下错综复杂的服装档口网络延续了数站路,出口有数十个之多,新手真的会在里面迷路,可惜这里面多是做老外的生意,中国人去了常常会被冷眼相待。这边的老板真的不愁生意,统一的特点就是有现货,他们囤积了大量的货,你在这边很难讲价的原因就是附近好多家都是一个老板的产业,他们将价格规定死了,我姨妈的朋友,她女儿就是这里的老板,每年从广州沙河拿几千万的货去澳大利亚卖,同时在这边有6间连着的档口,货源都是来自日本韩国,但是人家采取保密的态度也不太好打听。 这个商圈是许多学生卖家和年轻人喜欢打货的地点,因为一是离火车站进,没理由舍近求远的心理在作祟,还有就是这里的服装真的很吸引人,再加上穿着火辣态度热情的辣妹,很容易就敞开腰包认她们宰你温柔一刀了!每次看着一个个热火朝天在挑选衣物的靓妹们我都不禁从心底发出一声慧慈常用的惊叹:OH~MY GOD!~~~~很多人也许来广州好多次才能发现,这边的货回去跟当地的服装在价格上并没有很明显的优势,甚至价格上有过之而无不及,因为这边的货普遍特点就是靓而贵,而且基本上都是采取一个大店铺请许多靓妹的形式,所以也很难讲价。适合高档地段,目标人群起码是公司白领,对生活品质有一定追求的受众群体。如果是一些普通的地段,中低或者大众化群体消费的服装,真的不推荐在这里拿货。其实做生意的老手想想就知道了,火车站这种黄金地段,那种商业氛围下租金多少不言而喻,每年租金十几万甚至几十万的”小“店并不在少数。 作者评级:★★★ 理由:价格偏高并有少量以次充好 适合人群:以外贸为旗号,针对高中端,注重商品质量,销路十分通畅的卖家 普遍价格区间:100左右或以上每件 这里就是白马了,go,卡按靓女去咯
淘淘商城的第一天 1课程计划 一共14天课程 1、第一天:电商行业的背景。淘淘商城的介绍。搭建项目工程。Svn的使用。 2、第二天:框架的整合。后台管理商品列表的实现。分页插件。 3、第三天:后台管理。商品添加。商品类目的选择、图片上传、富文本编辑器的使用。 4、第四天:商品规格的实现。 5、第五天:商城前台系统的搭建。首页商品分类的展示。Jsonp。 6、第六天:cms系统的实现。前台大广告位的展示。 7、第七天:cms系统添加缓存。Redis。缓存同步。 8、第八天:搜索功能的实现。使用solr实现搜索。 9、第九天:商品详情页面的展示。 10、第十天:单点登录系统。Session共享。 11、第十一天:购物车订单系统的实现。 12、第十二天:nginx。反向代理工具。 13、第十三天:redis集群的搭建、solr集群的搭建。系统的部署。 14、项目总结。 今天的内容: 1、电商行业的背景。 2、淘淘商城的介绍。 3、工程项目的搭建。 4、Svn的使用。 2电商行业介绍 2.1 电商行业发展 近年来,中国的电子商务快速发展,交易额连创新高,电子商务在各领域的应用不断拓展和深化、相关服务业蓬勃发展、支撑体系不断健全完善、创新的动力和能力不断增强。电子商务正在与实体经济深度融合,进入规模性发展阶段,对经济社会生活的影响不断增大,正成为我国经济发展的新引擎。 中国电子商务研究中心数据显示,截止到2012年底,中国电子商务市场交易规模达7.85万亿人民币,同比增长30.83%。其中,B2B电子商务交易额达6.25万亿,同比增长27%。而2011年全年,中国电子商务市场交易额达6万亿人民币,同比增长33%,占GDP比重上
淘淘商城第四天 1第三天内容 1、nginx的反向代理、负载均衡 2、fastDFS,分布式文件系统。图片服务器。访问图片使用nginx+fastDFS的插件。 3、使用FastDFS的客户端上传图片。 4、图片上传功能实现。 5、Springmvc和spring父子容器。 2课程计划 1、富文本编辑器的使用KindEditor。 2、商品添加功能的实现。 3、规格参数的实现 3富文本编辑器的使用 3.1 使用方法 第一步:从KindEditor的官方网站下载源码。https://www.sodocs.net/doc/ac4692584.html,/demo.php 第二步:解压缩,把js源码添加到工程中。
第三步:把kindeditor-all-min.js引入到jsp中 第四步:把kindEditor的语言包引入到jsp 第五步:创建一个textArea控件,作为富文本编辑器的数据源。 第六步:编写js代码初始化KindEditor控件。需要指定textArea控件。 第七步:在提交表单之前,先把富文本编辑器中的内容同步到textArea控件中。
Sync()方法实现。 3.2 流行的编辑器 1、KindEditor 2、https://www.sodocs.net/doc/ac4692584.html,/website/ 3、Ckeditor https://www.sodocs.net/doc/ac4692584.html,/ 4商品添加的实现 4.1 分析 4.1.1数据库 相关的表:tb_item、tb_item_desc 执行insert操作,可以使用逆向工程生成的代码。商品id应该是一串数字。 可以使用毫秒+两位随机数生成一个id。 使用工具类:
4.1.2页面 提交请求的url:/item/save 请求的参数:表单中的内容。 可以生成如下格式的字符串: Name=zhangsan&password=123&id=szfda2313as 返回值: Json数据,应该包含一个status属性,代码状态码200正常。TaotaoResult 4.2 Dao层 可以使用逆向工程生成的代码。 4.3 Service层 1、接收TbItem对象,String desc 商品描述两个参数。 2、在TbItem对象中补全属性,包括id、status、create、update。 3、调用Mapper的insert方法插入数据。
淘淘商城第二天 1课程计划 商品列表的查询 1、框架整合springmvc+spring+mybatis 2、创建数据库 3、使用mybatis的逆向工程生成代码 4、商品列表功能实现 2创建数据库 使用mysql数据库。 在互联网行业的项目中尽可能的减少表的管理查询。使用冗余解决表的关联问题。有利于分库分表。 商品表:
Sku:最小库存量单位。就是商品id。就是商品最细力度的划分。每个sku都唯一对应一款商品,商品的颜色、配置都已经唯一确定。 3逆向工程 Mybatis的逆向工程。根据数据库表生成java代码。 注意:如果想再次生成代码,必须先将已经生成的代码删除,否则会在原文件中追加。
4Ssm框架整合 4.1 整合的思路 4.1.1Dao层 使用mybatis框架。创建SqlMapConfig.xml。 创建一个applicationContext-dao.xml 1、配置数据源 2、需要让spring容器管理SqlsessionFactory,单例存在。 3、把mapper的代理对象放到spring容器中。使用扫描包的方式加载mapper的代理对象。 4.1.2Service层 1、事务管理 2、需要把service实现类对象放到spring容器中管理。 4.1.3表现层 1、配置注解驱动 2、配置视图解析器 3、需要扫描controller 4.1.4Web.xml 1、spring容器的配置 2、Springmvc前端控制器的配置 3、Post乱码过滤器 4.2 框架整合 需要把配置文件放到taotao-manager-web工程下。因为此工程为war工程,其他的工程只是一个jar包。
淘淘商城第十一天 1第十天内容回顾 1、单点登录系统 a)分布式环境下session共享。 b)Session放到redis中。 c)使用uuid生成一个token d)Token放到cookie中。 e)根据token或用户信息。 2、sso系统集成portal a)用户登录注册功能都跳转到sso系统。 b)登录完成后跳转首页。 c)首页需要在加载完成后,需要从cookie中取token,调用sso系统的服务(jsonp) 根据token查询用户信息,把用户名显示到首页。 d)使用拦截器实现用户强制登录。 e)回调页面的实现 2课程计划 1、购物车的实现 2、订单系统的实现。 3购物车 3.1 分析 1、添加购物车不需要用户登录。购物车的数据应该放到cookie中。 2、当向购物车添加同一款商品时,购物车中商品的数量增加。 3、购物车中可以删除商品 4、购物车中可以修改商品数量。商品的总价需要重新计算。 5、点击“结算”按钮要求用户登录。 3.2 添加购物车 3.2.1分析 请求的url:/cart/add/${itemId}.html 1、接收商品id,根据商品id取商品的图片、title、单价,需要包含商品的数量。并且把数据保存到列表中。 2、把商品数据转换成json数据,保存到cookie中。对购物车数据进行转码。 3、展示添加购物车成功页面。
3.2.2Service 参数: 1、商品id 2、商品数量 业务逻辑: 1、接收商品id 2、从cookie中购物车商品列表 3、从商品列表中查询列表是否存在此商品 4、如果存在商品的数量加上参数中的商品数量 5、如果不存在,调用rest服务,根据商品id获得商品数据。 6、把商品数据添加到列表中 7、把购物车商品列表写入cookie 8、返回TaotaoResult 返回值:TaotaoResult 购物车商品POJO: publicclass CartItem { private Long id; private String title; private Long price; private Integer num; private String image; } @Service publicclass CartServiceImpl implements CartService { @Autowired private ItemService itemService; @Value("${COOKIE_EXPIRE}") private Integer COOKIE_EXPIRE; @Override public TaotaoResult addCart(Long itemId, Integer num, HttpServletRequest request, HttpServletResponse response) { // 1、接收商品id
淘淘商城第九天1第八天内容回顾 1、搜索系统的实现 a)发布搜索服务,pc、移动端都可以调用。 b)在portal中调用服务,实现搜索功能。 2、Solr提供的搜索服务。 a)Solr的集群 b)Solr集群的使用。 c)单机版使用HttpSolrServer。 d)集群版使用CloudSolrServer。 2课程计划 1、商品详情页面的展示 a)伪静态化(使用jsp动态展示) b)添加缓存,redis 2、网页静态化freemaker+nginx 3商品详情页面展示 3.1 分析 在搜索结果中点击商品图片或者title打开商品详情页面。
在Controller中从url中把商品id取出来,根据商品id查询对应的商品详细信息。 商品信息应该是调用服务来获得。需要在taotao-rest中发布服务。 Taotao-rest服务中根据商品id查询商品信息。 需要用到的表: 商品表:tb_item 商品详细信息:tb_item_desc 商品的规格参数:tb_item_param_item 应该发布三个服务:商品基本信息、取商品详情、取商品的规格参数。 3.2 发布服务 3.2.1商品基本信息服务 根据商品id取数据。商品表:tb_item 3.2.1.1 D ao层 使用逆向工程 3.2.1.2 S ervice层 接收商品id,根据商品id查询商品基本信息。返回商品基本信息的pojo——TbItem。 为了减轻数据库的压力,需要添加缓存。由于商品数据比较多,需要把用户访问的数据添加缓存中,同时需要设置商品数据的过期时间,根据时间情况调整,需要把过期时间放到配置文件中。 要设置过期时间redis中只能在key上设置。 使用String数据类型,为了便于分组可以使用“:”分隔的命名方式。 REDIS_ITEM:BASE_INFO:{ITEM_ID} @Service publicclass ItemServiceImpl implements ItemService {