From 9b54ebe746c69fc57ed1a865eb07a1e5c9a35389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90=E6=9D=8E=C2=B7De?= Date: Wed, 13 Apr 2022 11:45:22 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=93=E5=8C=85?= =?UTF-8?q?=E5=88=B0=E7=A7=81=E6=9C=8D=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/index.js | 86 ++++++++++++++++++++++ build/pom.xml | 192 +++++++++++++++++++++++++++++++++++++++++++++++++ deploy.sh | 34 +++++++++ 3 files changed, 312 insertions(+) create mode 100644 build/index.js create mode 100644 build/pom.xml create mode 100644 deploy.sh diff --git a/build/index.js b/build/index.js new file mode 100644 index 00000000..af5695c5 --- /dev/null +++ b/build/index.js @@ -0,0 +1,86 @@ +'use strict' +// Template version: 1.2.6 +// see http://vuejs-templates.github.io/webpack for documentation. + +const path = require('path') + +module.exports = { + dev: { + // Paths + assetsSubDirectory: 'static', + assetsPublicPath: '/', + proxyTable: {}, + + // Various Dev Server settings + host: 'localhost', // can be overwritten by process.env.HOST + port: 9528, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined + autoOpenBrowser: true, + errorOverlay: true, + notifyOnErrors: false, + poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- + + // Use Eslint Loader? + // If true, your code will be linted during bundling and + // linting errors and warnings will be shown in the console. + useEslint: true, + // If true, eslint errors and warnings will also be shown in the error overlay + // in the browser. + showEslintErrorsInOverlay: false, + + /** + * Source Maps + */ + + // https://webpack.js.org/configuration/devtool/#development + devtool: 'cheap-source-map', + + // CSS Sourcemaps off by default because relative paths are "buggy" + // with this option, according to the CSS-Loader README + // (https://github.com/webpack/css-loader#sourcemaps) + // In our experience, they generally work as expected, + // just be aware of this issue when enabling this option. + cssSourceMap: false + }, + + build: { + // Template for index.html + index: path.resolve(__dirname, '../dist/index.html'), + + // Paths + assetsRoot: path.resolve(__dirname, '../dist'), + assetsSubDirectory: 'static', + + /** + * You can set by youself according to actual condition + * You will need to set this if you plan to deploy your site under a sub path, + * for example GitHub pages. If you plan to deploy your site to https://foo.github.io/bar/, + * then assetsPublicPath should be set to "/bar/". + * In most cases please use '/' !!! + */ + assetsPublicPath: '/report/', + + /** + * Source Maps + */ + + productionSourceMap: false, + // https://webpack.js.org/configuration/devtool/#production + devtool: 'source-map', + + // Gzip off by default as many popular static hosts such as + // Surge or Netlify already gzip all static assets for you. + // Before setting to `true`, make sure to: + // npm install --save-dev compression-webpack-plugin + productionGzip: false, + productionGzipExtensions: ['js', 'css'], + + // Run the build command with an extra argument to + // View the bundle analyzer report after build finishes: + // `npm run build --report` + // Set to `true` or `false` to always turn it on or off + bundleAnalyzerReport: process.env.npm_config_report || false, + + // `npm run build:prod --generate_report` + generateAnalyzerReport: process.env.npm_config_generate_report || false + } +} diff --git a/build/pom.xml b/build/pom.xml new file mode 100644 index 00000000..14339990 --- /dev/null +++ b/build/pom.xml @@ -0,0 +1,192 @@ + + + + + org.springframework.boot + spring-boot-starter-parent + 2.3.5.RELEASE + + + + 4.0.0 + + com.anji-plus + product-report-starter + 1.2.0-SNAPSHOT + + + UTF-8 + -Xdoclint:none + 1.8 + 1.8 + true + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.apache.logging.log4j + log4j-to-slf4j + + + + + + org.apache.logging.log4j + log4j-to-slf4j + 2.15.0 + + + + org.apache.logging.log4j + log4j-api + 2.15.0 + + + + + org.springframework.boot + spring-boot-starter-cache + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.cloud + spring-cloud-context + 2.2.6.RELEASE + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + com.anji-plus + spring-boot-gaea + 2.0.3.RELEASE + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + + com.baomidou + mybatis-plus-boot-starter + 3.3.2 + + + + mysql + mysql-connector-java + + + com.alibaba + druid + 1.2.0 + + + org.flywaydb + flyway-core + 5.2.1 + + + + net.sf.ehcache + ehcache + 2.10.6 + + + + org.apache.httpcomponents + httpclient + 4.5.10 + + + + org.projectlombok + lombok + 1.18.10 + true + + + + com.itextpdf + itextpdf + 5.5.13.2 + + + com.itextpdf + itext-asian + 5.2.0 + + + + org.apache.poi + poi + 4.1.2 + + + org.apache.poi + poi-ooxml + 4.1.2 + + + org.apache.poi + poi-ooxml-schemas + 4.1.2 + + + + org.codehaus.groovy + groovy + 3.0.9 + + + + + + + + + + + nexus + nexus + http://10.108.10.53:8081/repository/maven-public/ + + true + + + true + always + + + + + + + + nexus-releases + http://10.108.10.53:8081/repository/maven-releases/ + + + nexus-snapshots + http://10.108.10.53:8081/repository/maven-snapshots/ + + + diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 00000000..f9e63d8a --- /dev/null +++ b/deploy.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +#该脚本为私有化脚本,打包成内含网页的product-report-starter放在内网私服 + +#判断node.js mvn是否存在 +command -v npm >/dev/null 2>&1 || { echo >&2 "I require node.js v14.16.0+ but it's not installed. Aborting."; sleep 5; exit 1; } +command -v mvn >/dev/null 2>&1 || { echo >&2 "I require maven 3.5 + but it's not installed. Aborting."; sleep 5; exit 1; } + +cd `dirname $0` +BuildDir=`pwd` #工程根目录 + +#重置pom和index.js +cat $BuildDir/build/index.js > $BuildDir/report-ui/config/index.js +cat $BuildDir/build/pom.xml > $BuildDir/report-core/pom.xml + +echo "build web" +cd $BuildDir/report-ui +rm -rf dist +npm install >/dev/null 2>&1 +npm run build:prod + +echo "publish web to springboot src/main/resources/static" +rm -rf $BuildDir/report-core/src/main/resources/static +mkdir -p $BuildDir/report-core/src/main/resources/static +mv $BuildDir/report-ui/dist/* $BuildDir/report-core/src/main/resources/static/ + + +echo "build springboot" +cd $BuildDir/report-core +mvn clean deploy -Dmaven.test.skip=true + + +rm -rf $BuildDir/report-core/src/main/resources/static +git reset --hard \ No newline at end of file From 7baf918a71faeb9a4393971486181deecbc10640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90=E6=9D=8E=C2=B7De?= Date: Wed, 13 Apr 2022 12:06:35 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=93=E5=8C=85?= =?UTF-8?q?=E5=88=B0=E7=A7=81=E6=9C=8D=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/pom.xml | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/build/pom.xml b/build/pom.xml index 14339990..4775e548 100644 --- a/build/pom.xml +++ b/build/pom.xml @@ -158,35 +158,4 @@ - - - - - - - - nexus - nexus - http://10.108.10.53:8081/repository/maven-public/ - - true - - - true - always - - - - - - - - nexus-releases - http://10.108.10.53:8081/repository/maven-releases/ - - - nexus-snapshots - http://10.108.10.53:8081/repository/maven-snapshots/ - - From cbea78db43e3149640cab799c99d888e43e90a15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90=E6=9D=8E=C2=B7De?= Date: Wed, 13 Apr 2022 12:11:35 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=93=E5=8C=85?= =?UTF-8?q?=E5=88=B0=E7=A7=81=E6=9C=8D=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/pom.xml | 4 ++-- deploy.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/pom.xml b/build/pom.xml index 4775e548..e030818d 100644 --- a/build/pom.xml +++ b/build/pom.xml @@ -11,8 +11,8 @@ 4.0.0 - com.anji-plus - product-report-starter + com.anji-plus.otwb + product-report-starter 1.2.0-SNAPSHOT diff --git a/deploy.sh b/deploy.sh index f9e63d8a..eee2b782 100644 --- a/deploy.sh +++ b/deploy.sh @@ -27,7 +27,7 @@ mv $BuildDir/report-ui/dist/* $BuildDir/report-core/src/main/resources/static/ echo "build springboot" cd $BuildDir/report-core -mvn clean deploy -Dmaven.test.skip=true +mvn clean deploy -DskipTests -DaltDeploymentRepository=nexus-snapshots::default::http://10.108.10.53:8081/repository/maven-snapshots rm -rf $BuildDir/report-core/src/main/resources/static From 014cb3bd1ec48f7d7fa3e8b99a9dd35696d2c6f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90=E6=9D=8E=C2=B7De?= Date: Wed, 13 Apr 2022 12:46:32 +0800 Subject: [PATCH 04/11] Update deploy.sh --- deploy.sh | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/deploy.sh b/deploy.sh index eee2b782..54dcd4ac 100644 --- a/deploy.sh +++ b/deploy.sh @@ -2,6 +2,12 @@ #该脚本为私有化脚本,打包成内含网页的product-report-starter放在内网私服 +echo 'choose deploy type [1/2]' +echo '1:deploy snapshot' +echo '2:deploy release' +read choose + + #判断node.js mvn是否存在 command -v npm >/dev/null 2>&1 || { echo >&2 "I require node.js v14.16.0+ but it's not installed. Aborting."; sleep 5; exit 1; } command -v mvn >/dev/null 2>&1 || { echo >&2 "I require maven 3.5 + but it's not installed. Aborting."; sleep 5; exit 1; } @@ -27,8 +33,13 @@ mv $BuildDir/report-ui/dist/* $BuildDir/report-core/src/main/resources/static/ echo "build springboot" cd $BuildDir/report-core -mvn clean deploy -DskipTests -DaltDeploymentRepository=nexus-snapshots::default::http://10.108.10.53:8081/repository/maven-snapshots +if [ $choose = '2' ]; then + mvn clean deploy -DskipTests -DaltDeploymentRepository=nexus-releases::default::http://10.108.10.53:8081/repository/maven-releases +else + mvn clean deploy -DskipTests -DaltDeploymentRepository=nexus-snapshots::default::http://10.108.10.53:8081/repository/maven-snapshots +fi + rm -rf $BuildDir/report-core/src/main/resources/static git reset --hard \ No newline at end of file From aa0e39450353fa36bdcc8e4ac040a6868e1fd759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90=E6=9D=8E=C2=B7De?= Date: Wed, 13 Apr 2022 12:47:47 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=93=E5=8C=85?= =?UTF-8?q?=E5=88=B0=E7=A7=81=E6=9C=8D=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/pom.xml | 31 +++++++++++++++++++++++++++++++ deploy.sh | 14 +------------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/build/pom.xml b/build/pom.xml index e030818d..4b6651af 100644 --- a/build/pom.xml +++ b/build/pom.xml @@ -158,4 +158,35 @@ + + + + + + + + nexus + nexus + http://10.108.10.53:8081/repository/maven-public/ + + true + + + true + always + + + + + + + + nexus-releases + http://10.108.10.53:8081/repository/maven-releases/ + + + nexus-snapshots + http://10.108.10.53:8081/repository/maven-snapshots/ + + diff --git a/deploy.sh b/deploy.sh index 54dcd4ac..635af105 100644 --- a/deploy.sh +++ b/deploy.sh @@ -1,13 +1,6 @@ #!/bin/bash - #该脚本为私有化脚本,打包成内含网页的product-report-starter放在内网私服 -echo 'choose deploy type [1/2]' -echo '1:deploy snapshot' -echo '2:deploy release' -read choose - - #判断node.js mvn是否存在 command -v npm >/dev/null 2>&1 || { echo >&2 "I require node.js v14.16.0+ but it's not installed. Aborting."; sleep 5; exit 1; } command -v mvn >/dev/null 2>&1 || { echo >&2 "I require maven 3.5 + but it's not installed. Aborting."; sleep 5; exit 1; } @@ -34,12 +27,7 @@ mv $BuildDir/report-ui/dist/* $BuildDir/report-core/src/main/resources/static/ echo "build springboot" cd $BuildDir/report-core - -if [ $choose = '2' ]; then - mvn clean deploy -DskipTests -DaltDeploymentRepository=nexus-releases::default::http://10.108.10.53:8081/repository/maven-releases -else - mvn clean deploy -DskipTests -DaltDeploymentRepository=nexus-snapshots::default::http://10.108.10.53:8081/repository/maven-snapshots -fi +mvn clean deploy -DskipTests rm -rf $BuildDir/report-core/src/main/resources/static git reset --hard \ No newline at end of file From d5f6b6ba35c9a9f02213b40841bf30b05bfd0eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90=E6=9D=8E=C2=B7De?= Date: Wed, 13 Apr 2022 14:55:13 +0800 Subject: [PATCH 06/11] Update deploy.sh --- deploy.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/deploy.sh b/deploy.sh index 635af105..9ed7aaed 100644 --- a/deploy.sh +++ b/deploy.sh @@ -19,6 +19,7 @@ npm install >/dev/null 2>&1 npm run build:prod echo "publish web to springboot src/main/resources/static" +rm -rf $BuildDir/report-core/src/main/resources/db/migration rm -rf $BuildDir/report-core/src/main/resources/static mkdir -p $BuildDir/report-core/src/main/resources/static mv $BuildDir/report-ui/dist/* $BuildDir/report-core/src/main/resources/static/ From 554c4c6eb7788dfe970ac65c4a900590da692b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90=E6=9D=8E=C2=B7De?= Date: Wed, 13 Apr 2022 17:31:21 +0800 Subject: [PATCH 07/11] Update pom.xml --- build/pom.xml | 63 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/build/pom.xml b/build/pom.xml index 4b6651af..5bcc2a97 100644 --- a/build/pom.xml +++ b/build/pom.xml @@ -160,25 +160,50 @@ - - - - - - nexus - nexus - http://10.108.10.53:8081/repository/maven-public/ - - true - - - true - always - - - - - + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + 1.8 + 1.8 + UTF-8 + + + + org.apache.maven.plugins + maven-resources-plugin + 2.4 + + UTF-8 + + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.7 + + true + + + + nexus-releases From cf66fc98fa2d149d8694487a8bb89cb2aff45f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90=E6=9D=8E=C2=B7De?= Date: Wed, 13 Apr 2022 17:31:50 +0800 Subject: [PATCH 08/11] Update TokenFilter.java --- .../template/gaea/business/filter/TokenFilter.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java index e6595b68..7411d5e7 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java @@ -41,6 +41,7 @@ import static com.anji.plus.gaea.constant.GaeaConstant.URL_REPLACEMENT; public class TokenFilter implements Filter { private static final Pattern PATTERN = Pattern.compile(".*().*"); private static final String USER_GUEST = "guest"; + @Value("${server.servlet.context-path:'/'}") private static final String SLASH = "/"; private AntPathMatcher antPathMatcher = new AntPathMatcher(); @@ -54,7 +55,6 @@ public class TokenFilter implements Filter { private List skipAuthenticateUrls; private Pattern skipAuthenticatePattern; - @Override public void init(FilterConfig filterConfig) throws ServletException { // 生成匹配正则,跳过token验证和权限验证的url @@ -74,8 +74,8 @@ public class TokenFilter implements Filter { return; } - if (SLASH.equals(uri)) { - response.sendRedirect("/index.html"); + if (SLASH.equals(uri) || SLASH.concat("/").equals(uri)) { + response.sendRedirect(SLASH + "/index.html"); return; } @@ -128,6 +128,7 @@ public class TokenFilter implements Filter { //判断接口权限 //请求路径 String requestUrl = request.getRequestURI(); + String servletPath = request.getServletPath(); String methodValue = request.getMethod(); //请求方法+#+请求路径 String urlKey = methodValue + GaeaConstant.URL_SPLIT + requestUrl; From 2932a0988430827facfcbc1772dacd2e28776f72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90=E6=9D=8E=C2=B7De?= Date: Wed, 13 Apr 2022 17:40:32 +0800 Subject: [PATCH 09/11] Update TokenFilter.java --- .../anjiplus/template/gaea/business/filter/TokenFilter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java index 7411d5e7..fa1251b9 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java @@ -127,11 +127,11 @@ public class TokenFilter implements Filter { //判断接口权限 //请求路径 - String requestUrl = request.getRequestURI(); + //String requestUrl = request.getRequestURI(); requestUrl中可能会有contextpath,而底层扫描的controller是没有的 String servletPath = request.getServletPath(); String methodValue = request.getMethod(); //请求方法+#+请求路径 - String urlKey = methodValue + GaeaConstant.URL_SPLIT + requestUrl; + String urlKey = methodValue + GaeaConstant.URL_SPLIT + servletPath; GaeaUserDto gaeaUserDto = JSONObject.parseObject(gaeaUserJsonStr, GaeaUserDto.class); List authorities = gaeaUserDto.getAuthorities(); From 8d1f8b90370761e4197154ee07576ae80ec0f4af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90=E6=9D=8E=C2=B7De?= Date: Wed, 13 Apr 2022 18:14:59 +0800 Subject: [PATCH 10/11] Update TokenFilter.java --- .../template/gaea/business/filter/TokenFilter.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java index fa1251b9..5462a378 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/filter/TokenFilter.java @@ -14,7 +14,6 @@ import org.apache.http.entity.ContentType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.annotation.Order; -import org.springframework.http.HttpMethod; import org.springframework.stereotype.Component; import org.springframework.util.AntPathMatcher; import org.springframework.util.CollectionUtils; @@ -41,9 +40,9 @@ import static com.anji.plus.gaea.constant.GaeaConstant.URL_REPLACEMENT; public class TokenFilter implements Filter { private static final Pattern PATTERN = Pattern.compile(".*().*"); private static final String USER_GUEST = "guest"; + @Value("${server.servlet.context-path:'/'}") - private static final String SLASH = "/"; - private AntPathMatcher antPathMatcher = new AntPathMatcher(); + private String SLASH = "/"; @Autowired private CacheHelper cacheHelper; @@ -55,6 +54,8 @@ public class TokenFilter implements Filter { private List skipAuthenticateUrls; private Pattern skipAuthenticatePattern; + private AntPathMatcher antPathMatcher = new AntPathMatcher(); + @Override public void init(FilterConfig filterConfig) throws ServletException { // 生成匹配正则,跳过token验证和权限验证的url @@ -166,9 +167,6 @@ public class TokenFilter implements Filter { return; } - - - // 延长有效期 cacheHelper.stringSetExpire(tokenKey, token, 3600); cacheHelper.stringSetExpire(userKey, gaeaUserJsonStr, 3600); From 85fc9d8b98a9b0b9b7e377a02a48ca68b03b7715 Mon Sep 17 00:00:00 2001 From: qianlishi <1432731663@qq.com> Date: Thu, 14 Apr 2022 18:51:11 +0800 Subject: [PATCH 11/11] =?UTF-8?q?=EF=BD=95=EF=BD=90=EF=BD=84=EF=BD=81?= =?UTF-8?q?=EF=BD=94=EF=BD=85=E6=95=B0=E6=8D=AE=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- report-ui/src/views/resultset/index.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/report-ui/src/views/resultset/index.vue b/report-ui/src/views/resultset/index.vue index a4d14c11..256852df 100644 --- a/report-ui/src/views/resultset/index.vue +++ b/report-ui/src/views/resultset/index.vue @@ -4,7 +4,7 @@ * @Author: qianlishi * @Date: 2021-12-11 14:48:27 * @LastEditors: qianlishi - * @LastEditTime: 2022-03-09 09:49:23 + * @LastEditTime: 2022-04-14 18:48:24 -->