13项目讲义品优购课程v_第1页
13项目讲义品优购课程v_第2页
13项目讲义品优购课程v_第3页
13项目讲义品优购课程v_第4页
13项目讲义品优购课程v_第5页
已阅读5页,还剩26页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、品优购系统开发第 5 章商品录入【1】传智播客.程序员北京市昌平区建材城西路龙办公楼一层:课程目标目标 1:完成商品分类功能目标 2:了解概念 SPU 和 SKU目标 3:了解富文本编辑器的使用目标 4:掌握上传服务器 FastDFS 使用目标 5:了解 angularJS 图片上传1.商品分类1.1 需求及表结构分析1.1.1 需求分析实现三级商品分类列表功能进入页面首先显示所有一级分类,效果如下:点击列表行的下级按钮,进入下级分类列表,同时更新面包屑导航再次点击表头的表中不显示下级按钮,进入三级分类列表,因为三级分类属于最后一级,所以在列下级按钮,同时更新面包屑导航北京市昌平区建材城西路龙

2、办公楼一层:点击面包屑导航,可以进行返回操作。1.1.2 表结构分析tb_item_cat商品分类表1.2 列表实现1.2.1 后端代码修改 interface 工程 ItemCatService 接口,新增定义修改 sellergoods-service 工程 ItemCatServiceImpl,实现北京市昌平区建材城西路龙办公楼一层:/*/* 根据ID 返回列表* return*/public List<TbItemCat> findByParentId(Long parentId);字段类型长度含义IdBigint主键Parent_idBigintIDNamevarchar

3、分类名称Type_idBigint类型模板 ID修改 manager-web 的 ItemCatController.java1.2.2 前端代码(1)修改 itemCatService.js北京市昌平区建材城西路龙办公楼一层:/根据ID下级列表/* 根据ID列表* param parentId* return*/ RequestMapping("/findByParentId")public List<TbItemCat> findByParentId(Long parentId)return itemCatService.findByParentId(par

4、entId);* 根据ID列表*/ Overridepublic List<TbItemCat> findByParentId(Long parentId) TbItemCatExample example1=new TbItemCatExample(); Criteria criteria1 = example1.createCriteria(); criteria1.andParentIdEqualTo(parentId);return itemCatMapper.selectByExample(example1);(2)修改 itemCatController.js(3)修改

5、 item_cat.html引入 JS指令定义循环列表北京市昌平区建材城西路龙办公楼一层:<bodyclass="hold-transitionskin-redsidebar-mini"ng-app="pinyougou" ng-controller="itemCatController" ng-init="findByParentId(0)"><script type="text/javascript" src="./plugins/angularjs/angula

6、r.min.js"> </script><script type="text/javascript" src="./js/base.js"> </script><script type="text/javascript" src="./js/service/itemCatService.js"> </script><script type="text/javascript" src="./js/contr

7、oller/baseController.js"> </script><scripttype="text/javascript"src="./js/controller/itemCatController.js"></script>/根据ID 显示下级列表$scope.findByParentId=function(parentId) itemCatService.findByParentId(parentId).success(function(response)$scope.list=respons

8、e;);this.findByParentId=function(parentId)return $http.get('./itemCat/findByParentId.do?parentId='+parentId);1.3 新增商品分类(学员实现)实现商品分类,如下图:当前显示的是哪一分类的列表,我们就将这个商品分类新增到这个分类下。实现思路:我们需要一个变量去记住ID,在保存的时候再根据这个 ID 来新增分类修改 itemCatController.js,定义变量北京市昌平区建材城西路龙办公楼一层:<tr ng-repeat="entity in list&

9、quot;><td><input type="checkbox" ></td><td>entity.id</td><td></td><td>entity.typeId</td><td class="text-center"><button type="button" class="btn bg-olive btn-xs"ng-click="findByP

10、arentId(entity.id)">下级</button><button type="button" class="btn bg-olive btn-xs" data-toggle="modal" data-target="#editModal" >修改</button></td></tr>时ID保存的时候,用到此变量北京市昌平区建材城西路龙办公楼一层:/保存$scope.save=function()var serviceObject

