云文件管理系统上传组件优化

This commit is contained in:
2026-04-02 12:52:40 +08:00
parent abbc0781be
commit 5053d396f8
6 changed files with 73 additions and 9 deletions

View File

@@ -50,6 +50,13 @@ public class SecurityConfig {
.requestMatchers("/files/avatar/**").permitAll() .requestMatchers("/files/avatar/**").permitAll()
.requestMatchers("/api/files/avatar/**").permitAll() .requestMatchers("/api/files/avatar/**").permitAll()
.requestMatchers("/api/messages/file/**").permitAll() .requestMatchers("/api/messages/file/**").permitAll()
.requestMatchers("/webapp/**").permitAll()
.requestMatchers("/assets/**").permitAll()
.requestMatchers("/login", "/register").permitAll()
.requestMatchers("/").permitAll()
.requestMatchers("/desktop").permitAll()
.requestMatchers("/desktop/**").permitAll()
.requestMatchers("/favicon.ico").permitAll()
.anyRequest().authenticated() .anyRequest().authenticated()
) )
.exceptionHandling(exception -> exception .exceptionHandling(exception -> exception

View File

@@ -2,11 +2,13 @@ package com.filesystem.config;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.http.CacheControl;
import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.concurrent.TimeUnit;
@Configuration @Configuration
public class WebConfig implements WebMvcConfigurer { public class WebConfig implements WebMvcConfigurer {
@@ -24,7 +26,20 @@ public class WebConfig implements WebMvcConfigurer {
@Override @Override
public void addResourceHandlers(ResourceHandlerRegistry registry) { public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 上传文件目录
registry.addResourceHandler("/uploads/**") registry.addResourceHandler("/uploads/**")
.addResourceLocations("file:" + Paths.get(uploadDir).toAbsolutePath() + "/"); .addResourceLocations("file:" + Paths.get(uploadDir).toAbsolutePath() + "/");
// 前端静态资源webapp 目录)
registry.addResourceHandler("/webapp/**")
.addResourceLocations("classpath:/webapp/")
.setCacheControl(CacheControl.noCache().mustRevalidate());
registry.addResourceHandler("/assets/**")
.addResourceLocations("classpath:/webapp/assets/")
.setCacheControl(CacheControl.noCache().mustRevalidate());
registry.addResourceHandler("/favicon.ico")
.addResourceLocations("classpath:/webapp/");
} }
} }

View File

@@ -0,0 +1,19 @@
package com.filesystem.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class IndexController {
@GetMapping({"/", "/login", "/register"})
public String forward() {
return "forward:/webapp/index.html";
}
// 捕获所有前端路由,返回 index.html 让 Vue Router 处理
@GetMapping("/desktop/**")
public String desktop() {
return "forward:/webapp/index.html";
}
}

View File

@@ -32,7 +32,15 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
new AntPathRequestMatcher("/api/files/test"), new AntPathRequestMatcher("/api/files/test"),
new AntPathRequestMatcher("/ws/**"), new AntPathRequestMatcher("/ws/**"),
new AntPathRequestMatcher("/api/files/avatar/**"), new AntPathRequestMatcher("/api/files/avatar/**"),
new AntPathRequestMatcher("/api/messages/file/**") new AntPathRequestMatcher("/api/messages/file/**"),
new AntPathRequestMatcher("/webapp/**"),
new AntPathRequestMatcher("/assets/**"),
new AntPathRequestMatcher("/favicon.ico"),
new AntPathRequestMatcher("/login"),
new AntPathRequestMatcher("/register"),
new AntPathRequestMatcher("/"),
new AntPathRequestMatcher("/desktop"),
new AntPathRequestMatcher("/desktop/**")
); );
@Override @Override

View File

@@ -821,22 +821,22 @@ const getFileIconColor = (file) => {
.grid-view { .grid-view {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 24px; gap: 16px;
padding: 24px; padding: 16px;
align-content: start; align-content: start;
} }
.file-card { .file-card {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 24px; padding: 16px;
border: 1px solid #e4e7ed; border: 1px solid #e4e7ed;
border-radius: 8px; border-radius: 8px;
cursor: pointer; cursor: pointer;
transition: all 0.2s; transition: all 0.2s;
background: #fff; background: #fff;
min-height: 180px; min-height: 140px;
} }
.file-card:hover { .file-card:hover {
@@ -876,17 +876,23 @@ const getFileIconColor = (file) => {
.file-card-actions { .file-card-actions {
display: flex; display: flex;
flex-wrap: nowrap; gap: 4px;
gap: 6px;
justify-content: center; justify-content: center;
overflow: hidden;
} }
.file-card-actions .el-button { .file-card-actions .el-button {
font-size: 12px; font-size: 12px;
padding: 4px 8px;
min-width: 0;
}
.file-card-actions .el-button + .el-button {
margin-left: 0;
} }
.file-card-actions .el-button span { .file-card-actions .el-button span {
margin-left: 2px; display: inline;
} }
.pagination-wrapper { .pagination-wrapper {

View File

@@ -1,6 +1,10 @@
import { defineConfig } from 'vite' import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue' import vue from '@vitejs/plugin-vue'
import path from 'path' import path from 'path'
import { fileURLToPath } from 'url'
import { dirname, resolve } from 'path'
const __dirname = dirname(fileURLToPath(import.meta.url))
export default defineConfig({ export default defineConfig({
plugins: [vue()], plugins: [vue()],
@@ -9,6 +13,11 @@ export default defineConfig({
'@': path.resolve(__dirname, 'src') '@': path.resolve(__dirname, 'src')
} }
}, },
base: '/', // 绝对路径,打包后 HTML 引用 /assets/...
build: {
outDir: resolve(__dirname, '../src/main/resources/webapp'),
emptyOutDir: true
},
server: { server: {
port: 5173, port: 5173,
proxy: { proxy: {