Compare commits

..

73 Commits

Author SHA1 Message Date
曾文豪
ea24bf3479 perf(encrypt):加解密调整 2023-07-05 14:11:01 +08:00
曾文豪
90e504e7fd fix:验签接口调整 2023-07-05 13:58:01 +08:00
曾文豪
5db42f5bc8 publish 1.0.12 2023-07-05 13:55:14 +08:00
曾文豪
37d84e2f36 docs: 文档调整 2023-06-30 10:24:13 +08:00
曾文豪
f59d56be9e docs: 文档调整 2023-06-28 13:04:11 +08:00
曾文豪
7f4871fe19 publish 1.0.10 2023-06-28 13:03:03 +08:00
曾文豪
34e3cb2f09 docs: 文档调整 2023-06-14 09:44:11 +08:00
曾文豪
7c1abb9b97 docs: 文档调整 2023-06-14 09:39:38 +08:00
曾文豪
a649bdae7c publish 1.0.9 2023-06-14 09:32:50 +08:00
曾文豪
7b6eccb0d5 feat: 登录接口增加timestamp、sign字段,用于验证本次是否通过 2023-06-14 09:27:01 +08:00
曾文豪
c700ddc90a publish 1.0.8 2023-06-13 09:42:50 +08:00
曾文豪
4254bf47bf fix: 修复微信、钉钉跳转bug 2023-06-13 09:42:15 +08:00
曾文豪
e0b1720c4a chore: 升级插件依赖0.0.6 2023-06-07 17:19:40 +08:00
曾文豪
9cd7b069a8 docs: 更新文档 2023-06-06 14:27:36 +08:00
曾文豪
0ca3d13659 perf(database): 优化DbDataInitializer接口 2023-06-06 14:25:38 +08:00
曾文豪
0ac237fbbd publish 1.0.7 2023-06-06 14:22:44 +08:00
曾文豪
d9da55d4bf feat(database): 增加db/data目录,存放初始化数据的sql 2023-06-06 14:14:22 +08:00
曾文豪
802152badd publish 1.0.7 2023-06-06 11:30:44 +08:00
曾文豪
7b4169f3e6 feat(web): 增加uploadFileCustomize方法,允许自定义文件存放情况
可根据情况存放如OSS之类的
2023-06-06 11:29:19 +08:00
曾文豪
c3b3831378 feat(login): 增加默认值,防止token解析异常 2023-06-06 10:50:27 +08:00
曾文豪
73e6470b39 publish 1.0.6 2023-05-26 15:18:38 +08:00
曾文豪
458d118d85 publish 1.0.6 2023-05-26 13:23:17 +08:00
曾文豪
659deb6132 publish 1.0.5 2023-05-24 09:48:41 +08:00
曾文豪
f8c121ba6f publish 1.0.4 2023-05-23 15:15:19 +08:00
曾文豪
0307d3f544 perf:调整过程日志的异常数据存储方式 2023-05-23 15:14:32 +08:00
曾文豪
6f0bfb1a7d publish 1.0.3 2023-05-22 11:58:40 +08:00
曾文豪
f7e85daed2 publish 1.0.2 2023-05-22 11:31:59 +08:00
曾文豪
206a6dc1ff perf:调整消息发送接口和方法 2023-05-22 11:30:20 +08:00
曾文豪
e29e9552ac perf:消息发送接口该body类型为JSONObject 2023-05-22 11:12:29 +08:00
曾文豪
c418a0b952 perf:调整数据库的配置属性 2023-05-18 17:10:44 +08:00
曾文豪
c5269464df perf:修改banner 2023-05-18 16:50:11 +08:00
曾文豪
d327b7284a perf:OperationAspect中HashMap改为ConcurrentHashMap 2023-05-18 16:23:51 +08:00
曾文豪
b0eac9b177 perf:阿里云短信中TreeMap改为ConcurrentHashMap 2023-05-18 16:21:53 +08:00
曾文豪
815e172e02 test:测试addResourceHandlers 2023-05-18 15:05:14 +08:00
曾文豪
66ac435278 docs:调整文档 2023-05-18 11:32:18 +08:00
曾文豪
84f2062c7e perf:调整阿里云短信发送,方便扩展其他方法 2023-05-18 11:30:03 +08:00
曾文豪
9df344a119 docs:调整文档 2023-05-16 16:08:39 +08:00
曾文豪
a50df93439 docs:调整文档 2023-05-16 16:07:20 +08:00
曾文豪
fbc49f0248 test:测试重定向接口 2023-05-15 10:36:40 +08:00
曾文豪
9420c39c75 perf:启用定时任务,每日凌晨1点执行数据备份 2023-05-12 09:42:13 +08:00
曾文豪
2bd7578f2b perf:启用定时任务,每日凌晨1点执行数据备份 2023-05-12 09:40:47 +08:00
曾文豪
78502781a9 perf:启用定时任务,每日凌晨1点执行数据备份 2023-05-12 09:31:52 +08:00
曾文豪
c3127565dd perf:查询过期文件 2023-05-12 09:23:22 +08:00
曾文豪
de574b5472 perf:查询过期文件 2023-05-12 09:13:53 +08:00
曾文豪
016d67024f perf:查询过期文件 2023-05-12 09:11:01 +08:00
曾文豪
73fcbcb540 perf:删除过期备份 2023-05-11 18:04:39 +08:00
曾文豪
1527f3dc9d perf:数据库备份 2023-05-11 17:53:40 +08:00
曾文豪
d436589c83 perf:数据库备份 2023-05-11 17:49:38 +08:00
曾文豪
3098267045 perf:数据库备份 2023-05-11 17:41:59 +08:00
曾文豪
0f187d2a6f perf:数据库备份 2023-05-11 17:37:11 +08:00
曾文豪
010e8ee104 perf:数据库备份 2023-05-11 17:33:56 +08:00
曾文豪
a9f33a9ed5 perf:数据库备份 2023-05-11 17:31:36 +08:00
曾文豪
ea9870696a perf:数据库备份 2023-05-11 17:27:26 +08:00
曾文豪
33649ed3f9 perf:数据库备份 2023-05-11 17:16:21 +08:00
曾文豪
3de3ac4cff perf:数据库备份 2023-05-11 17:12:17 +08:00
曾文豪
7139b08c9e perf:数据库备份 2023-05-11 17:09:42 +08:00
曾文豪
f2ca53f46e perf:数据库备份 2023-05-11 17:08:02 +08:00
曾文豪
b5083beda9 perf:数据库备份 2023-05-11 17:06:12 +08:00
曾文豪
0452e5ce05 perf:数据库备份 2023-05-11 17:00:18 +08:00
曾文豪
959ed53960 perf:数据库备份 2023-05-11 16:57:51 +08:00
曾文豪
d01b7f1820 perf:数据库备份 2023-05-11 16:55:08 +08:00
曾文豪
141cebf2ff perf:数据库备份 2023-05-11 16:52:53 +08:00
曾文豪
84d859dd54 perf:数据库备份 2023-05-11 16:39:43 +08:00
曾文豪
d2e80af568 perf:数据库备份 2023-05-11 16:28:46 +08:00
曾文豪
be30a3f9d3 perf:数据库备份 2023-05-11 16:26:53 +08:00
曾文豪
608d124f51 perf:数据库备份 2023-05-11 16:23:27 +08:00
曾文豪
377b242e6d perf:部署项目 2023-05-11 16:18:53 +08:00
曾文豪
28f8e11c5f perf:部署项目 2023-05-11 16:15:30 +08:00
曾文豪
730230fa4e perf:部署项目 2023-05-11 16:14:11 +08:00
曾文豪
0b98d0abb4 perf:部署项目 2023-05-11 16:12:27 +08:00
曾文豪
0cb1581176 publish 1.0.1 2023-05-10 15:53:50 +08:00
曾文豪
5ed663e112 perf:fastjson禁用 将相同的对象写成引用的形式 2023-05-10 15:53:22 +08:00
曾文豪
b5fd837ccf perf:调整yml 2023-05-08 14:00:26 +08:00
106 changed files with 764 additions and 196 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -2,6 +2,18 @@ stages:
- deploy
- package
build-jar:
stage: deploy
tags:
- hzkepai
rules:
- if: $CI_COMMIT_BRANCH == "master"
script:
- mvn clean package -Dmaven.test.skip=true
- systemctl stop tieshengboot-ademo
- cp springboot-ademo/target/*.jar /usr/local/nginx/html/demo.tmp.kepai365.ltd/
- systemctl start tieshengboot-ademo
deploy-jar:
stage: deploy
tags:
@@ -9,8 +21,8 @@ deploy-jar:
rules:
- if: $CI_COMMIT_TAG
script:
- mvn clean deploy -Dmaven.test.skip -DaltDeploymentRepository=master::default::file:/usr/local/nginx/html/tiesheng-repo
- cd /usr/local/nginx/html/tiesheng-repo
- mvn clean deploy -Dmaven.test.skip -DaltDeploymentRepository=master::default::file:$TAG_REPO_FOLDER
- cd $TAG_REPO_FOLDER
- git checkout master
- git pull
- git add .

View File

@@ -1,3 +1,50 @@
## 1.0.10
- feat(login):登录接口增加验签步骤,可通过**validLoginSign**属性开启或关闭(默认)。
- perf(login):可重写**onSignError**方法自定义验签错误的跳转。
- fix(login)修复微信、钉钉授权跳转地址错误的bug
## 1.0.7
- feat(web): 增加uploadFileCustomize方法允许自定义文件存放情况
- feat(database): 增加db/data目录存放初始化数据的sql
- perf(login): 增加默认值防止token解析异常
## 1.0.6
- feat(web):新增 **OperationIgnore** 注解,可以指定接口忽略操作日志的收集。
- feat(web)**OperationLog** 增加 desensitize 属性,用来脱敏指定的字段。
## 1.0.2
- feat(database):增加数据库定时备份;
- feat(database)增加过期备份的删除操作默认过期时间为7天
- perf(message):调整阿里云短信类,方便扩展其他方法。
- perf(message)消息发送接口该body类型为 **JSONObject**
- perf(message):调整消息发送接口和方法(不兼容旧版本)
## 1.0.1
- perf(web)fastjson增加配置 **DisableCircularReferenceDetect**,禁用相同的对象写成引用的形式。
## 1.0.0
- perfhutool依赖升级5.8.11 -> 5.8.16
- perffastjson依赖升级1.2.78 -> 1.2.83
- perfmybatis-plus依赖升级3.5.1 -> 3.5.3
- perf**TieshengWebConfigurer** 增加 **configSystemCheck** 方法,可根据情况校验系统配置参数。
从该版本开始,仓库地址改为:
``` pom
<repositories>
<repository>
<id>kepai-repo</id>
<url>http://git.kepai365.com/tiesheng/repository/raw/master</url>
</repository>
</repositories>
```
## 0.9.3
> 1增加版本对比器防止某些情况下版本对比失效

22
pom.xml
View File

@@ -6,7 +6,7 @@
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
<packaging>pom</packaging>
<name>springboot-parent</name>
<description>杭州铁晟科技有限公司基础依赖</description>
@@ -57,55 +57,55 @@
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-database</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-login</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-web</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-util</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-platform</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-message</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-encrypt</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-annotation</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-poi</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</dependency>
<dependency>
@@ -136,7 +136,7 @@
<plugin>
<groupId>com.tiesheng.springboot-plugin</groupId>
<artifactId>tiesheng-maven-plugin</artifactId>
<version>0.0.5</version>
<version>0.0.6</version>
<executions>
<execution>
<goals>

View File

@@ -6,11 +6,11 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</parent>
<artifactId>springboot-ademo</artifactId>
<version>1.0.0</version>
<version>1.1.0</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>

View File

@@ -3,7 +3,6 @@ package com.tiesheng.demo;
import com.tiesheng.core.EnableTieshengWeb;
import com.tiesheng.demo.config.DemoWebConfigurer;
import com.tiesheng.encrypt.EnableEncryptConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;

View File

@@ -0,0 +1,15 @@
package com.tiesheng.demo.config;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Component
public class DemoWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/mobile/**").addResourceLocations("classpath:/mobile/0.0.13/");
}
}

View File

@@ -5,28 +5,32 @@ import cn.hutool.core.date.TimeInterval;
import cn.hutool.json.JSONUtil;
import cn.hutool.log.LogFactory;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.sax.handler.RowHandler;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.tiesheng.annotation.operation.OperationLog;
import com.tiesheng.annotation.token.TokenIgnore;
import com.tiesheng.core.service.CoreLogService;
import com.tiesheng.core.service.CoreMessageService;
import com.tiesheng.core.util.ProcessImportConsumer;
import com.tiesheng.database.config.DbBackupConfig;
import com.tiesheng.demo.pojos.PoiBean;
import com.tiesheng.demo.pojos.TestFile;
import com.tiesheng.login.config.token.TsTokenConfig;
import com.tiesheng.login.config.token.bean.TokenBean;
import com.tiesheng.message.pojos.MessageReqResp;
import com.tiesheng.message.pojos.UserChannel;
import com.tiesheng.util.config.EncryptConfig;
import com.tiesheng.util.config.GlobalConfig;
import com.tiesheng.util.config.Ip2regionConfig;
import com.tiesheng.util.pojos.ApiResp;
import com.tiesheng.util.pojos.FileUploadPath;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
@@ -46,31 +50,51 @@ public class TestController {
EncryptConfig encryptConfig;
@Autowired
CoreMessageService coreMessageService;
@Autowired
CoreLogService coreLogService;
@Autowired
DbBackupConfig dbBackupConfig;
@RequestMapping("/index")
public ApiResp<String> index() {
TokenBean tokenBean = new TokenBean("11", "", "fdfd");
LogFactory.get().info(tokenBean.toToken());
dbBackupConfig.dbBackup();
return ApiResp.respOK("hello world");
}
@RequestMapping("/redirect")
@TokenIgnore
public void redirect(HttpServletResponse response) {
ArrayList<String> strings = CollUtil.newArrayList("11111", "22222");
coreLogService.addProcess("fdfd", strings, new ProcessImportConsumer<String>() {
@Override
public int accept(List<String> list) {
LogFactory.get().info("list: " + list.size());
return 0;
}
@Override
public String getFailFile() {
LogFactory.get().info("getFailFile: " + strings.size());
return null;
}
});
LogFactory.get().info("strings: " + strings.size());
// tsTokenConfig.validToken("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NzYwMDY4NzUsImlkIjoiMSIsImVudmlyb25tZW50VHlwZSI6Im1vYmlsZSIsInNlcnZpY2UiOiJjb250ZXN0LXJlc2VydmUiLCJleHRyYSI6IiJ9.nsfxEFpCNHC7eNCS5DJXdu1VDdnHrTjSfgrozND70Lc", true);
globalConfig.redirect("mobile", "/test", response);
}
@RequestMapping("/send")
@GetMapping("/send")
@TokenIgnore
public ApiResp<MessageReqResp> sendMessage() {
MessageReqResp reqResp = coreMessageService.send("13567116463", "SMS_154950909",
JSONUtil.createObj().putOpt("code", "123456"), "sms");
MessageReqResp reqResp = coreMessageService.send(new UserChannel("13567116463", "sms"),
JSONUtil.createObj().putOpt("code", "123456").putOpt("template_code", "SMS_154950909"));
return ApiResp.respOK(reqResp);
}

View File

@@ -0,0 +1 @@
*{margin:0;padding:0}@font-face{font-family:webfont;font-display:swap;src:url(//at.alicdn.com/t/webfont_enly703pzve.eot);src:url(//at.alicdn.com/t/webfont_enly703pzve.eot#iefix) format("embedded-opentype"),url(//at.alicdn.com/t/webfont_enly703pzve.woff2) format("woff2"),url(//at.alicdn.com/t/webfont_enly703pzve.woff) format("woff"),url(//at.alicdn.com/t/webfont_enly703pzve.ttf) format("truetype"),url(//at.alicdn.com/t/webfont_enly703pzve.svg#NotoSansHans-DemiLight) format("svg")}.web-font{font-family:serif;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-webkit-text-stroke-width:.2px;-moz-osx-font-smoothing:grayscale}.flex[data-v-7ce2b5d6]{display:flex;position:relative;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;word-break:break-all;white-space:normal;flex-shrink:0;-webkit-flex-shrink:0}

View File

@@ -0,0 +1 @@
.state[data-v-48e36584]{width:5rem;height:auto;position:absolute;right:-2%;bottom:-1%;margin-right:0}.state img[data-v-48e36584]{width:85%;height:75%}.wraps[data-v-48e36584]{width:100%;padding:6px 0}.wraps .item[data-v-48e36584]{background:#fff;margin:6px 12px;padding:8px;line-height:1.8;border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.1);border-top:5px solid #5aabff;font-size:15px}.wraps .item .label[data-v-48e36584]{width:76px}.wraps .item .label[data-v-48e36584]:after{content:""}.wraps .jia[data-v-48e36584],.wraps .meiyou[data-v-48e36584]{width:100%;text-align:center;padding:10px}.wraps .meiyou[data-v-48e36584]{color:grey}[data-v-20482632] .tabTwo .tabTwo_div2 .tabTwo_div2_Time2[data-v-56ab07cd] .van-cell,[data-v-20482632] .tabTwo .tabTwo_div2 .tabTwo_div2_Time[data-v-56ab07cd] .van-cell{box-sizing:border-box;width:100%;padding:3px 0;color:#323233;font-size:13px;line-height:24px;background-color:#f2f5f8;border-radius:5px}[data-v-20482632] [data-v-56ab07cd] .van-field__control{display:block;box-sizing:border-box;width:100%;min-width:0;margin:0;padding:0;color:#323233;line-height:inherit;border:0;resize:none;font-size:13px!important}[data-v-20482632] [data-v-56ab07cd] .van-field__label{flex:none;box-sizing:border-box;width:2.3em;margin:0;color:#59adff;white-space:nowrap}[data-v-20482632] .tabTwo .tabTwo_one .tabTwo_div1 .inp[data-v-56ab07cd]{width:100%;padding:0 0;border-radius:10px;outline:none;border:none;font-size:13px;border-radius:5px}[data-v-20482632] .van-cell:after{position:absolute;box-sizing:border-box;content:" ";pointer-events:none;right:16px;bottom:0;left:16px;border:none;transform:scaleY(.5)}.state_vant[data-v-20482632]{width:15rem;padding:0 0}[data-v-20482632] .van-field__label{flex:none;box-sizing:border-box;width:3.3em;color:#59adff;word-wrap:break-word}[data-v-20482632] .van-field__control{display:block;box-sizing:border-box;width:100%;min-width:0;margin:0;padding:0;color:#323233;line-height:inherit;text-align:center;border:0;resize:none}.tabTwo[data-v-20482632]{width:100%;height:5.5rem}.tabTwo .tabTwo_one[data-v-20482632]{width:100%;height:2.5rem;font-size:13px;display:flex;justify-content:space-around;padding:0 12px}.tabTwo .tabTwo_one .tabTwo_div2_state[data-v-20482632]{width:5.8rem;height:2.5rem;display:flex;justify-content:space-around}.tabTwo .tabTwo_one .tabTwo_div2_state[data-v-20482632] .van-cell{width:126%;padding:10px 0;color:#323233;font-size:13px;line-height:25px;background-color:#fff;box-sizing:border-box}.tabTwo .tabTwo_one .tabTwo_div1[data-v-20482632]{width:0;height:3rem;text-align:left;display:flex;justify-content:flex-start;align-items:center;flex-grow:1;font-size:13px!important}.tabTwo .tabTwo_one .tabTwo_div1 .inp[data-v-20482632]{width:90%;padding:3px 10px;border-radius:10px;outline:none;border:none;font-size:13px!important}.tabTwo .tabTwo_div2[data-v-20482632]{width:100%;height:3rem;display:flex;padding:8px 10px;box-sizing:border-box;justify-content:space-evenly;align-items:center}.tabTwo .tabTwo_div2 .tabTwo_div2_Time[data-v-20482632]{width:40%}.tabTwo .tabTwo_div2 .tabTwo_div2_Time[data-v-20482632] .van-cell{box-sizing:border-box;width:100%;padding:3px 0;color:#323233;font-size:13px;line-height:24px;background-color:#f2f5f8}.tabTwo .tabTwo_div2 .zhe[data-v-20482632]{width:4%;color:rgba(193,195,196,.6784313725490196)}.tabTwo .tabTwo_div2 .tabTwo_div2_Time2[data-v-20482632]{width:40%}.tabTwo .tabTwo_div2 .tabTwo_div2_Time2[data-v-20482632] .van-cell{box-sizing:border-box;width:100%;padding:3px 0;color:#323233;font-size:13px;line-height:24px;background-color:#f2f5f8}.tabTwoBtn[data-v-20482632]{width:15%;height:90%;margin:0 8px;background-color:#59adff;color:#fff;outline:none;border:none;border-radius:5px}.wrap .btn[data-v-20482632]{width:50px;height:50px;border-radius:50px;outline:none;border:none;background:#58acf2 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAIJJREFUWEdjZBhgwDjA9jOMOmBoh8D///8XgdIQIyNjHLlpiaIQ+P///36oAxxHHTAaAqMhMBoCVA2B////r2JgYBAl11Ac+l4zMjKGocthLQmhRawslR3wGFuRPVoUj4bAaAiMhsCQDwFQkQ1qlGIUscSWohSFALGW4FM36oDREAAAIXhaIRTlu6kAAAAASUVORK5CYII=) no-repeat .5rem .5rem;position:fixed;right:2rem;bottom:3rem}.wrap .skip[data-v-20482632]{width:100vw;height:100vh}.wrap .skip .skip_left[data-v-20482632]{width:70%;height:20vw;margin:6px 0;-o-object-fit:contain;object-fit:contain}

View File

@@ -0,0 +1 @@
.wrap[data-v-347dc6ff]{width:100vw;height:100vh;position:fixed;top:0;left:0}.wrap .top[data-v-347dc6ff]{width:100vh;height:15vh}.wrap .top img[data-v-347dc6ff]{width:100vw;height:100%}.wrap .content[data-v-347dc6ff]{width:80vw;height:50vh;margin:5rem auto;display:flex;flex-direction:column;justify-content:space-around;align-items:center}.wrap .content img[data-v-347dc6ff]{width:100%;height:60%}.wrap .content h3[data-v-347dc6ff]{color:#666;font-size:18px;font-weight:350}.wrap .bottom[data-v-347dc6ff]{width:100vh;height:15vh;position:fixed;bottom:0;left:0}.wrap .bottom img[data-v-347dc6ff]{width:100vw;height:100%}

View File

@@ -0,0 +1 @@
.view[data-v-3c038828]{width:100%}.jkmNucleic[data-v-3c038828]{width:100%;margin-top:12px;font-size:14px;color:#fff}.jkmNucleic .header[data-v-3c038828]{background:hsla(0,0%,100%,.4);font-size:13px;padding:4px;line-height:20px!important}.jkmNucleic .body2[data-v-3c038828],.jkmNucleic .body[data-v-3c038828]{padding:6px 4px;white-space:pre-wrap;line-height:20px;height:56px;text-align:center}.jkmNucleic .body2[data-v-3c038828]{line-height:40px;font-size:18px}.jkmNucleic .jkm[data-v-3c038828]{width:0;border-radius:6px;margin-right:6px}.jkmNucleic .nucleic[data-v-3c038828]{border-radius:6px;width:0;margin-left:6px}.xck[data-v-3c038828]{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.vaccinum[data-v-3c038828]{width:100%;border-top:1px solid #ddd;padding-top:12px;margin-top:12px;color:#999;font-size:14px}.vaccinum .va1[data-v-3c038828]{color:#339b68}.wrap[data-v-4c39bc1c]{width:100vw;min-height:100vh;background:#fff;padding-bottom:100px}.header[data-v-4c39bc1c]{height:50vw;position:relative;color:#fff}.header .headerText[data-v-4c39bc1c]{font-size:8vw;margin-top:24px;font-weight:700}.header .bg[data-v-4c39bc1c]{-o-object-fit:cover;object-fit:cover;z-index:0;position:absolute;left:0;top:0;width:100%;height:100%}.content[data-v-4c39bc1c]{padding:12px;border-radius:4px;background:#fff;margin:-48px 24px 12px;box-shadow:0 2px 10px 0 rgba(0,0,0,.25)}.qrcode[data-v-4c39bc1c]{width:200px;height:200px;margin-top:12px}.qrcode .expired[data-v-4c39bc1c]{position:absolute;left:0;top:0;color:red;width:100%;font-size:16px;line-height:32px;font-weight:700;height:100%;align-items:center;justify-content:center;background:#000;opacity:.9}.time[data-v-4c39bc1c]{margin-top:12px;color:#b5b5b5;display:flex;align-items:center;justify-content:center}.tips[data-v-4c39bc1c]{color:#555;line-height:1.6;font-size:14px;margin:0 36px;text-align:center;white-space:pre-wrap}.tips pre[data-v-4c39bc1c]{white-space:pre-wrap}.primaryColor[data-v-4c39bc1c]{color:#59adff}

View File

@@ -0,0 +1 @@
.state[data-v-48e36584]{width:5rem;height:auto;position:absolute;right:-2%;bottom:-1%;margin-right:0}.state img[data-v-48e36584]{width:85%;height:75%}.wraps[data-v-48e36584]{width:100%;padding:6px 0}.wraps .item[data-v-48e36584]{background:#fff;margin:6px 12px;padding:8px;line-height:1.8;border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.1);border-top:5px solid #5aabff;font-size:15px}.wraps .item .label[data-v-48e36584]{width:76px}.wraps .item .label[data-v-48e36584]:after{content:""}.wraps .jia[data-v-48e36584],.wraps .meiyou[data-v-48e36584]{width:100%;text-align:center;padding:10px}.wraps .meiyou[data-v-48e36584]{color:grey}.tabTwo[data-v-dd0e5654]{width:100%;margin-top:12px;padding:0 12px;font-size:14px;display:flex;align-items:center}.tabTwo .tabTwo_div1[data-v-dd0e5654]{width:0;flex-grow:1;height:32px;display:flex;font-size:13px!important}.tabTwo .tabTwo_div1 .inp[data-v-dd0e5654]{width:100%;height:100%;padding:0 12px;border-radius:4px;outline:none;border:none;font-size:13px!important;background-color:#f7f8fa}.tabTwo .tabTwo_div2[data-v-dd0e5654]{width:48px;background-color:#59adff;color:#fff;height:32px;line-height:32px;text-align:center;border-radius:4px;margin-left:6px}

View File

@@ -0,0 +1 @@
input[data-v-35195103]{margin:24px 48px;width:calc(100% - 96px);line-height:32px;border:1px solid #555;border-radius:2px;padding:0 8px;font-size:15px}.skip[data-v-f9824790]{width:100vw}.skip .skip_left[data-v-f9824790]{width:44%;height:23vw;margin:.6rem .5rem .6rem 1rem;background:url(link_1.bea27bf1.png);background-size:100% 100%;border-radius:10px;padding:10px;box-sizing:border-box;display:flex;align-items:center}.skip .skip_left img[data-v-f9824790]{width:24%;height:70%;flex-grow:2}.skip .skip_left div[data-v-f9824790]{width:50%;flex-grow:3}.skip .skip_left div .p1[data-v-f9824790]{color:#fff;font-size:18px;font-weight:400}.skip .skip_left div .p2[data-v-f9824790]{color:hsla(0,0%,100%,.2901960784313726);font-size:12px;font-weight:400}.skip .skip_right[data-v-f9824790]{width:44%;height:23vw;margin:.6rem 1rem .6rem .5rem;background:url(message_1.24803f90.png);background-size:100% 100%;border-radius:10px;padding:10px;box-sizing:border-box;display:flex;align-items:center}.skip .skip_right img[data-v-f9824790]{width:24%;height:70%;flex-grow:2}.skip .skip_right div[data-v-f9824790]{width:50%;flex-grow:3}.skip .skip_right div .p1[data-v-f9824790]{color:#fff;font-size:18px;font-weight:400}.skip .skip_right div .p2[data-v-f9824790]{color:hsla(0,0%,100%,.2901960784313726);font-size:12px;font-weight:400}@font-face{font-family:webfont;font-display:swap;src:url(//at.alicdn.com/t/webfont_0ojzn4lmety.eot);src:url(//at.alicdn.com/t/webfont_0ojzn4lmety.eot#iefix) format("embedded-opentype"),url(//at.alicdn.com/t/webfont_0ojzn4lmety.woff2) format("woff2"),url(//at.alicdn.com/t/webfont_0ojzn4lmety.woff) format("woff"),url(//at.alicdn.com/t/webfont_0ojzn4lmety.ttf) format("truetype"),url(//at.alicdn.com/t/webfont_0ojzn4lmety.svg#Alibaba-PuHuiTi-Regular) format("svg")}[data-v-f9824790] .van-badge{display:inline-block;box-sizing:border-box;min-width:22px;padding:0 3px;margin-bottom:1rem;color:#fff;font-weight:500;font-size:12px;line-height:1.6;text-align:center;background-color:#ee0a24;border:1px solid #fff;border-radius:1rem}[data-v-f9824790] .van-badge--fixed{position:absolute;top:0;right:-10px;transform:translate(50%,-50%);transform-origin:100%}.home[data-v-f9824790]{width:100vw;height:100vh;background:#fff;overflow:hidden}a[data-v-f9824790]{text-decoration:none;color:#333}.router-link-exact-active[data-v-f9824790]{color:#58acf2}.tabs[data-v-f9824790]{width:100vw;background:#f2f2f2;padding:6px 0}.tabItem[data-v-f9824790]{flex-grow:1;width:0;font-size:15px;font-weight:700}.content[data-v-f9824790]{height:0;overflow:auto;flex-grow:1}

View File

@@ -0,0 +1 @@
.bg[data-v-742d767c]{min-height:100vh;position:relative}.bg .beijing[data-v-742d767c]{width:100%;position:absolute;top:0;left:0;z-index:1}.bg .content[data-v-742d767c]{z-index:2;width:100vw;min-height:100vh}.bg .content .log_logo[data-v-742d767c]{width:calc(100% - 48px);max-height:100px;margin:24px;-o-object-fit:contain;object-fit:contain}.bg .content .kuang[data-v-742d767c]{width:calc(100vw - 48px);background:#fff;box-shadow:0 0 10px 0 rgba(0,0,0,.1);border-radius:30px;padding:15px 20px;box-sizing:border-box;margin:10vh auto}.bg .content .kuang .goBtn[data-v-742d767c]{width:calc(100% - 48px);height:60px;background:#59adff;border-radius:30px;color:#fff}.bg .content .kuang .inpWrap[data-v-742d767c]{width:calc(100% - 48px);margin:24px;height:60px;background:#f3f5fc;box-shadow:inset 0 0 5px 0 rgba(151,171,184,.1);border-radius:30px;padding:10px;box-sizing:border-box}.bg .content .kuang .inpWrap img[data-v-742d767c]{width:12px;height:17px;-o-object-fit:cover;object-fit:cover;margin:0 10px}.bg .content .kuang .inpWrap input[data-v-742d767c]{width:100%;height:100%;border:none;outline:none;background:#f3f5fc}.bg .content .kuang .xian[data-v-742d767c]{width:100%;height:1px;margin:20px 0;border:1px solid;-o-border-image:linear-gradient(270deg,rgba(89,173,255,0),#1890ff,rgba(24,144,255,0)) 1 1;border-image:linear-gradient(270deg,rgba(89,173,255,0),#1890ff,rgba(24,144,255,0)) 1 1}.bg .content .kuang .btns[data-v-742d767c]{width:calc(100% - 48px)}.bg .content .kuang .btns .fill[data-v-742d767c]{width:100%;height:60px;background:#49ccd9;border-radius:16px;margin-bottom:20px}.bg .content .kuang .btns .fill img[data-v-742d767c]{width:21px;height:21px;margin:0 5px;-o-object-fit:contain;object-fit:contain}.bg .content .kuang .btns .fill div[data-v-742d767c]{font-size:16px;font-family:AlibabaPuHuiTi-Medium\, AlibabaPuHuiTi;font-weight:500;color:#fff}.modalConten[data-v-742d767c]{height:400px;overflow-y:auto;padding:5px 16px;box-sizing:border-box;white-space:pre-line}.modalBtn[data-v-742d767c]{width:80%;height:40px;text-align:center;line-height:30px;background-color:#59adff;color:#fff;margin:20px 0 10px 0;border-radius:25px;border:none;outline:none}

View File

@@ -0,0 +1 @@
.succeed[data-v-bfc49e60]{background-color:#fff}.succeed .succeed_box[data-v-bfc49e60]{width:100vw;padding:20vw 10vw;text-align:center;background-color:#21c7ff;color:#fff}.succeed .succeed_box .chenggong[data-v-bfc49e60]{width:16vw;height:16vw;margin-bottom:4vw}.succeed .succeed_box .shadowBg[data-v-bfc49e60]{width:100vw;position:absolute;-o-object-fit:cover;object-fit:cover;height:20vw;bottom:0;left:0}.succeed .succeed_btn[data-v-bfc49e60]{width:50vw;margin:5rem auto}.succeed .succeed_btn button[data-v-bfc49e60]{width:100%;height:3rem;color:#fff;border-radius:4px;border:none;background-color:#66c0fd}

View File

@@ -0,0 +1 @@
.wrap[data-v-347dc6ff]{width:100vw;height:100vh;position:fixed;top:0;left:0}.wrap .top[data-v-347dc6ff]{width:100vh;height:15vh}.wrap .top img[data-v-347dc6ff]{width:100vw;height:100%}.wrap .content[data-v-347dc6ff]{width:80vw;height:50vh;margin:5rem auto;display:flex;flex-direction:column;justify-content:space-around;align-items:center}.wrap .content img[data-v-347dc6ff]{width:100%;height:60%}.wrap .content h3[data-v-347dc6ff]{color:#666;font-size:18px;font-weight:350}.wrap .bottom[data-v-347dc6ff]{width:100vh;height:15vh;position:fixed;bottom:0;left:0}.wrap .bottom img[data-v-347dc6ff]{width:100vw;height:100%}

View File

@@ -0,0 +1 @@
.colorHui[data-v-e807bdea]{color:#999}[data-v-e807bdea] .van-step__title--active{color:#323233!important}.daiShenHe[data-v-e807bdea]{width:90vw;display:flex;align-items:center}.daiShenHe .daiShenHe_name[data-v-e807bdea]{display:flex;font-size:12px}.daiShenHe .daiShenHe_name div[data-v-e807bdea]{background-color:#90c95e;color:#fff;border-radius:50%;width:48px;height:48px;line-height:48px;text-align:center;transform:scale(.8);box-sizing:border-box}.liucheng[data-v-e807bdea]{width:100%;margin-left:-1.2rem}.zanwei[data-v-e807bdea]{width:8%}.border[data-v-e807bdea]{width:100%;border-top:10px solid #f2f5f8;font-size:15px}.border .zhu[data-v-e807bdea]{background-color:#59aefc;width:150px;height:30px;line-height:30px;display:flex;justify-content:center;margin:20px auto;color:#fff;border-radius:15px;border:none;outline:none}.van-step__icon--finish[data-v-e807bdea],.van-step__title--active[data-v-e807bdea],.van-step__title--finish[data-v-e807bdea],[data-v-e807bdea] .van-step__icon--active{position:relative;color:#59aefc;z-index:1000}.van-step--finish .van-step__line[data-v-e807bdea],[data-v-e807bdea] .van-step--finish .van-step__circle{position:relative;background-color:#59aefc;z-index:1000}[data-v-e807bdea] .van-step__line{border-left:1px dashed #999;background-color:#fff;color:#59aefc}[data-v-e807bdea] .van-step__title--active{color:#59aefc}.wrap[data-v-e807bdea]{height:100%;line-height:1.8;padding:12px 0;color:#000;min-height:100vh}.xiangguan[data-v-e807bdea]{background-color:#59aefc;width:150px;margin:0 auto;height:30px;line-height:30px;color:#fff;border-radius:15px;border:none;outline:none}.itemDivider[data-v-e807bdea]{border-bottom:1px solid #eee;padding:8px 12px;color:#3a3a3a;font-size:15px}.itemDivider .label[data-v-e807bdea]{width:96px}.itemDivider img[data-v-e807bdea]{width:20vw;height:20vw;-o-object-fit:cover;object-fit:cover}.footer[data-v-e807bdea]{z-index:100;width:100%;left:0;padding:0 12px;background:#fff;height:76px;color:#fff;border-top:1px solid #ddd}.footer button[data-v-e807bdea]{width:0;flex-grow:1;height:48px;border-radius:4px;border:none;margin:0 6px}.smsOk[data-v-e807bdea]{color:#999}.smsOk[data-v-e807bdea],.smsOkResend[data-v-e807bdea]{font-size:12px;line-height:24px;margin-left:8px;transform:scale(.9)}.smsOkResend[data-v-e807bdea]{color:#999;background:#5aabff;color:#fff;border-radius:4px;padding:0 6px}

View File

@@ -0,0 +1 @@
.wrap[data-v-347dc6ff]{width:100vw;height:100vh;position:fixed;top:0;left:0}.wrap .top[data-v-347dc6ff]{width:100vh;height:15vh}.wrap .top img[data-v-347dc6ff]{width:100vw;height:100%}.wrap .content[data-v-347dc6ff]{width:80vw;height:50vh;margin:5rem auto;display:flex;flex-direction:column;justify-content:space-around;align-items:center}.wrap .content img[data-v-347dc6ff]{width:100%;height:60%}.wrap .content h3[data-v-347dc6ff]{color:#666;font-size:18px;font-weight:350}.wrap .bottom[data-v-347dc6ff]{width:100vh;height:15vh;position:fixed;bottom:0;left:0}.wrap .bottom img[data-v-347dc6ff]{width:100vw;height:100%}

View File

@@ -0,0 +1 @@
.state[data-v-48e36584]{width:5rem;height:auto;position:absolute;right:-2%;bottom:-1%;margin-right:0}.state img[data-v-48e36584]{width:85%;height:75%}.wraps[data-v-48e36584]{width:100%;padding:6px 0}.wraps .item[data-v-48e36584]{background:#fff;margin:6px 12px;padding:8px;line-height:1.8;border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.1);border-top:5px solid #5aabff;font-size:15px}.wraps .item .label[data-v-48e36584]{width:76px}.wraps .item .label[data-v-48e36584]:after{content:""}.wraps .jia[data-v-48e36584],.wraps .meiyou[data-v-48e36584]{width:100%;text-align:center;padding:10px}.wraps .meiyou[data-v-48e36584]{color:grey}.skip_left[data-v-2b65ce1d]{width:100%;height:23vw;margin:6px 0;background:url(message_1.24803f90.png);background-size:100% 100%;border-radius:10px;padding:10px;box-sizing:border-box;display:flex;align-items:center;justify-content:flex-end}.skip_left img[data-v-2b65ce1d]{width:16vw;height:16vw;display:flex;align-items:flex-end}.skip_left div[data-v-2b65ce1d]{width:75%;margin-left:5vw}.skip_left div .p1[data-v-2b65ce1d]{color:#fff;font-size:18px;font-weight:400}.skip_left div .p2[data-v-2b65ce1d]{color:hsla(0,0%,100%,.2901960784313726);font-size:12px;font-weight:400}.skip_right[data-v-2b65ce1d]{width:50%;height:23vw;margin:6px 0;background:url(message_1.24803f90.png);background-size:100% 100%;border-radius:10px;padding:10px;box-sizing:border-box;display:flex;align-items:center;justify-content:flex-end}.skip_right img[data-v-2b65ce1d]{width:16vw;height:16vw;display:flex;align-items:flex-end}.skip_right div[data-v-2b65ce1d]{width:75%;margin-left:5vw}.skip_right div .p1[data-v-2b65ce1d]{color:#fff;font-size:18px;font-weight:400}.skip_right div .p2[data-v-2b65ce1d]{color:hsla(0,0%,100%,.2901960784313726);font-size:12px;font-weight:400}@font-face{font-family:webfont;font-display:swap;src:url(//at.alicdn.com/t/webfont_0ojzn4lmety.eot);src:url(//at.alicdn.com/t/webfont_0ojzn4lmety.eot#iefix) format("embedded-opentype"),url(//at.alicdn.com/t/webfont_0ojzn4lmety.woff2) format("woff2"),url(//at.alicdn.com/t/webfont_0ojzn4lmety.woff) format("woff"),url(//at.alicdn.com/t/webfont_0ojzn4lmety.ttf) format("truetype"),url(//at.alicdn.com/t/webfont_0ojzn4lmety.svg#Alibaba-PuHuiTi-Regular) format("svg")}.item[data-v-2b65ce1d]{background:#fff;margin:6px 12px;padding:8px;line-height:1.8;border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.1);border-top:5px solid #5aabff}.item .hui[data-v-2b65ce1d]{color:grey}

View File

@@ -0,0 +1 @@
.state[data-v-48e36584]{width:5rem;height:auto;position:absolute;right:-2%;bottom:-1%;margin-right:0}.state img[data-v-48e36584]{width:85%;height:75%}.wraps[data-v-48e36584]{width:100%;padding:6px 0}.wraps .item[data-v-48e36584]{background:#fff;margin:6px 12px;padding:8px;line-height:1.8;border-radius:4px;box-shadow:0 2px 4px 0 rgba(0,0,0,.1);border-top:5px solid #5aabff;font-size:15px}.wraps .item .label[data-v-48e36584]{width:76px}.wraps .item .label[data-v-48e36584]:after{content:""}.wraps .jia[data-v-48e36584],.wraps .meiyou[data-v-48e36584]{width:100%;text-align:center;padding:10px}.wraps .meiyou[data-v-48e36584]{color:grey}.tabTwo[data-v-36552c82]{width:100%;margin-top:12px;padding:0 12px;font-size:14px;display:flex;align-items:center}.tabTwo .tabTwo_div1[data-v-36552c82]{width:0;flex-grow:1;height:32px;display:flex;font-size:13px!important}.tabTwo .tabTwo_div1 .inp[data-v-36552c82]{width:100%;height:100%;padding:0 12px;border-radius:4px;outline:none;border:none;font-size:13px!important;background-color:#f7f8fa}.tabTwo .tabTwo_div2[data-v-36552c82]{width:48px;background-color:#59adff;color:#fff;height:32px;line-height:32px;text-align:center;border-radius:4px;margin-left:6px}

View File

@@ -0,0 +1 @@
[data-v-667c97f7] .van-field__control{display:block;box-sizing:border-box;width:80%;min-width:0;color:#323233;background-color:transparent;border:0;resize:none;margin-left:8%;text-align:left}.reson[data-v-667c97f7]{display:flex;flex-direction:column!important;color:#646566}.reson .van-cell__value[data-v-667c97f7]{text-align:left}.notice[data-v-7d4cc171]{position:fixed;width:100%;left:0;top:0;z-index:100}.holder[data-v-7d4cc171]{height:40px}[data-v-3d45a78b] .van-field__body input{padding:0 6px}[data-v-3d45a78b] .reson_div[data-v-cb3ced6c]{border-top:10px solid #f2f5f8;border-bottom:10px solid #f2f5f8;padding:10px 0;color:#646566;font-size:14px;text-align:center}[data-v-3d45a78b] .van-field--disabled .van-field__label{color:#646566!important}[data-v-3d45a78b] .van-cell--required span:before{content:""!important}[data-v-3d45a78b] .van-cell--required span:after{position:absolute;right:-10px;color:#ee0a24;font-size:14px;content:"*"}textarea[data-v-3d45a78b]::-webkit-input-placeholder{color:#d2ced0;font-size:14px}i[data-v-3d45a78b]{color:red}.header[data-v-3d45a78b]{width:99%;height:auto;margin:0 auto;padding:10px;box-sizing:border-box}.header img[data-v-3d45a78b]{width:calc(100% - 48px);max-height:100px;margin:1px;-o-object-fit:contain;object-fit:contain}[data-v-3d45a78b] .van-cell__value{text-align:left}[data-v-3d45a78b] .van-field__control{display:block;box-sizing:border-box;width:100%;margin:0;color:#323233;background-color:transparent;border:0;resize:none;text-align:left;padding:0}.reson_div[data-v-3d45a78b]{border-top:10px solid #f2f5f8;border-bottom:10px solid #f2f5f8;padding:10px 1px!important;color:#646566;font-size:14px}.btns[data-v-3d45a78b]{width:auto;height:60px;display:flex;justify-content:flex-end;align-items:flex-end}.pays[data-v-3d45a78b]{margin:8px auto;border-radius:10px;box-sizing:border-box}.paysAdd[data-v-3d45a78b]{width:90%;height:40px;color:#59adff;text-align:center;line-height:40px;margin:0 auto}.payReduce[data-v-3d45a78b]{width:100%;border-top:20px solid #f2f5f8;padding:0 0 4px 16px;display:flex;background:#f2f5f8;justify-content:space-between;align-items:center}.payReduce button[data-v-3d45a78b]{color:#e36969;border:none;padding:0 16px;background-color:#f2f5f8}[data-v-3d45a78b] .van-cell--required:before{content:""}[data-v-3d45a78b] .van-cell--required .van-cell__title span{position:relative}[data-v-3d45a78b] .van-cell--required .van-cell__title span:before{position:absolute;right:-8px;color:#ee0a24;font-size:14px;content:"*"}.reson[data-v-3d45a78b]{display:flex;flex-direction:column!important;color:#646566}.addPay[data-v-3d45a78b]{width:100%;margin:10px auto;border-radius:10px;padding:0;box-sizing:border-box}.button[data-v-3d45a78b]{width:10rem;height:2rem;display:block;margin:1rem auto}.van-nav-bar .van-icon[data-v-3d45a78b]{color:#000}.submit[data-v-3d45a78b]{width:calc(100vw - 24px);height:3rem;color:#fff;border-radius:3px;margin:14px 12px;outline:none}.van-action-sheet[data-v-3d45a78b]{display:flex;flex-direction:column;max-height:40%;overflow:hidden;color:#323233}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

View File

@@ -0,0 +1,138 @@
<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta content="IE=edge" http-equiv="X-UA-Compatible"><meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0" name="viewport"><link href="favicon.ico" rel="icon"><title>校外人员入校审核</title><style>html, body {
margin: 0;
padding: 0;
}
* {
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
}</style><style>.loading {
width: 100vw;
height: 100vh;
display: flex;
font-size: 13px;
flex-direction: column;
justify-content: center;
align-items: center;
}
.loading-tips {
height: 20px;
line-height: 20px;
color: #3a3a3a;
}
.loading-container {
width: 100px;
height: 100px;
animation: rotate-move 2s ease-in-out infinite;
}
.loading-container-dot {
width: 24px;
height: 24px;
border-radius: 50%;
background-color: #000;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
}
.dot-3 {
background-color: #f74d75;
animation: dot-3-move 2s ease infinite;
}
.dot-2 {
background-color: #10beae;
animation: dot-2-move 2s ease infinite;
}
.dot-1 {
background-color: #ffe386;
animation: dot-1-move 2s ease infinite;
}
@keyframes dot-3-move {
20% {
transform: scale(1)
}
45% {
transform: translateY(-5px) scale(.6)
}
60% {
transform: translateY(-20px) scale(.6)
}
80% {
transform: translateY(-20px) scale(.6)
}
100% {
transform: translateY(0px) scale(1)
}
}
@keyframes dot-2-move {
20% {
transform: scale(1)
}
45% {
transform: translate(-4px, 3px) scale(.6)
}
60% {
transform: translate(-20px, 15px) scale(.6)
}
80% {
transform: translate(-20px, 15px) scale(.6)
}
100% {
transform: translateY(0px) scale(1)
}
}
@keyframes dot-1-move {
20% {
transform: scale(1)
}
45% {
transform: translate(4px, 3px) scale(.6)
}
60% {
transform: translate(20px, 15px) scale(.6)
}
80% {
transform: translate(20px, 15px) scale(.6)
}
100% {
transform: translateY(0px) scale(1)
}
}
@keyframes rotate-move {
55% {
transform: rotate(0deg)
}
80% {
transform: rotate(360deg)
}
100% {
transform: rotate(360deg)
}
}</style><link href="css/chunk-042d5992.89adb41e.css" rel="prefetch"><link href="css/chunk-0531775c.5b0eefaf.css" rel="prefetch"><link href="css/chunk-0648c3ef.0ff9539c.css" rel="prefetch"><link href="css/chunk-188e3fa4.275399a9.css" rel="prefetch"><link href="css/chunk-26937ed4.b3bb8164.css" rel="prefetch"><link href="css/chunk-27755411.65febfb3.css" rel="prefetch"><link href="css/chunk-300e725c.944af6a2.css" rel="prefetch"><link href="css/chunk-31e07dff.5b0eefaf.css" rel="prefetch"><link href="css/chunk-4d1974da.c70f0eba.css" rel="prefetch"><link href="css/chunk-4eb60a5d.5b0eefaf.css" rel="prefetch"><link href="css/chunk-72a73cc2.23c45673.css" rel="prefetch"><link href="css/chunk-dd7f1184.c4031c36.css" rel="prefetch"><link href="css/chunk-e9950686.60793d7d.css" rel="prefetch"><link href="js/chunk-042d5992.b340b18c.js" rel="prefetch"><link href="js/chunk-0531775c.e68fe2d1.js" rel="prefetch"><link href="js/chunk-0648c3ef.8397ad46.js" rel="prefetch"><link href="js/chunk-188e3fa4.71744b51.js" rel="prefetch"><link href="js/chunk-26937ed4.99cdb24b.js" rel="prefetch"><link href="js/chunk-26b05676.8cad4b43.js" rel="prefetch"><link href="js/chunk-27755411.62b9ce63.js" rel="prefetch"><link href="js/chunk-2d0b2ecb.1abd02a2.js" rel="prefetch"><link href="js/chunk-300e725c.fc2456fa.js" rel="prefetch"><link href="js/chunk-31e07dff.c267db1d.js" rel="prefetch"><link href="js/chunk-364cf210.c3e2fbd0.js" rel="prefetch"><link href="js/chunk-4bdf2c4e.fcc723c1.js" rel="prefetch"><link href="js/chunk-4d1974da.66c2525b.js" rel="prefetch"><link href="js/chunk-4eb60a5d.0875be6e.js" rel="prefetch"><link href="js/chunk-72a73cc2.0d7368e1.js" rel="prefetch"><link href="js/chunk-dd7f1184.fbeaa819.js" rel="prefetch"><link href="js/chunk-e9950686.f3e29c04.js" rel="prefetch"><link href="css/app.722d931f.css" rel="preload" as="style"><link href="css/chunk-vendors.eda94bcc.css" rel="preload" as="style"><link href="js/app.fdc7fe9d.js" rel="preload" as="script"><link href="js/chunk-vendors.335d9dbf.js" rel="preload" as="script"><link href="css/chunk-vendors.eda94bcc.css" rel="stylesheet"><link href="css/app.722d931f.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but faqi doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="loading/loading.js"></script><script src="js/chunk-vendors.335d9dbf.js"></script><script src="js/app.fdc7fe9d.js"></script></body></html>

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 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-0531775c"],{"1fcb":function(t,o,s){"use strict";s.r(o);var n=function(){var t=this,o=t.$createElement,n=t._self._c||o;return n("Result",[n("div",{staticClass:"top",attrs:{slot:"top"},slot:"top"},[n("img",{attrs:{src:s("2846"),alt:""}})]),n("div",{staticClass:"content",attrs:{slot:"content"},slot:"content"},[n("img",{attrs:{src:s("ed77"),alt:""}}),n("h3",[t._v("您的审核未通过")])]),n("div",{staticClass:"bottom",attrs:{slot:"bottom"},slot:"bottom"},[n("img",{attrs:{slot:"bottom",src:s("3e6d"),alt:""},slot:"bottom"})])])},c=[],e=s("ffa4"),a={components:{Result:e["a"]}},i=a,l=s("2877"),r=Object(l["a"])(i,n,c,!1,null,"0b5cfe32",null);o["default"]=r.exports},2846:function(t,o,s){t.exports=s.p+"img/top.9905f564.png"},"3e6d":function(t,o,s){t.exports=s.p+"img/bottom.784753ac.png"},cb5f:function(t,o,s){"use strict";s("ceb1")},ceb1:function(t,o,s){},ed77:function(t,o,s){t.exports=s.p+"img/content.96f77c79.png"},ffa4:function(t,o,s){"use strict";var n=function(){var t=this,o=t.$createElement,s=t._self._c||o;return s("div",{staticClass:"wrap"},[t._t("top"),t._t("content"),t._t("bottom")],2)},c=[],e={},a=e,i=(s("cb5f"),s("2877")),l=Object(i["a"])(a,n,c,!1,null,"347dc6ff",null);o["a"]=l.exports}}]);

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

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0b2ecb"],{"25d6":function(e,n,t){"use strict";t.r(n);var a=function(){var e=this,n=e.$createElement,t=e._self._c||n;return t("router-view")},c=[],u={name:"BasicLayout"},r=u,o=t("2877"),s=Object(o["a"])(r,a,c,!1,null,"2eabe62e",null);n["default"]=s.exports}}]);

View File

@@ -0,0 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-300e725c"],{"4fcf":function(t,c,o){"use strict";var e=o("906c"),n=o("a18c"),i=function(t,c){n["a"].push({path:"/record/detail",query:{id:t,num:c}})},s=function(){n["a"].push({path:"/"})},u=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1;n["a"].go(t)},a=function(){n["a"].push({path:"/record/successful"})},r=function(){n["a"].push({path:"/record/succeed"})},f=function(t){var c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"phone",o={source:c};e["a"].isEmpty(t)||(o.recordId=t),n["a"].push({path:"/record/apply",query:o})},p=function(t){e["a"].isEmpty(t)?s():i(t)},l={login:function(){n["a"].push({path:"/visitor/login"})},record:function(){n["a"].push({path:"/visitor/record"})},result:function(t){n["a"].push({path:"/visitor/result",query:{id:t}})}};c["a"]={Visitor:l,goDetail:i,goHome:s,goBack:u,goRecordSuccessful:a,goRecordSucceed:r,goRecordApply:f,homeDetail:p}},9707:function(t,c,o){},c94f:function(t,c,o){t.exports=o.p+"img/payment.64b9ec15.png"},d108:function(t,c,o){"use strict";o("9707")},f017:function(t,c,o){"use strict";o.r(c);var e=function(){var t=this,c=t.$createElement,e=t._self._c||c;return e("flex",{staticClass:"succeed",attrs:{direction:"column"}},[e("flex",{staticClass:"succeed_box",attrs:{"align-items":"center",direction:"column",justify:"center"}},[e("img",{staticClass:"chenggong",attrs:{alt:"",src:o("c94f")}}),e("h2",[t._v("提交成功")]),e("flex",[t._v("您的入校申请已提交,审核通过后您将收到短信通知,请注意查收。")])],1),e("div",{staticClass:"succeed_btn"},[e("button",{on:{click:t.goVisitorLogin}},[t._v("去查看审核进度")])])],1)},n=[],i=o("4fcf"),s={methods:{goVisitorLogin:function(){i["a"].goBack(-2)}}},u=s,a=(o("d108"),o("2877")),r=Object(a["a"])(u,e,n,!1,null,"bfc49e60",null);c["default"]=r.exports}}]);

View File

@@ -0,0 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-31e07dff"],{"63f8":function(t,o,s){t.exports=s.p+"img/top.70166250.png"},cb5f:function(t,o,s){"use strict";s("ceb1")},ceb1:function(t,o,s){},d4c5:function(t,o,s){"use strict";s.r(o);var n=function(){var t=this,o=t.$createElement,n=t._self._c||o;return n("Result",[n("div",{staticClass:"top",attrs:{slot:"top"},slot:"top"},[n("img",{attrs:{src:s("63f8"),alt:""}})]),n("div",{staticClass:"content",attrs:{slot:"content"},slot:"content"},[n("img",{attrs:{src:s("f85a"),alt:""}}),n("h3",[t._v("您已提交过记录,请等待审核通过")])]),n("div",{staticClass:"bottom",attrs:{slot:"bottom"},slot:"bottom"},[n("img",{attrs:{slot:"bottom",src:s("e38a"),alt:""},slot:"bottom"})])])},e=[],c=s("ffa4"),a={components:{Result:c["a"]}},i=a,l=s("2877"),r=Object(l["a"])(i,n,e,!1,null,"2996a060",null);o["default"]=r.exports},e38a:function(t,o,s){t.exports=s.p+"img/bottom.2e5666e8.png"},f85a:function(t,o,s){t.exports=s.p+"img/content.6ed9ad22.png"},ffa4:function(t,o,s){"use strict";var n=function(){var t=this,o=t.$createElement,s=t._self._c||o;return s("div",{staticClass:"wrap"},[t._t("top"),t._t("content"),t._t("bottom")],2)},e=[],c={},a=c,i=(s("cb5f"),s("2877")),l=Object(i["a"])(a,n,e,!1,null,"347dc6ff",null);o["a"]=l.exports}}]);

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

@@ -0,0 +1 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-4eb60a5d"],{"401c":function(t,o,s){t.exports=s.p+"img/404.aae0b83c.png"},"757e":function(t,o,s){t.exports=s.p+"img/top.ef87bb54.png"},cb5f:function(t,o,s){"use strict";s("ceb1")},ceb1:function(t,o,s){},dc93:function(t,o,s){t.exports=s.p+"img/bottom.6eba07d4.png"},f173:function(t,o,s){"use strict";s.r(o);var n=function(){var t=this,o=t.$createElement,n=t._self._c||o;return n("Result",[n("div",{staticClass:"top",attrs:{slot:"top"},slot:"top"},[n("img",{attrs:{src:s("dc93"),alt:""}})]),n("div",{staticClass:"content",attrs:{slot:"content"},slot:"content"},[n("img",{attrs:{src:s("401c"),alt:""}}),n("h3",[t._v("页面出错了")])]),n("div",{staticClass:"bottom",attrs:{slot:"bottom"},slot:"bottom"},[n("img",{attrs:{slot:"bottom",src:s("757e"),alt:""},slot:"bottom"})])])},c=[],e=s("ffa4"),a={components:{Result:e["a"]}},i=a,l=s("2877"),r=Object(l["a"])(i,n,c,!1,null,"340221be",null);o["default"]=r.exports},ffa4:function(t,o,s){"use strict";var n=function(){var t=this,o=t.$createElement,s=t._self._c||o;return s("div",{staticClass:"wrap"},[t._t("top"),t._t("content"),t._t("bottom")],2)},c=[],e={},a=e,i=(s("cb5f"),s("2877")),l=Object(i["a"])(a,n,c,!1,null,"347dc6ff",null);o["a"]=l.exports}}]);

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

@@ -0,0 +1,32 @@
/**
* 倒计时10s中提醒用户
*/
function reloadTips() {
setTimeout(() => {
let ele = document.getElementById("loading-tips");
if (ele) {
ele.innerHTML = "加载时间过长,请检查网络或退出重试"
}
}, 10 * 1000);
}
/**
* 显示加载框
*/
function showLoading() {
var loading = " <div class=\"loading\">\n" +
" <div class=\"loading-container\">\n" +
" <div class=\"loading-container-dot dot-1\"></div>\n" +
" <div class=\"loading-container-dot dot-2\"></div>\n" +
" <div class=\"loading-container-dot dot-3\"></div>\n" +
" </div>\n" +
" <div id='loading-tips' class=\"loading-tips\">&nbsp;</div>\n" +
" </div>";
var root = document.getElementById("app");
root.innerHTML = loading;
reloadTips();
}
showLoading();

