diff --git a/.gitignore b/.gitignore index ed8368a..f87a0f6 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,5 @@ nbdist/ !*/build/*.java !*/build/*.html !*/build/*.xml + +ruoyi-admin/src/main/resources/public/* \ No newline at end of file diff --git a/clean.bat b/bin/clean.bat similarity index 100% rename from clean.bat rename to bin/clean.bat diff --git a/package.bat b/bin/package.bat similarity index 100% rename from package.bat rename to bin/package.bat diff --git a/run.bat b/bin/run.bat similarity index 100% rename from run.bat rename to bin/run.bat diff --git a/ry.bat b/bin/ry.bat similarity index 100% rename from ry.bat rename to bin/ry.bat diff --git a/bin/start.bat b/bin/start.bat new file mode 100644 index 0000000..8072836 --- /dev/null +++ b/bin/start.bat @@ -0,0 +1,13 @@ +@echo off +echo. +echo [��Ϣ] ʹ��Jar��������Web���̡� +echo. + +cd %~dp0 +cd ..\libs + +set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m + +java -jar %JAVA_OPTS% ruoyi-admin-1.0.0.jar + +pause \ No newline at end of file diff --git a/pom.xml b/pom.xml index 03dffab..0d448b6 100644 --- a/pom.xml +++ b/pom.xml @@ -211,12 +211,6 @@ ${net.coobird.version} - - org.springframework.boot - spring-boot-starter-thymeleaf - 2.5.15 - - com.ruoyi @@ -224,6 +218,13 @@ ${ruoyi.version} + + + org.tuckey + urlrewritefilter + 4.0.4 + + diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index b8f33de..2d8339c 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -18,12 +18,6 @@ - - - org.springframework.boot - spring-boot-starter-thymeleaf - - org.springframework.boot diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index ab06039..7387706 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -37,15 +37,6 @@ spring: restart: # 热部署开关 enabled: true - # 模板引擎 - thymeleaf: - mode: LEGACYHTML5 - encoding: utf-8 - # 禁用缓存 - cache: false - prefix: classpath:/web/ - suffix: .vue - content-type: text/html # 开发环境配置 server: @@ -118,18 +109,3 @@ xss: excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* - -sms: - # 启用短信平台 - startSms: true - # 过期时间(分钟) - expiration: 2 - # 发送频率间隔(分钟) - frequency: 1 - -# 短信平台(助通) -zt: - send: - sms: - username: znrx666hy - password: RXZTKS0FaLG4pN diff --git a/ruoyi-admin/src/main/resources/assembly.xml b/ruoyi-admin/src/main/resources/assembly.xml index 863c2d2..7936dc3 100644 --- a/ruoyi-admin/src/main/resources/assembly.xml +++ b/ruoyi-admin/src/main/resources/assembly.xml @@ -32,5 +32,10 @@ bin 755 + + ${project.parent.basedir}/bin/start.bat + bin + 755 + diff --git a/ruoyi-admin/src/main/resources/urlrewrite.xml b/ruoyi-admin/src/main/resources/urlrewrite.xml new file mode 100644 index 0000000..a8793e6 --- /dev/null +++ b/ruoyi-admin/src/main/resources/urlrewrite.xml @@ -0,0 +1,9 @@ + + + + + ^/api/(.*)$ + /$1 + + \ No newline at end of file diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/object/DumpUploadTask.java b/ruoyi-file/src/main/java/com/ruoyi/file/object/DumpUploadTask.java new file mode 100644 index 0000000..3d832f7 --- /dev/null +++ b/ruoyi-file/src/main/java/com/ruoyi/file/object/DumpUploadTask.java @@ -0,0 +1,19 @@ +package com.ruoyi.file.object; + +import java.util.TimerTask; + +public class DumpUploadTask extends TimerTask +{ + private final ProjectState state; + + public DumpUploadTask(ProjectState state) + { + this.state = state; + } + + @Override + public void run() + { + StateMachine.INSTANCE.AddState(state); + } +} diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/object/StateMachine.java b/ruoyi-file/src/main/java/com/ruoyi/file/object/StateMachine.java index 16f8441..70c3551 100644 --- a/ruoyi-file/src/main/java/com/ruoyi/file/object/StateMachine.java +++ b/ruoyi-file/src/main/java/com/ruoyi/file/object/StateMachine.java @@ -24,7 +24,7 @@ public final class StateMachine private final Map projectStateMap = new LinkedHashMap<>(); public static final StateMachine INSTANCE = new StateMachine(); - public void AddState(ProjectState state) + public synchronized void AddState(ProjectState state) { ProjectState projectState = projectStateMap.get(state.token); if(null != projectState) diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/request/CommonAttachReq.java b/ruoyi-file/src/main/java/com/ruoyi/file/request/CommonAttachReq.java index 13d11ca..ef2e337 100644 --- a/ruoyi-file/src/main/java/com/ruoyi/file/request/CommonAttachReq.java +++ b/ruoyi-file/src/main/java/com/ruoyi/file/request/CommonAttachReq.java @@ -6,16 +6,16 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Data -public class CommonAttachReq +public class CommonAttachReq extends RuralCollectiveAssetsBaseReq { + public static final String REDIRECT_URI = "/file/common/attach"; + @NotBlank(message = "文件分类不能为空") private String bizPath; @NotBlank(message = "文件表名不能为空") private String tableName; @NotNull(message = "文件表ID不能为空") private Long tableId; - @NotBlank(message = "服务标识不能为空") - private String token; private String fileType; } diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/request/CommonUploadReq.java b/ruoyi-file/src/main/java/com/ruoyi/file/request/CommonUploadReq.java index ab82989..d485904 100644 --- a/ruoyi-file/src/main/java/com/ruoyi/file/request/CommonUploadReq.java +++ b/ruoyi-file/src/main/java/com/ruoyi/file/request/CommonUploadReq.java @@ -6,10 +6,9 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Data -public class CommonUploadReq +public class CommonUploadReq extends RuralCollectiveAssetsBaseReq { - @NotBlank(message = "服务标识不能为空") - private String token; + public static final String REDIRECT_URI = "/file/common/upload"; private String bizPath = "upload"; } diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/request/FinanceVoucherUploadReq.java b/ruoyi-file/src/main/java/com/ruoyi/file/request/FinanceVoucherUploadReq.java index 1149f0d..419928f 100644 --- a/ruoyi-file/src/main/java/com/ruoyi/file/request/FinanceVoucherUploadReq.java +++ b/ruoyi-file/src/main/java/com/ruoyi/file/request/FinanceVoucherUploadReq.java @@ -2,14 +2,12 @@ package com.ruoyi.file.request; import lombok.Data; -import javax.validation.constraints.NotBlank; - @Data -public class FinanceVoucherUploadReq +public class FinanceVoucherUploadReq extends RuralCollectiveAssetsBaseReq { + public static final String REDIRECT_URI = "/file/finance/voucher/upload"; + private Long id; - @NotBlank(message = "服务标识不能为空") - private String token; private String bizPath = "voucher"; diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/request/RuralCollectiveAssetsBaseReq.java b/ruoyi-file/src/main/java/com/ruoyi/file/request/RuralCollectiveAssetsBaseReq.java new file mode 100644 index 0000000..50c1874 --- /dev/null +++ b/ruoyi-file/src/main/java/com/ruoyi/file/request/RuralCollectiveAssetsBaseReq.java @@ -0,0 +1,37 @@ +package com.ruoyi.file.request; + +import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.utils.StringUtils; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.Map; + +@Data +public class RuralCollectiveAssetsBaseReq +{ + @NotBlank(message = "服务标识不能为空") + private String token; + + private String authorization; // api_token 如果为空, 重定向则不携带身份认证 + + public Map toMap(String...rmNames) + { + Map map = BeanUtil.beanToMap(this, false, true); + map.remove("token"); + map.remove("authorization"); + if(null != rmNames) + { + for(String rmName : rmNames) + { + map.remove(rmName); + } + } + return map; + } + + public boolean withAuthorization() + { + return StringUtils.isNotEmpty(authorization); + } +} diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/request/UploadRedirectReq.java b/ruoyi-file/src/main/java/com/ruoyi/file/request/UploadRedirectReq.java index 9b9aee5..4afdc29 100644 --- a/ruoyi-file/src/main/java/com/ruoyi/file/request/UploadRedirectReq.java +++ b/ruoyi-file/src/main/java/com/ruoyi/file/request/UploadRedirectReq.java @@ -1,16 +1,12 @@ package com.ruoyi.file.request; -import com.ruoyi.common.utils.StringUtils; import lombok.Data; -import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.validation.constraints.NotBlank; import java.util.Enumeration; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -import java.util.Set; @Data public final class UploadRedirectReq @@ -18,12 +14,22 @@ public final class UploadRedirectReq @NotBlank(message = "重定向地址不能为空") private String redirectUri; - private String token; + // 身份授权, 从请求中读取 + private String authorization; + // 重定向携带身份授权的参数名, 置空则不携带 + private String authorizationName = "api_token"; + // 重定向参数数据 private Map formData; public void ParseToken(HttpServletRequest request) { - token = request.getHeader("Authorization"); + authorization = request.getHeader("Authorization"); + } + + public void SetupToken(String authorizationName, HttpServletRequest request) + { + this.authorizationName = authorizationName; + ParseToken(request); } public void ParseFormData(HttpServletRequest request) diff --git a/ruoyi-file/src/main/java/com/ruoyi/file/service/FileService.java b/ruoyi-file/src/main/java/com/ruoyi/file/service/FileService.java index 4c1516c..86039a3 100644 --- a/ruoyi-file/src/main/java/com/ruoyi/file/service/FileService.java +++ b/ruoyi-file/src/main/java/com/ruoyi/file/service/FileService.java @@ -12,6 +12,7 @@ import cn.hutool.http.Method; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.PathUtils; import com.ruoyi.file.domain.Project; +import com.ruoyi.file.object.DumpUploadTask; import com.ruoyi.file.request.CommonAttachReq; import com.ruoyi.file.request.CommonUploadReq; import com.ruoyi.file.object.ProjectState; @@ -27,6 +28,7 @@ import com.ruoyi.file.object.UploadSession; import com.ruoyi.file.object.UploadTask; import com.ruoyi.file.utils.FileUploadFunc; import com.ruoyi.file.utils.ProjectUtils; +import com.ruoyi.framework.manager.AsyncManager; import com.ruoyi.framework.web.service.TokenService; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @@ -37,6 +39,7 @@ import javax.servlet.http.HttpServletResponse; import java.nio.charset.StandardCharsets; import java.util.LinkedHashMap; import java.util.Map; +import java.util.TimerTask; @Service public class FileService @@ -97,8 +100,8 @@ public class FileService public void commonUpload(MultipartFile file, CommonUploadReq req, HttpServletRequest request, HttpServletResponse response) { UploadRedirectReq redirectReq = new UploadRedirectReq(); - redirectReq.setRedirectUri("/file/common/upload"); - redirectReq.ParseToken(request); + redirectReq.setRedirectUri(CommonUploadReq.REDIRECT_URI); + redirectReq.SetupToken(req.getAuthorization(), request); UploadLog.Clear(); UploadSession session = Upload(file, req.getBizPath(), req.getToken()); @@ -109,11 +112,9 @@ public class FileService public void commonAttach(MultipartFile file, CommonAttachReq req, HttpServletRequest request, HttpServletResponse response) { UploadRedirectReq redirectReq = new UploadRedirectReq(); - redirectReq.setRedirectUri("/file/common/attach"); - Map map = BeanUtil.beanToMap(req, false, true); - map.remove("token"); - redirectReq.setFormData(map); - redirectReq.ParseToken(request); + redirectReq.setRedirectUri(CommonAttachReq.REDIRECT_URI); + redirectReq.setFormData(req.toMap()); + redirectReq.SetupToken(req.getAuthorization(), request); UploadLog.Clear(); UploadSession session = Upload(file, req.getBizPath(), req.getToken()); @@ -124,12 +125,9 @@ public class FileService public void financeVoucherUpload(MultipartFile file, FinanceVoucherUploadReq req, HttpServletRequest request, HttpServletResponse response) { UploadRedirectReq redirectReq = new UploadRedirectReq(); - redirectReq.setRedirectUri("/file/finance/voucher/upload"); - Map map = BeanUtil.beanToMap(req, false, true); - map.remove("token"); - map.remove("bizPath"); - redirectReq.setFormData(map); - redirectReq.ParseToken(request); + redirectReq.setRedirectUri(FinanceVoucherUploadReq.REDIRECT_URI); + redirectReq.setFormData(req.toMap("bizPath")); + redirectReq.SetupToken(req.getAuthorization(), request); UploadLog.Clear(); UploadSession session = Upload(file, req.getBizPath(), req.getToken()); @@ -194,7 +192,8 @@ public class FileService { String url = PathUtils.appendPaths(session.project.getRemoteHost(), req.getRedirectUri()); Map parms = new LinkedHashMap<>(); - parms.put("api_token", TokenService.getPureToken(req.getToken())); + if(StringUtils.isNotEmpty(req.getAuthorizationName())) + parms.put(req.getAuthorizationName(), TokenService.getPureToken(req.getAuthorization())); parms.put("fileUrl", session.result.getFileUrl()); parms.put("fileName", session.task.OriginFileName()); if(StringUtils.isNotEmpty(session.result.getThumbnailFileUrl())) @@ -244,7 +243,8 @@ public class FileService state.AddNumError(1); state.SetLastErrorTime(session.result.getTime()); } - StateMachine.INSTANCE.AddState(state); UploadLog.Appendln(state.ToString(", ")); + + AsyncManager.me().execute(new DumpUploadTask(state)); } } diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index c358689..693aad3 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -65,6 +65,12 @@ ruoyi-system + + + org.tuckey + urlrewritefilter + + 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 c6312df..e76c461 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 @@ -126,7 +126,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter // open 放行 .antMatchers("/open/**").permitAll() - .antMatchers("/admin/**").permitAll() + // 静态资源 + .antMatchers("/static/**").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/UrlRewriteConf.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/UrlRewriteConf.java new file mode 100644 index 0000000..c310554 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/UrlRewriteConf.java @@ -0,0 +1,34 @@ +package com.ruoyi.framework.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.core.io.Resource; +import org.tuckey.web.filters.urlrewrite.Conf; +import org.tuckey.web.filters.urlrewrite.UrlRewriteFilter; + +import javax.servlet.FilterConfig; +import java.io.IOException; + +@Configuration +@Order(Integer.MIN_VALUE) // 必须先于security过滤器 +public class UrlRewriteConf extends UrlRewriteFilter +{ + private static final String URL_REWRITE = "classpath:/urlrewrite.xml"; + + //注入urlrewrite配置文件 + @Value(URL_REWRITE) + private Resource resource; + + //重写配置文件加载方式 + protected void loadUrlRewriter(FilterConfig filterConfig) + { + try { + //将Resource对象转换成Conf对象 + Conf conf = new Conf(filterConfig.getServletContext(), resource.getInputStream(), resource.getFilename(), "@@traceability@@"); + checkConf(conf); + } catch (IOException ex) { + throw new RuntimeException("Unable to load URL rewrite configuration file from " + URL_REWRITE, ex); + } + } +}