day70_淘淘商城項目_03_商品類目選擇 + 圖片上傳 + 圖片服務器FastDFS + 富文本編輯器KindEditor + 新增商品_匠心筆記


  • 課程計划
    • 第三天:
  • 1、商品類目選擇
  • 2、圖片上傳
    • a) 圖片服務器FastDFS
    • b) 圖片上傳功能實現
  • 3、富文本編輯器的使用KindEditor
  • 4、商品添加功能完成

1、商品類目選擇

1.1、功能分析

1.1.1、數據庫表結構設計


parent_id 表示節點的父節點。
上表的設計可以展示為樹形結構展開類目。

1.1.2、前端頁面分析

在taotao-manager-web項目中的jsp下的item-add.jsp中:


我們在該文件中使用 【Ctrl + F】 進行搜索,沒有找到事件綁定的樣式class(selectItemCat),那我們在Eclipse使用【文件搜索】功能,步驟:Search --> File..,如下:

我們找到了class綁定事件元素處理的js文件common.js,如下:

我們發現:在item-add.jsp中我們並沒有引用common.js,但由於在首頁index.jsp中我們已經引入了,所以 item-add.jsp作為首頁index.jsp一個片段,所以在item-add.jsp中我們同樣可以使用common.js。
展示商品分類列表,使用EasyUI的tree控件展示。如下:

詳解如下:
初始化tree請求的url:/item/cat/list
參數:id  父節點的id值。
初始化tree時只需要把第一級節點展示,子節點異步加載展示。

返回值:json格式數據

[{    
    "id"1,    
    "text""Node 1",    
    "state""closed"
},{    
    "id"2,    
    "text""Node 2",    
    "state""closed"   
}] 
state:如果節點下有子節點則state的值為"closed",如果節點下沒有子節點則state的值為"open"

所以我們需要創建一個pojo來描述tree的節點信息,包含三個屬性id、text、state。
放到taotao-common工程中。由於是服務端響應回來的pojo數據,所以需要實現序列化接口。
EasyUITreeNode.java

package com.taotao.common.pojo;

import java.io.Serializable;

/**
 * 類目查詢時的返回的數據類
 * @author    chenmingjun
 * @date    2018年11月12日下午5:01:23
 * @version 1.0
 */

public class EasyUITreeNode implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    private String text;

    private String state;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    @Override
    public String toString() {
        return "EasyUITreeNode [id=" + id + ", text=" + text + ", state=" + state + "]";
    }
}

查詢的表:
  tb_item_cat
查詢的列:
  id、name、is_parent
查詢條件:
  parentId

1.2、服務層工程開發

1.2.1、Dao層

  Dao層只需要查詢商品分類表tb_item_cat即可,屬於單表查詢,單表查詢我們沒有必要自己寫Mapper了,使用Mybatis逆向工程生成的Mapper即可。

1.2.2、Service層

參數:
  Long parentId
業務邏輯:
  1、根據parentId查詢節點列表。
  2、轉換成EasyUITreeNode列表。
  3、返回。
返回值:
  List<EasyUITreeNode>

先寫接口,在taotao-manager-interface工程中:

package com.taotao.service;

import java.util.List;

import com.taotao.common.pojo.EasyUITreeNode;

/**
 * 商品類目管理接口
 * @author    chenmingjun
 * @date    2018年11月12日下午8:15:24
 * @version 1.0
 */

public interface ItemCatService {

    /**
     * 根據商品類目的父節點id,查詢該節點的子類目列表
     * @param parentId
     * @return
     */

    List<EasyUITreeNode> getItemCatList(Long parentId);
}

再寫實現類,在taotao-manager-service工程中:

/**
 * 商品類目管理Service
 * @author    chenmingjun
 * @date    2018年11月12日下午8:15:58
 * @version 1.0
 */

@Service
public class ItemCatServiceImpl implements ItemCatService {

    @Autowired
    private TbItemCatMapper itemCatMapper;

    @Override
    public List<EasyUITreeNode> getItemCatList(Long parentId) {
        TbItemCatExample example = new TbItemCatExample();
        // 設置查詢條件
        Criteria criteria = example.createCriteria();
        criteria.andParentIdEqualTo(parentId);
        List<TbItemCat> list = itemCatMapper.selectByExample(example);
        // 將list轉換成EasyUITreeNode列表
        List<EasyUITreeNode> resultList = new ArrayList<>();
        for (TbItemCat tbItemCat : list) {
            EasyUITreeNode node = new EasyUITreeNode();
            node.setId(tbItemCat.getId());
            node.setText(tbItemCat.getName());
            // 如果節點下有子節點則state的值為"closed",如果節點下沒有子節點則state的值為"open"
            node.setState(tbItemCat.getIsParent() ? "closed" : "open");
            // 將節點添加到list集合(列表)
            resultList.add(node);
        }
        return resultList;
    }
}

