云文件管理系统上传组件优化
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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/");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
19
src/main/java/com/filesystem/controller/IndexController.java
Normal file
19
src/main/java/com/filesystem/controller/IndexController.java
Normal 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";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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: {
|
||||||
|
|||||||
Reference in New Issue
Block a user