基於【 springBoot +springCloud+vue 項目】二 || 后端框架詳解


 前言

在上一篇中,我們搭建了一個-API服務提供接口模塊,目的為了提供了消費方進行調用。為什么不直接在service層直接提供調用接口,而是重新創建一個接口層模塊?
首先我們需要對Feign有所了解。Feign是一種聲明式、模板化的HTTP客戶端。Feign的功能類似dubbo暴露服務,但是與dubbo稍有不同的是Feign是HTTP REST接口的形式暴露的。

正文

之前,我一直不理解,-interface模塊和-api模塊是否可以合並為一個,經過對項目的拆分測試,總算有所了解。那么,為了便於理解,對上一篇搭建的框架進行調整,把pinyougou-manager-web模塊單獨抽離出來,作為一個獨立的項目。
調整后結構如下:將標為紅色模塊刪除。

獨立新建一個項目:

 

一、提供接口服務

1、商品服務API

在pinyougou-sellergoods-ap模塊中,創建BrandApiService,提供商品服務接口:

@RequestMapping("/brand")
public interface BrandApiService {

    /**
     * 下拉列表
     * @return 品牌數據
     */
    @RequestMapping("/selectOptionList")
    public BaseResponse selectOptionList();


    /**
     * 根據品牌名或首字母模糊查詢品牌並分頁
     * @param brand 查詢條件
     * @param page 當前頁
     * @param size 每頁顯示的數量
     * @return 總記錄數和當前頁數據的封裝對象
     */
    @RequestMapping("/search")
    public BaseResponse search(@RequestBody TbBrand brand, @RequestParam("page") int page, @RequestParam("size") int size);


    /**
     * 運營商后台 品牌列表分頁
     * @param page 當前頁
     * @param size 每頁顯示數量
     * @return 總記錄數和當前頁數據的封裝對象
     */
    @RequestMapping("/findPage")
    public BaseResponse findPage(@RequestParam("page") int page,@RequestParam("size") int size);

    /**
     * 顯示所有品牌
     * @return 所有品牌對象
     */
    @RequestMapping("/findAll")
    public BaseResponse findAll();

    /**
     * 添加品牌
     * 注:此處對空白,重名方法未進行校驗(或可以在數據庫中添加唯一約束和not null)
     * @param brand 實體類對象
     * @return 添加成功或失敗
     */
    @RequestMapping("/add")
    public BaseResponse add(@RequestBody TbBrand brand);


    /**
     * 根據id查詢品牌
     * @param id 品牌id
     * @return 品牌對象
     */
    @RequestMapping("/findOne")
    public BaseResponse findOne(@RequestParam("id") Long id);

    /**
     * 更新品牌數據
     * @param brand 品牌對象
     * @return 成功或失敗
     */
    @RequestMapping("/update")
    public BaseResponse update(@RequestBody TbBrand brand);


    /**
     * 多項品牌數據刪除
     * @param ids 品牌id數組
     * @return 成功或失敗
     */
    @RequestMapping("/delete")
    public BaseResponse delete(@RequestParam("ids") Long[] ids);

}

我們可以理解為就是一個controller,可以根據需求提供REST風格的api

2.商品服務API的實現

在pinyougou-sellergoods-service模塊中實現API接口

@RestController
public class BrandApiServiceImpl extends BaseApiService implements BrandApiService {

    @Autowired
    private IBrandService brandService;


    @Override
    public BaseResponse selectOptionList() {
        List<Map> mapResult = brandService.selectOptionList();
        return setResultSuccess(mapResult);
    }

    @Override
    public BaseResponse search(TbBrand brand, int page, int size) {
        PageResult pageResult = brandService.findPage(brand, page, size);
        return setResultSuccess(pageResult);
    }

    @Override
    public BaseResponse findPage(int page, int size) {
        PageResult pageResult = brandService.findPage(page, size);
        return setResultSuccess(pageResult);
    }

    @Override
    public BaseResponse findAll() {
        List<TbBrand> listResult = brandService.findAll();
        return setResultSuccess(listResult);
    }

    @Override
    public BaseResponse add(TbBrand brand) {
        try{
            int result=brandService.add(brand);
            if(result>0){
                return setResultSuccess(result);
            }
            return setResultError();
        }catch (Exception e){
            return setResultError();
        }

    }

    @Override
    public BaseResponse findOne(Long id) {
        TbBrand result = brandService.findOne(id);
        return setResultSuccess(result);
    }

    @Override
    public BaseResponse update(TbBrand brand) {
        try{
            int result = brandService.update(brand);
            if(result>0){
                return setResultSuccess(result);
            }
            return setResultError();
        }catch (Exception e){
            return setResultError();
        }

    }

    @Override
    public BaseResponse delete(Long[] ids) {
        try{
            int result = brandService.delete(ids);
            if (result==ids.length && result>0){
                return setResultSuccess(result);
            }
            return setResultError(result);
        }catch (Exception e){
            return setResultError();
        }

    }
}

以上的兩部分代碼,我們可以理解為:該兩部分組成一個controller。

 

二、運營商管理后台

1、調用服務

在pinyougou-manager-web項目中,創建包feign,並創建一個BrandFeign,用於調用商品服務接口

@FeignClient(value = "sellergoods") //寫service層的名稱
public interface BrandFeign extends BrandApiService {

}

使用FeignClient調用接口

在BrandFeign接口類中繼承商品服務提供的接口類 ,相當於可以使用BrandFeign 調用所有提供的商品服務。

 

2.使用服務

接着創建一個BrandController,進行服務的調用

@RestController
@RequestMapping("/brands")
public class BrandController extends BaseApiService {

    @Autowired
    private BrandFeign brandFeign;

    @RequestMapping("/selectOptionList")
    @CrossOrigin
    public BaseResponse selectOptionList() {
        Object object=brandFeign.selectOptionList();
        String json=new JSONObject().toJSONString(object);
        BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class);

        return result;
    }

    @RequestMapping("/search")
    public BaseResponse search(@RequestBody TbBrand brand, @RequestParam("page") int page, @RequestParam("size") int size) {
        Object object= brandFeign.search(brand, page, size);
        String json=new JSONObject().toJSONString(object);
        BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class);
        return result;
    }

    @RequestMapping("/findPage")
    public BaseResponse findPage(int page, int size) {
        Object object= brandFeign.findPage(page, size);
        String json=new JSONObject().toJSONString(object);
        BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class);
        return result;
    }

    @RequestMapping("/findAll")
    public BaseResponse findAll() {
        Object object= brandFeign.findAll();
        String json=new JSONObject().toJSONString(object);
        BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class);
        return result;
    }

    @RequestMapping("/add")
    public BaseResponse add(TbBrand brand) {

        Object object= brandFeign.add(brand);
        String json=new JSONObject().toJSONString(object);
        BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class);
        return result;


    }

    @RequestMapping("/findOne")
    public BaseResponse findOne(Long id) {
        Object object= brandFeign.findOne(id);
        String json=new JSONObject().toJSONString(object);
        BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class);
        return result;
    }

    @RequestMapping("/update")
    public BaseResponse update(TbBrand brand) {

        Object object= brandFeign.update(brand);
        String json=new JSONObject().toJSONString(object);
        BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class);
        return result;
    }

    @RequestMapping("/delete")
    public BaseResponse delete(Long[] ids) {

        Object object= brandFeign.delete(ids);
        String json=new JSONObject().toJSONString(object);
        BaseResponse result=new JSONObject().parseObject(json,BaseResponse.class);
        return result;

    }
}

到此,我們的項目代碼已經全部完成,但是,我們在BrandFeign中不能像在聚合工程中一樣,直接調用BrandApiService,我們想要繼承該類,必須提供api接口項目的依賴。

三、idea中jar包導出與導入

在idea中我們要怎么導出jar包使用?

這里提供兩種思路:

1.導出jar包本地使用

2.導出jar包,使用maven打包到本地倉庫

接下來我就簡單說一下第一種方式,更詳細資源請到其他資源查看。

1、idea導出jar包

直接上圖:之前一直使用eclipse,改用idea,花了我好長時間才弄好

1、ctrl+shift+s

直接照着圖片做,選擇Empty

然后就可以在當前項目中發現有一個out文件夾,里面就存着剛剛導出的jar包了

 

2、idea引用jar包

 導出jar包怎么直接在項目中使用?

同樣:ctrl+shift+s

然后就直接看圖了:

然后,點'+',選擇JARs or directories,找到剛剛導出的jar包(在當前項目resource下,新建lib,包導出的jar包放里面),點擊就ok了

之后,我們就可以看到導入的jar包了

點開看一看?我們就可以知道,文章開始提出的問題了,主要目的還是不會讓服務消費者看到我們的源碼。

 

四、進入測試階段

同樣:啟動注冊中心,啟動service服務,最后啟動我們的manager-web項目

瀏覽器輸入地址:http://localhost:9101/api/brands/selectOptionList

如果能返回數據,說明我們成功了,感覺有點小激動啊。

 

 

 

本人聯系方式QQ:1136069753,后期項目會發布共享,項目持續更新

 


免責聲明!

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



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