antd pro与spring boot集成开发平台搭建

简介: antd pro与spring boot集成开发平台搭建

后台工程的搭建

解决跨域问题(通过增加filter)

跨域请求错误

问题描述:Failed to load http://localhost:8099/api/user/insertUser: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8099' is therefore not allowed access.

解决方式

因为浏览器的同源策略,所谓的同源是指,域名,协议,端口相同。
因此产生了跨域问题,解决方式如下:

package com.lys.k8s.filter;/**
 * Created by lys on 2019/1/30.
 */

import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @ClassName CasSecurityFilter
 * @Description TODO
 * @Author 刘云生
 * @Date 2019/1/30 11:01
 **/
@Component
public class CasSecurityFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
        // 说明:httpResponse.addHeader("Access-Control-Allow-Origin","http://127.0.0.1:8020")添加的响应的地址;
        httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
        httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE,PUT");
        httpServletResponse.setHeader("Access-Control-Max-Age", "3600");
        httpServletResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with, X-Custom-Header");

        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

集成springfox-swagger-ui 实现接口的可视化

pom.xml增加依赖

<dependency>

            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.2.2</version>
        </dependency>

Controller层实现例子

package com.lys.k8s.controller;

import com.lys.k8s.entity.dto.ResultDTO;
import com.lys.k8s.entity.User;
import com.lys.k8s.entity.dto.UserDTO;
import com.lys.k8s.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * @ClassName UserController
 * @Description 用户
 * @Author liuysh
 * @Date 2019/1/24 11:06
 **/
@Controller
@RequestMapping(value = "api/user")
@Api(value = "用户的增删改查")
public class UserController {

    @Autowired
    UserService userService;

    @RequestMapping(value = "selectByPrimaryKey", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "根据id获取用户信息")
    public ResponseEntity<Object> selectByPrimaryKey(@RequestParam String userId) {
        ResultDTO resultDTO = new ResultDTO();
        try{
            resultDTO.setFlag(true);
            resultDTO.setResultData(userService.selectByPrimaryKey(userId));

        }catch (Exception e){
            resultDTO.setFlag(false);
            resultDTO.setMessage("获取失败");

        }

        return new ResponseEntity<>(resultDTO, HttpStatus.OK);
    }



    @RequestMapping(value = "deleteByPrimaryKey", method = RequestMethod.POST)
    @ResponseBody
    @ApiOperation(value = "根据id删除用户")
    public ResponseEntity<Object> deleteByPrimaryKey(@RequestParam String userId) {
        ResultDTO resultDTO = new ResultDTO();
        try{
            resultDTO.setFlag(true);
            resultDTO.setResultData(userService.deleteByPrimaryKey(userId));

        }catch (Exception e){
            resultDTO.setFlag(false);
            resultDTO.setMessage("获取失败");

        }

        return new ResponseEntity<>(resultDTO, HttpStatus.OK);
    }


    @RequestMapping(value = "/insertUser")
    @ResponseBody
    @ApiModelProperty(value="user",notes = "修改后用户信息的json串")
    @ApiOperation(value = "新增用户", notes="返回新增的用户信息")
    public ResponseEntity<Object> insertUser(@RequestBody User user) {
        ResultDTO resultDTO = new ResultDTO();
        try{
            resultDTO.setFlag(true);
            resultDTO.setResultData(userService.insert(user));

        }catch (Exception e){
            resultDTO.setFlag(false);
            resultDTO.setMessage("插入失败");

        }

        return new ResponseEntity<>(resultDTO, HttpStatus.OK);
    }

}

