development test

dev-deployment
luotaiqian 2026-07-01 16:02:11 +08:00
parent 0912cf737a
commit 78bb40e3b6
22 changed files with 2191 additions and 1025 deletions

View File

@ -26,7 +26,7 @@ import java.util.List;
*/
@Api(tags = "文件存储管理")
@RestController
@RequestMapping("/file-storage")
@RequestMapping("/safety-eval/file-storage")
public class FileStorageController {
@Resource

View File

@ -10,6 +10,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableAsync;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
*
@ -27,7 +28,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
@EnableGatewayServer
@EnableAsync
@EnableDiscoveryClient
@EnableSwagger2
@SpringBootApplication(scanBasePackages = {"org.qinan.safetyeval", "com.jjb.saas"})
@EnableDubbo
@EnableFeignClients(basePackages = {"org.qinan.safetyeval", "com.jjb.saas"})

View File

@ -1,21 +0,0 @@
package org.qinan.safetyeval.start.config;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* ID JS Number
*/
@Configuration
public class JacksonConfig {
@Bean
public Jackson2ObjectMapperBuilderCustomizer longToStringCustomizer() {
return builder -> {
builder.serializerByType(Long.class, ToStringSerializer.instance);
builder.serializerByType(Long.TYPE, ToStringSerializer.instance);
};
}
}

View File

@ -1,33 +0,0 @@
package org.qinan.safetyeval.start.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@Configuration
public class SwaggerConfig {
@Bean
public Docket safetyEvalApi() {
return new Docket(DocumentationType.OAS_30)
.groupName("safety-eval")
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("org.qinan.safetyeval.adapter.web"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("安全评价服务 API")
.description("安全评价业务接口文档")
.version("1.0")
.build();
}
}

View File

@ -1,27 +0,0 @@
package org.qinan.safetyeval.start.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
*
*/
@Configuration
public class WebCorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOriginPattern("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
config.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}

View File

@ -1,45 +0,0 @@
package org.qinan.safetyeval.start.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
@SuppressWarnings("deprecation")
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private final WebSecurityProperties properties;
public WebSecurityConfig(WebSecurityProperties properties) {
this.properties = properties;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
String[] authenticated = properties.authenticatedPatterns();
String[] permitAll = properties.permitAllPatterns();
if (permitAll.length > 0) {
http.csrf().ignoringAntMatchers(permitAll);
}
org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer<HttpSecurity>
.ExpressionInterceptUrlRegistry requests = http.authorizeRequests();
// Authentication rules take priority when they overlap with a public prefix.
if (authenticated.length > 0) {
requests.antMatchers(authenticated).authenticated();
}
if (permitAll.length > 0) {
requests.antMatchers(permitAll).permitAll();
}
requests.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
}

View File

@ -1,92 +0,0 @@
package org.qinan.safetyeval.start.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@Component
@ConfigurationProperties(prefix = "safety-eval.security")
public class WebSecurityProperties {
private List<String> permitAllPaths = new ArrayList<>();
private List<String> permitAllPrefixes = new ArrayList<>();
private List<String> authenticatedPaths = new ArrayList<>();
private List<String> authenticatedPrefixes = new ArrayList<>();
public String[] permitAllPatterns() {
return patterns(permitAllPaths, permitAllPrefixes);
}
public String[] authenticatedPatterns() {
return patterns(authenticatedPaths, authenticatedPrefixes);
}
private String[] patterns(List<String> paths, List<String> prefixes) {
List<String> patterns = new ArrayList<>();
for (String path : safe(paths)) {
String normalized = normalizePath(path);
if (normalized != null) {
patterns.add(normalized);
}
}
for (String prefix : safe(prefixes)) {
String normalized = normalizePath(prefix);
if (normalized != null) {
patterns.add(normalized.endsWith("/**") ? normalized : stripTrailingSlash(normalized) + "/**");
}
}
return patterns.toArray(new String[0]);
}
private List<String> safe(List<String> values) {
return values == null ? Collections.emptyList() : values;
}
private String normalizePath(String path) {
if (!StringUtils.hasText(path)) {
return null;
}
String trimmed = path.trim();
return trimmed.startsWith("/") ? trimmed : "/" + trimmed;
}
private String stripTrailingSlash(String path) {
return path.length() > 1 && path.endsWith("/") ? path.substring(0, path.length() - 1) : path;
}
public List<String> getPermitAllPaths() {
return permitAllPaths;
}
public void setPermitAllPaths(List<String> permitAllPaths) {
this.permitAllPaths = permitAllPaths;
}
public List<String> getPermitAllPrefixes() {
return permitAllPrefixes;
}
public void setPermitAllPrefixes(List<String> permitAllPrefixes) {
this.permitAllPrefixes = permitAllPrefixes;
}
public List<String> getAuthenticatedPaths() {
return authenticatedPaths;
}
public void setAuthenticatedPaths(List<String> authenticatedPaths) {
this.authenticatedPaths = authenticatedPaths;
}
public List<String> getAuthenticatedPrefixes() {
return authenticatedPrefixes;
}
public void setAuthenticatedPrefixes(List<String> authenticatedPrefixes) {
this.authenticatedPrefixes = authenticatedPrefixes;
}
}

View File

@ -1,23 +0,0 @@
<!doctype html><html lang="zh"><head data-built-info="@cqsjjb/scripts@2.0.0-rspack.1 Frontend_Env[development] Build_Date[2026/6/25 14:52:56] App_Identifier[certificate]"><meta charset="UTF-8"/><meta name="renderer" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1"/><meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"><title>--</title><script>(function () {
const APP_ENV = {
antd: {
'ant-prefix': 'micro-temp',
fontFamily: 'PingFangSC-Regular',
colorPrimary: '#1677ff',
borderRadius: parseInt('2')
},
appKey: '',
basename: 'certificate',
API_HOST: 'http://127.0.0.1:8095'
};
APP_ENV.API_HOST = sessionStorage.API_HOST || APP_ENV.API_HOST || window.location.origin;
window.process = {
env: { app: APP_ENV },
NODE_ENV: 'production'
};
window.__JJB_ENVIRONMENT__ = {
API_HOST: APP_ENV.API_HOST,
redirect: '',
FRAMEWORK: APP_ENV.antd
};
})();</script><script defer="defer" src="/certificate/static/js/708.fde3ac0d13bad184.js"></script><script defer="defer" src="/certificate/static/js/478.532bd4a7a37ba2b0.js"></script><script defer="defer" src="/certificate/static/js/main.a10ec5b7cc02c1dd.js"></script><link href="/certificate/static/css/main.fdd9c7fe1255b0b8.css" rel="stylesheet"></head><body><noscript>此网页需要开启JavaScript功能。</noscript><div id="root" style="width: 100%; height: 100%; position: relative;overflow-y: auto"></div><script type="text/javascript">/* @cqsjjb/script 输出当前应用基本信息 */console.log("%c@cqsjjb/scripts@2.0.0-rspack.1 Frontend_Env[development] Build_Date[2026/6/25 14:52:56] App_Identifier[certificate] Frontend_Branch[dev] Backend_Branch[<branch-name>]", "color: #1890ff; border-radius: 2px; padding: 0 4px; border: 1px solid #1890ff; background: #f9fcff")</script></body></html>

View File

@ -1,316 +0,0 @@
.header-back {
padding: 10px 20px;
border-bottom: 1px solid #dcdfe6;
margin-bottom: 0;
position: sticky;
top: 0;
background-color: #fff;
z-index: 9;
}
.header-back .action {
display: flex;
align-items: center;
}
.header-back .action .back {
display: flex;
align-items: center;
gap: 10px;
cursor: pointer;
font-size: 14px;
}
.header-back .action .title {
font-size: 17px;
}
.micro-temp-table-cell-scrollbar {
width: 15px;
}
.micro-temp-table-cell .micro-temp-btn-link {
padding: 0;
}
.micro-temp-pro-table-list-toolbar-container {
padding-top: 0 !important;
padding-bottom: 16px;
}
/* stylelint-disable */
html,
body {
width: 100%;
height: 100%;
}
input::-ms-clear,
input::-ms-reveal {
display: none;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
font-family: sans-serif;
line-height: 1.15;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
-ms-overflow-style: scrollbar;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
@-ms-viewport {
width: device-width;
}
body {
margin: 0;
}
[tabindex='-1']:focus {
outline: none;
}
hr {
box-sizing: content-box;
height: 0;
overflow: visible;
}
h1,
h2,
h3,
h4,
h5,
h6 {
margin-top: 0;
margin-bottom: 0.5em;
font-weight: 500;
}
p {
margin-top: 0;
margin-bottom: 1em;
}
abbr[title],
abbr[data-original-title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
border-bottom: 0;
cursor: help;
}
address {
margin-bottom: 1em;
font-style: normal;
line-height: inherit;
}
input[type='text'],
input[type='password'],
input[type='number'],
textarea {
-webkit-appearance: none;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1em;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 500;
}
dd {
margin-bottom: 0.5em;
margin-left: 0;
}
blockquote {
margin: 0 0 1em;
}
dfn {
font-style: italic;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 80%;
}
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
pre,
code,
kbd,
samp {
font-size: 1em;
font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
}
pre {
margin-top: 0;
margin-bottom: 1em;
overflow: auto;
}
figure {
margin: 0 0 1em;
}
img {
vertical-align: middle;
border-style: none;
}
a,
area,
button,
[role='button'],
input:not([type='range']),
label,
select,
summary,
textarea {
touch-action: manipulation;
}
table {
border-collapse: collapse;
}
caption {
padding-top: 0.75em;
padding-bottom: 0.3em;
text-align: left;
caption-side: bottom;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
color: inherit;
font-size: inherit;
font-family: inherit;
line-height: inherit;
}
button,
input {
overflow: visible;
}
button,
select {
text-transform: none;
}
button,
html [type='button'],
[type='reset'],
[type='submit'] {
-webkit-appearance: button;
}
button::-moz-focus-inner,
[type='button']::-moz-focus-inner,
[type='reset']::-moz-focus-inner,
[type='submit']::-moz-focus-inner {
padding: 0;
border-style: none;
}
input[type='radio'],
input[type='checkbox'] {
box-sizing: border-box;
padding: 0;
}
input[type='date'],
input[type='time'],
input[type='datetime-local'],
input[type='month'] {
-webkit-appearance: listbox;
}
textarea {
overflow: auto;
resize: vertical;
}
fieldset {
min-width: 0;
margin: 0;
padding: 0;
border: 0;
}
legend {
display: block;
width: 100%;
max-width: 100%;
margin-bottom: 0.5em;
padding: 0;
color: inherit;
font-size: 1.5em;
line-height: inherit;
white-space: normal;
}
progress {
vertical-align: baseline;
}
[type='number']::-webkit-inner-spin-button,
[type='number']::-webkit-outer-spin-button {
height: auto;
}
[type='search'] {
outline-offset: -2px;
-webkit-appearance: none;
}
[type='search']::-webkit-search-cancel-button,
[type='search']::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
summary {
display: list-item;
}
template {
display: none;
}
[hidden] {
display: none !important;
}
mark {
padding: 0.2em;
background-color: #feffe6;
}
.micro-temp-modal-header {
border-bottom: 1px solid #ccc !important;
margin: 0 -24px 15px -24px !important;
padding: 0 24px 15px 24px !important;
}
.micro-temp-modal-footer {
text-align: center !important;
}
.search-layout {
position: relative;
}
.search-layout::after {
content: '';
position: absolute;
bottom: -10px;
left: -20px;
right: -20px;
height: 10px;
background-color: #f1f1f2;
}
.search-layout + .table-layout {
padding-top: 26px !important;
}
.card-layout {
background-color: #fff;
border-radius: 6px;
}

View File

@ -1 +0,0 @@
module.exports={javaGit:"<git-url>",javaGitName:"<git-name>",environment:{development:{javaGitBranch:"<branch-name>",API_HOST:process.env.SAFETY_EVAL_API_HOST||"http://127.0.0.1:8095"},production:{javaGitBranch:"<branch-name>",API_HOST:""}},appIdentifier:"certificate",contextInject:{appKey:"",fileUrl:"https://skqhdg.porthebei.com:9004/file/uploadFiles2/"},windowInject:{title:"微应用模板",links:[],element:{root:{id:"root"}},scripts:[]},server:{port:"8081",host:"0.0.0.0",open:!0},framework:{antd:{"ant-prefix":"micro-temp",fontFamily:"PingFangSC-Regular",colorPrimary:"#1677ff",borderRadius:2}},webpackConfig:{htmlWebpackPluginOption:{inject:!0}}};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,70 @@
<!doctype html><html lang="zh"><head data-built-info="@cqsjjb/scripts@2.0.0-rspack.1 Frontend_Env[production] Build_Date[2026/7/1 15:15:59] App_Identifier[safety-eval]"><meta charset="UTF-8"/><meta name="renderer" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1"/><meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"><title>--</title><script>(function () {
const APP_ENV = {
antd: {
'ant-prefix': 'micro-temp',
fontFamily: 'PingFangSC-Regular',
colorPrimary: '#1677ff',
borderRadius: parseInt('2')
},
appKey: '',
basename: 'safety-eval',
API_HOST: ''
};
const injectedApiHost = APP_ENV.API_HOST;
const isDev = 'production' === 'development';
// 开发环境优先 jjb.config 注入的 API_HOST避免 sessionStorage 残留网关地址导致 Network Error
if (isDev && injectedApiHost && injectedApiHost.indexOf('http') === 0) {
APP_ENV.API_HOST = injectedApiHost;
} else {
APP_ENV.API_HOST = sessionStorage.API_HOST || injectedApiHost || window.location.origin;
}
window.process = {
env: { app: APP_ENV },
NODE_ENV: 'production'
};
window.__JJB_ENVIRONMENT__ = {
API_HOST: APP_ENV.API_HOST,
redirect: '',
FRAMEWORK: APP_ENV.antd
};
})();
// 抑制 ResizeObserver 在页面/标签切换时的无害告警,避免 dev overlay 误报
(function () {
if (typeof window.ResizeObserver !== 'undefined') {
var NativeResizeObserver = window.ResizeObserver;
window.ResizeObserver = class extends NativeResizeObserver {
constructor(callback) {
super(function (entries, observer) {
window.requestAnimationFrame(function () {
callback(entries, observer);
});
});
}
};
}
function isResizeObserverLoopError(message) {
return typeof message === 'string' && message.indexOf('ResizeObserver loop') !== -1;
}
function isAxiosNetworkError(reason) {
if (!reason) return false;
var msg = typeof reason === 'string' ? reason : (reason.message || '');
return msg === 'Network Error' || (reason.isAxiosError && msg === 'Network Error');
}
window.addEventListener('error', function (event) {
if (isResizeObserverLoopError(event.message)) {
event.stopImmediatePropagation();
event.preventDefault();
}
});
window.addEventListener('unhandledrejection', function (event) {
if (isAxiosNetworkError(event.reason)) {
console.warn('[dev] API unreachable:', event.reason?.config?.url || event.reason?.message);
event.preventDefault();
}
});
})();</script><script defer="defer" src="/safety-eval/static/js/63.f5cd6d9594782b68.js"></script><script defer="defer" src="/safety-eval/static/js/121.13973c81022a93a2.js"></script><script defer="defer" src="/safety-eval/static/js/289.f4b5e8c4ac9ad742.js"></script><script defer="defer" src="/safety-eval/static/js/main.a22a870a5c7abd5d.js"></script><link href="/safety-eval/static/css/main.f1fe1233254250fd.css" rel="stylesheet"></head><body><noscript>此网页需要开启JavaScript功能。</noscript><div id="root" style="width: 100%; height: 100%; position: relative;overflow-y: auto"></div><script type="text/javascript">/* @cqsjjb/script 输出当前应用基本信息 */console.log("%c@cqsjjb/scripts@2.0.0-rspack.1 Frontend_Env[production] Build_Date[2026/7/1 15:15:59] App_Identifier[safety-eval] Frontend_Branch[dev] Backend_Branch[<branch-name>]", "color: #1890ff; border-radius: 2px; padding: 0 4px; border: 1px solid #1890ff; background: #f9fcff")</script></body></html>

View File

@ -0,0 +1 @@
module.exports={javaGit:"<git-url>",javaGitName:"<git-name>",environment:{development:{javaGitBranch:"<branch-name>",API_HOST:"http://192.168.0.204:8095"},production:{javaGitBranch:"<branch-name>",API_HOST:""}},appIdentifier:"safety-eval",contextInject:{appKey:"",fileUrl:"https://skqhdg.porthebei.com:9004/file/uploadFiles2/"},windowInject:{title:"微应用模板",links:[],element:{root:{id:"root"}},scripts:[]},server:{port:"8081",host:"0.0.0.0",open:!0},framework:{antd:{"ant-prefix":"micro-temp",fontFamily:"PingFangSC-Regular",colorPrimary:"#1677ff",borderRadius:2}},webpackConfig:{htmlWebpackPluginOption:{inject:!0}}};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -29,8 +29,9 @@
"@rc-component/motion": "^1.0.0",
"@rc-component/util": "^1.11.1",
"ahooks": "^3.9.5",
"antd": "^5.11.2",
"antd": "^5.29.2",
"dayjs": "^1.11.7",
"echarts": "^6.1.0",
"lodash-es": "^4.17.21",
"qrcode.react": "^4.2.0",
"react": "^18.2.0",
@ -44,6 +45,7 @@
"@babel/preset-react": "^7.29.7",
"@cqsjjb/scripts": "latest",
"@eslint-react/eslint-plugin": "^2.2.2",
"ajv": "^8.20.0",
"babel-loader": "^9.1.3",
"cross-env": "^7.0.3",
"css-loader": "^6.8.1",