Vue+axios+SpringMVC之解决跨域问题

本文介绍了一种通过后端配置解决跨域问题的方法。利用Spring框架的CORS配置,允许所有来源、方法和头部请求,同时支持凭证传递。此外,还在控制类中使用@CrossOrigin注解增强跨域支持。

跨域问题

这里我采用了后端解决,CORS大家可以去了解一下。
前端axios代码

这里写图片描述
后端 SpringMvc 新建个类
这里写图片描述
代码如下:

package com.news.utils;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import static org.springframework.web.cors.CorsConfiguration.ALL;

/**
 * CORS configuration
 */
@Configuration
public class CORSConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedOrigins(ALL)
                        .allowedMethods(ALL)
                        .allowedHeaders(ALL)
                        .allowCredentials(true);
            }
        };
    }

}

然后再在控制类中增加@CrossOrigin注解

就能解决问题了~

<think>我们正在开发一个基于Java、Vue3、Spring Boot和Spring MVC的制造执行系统(MES)。根据用户需求,我们需要提供示例代码或教程。我们将分步骤展示关键组件的代码示例。 ### 后端(Spring Boot + Spring MVC) #### 1. 创建Spring Boot项目 使用Spring Initializr(https://start.spring.io/)创建一个新的Spring Boot项目,选择以下依赖: - Spring Web (用于构建Web应用) - Spring Data JPA (用于数据库操作) - MySQL Driver (如果使用MySQL) #### 2. 数据模型层(Entity) 假设我们有一个`ProductionOrder`(生产订单)实体。 ```java // src/main/java/com/example/mes/entity/ProductionOrder.java package com.example.mes.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import java.time.LocalDateTime; @Entity public class ProductionOrder { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String orderNumber; private String productCode; private int quantity; private LocalDateTime startTime; private LocalDateTime endTime; private String status; // 如:新建、进行中、完成 // 省略getter和setter } ``` #### 3. 数据访问层(Repository) 创建JPA Repository接口。 ```java // src/main/java/com/example/mes/repository/ProductionOrderRepository.java package com.example.mes.repository; import com.example.mes.entity.ProductionOrder; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface ProductionOrderRepository extends JpaRepository<ProductionOrder, Long> { List<ProductionOrder> findByStatus(String status); } ``` #### 4. 服务层(Service) 实现业务逻辑。 ```java // src/main/java/com/example/mes/service/ProductionOrderService.java package com.example.mes.service; import com.example.mes.entity.ProductionOrder; import com.example.mes.repository.ProductionOrderRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class ProductionOrderService { @Autowired private ProductionOrderRepository repository; public List<ProductionOrder> getAllOrders() { return repository.findAll(); } public ProductionOrder createOrder(ProductionOrder order) { // 这里可以添加业务逻辑,比如设置默认状态 order.setStatus("新建"); return repository.save(order); } // 其他业务方法... } ``` #### 5. 控制器层(Controller) 提供RESTful API。 ```java // src/main/java/com/example/mes/controller/ProductionOrderController.java package com.example.mes.controller; import com.example.mes.entity.ProductionOrder; import com.example.mes.service.ProductionOrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/api/production-orders") public class ProductionOrderController { @Autowired private ProductionOrderService service; @GetMapping public List<ProductionOrder> getAll() { return service.getAllOrders(); } @PostMapping public ProductionOrder create(@RequestBody ProductionOrder order) { return service.createOrder(order); } } ``` ### 前端(Vue3) #### 1. 创建Vue3项目 使用Vue CLI创建项目: ```bash vue create mes-frontend ``` 选择Vue3和需要的配置。 #### 2. 安装依赖 安装axios用于HTTP请求: ```bash cd mes-frontend npm install axios ``` #### 3. 创建生产订单列表组件 ```vue <!-- src/components/ProductionOrderList.vue --> <template> <div> <h1>生产订单列表</h1> <table> <thead> <tr> <th>订单号</th> <th>产品代码</th> <th>数量</th> <th>状态</th> </tr> </thead> <tbody> <tr v-for="order in orders" :key="order.id"> <td>{{ order.orderNumber }}</td> <td>{{ order.productCode }}</td> <td>{{ order.quantity }}</td> <td>{{ order.status }}</td> </tr> </tbody> </table> </div> </template> <script> import axios from 'axios'; export default { data() { return { orders: [] }; }, mounted() { this.fetchOrders(); }, methods: { fetchOrders() { axios.get('http://localhost:8080/api/production-orders') .then(response => { this.orders = response.data; }) .catch(error => { console.error('获取生产订单失败:', error); }); } } }; </script> ``` #### 4. 在App.vue中使用组件 ```vue <!-- src/App.vue --> <template> <div id="app"> <ProductionOrderList /> </div> </template> <script> import ProductionOrderList from './components/ProductionOrderList.vue'; export default { name: 'App', components: { ProductionOrderList } }; </script> ``` ### 配置后端 由于前端运行在另一个端口(如8081),需要配置后端允许。 ```java // src/main/java/com/example/mes/config/WebConfig.java package com.example.mes.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:8081") // Vue前端地址 .allowedMethods("GET", "POST", "PUT", "DELETE"); } } ``` ### 数据库配置 在`application.properties`中配置数据库连接: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/mes_db?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=yourpassword spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true ``` ### 运行项目 1. 启动Spring Boot应用(默认端口8080) 2. 启动Vue应用(默认端口8081): ```bash npm run serve ``` 访问`http://localhost:8081`即可看到生产订单列表。 以上是一个简单的MES系统前后端示例,实际系统会更复杂,包括用户认证、权限控制、更多业务模块等。 §§相关问题§§ 1. MES系统中常见的模块有哪些? 2. 如何实现Spring Boot和Vue3的用户认证? 3. MES系统如何与工厂设备进行数据交互? 4. 在MES系统中如何保证数据的安全性和可靠性?</think>### 基于Java、Vue3、Spring Boot和Spring MVC的MES系统开发指南 #### 一、系统架构设计 1. **前后端分离架构**: - 前端:Vue3 + TypeScript + Pinia状态管理 + Vite构建工具 - 后端:Spring Boot 3.x + Spring MVC + Spring Data JPA - 通信:RESTful API + Axios - 数据库:MySQL/PostgreSQL 2. **核心模块划分**: - 生产调度管理 - 质量检验追踪 - 设备状态监控 - 物料库存管理 - 工艺路线管理 #### 二、后端实现示例(Spring Boot) ##### 1. 生产工单实体类 ```java // src/main/java/com/mes/entity/WorkOrder.java @Entity @Table(name = "work_orders") public class WorkOrder { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String orderNumber; // 工单号 @Column(nullable = false) private String productCode; // 产品编码 @Column(nullable = false) private Integer quantity; // 计划数量 @Enumerated(EnumType.STRING) private OrderStatus status; // 工单状态 @CreationTimestamp private LocalDateTime createdAt; // 枚举类 public enum OrderStatus { CREATED, IN_PROGRESS, COMPLETED, CANCELED } // Getters & Setters } ``` ##### 2. Spring Data JPA仓库 ```java // src/main/java/com/mes/repository/WorkOrderRepository.java public interface WorkOrderRepository extends JpaRepository<WorkOrder, Long> { List<WorkOrder> findByStatus(WorkOrder.OrderStatus status); Optional<WorkOrder> findByOrderNumber(String orderNumber); } ``` ##### 3. Spring MVC控制器 ```java // src/main/java/com/mes/controller/WorkOrderController.java @RestController @RequestMapping("/api/work-orders") public class WorkOrderController { @Autowired private WorkOrderService workOrderService; @GetMapping public ResponseEntity<List<WorkOrder>> getAllOrders() { return ResponseEntity.ok(workOrderService.getAllOrders()); } @PostMapping public ResponseEntity<WorkOrder> createOrder(@RequestBody WorkOrder order) { return new ResponseEntity<>(workOrderService.createOrder(order), HttpStatus.CREATED); } @PutMapping("/{id}/status") public ResponseEntity<Void> updateStatus( @PathVariable Long id, @RequestParam WorkOrder.OrderStatus status) { workOrderService.updateStatus(id, status); return ResponseEntity.noContent().build(); } } ``` ##### 4. 业务服务层 ```java // src/main/java/com/mes/service/WorkOrderService.java @Service public class WorkOrderService { @Autowired private WorkOrderRepository repository; @Transactional public WorkOrder createOrder(WorkOrder order) { order.setStatus(WorkOrder.OrderStatus.CREATED); return repository.save(order); } public List<WorkOrder> getAllOrders() { return repository.findAll(Sort.by(Sort.Direction.DESC, "createdAt")); } } ``` #### 三、前端实现示例(Vue3) ##### 1. 生产工单列表组件 ```vue <!-- src/views/WorkOrderList.vue --> <script setup> import { ref, onMounted } from 'vue' import axios from 'axios' const orders = ref([]) const fetchOrders = async () => { const response = await axios.get('/api/work-orders') orders.value = response.data } onMounted(() => { fetchOrders() }) </script> <template> <div class="container"> <h2>生产工单管理</h2> <table class="table"> <thead> <tr> <th>工单号</th> <th>产品编码</th> <th>数量</th> <th>状态</th> <th>创建时间</th> </tr> </thead> <tbody> <tr v-for="order in orders" :key="order.id"> <td>{{ order.orderNumber }}</td> <td>{{ order.productCode }}</td> <td>{{ order.quantity }}</td> <td :class="`status-${order.status.toLowerCase()}`"> {{ order.status }} </td> <td>{{ new Date(order.createdAt).toLocaleString() }}</td> </tr> </tbody> </table> </div> </template> ``` ##### 2. Axios全局配置 ```javascript // src/utils/api.js import axios from 'axios' const api = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8080/api', timeout: 10000, headers: { 'Content-Type': 'application/json' } }) // 请求拦截器 api.interceptors.request.use(config => { const token = localStorage.getItem('auth_token') if (token) config.headers.Authorization = `Bearer ${token}` return config }) export default api ``` ##### 3. 状态管理(Pinia) ```javascript // src/stores/workOrderStore.js import { defineStore } from 'pinia' import api from '@/utils/api' export const useWorkOrderStore = defineStore('workOrder', { state: () => ({ orders: [], isLoading: false }), actions: { async fetchOrders() { this.isLoading = true try { const response = await api.get('/work-orders') this.orders = response.data } catch (error) { console.error('获取工单失败:', error) } finally { this.isLoading = false } } } }) ``` #### 四、关键集成点 1. **配置**(Spring Boot): ```java // src/main/java/com/mes/config/WebConfig.java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:5173") // Vue开发端口 .allowedMethods("GET", "POST", "PUT", "DELETE") .allowCredentials(true); } } ``` 2. **实时数据推送**(SSE示例): ```java // src/main/java/com/mes/controller/SseController.java @RestController @RequestMapping("/sse") public class SseController { private final SseEmitterService emitterService; @GetMapping("/production-events") public SseEmitter streamProductionEvents() { return emitterService.createEmitter(); } } ``` ```vue <!-- Vue前端接收SSE --> <script setup> import { onMounted } from 'vue' onMounted(() => { const eventSource = new EventSource('http://localhost:8080/sse/production-events') eventSource.onmessage = (event) => { console.log('实时更新:', JSON.parse(event.data)) // 更新Pinia状态 } eventSource.onerror = (err) => { console.error('SSE连接错误', err) eventSource.close() } }) </script> ``` #### 五、部署配置 1. **前后端分离部署**: - 前端:`npm run build`生成静态文件部署到Nginx - 后端:使用Spring Boot内嵌Tomcat,打包为JAR运行: ```bash mvn clean package java -jar target/mes-system-1.0.0.jar ``` 2. **生产环境配置**: ```properties # application-prod.properties spring.datasource.url=jdbc:mysql://prod-db:3306/mes_prod spring.datasource.username=prod_user spring.datasource.password=${DB_PASSWORD} spring.jpa.hibernate.ddl-auto=validate ``` #### 六、推荐学习资源 1. 官方文档: - [Spring Boot 3文档](https://spring.io/projects/spring-boot) - [Vue 3文档](https://vuejs.org/) 2. 完整项目参考: - GitHub示例:[spring-boot-vue3-mes](https://github.com/example/spring-boot-vue3-mes) - 在线演示:[MES Demo](http://demo.mes-system.com)(需账号) 3. 企业级扩展: - 集成Spring Security实现RBAC权限控制 - 使用WebSocket实现设备实时监控 - 整合Quartz实现生产计划调度 - 接入OPC UA协议对接工业设备 > 提示:实际MES系统需考虑工业环境特殊性,如高并发处理、断网续传、设备协议兼容性等[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值