View File

@@ -1,16 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
<meta
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"
name="viewport"
/>
</head>
<body>
<script type="text/javascript">
</script>
</body>
</html>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</parent>
<artifactId>springboot-annotation</artifactId>

View File

@@ -0,0 +1,13 @@
package com.tiesheng.annotation.operation;
import java.lang.annotation.*;
/**
* @author hao
*/
@Target(ElementType.METHOD)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationIgnore {
}

View File

@@ -21,4 +21,12 @@ public @interface OperationLog {
*/
String insertKey() default "";
/**
* 需要脱敏的字段
*
* @return
*/
String[] desensitize() default {};
}

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</parent>
<artifactId>springboot-database</artifactId>

View File

@@ -9,15 +9,20 @@ import cn.hutool.log.LogFactory;
import com.tiesheng.database.utls.TieshengDbUtil;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.util.Date;
import java.util.List;
/**
* @author hao
*/
@Configuration
@ConfigurationProperties(prefix = "tiesheng.db-backup")
public class DbBackupConfig {
@ConfigurationProperties(prefix = "tiesheng.db.backup")
@EnableScheduling
public class DbBackupConfig implements SchedulingConfigurer {
/**
* 数据库备份的路径
@@ -29,25 +34,45 @@ public class DbBackupConfig {
*/
private String format = "yyyyMMdd";
/**
* 过期天数
*/
private Integer days = 7;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addCronTask(this::dbBackup, "0 0 1 * * ?");
}
/**
* 数据库备份
*/
public void dbBackup() {
if (!FileUtil.exist(path)) {
return;
}
String url = SpringUtil.getProperty("spring.datasource.url");
String username = SpringUtil.getProperty("spring.datasource.username");
String password = SpringUtil.getProperty("spring.datasource.password");
String dbName = TieshengDbUtil.getTableSchema(url);
String backupDir = StrUtil.format("{}{}", getPath(), dbName);
try {
String saveFile = StrUtil.format("{}{}/{}.sql", getPath(), dbName, DateUtil.format(new Date(), format));
String saveFile = StrUtil.format("{}/{}.sql", backupDir, DateUtil.format(new Date(), format));
FileUtil.mkParentDirs(saveFile);
String cmd = StrUtil.format("mysqldump -u{} -p {} > {}", username, dbName, saveFile);
LogFactory.get().info("cmd: " + cmd);
String forStr = RuntimeUtil.execForStr(cmd);
LogFactory.get().info("dbBackup: " + forStr);
forStr = RuntimeUtil.execForStr(password);
LogFactory.get().info("dbBackup: " + forStr);
} catch (Exception ignored) {
}
String cmd = StrUtil.format("mysqldump -u {} --password={} --databases {} " +
"--compress --skip-opt --result-file {} ", username, password, dbName, saveFile);
RuntimeUtil.execForStr(cmd);
RuntimeUtil.execForStr(StrUtil.format("gzip -9f {}", saveFile));
// 删除过期备份
List<String> forStr = RuntimeUtil.execForLines("find " + backupDir + " -name *.sql.gz -mtime +" + days);
forStr.forEach(FileUtil::del);
} catch (Exception e) {
LogFactory.get().info(e);
}
}
///////////////////////////////////////////////////////////////////////////
@@ -69,4 +94,14 @@ public class DbBackupConfig {
public void setFormat(String format) {
this.format = format;
}
public Integer getDays() {
return days;
}
public void setDays(Integer days) {
this.days = days;
}
}