11、;/服务层对象if($scope.entity.id!=null)/如果有 ID serviceObject=itemCatService.update( $scope.entity ); /修改else$scope.entity.parentId=$scope.parentId;/赋予ID serviceObject=itemCatService.add( $scope.entity );/增加serviceObject.success(function(response)/根据ID 显示下级列表$scope.findByParentId=function(parentId)$scope.p

12、arentId=parentId;/记住ID itemCatService.findByParentId(parentId).success(function(response)$scope.list=response;);$scope.parentId=0;/ID修改页面 item_cat.html北京市昌平区建材城西路龙办公楼一层:<div class="modal-body"><table class="table table-bordered table-striped" width="800px">&

13、lt;tr><td>商品分类</td><td>entity_1.name >> entity_2.name</td></tr><tr><td>商品分类名称</td><td><input class="form-control" ng-m="" placeholder="商品分类名称"> </td></tr><tr>if(response.su

14、ccess)/重新$scope.findByParentId($scope.parentId);/重新加载elsealert(response.message););实现类型模板下拉列表的代码略1.4 修改商品分类(学员实现)修改 item_cat.html 的修改按钮概念及表结构分析2.2.1概念 SPU 与 SKUSPU = Standard Product Unit (标准)SPU 是商品信息聚合的最小,是一组可复用、易检索的标准化信息的集合,该集合描述了一个的特性。北京市昌平区建材城西路龙办公楼一层:<buttontype="button"class=&quo

15、t;btnbg-olivebtn-xs"data-toggle="modal" data-target="#editModal" ng-click="findOne(entity.id)">修改</button><td>类型模板</td><td><input ng-m="entity.typeId" placeholder="商品类型模板" class="form-control" type="t

16、ext"/></td></tr></table></div><div class="modal-footer"><button class="btn btn-success" data-dismiss="modal" aria-hidden="true" ng-click="save()">保存</button><button class="btn btn-default"

17、; data-dismiss="modal" aria-hidden="true">关闭</button></div>通俗点讲,属性值、特性相同的商品就可以称为一个 SPU。例如:7 就是一个 SPU,与商家,与颜色、款式、套餐都无关。SKU=stock keeping unit(库存量)SKU 即库存进出计量的, 可以是以件、盒、托盘等为。SKU 是物理上不可分割的最小存货单元。在使用时要根据不同业态,不同管理模式来处理。在服装、鞋类商品中使用最多最普遍。例如:纺织品中一个 SKU 通常表示:规格、颜色、款式。2.2 表结

18、构分析Tb_goods 商品表3.商家-商品录入【基本功能】3.1 需求分析在商家实现商品录入功能。商品名称、副标题、价格、包装列表、售后服务北京市昌平区建材城西路龙办公楼一层:3.2 后端代码3.2.1 实体类创建组合实体类 goods3.2.2 数据层由于我们需要在商品表添加数据后可以得到自增的中的 insert 配置中添加如下配置ID,所以我们需要在 TbGoodsMapper.xml北京市昌平区建材城西路龙办公楼一层:<selectKey resultType="java.lang.Long" order="AFTER" keyProper

19、ty="id"> SELECT LAST_INSERT_ID() AS id</selectKey>public class Goods implements Serializableprivate TbGoods goods;/商品SPUprivate TbGoodsDesc goodsDesc;/商品扩展private List<TbItem> itemList;/商品SKU 列表/getter and setter.3.2.3 服务接口层修改 interface 的 GoodsService 接口 add3.2.4 服务实现层修改 sel

