diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/PlatformLibController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/PlatformLibController.java
index f69aa6d..5354071 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/PlatformLibController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/PlatformLibController.java
@@ -1,17 +1,11 @@
package com.ruoyi.web.controller;
+import java.io.IOException;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
@@ -20,6 +14,9 @@ import com.ruoyi.system.domain.PlatformLib;
import com.ruoyi.system.service.IPlatformLibService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.common.config.RuoYiConfig;
+import org.springframework.web.multipart.MultipartFile;
/**
* 平台模版库Controller
@@ -74,9 +71,18 @@ public class PlatformLibController extends BaseController
*/
@PreAuthorize("@ss.hasPermi('system:lib:add')")
@Log(title = "平台模版库", businessType = BusinessType.INSERT)
- @PostMapping
- public AjaxResult add(@RequestBody PlatformLib platformLib)
+ @PostMapping("/add")
+ public AjaxResult add(PlatformLib platformLib, @RequestParam("file") MultipartFile file) throws IOException
{
+ // 判断前端是否有文件传过来
+ if (file != null && !file.isEmpty())
+ {
+ String fileName = FileUploadUtils.upload(RuoYiConfig.getProfile(), file);
+ // 把这个路径存入实体类的 iconUrl 属性,对应数据库 icon_url 字段
+ platformLib.setIconUrl(fileName);
+ }
+
+ // 执行原有的插入逻辑
return toAjax(platformLibService.insertPlatformLib(platformLib));
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java
index cc1b6f4..88d3615 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java
@@ -172,7 +172,9 @@ public class FileUploadUtils
{
int dirLastIndex = RuoYiConfig.getProfile().length() + 1;
String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
- return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
+ String path = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
+
+ return path.replaceAll("/+", "/");
}
/**
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
index 511842b..d5f704e 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -23,19 +23,18 @@ import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl;
/**
* spring security配置
- *
+ *
* @author ruoyi
*/
@EnableMethodSecurity(prePostEnabled = true, securedEnabled = true)
@Configuration
-public class SecurityConfig
-{
+public class SecurityConfig {
/**
* 自定义用户认证逻辑
*/
@Autowired
private UserDetailsService userDetailsService;
-
+
/**
* 认证失败处理类
*/
@@ -53,7 +52,7 @@ public class SecurityConfig
*/
@Autowired
private JwtAuthenticationTokenFilter authenticationTokenFilter;
-
+
/**
* 跨域过滤器
*/
@@ -70,8 +69,7 @@ public class SecurityConfig
* 身份验证实现
*/
@Bean
- public AuthenticationManager authenticationManager()
- {
+ public AuthenticationManager authenticationManager() {
DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
daoAuthenticationProvider.setUserDetailsService(userDetailsService);
daoAuthenticationProvider.setPasswordEncoder(bCryptPasswordEncoder());
@@ -94,46 +92,45 @@ public class SecurityConfig
* authenticated | 用户登录后可访问
*/
@Bean
- protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception
- {
+ protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
return httpSecurity
- // CSRF禁用,因为不使用session
- .csrf(csrf -> csrf.disable())
- // 禁用HTTP响应标头
- .headers((headersCustomizer) -> {
- headersCustomizer.cacheControl(cache -> cache.disable()).frameOptions(options -> options.sameOrigin());
- })
- // 认证失败处理类
- .exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler))
- // 基于token,所以不需要session
- .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
- // 注解标记允许匿名访问的url
- .authorizeHttpRequests((requests) -> {
- permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());
- // 对于登录login 注册register 验证码captchaImage 允许匿名访问
- requests.antMatchers("/login", "/register", "/captchaImage").permitAll()
- // 静态资源,可匿名访问
- .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
- .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
- // 除上面外的所有请求全部需要鉴权认证
- .anyRequest().authenticated();
- })
- // 添加Logout filter
- .logout(logout -> logout.logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler))
- // 添加JWT filter
- .addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)
- // 添加CORS filter
- .addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class)
- .addFilterBefore(corsFilter, LogoutFilter.class)
- .build();
+ // CSRF禁用,因为不使用session
+ .csrf(csrf -> csrf.disable())
+ // 禁用HTTP响应标头
+ .headers((headersCustomizer) -> {
+ headersCustomizer.cacheControl(cache -> cache.disable()).frameOptions(options -> options.sameOrigin());
+ })
+ // 认证失败处理类
+ .exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler))
+ // 基于token,所以不需要session
+ .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
+ // 注解标记允许匿名访问的url
+ .authorizeHttpRequests((requests) -> {
+ permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());
+ // 对于登录login 注册register 验证码captchaImage 允许匿名访问
+ requests.antMatchers("/login", "/register", "/captchaImage").permitAll()
+ // 静态资源,可匿名访问
+ .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
+ .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
+ .antMatchers("/profile/**").permitAll()
+ // 除上面外的所有请求全部需要鉴权认证
+ .anyRequest().authenticated();
+ })
+ // 添加Logout filter
+ .logout(logout -> logout.logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler))
+ // 添加JWT filter
+ .addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)
+ // 添加CORS filter
+ .addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class)
+ .addFilterBefore(corsFilter, LogoutFilter.class)
+ .build();
}
/**
* 强散列哈希加密实现
*/
@Bean
- public BCryptPasswordEncoder bCryptPasswordEncoder()
- {
+ public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/PlatformLib.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/PlatformLib.java
index 902ebd5..b0d1087 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/PlatformLib.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/PlatformLib.java
@@ -7,76 +7,88 @@ import com.ruoyi.common.core.domain.BaseEntity;
/**
* 平台模版库对象 platform_lib
- *
+ *
* @author ruoyi
* @date 2026-01-14
*/
-public class PlatformLib extends BaseEntity
-{
+public class PlatformLib extends BaseEntity {
private static final long serialVersionUID = 1L;
- /** 平台库ID */
+ /**
+ * 平台库ID
+ */
private Long id;
- /** 平台名称 (如: F-22 猛禽) */
+ /**
+ * 平台名称 (如: F-22 猛禽)
+ */
@Excel(name = "平台名称 (如: F-22 猛禽)")
private String name;
- /** 类型: Aircraft, Vehicle, Radar, Ship */
- @Excel(name = "类型: Aircraft, Vehicle, Radar, Ship")
+ /**
+ * 类型: Aircraft, Vehicle, Radar, Ship
+ */
+ @Excel(name = "类型: Air, Sea, Ground")
private String type;
- /** 核心参数JSON: {icon_url, max_speed, max_fuel, radar_range...} */
+ /**
+ * 核心参数JSON: {icon_url, max_speed, max_fuel, radar_range...}
+ */
@Excel(name = "核心参数JSON: {icon_url, max_speed, max_fuel, radar_range...}")
private String specsJson;
- public void setId(Long id)
- {
+ @Excel(name = "平台图标路径")
+ private String iconUrl;
+
+ public void setId(Long id) {
this.id = id;
}
- public Long getId()
- {
+ public Long getId() {
return id;
}
- public void setName(String name)
- {
+ public void setName(String name) {
this.name = name;
}
- public String getName()
- {
+ public String getName() {
return name;
}
- public void setType(String type)
- {
+ public void setType(String type) {
this.type = type;
}
- public String getType()
- {
+ public String getType() {
return type;
}
- public void setSpecsJson(String specsJson)
- {
+ public void setSpecsJson(String specsJson) {
this.specsJson = specsJson;
}
- public String getSpecsJson()
- {
+ public String getSpecsJson() {
return specsJson;
}
+ public void setIconUrl(String iconUrl) {
+ this.iconUrl = iconUrl;
+ }
+
+ public String getIconUrl() {
+ return iconUrl;
+ }
+
+
@Override
public String toString() {
- return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
- .append("id", getId())
- .append("name", getName())
- .append("type", getType())
- .append("specsJson", getSpecsJson())
- .toString();
+ return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+ .append("id", getId())
+ .append("name", getName())
+ .append("type", getType())
+ .append("specsJson", getSpecsJson())
+ .append("iconUrl", getIconUrl())
+ .toString();
}
}
diff --git a/ruoyi-system/src/main/resources/mapper/system/PlatformLibMapper.xml b/ruoyi-system/src/main/resources/mapper/system/PlatformLibMapper.xml
index b72202a..7161fdc 100644
--- a/ruoyi-system/src/main/resources/mapper/system/PlatformLibMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/PlatformLibMapper.xml
@@ -9,10 +9,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"