u4 day03
index.jsp页面
/**
* 分页查询商品信息
* @param pageNow 当前页码
* @param pageSize 每页显示的信息条数
* @return 一页信息
* 注意导入pageHelper依赖
*/
PageInfo<EasybuyProduct> getProductPages(Integer pageNow,Integer pageSize);
1.2 common工程中,pager类
<!--实现serializable接口-->
属性: private Integer pageCount; //总的页数
private Long count; //总的信息条数
private String url; //当前要跳转的url地址
private Integer currentPage; //当前页码
private Integer pageSize; //每页显示的信息条数
方法:public Integer getPageCount() {
//直接将计算的结果返回
this.pageCount = (int)(count / pageSize);
if(count % pageSize != 0){
pageCount++;
}
return pageCount;
}
...省略getter setter
1.3 接口实现类
@Override
public PageInfo<EasybuyProduct> getProductPages(Integer pageNow, Integer pageSize) {
if(pageNow == null){
pageNow = 1; //默认是显示第一页
}
if(pageSize == null){
pageSize = 8; //默认每页展示8条信息
}
//开始分页
PageHelper.startPage(pageNow, pageSize);
//查询所有的商品
EasybuyProductExample example = new EasybuyProductExample();
//id进行降序排序
example.setOrderByClause("id desc");
List<EasybuyProduct> list = easybuyProductMapper.selectByExample(example);
//转换成pageInfo对象
PageInfo<EasybuyProduct> pageInfo = new PageInfo<>(list);
return pageInfo;
}
1.4控制层 controller
/**
* 进入到商品管理页面
*/
@RequestMapping(value="/product/list",method=RequestMethod.GET)
public String productList(@RequestParam(name="currentPage",required=false,defaultValue="1") Integer pageNow,
@RequestParam(name="pageSize",required=false,defaultValue="8")Integer pageSize,
Model model){
//获取到商品列表
PageInfo<EasybuyProduct> pageInfo = productService.getProductPages(pageNow, pageSize);
model.addAttribute("productList", pageInfo.getList());
Pager pager = new Pager();
pager.setCurrentPage(pageNow);
pager.setCount(pageInfo.getTotal());
pager.setPageSize(pageSize);
pager.setUrl("product/list?1=1");
model.addAttribute("pager", pager);
model.addAttribute("menu", 5);
return "productList";
}
2.新增
由jsp页面的需求–>controller需要传入的对象–>在接口中编写方法得到需要的对象–>相应的实现类
2.1 接口
public interface ProductCategoryService {
/**
* 根据父id查询分类列表
* @param parentId
* @return
*/
List<EasybuyProductCategory> getByParentId(Integer parentId);
/*
* 上架商品
*/
EasyBuyResult saveProduct(EasybuyProduct product);
}
2.2 接口实现类
//显示分级目录
@Service
public class ProductCategoryServiceImpl implements ProductCategoryService{
@Autowired
private EasybuyProductCategoryMapper easybuyProductCategoryMapper;
@Override
public List<EasybuyProductCategory> getByParentId(Integer parentId) {
EasybuyProductCategoryExample example = new EasybuyProductCategoryExample();
Criteria criteria = example.createCriteria();
criteria.andParentidEqualTo(parentId);
List<EasybuyProductCategory> list = easybuyProductCategoryMapper.selectByExample(example);
return list;
}
}
//productServiceImpl.java
@Service
public class ProductCategoryServiceImpl implements
ProductServic{
@Override
public EasyBuyResult saveProduct(EasybuyProduct product) {
try {
if(product.getId() == null){
//做的是上架操作
//新添加的商品默认是上架的
product.setIsdelete(0);
easybuyProductMapper.insert(product);
} else {
//做的是修改操作
easybuyProductMapper.updateByPrimaryKey(product);
}
return EasyBuyResult.ok();
} catch (Exception e) {
e.printStackTrace();
return EasyBuyResult.build(500, "商品上架是失败");
}
}
}
2.3 dubbo服务 ProductCategoryService接口的暴露
<dubbo:service interface="com.kgc.service.ProductCategoryService" ref="productCategoryServiceImpl"></dubbo:service>
2.4 springmvc.xml dubbo服务的引用
<dubbo:reference interface="com.kgc.service.ProductCategoryService" id="productCategoryService"></dubbo:reference>
2.5 common工程中添加 EasyBuyResult.java
package com.kgc.common.pojo;
import java.io.Serializable;
import java.util.List;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EasyBuyResult implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
// 响应业务状态
private Integer status;
// 响应消息
private String msg;
// 响应中的数据
private Object data;
public static EasyBuyResult build(Integer status, String msg, Object data) {
return new EasyBuyResult(status, msg, data);
}
public static EasyBuyResult ok(Object data) {
return new EasyBuyResult(data);
}
public static EasyBuyResult ok() {
return new EasyBuyResult(null);
}
public EasyBuyResult() {
}
public static EasyBuyResult build(Integer status, String msg) {
return new EasyBuyResult(status, msg, null);
}
public EasyBuyResult(Integer status, String msg, Object data) {
this.status = status;
this.msg = msg;
this.data = data;
}
public EasyBuyResult(Object data) {
this.status = 200;
this.msg = "OK";
this.data = data;
}
// public Boolean isOK() {
// return this.status == 200;
// }
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
/**
* 将json结果集转化为EasyBuyResult对象
*
* @param jsonData json数据
* @param clazz EasyBuyResult中的object类型
* @return
*/
public static EasyBuyResult formatToPojo(String jsonData, Class<?> clazz) {
try {
if (clazz == null) {
return MAPPER.readValue(jsonData, EasyBuyResult.class);
}
JsonNode jsonNode = MAPPER.readTree(jsonData);
JsonNode data = jsonNode.get("data");
Object obj = null;
if (clazz != null) {
if (data.isObject()) {
obj = MAPPER.readValue(data.traverse(), clazz);
} else if (data.isTextual()) {
obj = MAPPER.readValue(data.asText(), clazz);
}
}
return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
} catch (Exception e) {
return null;
}
}
/**
* 没有object对象的转化
*
* @param json
* @return
*/
public static EasyBuyResult format(String json) {
try {
return MAPPER.readValue(json, EasyBuyResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Object是集合转化
*
* @param jsonData json数据
* @param clazz 集合中的类型
* @return
*/
public static EasyBuyResult formatToList(String jsonData, Class<?> clazz) {
try {
JsonNode jsonNode = MAPPER.readTree(jsonData);
JsonNode data = jsonNode.get("data");
Object obj = null;
if (data.isArray() && data.size() > 0) {
obj = MAPPER.readValue(data.traverse(),
MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
}
return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
} catch (Exception e) {
return null;
}
}
}
2.6 控制层 controller
@Autowired
private ProductCategoryService productCategoryService;
/**
* 进入到商品上架,显示一级分类
*/
@RequestMapping(value="/product/toadd",method=RequestMethod.GET)
public String toadd(Model model){
//查询一级分类
List<EasybuyProductCategory> productCategoryList1 = productCategoryService.getByParentId(0);
//传递一级分类到商品添加页面
model.addAttribute("productCategoryList1",productCategoryList1);
model.addAttribute("menu", 6);
return "toAddProduct";
}
/**
* 进入到商品上架,通过父级分类,查得当前分类
*/
@RequestMapping(value="/queryProductCategoryList",method=RequestMethod.POST)
@ResponseBody
public EasyBuyResult queryProductCategoryList(@RequestParam("parentId")Integer parentId){
try {
//查询下级分类
List<EasybuyProductCategory> productCategoryList2 = productCategoryService.getByParentId(parentId);
//传递下级分类到商品添加页面
return new EasyBuyResult(productCategoryList2);
} catch (Exception e) {
e.printStackTrace();
return EasyBuyResult.build(400, "查询分类失败");
}
}
/**
* 将商品添加到数据库中
*/
@RequestMapping("/product/add")
public String add(EasybuyProduct easybuyProduct,Model model){
//添加到数据库中
EasyBuyResult result = productService.saveProduct(easybuyProduct);
if(result.getStatus() == 200){
//成功
} else {
//失败
}
model.addAttribute("menu", 6);
//我就不做处理了,直接成功后返回到添加页面
return "toAddProduct";
}
3. 图片上传(采用fastDFS分布式文件系统)
见doc文档
3.1 安装图片服务器虚拟机
3.2 将fastdfs_client war包导入工作空间
3.3 web工程中导入dfs依赖
3 .4 web工程中添加properties/fdfs_conf.conf文件 写入tracker服务器的地址
3.5 封装后的图片上传
3.5.1 将FastDFSClient.java放入common工程中
3.5.2 导入fastDFS依赖
3.6 封装前后变化
<!--封装前测试图片上传-->
@Test
public void testUpload() throws Exception{
//1.导入fastDFS的jar包依赖
//2.加载配置文件,配置文件的内容就是tracker服务器的地址
ClientGlobal.init("E:\\k8507WorkSpace\\easybuy-manager-web\\src\\main\\resources\\properties\\fdfs_conf.conf");
//3.创建TrackerClient对象
TrackerClient trackerClient = new TrackerClient();
//4.创建tackerService对象
TrackerServer trackerServer = trackerClient.getConnection();
//5.创建StrageServer对象
StorageServer storageServer = null;
//6.创建StroageClient对象
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
//7.使用storageClient实现图片的上传
String[] strings = storageClient.upload_file("D:/img.jpg", "jpg", null);
//8.遍历字符串数组,得到group和文件名
for (String string : strings) {
System.out.println(string);
}
}
<!--封装后测试图片上传-->
@Test
public void testFastDFSUp2() throws Exception{
FastDFSClient client = new FastDFSClient("E:\\k8507WorkSpace\\easybuy-manager-web\\src\\main\\resources\\properties\\fdfs_conf.conf");
String str = client.uploadFile("D:/img.jpg");
System.out.println("封装后文件上传" + str);
}
4 富文本编辑器(kindeditor)使用
1.将kindeditor资源文件放入webapp
2.在新增页面(toAddProduct.jsp)引入kindeditor.js文件
<!--toAddProduct.jsp-->
<script charset="utf-8" src="/kindeditor-4.1.10/kindeditor.js"></script>
3.在textarea标签中增加属性,将其升级为富文本编辑器
<!--toAddProduct.jsp-->
<textarea name="description" id="editor_id">${product.description}</textarea>
4. 加载kindeditor
<!--toAddProduct.jsp-->
<script>
KindEditor.ready(function(K) {
var editor1 = K.create('textarea[name="description"]', {
allowFileManager : true, //允许文件编辑
height : "200px", //编辑器的高度为100px
allowImageUpload:true, //允许上传图片
uploadJson:'/pic/upload', //定义了上传图片的url地址
filePostName : "uploadFile", //指定上传文件参数名称
afterUpload:function(){this.sync();}, //图片上传成功后同步到textarea中
});
});
</script>
5. 图片上传按钮
5.1 jsp页面
<!--toAddProduct.jsp-->
<script>
$(function(){
$("#onPicUpload").click(function(){
var _self = $(this);
KindEditor.editor({
//指定上传文件参数名称
filePostName : "uploadFile",
//指定上传文件请求的url。
uploadJson : '/pic/upload',
//上传类型,分别为image、flash、media、file
dir : "image"
}).loadPlugin('image', function() {
this.plugin.imageDialog({
showRemote : false,
clickFn : function(url, title, width, height, border, align) {
//var input = _self.siblings("input");
//input.parent().find("img").remove();
$("input[name=filename]").val(url);
$("#onPicUpload").after("<a href='"+url+"' target='_blank'><img src='"+url+"' width='80' height='50'/></a>");
this.hideDialog();
}
});
});
});
})
</script>
5.2 PictureController.java
//PictureController.java
package org.java.controller;
import java.util.HashMap;
import java.util.Map;
import org.java.common.utils.FastDFSClient;
import org.springframework.stereotype.Controller;
/**
* 专用图片上传到fastDFS服务器
* @author yan
*
*/
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
@Controller
public class PictureController {
@RequestMapping("/pic/upload")
@ResponseBody
public Map<String, Object> upload(MultipartFile uploadFile){
Map<String, Object> map = new HashMap<>();
try {
FastDFSClient client = new FastDFSClient("classpath:properties/fdfs_conf.conf");
//获取到原始的文件名
String oldName = uploadFile.getOriginalFilename();
//获取到扩展名(a.b.jpg)
String extName = oldName.substring(oldName.lastIndexOf(".") + 1);
//上传到fastDFS服务器
String url = client.uploadFile(uploadFile.getBytes(), extName);
//在url的前面添加服务器的地址
url = "http://192.168.25.133/" + url;
map.put("url", url);
map.put("error", 0);
return map;
} catch (Exception e) {
e.printStackTrace();
map.put("error", 1);
map.put("message", "图片上传失败");
return map;
}
}
}
5.3 web/pom.xml文件中添加文件上传组件 commons-fileupload 和commons-io
5.4 springmvc.xml中 配置附件解析器
<!--springmvc.xml-->
</bean>
<!-- 配置附件解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 允许上传文件的最大值:1G -->
<property name="maxUploadSize" value="1073741824"></property>
</bean>
6.进入修改页面
//PictureController.java
/**
* 进入到修改商品界面
*/
@RequestMapping(value="/product/toupdate",method=RequestMethod.GET)
public String toupdate(Model model,@RequestParam("id") Integer id){
//实现左边栏选中项目变红的效果
model.addAttribute("menu", 6);
//根据id查询商品对象
EasybuyProduct product = productService.getById(id);
model.addAttribute("product", product);
//查询当前商品的一级分类
List<EasybuyProductCategory> productCategoryList1 = productCategoryService.getByParentId(0);
//查询当前商品的二级分类列表
List<EasybuyProductCategory> productCategoryList2 = productCategoryService.getByParentId(product.getCategorylevel1id());
//查询当前商品的三级分类列表
List<EasybuyProductCategory> productCategoryList3 = productCategoryService.getByParentId(product.getCategorylevel2id());
//传递一级分类到商品添加页面
model.addAttribute("productCategoryList1",productCategoryList1);
model.addAttribute("productCategoryList2",productCategoryList2);
model.addAttribute("productCategoryList3",productCategoryList3);
//进入修改商品的界面
return "toAddProduct";
}