20、lergoods-service 的 GoodsServiceImpl.java3.2.5层修改 pinyougou-shop-web 工程的 GoodsController 的 add北京市昌平区建材城西路龙办公楼一层:Autowiredprivate TbGoodsDescMapper goodsDescMapper;/* 增加*/ Overridepublic void add(Goods goods) goods.getGoods().setAuditStatus("0");/设置未申请状态goodsMapper.insert(goods.getGoods();go

21、ods.getGoodsDesc().setGoodsId(goods.getGoods().getId();/设置ID goodsDescMapper.insert(goods.getGoodsDesc();/商品扩展数据/* 增加*/public void add(Goods goods);3.3 前端代码3.3.1层修改 goodsController.js ,在增加后弹出提示,并清空实体(因为编辑页面无列表)北京市昌平区建材城西路龙办公楼一层:/* 增加* param goods* return*/ RequestMapping("/add")public Resu

22、lt add(RequestBody Goods goods)/获取登录名String sellerId =SecurityContextHolder.getContext().getAuthentication().getName(); goods.getGoods().setSellerId(sellerId);/设置商家 IDtry goodsService.add(goods);return new Result(true, "增加"); catch (Exception e) e.printStackTrace();return new Result(false,

23、 "增加失败");3.3.2 页面修改 goods_edit.html引入 JS:定义器:北京市昌平区建材城西路龙办公楼一层:<bodyclass="hold-transitionskin-redsidebar-mini"ng-app="pinyougou"<script type="text/javascript" src="./plugins/angularjs/angular.min.js"> </script><script type="te

24、xt/javascript" src="./js/base.js"> </script><script type="text/javascript" src="./js/service/goodsService.js"> </script><script type="text/javascript" src="./js/controller/baseController.js"> </script><script

25、type="text/javascript" src="./js/controller/goodsController.js"> </script>/保存$scope.add=function()goodsService.add( $scope.entity ).success(function(response) if(response.success)alert('保存');$scope.entity=;elsealert(response.message););表单部分代码:北京市昌平区建材城西路龙办公楼一层:&l

26、t;div class="col-md-2 title">商品名称</div><div class="col-md-10 data"><input type="text" class="form-control" ng-m="entity.goods.goodsName" placeholder="商品名称" value=""></div><div class="col-md-2 tit

27、le">副标题</div><div class="col-md-10 data"><input type="text" class="form-control" ng-m="entity.goods.caption" placeholder="副标题" value=""></div><div class="col-md-2 title">价格</div><div

28、class="col-md-10 data"><div class="input-group"><span class="input-group-addon">¥</span><input type="text" class="form-control" ng-m="entity.goods.price" placeholder="价格" value=""></div

29、></div><div class="col-md-2 title rowHeight2x">包装列表</div><div class="col-md-10 data rowHeight2x"><textarea rows="4" class="form-control" ng-m="entity.goodsDesc.packageList" placeholder="包装列表"></textarea&g

30、t;</div>ng-controller="goodsController">保存按钮4.商家-商品录入【商品】4.1 需求分析实现商品的录入,要求使用富文本编辑器4.2 富文本编辑器富文本编辑器,Rich Text Editor, 简称用的富文本编辑器:RTE, 它提供类似于的编辑功能。常Microsoft WordKindEditorUEditorCKEditor北京市昌平区建材城西路龙办公楼一层:<button class="btn btn-primary" ng-click="add()">&l

31、t;i class="fa fa-save"></i> 保存 </button><div class="col-md-2 title rowHeight2x">售后服务</div><div class="col-md-10 data rowHeight2x"><textarea rows="4" class="form-control" ng-m="entity.goodsDesc.saleService"

32、; placeholder="售后服务"></textarea></div>4.3 使用 kindeditor 完成商品的录入4.3.1 初始化 kindeditor 编辑器在页面中添加 JS 代码,用于初始化 kindeditorallowFileManager 【是否浏览服务器上传文件】默认值是:false4.3.2 提取 kindeditor 编辑器的内容在 goodsController.js 中的 add()中添加北京市昌平区建材城西路龙办公楼一层:/增加商品$scope.add=function()$scope.entity.goo

33、dsDroduction=editor.html(); goodsService.add( $scope.entity ).success(function(response) if(response.success)alert("新增");$scope.entity=;elsealert(response.message););<script type="text/javascript"> var editor; KindEditor.ready(function(K) editor = K.create('texta

34、reaname="content"', allowFileManager : true););</script>4.3.3 清空 kindeditor 编辑器的内容修改 goodsController.js 的 add5.分布式文件服务器 FastDFS5.1 什么是 FastDFSFastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注用、高性能等指标,使用FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、等服务。FastDFS 架构Tracker

35、server 和 Storage server。客户端请求Tracker server 进行文件上传、,通过Tracker server 调度最终由 Storage server 完成文件上传和。Tracker server 作用是负载均衡和调度,通过 Tracker server 在文件上传时可以根据一些策略找到 Storage server 提供文件上传服务。可以将 tracker 称为追踪服务器或调度服务器。Storage server 作用是文件,客户端上传的文件最终在 Storage 服务器上,Storageserver 没有实现的文件系统而是利用操作系统 的文件系统来管理文件。可以

36、将storage 称为服务器。北京市昌平区建材城西路龙办公楼一层:/增加商品$scope.add=function()$scope.entity.goodsDroduction=editor.html();goodsService.add( $scope.entity ).success(function(response) if(response.success)alert("新增");$scope.entity=; editor.html("");/清空富文本编辑器elsealert(response.message););服务端两个:

37、Tracker:管理集群,tracker集群的状态。也可以实现集群。每个 tracker 节点地位平等。收集 StorageStorage:实际保存文件Storage 分为多个组,每个组之间保存的文件是不同的。每个组以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有主从的概念。北京市昌平区建材城西路龙办公楼一层:5.2 最简单的FastDFS架构5.3 FastDFS 安装FastDFS 安装步骤非常繁琐,我们在课程中不做。已经提供单独的FastDFS 安装部署文档供学员们课后阅读。为了能够快速的搭建 FastDFS 环境进行代码开发,我们这里提供了安装好的镜像。解压“/L

38、inux 镜像/fastDFS/pinyougou-image-server.zip”,双击 vmx 文件,然后启动。注意:遇到下列提示选择“我已移动该虚拟机”!IP 地址已经固定为 28,请设置你的仅主机网段为 200。北京市昌平区建材城西路龙办公楼一层:登录名为 root为 itcast5.4 测试是否启动5.5 FastDFS 入门小 Demo需求:将本地图片上传至图片服务器,再台打印 url(1)创建 Maven 工程 fastDFSdemo由于 FastDFS 客户端 jar 包并没有在仓库中,所以需要使用下列命令手动安装 jar 包到Maven 本地仓库(

39、将 jar 包放到 d 盘 setup 目录)课程配套的本地仓库已经有此 jar 包,此步可省略。新建 maven 项目 fastDFSDemo 在 pom.xml 中引入(2)添加配置文件 fdfs_client.conf ,将其中的服务器地址设置为 28北京市昌平区建材城西路龙办公楼一层:# connect timeout in seconds # default value is 30s connect_timeout=30# network timeout in seconds # default value is 30s network_timeout=60

40、# the base path to store log files<dependency><groupId>org.csource.fastdfs</groupId><artifactId>fastdfs</artifactId><version>1.2</version></dependency>mvninstall:install-file-DgroupId=org.csource.fastdfs-DartifactId=fastdfs-Dversion=1.2-Dpackaging=jar

41、-Dfile=d:setupfastdfs_client_v1.20.jar北京市昌平区建材城西路龙办公楼一层:base_path=/home/fastdfs# tracker_server can ocur more than once, and tracker_server format is # "host:port", host can be hostname or ip address tracker_server=28:22122#standard log level as syslog, case insensitive, value

42、 list: # emerg for emergency# alert# crit for critical # error# warn for warning # notice# info # debuglog_level=info# if use connection pool # default value is false # since V4.05use_connection_pool = false# connections whose the idle time exceeds this time will be closed # unit: second# default va

43、lue is 3600 # since V4.05connection_pool_max_idle_time = 3600# if load FastDFS parameters from tracker server # since V4.05# default value is false load_fdfs_parameters_from_tracker=false# if use storage ID instead of IP address # same as tracker.conf# valid only when load_fdfs_parameters_from_track

44、er is false # default value is false# since V4.05 use_storage_id = false# specify storage ids filename, can use relative or absolute path # same as tracker.conf# valid only when load_fdfs_parameters_from_tracker is false# since V4.05(3)创建 java 类,main代码如下:台输出如下结果:在浏览器输入:北京市昌平区建材城西路龙办公楼一层:group1M00/00

45、/00/wKgZhVkMP4KAZEy-AAA-tCf93Fo973.jpg/ 1、加载配置文件,配置文件中的内容就是 tracker 服务的地址。ClientGlobal.init("D:itcastworkspaceMarsfastDfsDemosrcmainresourcesfdfs_client.conf");/ 2、创建一个 TrackerClient 对象。直接 new 一个。TrackerClient trackerClient = new TrackerClient();/ 3、使用 TrackerClient 对象创建连接,获得一个 TrackerServ

46、er 对象。TrackerServer trackerServer = trackerClient.getConnection();/ 4、创建一个 StorageClient 对象,需要两个参数 TrackerServer 对象、StorageServer 的StorageClient1 storageClient = new StorageClient1(trackerServer, null);/ 5、使用 StorageClient 对象上传图片。/扩展名不带“.”String path = storageClient.upload_file1("E:image.jpg&qu

47、ot;, "jpg", null);/ 6、包含组名和图片的路径。System.out.println(path);storage_ids_filename = storage_ids.conf#HTTP settings http.tracker_server_port=80#use "#include" directive to include HTTP other settiongs #include http.conf6.商家-商品录入【商品图片上传】6.1 需求分析在商品录入界面实现多图片上传当用户点击新建按钮,弹出上传窗口6.2 后端代码6.

48、2.1 工具类将“03 配置文件/工具类/util”的 FastDFSClient.java拷贝到 pinyougou-common 工程北京市昌平区建材城西路龙办公楼一层:6.2.2 配置文件(1)将“03 配置文件第一天搭建shop-webresources”文件夹中的pinyougou-shop-web 工程 src/main/resources 文件夹fastDFS 目录拷贝到(2)在 pinyougou-shop-web 工程 perties 添加配置(3)在 pinyougou-shop-web 工程 springmvc.xml 添加配置:6.2.3层

49、在 pinyougou-shop-web 新建 UploadController.java北京市昌平区建材城西路龙办公楼一层:package com.pinyougou.shop.controller;import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.spr

50、ingframework.web.multipart.MultipartFile;import entity.Result;<!- 配置多器 -><bean id="multipartResolver" class="mons.CommonsMultipartResolver"><property name="defaultEncoding" value="UTF-8"></property><!- 设定文件上传的最大值 5MB,5*1024*1024 ->

51、;<property name="maxUploadSize" value="5242880"></property></bean>FILE_SERVER_URL=北京市昌平区建材城西路龙办公楼一层:import util.FastDFSClient;/* 文件上传Controller* author Administrator*/ RestControllerRequestMapping("/upload")public class UploadController Value("$FI

52、LE_SERVER_URL")private String FILE_SERVER_URL;/文件服务器地址RequestMapping("/uploadFile")public Result upload( MultipartFile file)/1、取文件的完整名称String fileName = file.getOriginalFilename();try /2、创建一个 FastDFS 的客户端FastDFSClient fastDFSClient = newFastDFSClient("classpath:config/fdfs_client

53、.conf");/3、执行上传处理String path = fastDFSClient.uploadFile(file.getBytes(), fileName, file.getSize();/4、拼接返回的 url 和 ip 地址,拼装成完整的 url String url = FILE_SERVER_URL + path;return new Result(true,url); catch (Exception e) 6.3 前端代码6.3.1 服务层(1)在 pinyougou-shop-web 工程创建 uploadService.js北京市昌平区建材城西路龙办公楼一层:

54、/文件上传服务层app.service("uploadService",function($http)this.uploadFile=function()var formData=new FormData(); formData.append("file",file.files0); return $http(method:'POST', url:"./upload/uploadFile.do", data: formData,headers: 'Content-Type':undefined, tra

55、nsformRequest: angular.identity);e.printStackTrace();return new Result(false, "上传失败");anjularjs 对于 post 和 get 请求默认的 Content-Type header 是 application/json。通过设置Content-Type: undefined,这样浏览器会帮我们把 Content-Type 设置为 multipart/form-data.通过设置 transformRequest: angular.identity ,anjularjs transfor

56、mRequest function我们的 formdata object.将序列化(2)将 uploadService 服务注入到 goodsController中(3)在 goods_edit.html 引入 js6.3.2 上传图片(1)goodsController 编写代码北京市昌平区建材城西路龙办公楼一层:/* 上传图片*/$scope.uploadFile = function()/ 调用uploadService的完成文件的上传<script type="text/javascript" src="./js/base.js">

57、</script><script type="text/javascript" src="./js/service/goodsService.js"> </script><script type="text/javascript" src="./js/service/itemCatService.js"> </script><script type="text/javascript" src="./js/service/

58、uploadService.js"> </script><script type="text/javascript" src="./js/controller/baseController.js"> </script><script type="text/javascript" src="./js/controller/goodsController.js"> </script>/商品层(商家)app.controller('goo

59、dsController' ,function($scope,$controller,goodsService,itemCa tService,uploadService);(2)修改图片上传窗口,调用上传,上传图片北京市昌平区建材城西路龙办公楼一层:<div class="modal-body"><table class="table table-bordered table-striped"><tr><td>颜色</td><td><input class="form-control" placeholder="颜色" ng-m="image_entity.color"> </td></tr><tr><td>商品图片</td><td><table><tr><td>

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论