2021-03-25更新添加打印相关日志
删除无用注释代码
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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}}
|
||||
|
||||
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 661 B |