第三天:商品管理+图片上传+属性注入+Nginx动静分离
思考:
序号 | 知识点 | 类型 | 难度系数 | 掌握程度 |
| EasyUI.datagrid执行过程 | 技术 | 3 | 熟练 |
| 分页PageHelper工作原理 | 论述 | 1 | 会用 |
| PropertyConfig注解实现读取属性文件值 | 技术 | 2 | 熟练 |
知识点:
序号 | 知识点 | 类型 | 难度系数 | 掌握程度 |
| 商品表、商品描述表设计 | 设计 | 3 | 熟练 |
| 商品新增、列表、修改、删除 | 技术 | 1 | 熟练 |
| EasyUI.datagrid 表格控件 | 技术 | 2 | 了解 |
| 分页PageHelper、PageInfo,应用 | 技术 | 1 | 熟练 |
| 域名IP映射工具 SwitchHost | 技术 | 1 | 熟练 |
商品新增
分析item-add.jsp的执行过程
EasyUI页面控件,点击提交按钮,执行submitForm事件,submit方法中首先进行页面校验,通过校验后,将页面提交的内容拼接为json串,将json串写入itemParams隐藏域,然后post提交/item/save,保存成功后返回data数据,data对象中有个status属性,当等于200,表示成功。Data对象的格式特殊定义SysResult,提示新增商品成功。
*新增保存后返回SysResult对象
传统返回值一般为一个字符串,来通知用户成功或者失败。这样的信息严重偏少。系统构造SysResult对象配合json可以返回很丰富的信息,方便用户更详细的了解执行的情况。注意它处理后都是通过json串返回,在springmvc中通过@ResponseBody标签来处理。
例如:
@RequestMapping("save")
@ResponseBody
public SysResult save(Item item){
itemService.saveItem(item);
return SysResult.ok();
}
开发步骤
第一步:创建ItemController
package com.jt.manage.controller;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.jt.common.vo.SysResult;
import com.jt.manage.pojo.Item;
import com.jt.manage.service.ItemService;
/**
* 商品相关的业务逻辑处理
*
*/
@RequestMapping("item")
@Controller
public class ItemController {
private static final Logger LOGGER = LoggerFactory.getLogger(ItemController.class);
@Autowired
private ItemService itemService;
//@ Autowired
//private ItemDescService itemDescService;
/**
* 新增商品数据
*/
@RequestMapping(value = "save", method = RequestMethod.POST)
@ResponseBody
public SysResult saveItem(Item item, @RequestParam("desc") String desc,
@RequestParam("itemParams") String itemParams) {
item.setCreated(new Date());
item.setStatus(1);
if (item.getId() != null) {
LOGGER.warn("传入的商品数据中包含id数据! id = {}", item.getId());
}
item.setId(null); // 安全方面考虑,强制设置id为null
itemService.save(item);
return SysResult.ok();
}
}
第二步:创建ItemService
package com.jt.manage.service;
import org.springframework.stereotype.Service;
import com.jt.manage.pojo.Item;
@Service
public class ItemService extends BaseService<Item>{
}
第三步:创建ItemMapper
package com.jt.manage.mapper;
import com.jt.manage.mapper.base.mapper.SysMapper;
import com.jt.manage.pojo.Item;
public interface ItemMapper extends SysMapper<Item>{
}
第四步:创建Item实体
package com.jt.manage.pojo;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name = "tb_item")
public class Item extends BasePojo{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@Column(name = "sell_point")
private String sellPoint;
private Long price;
private Integer num;
private String barcode;
private String image;
private Long cid;
private Integer status;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSellPoint() {
return sellPoint;
}
public void setSellPoint(String sellPoint) {
this.sellPoint = sellPoint;
}
public Long getPrice() {
return price;
}
public void setPrice(Long price) {
this.price = price;
}
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public String getBarcode() {
return barcode;
}
public void setBarcode(String barcode) {
this.barcode = barcode;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public Long getCid() {
return cid;
}
public void setCid(Long cid) {
this.cid = cid;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String toString() {
return "Item [id=" + id + ", title=" + title + ", sellPoint=" + sellPoint + ", price=" + price
+ ", num=" + num + ", barcode=" + barcode + ", image=" + image + ", cid=" + cid + ", status="
+ status + ", created=" + getCreated() + ", updated=" + getUpdated() + "]";
}
}
常见错误:不能找到SysResult
jt-common工程mvn install,将jar包发布到本地仓库,其他项目才可以访问。
商品编辑
图片回显
执行流程:
页面加载创建toolbar EasyUI的工具栏,在点击“编辑”按钮时,创建一个window。打开窗口从选择的第一个记录中获取数据,通过$("#itemeEditForm").form("load",
data);表单回显数据,再执行KindEditorUtil.init方法,从数据中获取到图片链接字符串,init方法又调用common.js中的this.initPicUpload(data)方法,这个方法中又判断图片的链接,多个进行拆分,并显示。
if(data && data.pics){
var imgs = data.pics.split(",");
for(var i in imgs){
if($.trim(imgs[i]).length > 0){
_ele.siblings(".pics").find("ul").append("<li><a href='"+imgs[i]+"' target='_blank'><img src='"+imgs[i]+"' width='80' height='50' /></a></li>");
}
}
}
商品信息修改保存
在item-edit.jsp修改保存
$.post("/item/update",$("#itemeEditForm").serialize(), function(data){
if(data.status == 200){
$.messager.alert('提示','修改商品成功!','info',function(){
$("#itemEditWindow").window('close');
$("#itemList").datagrid("reload");
});
}
});
在ItemController中新增修改方法
@RequestMapping(value = "update", method = RequestMethod.POST)
@ResponseBody
public SysResult updateItem(Item item, @RequestParam("desc") String desc,
@RequestParam("itemParams") String itemParams) {
this.itemService.updateItem(item, desc, itemParams);
return SysResult.ok();
}
在ItemService中新增修改方法
public void updateItem(Item item, String desc, String itemParams) {
item.setUpdated(new Date());
item.setCreated(null);// 强制设置为null
super.updateSelective(item);
// 更新商品描述数据
ItemDesc itemDesc = new ItemDesc();
itemDesc.setUpdated(new Date());
itemDesc.setItemId(item.getId());
itemDesc.setItemDesc(desc);
this.itemDescService.updateSelective(itemDesc);
}
商品删除
实现批量删除(物理删除)
item-list.jsp中js代码
text:'删除',
iconCls:'icon-cancel',
handler:function(){
var ids = getSelectionsIds();
if(ids.length == 0){
$.messager.alert('提示','未选中商品!');
return ;
}
$.messager.confirm('确认','确定删除ID为 '+ids+' 的商品吗?',function(r){
if (r){
var params = {"ids":ids};
$.post("/item/delete",params, function(data){
if(data.status == 200){
$.messager.alert('提示','删除商品成功!',undefined,function(){
$("#itemList").datagrid("reload");
});
}
});
}
});
}
ItemController中添加删除方法
@RequestMapping(value = "delete", method = RequestMethod.POST)
@ResponseBody
public SysResult deleteItem(@RequestParam("ids") String ids) {
this.itemService.deleteByIds(ids.split(","));
return SysResult.ok();
}
商品下架和上架
有些商品违反规定会被暂时下架,整改合格后会重新上架。下架商品用户将无法访问。
ItemMapper.xml
<!-- 上架reshelf下架instock map(status,array[1,2,3])-->
<update id="updateStatus" parameterType="map">
update tb_item set status=#{status}
where id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</update>
ItemMapper.java
package com.jt.manage.mapper;
import java.util.List;
import java.util.Map;
import com.jt.common.mapper.SysMapper;
import com.jt.manage.pojo.Item;
public interface ItemMapper extends SysMapper<Item>{
public List<Item> list();
//上架,下架
public void updateStatus(Map<String,Object> map);
}
ItemService
public void updateStatus(Integer status, Long[] ids){
Map<String,Object> params = new HashMap<String,Object>();
params.put("status", status);
params.put("ids", ids);
itemMapper.updateStatus(params);
}
ItemController
//下架
@RequestMapping("/instock")
@ResponseBody
public SysResult instock(Long[] ids){
try{
itemService.updateStatus(2, ids); //2下架
return SysResult.oK();
}catch(Exception e){
log.error(e.getMessage());
return SysResult.build(201, "修改为下架状态失败!");
}
}
//上架
@RequestMapping("/reshelf")
@ResponseBody
public SysResult reshelf(Long[] ids){
try{
itemService.updateStatus(1, ids); //1正常
return SysResult.oK();
}catch(Exception e){
log.error(e.getMessage());
return SysResult.build(201, "修改为上架状态失败!");
}
}