Compare commits
133 Commits
0.9.6
...
1.0.24-tes
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a7024f7a8d | ||
|
|
c2fe494ed9 | ||
|
|
07de3f6ba7 | ||
|
|
1c521e5378 | ||
|
|
e98e98d659 | ||
|
|
75d052bd0c | ||
|
|
3758826987 | ||
|
|
8a4cf8e439 | ||
|
|
09203ac78d | ||
|
|
ef5861327c | ||
|
|
23faaa8f67 | ||
|
|
341c82e0bc | ||
|
|
d2d53523a8 | ||
|
|
fc00bad49a | ||
|
|
6dd4e19e39 | ||
|
|
4373ec7c0e | ||
|
|
5cc135d8e2 | ||
|
|
69a9681b48 | ||
|
|
6c39dc24bd | ||
|
|
952341918a | ||
|
|
5dde3e3e9f | ||
|
|
c5c7afd7f6 | ||
|
|
ceb13dc78d | ||
|
|
0fabc7aae9 | ||
|
|
28a2fa0262 | ||
|
|
cc3ab52885 | ||
|
|
027587ae02 | ||
|
|
353851a0aa | ||
|
|
1db6d88e4e | ||
|
|
7e69138ef7 | ||
|
|
ea211b1bfc | ||
|
|
101270e881 | ||
|
|
a658298363 | ||
|
|
65beecc330 | ||
|
|
ea24bf3479 | ||
|
|
90e504e7fd | ||
|
|
5db42f5bc8 | ||
|
|
37d84e2f36 | ||
|
|
f59d56be9e | ||
|
|
7f4871fe19 | ||
|
|
34e3cb2f09 | ||
|
|
7c1abb9b97 | ||
|
|
a649bdae7c | ||
|
|
7b6eccb0d5 | ||
|
|
c700ddc90a | ||
|
|
4254bf47bf | ||
|
|
e0b1720c4a | ||
|
|
9cd7b069a8 | ||
|
|
0ca3d13659 | ||
|
|
0ac237fbbd | ||
|
|
d9da55d4bf | ||
|
|
802152badd | ||
|
|
7b4169f3e6 | ||
|
|
c3b3831378 | ||
|
|
73e6470b39 | ||
|
|
458d118d85 | ||
|
|
659deb6132 | ||
|
|
f8c121ba6f | ||
|
|
0307d3f544 | ||
|
|
6f0bfb1a7d | ||
|
|
f7e85daed2 | ||
|
|
206a6dc1ff | ||
|
|
e29e9552ac | ||
|
|
c418a0b952 | ||
|
|
c5269464df | ||
|
|
d327b7284a | ||
|
|
b0eac9b177 | ||
|
|
815e172e02 | ||
|
|
66ac435278 | ||
|
|
84f2062c7e | ||
|
|
9df344a119 | ||
|
|
a50df93439 | ||
|
|
fbc49f0248 | ||
|
|
9420c39c75 | ||
|
|
2bd7578f2b | ||
|
|
78502781a9 | ||
|
|
c3127565dd | ||
|
|
de574b5472 | ||
|
|
016d67024f | ||
|
|
73fcbcb540 | ||
|
|
1527f3dc9d | ||
|
|
d436589c83 | ||
|
|
3098267045 | ||
|
|
0f187d2a6f | ||
|
|
010e8ee104 | ||
|
|
a9f33a9ed5 | ||
|
|
ea9870696a | ||
|
|
33649ed3f9 | ||
|
|
3de3ac4cff | ||
|
|
7139b08c9e | ||
|
|
f2ca53f46e | ||
|
|
b5083beda9 | ||
|
|
0452e5ce05 | ||
|
|
959ed53960 | ||
|
|
d01b7f1820 | ||
|
|
141cebf2ff | ||
|
|
84d859dd54 | ||
|
|
d2e80af568 | ||
|
|
be30a3f9d3 | ||
|
|
608d124f51 | ||
|
|
377b242e6d | ||
|
|
28f8e11c5f | ||
|
|
730230fa4e | ||
|
|
0b98d0abb4 | ||
|
|
0cb1581176 | ||
|
|
5ed663e112 | ||
|
|
b5fd837ccf | ||
|
|
38d6bae04f | ||
|
|
e49bf32117 | ||
|
|
bc3ea0e10c | ||
|
|
305dc743b2 | ||
|
|
6f0360bad5 | ||
|
|
5012c4bd53 | ||
|
|
dd69b3bb1f | ||
|
|
33d20c518e | ||
|
|
d0935cbda0 | ||
|
|
3ed9a47c66 | ||
|
|
3f6989d039 | ||
|
|
6f6e997fd3 | ||
|
|
d9987b41ea | ||
|
|
c33ad6075e | ||
|
|
a32c333a6c | ||
|
|
ed66f035e5 | ||
|
|
f5dd706e6e | ||
|
|
6766694272 | ||
|
|
2f22b64c0e | ||
|
|
4e6b108e7e | ||
|
|
24629f06b4 | ||
|
|
47c9251389 | ||
|
|
dda5f64910 | ||
|
|
704030729a | ||
|
|
c708809a19 | ||
|
|
2bbec9b79a |
@@ -1,16 +1,15 @@
|
||||
stages:
|
||||
- deploy
|
||||
- package
|
||||
|
||||
deploy-jar:
|
||||
stage: deploy
|
||||
tags:
|
||||
- hzkepai
|
||||
- zengos
|
||||
rules:
|
||||
- if: $CI_COMMIT_TAG
|
||||
script:
|
||||
- mvn clean deploy -Dmaven.test.skip -DaltDeploymentRepository=master::default::file:/usr/local/nginx/html/kepai-repo
|
||||
- cd /usr/local/nginx/html/kepai-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 .
|
||||
|
||||
57
CHANGELOG.md
@@ -1,3 +1,60 @@
|
||||
## 1.1.0
|
||||
|
||||
- feat:globalConfig增加ext属性。
|
||||
- feat:增加网络请求超时、重定向的配置。
|
||||
- perf:更新数据库对比插件。
|
||||
- feat(web):增加DaoBase的常量。
|
||||
- perf(web):操作日志优化。
|
||||
|
||||
|
||||
## 1.0.12
|
||||
|
||||
- perf(encrypt):开启关闭加解密移动到**yaml**中配置,移除**EnableEncryptConfig**注解。
|
||||
- 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
|
||||
|
||||
- perf:hutool依赖升级:5.8.11 -> 5.8.16
|
||||
- perf:fastjson依赖升级:1.2.78 -> 1.2.83
|
||||
- perf:mybatis-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,增加版本对比器,防止某些情况下版本对比失效;
|
||||
|
||||
26
pom.xml
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-parent</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</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>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-login</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-web</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-util</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-platform</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-message</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-encrypt</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-annotation</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-poi</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -117,7 +117,7 @@
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||
<version>3.5.1</version>
|
||||
<version>3.5.3</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
@@ -126,7 +126,7 @@
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>kepai-repo-plugin</id>
|
||||
<url>http://git.kepai365.com/zeng_wenhao/kepai-repo/raw/master</url>
|
||||
<url>http://git.kepai365.com/tiesheng/repository/raw/master</url>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
<plugin>
|
||||
<groupId>com.tiesheng.springboot-plugin</groupId>
|
||||
<artifactId>tiesheng-maven-plugin</artifactId>
|
||||
<version>0.0.5</version>
|
||||
<version>1.0.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
|
||||
BIN
springboot-ademo/.DS_Store
vendored
Normal file
@@ -6,11 +6,11 @@
|
||||
<parent>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-parent</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>springboot-ademo</artifactId>
|
||||
<version>1.0.0</version>
|
||||
<version>1.0.24-test</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
@@ -25,12 +25,18 @@
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>easyexcel</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>kepai-repo</id>
|
||||
<url>http://git.kepai365.com/zeng_wenhao/kepai-repo/raw/master</url>
|
||||
<url>http://git.kepai365.com/tiesheng/repository/raw/master</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -27,30 +27,25 @@ public class DemoWebConfigurer implements TieshengWebConfigurer {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LoginConfigurer loginConfigurer() {
|
||||
return new LoginConfigurer() {
|
||||
@Override
|
||||
public TokenBean doLogin(CorePlatformUnique platformUnique, String to) {
|
||||
public TokenBean login(CorePlatformUnique platformUnique) {
|
||||
TokenBean tokenBean = null;
|
||||
if (!StrUtil.isEmpty(platformUnique.getUserId())) {
|
||||
tokenBean = new TokenBean(platformUnique.getUserId(), "", globalConfig.getService());
|
||||
}
|
||||
|
||||
// 默认跳转到mobile
|
||||
to = StrUtil.emptyToDefault(to, "mobile");
|
||||
|
||||
TokenBean tokenBean = null;
|
||||
if (!StrUtil.isEmpty(platformUnique.getUserId())) {
|
||||
tokenBean = new TokenBean(platformUnique.getUserId(), to, globalConfig.getService());
|
||||
} else {
|
||||
// 获取用户信息判断是否可登录
|
||||
}
|
||||
|
||||
return tokenBean;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void redirect(TokenBean bean, String to, String extra, HttpServletResponse response) {
|
||||
if (Objects.equals(bean.getEnvironmentType(), "mobile")) {
|
||||
globalConfig.redirect("mobile", "/?token=" + bean.toToken(), response);
|
||||
}
|
||||
}
|
||||
};
|
||||
return tokenBean;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void redirect(TokenBean bean, String to, String extra, HttpServletResponse response) {
|
||||
|
||||
// 默认跳转到mobile
|
||||
to = StrUtil.emptyToDefault(to, "mobile");
|
||||
bean.setEnvironmentType(to);
|
||||
|
||||
if (Objects.equals(bean.getEnvironmentType(), "mobile")) {
|
||||
globalConfig.redirect("mobile", "/?token=" + bean.toToken(), response);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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/");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,24 +1,36 @@
|
||||
package com.tiesheng.demo.controller;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.date.TimeInterval;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import cn.hutool.log.LogFactory;
|
||||
import cn.hutool.poi.excel.ExcelUtil;
|
||||
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;
|
||||
|
||||
/**
|
||||
@@ -38,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);
|
||||
}
|
||||
@@ -121,4 +153,43 @@ public class TestController {
|
||||
return ApiResp.respOK("");
|
||||
}
|
||||
|
||||
|
||||
@RequestMapping("poi")
|
||||
@TokenIgnore
|
||||
public ApiResp<String> poi() {
|
||||
TimeInterval timeInterval = new TimeInterval();
|
||||
|
||||
FileUploadPath file = FileUploadPath.file("/upload/test.xlsx");
|
||||
|
||||
EasyExcel.read(new File(file.getAbsolutePath()), PoiBean.class, new ReadListener<PoiBean>() {
|
||||
|
||||
@Override
|
||||
public void invoke(PoiBean poiBean, AnalysisContext analysisContext) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
|
||||
|
||||
}
|
||||
}).sheet().doRead();
|
||||
|
||||
System.out.println("timeInterval: " + timeInterval.interval());
|
||||
return ApiResp.respOK("");
|
||||
}
|
||||
|
||||
@RequestMapping("poiTool")
|
||||
@TokenIgnore
|
||||
public ApiResp<String> poiTool() {
|
||||
TimeInterval timeInterval = new TimeInterval();
|
||||
|
||||
FileUploadPath file = FileUploadPath.file("/upload/test.xlsx");
|
||||
|
||||
ExcelUtil.getReader(new File(file.getAbsolutePath())).read();
|
||||
|
||||
System.out.println("timeInterval: " + timeInterval.interval());
|
||||
|
||||
return ApiResp.respOK("");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
package com.tiesheng.demo.pojos;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
|
||||
public class PoiBean {
|
||||
|
||||
@ExcelProperty("学院")
|
||||
private String college;
|
||||
private String type;
|
||||
private String name;
|
||||
private String no;
|
||||
private String sex;
|
||||
private String fdy;
|
||||
private String fdyNo;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// setter\getter
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
public String getCollege() {
|
||||
return college;
|
||||
}
|
||||
|
||||
public void setCollege(String college) {
|
||||
this.college = college;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getNo() {
|
||||
return no;
|
||||
}
|
||||
|
||||
public void setNo(String no) {
|
||||
this.no = no;
|
||||
}
|
||||
|
||||
public String getSex() {
|
||||
return sex;
|
||||
}
|
||||
|
||||
public void setSex(String sex) {
|
||||
this.sex = sex;
|
||||
}
|
||||
|
||||
public String getFdy() {
|
||||
return fdy;
|
||||
}
|
||||
|
||||
public void setFdy(String fdy) {
|
||||
this.fdy = fdy;
|
||||
}
|
||||
|
||||
public String getFdyNo() {
|
||||
return fdyNo;
|
||||
}
|
||||
|
||||
public void setFdyNo(String fdyNo) {
|
||||
this.fdyNo = fdyNo;
|
||||
}
|
||||
}
|
||||
@@ -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}
|
||||
@@ -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}
|
||||
@@ -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%}
|
||||
@@ -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}
|
||||
@@ -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}
|
||||
@@ -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}
|
||||
@@ -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}
|
||||
@@ -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}
|
||||
@@ -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%}
|
||||
@@ -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}
|
||||
@@ -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%}
|
||||
@@ -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}
|
||||
@@ -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}
|
||||
@@ -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}
|
||||
BIN
springboot-ademo/src/main/resources/mobile/0.0.13/favicon.ico
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 8.4 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 5.0 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
138
springboot-ademo/src/main/resources/mobile/0.0.13/index.html
Normal 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>
|
||||
@@ -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}}]);
|
||||
@@ -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}}]);
|
||||
@@ -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}}]);
|
||||
@@ -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}}]);
|
||||
@@ -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}}]);
|
||||
@@ -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\"> </div>\n" +
|
||||
" </div>";
|
||||
var root = document.getElementById("app");
|
||||
root.innerHTML = loading;
|
||||
|
||||
reloadTips();
|
||||
}
|
||||
|
||||
showLoading();
|
||||
17
springboot-ademo/src/main/resources/mobile/0.0.4/index.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<!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>
|
||||
@@ -1,37 +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"
|
||||
/>
|
||||
<title>钉钉授权</title>
|
||||
</head>
|
||||
<body>
|
||||
<script src="dingtalk.open.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
function getQueryString(name) {
|
||||
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
|
||||
var r = window.location.search.substr(1).match(reg);
|
||||
if (r != null) return decodeURI(r[2]);
|
||||
return null;
|
||||
}
|
||||
|
||||
dd.runtime.permission.requestAuthCode({
|
||||
corpId: getQueryString("corpId"),
|
||||
onSuccess: function (result) {
|
||||
let search = window.location.search + "&code=" + result.code;
|
||||
window.location.href = "/auth/ding/oauth2/" + getQueryString("service") + search;
|
||||
},
|
||||
onFail: function (err) {
|
||||
window.location.href = "./error.html?message=" + JSON.stringify(err);
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,37 +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"
|
||||
/>
|
||||
<title>钉钉授权</title>
|
||||
</head>
|
||||
<body>
|
||||
<script src="dingtalk.open.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
function getQueryString(name) {
|
||||
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
|
||||
var r = window.location.search.substr(1).match(reg);
|
||||
if (r != null) return decodeURI(r[2]);
|
||||
return null;
|
||||
}
|
||||
|
||||
dd.runtime.permission.requestAuthCode({
|
||||
corpId: getQueryString("corpId"),
|
||||
onSuccess: function (result) {
|
||||
let search = window.location.search + "&code=" + result.code;
|
||||
window.location.href = "/auth/ding/oauth2/" + getQueryString("service") + search;
|
||||
},
|
||||
onFail: function (err) {
|
||||
window.location.href = "./error.html?message=" + JSON.stringify(err);
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-parent</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>springboot-annotation</artifactId>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
@@ -21,4 +21,12 @@ public @interface OperationLog {
|
||||
*/
|
||||
String insertKey() default "";
|
||||
|
||||
|
||||
/**
|
||||
* 需要脱敏的字段
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
String[] desensitize() default {};
|
||||
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-parent</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>springboot-database</artifactId>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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")));
|
||||
|
||||
@@ -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() {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-parent</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>springboot-encrypt</artifactId>
|
||||
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package com.tiesheng.encrypt;
|
||||
|
||||
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
|
||||
@ComponentScan({
|
||||
"com.tiesheng.encrypt.**.*",
|
||||
})
|
||||
public class EncryptAutoConfigurer {
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import cn.hutool.core.io.IoUtil;
|
||||
import cn.hutool.core.util.CharsetUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import cn.hutool.log.LogFactory;
|
||||
import com.tiesheng.util.config.EncryptConfig;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.MethodParameter;
|
||||
@@ -66,6 +67,7 @@ public class DecryptRequestBodyAdvice implements RequestBodyAdvice {
|
||||
DecryptHttpInputMessage(HttpInputMessage inputMessage, EncryptConfig encryptConfig) throws Exception {
|
||||
this.headers = inputMessage.getHeaders();
|
||||
String bodyStr = IoUtil.read(inputMessage.getBody(), CharsetUtil.CHARSET_UTF_8);
|
||||
LogFactory.get().info("DecryptRequestBodyAdvice: " + bodyStr);
|
||||
String encryptData = JSONUtil.parseObj(bodyStr).getStr("encryptData");
|
||||
if (!StrUtil.isEmpty(encryptData)) {
|
||||
String decrypt = encryptConfig.decrypt(encryptData);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-parent</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>springboot-login</artifactId>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
@@ -14,6 +16,7 @@ import com.tiesheng.login.service.TieshengLoginConfigurer;
|
||||
import com.tiesheng.platform.config.ding.PlatformDingConfig;
|
||||
import com.tiesheng.platform.config.ding.bean.DingJsapiSignature;
|
||||
import com.tiesheng.platform.config.ding.bean.DingUserInfo;
|
||||
import com.tiesheng.platform.config.ding.bean.DingUserSimple;
|
||||
import com.tiesheng.platform.config.wxmini.PlatformWxminiConfig;
|
||||
import com.tiesheng.platform.config.wxmp.PlatformWxmpConfig;
|
||||
import com.tiesheng.platform.config.wxmp.bean.WxConfigBean;
|
||||
@@ -49,6 +52,8 @@ public class LoginController {
|
||||
TieshengLoginConfigurer tieshengLoginConfigurer;
|
||||
@Autowired
|
||||
GlobalConfig globalConfig;
|
||||
@Autowired
|
||||
TsTokenConfig tsTokenConfig;
|
||||
|
||||
|
||||
/**
|
||||
@@ -57,9 +62,15 @@ public class LoginController {
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/unique/redirect")
|
||||
@OperationIgnore
|
||||
public void uniqueIndex(UniqueIndexDTO dto, HttpServletResponse response) {
|
||||
TokenBean tokenBean = tieshengLoginConfigurer.doLogin(new DoLoginInfo("unique_index_web",
|
||||
dto.getNo(), "web", dto.getTo(), dto.getInfo()));
|
||||
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,10 +82,11 @@ public class LoginController {
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/unique/index")
|
||||
@OperationIgnore
|
||||
public ApiResp<String> uniqueIndex(@RequestBody UniqueIndexDTO dto) {
|
||||
TokenBean tokenBean = tieshengLoginConfigurer.doLogin(new DoLoginInfo("unique_index_web",
|
||||
dto.getNo(), "web", dto.getTo(), dto.getInfo()));
|
||||
if (tokenBean == null) {
|
||||
TokenBean tokenBean = tieshengLoginConfigurer.doLogin(new DoLoginInfo("web_unique_index",
|
||||
dto.getNo(), dto.getPlatform(), dto.getInfo()));
|
||||
if (tokenBean == null || StrUtil.isEmpty(tokenBean.getId())) {
|
||||
throw new ApiException("登录失败");
|
||||
}
|
||||
return ApiResp.respOK(tokenBean.toToken());
|
||||
@@ -93,6 +105,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 = "";
|
||||
@@ -101,6 +114,7 @@ public class LoginController {
|
||||
map.put("corpId", platformDingConfig.getConfigBean(service).getCorpId());
|
||||
map.put("service", service);
|
||||
map.put("extra", extra);
|
||||
map.put("context", globalConfig.getContextPath());
|
||||
String query = URLUtil.buildQuery(map, Charset.defaultCharset());
|
||||
String configUrl = globalConfig.buildPath("/ding/index.html?" + query);
|
||||
try {
|
||||
@@ -116,12 +130,12 @@ 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);
|
||||
DingUserSimple userSimple = platformDingConfig.getUserIdByCode(service, dto.getCode());
|
||||
DingUserInfo dingUserInfo = platformDingConfig.topapiV2UserGet(service, userSimple.getUserid());
|
||||
TokenBean tokenBean = tieshengLoginConfigurer.doLogin(new DoLoginInfo(dingUserInfo.getAppId(),
|
||||
dingUserInfo.getUserid(), "ding", dto.getTo(),
|
||||
JSON.toJSONString(dingUserInfo)));
|
||||
dingUserInfo.getUserid(), "ding", JSON.toJSONString(dingUserInfo)));
|
||||
tieshengLoginConfigurer.onLoginRedirect(tokenBean, dto.getTo(), dto.getExtra(), response);
|
||||
}
|
||||
|
||||
@@ -150,11 +164,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);
|
||||
}
|
||||
@@ -164,10 +179,11 @@ 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(),
|
||||
wxUserInfo.getOpenid(), "wxmp", dto.getTo(), JSON.toJSONString(wxUserInfo)));
|
||||
wxUserInfo.getOpenid(), "wxmp", JSON.toJSONString(wxUserInfo)));
|
||||
tieshengLoginConfigurer.onLoginRedirect(tokenBean, dto.getTo(), dto.getExtra(), response);
|
||||
}
|
||||
|
||||
@@ -194,11 +210,12 @@ 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);
|
||||
TokenBean tokenBean = tieshengLoginConfigurer.doLogin(new DoLoginInfo(configBean.getAppId(),
|
||||
openid, "wxmini", "mini", "{}"));
|
||||
openid, "wxmini", "{}"));
|
||||
|
||||
WxminiLoginVo loginVo = new WxminiLoginVo();
|
||||
loginVo.setOpenid(openid);
|
||||
|
||||
@@ -5,15 +5,13 @@ public class DoLoginInfo {
|
||||
private String appId;
|
||||
private String unique;
|
||||
private String platform;
|
||||
private String to;
|
||||
private String info;
|
||||
private String extra;
|
||||
|
||||
public DoLoginInfo(String appId, String unique, String platform, String to, String info) {
|
||||
public DoLoginInfo(String appId, String unique, String platform, String info) {
|
||||
this.appId = appId;
|
||||
this.unique = unique;
|
||||
this.platform = platform;
|
||||
this.to = to;
|
||||
this.info = info;
|
||||
}
|
||||
|
||||
@@ -45,14 +43,6 @@ public class DoLoginInfo {
|
||||
this.platform = platform;
|
||||
}
|
||||
|
||||
public String getTo() {
|
||||
return to;
|
||||
}
|
||||
|
||||
public void setTo(String to) {
|
||||
this.to = to;
|
||||
}
|
||||
|
||||
public String getInfo() {
|
||||
return info;
|
||||
}
|
||||
|
||||
@@ -1,12 +1,37 @@
|
||||
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 {
|
||||
|
||||
private String no;
|
||||
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
|
||||
@@ -38,4 +63,28 @@ public class UniqueIndexDTO extends LoginToInfo {
|
||||
public void setInfo(String info) {
|
||||
this.info = info;
|
||||
}
|
||||
|
||||
public String getPlatform() {
|
||||
return platform;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
@@ -23,9 +24,14 @@ public interface TieshengLoginConfigurer {
|
||||
/**
|
||||
* 授权登录回调
|
||||
*
|
||||
* @param tokenBean
|
||||
* @param bean
|
||||
*/
|
||||
void onLoginRedirect(TokenBean bean, String to, String extra, HttpServletResponse response);
|
||||
|
||||
|
||||
/**
|
||||
* 签名错误的时候
|
||||
*/
|
||||
void onSignError(HttpServletResponse response);
|
||||
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,10 +24,10 @@
|
||||
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.replace(getQueryString("context") + "/login/ding/oauth2/" + getQueryString("service") + search);
|
||||
},
|
||||
onFail: function (err) {
|
||||
window.location.href = "./error.html?message=" + JSON.stringify(err);
|
||||
window.location.replace("./error.html?message=" + JSON.stringify(err));
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-parent</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>springboot-message</artifactId>
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package com.tiesheng.message.config.aliyun;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.lang.Validator;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.ReUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.crypto.SecureUtil;
|
||||
import cn.hutool.extra.validation.ValidationUtil;
|
||||
import cn.hutool.http.HttpUtil;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
@@ -15,7 +18,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 +57,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 +121,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 +130,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 +141,16 @@ 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) {
|
||||
boolean mobile = Validator.isMobile(user);
|
||||
if (!mobile) {
|
||||
return null;
|
||||
}
|
||||
String templateCode = body.getStr("template_code");
|
||||
if (StrUtil.isEmpty(templateCode)) {
|
||||
return null;
|
||||
}
|
||||
return sendSms(user, templateCode, body);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -24,7 +24,6 @@ public class MessageReqResp {
|
||||
*/
|
||||
private Integer result;
|
||||
|
||||
|
||||
/**
|
||||
* 提示的异常信息
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<parent>
|
||||
<groupId>com.tiesheng.springboot-parent</groupId>
|
||||
<artifactId>springboot-parent</artifactId>
|
||||
<version>0.9.6</version>
|
||||
<version>1.0.24-test</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>springboot-platform</artifactId>
|
||||
|
||||
@@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.lang.TypeReference;
|
||||
import cn.hutool.core.map.MapUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.http.HttpRequest;
|
||||
import cn.hutool.http.HttpResponse;
|
||||
import cn.hutool.http.HttpUtil;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
@@ -48,6 +48,40 @@ public class PlatformDingConfig {
|
||||
return bean;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 发送get请求
|
||||
* 会自动增加accessToken在url上面
|
||||
*
|
||||
* @param service
|
||||
* @return
|
||||
*/
|
||||
public <T> DingResponse<T> doRequest(String service, String url, JSONObject body, TypeReference<DingResponse<T>> typeReference) {
|
||||
if (StrUtil.contains(url, "?")) {
|
||||
url = url + "&access_token=" + getAccessToken(service);
|
||||
} else {
|
||||
url = url + "?access_token=" + getAccessToken(service);
|
||||
}
|
||||
|
||||
HttpResponse execute;
|
||||
if (body == null) {
|
||||
execute = HttpUtil.createGet(url).execute();
|
||||
} else {
|
||||
execute = HttpUtil.createPost(url).body(body.toString()).execute();
|
||||
}
|
||||
|
||||
if (execute.isOk()) {
|
||||
DingResponse<T> bean = JSONUtil.toBean(execute.body(), typeReference, true);
|
||||
if (!bean.isOk()) {
|
||||
LogFactory.get().info(bean.getErrmsg());
|
||||
}
|
||||
return bean;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// 逻辑方法
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
@@ -88,14 +122,15 @@ public class PlatformDingConfig {
|
||||
DingConfigBean dingConfigBean = getConfigBean(service);
|
||||
String jsapiTicket = TimedCacheHelper.getTimedCache().get(CACHE_JSAPI_TICKET + dingConfigBean.getAppKey(), false);
|
||||
if (StrUtil.isEmpty(jsapiTicket)) {
|
||||
String response = HttpUtil.get("https://oapi.dingtalk.com/get_jsapi_ticket?access_token=" + getAccessToken(service));
|
||||
LogFactory.get().info("getJsapiTicket: " + response);
|
||||
JSONObject respJson = JSONUtil.parseObj(response);
|
||||
if (!Objects.equals(respJson.getStr("errcode"), "0")) {
|
||||
throw new ApiException(respJson.getStr("errmsg"));
|
||||
DingResponse<String> respJson = doRequest(service, "https://oapi.dingtalk.com/get_jsapi_ticket", null,
|
||||
new TypeReference<DingResponse<String>>() {
|
||||
});
|
||||
if (!respJson.isOk()) {
|
||||
throw new ApiException(respJson.getErrmsg());
|
||||
}
|
||||
jsapiTicket = respJson.getStr("ticket");
|
||||
TimedCacheHelper.getTimedCache().put(CACHE_JSAPI_TICKET + dingConfigBean.getAppKey(), jsapiTicket, respJson.getLong("expires_in"));
|
||||
jsapiTicket = respJson.getTicket();
|
||||
TimedCacheHelper.getTimedCache().put(CACHE_JSAPI_TICKET + dingConfigBean.getAppKey(),
|
||||
jsapiTicket, respJson.getExpiresIn());
|
||||
}
|
||||
return jsapiTicket;
|
||||
}
|
||||
@@ -124,10 +159,11 @@ public class PlatformDingConfig {
|
||||
* @return
|
||||
* @see <a href="https://open.dingtalk.com/document/isvapp-server/obtain-the-userid-of-a-user-by-using-the-log-free"></a>
|
||||
*/
|
||||
public String getUserIdByCode(String service, String code) {
|
||||
String response = HttpRequest.post("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo?access_token=" + getAccessToken(service))
|
||||
.body(JSONUtil.createObj().putOpt("code", code).toString()).execute().body();
|
||||
return JSONUtil.parseObj(response).getJSONObject("result").getStr("userid");
|
||||
public DingUserSimple getUserIdByCode(String service, String code) {
|
||||
DingResponse<DingUserSimple> resp = doRequest(service, "https://oapi.dingtalk.com/topapi/v2/user/getuserinfo",
|
||||
JSONUtil.createObj().putOpt("code", code), new TypeReference<DingResponse<DingUserSimple>>() {
|
||||
});
|
||||
return resp.getResult();
|
||||
}
|
||||
|
||||
|
||||
@@ -141,13 +177,12 @@ public class PlatformDingConfig {
|
||||
*/
|
||||
public DingUserInfo topapiV2UserGet(String service, String ddUserId) {
|
||||
DingConfigBean dingConfigBean = getConfigBean(service);
|
||||
String response = HttpRequest.post("https://oapi.dingtalk.com/topapi/v2/user/get?access_token=" + getAccessToken(service))
|
||||
.body(JSONUtil.createObj().putOpt("userid", ddUserId).toString()).execute().body();
|
||||
JSONObject resultJson = JSONUtil.parseObj(response).getJSONObject("result");
|
||||
DingUserInfo userInfo = JSONUtil.toBean(resultJson, DingUserInfo.class);
|
||||
|
||||
DingUserInfo userInfo = doRequest(service, "https://oapi.dingtalk.com/topapi/v2/user/get",
|
||||
JSONUtil.createObj().putOpt("userid", ddUserId), new TypeReference<DingResponse<DingUserInfo>>() {
|
||||
}).getResult();
|
||||
// 设置一下job_number
|
||||
userInfo.setJobNumber(resultJson.getStr("job_number"));
|
||||
userInfo.setJobNumber(userInfo.getJobNumber());
|
||||
userInfo.setAppId(dingConfigBean.getAppKey());
|
||||
return userInfo;
|
||||
}
|
||||
@@ -164,15 +199,10 @@ public class PlatformDingConfig {
|
||||
if (StrUtil.isEmpty(token)) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
String response = HttpRequest.post("https://oapi.dingtalk.com/topapi/v2/department/listsub?access_token=" + token)
|
||||
.body(JSONUtil.createObj().putOpt("dept_id", deptId).toString()).execute().body();
|
||||
DingResponse<List<DingDeptVo>> result = JSONUtil.toBean(response, new TypeReference<DingResponse<List<DingDeptVo>>>() {
|
||||
}.getType(), true);
|
||||
|
||||
if (!result.isOk()) {
|
||||
result.setResult(new ArrayList<>());
|
||||
}
|
||||
return result.getResult();
|
||||
return doRequest(service, "https://oapi.dingtalk.com/topapi/v2/department/listsub",
|
||||
JSONUtil.createObj().putOpt("dept_id", deptId), new TypeReference<DingResponse<List<DingDeptVo>>>() {
|
||||
}).getResult();
|
||||
}
|
||||
|
||||
|
||||
@@ -188,19 +218,16 @@ public class PlatformDingConfig {
|
||||
return DingUserListVo.fail();
|
||||
}
|
||||
|
||||
String response = HttpRequest.post("https://oapi.dingtalk.com/topapi/v2/user/list?access_token=" + token)
|
||||
.body(JSONUtil.createObj().putOpt("dept_id", deptId).putOpt("cursor", cursor).putOpt("size", 100).toString())
|
||||
.execute().body();
|
||||
DingResponse<DingUserListVo> result = JSONUtil.toBean(response, new TypeReference<DingResponse<DingUserListVo>>() {
|
||||
}.getType(), true);
|
||||
if (!result.isOk()) {
|
||||
result.setResult(DingUserListVo.fail());
|
||||
}
|
||||
return result.getResult();
|
||||
return doRequest(service, "https://oapi.dingtalk.com/topapi/v2/user/list",
|
||||
JSONUtil.createObj().putOpt("dept_id", deptId).putOpt("cursor", cursor).putOpt("size", 100),
|
||||
new TypeReference<DingResponse<DingUserListVo>>() {
|
||||
}).getResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* 同步钉钉的通讯录
|
||||
* <br />
|
||||
* PS:如果需要钉钉用户手机号,需要开通权限:企业员工手机号信息
|
||||
*
|
||||
* @param deptVo 为null时从第一级获取
|
||||
* @param consumer 回调
|
||||
@@ -239,18 +266,19 @@ public class PlatformDingConfig {
|
||||
* @param content
|
||||
* @param actionUrl
|
||||
* @param userIds
|
||||
* @return
|
||||
*/
|
||||
public void messageNotification(String service, String title, String content, String actionUrl, List<String> userIds) {
|
||||
public DingResponse<String> messageNotification(String service, String title, String markdown, String actionUrl, List<String> userIds) {
|
||||
|
||||
if (CollUtil.isEmpty(userIds)) {
|
||||
return;
|
||||
return null;
|
||||
}
|
||||
|
||||
DingConfigBean configBean = getConfigBean(service);
|
||||
|
||||
JSONObject actionCard = new JSONObject();
|
||||
actionCard.set("title", title);
|
||||
actionCard.set("markdown", "### " + title + "\n" + content);
|
||||
actionCard.set("markdown", markdown);
|
||||
actionCard.set("single_title", "点击查看");
|
||||
actionCard.set("single_url", actionUrl);
|
||||
|
||||
@@ -258,17 +286,18 @@ public class PlatformDingConfig {
|
||||
msg.set("msgtype", "action_card");
|
||||
msg.set("action_card", actionCard);
|
||||
|
||||
HashMap<String, Object> body = new HashMap<>(10);
|
||||
body.put("agent_id", configBean.getAgentId());
|
||||
body.put("userid_list", CollUtil.join(userIds, ","));
|
||||
body.put("msg", msg);
|
||||
String resp = HttpUtil.post("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token=" + getAccessToken(service),
|
||||
JSONUtil.toJsonStr(body));
|
||||
JSONObject body = new JSONObject();
|
||||
body.putOpt("agent_id", configBean.getAgentId());
|
||||
body.putOpt("userid_list", CollUtil.join(userIds, ","));
|
||||
body.putOpt("msg", msg);
|
||||
return doRequest(service, "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2", body,
|
||||
new TypeReference<DingResponse<String>>() {
|
||||
});
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// setter\getter
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// setter\getter
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
public Map<String, DingConfigBean> getConfigs() {
|
||||
return configs;
|
||||
|
||||
@@ -6,6 +6,8 @@ public class DingResponse<T> {
|
||||
|
||||
private String errcode;
|
||||
private String errmsg;
|
||||
private String ticket;
|
||||
private Long expiresIn;
|
||||
private T result;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
@@ -43,4 +45,20 @@ public class DingResponse<T> {
|
||||
public void setResult(T result) {
|
||||
this.result = result;
|
||||
}
|
||||
|
||||
public String getTicket() {
|
||||
return ticket;
|
||||
}
|
||||
|
||||
public void setTicket(String ticket) {
|
||||
this.ticket = ticket;
|
||||
}
|
||||
|
||||
public Long getExpiresIn() {
|
||||
return expiresIn;
|
||||
}
|
||||
|
||||
public void setExpiresIn(Long expiresIn) {
|
||||
this.expiresIn = expiresIn;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,10 +6,8 @@ import java.util.List;
|
||||
/**
|
||||
* @author hao
|
||||
*/
|
||||
public class DingUserInfo {
|
||||
public class DingUserInfo extends DingUserSimple {
|
||||
|
||||
private String name;
|
||||
private String userid;
|
||||
private String avatar;
|
||||
private String mobile;
|
||||
private String email;
|
||||
@@ -17,7 +15,6 @@ public class DingUserInfo {
|
||||
private String nickname;
|
||||
private String title;
|
||||
private String remark;
|
||||
private String unionid;
|
||||
private String appId;
|
||||
private List<String> deptIdList;
|
||||
private boolean leader;
|
||||
@@ -34,30 +31,6 @@ public class DingUserInfo {
|
||||
// setter\getter
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getUnionid() {
|
||||
return unionid;
|
||||
}
|
||||
|
||||
public void setUnionid(String unionid) {
|
||||
this.unionid = unionid;
|
||||
}
|
||||
|
||||
public String getUserid() {
|
||||
return userid;
|
||||
}
|
||||
|
||||
public void setUserid(String userid) {
|
||||
this.userid = userid;
|
||||
}
|
||||
|
||||
public String getAvatar() {
|
||||
return avatar;
|
||||
}
|
||||
|
||||