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。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
5月前
|
云安全 人工智能 安全
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
阿里云 AI 安全护栏加入Dify平台,打造可信赖的 AI
3228 166
|
5月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
6143 84
|
5月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
7月前
|
前端开发 Java API
利用 Spring WebFlux 技术打造高效非阻塞 API 的完整开发方案与实践技巧
本文介绍了如何使用Spring WebFlux构建高效、可扩展的非阻塞API,涵盖响应式编程核心概念、技术方案设计及具体实现示例,适用于高并发场景下的API开发。
544 0
|
6月前
|
人工智能 安全 API
Dify平台集成安全护栏最佳实践
Dify平台提供低代码构建AI大模型应用的解决方案,支持云服务与私有化部署。本文介绍了在工作流和Agent中集成安全护栏的最佳实践,包括插件和扩展API两种方案。插件方式适用于工作流,一键安装实现输入输出防控;扩展API方式适用于Agent和工作流私有化部署场景,通过本地服务适配安全护栏API。文中还详细说明了操作步骤、前提条件及常见问题处理方法,帮助用户快速实现内容安全控制。
|
8月前
|
人工智能 搜索推荐 API
AI-Compass DeepSearch深度搜索生态:集成阿里ZeroSearch、字节DeerFlow、MindSearch等前沿平台,实现超越传统关键词匹配的智能信息检索革命
AI-Compass DeepSearch深度搜索生态:集成阿里ZeroSearch、字节DeerFlow、MindSearch等前沿平台,实现超越传统关键词匹配的智能信息检索革命
AI-Compass DeepSearch深度搜索生态:集成阿里ZeroSearch、字节DeerFlow、MindSearch等前沿平台,实现超越传统关键词匹配的智能信息检索革命
|
6月前
|
安全 数据可视化 Java
AiPy开发的 Spring 漏洞检测神器,未授权访问无所遁形
针对Spring站点未授权访问问题,现有工具难以检测如Swagger、Actuator等组件漏洞,且缺乏修复建议。全新AI工具基于Aipy开发,具备图形界面,支持一键扫描常见Spring组件,自动识别未授权访问风险,按漏洞类型标注并提供修复方案,扫描结果可视化展示,支持导出报告,大幅提升渗透测试与漏洞定位效率。
|
7月前
|
供应链 监控 搜索推荐
35页PPT|零售行业自助数据分析方法论:指标体系构建平台集成、会员与商品精细化运营实践
在零售行业环境剧变的背景下,传统“人找货”模式正被“货找人”取代。消费者需求日益个性化,购买路径多元化,企业亟需构建统一的指标体系,借助BI平台实现数据驱动的精细化运营。本文从指标体系构建、平台集成到会员与商品运营实践,系统梳理零售经营分析的方法论,助力企业实现敏捷决策与业务闭环。
35页PPT|零售行业自助数据分析方法论:指标体系构建平台集成、会员与商品精细化运营实践
|
8月前
|
机器学习/深度学习 人工智能 监控
CI/CD与模型监控平台集成MLOps系统实现的全面路径
MLOps是机器学习模型在生产环境中持续优化、部署和维护的关键。通过CI/CD流水线和模型监控平台的结合,可以大大提高模型开发和运维的效率,实现高效、稳定的模型服务。随着AI技术的快速发展,MLOps将在企业级AI应用中发挥越来越重要的作用。
CI/CD与模型监控平台集成MLOps系统实现的全面路径