十次方03、基础子模块

基础微服务-标签CRUD

1. 模块搭建tensquare_base

  1. 搭建基础微服务模块tensquare_base , pom.xml引入依赖
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    
    <dependency>
        <groupId>com.tensquare</groupId>
        <artifactId>tensquare_common</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    
  2. 创建启动类
    package com.tensquare.base;
    
    /**
    * Created by 37269 on 2018/6/1.
    */
    @SpringBootApplication
    public class BaseApplication {
    public static void main(String[] args) {
    SpringApplication.run(BaseApplication.class);
    } @
    Bean
    public IdWorker idWorker(){
    return new IdWorker(1,1);
    }
    }
    
    提示:IDEA创建main方法的快捷键是 psvm
  3. 在resources下创建application.yml
    server:
    	port: 9001
    spring:
    	application:
    		name: tensquare‐base #指定服务名
    	datasource:
    		driverClassName: com.mysql.jdbc.Driver
    		url: jdbc:mysql://192.168.184.134:3306/tensquare_base?
    		characterEncoding=utf‐8
    		username: root
    		password: 123456
    	jpa:
    		database: MySQL
    		show‐sql: true
    		generate‐ddl: true
    

2. 标签管理-CRUD

2.1 表结构分析

  1. 表名称:tb_label
    字段名称 字段含义 字段类型 备注
    id ID 文本
    labelname 标签名称 文本
    state 状态 文本 0:无效 1:有效
    count 使用数量 整型
    fans 关注数 整型
    recommend 是否推荐 文本 0:不推荐 1:推荐
  2. 建数据库:
    
    /*!40101 SET NAMES utf8 */;
    
    /*!40101 SET SQL_MODE=''*/;
    
    /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
    /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
    CREATE DATABASE /*!32312 IF NOT EXISTS*/`tensquare_base` /*!40100 DEFAULT CHARACTER SET utf8 */;
    
    USE `tensquare_base`;
    
  3. 建表语句:
    /*Table structure for table `tb_label` */
    
    DROP TABLE IF EXISTS `tb_label`;
    
    CREATE TABLE `tb_label` (
      `id` varchar(20) NOT NULL COMMENT '标签ID',
      `labelname` varchar(100) DEFAULT NULL COMMENT '标签名称',
      `state` varchar(1) DEFAULT NULL COMMENT '状态',
      `count` bigint(20) DEFAULT NULL COMMENT '使用数量',
      `recommend` varchar(1) DEFAULT NULL COMMENT '是否推荐',
      `fans` bigint(20) DEFAULT NULL COMMENT '粉丝数',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='标签';
    
    /*Data for the table `tb_label` */
    
    insert  into `tb_label`(`id`,`labelname`,`state`,`count`,`recommend`,`fans`) values 
    
    ('1','java','1',NULL,NULL,NULL),
    
    ('2','PHP','1',NULL,NULL,NULL),
    
    ('3','C++','1',NULL,NULL,NULL),
    
    ('4','python','1',NULL,NULL,NULL);
    

2.2 CRUD的实现

  1. 实体类
    创建com.tensquare.base包,包下创建pojo包 ,包下创建实体类Label

    package com.tensquare.base.pojo;
    
    /**
     * 标签的实体类
     */
    @Entity
    @Table(name = "tb_label")
    public class Label implements Serializable {
    
        @Id
        private String id;
        private String labelname;
        private String state;
        private Integer count;
        private Integer fans;
        private String recommend;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getLabelname() {
            return labelname;
        }
    
        public void setLabelname(String labelname) {
            this.labelname = labelname;
        }
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    
        public Integer getCount() {
            return count;
        }
    
        public void setCount(Integer count) {
            this.count = count;
        }
    
        public Integer getFans() {
            return fans;
        }
    
        public void setFans(Integer fans) {
            this.fans = fans;
        }
    
        public String getRecommend() {
            return recommend;
        }
    
        public void setRecommend(String recommend) {
            this.recommend = recommend;
        }
    }
    
    
  2. 创建数据访问接口
    com.tensquare.base包下创建dao包,包下创建LabelDao接口

    package com.tensquare.base.dao;
    
    import com.tensquare.base.pojo.Label;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
    
    /**
     * 标签的持久层接口
     */
    public interface LabelDao extends JpaRepository<Label, String>, JpaSpecificationExecutor<Label> {
    }
    

    JpaRepository提供了基本的增删改查
    JpaSpecificationExecutor用于做复杂的条件查询

  3. 业务逻辑类
    com.tensquare.base包下创建service包,包下创建LabelService类。 在这个类中,我们
    实现基本的增删改查功能

    package com.tensquare.base.service;
    
    /**
     * 标签的业务层
     */
    @Service
    public class LabelService {
    
        @Autowired
        private LabelDao labelDao;
    
        @Autowired
        private IdWorker idWorker;
    
        /**
         * 查询所有标签
         * @return
         */
        public List<Label> findAll(){
            return labelDao.findAll();
        }
    
        /**
         * 根据id查询
         * @param id
         * @return
         */
        public Label findById(String id) {
            return labelDao.findById(id).get();
        }
    
        /**
         * 保存
         * @param label
         */
        public void save(Label label) {
            //设置id
            label.setId(String.valueOf(idWorker.nextId()));
            labelDao.save(label);
        }
    
        /**
         * 更新
         * @param label
         */
        public void update(Label label) {
            labelDao.save(label);
        }
    
        /**
         * 删除
         * @param id
         */
        public void delete(String id) {
            labelDao.deleteById(id);
        }
    }
    
  4. 控制器类
    com.tensquare.user包下创建controller包,创建UserController

    package com.tensquare.base.web;
    
    /**
     * 标签控制器
     */
    @RestController
    @RequestMapping("/label")
    @CrossOrigin  // 当前的控制器支持跨域访问
    public class LabelController {
    
        @Autowired
        private LabelService labelService;
    
        /**
         * 查询所有
         * @return
         */
        @RequestMapping(method = RequestMethod.GET)
        public Result findAll() {
            List<Label> labels = labelService.findAll();
            return new Result(true, StatusCode.OK,"查询成功",labels);
        }
    
        /**
         * 根据id查询
         * @param id
         * @return
         */
        @RequestMapping(value = "/{id}",method = RequestMethod.GET)
        public Result findById(@PathVariable("id") String id) {
            Label label = labelService.findById(id);
            return new Result(true, StatusCode.OK,"查询id成功",label);
        }
    
        /**
         * 保存
         * @param label
         * @return
         */
        @RequestMapping(method = RequestMethod.POST)
        public Result save(@RequestBody Label label) {
            labelService.save(label);
            return new Result(true, StatusCode.OK,"保存成功");
        }
    
        /**
         * 更新
         * @param label
         * @return
         */
        @RequestMapping(value = "/{id}",method = RequestMethod.PUT)
        public Result update(@PathVariable("id") String id,@RequestBody Label label) {
            label.setId(id);
            labelService.update(label);
            return new Result(true, StatusCode.OK,"更新成功");
        }
    
        /**
         * 根据id删除
         * @param id
         * @return
         */
        @RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
        public Result delete(@PathVariable("id") String id) {
            labelService.delete(id);
            return new Result(true, StatusCode.OK,"删除成功");
        }
    
    }
    
    

    @CrossOrigin用于解决跨域调用

2.3 功能测试

  1. 测试查询全部数据
    使用浏览器测试GET方法 http://localhost:9001/label
  2. 测试根据ID查询标签
    使用浏览器测试GET方法 http://localhost:9001/label/1
  3. 测试增加
    使用postMan工具来进行测试POST PUT DELETE等方法。
    在这里插入图片描述
  4. 测试修改
    在这里插入图片描述
  5. 测试删除
    在这里插入图片描述

3. 公共异常处理

为了使我们的代码更容易维护,我们创建一个类集中处理异常
在om.tensquare.user.controller包下创建公共异常处理类BaseExceptionHandler

package com.tensquare.base;

import entity.Result;
import entity.StatusCode;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 统一异常处理类
 */
@ControllerAdvice

public class BaseExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result error(Exception e) {
        e.printStackTrace();
        return new Result(false, StatusCode.ERROR, e.getMessage());
    }

}

4. 跨域处理

跨域是什么?浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域 。我们是采用前后端分离开发的,也是前后端分离部署的,必然会存在跨域问题。 怎么解决跨域?很简单,只需要在controller类上添加注解@CrossOrigin 即可!这个注解其实是CORS的实现。
CORS(Cross-Origin Resource Sharing, 跨源资源共享)是W3C出的一个标准,其思想是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,还是应该失败。因此,要想实现CORS进行跨域,需要服务器进行一些设置,同时前端也需要做一些配置和分析。本文简单的对服务端的配置和前端的一些设置进行分析。

猜你喜欢

转载自blog.csdn.net/amingccc/article/details/84278094