2021-03-25更新添加打印相关日志

删除无用注释代码
This commit is contained in:
tiansh
2021-03-25 09:32:56 +08:00
parent 7ec4578eb3
commit ee78074499
27 changed files with 992 additions and 0 deletions
@@ -0,0 +1,72 @@
package cn.hellohao.interceptor;
import cn.hellohao.pojo.User;
import cn.hellohao.service.impl.UserServiceImpl;
import cn.hellohao.utils.SpringContextHolder;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.net.URLDecoder;
import java.util.Date;
@Component
public class InterceptorConfigWeb implements HandlerInterceptor {
//private static final Logger log = LoggerFactory.getLogger(InterceptorConfig.class);
/**
* 进入controller层之前拦截请求
*/
//这个方法是在访问接口之前执行的,我们只需要在这里写验证登陆状态的业务逻辑,就可以在用户调用指定接口之前验证登陆状态了
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//设置请求头
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");
response.setHeader("Last-Modified", new Date().toString());
response.setHeader("ETag", String.valueOf(System.currentTimeMillis()));
UserServiceImpl userService = SpringContextHolder.getBean(UserServiceImpl.class);
HttpSession session = request.getSession();
//这里的User是登陆时放入session的
User user = (User) session.getAttribute("user");
if(user==null){
Cookie[] cookies = request.getCookies();
String Hellohao_UniqueUserKey = "";
if(cookies!=null){
for (Cookie cookie : cookies) {
if(cookie.getName().equals("Hellohao_UniqueUserKey") && Hellohao_UniqueUserKey.equals("")){
Hellohao_UniqueUserKey = URLDecoder.decode(cookie.getValue(), "GBK");
}
}
}
if(Hellohao_UniqueUserKey!=null && !Hellohao_UniqueUserKey.equals("")){
//String basepass = Base64Encryption.encryptBASE64(pass.getBytes());
Integer ret = userService.login(null, null,Hellohao_UniqueUserKey);
if (ret > 0) {
User u = userService.getUsersMail(Hellohao_UniqueUserKey);
if (u.getIsok() == 1) {
session.setAttribute("user", u);
session.setAttribute("email", u.getEmail());
//request.getRequestDispatcher("/admin/goadmin").forward(request, response);
}
}
}
}
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
@@ -0,0 +1,39 @@
package cn.hellohao.interceptor;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* XSS过滤器
* @author hellohao
*/
@WebFilter(filterName="xssFilter",urlPatterns = { "/SaveForAlbum","/register" })//"/*"为所有请求
public class XssFilter implements Filter {
@Override
public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
String path = request.getServletPath();
//由于我的@WebFilter注解配置的是urlPatterns="/*"(过滤所有请求),所以这里对不需要过滤的静态资源url,作忽略处理(大家可以依照具体需求配置)
String[] exclusionsUrls = {".js",".gif",".jpg",".png",".bmp",".css",".ico"};//,"/","/index","/admin/root/"
for (String str : exclusionsUrls) {
System.out.println(path.contains(str));
if (path.contains(str)) {
filterChain.doFilter(servletRequest,servletResponse);
return;
}
}
filterChain.doFilter(new XssHttpServletRequestWrapper(request),servletResponse);
}
@Override
public void destroy() {
}
}
@@ -0,0 +1,103 @@
package cn.hellohao.interceptor;
import com.alibaba.fastjson.JSON;
import org.apache.commons.text.StringEscapeUtils;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
/**
* ServletRequest包装类,对request做XSS过滤处理
* @author Hellohao
*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getHeader(String name) {
return StringEscapeUtils.escapeHtml4(super.getHeader(name));
}
@Override
public String getQueryString() {
return StringEscapeUtils.escapeHtml4(super.getQueryString());
}
@Override
public String getParameter(String name) {
return StringEscapeUtils.escapeHtml4(super.getParameter(name));
}
@Override
public String[] getParameterValues(String name) {
String[] values = super.getParameterValues(name);
if(values != null) {
int length = values.length;
String[] escapseValues = new String[length];
for(int i = 0; i < length; i++){
escapseValues[i] = StringEscapeUtils.escapeHtml4(values[i]);
}
return escapseValues;
}
return values;
}
@Override
public ServletInputStream getInputStream() throws IOException {
String str=getRequestBody(super.getInputStream());
Map<String,Object> map= JSON.parseObject(str,Map.class);
Map<String,Object> resultMap=new HashMap<>(map.size());
for(String key:map.keySet()){
Object val=map.get(key);
if(map.get(key) instanceof String){
resultMap.put(key,StringEscapeUtils.escapeHtml4(val.toString()));
}else{
resultMap.put(key,val);
}
}
str=JSON.toJSONString(resultMap);
final ByteArrayInputStream bais = new ByteArrayInputStream(str.getBytes());
return new ServletInputStream() {
@Override
public int read() throws IOException {
return bais.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener listener) {
}
};
}
private String getRequestBody(InputStream stream) {
String line = "";
StringBuilder body = new StringBuilder();
int counter = 0;
// 读取POST提交的数据内容
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, Charset.forName("UTF-8")));
try {
while ((line = reader.readLine()) != null) {
body.append(line);
counter++;
}
} catch (IOException e) {
e.printStackTrace();
}
return body.toString();
}
}
@@ -0,0 +1,12 @@
package cn.hellohao.pojo;
import java.io.File;
/**
* @author Hellohao
* @version 1.0
* @date 2020-04-04 2:12
*/
public class FixedResources {
public static final String LOCPATH = File.separator + "HellohaoData";
}
@@ -0,0 +1,165 @@
package cn.hellohao.service.impl;
import cn.hellohao.pojo.Keys;
import cn.hellohao.pojo.ReturnImage;
import cn.hellohao.pojo.UploadConfig;
import cn.hellohao.utils.*;
import com.UpYun;
import com.aliyun.oss.model.ObjectMetadata;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.*;
@Service
public class UFileImageupload {
static UpYun uFile;
static Keys key;
public Map<ReturnImage, Integer> ImageuploadUSS(Map<String, MultipartFile> fileMap, String username,
Map<String, String> fileMap2,Integer setday) {
if(fileMap2==null){
File file = null;
Map<ReturnImage, Integer> ImgUrl = new HashMap<>();
ObjectMetadata meta = new ObjectMetadata();
meta.setHeader("Content-Disposition", "inline");
try {
for (Map.Entry<String, MultipartFile> entry : fileMap.entrySet()) {
String uuid = UUID.randomUUID().toString().replace("-", "").toLowerCase().substring(0,5);//生成一个没有-的uuid,然后取前5位
java.text.DateFormat format1 = new java.text.SimpleDateFormat("MMddhhmmss");
String times = format1.format(new Date());
file = SetFiles.changeFile(entry.getValue());
uFile.setContentMD5(UpYun.md5(file));
boolean result = uFile.writeFile(username + "/" + uuid+times + "." + entry.getKey(), file, true);
if(result){
ReturnImage returnImage = new ReturnImage();
returnImage.setImgname(username + "/" + uuid+times + "." + entry.getKey());//entry.getValue().getOriginalFilename()
returnImage.setImgurl(key.getRequestAddress() + "/" +username + "/" + uuid+times + "." + entry.getKey());//key.getRequestAddress() + "/" +
ImgUrl.put(returnImage, (int) (entry.getValue().getSize()));
if(setday>0) {
String deleimg = DateUtils.plusDay(setday);
DeleImg.charu(username + "/" + uuid + times + "." + entry.getKey() + "|" + deleimg + "|" + "3");
}
}else{
System.err.println("上传失败");
}
}
}catch(Exception e){
ImgUrl.put(null, 500);
}
return ImgUrl;
}else{
Map<ReturnImage, Integer> ImgUrl = new HashMap<>();
ObjectMetadata meta = new ObjectMetadata();
meta.setHeader("Content-Disposition", "inline");
try {
for (Map.Entry<String, String> entry : fileMap2.entrySet()) {
String uuid = UUID.randomUUID().toString().replace("-", "").toLowerCase().substring(0,5);//生成一个没有-的uuid,然后取前5位
java.text.DateFormat format1 = new java.text.SimpleDateFormat("MMddhhmmss");
String times = format1.format(new Date());
String imgurl = entry.getValue();
uFile.setContentMD5(UpYun.md5(new File(imgurl)));
boolean result = uFile.writeFile(username + "/" + uuid+times + "." + entry.getKey(), new File(imgurl), true);
if(result){
ReturnImage returnImage = new ReturnImage();
returnImage.setImgurl(key.getRequestAddress() + "/" + username + "/" + uuid+times + "." + entry.getKey());
ImgUrl.put(returnImage, ImgUrlUtil.getFileSize2(new File(imgurl)));
if(setday>0) {
String deleimg = DateUtils.plusDay(setday);
DeleImg.charu(username + "/" + uuid + times + "." + entry.getKey() + "|" + deleimg + "|" + "3");
}
}else{
Print.warning("上传失败");
}
new File(imgurl).delete();
}
}catch(Exception e){
ImgUrl.put(null, 500);
}
return ImgUrl;
}
}
// // 转换文件方法
// private File changeFile(MultipartFile multipartFile) throws Exception {
// // 获取文件名
// String fileName = multipartFile.getName();//getOriginalFilename
// // 获取文件后缀
// String prefix = fileName.substring(fileName.lastIndexOf("."));
// // todo 修改临时文件文件名
// File file = File.createTempFile(fileName, prefix);
// // MultipartFile to File
// multipartFile.transferTo(file);
// return file;
// }
//ufile初始化
public static Integer Initialize(Keys k) {
int ret = -1;
if(k.getEndpoint()!=null && k.getAccessSecret()!=null
&& k.getBucketname()!=null && k.getRequestAddress()!=null ) {
if(!k.getEndpoint().equals("") && !k.getAccessSecret().equals("")
&& !k.getBucketname().equals("") && !k.getRequestAddress().equals("") ) {
// 初始化
// 创建UpYun实例。
uFile = new UpYun(k.getBucketname(), k.getAccessKey(), k.getAccessSecret());
List<UpYun.FolderItem> items = null;
try {
items = uFile.readDir("/",null);
key = k;
ret = 1;
} catch (Exception e) {
System.out.println("UFile - Waiting for configuration");
ret = -1;
}
}
}
return ret;
}
/**
* 客户端接口
* */
public Map<ReturnImage, Integer> clientuploadUSS(Map<String, MultipartFile> fileMap, String username, UploadConfig uploadConfig) throws Exception {
File file = null;
Map<ReturnImage, Integer> ImgUrl = new HashMap<>();
//设置Header
ObjectMetadata meta = new ObjectMetadata();
meta.setHeader("Content-Disposition", "inline");
for (Map.Entry<String, MultipartFile> entry : fileMap.entrySet()) {
String uuid = UUID.randomUUID().toString().replace("-", "").toLowerCase().substring(0,5);//生成一个没有-的uuid,然后取前5位
java.text.DateFormat format1 = new java.text.SimpleDateFormat("MMddhhmmss");
String times = format1.format(new Date());
file = SetFiles.changeFile_c(entry.getValue());
// 上传文件流。
System.out.println("客户端:待上传的图片:"+username + "/" + uuid+times + "." + entry.getKey());
ReturnImage returnImage = new ReturnImage();
if(entry.getValue().getSize()/1024<=uploadConfig.getFilesizeuser()*1024){
// 例2:采用数据流模式上传文件(节省内存),自动创建父级目录
uFile.setContentMD5(UpYun.md5(file));
boolean result = uFile.writeFile(username + "/" + uuid+times + "." + entry.getKey(), file, true);
if(result){
returnImage.setImgname(entry.getValue().getOriginalFilename());
returnImage.setImgurl(key.getRequestAddress() + "/" + username + "/" + uuid+times + "." + entry.getKey());
ImgUrl.put(returnImage, (int) (entry.getValue().getSize()));
//ImgUrl.put(key.getRequestAddress() + "/" + username + "/" + uuid+times + "." + entry.getKey(), (int) (entry.getValue().getSize()));
}else{
System.err.println("上传失败");
}
}else{
returnImage.setImgname(entry.getValue().getOriginalFilename());
returnImage.setImgurl("文件超出系统设定大小,不得超过");
ImgUrl.put(returnImage, -1);
}
}
return ImgUrl;
}
}
@@ -0,0 +1,49 @@
package cn.hellohao.utils;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
public class TestUrl {
public static void main(String[] args) {
//testUrl("http://1.3.3.3/test");
//最好使用下面这个,上面那个超时时间不定,所以可能会导致卡住的情况
testUrlWithTimeOut("http://tc.hellohao.cn2/getNoticeText", 2000);
}
public static void testUrl(String urlString){
long lo = System.currentTimeMillis();
URL url;
try {
url = new URL(urlString);
InputStream in = url.openStream();
System.out.println("连接可用");
} catch (Exception e1) {
System.out.println("连接打不开!");
url = null;
}
System.out.println(System.currentTimeMillis()-lo);
}
public static boolean testUrlWithTimeOut(String urlString,int timeOutMillSeconds){
long lo = System.currentTimeMillis();
URL url;
try {
url = new URL(urlString);
URLConnection co = url.openConnection();
co.setConnectTimeout(timeOutMillSeconds);
co.connect();
return true;
//System.out.println("连接可用");
} catch (Exception e1) {
//System.out.println("连接打不开!");
url = null;
return false;
}
//System.out.println(System.currentTimeMillis()-lo);
}
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,547 @@
*, ::after, ::before {
box-sizing: border-box;
}
body {
font-family: "Open Sans",sans-serif;
font-display: auto;
font-weight: 400;
font-size: 15px;
line-height: 24px;
color: #222;
background: #fff;
overflow-x: hidden;
-webkit-font-smoothing: antialiased;
}
.pb-70 {
padding-bottom: 70px!important;
}
.pt-80 {
padding-top: 80px!important;
}
.font__weight-thin {
font-weight: 100;
}
.divider {
width: 35px;
height: 2px;
background: #2775ff;
margin: 25px auto 32px;
border: 0;
}
.panel__head, .panel__list {
text-align: left;
}
.panel__wrapper-icon .panel__head {
background: linear-gradient(to right,#2775ff,#7202bb);
padding: 24px 40px;
box-shadow: 0 6px 30px 0 rgba(0,0,0,.12);
color: rgba(255,255,255,.9);
}
@media (min-width: 768px)
.panel__wrapper-icon .panel__head {
padding: 24px 50px;
}
@media (min-width: 992px)
.panel__wrapper-icon .panel__head {
display: flex;
align-items: center;
}
@media (min-width: 992px)
.panel__wrapper-icon .panel__head p {
margin-top: 0;
margin-left: 58px;
}
.panel__wrapper-icon .panel__head p {
flex: 1;
margin-top: 20px;
}
.font__size-14 {
font-size: .875rem;
}
.panel__head, .panel__list {
text-align: left;
}
.panel__wrapper-icon .panel__list {
background: #fff;
box-shadow: 0 6px 30px 0 rgba(0,0,0,.12);
}
.panel__head, .panel__list {
text-align: left;
}
.panel__list {
list-style: none;
margin: 0;
}
.panel__wrapper-icon .panel__list li {
color: #4e4e4e;
font-family: 'Open Sans',sans-serif;
font-size: 14px;
border-bottom: 1px solid #ececec;
position: relative;
z-index: 1;
padding: 28px;
}
.panel__wrapper-icon .panel__list li .line {
position: absolute;
top: 50%;
transform: translate(0,-50%);
left: 0;
width: 3px;
height: 40px;
background: linear-gradient(to bottom,#2775ff,#7202bb);
opacity: 0;
transition: all .3s ease;
}
.panel__wrapper-icon .panel__list li:hover {
z-index: 2;
}
.panel__wrapper-icon .panel__list li:hover .line {
opacity: 1;
left: -15px;
transition-delay: .1s;
}
.panel__wrapper-icon .panel__list li:nth-child(2n) {
background: #f6f6f6;
}
@media screen and (min-width: 576px)
.panel__wrapper-icon .panel__list li {
padding-left: 110px;
}
.panel__wrapper-icon .panel__list li {
color: #4e4e4e;
font-family: 'Open Sans',sans-serif;
font-size: 14px;
border-bottom: 1px solid #ececec;
position: relative;
z-index: 1;
padding: 28px;
}
abbr, acronym, address, applet, article, aside, audio, b, big, body, button, canvas, caption, center, cite, code, dd, del, details, dfn, div, dl, dt, em, embed, fieldset, figcaption, figure, footer, form, header, hgroup, html, i, iframe, img, ins, kbd, label, legend, li, mark, menu, nav, object, ol, output, p, pre, ruby, s, samp, section, small, span, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, time, tr, tt, u, ul, var, video {
margin: 0;
padding: 0;
border: 0;
font: inherit;
vertical-align: top;
}
.panel__wrapper-icon .panel__list li:hover:after, .panel__wrapper-table .panel__list li:hover:after {
transform: scale(1);
opacity: 1;
}
.panel__wrapper-gradient .panel__list li:after, .panel__wrapper-icon .panel__list li:after, .panel__wrapper-table .panel__list li:after {
content: '';
position: absolute;
top: -6px;
left: -15px;
right: -15px;
bottom: -6px;
background: #fff;
box-shadow: 0 6px 30px 0 rgba(0,0,0,.12);
opacity: 0;
transition: all .3s ease;
transform: scale(.95);
z-index: -1;
}
.font__family-open-sans {
font-family: 'Open Sans',sans-serif;
}
.panel__wrapper-icon .panel__head p {
margin-top: 0;
margin-left: 58px;
}
.panel__wrapper-icon .panel__head {
display: flex;
align-items: center;
}
.font__size-21 {
font-size: 1.3125rem;
}
.font__family-montserrat {
font-family: 'Montserrat',sans-serif;
}
.panel__wrapper-icon .panel__list li .icon {
font-size: 36px;
color: #2775ff;
opacity: .5;
transition: all .3s ease;
position: relative;
margin-bottom: 20px;
width: auto!important;
height: auto!important;
line-height: normal!important;
margin-left: 0!important;
}
.icon {
display: inline-block;
text-align: center;
}
.fal, .far {
font-weight: 600!important;
}
.panel__wrapper-icon .panel__list li {
color: #4e4e4e;
font-family: 'Open Sans',sans-serif;
font-size: 14px;
border-bottom: 1px solid #ececec;
position: relative;
z-index: 1;
padding: 28px;
}
.panel__wrapper-icon .panel__list li .icon {
position: absolute;
left: 40px;
margin-bottom: 0;
top: 50%;
transform: translate(0,-50%);
}
.panel__wrapper-icon .panel__list li {
padding-left: 110px;
}
.panel__wrapper-icon .panel__list li:hover .icon {
opacity: 1;
}
/************************************/
.list-inline-4 li:hover>.after, .list-inline-5>li.list-counter:hover .list-shape, .list-inline-5>li.list-counter:hover>.after {
opacity: 1;
}
.list-inline-4 li>.after {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
border-radius: 50px;
background: linear-gradient(to right,#2775ff,#7202bb);
z-index: -1;
transition: all .4s ease;
opacity: 0;
}
.list-inline-4 li>.before {
top: 50%;
transform: translateY(-50%);
left: 1.25em;
width: 16px;
height: 16px;
border: 2px solid #fff;
border-radius: 50%;
}
.list-inline-3 li>.after, .list-inline-4 li>.before {
position: absolute;
transition: all .4s ease;
background: #2775ff;
}
.list-inline-4 li {
display: block;
text-align: left;
border: 1px solid #eee;
border-radius: 50px;
padding: .875em .875em .875em 3.4375em;
position: relative;
z-index: 1;
transition: all .4s ease;
}
.font__size-16 {
font-size: 1rem;
}
.font__family-montserrat {
font-family: 'Montserrat',sans-serif;
}
.list-inline-4 li {
display: block;
text-align: left;
border: 1px solid #eee;
border-radius: 50px;
padding: .875em .875em .875em 3.4375em;
position: relative;
z-index: 1;
transition: all .4s ease;
}
.mb-35 {
margin-bottom: 35px!important;
}
.mb-100 {
margin-bottom: 100px!important;
}
.list-inline-4 li+li {
margin-top: 10px;
}
.list-inline-4 li:hover>.after, .list-inline-5>li.list-counter:hover .list-shape, .list-inline-5>li.list-counter:hover>.after {
opacity: 1;
}
.list-inline-4 li .icon {
position: absolute;
top: 50%;
right: 25px;
transform: translateY(-50%);
color: #fff;
z-index: 2;
}
.list-inline-4 li:hover>.before {
background: 0 0;
width: 14px;
height: 14px;
}
.list-inline-4 li:hover {
color: #fff;
box-shadow: 0 5px 16px 0 rgba(165,165,165,.5);
}
.list-inline-3 li:hover, .list-inline-3 li:hover a, .list-inline-4 li:hover a, .list-inline-5>li.list-counter:hover, .list-inline-5>li.list-counter:hover a, .list-inline-5>li.list-counter:hover>.before, .list-inline-6 li:hover:before {
color: #fff;
}
.fa-angle-right:before {
content: "\f105";
}
[class*=list-inline] a {
transition: none;
text-decoration: none!important;
}
.letter-spacing-60 {
letter-spacing: .06em;
}
.font__size-46 {
font-size: 2.875rem;
}
.font__weight-thin {
font-weight: 100;
}
.font__family-roboto {
font-family: 'Roboto',sans-serif;
}
.text-uppercase {
text-transform: uppercase!important;
}
.line__height-26 {
line-height: 1.625rem;
}
.font__size-16 {
font-size: 1rem;
}
.font__weight-normal {
font-weight: 400;
}
.brk-dark-font-color {
color: #585858;
}
.brk-dark-font-color{ font-family: "Open Sans",sans-serif;}
.pb-70 {
padding-bottom: 70px!important;
}
a {
font: inherit;
color: inherit;
text-decoration: none;
}
/*******************************************/
.overflow-hid {
overflow: hidden!important;
}
.bg__style {
background-position: center center;
background-repeat: no-repeat;
background-size: cover;
}
.position-relative {
position: relative!important;
}
.brk-abs-bg-overlay, .brk-abs-img, .brk-abs-overlay {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.opacity-90 {
opacity: .9;
}
.brk-base-bg-gradient-50deg {
background-image: linear-gradient(to right, #2775ff, #008dff, #00a2ff, #00b5ff, #00c6ff);
}
.info-box__wrapper-web {
padding: 70px 20px;
}
.info-box__wrapper-web {
text-align: left;
padding: 50px 20px;
position: relative;
z-index: 1;
display: flex;
align-items: center;
}
[class*=info-box__wrapper] {
transition: all .4s ease;
}
.info-box__wrapper-strict, .info-box__wrapper-web .shape {
position: relative;
z-index: 1;
}
.info-box__wrapper-web .shape:before {
content: '';
width: 15px;
height: 15px;
border: 2px solid #fff;
border-radius: 50%;
}
.info-box__wrapper-web .livicon-evo, .info-box__wrapper-web .shape:before {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
}
.info-box__wrapper-web .shape>.after, .info-box__wrapper-web .shape>.before {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
opacity: 0;
background-color: #fff;
transition: all .4s ease;
border-radius: 50%;
z-index: -1;
}
.info-box__wrapper-web .shape>.before {
transform: scale(1.35);
}
.info-box__wrapper-web .svg-wrap {
position: relative;
z-index: 1;
display: inline-block;
background: linear-gradient(to top,var(--brk-base-6),var(--brk-base-2));
transition: all .4s ease;
border-radius: 50%;
width: 75px;
height: 75px;
box-shadow: 0 0 10px 0 rgba(0,0,0,.15);
transform: scale(0);
}
.info-box__wrapper-web .svg-wrap svg {
width: 45px;
height: 45px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
z-index: 2;
}
[class*=info-box__wrapper] svg {
transition: all .4s ease;
width: 84px;
height: 84px;
}
.info-box__wrapper-web .shape>.after, .info-box__wrapper-web .shape>.before {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
opacity: 0;
background-color: #fff;
transition: all .4s ease;
border-radius: 50%;
z-index: -1;
}
.info-box__wrapper-web .shape:after {
content: '';
}
.info-box__wrapper-web .shape:after {
position: absolute;
bottom: calc(50% + 7px);
left: calc(50% - 1px);
width: 2px;
height: 100vh;
background: #fff;
}
.info-box__wrapper-web .content>* {
color: #fff;
}
.info-box__wrapper-web .content p {
color: #b3daee;
margin-top: 15px;
}
.info-box__wrapper-web.current .shape>.before, .info-box__wrapper-web:hover .shape>.before, .wpb_column.current .info-box__wrapper-web .shape>.before {
-webkit-animation: 1.5s brk-pulse .3s infinite;
animation: 1.5s brk-pulse .3s infinite;
opacity: .1;
}
.info-box__wrapper-web .shape>.after, .info-box__wrapper-web .shape>.before {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
opacity: 0;
background-color: #fff;
transition: all .4s ease;
border-radius: 50%;
z-index: -1;
}
.info-box__wrapper-web .shape>.before {
transform: scale(1.35);
}
.info-box__wrapper-web.current .svg-wrap, .info-box__wrapper-web:hover .svg-wrap {
transform: scale(1);
}
.info-box__wrapper-web .svg-wrap {
position: relative;
z-index: 1;
display: inline-block;
background: linear-gradient(to top,#0b98f6,#00c6ff);
transition: all .4s ease;
border-radius: 50%;
width: 75px;
height: 75px;
box-shadow: 0 0 10px 0 rgba(0,0,0,.15);
transform: scale(0);
}
.info-box__wrapper-shuffle.current svg *, .info-box__wrapper-shuffle:hover svg *, .info-box__wrapper-web svg *, .wpb_column.current .info-box__wrapper-strict svg * {
stroke: #fff;
}
.wpb_column.current .info-box__wrapper-web .svg-wrap {
transform: scale(1);
}
.wpb_column.current .info-box__wrapper-web .shape > .before {
animation: 1.5s brk-pulse 0.3s infinite;
opacity: 0.1;
}
.wpb_column.current .info-box__wrapper-web .shape > .after {
animation: brk-pulse 1.5s infinite;
opacity: 0.2;
}
@-webkit-keyframes brk-pulse{0%{transform:scale(1)}50%{transform:scale(2)}to{transform:scale(1);opacity:0}}@keyframes brk-pulse{0%{transform:scale(1)}50%{transform:scale(2)}to{transform:scale(1);opacity:0}}@-webkit-keyframes brk-pulse-paused{0%,to{transform:scale(1)}20%{transform:scale(1.2)}60%{transform:scale(.9);opacity:0}}@keyframes brk-pulse-paused{0%,to{transform:scale(1)}20%{transform:scale(1.2)}60%{transform:scale(.9);opacity:0}}
Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B