1.2.3、發布服務

在taotao-manager-service中的applicationContext-service.xml中發布服務:

1.3、表現層功能開發

1.3.1、引用服務

在taotao-manager-web中的springmvc.xml中引用服務:

1.3.2、Controller

初始化tree請求的url:
  /item/cat/list
參數:
  Long id(父節點id,表現層需要使用注解@RequestParam進行映射成parentId)
返回值:json格式的數據,使用注解@ResponseBody
  List<EasyUITreeNode>

/**
 * 商品類目管理Controller
 * @author    chenmingjun
 * @date    2018年11月12日下午9:02:03
 * @version 1.0
 */

@Controller
public class ItemCatController {

    @Autowired
    private ItemCatService itemCatService;

    @RequestMapping("/item/cat/list")
    @ResponseBody
    public List<EasyUITreeNode> getItemCatList(@RequestParam(value="id", defaultValue="0") Long parentId) {
        // 注意:第一次請求是沒有參數傳過來的,我們給id一個默認值0,defaultValue="0"
        List<EasyUITreeNode> list = itemCatService.getItemCatList(parentId);
        return list;
    }
}

2、新增商品數據庫分析

比如:產品經理提供需求
商品屬性如下:

2.1、商品表分析


商品價格設置為Long ,就可以避免對小數點的處理。例如:
public static void main(String[] args{
    float a = 1.3f;
    double b = 1.3d;

    float aa = a * 3;
    double bb = b * 3;
    System.out.println(aa);
    System.out.println(bb);
}
打印結果是:
    3.8999999
    3.9000000000000004

存在的問題:
  前端顯示是元,兩位小數,保存在數據庫是分,所以保存數據需要把顯示的數據乘以100。

2.2、商品描述表分析


商品描述被拆分成另一張表。
商品描述的特點:
  數據量大
  修改的頻率低
所以需要拆分。

3、圖片上傳分析

傳統方式:


集群環境:

解決方案:
  搭建一個圖片服務器,專門保存圖片。可以使用 分布式文件系統FastDFS(國產:淘寶)

4、圖片服務器

圖片服務器的要求:
  1、存儲空間可擴展。
  2、提供一個統一的訪問方式。
  3、如果想安裝,可參考文檔,暫時不推薦自己搭建(耗費時間很長,有空再搭建),直接使用提供的虛擬機。
  使用FastDFS,分布式文件系統。存儲空間可以橫向擴展,可以實現服務器的高可用支持每個節點有備份機

4.1、什么是FastDFS

  FastDFS是用c語言編寫的一款開源的分布式文件系統(國產軟件)。FastDFS為互聯網量身定制,充分考慮了冗余備份(高可用)負載均衡(高並發量)線性擴容(添加服務器或者磁盤)等機制,並注重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集群提供文件上傳、下載等服務。

4.2、FastDFS架構

  FastDFS架構包括 Tracker serverStorage server。客戶端請求 Tracker server 進行文件上傳、下載,通過Tracker server調度最終由 Storage server 完成文件上傳和下載。
  Tracker server 作用是負載均衡和調度,通過 Tracker server 在文件上傳時可以根據一些策略找到 Storage server 提供文件上傳服務。可以將 tracker 稱為追蹤服務器調度服務器
  Storage server 作用是文件存儲,客戶端上傳的文件最終存儲在Storage服務器上,Storage server 沒有實現自己的文件系統而是利用操作系統的文件系統來管理文件。可以將storage稱為存儲服務器
  FastDFS架構圖如下所示:


詳解如下:
服務端兩個角色:
    Tracker:管理集群,tracker也可以實現集群。每個tracker節點地位平等(沒有主從的概念)。
        收集Storage集群的狀態。
    Storage:實際保存文件。
        Storage分為多個組(卷),每個組之間保存的文件是不同的。每個組內部可以有多個成員,組內的成員內部保存的內容是一樣的,組成員的地位是一致的,沒有主從的概念。

4.3、文件上傳的流程


客戶端上傳文件后存儲服務器將 文件ID返回給客戶端,此文件ID用於以后訪問該文件的索引信息。
文件索引信息包括:組名,虛擬磁盤路徑,數據兩級目錄,文件名。
  • 組名:文件上傳后所在的storage組名稱,在文件上傳成功后有storage服務器返回,需要客戶端自行保存。
  • 虛擬磁盤路徑:storage配置的虛擬路徑,與磁盤選項store_path*對應。如果配置了store_path0則是M00,如果配置了store_path1則是M01,以此類推。
  • 數據兩級目錄:storage服務器在每個虛擬磁盤路徑下創建的兩級目錄,用於存儲數據文件。00~FF
  • 文件名:與文件上傳時不同。是由存儲服務器根據特定信息生成,文件名包含:源存儲服務器IP地址、文件創建時間戳、文件大小、隨機數和文件拓展名等信息。

4.4、文件下載

4.5、最簡單的FastDFS架構

5、圖片服務器安裝方法

暫時不推薦自己搭建FastDFS圖片服務器(耗費時間很長,有空再搭建),直接使用提供的虛擬機。
使用提供的虛擬機,需要注意幾個問題,如下圖所示:


由於兩台虛擬機的ip網段不一樣,所以我們還得改一下【虛擬機網絡編輯器】,將他們改為在同一網段192.168.25.xxx。如下:
在Vmmare上選擇【編輯(E)】--> 【虛擬機網絡編輯器】

選擇【更改設置(C)】

注意:以后所有學習中演示的例子都是用網段192.168.25.xxx。
圖片服務器ip地址:192.168.25.133
  用戶名:root、itcast
  密碼:itcast
  該圖片服務器里面的nginx和FastDFS配置的是開機自啟。

6、圖片服務器使用

6.1、FastDFS的Java客戶端


目前我們使用的是maven工程,不能直接添加jar包,需要創建maven工程,安裝到本地,再在使用的工程中添加依賴。
Maven環境:

導入FastDFS的Java客戶端Maven工程,其POM文件如下:

我們將FastDFS的Java客戶端的坐標添加依賴到taotao-manager-web中的pom.xml中:

6.2、使用DastDFS的Java客戶端上傳圖片

6.2.1、上傳步驟


1、加載配置文件,配置文件中的內容就是tracker服務的地址。
  配置文件內容:tracker_server=192.168.25.133:22122
2、創建一個TrackerClient對象。直接new一個。
3、使用TrackerClient對象創建連接,獲得一個TrackerServer對象。
4、創建一個StorageServer的引用,值為null。
5、創建一個StorageClient對象,需要兩個參數TrackerServer對象、StorageServer的引用。
6、使用StorageClient對象上傳圖片。
7、返回數組。包含組名和圖片的路徑。

6.2.2、測試代碼

/**
 * 使用DastDFS的Java客戶端上傳圖片
 * @author    chenmingjun
 * @date    2018年11月13日下午4:14:01
 * @version 1.0
 */

public class FastDFSTest {

    @Test
    public void FileUploadTest() throws Exception {
        // 0、向工程中添加jar包。目前我們使用的是maven工程,不能直接添加jar包,需要創建maven工程,安裝到本地,再在使用的工程中添加依賴。
        // 1、加載配置文件,配置文件中的內容就是tracker服務的地址。配置文件內容:tracker_server=192.168.25.133:22122
        ClientGlobal.init("D:/learn/Java/eclipse-jee-mars-2-win32_x64/eclipse-workspace/taotao/taotao-manager-web/src/main/resources/resource/fdfs_client.conf");
        // 2、創建一個TrackerClient對象,我們直接new一個。
        TrackerClient trackerClient = new TrackerClient();
        // 3、使用TrackerClient對象創建連接,獲得一個TrackerServer對象。
        TrackerServer trackerServer = trackerClient.getConnection();
        // 4、創建一個StorageServer的引用(不用new出來),值為null。不創建這個引用也可以,直接引用。
        StorageServer storageServer = null;
        // 5、創建一個StorageClient對象,該對象需要兩個參數:TrackerServer對象、StorageServer的引用
        StorageClient storageClient = new StorageClient(trackerServer, storageServer);
        // 6、使用StorageClient對象上傳圖片。
        // 擴展名不帶“.”
        String[] strings = storageClient.upload_file("C:/Users/Bruce/Desktop/我的頭像.jpg""jpg"null);
        // 7、返回數組。包含組名和圖片的路徑。
        for (String string : strings) {
            System.out.println(string);
        }
    }
}

6.3、使用工具類上傳圖片


工具類位置:

工具類代碼如下:
/**
 * DastDFS的Java客戶端上傳圖片工具類,用於上傳圖片至DastDFS服務器
 * @author    chenmingjun
 * @date    2018年11月13日下午4:58:48
 * @version 1.0
 */

public class FastDFSClientUtil {

    private TrackerClient trackerClient = null;
    private TrackerServer trackerServer = null;
    private StorageServer storageServer = null;
    private StorageClient1 storageClient = null;

    public FastDFSClientUtil(String conf) throws Exception {
        if (conf.contains("classpath:")) {
            conf = conf.replace("classpath:"this.getClass().getResource("/").getPath());
        }
        ClientGlobal.init(conf);
        trackerClient = new TrackerClient();
        trackerServer = trackerClient.getConnection();
        storageServer = null;
        storageClient = new StorageClient1(trackerServer, storageServer);
    }

    /**
     * 上傳文件方法(文件方式)
     * @param fileName 文件全路徑
     * @param extName 文件擴展名,不包含(.)
     * @param metas 文件擴展信息
     * @return
     * @throws Exception
     */

    public String uploadFile(String fileName, String extName, NameValuePair[] metas) throws Exception {
        String result = storageClient.upload_file1(fileName, extName, metas);
        return result;
    }

    public String uploadFile(String fileName) throws Exception {
        return uploadFile(fileName, nullnull);
    }

    public String uploadFile(String fileName, String extName) throws Exception {
        return uploadFile(fileName, extName, null);
    }

    /**
     * 上傳文件方法(字節方式)
     * @param fileContent 文件的內容,字節數組
     * @param extName 文件擴展名
     * @param metas 文件擴展信息
     * @return
     * @throws Exception
     */

    public String uploadFile(byte[] fileContent, String extName, NameValuePair[] metas) throws Exception {

        String result = storageClient.upload_file1(fileContent, extName, metas);
        return result;
    }

    public String uploadFile(byte[] fileContent) throws Exception {
        return uploadFile(fileContent, nullnull);
    }

    public String uploadFile(byte[] fileContent, String extName) throws Exception {
        return uploadFile(fileContent, extName, null);
    }
}

分析還是有幾個地方需要用到圖片上傳的,所以將工具類拷貝到:taotao-common工程下,如圖:


測試代碼:
    @Test
    public void FastDFSClientUtilsTest() throws Exception 
{
        // 生產環境下我們使用classpath,現在學習階段使用全路徑名,由於工具類寫的不夠好
        FastDFSClientUtil fastDFSClientUtils = new FastDFSClientUtil("D:/learn/Java/eclipse-jee-mars-2-win32_x64/eclipse-workspace/taotao/taotao-manager-web/src/main/resources/resource/fdfs_client.conf");
        String string = fastDFSClientUtils.uploadFile("C:/Users/Bruce/Desktop/我的頭像.jpg");
        System.out.println(string);
    }

7、實現圖片上傳功能

7.1、功能分析

7.1.1、前端頁面實現


使用的是KindEditor的多圖片上傳插件。
KindEditor 4.x 文檔
  文檔網址:http://kindeditor.net/doc.php

7.1.2、請求分析

請求的url:/pic/upload
參數:MultiPartFile uploadFile
返回值:


可以創建一個pojo對應返回值。也可以使用Map集合。

 

7.1.3、加入文件上傳的jar包

圖片上傳跟服務層沒有什么關系,表現層就可以將這件事做了。
表現層使用的是SpringMVC,需要加入文件上傳的jar包,如果沒有添加jar包,則需要把commons-iofileupload的jar包添加到taotao-manager-web工程中。

7.1.4、配置(多媒體)文件上傳解析器

在taotao-manager-web工程中的springmvc.xml中添加如下:

    <!-- 配置文件上傳解析器 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 設定默認編碼 -->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 設定文件上傳的最大值5MB,5*1024*1024 -->
        <property name="maxUploadSize" value="5242880"></property>
    </bean>

7.2、Controller開發

開發controller實現圖片上傳。
將圖片服務器的前綴放入屬性文件中:


在taotao-manager-web工程中的springmvc.xml中加載該屬性文件:

這樣spring容器加載的時候,我們使用注解@Value("${TAOTAO_IMAGE_SERVER_URL}")取出配置文件的值。
代碼如下:
@Controller
public class PictureController {

    @Value("${TAOTAO_IMAGE_SERVER_URL}"// 使用注解取出配置文件的值
    private String TAOTAO_IMAGE_SERVER_URL;

    /**
     * 上傳圖片
     * @param uploadFile
     * @return
     */

    @RequestMapping(value="/pic/upload")
    @ResponseBody // 在后台,把JavaBean強制轉換成json格式數據返回給前台頁面。
    public Map<StringObject> pictureUpload(MultipartFile uploadFile) {
        try {
            // 1、取出文件的擴展名
            String originalFilename = uploadFile.getOriginalFilename();
            String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            // 2、使用工具類創建一個FastDFS的客戶端
            FastDFSClientUtil fastDFSClientUtil = new FastDFSClientUtil("classpath:resource/fdfs_client.conf");
            // 3、執行上傳處理,返回的字符串:group1/M00/00/01/wKgZhVjnAd6AKj_RAAvqH_kipG8211.jpg
            String path = fastDFSClientUtil.uploadFile(uploadFile.getBytes(), extName);
            // 4、拼接返回的url和ip地址,拼裝成完整的url
            // String url = "http://192.168.25.133/" + path;
            String url = TAOTAO_IMAGE_SERVER_URL + path;
            // 5、返回map,設置上傳成功后的圖片的路徑
            Map<StringObject> result = new HashMap<>();
            result.put("error"0);
            result.put("url", url);
            // 6、返回
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            // 5、返回map,設置上傳失敗錯誤信息
            Map<StringObject> result = new HashMap<>();
            result.put("error"1);
            result.put("message""圖片上傳失敗");
            return result;
        }
    }
}

7.3、解決火狐瀏覽器兼容性的問題

KindEditor的圖片上傳插件,對瀏覽器兼容性不好,不能使用JSON響應。


使用@ResponseBody注解返回java對象實際上是JSON格式的數據。
  返回JSON格式的數據時的Content-Type為:application/json;charset=UTF-8 在火狐上測試不行。
  返回字符串時的Content-Type為:text/plain;charset=UTF-8 它是可以成功返回的。火狐瀏覽器支持。
可以通過produces指定響應結果的content-type:
  @RequestMapping(value="/pic/upload",produces=MediaType.TEXT_PLAIN_VALUE+";charset=utf-8")
需要使用 JsonUtils工具類對象轉換成JSON格式的字符串。將其拷貝到 taotao-common項目中, 安裝到本地倉庫
修改代碼如下:
@Controller
public class PictureController {

    @Value("${TAOTAO_IMAGE_SERVER_URL}"// 使用注解取出配置文件的值
    private String TAOTAO_IMAGE_SERVER_URL;

    /**
     * 上傳圖片
     * @param uploadFile
     * @return
     */

    @RequestMapping(value="/pic/upload", produces=MediaType.TEXT_PLAIN_VALUE + ";charset=UTF-8")
    @ResponseBody // 在后台,把JavaBean強制轉換成json格式數據返回給前台頁面。
    public String PictureUpload(MultipartFile uploadFile) {
        try {
            // 1、取出文件的擴展名
            String originalFilename = uploadFile.getOriginalFilename();
            String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            // 2、使用工具類創建一個FastDFS的客戶端
            FastDFSClientUtil fastDFSClientUtil = new FastDFSClientUtil("classpath:resource/fdfs_client.conf");
            // 3、執行上傳處理,返回的字符串:group1/M00/00/01/wKgZhVjnAd6AKj_RAAvqH_kipG8211.jpg
            String path = fastDFSClientUtil.uploadFile(uploadFile.getBytes(), extName);
            // 4、拼接返回的url和ip地址,拼裝成完整的url
            // String url = "http://192.168.25.133/" + path;
            String url = TAOTAO_IMAGE_SERVER_URL + path;
            // 5、返回map,設置上傳成功后的圖片的路徑
            Map<StringObject> result = new HashMap<>();
            result.put("error"0);
            result.put("url", url);
            // 6、返回
            return JsonUtils.objectToJson(result);
        } catch (Exception e) {
            e.printStackTrace();
            // 5、返回map,設置上傳失敗錯誤信息
            Map<StringObject> result = new HashMap<>();
            result.put("error"1);
            result.put("message""圖片上傳失敗");
            return JsonUtils.objectToJson(result);
        }
    }
}

8、富文本編輯器的使用方法

8.1、富文本編輯器介紹


KindEditor
  http://kindeditor.net/
UEditor:百度編輯器
  http://ueditor.baidu.com/website/
CKEditor
  http://ckeditor.com/
富文本編輯器純js開發,跟后台語言沒有關系。

8.2、使用方法

  • 第一步:在jsp中引入KindEditor的css和js代碼。
  • 第二步:在表單中添加一個textarea控件。是一個富文本編輯器的載體。類似數據源。
  • 第三步:初始化富文本編輯器。使用官方提供的方法初始化。

    common.js
  • 第四步:取富文本編輯器的內容。

    表單提交之前,把富文本編輯器的內容同步到textarea控件中。 即將編輯器中的數據放到textarea中,最終提交數據是textarea提交到后台。

9、新增商品功能實現

9.1、功能分析

  • 前端分析:
    表單:

    提交表單:
  • 業務邏輯:
    請求的url:/item/save
    參數:表單的數據。可以使用表單的pojo接收表單的數據,要求pojo的屬性名稱和input的name屬性值要一致
      使用TbItem對象接收表單的商品基本數據,使用字符串接收表單中的商品描述的數據
    參數如下:TbItem item, String desc
    返回值:json格式的數據。應該包含一個status的屬性。`一般而言,我們響應的json格式數據都是通過一個對象轉化而來!`
      我們可以使用提供的工具類TaotaoResult。
  • 將工具類TaotaoResult代碼拷貝放入taotao-common中,。安裝到本地倉庫。(注意:該工具類TaotaoResult需要實現序列化接口)

  • 業務邏輯:
    1、生成商品id
    實現方案:
      a) UUID,生成的是字符串,不推薦使用。
      b) 數值類型,不重復。日期+時間+隨機數20160402151333123123
      c) 時間戳,可以直接取毫秒值+隨機數。可以使用。(本例使用)
      d) 使用Redis。Incr命令。推薦使用。暫時還沒用到。
      可以使用工具類IDUtils生成商品id。安裝到本地倉庫。
    2、補全TbItem對象的屬性
    3、向商品表插入數據
    4、創建一個TbItemDesc對象
    5、補全TbItemDesc的屬性
    6、向商品描述表插入數據
    7、TaotaoResult.ok()