数据库表结构

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `user_id` varchar(36) COLLATE utf8_unicode_ci NOT NULL,
  `user_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `user_password` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

antd 平台的搭建

下载安装antd pro项目

$ git clone https://github.com/ant-design/ant-design-pro.git --depth=1
$ cd ant-design-pro
$ npm install
$ npm start         # visit http://localhost:8000

设置接口调用代理

# 后台接口为 http://localhost:8099/api/user/insertUser

# 修改config/config.js的下面代码
  proxy: {
    '/api': {
      target: 'http://10.6.6.193:8099/',
      changeOrigin: false,
      pathRewrite: { '^/api': '/api' },
    },
  },
  

前端调用样例

在显示页面中(1.利用封装框架调用--推荐)

// D:\lys_spaces_web\ant-design-pro\src\pages\UserManagement\models\usermanagement.js

const { dispatch } = this.props;
let user={};
user.userId='localhost';
user.userName='99999';
user.userPassword='999';
dispatch({
  type: 'usermanagement/insertUserEffects',
  payload: user

});

在显示页面中(2.直接调用)

let url = 'http://10.6.6.193:8099/api/user/insertUser';

    console.log(JSON.stringify(user));
    console.log(user);
    var fetchOption = {
      method: 'POST',
      headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', },
      body:JSON.stringify(user)
    }
    // 开始所需数据的下载
    fetch(url,fetchOption)
      .then(response=>response.json())
      .then(responseJson=>{
        console.log(responseJson);

      }).catch(function(e) {
      console.log("Oops, error");
    });

调用 model 的 effect

import { insertUser} from "../../../services/api";

export default {
  namespace: 'usermanagement',

  state: {
    list: [],
    currentUser: {},
  },

  effects: {

    *insertUserEffects({ payload }, { call, put }) {
      const response = yield call(insertUser, payload);
      yield put({
        type: 'save',
        payload: response,
      });
    },
  },

  reducers: {
    save(state, action) {
      return {
        ...state,
        list: action.payload,
      };
    },

  },
};

调用统一管理的 service 请求函数

// D:\lys_spaces_web\ant-design-pro\src\services\api.js

import { stringify } from 'qs';
import request from '@/utils/request';

export async function insertUser(params) {
  debugger
  return request('/api/user/insertUser', {
    method: 'POST',
    body: params,
  });
}

使用封装的 request.js 发送请求;

总结

在 Ant Design Pro 中,一个完整的前端 UI 交互到服务端处理流程是这样的:

1.UI 组件交互操作;

2.调用 model 的 effect;

3.调用统一管理的 service 请求函数;

4.使用封装的 request.js 发送请求;

5.获取服务端返回;

6.然后调用 reducer 改变 state;

7.更新 model。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
JavaScript 前端开发 持续交付
Prettier 高级应用:集成 CI/CD 流水线与插件开发
【10月更文挑战第18天】Prettier 是一款流行的代码格式化工具,它能够自动将代码格式化成一致的风格,从而提高代码的可读性和维护性。对于希望进一步发挥 Prettier 潜力的高级用户而言,将 Prettier 集成到持续集成(CI)和持续部署(CD)流程中,确保每次提交的代码都符合团队标准,是非常重要的。此外,通过开发自定义插件来支持更多语言或扩展 Prettier 的功能也是值得探索的方向。本文将详细介绍这两方面的内容。
49 2
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
48 4
|
9天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
25 2
|
17天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
30 2
|
22天前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
74 1
|
1月前
|
JSON Java API
springboot集成ElasticSearch使用completion实现补全功能
springboot集成ElasticSearch使用completion实现补全功能
36 1
|
2月前
|
XML Java 数据格式
提升效率!Spring Boot 开发中的常见失误轻松规避
本文深入探讨了在 Spring Boot 开发中常见的失误,包括不当使用注解、不良异常处理、低效日志记录等,提供了有效的规避策略,帮助开发者提升代码质量和系统性能,构建更健壮、高效的应用程序。
|
22天前
|
XML 存储 Java
SpringBoot集成Flowable:构建强大的工作流引擎
在企业级应用开发中,工作流管理是核心功能之一。Flowable是一个开源的工作流引擎,它提供了BPMN 2.0规范的实现,并且与SpringBoot框架完美集成。本文将探讨如何使用SpringBoot和Flowable构建一个强大的工作流引擎,并分享一些实践技巧。
60 0
|
22天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
31 0
|
2月前
|
数据采集 DataWorks 数据管理
DataWorks不是Excel,它是一个数据集成和数据管理平台
【10月更文挑战第10天】随着大数据技术的发展,企业对数据处理的需求日益增长。阿里云推出的DataWorks是一款强大的数据集成和管理平台,提供从数据采集、清洗、加工到应用的一站式解决方案。本文通过电商平台案例,详细介绍了DataWorks的核心功能和优势,展示了如何高效处理大规模数据,帮助企业挖掘数据价值。
112 1