View File

@@ -16,11 +16,12 @@ import java.util.List;
* @author hao
*/
@Configuration
@ConfigurationProperties(prefix = "tiesheng.db-migration")
@ConfigurationProperties(prefix = "tiesheng.db.migration")
public class DbMigrationConfig {
private String table = "core_config_db";
private List<String> locations = CollUtil.newArrayList("classpath*:db/migration/*.sql");
private List<String> migrations = CollUtil.newArrayList("classpath*:db/migration/*.sql");
private List<String> datas = CollUtil.newArrayList("classpath*:db/data/*.sql");
private String ignoreSqls = "drop table,delete from";
/**
@@ -57,12 +58,20 @@ public class DbMigrationConfig {
this.table = table;
}
public List<String> getLocations() {
return locations;
public List<String> getMigrations() {
return migrations;
}
public void setLocations(List<String> locations) {
this.locations = locations;
public void setMigrations(List<String> migrations) {
this.migrations = migrations;
}
public List<String> getDatas() {
return datas;
}
public void setDatas(List<String> datas) {
this.datas = datas;
}
public String getIgnoreSqls() {

View File

@@ -8,7 +8,6 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import cn.hutool.log.LogFactory;
import com.tiesheng.database.config.DbMigrationConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletContextInitializer;
@@ -38,17 +37,24 @@ public class DbMigrationInitializer implements ServletContextInitializer {
DataSource dataSource;
@Autowired
DbMigrationConfig dbMigrationConfig;
@Autowired(required = false)
@Autowired
List<DbDataInitializer> dbDataInitializerList;
@Override
public void onStartup(ServletContext servletContext) {
try {
startDeal();
if (dbDataInitializerList != null) {
dbDataInitializerList.forEach(DbDataInitializer::init);
}
// 初始化
Db coreDb = Db.use(dataSource);
dbMigrationConfig.checkDbExists(coreDb);
startDeal(coreDb, dbMigrationConfig.getMigrations());
startDeal(coreDb, dbMigrationConfig.getDatas());
// 其他数据初始化
dbDataInitializerList.forEach(DbDataInitializer::init);
} catch (Exception ignore) {
}
}
@@ -59,18 +65,13 @@ public class DbMigrationInitializer implements ServletContextInitializer {
*
* @throws Exception
*/
private void startDeal() throws Exception {
Db coreDb = Db.use(dataSource);
dbMigrationConfig.checkDbExists(coreDb);
private void startDeal(Db coreDb, List<String> locations) throws Exception {
PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
List<Resource> resourceList = new ArrayList<>();
for (String location : dbMigrationConfig.getLocations()) {
for (String location : locations) {
Resource[] resources = patternResolver.getResources(location);
resourceList.addAll(Arrays.asList(resources));
}
// 排序后执行sql
resourceList.sort((o1, o2) -> StrUtil.compare(o1.getFilename(), o2.getFilename(), true));
for (Resource resource : resourceList) {
migrationByResource(resource, coreDb);
@@ -94,8 +95,8 @@ public class DbMigrationInitializer implements ServletContextInitializer {
if (entity == null) {
return;
}
AtomicReference<Integer> success= new AtomicReference<>(0);
AtomicReference<Integer> fail= new AtomicReference<>(0);
AtomicReference<Integer> success = new AtomicReference<>(0);
AtomicReference<Integer> fail = new AtomicReference<>(0);
db.tx((VoidFunc1<Db>) parameter -> {
List<String> split = StrUtil.split(readUtf8, ";");
for (String sql : split) {
@@ -114,7 +115,6 @@ public class DbMigrationInitializer implements ServletContextInitializer {
}
}
});
LogFactory.get().info("执行sql文件{},成功数:{},失败数:{}。",filename,success.get(),fail.get());
entity.set("checksum", checksum.getValue());
entity.set("update_time", DateUtil.date());
db.update(entity, Entity.create(dbMigrationConfig.getTable()).set("id", entity.get("id")));

View File

@@ -0,0 +1,13 @@
package com.tiesheng.database.service.impl;
import com.tiesheng.database.service.DbDataInitializer;
import org.springframework.stereotype.Component;
@Component
public class DefaultDbDataInitializer implements DbDataInitializer {
@Override
public void init() {
}
}

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</parent>
<artifactId>springboot-encrypt</artifactId>

View File

@@ -1,21 +0,0 @@
package com.tiesheng.encrypt;
import com.tiesheng.encrypt.config.DecryptRequestBodyAdvice;
import com.tiesheng.encrypt.config.EncryptResponseBodyAdvice;
import org.springframework.context.annotation.Import;
import java.lang.annotation.*;
/**
* @author hao
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({
DecryptRequestBodyAdvice.class,
EncryptResponseBodyAdvice.class,
})
public @interface EnableEncryptConfig {
}

View File

@@ -0,0 +1,10 @@
package com.tiesheng.encrypt;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan({
"com.tiesheng.encrypt.**.*",
})
public class EncryptAutoConfigurer {
}

View File

@@ -37,7 +37,7 @@ public class EncryptResponseBodyAdvice implements ResponseBodyAdvice<ApiResp> {
try {
Object data = body.getData();
if (data == null || !body.successful()) {
if (data == null || !body.successful() || !encryptConfig.isBody()) {
return body;
}

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</parent>
<artifactId>springboot-login</artifactId>

View File

@@ -27,6 +27,7 @@ public class TsTokenConfig {
private String encryptKey = "%kIp9frQCu";
private Integer expireHours = 48;
private String[] ignorePaths;
private boolean validLoginSign = false;
/**
@@ -148,4 +149,12 @@ public class TsTokenConfig {
public void setIgnorePaths(String[] ignorePaths) {
this.ignorePaths = ignorePaths;
}
public boolean isValidLoginSign() {
return validLoginSign;
}
public void setValidLoginSign(boolean validLoginSign) {
this.validLoginSign = validLoginSign;
}
}

View File

@@ -1,6 +1,7 @@
package com.tiesheng.login.config.token.bean;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.jwt.JWT;
import com.tiesheng.login.config.token.TsTokenConfig;
@@ -34,9 +35,9 @@ public class TokenBean {
return JWT.create()
.setExpiresAt(DateUtil.offsetHour(DateUtil.date(), tsTokenConfig.getExpireHours()))
.setPayload("id", getId())
.setPayload("environmentType", getEnvironmentType())
.setPayload("service", getService())
.setPayload("extra", getExtra())
.setPayload("environmentType", StrUtil.emptyToDefault(getEnvironmentType(), ""))
.setPayload("service", StrUtil.emptyToDefault(getService(), ""))
.setPayload("extra", StrUtil.emptyToDefault(getExtra(), ""))
.setKey(tsTokenConfig.getEncryptKey().getBytes())
.sign();
}

View File

@@ -4,7 +4,9 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import com.alibaba.fastjson.JSON;
import com.tiesheng.annotation.operation.OperationIgnore;
import com.tiesheng.annotation.token.TokenIgnore;
import com.tiesheng.login.config.token.TsTokenConfig;
import com.tiesheng.login.config.token.bean.TokenBean;
import com.tiesheng.login.pojos.CodeExtraDTO;
import com.tiesheng.login.pojos.DoLoginInfo;
@@ -49,6 +51,8 @@ public class LoginController {
TieshengLoginConfigurer tieshengLoginConfigurer;
@Autowired
GlobalConfig globalConfig;
@Autowired
TsTokenConfig tsTokenConfig;
/**
@@ -57,7 +61,13 @@ public class LoginController {
* @return
*/
@GetMapping("/unique/redirect")
@OperationIgnore
public void uniqueIndex(UniqueIndexDTO dto, HttpServletResponse response) {
if (tsTokenConfig.isValidLoginSign() && !dto.validSign()) {
tieshengLoginConfigurer.onSignError(response);
return;
}
TokenBean tokenBean = tieshengLoginConfigurer.doLogin(new DoLoginInfo("web_unique_redirect",
dto.getNo(), dto.getPlatform(), dto.getInfo()));
tieshengLoginConfigurer.onLoginRedirect(tokenBean, dto.getTo(), dto.getExtra(), response);
@@ -71,6 +81,7 @@ public class LoginController {
* @return
*/
@PostMapping("/unique/index")
@OperationIgnore
public ApiResp<String> uniqueIndex(@RequestBody UniqueIndexDTO dto) {
TokenBean tokenBean = tieshengLoginConfigurer.doLogin(new DoLoginInfo("web_unique_index",
dto.getNo(), dto.getPlatform(), dto.getInfo()));
@@ -93,6 +104,7 @@ public class LoginController {
* @param response
*/
@GetMapping("/ding/index/{service}")
@OperationIgnore
public void dingIndex(@PathVariable String service, String extra, HttpServletResponse response) {
if (StrUtil.isEmpty(extra)) {
extra = "";
@@ -116,6 +128,7 @@ public class LoginController {
* @param service
*/
@RequestMapping("/ding/oauth2/{service}")
@OperationIgnore
public void dingOauth2(@PathVariable String service, CodeExtraDTO dto, HttpServletResponse response) {
String ddUserId = platformDingConfig.getUserIdByCode(service, dto.getCode());
DingUserInfo dingUserInfo = platformDingConfig.topapiV2UserGet(service, ddUserId);
@@ -149,11 +162,12 @@ public class LoginController {
* @return
*/
@RequestMapping("/wxmp/index/{service}")
@OperationIgnore
public void wxmpIndex(@PathVariable String service, String extra, HttpServletResponse response) throws IOException {
if (StrUtil.isEmpty(extra)) {
extra = "";
}
String configUrl = globalConfig.buildPath("/auth/wxmp/oauth2/" + service + "?extra=" + extra);
String configUrl = globalConfig.buildPath("/login/wxmp/oauth2/" + service + "?extra=" + extra);
String authorizationUrl = platformWxmpConfig.buildAuthorizationUrl(service, configUrl, "snsapi_userinfo");
response.sendRedirect(authorizationUrl);
}
@@ -163,6 +177,7 @@ public class LoginController {
* 微信授权回调
*/
@RequestMapping("/wxmp/oauth2/{service}")
@OperationIgnore
public void wxmpOauth2(@PathVariable String service, CodeExtraDTO dto, HttpServletResponse response) {
WxUserInfo wxUserInfo = platformWxmpConfig.getOAuth2AccessToken(service, dto.getCode());
TokenBean tokenBean = tieshengLoginConfigurer.doLogin(new DoLoginInfo(wxUserInfo.getAppId(),
@@ -193,6 +208,7 @@ public class LoginController {
* @return
*/
@RequestMapping("/wxmini/index/{service}")
@OperationIgnore
public ApiResp<WxminiLoginVo> wxminiIndex(@PathVariable String service, String code) {
String openid = platformWxminiConfig.jscode2session(service, code);
WxConfigBean configBean = platformWxminiConfig.getConfigBean(service);

View File

@@ -1,6 +1,10 @@
package com.tiesheng.login.pojos;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import java.util.Objects;
public class UniqueIndexDTO extends LoginToInfo {
@@ -8,6 +12,26 @@ public class UniqueIndexDTO extends LoginToInfo {
private String extra;
private String info;
private String platform = "web";
private Long timestamp;
private String sign;
/**
* 验证签名是否正确
*/
public boolean validSign() {
if (StrUtil.isEmpty(getNo()) || getTimestamp() == null) {
return false;
}
if ((DateUtil.currentSeconds() - getTimestamp()) > 60) {
return false;
}
String mySign = getNo() + getTimestamp();
for (int i = 0; i < 11; i++) {
mySign = SecureUtil.md5(mySign);
}
return Objects.equals(sign, mySign);
}
///////////////////////////////////////////////////////////////////////////
// setter\getter
@@ -47,4 +71,20 @@ public class UniqueIndexDTO extends LoginToInfo {
public void setPlatform(String platform) {
this.platform = platform;
}
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
}

View File

@@ -2,6 +2,7 @@ package com.tiesheng.login.service;
import com.tiesheng.login.config.token.bean.TokenBean;
import com.tiesheng.login.pojos.DoLoginInfo;
import com.tiesheng.util.ServletKit;
import org.springframework.context.annotation.Configuration;
import javax.servlet.http.HttpServletResponse;
@@ -28,4 +29,9 @@ public interface TieshengLoginConfigurer {
void onLoginRedirect(TokenBean bean, String to, String extra, HttpServletResponse response);
/**
* 签名错误的时候
*/
void onSignError(HttpServletResponse response);
}

View File

@@ -24,4 +24,9 @@ public class DefaultLoginConfigurer implements TieshengLoginConfigurer {
public void onLoginRedirect(TokenBean bean, String to, String extra, HttpServletResponse response) {
}
@Override
public void onSignError(HttpServletResponse response) {
}
}

View File

@@ -24,7 +24,7 @@
corpId: getQueryString("corpId"),
onSuccess: function (result) {
let search = window.location.search + "&code=" + result.code;
window.location.href = "/auth/ding/oauth2/" + getQueryString("service") + search;
window.location.href = "/login/ding/oauth2/" + getQueryString("service") + search;
},
onFail: function (err) {
window.location.href = "./error.html?message=" + JSON.stringify(err);

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</parent>
<artifactId>springboot-message</artifactId>

View File

@@ -15,7 +15,12 @@ import org.springframework.context.annotation.Configuration;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.TimeZone;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
* @author admin
@@ -49,6 +54,50 @@ public class AliyunSmsSender implements TieshengMessageSender {
}
/**
* 发送请求
*
* @param action 业务类型
* @param map 业务参数
* @return 返回数据
*/
public String request(String action, ConcurrentHashMap<String, String> map) {
ConcurrentHashMap<String, String> queryMap = new ConcurrentHashMap<>();
// 系统参数
queryMap.put("AccessKeyId", getAccessKeyId());
queryMap.put("SignatureMethod", "HMAC-SHA1");
queryMap.put("SignatureNonce", IdUtil.randomUUID());
queryMap.put("SignatureVersion", "1.0");
SimpleDateFormat dateFormat = DateUtil.newSimpleFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.CHINESE, TimeZone.getTimeZone("0"));
queryMap.put("Timestamp", DateUtil.format(DateUtil.date(), dateFormat));
queryMap.put("Format", "json");
queryMap.put("Action", action);
queryMap.put("Version", "2017-05-25");
queryMap.put("RegionId", "cn-hangzhou");
if (map != null) {
queryMap.putAll(map);
}
// 构造带签名字符串
StringBuilder sortQueryStringTmp = new StringBuilder();
List<String> list = queryMap.keySet().stream().sorted().collect(Collectors.toList());
for (String key : list) {
sortQueryStringTmp.append("&").append(specialUrlEncode(key)).append("=").append(specialUrlEncode(queryMap.get(key)));
}
String sortedQueryString = sortQueryStringTmp.substring(1);
String stringToSign = "GET" + "&" + specialUrlEncode("/") + "&" + specialUrlEncode(sortedQueryString);
String digest = SecureUtil.hmacSha1((getAccessKeySecret() + "&").getBytes(StandardCharsets.UTF_8))
.digestBase64(stringToSign, false);
String signature = specialUrlEncode(digest);
queryMap.put("Signature", signature);
return HttpUtil.get(ENDPOINT + "?Signature=" + signature + sortQueryStringTmp, 10 * 1000);
}
/**
* 创建发送请求
*
@@ -69,21 +118,8 @@ public class AliyunSmsSender implements TieshengMessageSender {
.putOpt("TemplateParam", params)
.toString());
SortedMap<String, String> queryMap = new TreeMap<>();
// 系统参数
queryMap.put("AccessKeyId", getAccessKeyId());
queryMap.put("SignatureMethod", "HMAC-SHA1");
queryMap.put("SignatureNonce", IdUtil.randomUUID());
queryMap.put("SignatureVersion", "1.0");
SimpleDateFormat dateFormat = DateUtil.newSimpleFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.CHINESE, TimeZone.getTimeZone("0"));
queryMap.put("Timestamp", DateUtil.format(DateUtil.date(), dateFormat));
queryMap.put("Format", "json");
// 业务API参数
queryMap.put("Action", "SendSms");
queryMap.put("Version", "2017-05-25");
queryMap.put("RegionId", "cn-hangzhou");
ConcurrentHashMap<String, String> queryMap = new ConcurrentHashMap<>();
queryMap.put("PhoneNumbers", phoneNumbers);
queryMap.put("SignName", getSignName());
queryMap.put("TemplateCode", templateCode);
@@ -91,22 +127,8 @@ public class AliyunSmsSender implements TieshengMessageSender {
queryMap.put("TemplateParam", params.toString());
}
// 构造带签名字符串
StringBuilder sortQueryStringTmp = new StringBuilder();
for (String key : queryMap.keySet()) {
sortQueryStringTmp.append("&").append(specialUrlEncode(key)).append("=").append(specialUrlEncode(queryMap.get(key)));
}
String sortedQueryString = sortQueryStringTmp.substring(1);
String stringToSign = "GET" + "&" + specialUrlEncode("/") + "&" + specialUrlEncode(sortedQueryString);
String digest = SecureUtil.hmacSha1((getAccessKeySecret() + "&").getBytes(StandardCharsets.UTF_8))
.digestBase64(stringToSign, false);
String signature = specialUrlEncode(digest);
queryMap.put("Signature", signature);
// 发送请求
String response = HttpUtil.get(ENDPOINT + "?Signature=" + signature + sortQueryStringTmp, 10 * 1000);
reqResp.setRespBody(response);
JSONObject respObj = JSONUtil.parseObj(response);
reqResp.setRespBody(request("SendSms", queryMap));
JSONObject respObj = JSONUtil.parseObj(reqResp.getRespBody());
if (!Objects.equals(respObj.getStr("Code"), "OK")) {
reqResp.setResult(0);
reqResp.setToast(respObj.getStr("Message"));
@@ -116,8 +138,8 @@ public class AliyunSmsSender implements TieshengMessageSender {
}
@Override
public MessageReqResp send(String user, String title, Object body) {
return sendSms(user, title, (JSONObject) body);
public MessageReqResp send(String user, JSONObject body) {
return sendSms(user, body.getStr("template_code"), body);
}
@Override

View File

@@ -24,7 +24,6 @@ public class MessageReqResp {
*/
private Integer result;
/**
* 提示的异常信息
*/

View File

@@ -0,0 +1,32 @@
package com.tiesheng.message.pojos;
public class UserChannel {
private String user;
private String channel;
public UserChannel(String user, String channel) {
this.user = user;
this.channel = channel;
}
///////////////////////////////////////////////////////////////////////////
// setter\getter
///////////////////////////////////////////////////////////////////////////
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
}

View File

@@ -1,6 +1,7 @@
package com.tiesheng.message.service;
import cn.hutool.json.JSONObject;
import com.tiesheng.message.pojos.MessageReqResp;
/**
@@ -19,7 +20,7 @@ public interface TieshengMessageSender {
* @param channel 消息通道,如果为空表示所有通道
* @return 返回的内容,如果为空表示发送成功
*/
MessageReqResp send(String user, String title, Object body);
MessageReqResp send(String user, JSONObject body);
/**

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</parent>
<artifactId>springboot-platform</artifactId>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</parent>
<artifactId>springboot-poi</artifactId>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</parent>
<artifactId>springboot-util</artifactId>

View File

@@ -20,7 +20,9 @@ public class CommonUtil {
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteEnumUsingName);
SerializerFeature.WriteEnumUsingName,
SerializerFeature.DisableCircularReferenceDetect
);
config.setDateFormat("yyyy-MM-dd HH:mm:ss");
config.setSerializeFilters(new DesensitizeValueFilter());
return config;

View File

@@ -30,6 +30,7 @@ public class EncryptConfig {
*/
private String key = "WmdUzPJXbngVNiaSsQrihg==";
private Integer saltSize = 8;
private boolean body = false;
public EncryptConfig() {
sm4 = SmUtil.sm4(Base64.decode(getKey()));
@@ -133,4 +134,12 @@ public class EncryptConfig {
public void setSaltSize(Integer saltSize) {
this.saltSize = saltSize;
}
public boolean isBody() {
return body;
}
public void setBody(boolean body) {
this.body = body;
}
}

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>1.0.0</version>
<version>1.0.12</version>
</parent>
<artifactId>springboot-web</artifactId>

View File

@@ -2,6 +2,7 @@ package com.tiesheng.core;
import com.tiesheng.core.service.TieshengWebConfigurer;
import com.tiesheng.database.DatabaseAutoConfigurer;
import com.tiesheng.encrypt.EncryptAutoConfigurer;
import com.tiesheng.login.LoginAutoConfigurer;
import com.tiesheng.message.MessageAutoConfigurer;
import com.tiesheng.util.UtilAutoConfigurer;
@@ -20,7 +21,8 @@ import java.lang.annotation.*;
MessageAutoConfigurer.class,
CoreAutoConfigurer.class,
LoginAutoConfigurer.class,
DatabaseAutoConfigurer.class
DatabaseAutoConfigurer.class,
EncryptAutoConfigurer.class
})
public @interface EnableTieshengWeb {

View File

@@ -2,7 +2,9 @@ package com.tiesheng.core.config.operation;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.tiesheng.annotation.operation.OperationIgnore;
import com.tiesheng.annotation.operation.OperationLog;
import com.tiesheng.core.service.CoreLogService;
import com.tiesheng.util.ServletKit;
@@ -16,8 +18,8 @@ import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
@@ -57,11 +59,16 @@ public class OperationAspect {
return joinPoint.proceed(joinPoint.getArgs());
}
String title = "", subject = "";
String insertKey = "";
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
// 当存在忽略注解时,不添加操作日志
if (method.getAnnotation(OperationIgnore.class) != null) {
return joinPoint.proceed(joinPoint.getArgs());
}
String title = "", subject = "";
String insertKey = "";
OperationLog operationLog = method.getAnnotation(OperationLog.class);
if (operationLog != null) {
title = operationLog.title();
@@ -69,15 +76,15 @@ public class OperationAspect {
insertKey = operationLog.insertKey();
}
Object reqObj = null;
Map<String, Object> allParams = new HashMap<>(16);
Map<String, Object> reqMaps = null;
ConcurrentHashMap<String, Object> allParams = new ConcurrentHashMap<>(16);
if (joinPoint.getArgs().length > 0) {
reqObj = joinPoint.getArgs()[0];
allParams.putAll(BeanUtil.beanToMap(reqObj));
reqMaps = BeanUtil.beanToMap(joinPoint.getArgs()[0], false, true);
allParams.putAll(reqMaps);
}
Object response = joinPoint.proceed(joinPoint.getArgs());
allParams.putAll(BeanUtil.beanToMap(response));
allParams.putAll(BeanUtil.beanToMap(response, false, true));
if (!StrUtil.isEmpty(subject)) {
// 添加、编辑关键字处理
@@ -93,7 +100,15 @@ public class OperationAspect {
subject = ServletKit.getRequest().getRequestURI();
}
coreLogService.addOperationLog(title, subject, reqObj);
// 指定字段脱敏
if (reqMaps != null && operationLog != null
&& ArrayUtil.isNotEmpty(operationLog.desensitize())) {
for (String key : operationLog.desensitize()) {
reqMaps.put(key, "******");
}
}
coreLogService.addOperationLog(title, subject, reqMaps);
return response;
}

View File

@@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
/**
@@ -84,12 +85,13 @@ public class CoreLogService extends TsServiceBase<CoreLogOperationMapper, CoreLo
coreLogProcessMapper.insert(coreLogProcess);
ThreadUtil.execute(() -> {
List<Exception> errorList = new ArrayList<>();
CollUtil.split(list, 100).forEach((it) -> {
int accept = 0;
try {
accept = consumer.accept(it);
} catch (Exception e) {
coreLogProcess.setError(coreLogProcess.getError() + ";" + JSONUtil.toJsonStr(e));
errorList.add(e);
}
coreLogProcess.setProcess(coreLogProcess.getProcess() + it.size());
coreLogProcess.setSuccessNum(coreLogProcess.getSuccessNum() + accept);
@@ -100,6 +102,7 @@ public class CoreLogService extends TsServiceBase<CoreLogOperationMapper, CoreLo
// 执行结束
coreLogProcess.setFailFile(consumer.getFailFile());
coreLogProcess.setStatus(1);
coreLogProcess.setError(JSONUtil.toJsonStr(errorList));
coreLogProcessMapper.updateById(coreLogProcess);
});
@@ -130,6 +133,7 @@ public class CoreLogService extends TsServiceBase<CoreLogOperationMapper, CoreLo
ThreadUtil.execute(() -> {
int pageSize = 1000;
int pageNum = 1, lastCount = pageSize;
List<Exception> errorList = new ArrayList<>();
while (lastCount == pageSize) {
try {
lastCount = consumer.accept(pageNum, pageSize);
@@ -137,13 +141,14 @@ public class CoreLogService extends TsServiceBase<CoreLogOperationMapper, CoreLo
coreLogProcess.setProcess(coreLogProcess.getTotal());
coreLogProcess.setSuccessNum(coreLogProcess.getSuccessNum() + lastCount);
} catch (Exception e) {
coreLogProcess.setError(coreLogProcess.getError() + ";" + JSONUtil.toJsonStr(e));
errorList.add(e);
}
coreLogProcessMapper.updateById(coreLogProcess);
pageNum++;
}
// 执行结束
coreLogProcess.setError(JSONUtil.toJsonStr(errorList));
coreLogProcess.setStatus(1);
coreLogProcessMapper.updateById(coreLogProcess);
});

View File

@@ -4,9 +4,11 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.tiesheng.core.mapper.CoreLogMessageMapper;
import com.tiesheng.core.pojos.dao.CoreLogMessage;
import com.tiesheng.message.pojos.MessageReqResp;
import com.tiesheng.message.pojos.UserChannel;
import com.tiesheng.message.service.TieshengMessageSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -29,42 +31,42 @@ public class CoreMessageService {
/**
* 发送消息
*
* @param user
* @param title
* @param body
* @param channels 消息通道如果为all时表示发送全部通道
*/
public void multiple(String user, String title, Object body, String... channels) {
if (StrUtil.isEmpty(user) || ArrayUtil.isEmpty(channels)) {
public void multiple(List<UserChannel> channels, JSONObject body) {
if (ArrayUtil.isEmpty(channels)) {
return;
}
messageSenderList.forEach(sender -> {
boolean isChannel = ArrayUtil.contains(channels, sender.getChannel()) || ArrayUtil.contains(channels, "all");
if (sender.support() && isChannel) {
MessageReqResp reqResp = sender.send(user, title, body);
coreLogMessageMapper.insert(BeanUtil.copyProperties(reqResp, CoreLogMessage.class));
}
});
messageSenderList.stream().filter(TieshengMessageSender::support)
.forEach(sender -> {
channels.stream().filter(it -> Objects.equals(it.getChannel(), sender.getChannel())).forEach(it -> {
MessageReqResp reqResp = sender.send(it.getUser(), body);
coreLogMessageMapper.insert(BeanUtil.copyProperties(reqResp, CoreLogMessage.class));
});
});
}
/**
* 发送消息
*
* @param user
* @param userChannel
* @param title
* @param body
*/
public MessageReqResp send(String user, String title, Object body, String channel) {
if (StrUtil.isEmpty(user) || StrUtil.isEmpty(channel)) {
public MessageReqResp send(UserChannel userChannel, JSONObject body) {
if (StrUtil.isEmpty(userChannel.getUser()) || StrUtil.isEmpty(userChannel.getChannel())) {
return null;
}
TieshengMessageSender messageSender = CollUtil.findOne(messageSenderList,
sender -> Objects.equals(sender.getChannel(), channel) && sender.support());
sender -> Objects.equals(sender.getChannel(), userChannel.getChannel()) && sender.support());
if (messageSender != null) {
MessageReqResp reqResp = messageSender.send(user, title, body);
MessageReqResp reqResp = messageSender.send(userChannel.getUser(), body);
coreLogMessageMapper.insert(BeanUtil.copyProperties(reqResp, CoreLogMessage.class));
return reqResp;
}

Some files were not shown because too many files have changed in this diff Show More