9.2、服務層功能開發

9.2.1、Dao層

  向tb_item, tb_item_desc表中插入數據,可以使用逆向工程生成的代碼。

9.2.2、Service層

  • 開發接口:部分代碼如下:
    /**
     * 根據商品的基礎數據和商品的描述信息插入商品(插入商品表和商品描述表)
     * @param item
     * @param desc
     * @return
     */

    TaotaoResult saveItem(TbItem item, String desc);
  • 開發實現類
    參數:TbItem item, String desc
    業務邏輯:略,參考上面
    返回值:TaotaoResult
    @Override
    public TaotaoResult saveItem(TbItem item, String desc) {
        // 1、生成商品id,本例中使用工具類IDUtils生成商品id
        Long itemId = IDUtils.genItemId();
        item.setId(itemId);
        // 2、補全商品表TbItem的其他屬性
        // 商品狀態,1-正常,2-下架,3-刪除
        item.setStatus((byte1);
        Date date = new Date();
        item.setCreated(date);
        item.setUpdated(date);
        // 3、向商品表中插入數據
        itemMapper.insert(item);
        // 4、創建一個商品描述表TbItemDesc對象
        TbItemDesc itemDesc = new TbItemDesc();
        // 5、補全商品描述表TbItemDesc的其他屬性
        itemDesc.setItemId(itemId);
        itemDesc.setItemDesc(desc);
        itemDesc.setCreated(date);
        itemDesc.setUpdated(date);
        // 6、向商品描述表中插入數據
        itemDescMapper.insert(itemDesc);
        // 7、返回TaotaoResult.ok()
        return TaotaoResult.ok();
    }

9.2.3、發布服務

在taotao-manager-service工程中的applicationContext-service.xml中發布服務:

9.3、表現層功能開發

9.3.1、引用服務

在taotao-manager-web工程中的springmvc.xml中引用服務:

9.3.2、Controller

請求的url:/item/save
參數:TbItem item, String desc
返回值:TaotaoResult

    /**
     * 根據商品的基礎數據和商品的描述信息添加商品,返回服務器插入成功的響應狀態
     * @param item
     * @param desc
     * @return
     */

    @RequestMapping(value="/item/save", method=RequestMethod.POST)
    @ResponseBody
    public TaotaoResult savetItem(TbItem item, String desc) {
        TaotaoResult result = itemService.saveItem(item, desc);
        return result;
    }

9.4、作業

  商品修改、商品刪除、上架下架。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM