zoukankan      html  css  js  c++  java
  • 基于【 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,后期项目会发布共享,项目持续更新

  • 相关阅读:
    读取csv遇到的双循环
    hadoop环境配置
    mysql的查询
    mysql的基本操作
    mysql与python的交互
    设置自动获取IP和DNS
    pyecharts绘制地图
    集合 set方法
    字符串 string方法
    字典 dict方法
  • 原文地址:https://www.cnblogs.com/kevin-ying/p/10844516.html
Copyright © 2011-2022 走看看