Commit fbf32adf by jscat

nyx: 添加前端页面

first version
parent a6b2f4a0
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
...@@ -2,10 +2,15 @@ ...@@ -2,10 +2,15 @@
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="86dc399d-9323-4124-8c4f-671d1ecb849c" name="Default Changelist" comment=""> <list default="true" id="86dc399d-9323-4124-8c4f-671d1ecb849c" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/../nyx-master/pages/discover/discover.wxml" beforeDir="false" afterPath="$PROJECT_DIR$/../nyx-master/pages/discover/discover.wxml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../nyx-master/pages/discover/discover.wxss" beforeDir="false" afterPath="$PROJECT_DIR$/../nyx-master/pages/discover/discover.wxss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/api/src/main/java/cn/com/fun/nyxkey/api/config/WebSocketServer.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/cn/com/fun/nyxkey/api/config/WebSocketServer.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/api/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/api/pom.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/api/src/main/java/cn/com/fun/nyxkey/api/common/Constants.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/cn/com/fun/nyxkey/api/common/Constants.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/api/src/main/java/cn/com/fun/nyxkey/api/common/JSONResult.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/cn/com/fun/nyxkey/api/common/JSONResult.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/api/src/main/java/cn/com/fun/nyxkey/api/domain/Rockwell_userT_user.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/cn/com/fun/nyxkey/api/domain/Rockwell_userT_user.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/api/src/main/java/cn/com/fun/nyxkey/api/service/Rockwell_userService.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/cn/com/fun/nyxkey/api/service/Rockwell_userService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/api/src/main/java/cn/com/fun/nyxkey/api/service/impl/Rockwell_userServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/cn/com/fun/nyxkey/api/service/impl/Rockwell_userServiceImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/api/src/main/java/cn/com/fun/nyxkey/api/web/controller/UserApiController.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/cn/com/fun/nyxkey/api/web/controller/UserApiController.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/api/src/main/resources/config/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/resources/config/application.yml" afterDir="false" />
</list> </list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
...@@ -13,6 +18,13 @@ ...@@ -13,6 +18,13 @@
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" /> <option name="LAST_RESOLUTION" value="IGNORE" />
</component> </component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Class" />
</list>
</option>
</component>
<component name="Git.Settings"> <component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/../.." /> <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/../.." />
</component> </component>
...@@ -25,11 +37,15 @@ ...@@ -25,11 +37,15 @@
</option> </option>
</component> </component>
<component name="ProjectId" id="1ZbJNboKdnQ5QLW8gMQQByXS1i4" /> <component name="ProjectId" id="1ZbJNboKdnQ5QLW8gMQQByXS1i4" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true" /> <component name="ProjectLevelVcsManager" settingsEditedManually="true">
<ConfirmationsSetting value="1" id="Add" />
</component>
<component name="PropertiesComponent"> <component name="PropertiesComponent">
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" /> <property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" /> <property name="WebServerToolWindowFactoryState" value="false" />
<property name="aspect.path.notification.shown" value="true" /> <property name="aspect.path.notification.shown" value="true" />
<property name="nodejs_package_manager_path" value="npm" />
<property name="restartRequiresConfirmation" value="false" />
</component> </component>
<component name="RunDashboard"> <component name="RunDashboard">
<option name="ruleStates"> <option name="ruleStates">
...@@ -106,6 +122,9 @@ ...@@ -106,6 +122,9 @@
<workItem from="1585383375967" duration="1408000" /> <workItem from="1585383375967" duration="1408000" />
<workItem from="1585742641617" duration="2946000" /> <workItem from="1585742641617" duration="2946000" />
<workItem from="1585897624622" duration="2734000" /> <workItem from="1585897624622" duration="2734000" />
<workItem from="1586478722332" duration="33083000" />
<workItem from="1586702255071" duration="7517000" />
<workItem from="1586829319403" duration="14510000" />
</task> </task>
<servers /> <servers />
</component> </component>
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
...@@ -147,6 +147,14 @@ ...@@ -147,6 +147,14 @@
<version>6.1.26</version> <version>6.1.26</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>
<dependency> <dependency>
<groupId>joda-time</groupId> <groupId>joda-time</groupId>
......
package cn.com.fun.nyxkey.api.common; package cn.com.fun.nyxkey.api.common;
...@@ -21,6 +21,24 @@ public class Constants { ...@@ -21,6 +21,24 @@ public class Constants {
public static final int T_SUBTRAHEND_2 = 2; public static final int T_SUBTRAHEND_2 = 2;
public static String BASE_PATH;
public static String LOGIN_SESSION_KEY = "Favorites_user";
public static String PASSWORD_KEY = "@#$%^&*()OPG#$%^&*(HG";
public static String DES3_KEY = "9964DYByKL967c3308imytCB";
public static String default_logo="img/logo.jpg";
public static String userAgent="Mozilla";
public static String default_Profile=BASE_PATH+"/img/logo.jpg";
public static String LAST_REFERER = "LAST_REFERER";
public static int COOKIE_TIMEOUT= 30*24*60*60;
public enum DataSetEnum { public enum DataSetEnum {
OPENHIGH("日期", "093000", "早盘高开"), OPENHIGH("日期", "093000", "早盘高开"),
......
package cn.com.fun.nyxkey.api.common;
package cn.com.fun.nyxkey.api.common;
public enum ExceptionMsg {
SUCCESS("000000", "操作成功"),
FAILED("999999","操作失败"),
ParamError("000001", "参数错误!"),
LoginNameOrPassWordError("000100", "用户名或者密码错误!"),
EmailUsed("000101","该邮箱已被注册"),
UserNameUsed("000102","该登录名称已存在"),
EmailNotRegister("000103","该邮箱地址未注册"),
LinkOutdated("000104","该链接已过期,请重新请求"),
PassWordError("000105","密码输入错误"),
UserNameLengthLimit("000106","用户名长度超限"),
LoginNameNotExists("000107","该用户未注册"),
UserNameSame("000108","新用户名与原用户名一致"),
FavoritesNameIsNull("000200","收藏夹名称不能为空"),
FavoritesNameUsed("000201","收藏夹名称已被创建"),
CollectExist("000300","该文章已被收藏"),
FileEmpty("000400","上传文件为空"),
LimitPictureSize("000401","图片大小必须小于2M"),
LimitPictureType("000402","图片格式必须为'jpg'、'png'、'jpge'、'gif'、'bmp'")
;
private ExceptionMsg(String code, String msg) {
this.code = code;
this.msg = msg;
}
private String code;
private String msg;
public String getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
package cn.com.fun.nyxkey.api.common; package cn.com.fun.nyxkey.api.common;
...@@ -3,6 +3,9 @@ package cn.com.fun.nyxkey.api.common; ...@@ -3,6 +3,9 @@ package cn.com.fun.nyxkey.api.common;
import java.util.List; import java.util.List;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import javax.naming.event.ObjectChangeListener;
/** /**
* @Title: LeeJSONResult.java * @Title: LeeJSONResult.java
* @Package com.lee.utils * @Package com.lee.utils
...@@ -25,7 +28,7 @@ public class JSONResult { ...@@ -25,7 +28,7 @@ public class JSONResult {
// 定义jackson对象 // 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper(); private static final ObjectMapper MAPPER = new ObjectMapper();
// 响应业务状态 // 响应业务状态
private Integer resultCode; private String resultCode;
// 总数 // 总数
private Integer totalCount; private Integer totalCount;
...@@ -35,7 +38,7 @@ public class JSONResult { ...@@ -35,7 +38,7 @@ public class JSONResult {
// 响应中的数据 // 响应中的数据
private Object data; private Object data;
public static JSONResult build(Integer resultCode, String resultMsg, Integer totalCount, Object data) { public static JSONResult build(String resultCode, String resultMsg, Integer totalCount, Object data) {
return new JSONResult(resultCode, resultMsg, totalCount, data); return new JSONResult(resultCode, resultMsg, totalCount, data);
} }
...@@ -47,20 +50,20 @@ public class JSONResult { ...@@ -47,20 +50,20 @@ public class JSONResult {
// return new JSONResult(null); // return new JSONResult(null);
// } // }
public static JSONResult errorresultMsg(String resultMsg) { public static JSONResult errorresultMsg(ExceptionMsg resultMsg) {
return new JSONResult(500, resultMsg, null, null); return new JSONResult(resultMsg.getCode(), resultMsg.getMsg(), 0, null);
} }
public static JSONResult errorMap(Object data) { public static JSONResult errorMap(Object data) {
return new JSONResult(501, "error", null, data); return new JSONResult("501", "error", 0, data);
} }
public static JSONResult errorTokenresultMsg(String resultMsg) { public static JSONResult errorTokenresultMsg(String resultMsg) {
return new JSONResult(502, resultMsg, null, null); return new JSONResult("502", resultMsg, null, null);
} }
public static JSONResult errorException(String resultMsg) { public static JSONResult errorException(String resultMsg) {
return new JSONResult(555, resultMsg, null, null); return new JSONResult("555", resultMsg, 0, null);
} }
public JSONResult() { public JSONResult() {
...@@ -70,7 +73,7 @@ public class JSONResult { ...@@ -70,7 +73,7 @@ public class JSONResult {
// return new LeeJSONResult(resultCode, resultMsg, null); // return new LeeJSONResult(resultCode, resultMsg, null);
// } // }
public JSONResult(Integer resultCode, String resultMsg, Integer totalCount, Object data) { public JSONResult(String resultCode, String resultMsg, Integer totalCount, Object data) {
this.resultCode = resultCode; this.resultCode = resultCode;
this.resultMsg = resultMsg; this.resultMsg = resultMsg;
this.totalCount = totalCount; this.totalCount = totalCount;
...@@ -78,21 +81,31 @@ public class JSONResult { ...@@ -78,21 +81,31 @@ public class JSONResult {
} }
public JSONResult(Integer totalCount, Object data) { public JSONResult(Integer totalCount, Object data) {
this.resultCode = 200; this.resultCode = "200";
this.resultMsg = "OK"; this.resultMsg = "OK";
this.totalCount = totalCount; this.totalCount = totalCount;
this.data = data; this.data = data;
} }
//
// public Boolean isOK() {
// return this.resultCode == 200;
// }
public Integer getresultCode() { public JSONResult(ExceptionMsg exceptionMsg) {
this.resultCode = exceptionMsg.getCode();
this.resultMsg = exceptionMsg.getMsg();
this.totalCount = 0;
this.data = null;
}
public JSONResult(ExceptionMsg exceptionMsg, Object data) {
this.resultCode = exceptionMsg.getCode();
this.resultMsg = exceptionMsg.getMsg();
this.totalCount = 1;
this.data = data;
}
public String getresultCode() {
return resultCode; return resultCode;
} }
public void setresultCode(Integer resultCode) { public void setresultCode(String resultCode) {
this.resultCode = resultCode; this.resultCode = resultCode;
} }
...@@ -144,7 +157,7 @@ public class JSONResult { ...@@ -144,7 +157,7 @@ public class JSONResult {
obj = MAPPER.readValue(data.asText(), clazz); obj = MAPPER.readValue(data.asText(), clazz);
} }
} }
return build(jsonNode.get("resultCode").intValue(), jsonNode.get("resultMsg") return build(jsonNode.get("resultCode").toString(), jsonNode.get("resultMsg")
.asText(), totalCount, obj); .asText(), totalCount, obj);
} catch (Exception e) { } catch (Exception e) {
return null; return null;
...@@ -187,7 +200,7 @@ public class JSONResult { ...@@ -187,7 +200,7 @@ public class JSONResult {
MAPPER.getTypeFactory().constructCollectionType( MAPPER.getTypeFactory().constructCollectionType(
List.class, clazz)); List.class, clazz));
} }
return build(jsonNode.get("resultCode").intValue(), jsonNode.get("resultMsg") return build(jsonNode.get("resultCode").toString(), jsonNode.get("resultMsg")
.asText(), totalCount, obj); .asText(), totalCount, obj);
} catch (Exception e) { } catch (Exception e) {
return null; return null;
......
package cn.com.fun.nyxkey.api.domain; package cn.com.fun.nyxkey.api.domain;
...@@ -16,6 +16,7 @@ import java.util.Date; ...@@ -16,6 +16,7 @@ import java.util.Date;
public class Rockwell_userT_user{ public class Rockwell_userT_user{
private String id; // 主id private String id; // 主id
private String password; // password
private String openid; // openid private String openid; // openid
private String authStatus; // 授权状态: 0-未授权, 1-已授权 private String authStatus; // 授权状态: 0-未授权, 1-已授权
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
......
package cn.com.fun.nyxkey.api.service; package cn.com.fun.nyxkey.api.service;
...@@ -18,5 +18,6 @@ public interface Rockwell_userService { ...@@ -18,5 +18,6 @@ public interface Rockwell_userService {
JSONResult wxLogin(String encryptedData, String iv, String code, String userId); JSONResult wxLogin(String encryptedData, String iv, String code, String userId);
JSONResult Rockwell_userServiceReg(String userId); JSONResult Rockwell_userServiceReg(String userId);
JSONResult Rockwell_userServiceGetT_userinfo(String userId); JSONResult Rockwell_userServiceGetT_userinfo(String userId);
JSONResult webLogin(Rockwell_userT_user rockwell_userT_user);
} }
package cn.com.fun.nyxkey.api.service.impl; package cn.com.fun.nyxkey.api.service.impl;
package cn.com.fun.nyxkey.api.service.impl; package cn.com.fun.nyxkey.api.service.impl;
import cn.com.fun.nyxkey.api.common.Constants;
import cn.com.fun.nyxkey.api.common.ExceptionMsg;
import cn.com.fun.nyxkey.api.common.JSONResult; import cn.com.fun.nyxkey.api.common.JSONResult;
import cn.com.fun.nyxkey.api.common.Pagination; import cn.com.fun.nyxkey.api.common.Pagination;
import cn.com.fun.nyxkey.api.repository.*; import cn.com.fun.nyxkey.api.repository.*;
...@@ -7,6 +9,8 @@ import cn.com.fun.nyxkey.api.service.*; ...@@ -7,6 +9,8 @@ import cn.com.fun.nyxkey.api.service.*;
import cn.com.fun.nyxkey.api.domain.*; import cn.com.fun.nyxkey.api.domain.*;
import cn.com.fun.nyxkey.api.domain.query.*; import cn.com.fun.nyxkey.api.domain.query.*;
import cn.com.fun.nyxkey.api.utils.AesCbcUtil; import cn.com.fun.nyxkey.api.utils.AesCbcUtil;
import cn.com.fun.nyxkey.api.utils.MD5Util;
import cn.com.fun.nyxkey.api.utils.BaseUtils;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -17,6 +21,7 @@ import org.springframework.beans.factory.annotation.Value; ...@@ -17,6 +21,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.text.ParseException; import java.text.ParseException;
...@@ -24,6 +29,9 @@ import java.text.SimpleDateFormat; ...@@ -24,6 +29,9 @@ import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import cn.com.fun.nyxkey.api.web.common.HttpRequest; import cn.com.fun.nyxkey.api.web.common.HttpRequest;
import static cn.com.fun.nyxkey.api.utils.BaseUtils.cookieSign;
import static cn.com.fun.nyxkey.api.utils.BaseUtils.getSession;
/** /**
* Created by jerry on 2019-02-24. * Created by jerry on 2019-02-24.
*/ */
...@@ -53,7 +61,7 @@ public class Rockwell_userServiceImpl implements Rockwell_userService { ...@@ -53,7 +61,7 @@ public class Rockwell_userServiceImpl implements Rockwell_userService {
//登录凭证不能为空 //登录凭证不能为空
if (code == null || code.length() == 0) { if (code == null || code.length() == 0) {
jsonResult.setresultCode(0); jsonResult.setresultCode("0");
jsonResult.setresultMsg("code 不能为空"); jsonResult.setresultMsg("code 不能为空");
return jsonResult; return jsonResult;
} }
...@@ -99,7 +107,7 @@ public class Rockwell_userServiceImpl implements Rockwell_userService { ...@@ -99,7 +107,7 @@ public class Rockwell_userServiceImpl implements Rockwell_userService {
user.setOpenid(""); user.setOpenid("");
jsonResult.setData(user); jsonResult.setData(user);
jsonResult.setresultMsg("SUCCESS"); jsonResult.setresultMsg("SUCCESS");
jsonResult.setresultCode(200); jsonResult.setresultCode("200");
// 保存登录日志 tbl_login_log // 保存登录日志 tbl_login_log
Rockwell_userT_login_log log = new Rockwell_userT_login_log(); Rockwell_userT_login_log log = new Rockwell_userT_login_log();
...@@ -181,7 +189,7 @@ public class Rockwell_userServiceImpl implements Rockwell_userService { ...@@ -181,7 +189,7 @@ public class Rockwell_userServiceImpl implements Rockwell_userService {
jsonResult.setData(user); jsonResult.setData(user);
jsonResult.setresultMsg("SUCCESS"); jsonResult.setresultMsg("SUCCESS");
jsonResult.setresultCode(200); jsonResult.setresultCode("200");
return jsonResult; return jsonResult;
} }
...@@ -198,4 +206,61 @@ public class Rockwell_userServiceImpl implements Rockwell_userService { ...@@ -198,4 +206,61 @@ public class Rockwell_userServiceImpl implements Rockwell_userService {
return jsonResult; return jsonResult;
} }
public JSONResult webLogin(Rockwell_userT_user rockwell_userT_user){
try {
//这里不是bug,前端userName有可能是邮箱也有可能是昵称。
Rockwell_userT_userQuery rockwell_userT_userQuery = new Rockwell_userT_userQuery();
rockwell_userT_userQuery.setId(rockwell_userT_user.getId());
Rockwell_userT_user loginUser = rockwell_userMapper.queryUserByid(rockwell_userT_userQuery);
if (loginUser == null ) {
return new JSONResult(ExceptionMsg.LoginNameNotExists);
}else if(!loginUser.getPassword().equals(getPwd(rockwell_userT_user.getPassword()))){
return new JSONResult(ExceptionMsg.LoginNameOrPassWordError);
}
// String preUrl = "/";
// if(null != getSession().getAttribute(Constants.LAST_REFERER)){
// preUrl = String.valueOf(getSession().getAttribute(Constants.LAST_REFERER));
// if(preUrl.indexOf("/collect?") < 0 && preUrl.indexOf("/lookAround/standard/") < 0
// && preUrl.indexOf("/lookAround/simple/") < 0){
// preUrl = "/";
// }
// }
return new JSONResult(ExceptionMsg.SUCCESS, loginUser);
} catch (Exception e) {
// TODO: handle exception
return new JSONResult(ExceptionMsg.FAILED);
}
}
String getPwd(String password){
try {
String pwd = MD5Util.encrypt(password+ Constants.PASSWORD_KEY);
return pwd;
} catch (Exception e) {
LOGGER.error("密码加密异常:",e);
}
return null;
}
Rockwell_userT_user getUser() {
return (Rockwell_userT_user) getSession().getAttribute(Constants.LOGIN_SESSION_KEY);
}
String getUserId() {
String id="";
Rockwell_userT_user user=getUser();
if(user!=null){
id=user.getId();
}
return id;
}
String getUserName() {
String userName="管理员";
return userName;
}
} }
package cn.com.fun.nyxkey.api.utils;
package cn.com.fun.nyxkey.api.utils;
import cn.com.fun.nyxkey.api.common.Constants;
import cn.com.fun.nyxkey.api.service.impl.Rockwell_userServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* Created by jscat on 2020/4/10
*/
public class BaseUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(Rockwell_userServiceImpl.class);
public static HttpServletRequest getRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}
public static HttpSession getSession() {
return getRequest().getSession();
}
public static String getUserIp() {
String value = getRequest().getHeader("X-Real-IP");
if (StringUtils.isNotBlank(value) && !"unknown".equalsIgnoreCase(value)) {
return value;
} else {
return getRequest().getRemoteAddr();
}
}
public static String getPwd(String password){
try {
String pwd = MD5Util.encrypt(password+Constants.PASSWORD_KEY);
return pwd;
} catch (Exception e) {
LOGGER.error("密码加密异常:",e);
}
return null;
}
public static String cookieSign(String value){
try{
value = value + Constants.PASSWORD_KEY;
String sign = Des3EncryptionUtil.encode(Constants.DES3_KEY,value);
return sign;
}catch (Exception e){
LOGGER.error("cookie签名异常:",e);
}
return null;
}
}
package cn.com.fun.nyxkey.api.utils;
package cn.com.fun.nyxkey.api.utils;
/**
* Created by jscat on 2020/4/10
*/
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
public class Des3EncryptionUtil {
public static final String CHAR_ENCODING = "UTF-8";
public static byte[] encode(byte[] key, byte[] data) throws Exception {
final String Algorithm = "DESede";
SecretKey deskey = new SecretKeySpec(key, Algorithm);
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
return c1.doFinal(data);
}
public static byte[] decode(byte[] key, byte[] value) throws Exception {
final String Algorithm = "DESede";
SecretKey deskey = new SecretKeySpec(key, Algorithm);
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
return c1.doFinal(value);
}
public static String encode(String key, String data) {
try {
byte[] keyByte = key.getBytes(CHAR_ENCODING);
byte[] dataByte = data.getBytes(CHAR_ENCODING);
byte[] valueByte = encode(keyByte, dataByte);
String value = new String(Base64.encode(valueByte), CHAR_ENCODING);
return value;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static String decode(String key, String value) {
try {
byte[] keyByte = key.getBytes(CHAR_ENCODING);
byte[] valueByte = Base64.decode(value.getBytes(CHAR_ENCODING));
byte[] dataByte = decode(keyByte,valueByte);
String data = new String(dataByte, CHAR_ENCODING);
return data;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static String encryptToHex(String key, String data) {
try {
byte[] keyByte = key.getBytes(CHAR_ENCODING);
byte[] dataByte = data.getBytes(CHAR_ENCODING);
byte[] valueByte = encode(keyByte, dataByte);
String value = toHex(valueByte);
return value;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static String decryptFromHex(String key, String value) {
try {
byte[] keyByte = key.getBytes(CHAR_ENCODING);
byte[] valueByte = fromHex(value);
byte[] dataByte = decode(keyByte,valueByte);
String data = new String(dataByte, CHAR_ENCODING);
return data;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static String udpEncrypt(String key, String data) {
try {
Key k = updGenerateKey(key);
IvParameterSpec IVSpec = new IvParameterSpec(new byte[8]);
Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(1, k, ((IVSpec)));
byte output[] = c.doFinal(data.getBytes("UTF-8"));
return new String(Base64.encode(output), "UTF-8");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static Key updGenerateKey(String key) {
try {
DESedeKeySpec KeySpec = new DESedeKeySpec(UdpHexDecode(key));
SecretKeyFactory KeyFactory = SecretKeyFactory
.getInstance("DESede");
Key k = ((KeyFactory.generateSecret(((KeySpec)))));
return k;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static String udpDecrypt(String key, String data) {
try {
byte[] input = Base64.decode(data.getBytes("UTF-8"));
Key k = updGenerateKey(key);
IvParameterSpec IVSpec = new IvParameterSpec(new byte[8]);
Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(2, k, ((IVSpec)));
byte output[] = c.doFinal(input);
return new String(output, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static byte[] UdpHexDecode(String s) {
byte abyte0[] = new byte[s.length() / 2];
String s1 = s.toLowerCase();
for (int i = 0; i < s1.length(); i += 2) {
char c = s1.charAt(i);
char c1 = s1.charAt(i + 1);
int j = i / 2;
if (c < 'a')
abyte0[j] = (byte) (c - 48 << 4);
else
abyte0[j] = (byte) ((c - 97) + 10 << 4);
if (c1 < 'a')
abyte0[j] += (byte) (c1 - 48);
else
abyte0[j] += (byte) ((c1 - 97) + 10);
}
return abyte0;
}
public static String toHex(byte input[]) {
if (input == null)
return null;
StringBuffer output = new StringBuffer(input.length * 2);
for (int i = 0; i < input.length; i++) {
int current = input[i] & 0xff;
if (current < 16)
output.append("0");
output.append(Integer.toString(current, 16));
}
return output.toString();
}
public static byte[] fromHex(String input) {
if (input == null)
return null;
byte output[] = new byte[input.length() / 2];
for (int i = 0; i < output.length; i++)
output[i] = (byte) Integer.parseInt(
input.substring(i * 2, (i + 1) * 2), 16);
return output;
}
}
\ No newline at end of file
package cn.com.fun.nyxkey.api.utils;
package cn.com.fun.nyxkey.api.utils;
/**
* Created by jscat on 2020/4/10
*/
import java.security.MessageDigest;
public class MD5Util {
public static String encrypt(String dataStr) {
try {
MessageDigest m = MessageDigest.getInstance("MD5");
m.update(dataStr.getBytes("UTF8"));
byte s[] = m.digest();
String result = "";
for (int i = 0; i < s.length; i++) {
result += Integer.toHexString((0x000000FF & s[i]) | 0xFFFFFF00)
.substring(6);
}
return result;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}
package cn.com.fun.nyxkey.api.web.controller;
package cn.com.fun.nyxkey.api.web.controller;
import cn.com.fun.nyxkey.api.common.Constants;
import cn.com.fun.nyxkey.api.domain.Rockwell_userT_user;
import cn.com.fun.nyxkey.api.utils.Des3EncryptionUtil;
import cn.com.fun.nyxkey.api.utils.MD5Util;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Controller
public class BaseController {
protected Logger logger = LoggerFactory.getLogger(this.getClass());
protected HttpServletRequest getRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}
protected HttpSession getSession() {
return getRequest().getSession();
}
protected Rockwell_userT_user getUser() {
return (Rockwell_userT_user) getSession().getAttribute(Constants.LOGIN_SESSION_KEY);
}
protected String getUserIp() {
String value = getRequest().getHeader("X-Real-IP");
if (StringUtils.isNotBlank(value) && !"unknown".equalsIgnoreCase(value)) {
return value;
} else {
return getRequest().getRemoteAddr();
}
}
protected String getPwd(String password){
try {
String pwd = MD5Util.encrypt(password+ Constants.PASSWORD_KEY);
return pwd;
} catch (Exception e) {
logger.error("密码加密异常:",e);
}
return null;
}
protected String cookieSign(String value){
try{
value = value + Constants.PASSWORD_KEY;
String sign = Des3EncryptionUtil.encode(Constants.DES3_KEY,value);
return sign;
}catch (Exception e){
logger.error("cookie签名异常:",e);
}
return null;
}
}
package cn.com.fun.nyxkey.api.web.controller;
package cn.com.fun.nyxkey.api.web.controller;
import cn.com.fun.nyxkey.api.common.Constants;
import cn.com.fun.nyxkey.api.common.ExceptionMsg;
import cn.com.fun.nyxkey.api.common.JSONResult;
import cn.com.fun.nyxkey.api.domain.Rockwell_userT_user;
import cn.com.fun.nyxkey.api.service.*;
import cn.com.fun.nyxkey.api.web.common.ResponseHelper;
import cn.com.fun.nyxkey.api.web.common.ResponseWrapper;
import io.swagger.annotations.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import javax.websocket.server.PathParam;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import static cn.com.fun.nyxkey.api.utils.BaseUtils.cookieSign;
import static cn.com.fun.nyxkey.api.utils.BaseUtils.getSession;
/**
* Created by jscat on 2020-02-17.
*/
@Controller
@RequestMapping("/")
public class DiscoverApiController extends BaseController {
private static final Logger LOGGER = LoggerFactory.getLogger(DiscoverApiController.class);
@Autowired
private Rockwell_userService userService;
/*
* 微信登陆
* @param code 凭证
* @param encryptedData 用户数据
* @param iv 用户数据
* @param request request作用域:
* @return map
*/
@RequestMapping(value="/discover/item/{itemId}")
public String discover(@PathVariable(value="itemId") String itemId,
Model model){
Rockwell_userT_user user = super.getUser();
if(null != user){
model.addAttribute("user",user);
}
String url = "";
String title = "";
String subTitle = "";
switch (itemId){
case "001":
url = "/index/img/portfolio/map.png";
title = "可可爱爱上海手绘地图";
subTitle = "想去想去 \uD83C\uDE51";
break;
case "002":
url = "/index/img/portfolio/discover.png";
title = "城市发现";
subTitle = "发现有趣的你";
break;
case "003":
url = "/index/img/portfolio/key.png";
title = "知识竞答";
subTitle = "在这里可以畅所欲言啦";
break;
case "004":
url = "/index/img/portfolio/my.png";
title = "我的";
subTitle = "我的排名及评论";
break;
case "005":
url = "https://930-test-sh.oss-cn-shanghai.aliyuncs.com/m_image/cincin.jpg";
title = "cincin";
subTitle = "五原路上的小清吧";
break;
case "006":
url = "https://930-test-sh.oss-cn-shanghai.aliyuncs.com/m_image/project_w.jpg";
title = "whisky";
subTitle = "如果你热爱whisky,来这里就对了";
break;
case "007":
url = "/index/img/portfolio/huxi.jpg";
title = "呼吸";
subTitle = "经历组成人生。我们的记忆并非生命中每时每刻的客观积累,而是根据特定时刻编排的故事";
break;
case "008":
url = "https://930-test-sh.oss-cn-shanghai.aliyuncs.com/m_image/menghuanhua.jpg";
title = "梦幻花";
subTitle = "觉得痛苦的时候,你就想着,因为这痛苦而成长了一步。这样的话,就能迎来美好的一年了吧。";
break;
}
model.addAttribute("url",url);
model.addAttribute("title",title);
model.addAttribute("subTitle",subTitle);
return "discover/item";
}
}
package cn.com.fun.nyxkey.api.web.controller;
package cn.com.fun.nyxkey.api.web.controller;
import cn.com.fun.nyxkey.api.domain.Rockwell_userT_user;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@Controller
@RequestMapping("/")
public class IndexController extends BaseController{
/**
* code by jscat 20200410
*/
@RequestMapping(value="/index",method=RequestMethod.GET)
public String index(Model model){
// model.addAttribute("collector","");
Rockwell_userT_user user = super.getUser();
if(null != user){
model.addAttribute("user",user);
}
return "index";
}
@RequestMapping(value="/",method=RequestMethod.GET)
public String index_default(Model model){
// model.addAttribute("collector","");
Rockwell_userT_user user = super.getUser();
if(null != user){
model.addAttribute("user",user);
}
return "index";
}
@RequestMapping(value="/login",method=RequestMethod.GET)
public String login() {
return "login";
}
@RequestMapping(value="/register",method=RequestMethod.GET)
public String regist() {
return "register";
}
}
\ No newline at end of file
package cn.com.fun.nyxkey.api.web.controller; package cn.com.fun.nyxkey.api.web.controller;
package cn.com.fun.nyxkey.api.web.controller; package cn.com.fun.nyxkey.api.web.controller;
import cn.com.fun.nyxkey.api.common.Constants;
import cn.com.fun.nyxkey.api.common.ExceptionMsg;
import cn.com.fun.nyxkey.api.common.JSONResult; import cn.com.fun.nyxkey.api.common.JSONResult;
import cn.com.fun.nyxkey.api.domain.Rockwell_userT_user;
import cn.com.fun.nyxkey.api.service.*; import cn.com.fun.nyxkey.api.service.*;
import cn.com.fun.nyxkey.api.web.common.ResponseHelper; import cn.com.fun.nyxkey.api.web.common.ResponseHelper;
...@@ -14,17 +17,21 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -14,17 +17,21 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import static cn.com.fun.nyxkey.api.utils.BaseUtils.cookieSign;
import static cn.com.fun.nyxkey.api.utils.BaseUtils.getSession;
/** /**
* Created by jscat on 2020-02-17. * Created by jscat on 2020-02-17.
*/ */
@RestController @RestController
@RequestMapping("/api") @RequestMapping("/api")
public class UserApiController { public class UserApiController extends BaseController {
private static final Logger LOGGER = LoggerFactory.getLogger(UserApiController.class); private static final Logger LOGGER = LoggerFactory.getLogger(UserApiController.class);
...@@ -73,4 +80,20 @@ public class UserApiController { ...@@ -73,4 +80,20 @@ public class UserApiController {
return userService.Rockwell_userServiceGetT_userinfo(userid); return userService.Rockwell_userServiceGetT_userinfo(userid);
} }
@RequestMapping(value = "/login", method = RequestMethod.POST)
public JSONResult login(Rockwell_userT_user user, HttpServletResponse response) {
LOGGER.debug("======================/nyx/login");
JSONResult json = userService.webLogin(user);
Rockwell_userT_user loginUser = (Rockwell_userT_user)json.getData();
if(loginUser != null)
{
Cookie cookie = new Cookie(Constants.LOGIN_SESSION_KEY, cookieSign(loginUser.getId().toString()));
cookie.setMaxAge(Constants.COOKIE_TIMEOUT);
cookie.setPath("/");
response.addCookie(cookie);
getSession().setAttribute(Constants.LOGIN_SESSION_KEY, loginUser);
}
return new JSONResult(ExceptionMsg.SUCCESS, "index");
}
} }
server: server:
...@@ -7,7 +7,7 @@ spring: ...@@ -7,7 +7,7 @@ spring:
profiles: profiles:
active: @application.active.profile@ active: @application.active.profile@
resources: resources:
static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ static-locations: classpath:/META-INF/resources/, classpath:/resources/, classpath:/static/, classpath:/public/, classpath:/templates/
application: application:
name: nyx-api name: nyx-api
jackson: jackson:
...@@ -16,6 +16,8 @@ spring: ...@@ -16,6 +16,8 @@ spring:
bootstrap-servers: 10.29.180.87:9092,10.29.180.88:9092,10.29.180.89:9092 bootstrap-servers: 10.29.180.87:9092,10.29.180.88:9092,10.29.180.89:9092
consumer: consumer:
group-id: udsp group-id: udsp
thymeleaf:
cache: false
logging: logging:
file: log/server.log file: log/server.log
......
body
body
{
padding-top: 50px;
background-color: #fff;
}
.navbar
{
min-height: 50px;
}
.navbar-default
{
border-bottom: none;
background-color: white;
}
.navbar-default .navbar-nav > li > a
{
padding-top: 14px;
padding-bottom: 14px;
color: #959595;
}
.navbar-default .navbar-nav > li > a:hover
{
color: #333;
}
.navbar-brand
{
height: 50px;
padding-top: 7px;
padding-bottom: 7px;
}
.navbar-brand > img
{
width: 95px;
height: 36px;
}
footer
{
font-size: 13px;
color: #666
padding-bottom: 10px;
background: white;
}
footer > a
{
color: black;
}
footer > p
{
margin-bottom: 10px;
}
.img-responsive
{
margin: 0 auto;
}
.banner
{
height: 500px;
background-image: url(../img/banner.png);
background-repeat: no-repeat;
background-position: center center;
background-size: cover; /* <------ */
}
.banner > .media
{
width: 758px;
margin-top: 150px;
}
.banner > .media > .media-left > img
{
width: 420px;
height: 233px;
}
.banner .media-body .title
{
font-size: 30px;
}
.banner .media-body .detail
{
font-size: 12px;
line-height: 150%;
margin-top: 5px;
margin-bottom: 15px;
}
.banner p
{
color: white;
}
.banner h1
{
color: white;
}
.banner a
{
color: white;
border-width: 1px;
border-style: solid;
background-color: transparent;
}
.banner .ms-button
{
padding: 10px 40px;
}
.banner .xs-button
{
padding: 10px 130px;
}
.features
{
margin-top: 40px;
}
.features img
{
width: 60px;
height: 60px;
margin-top: 40px;
}
.features .title
{
font-size: 20px;
margin-top: 20px;
}
.features .description
{
font-size: 13px;
line-height: 150%;
margin-top: 20px;
color: #666;
}
.social
{
margin-top: 80px;
}
.qrcode
{
width: 100px;
height: 100px;
margin-top: 40px;
}
.qrcode-text
{
margin-top: 10px;
}
.qrcode-text img
{
width: 100px;
height: 28px;
}
.target-fix
{
position: relative;
top: -50px;
display: block;
overflow: hidden;
height: 0;
}
\ No newline at end of file
/*!
/*!
* Start Bootstrap - Freelancer v3.3.7+1 (http://startbootstrap.com/template-overviews/freelancer)
* Copyright 2013-2016 Start Bootstrap
* Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE)
*/body{font-family:Lato,'Helvetica Neue',Helvetica,Arial,sans-serif;overflow-x:hidden}a,a.active,a:active,a:focus,a:hover{color:#18BC9C;outline:0}h1,h2,h3,h4,h5,h6{font-family:Montserrat,"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700}hr.star-light,hr.star-primary{padding:0;border:none;border-top:solid 5px;text-align:center;max-width:250px;margin:25px auto 30px}hr.star-light:after,hr.star-primary:after{content:"\f005";font-family:FontAwesome;display:inline-block;position:relative;top:-.8em;font-size:2em;padding:0 .25em}.navbar-custom,header .intro-text .name{font-family:Montserrat,"Helvetica Neue",Helvetica,Arial,sans-serif;text-transform:none}hr.star-light{border-color:#fff}hr.star-light:after{background-color:#18BC9C;color:#fff}hr.star-primary{border-color:#2C3E50}hr.star-primary:after{background-color:#fff;color:#2C3E50}.navbar-custom .navbar-brand,.navbar-custom .navbar-brand.active,.navbar-custom .navbar-brand:active,.navbar-custom .navbar-brand:focus,.navbar-custom .navbar-brand:hover,.navbar-custom .navbar-nav li a,header{color:#fff}.img-centered{margin:0 auto}header{text-align:center;background:#18BC9C}header .container{padding-top:100px;padding-bottom:50px}header img{display:block;margin:0 auto 20px}header .intro-text .name{display:block;font-weight:700;font-size:2em}header .intro-text .skills{font-size:1.25em;font-weight:300}@media (min-width:768px){header .container{padding-top:200px;padding-bottom:100px}header .intro-text .name{font-size:4.75em}header .intro-text .skills{font-size:1.75em}}.navbar-custom{background:#2C3E50;font-weight:700;border:none}.navbar-custom a:focus{outline:0}.navbar-custom .navbar-nav{letter-spacing:1px}.navbar-custom .navbar-nav li a:hover{color:#18BC9C;outline:0}.navbar-custom .navbar-nav li a:active,.navbar-custom .navbar-nav li a:focus{color:#fff}.navbar-custom .navbar-nav li.active a,.navbar-custom .navbar-nav li.active a:active,.navbar-custom .navbar-nav li.active a:focus,.navbar-custom .navbar-nav li.active a:hover{color:#fff;background:#18BC9C}.navbar-custom .navbar-toggle{color:#fff;text-transform:none;font-size:10px;border-color:#fff}.navbar-custom .navbar-toggle:focus,.navbar-custom .navbar-toggle:hover{background-color:#18BC9C;color:#fff;border-color:#18BC9C}@media (min-width:768px){.navbar-custom{padding:25px 0;-webkit-transition:padding .3s;-moz-transition:padding .3s;transition:padding .3s}.navbar-custom .navbar-brand{font-size:2em;-webkit-transition:all .3s;-moz-transition:all .3s;transition:all .3s}.navbar-custom.affix{padding:10px 0}.navbar-custom.affix .navbar-brand{font-size:1.5em}}section{padding:100px 0}section h2{margin:0;font-size:3em}section.success{background:#18BC9C;color:#fff}@media (max-width:767px){section{padding:75px 0}section.first{padding-top:75px}}#portfolio .portfolio-item{margin:0 0 15px;right:0}#portfolio .portfolio-item .portfolio-link{display:block;position:relative;max-width:400px;margin:0 auto}#portfolio .portfolio-item .portfolio-link .caption{background:rgba(24,188,156,.9);position:absolute;width:100%;height:100%;opacity:0;transition:all ease .5s;-webkit-transition:all ease .5s;-moz-transition:all ease .5s}#portfolio .portfolio-item .portfolio-link .caption:hover{opacity:1}#portfolio .portfolio-item .portfolio-link .caption .caption-content{position:absolute;width:100%;height:20px;font-size:20px;text-align:center;top:50%;margin-top:-12px;color:#fff}.btn-social,.scroll-top,.scroll-top .btn{width:50px;height:50px}#portfolio .portfolio-item .portfolio-link .caption .caption-content i{margin-top:-12px}#portfolio .portfolio-item .portfolio-link .caption .caption-content h3,#portfolio .portfolio-item .portfolio-link .caption .caption-content h4{margin:0}#portfolio *{z-index:2}@media (min-width:767px){#portfolio .portfolio-item{margin:0 0 30px}}.floating-label-form-group{position:relative;margin-bottom:0;padding-bottom:.5em;border-bottom:1px solid #eee}.floating-label-form-group input,.floating-label-form-group textarea{z-index:1;position:relative;padding-right:0;padding-left:0;border:none;border-radius:0;font-size:1.5em;background:0 0;box-shadow:none!important;resize:none}.floating-label-form-group label{display:block;z-index:0;position:relative;top:2em;margin:0;font-size:.85em;line-height:1.764705882em;vertical-align:middle;vertical-align:baseline;opacity:0;-webkit-transition:top .3s ease,opacity .3s ease;-moz-transition:top .3s ease,opacity .3s ease;-ms-transition:top .3s ease,opacity .3s ease;transition:top .3s ease,opacity .3s ease}.floating-label-form-group:not(:first-child){padding-left:14px;border-left:1px solid #eee}.floating-label-form-group-with-value label{top:0;opacity:1}.floating-label-form-group-with-focus label{color:#18BC9C}form .row:first-child .floating-label-form-group{border-top:1px solid #eee}.footer-below{color:#fff}.footer-below h3{margin-bottom:30px}.footer-below .footer-above{padding-top:50px;background-color:#2C3E50}footer .footer-col{margin-bottom:50px}footer .footer-below{padding:25px 0;background-color:#233140}.btn-outline{color:#fff;font-size:20px;border:2px solid #fff;background:0 0;transition:all .3s ease-in-out;margin-top:15px}.btn-outline.active,.btn-outline:active,.btn-outline:focus,.btn-outline:hover{color:#18BC9C;background:#fff;border:2px solid #fff}.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.open .dropdown-toggle.btn-primary,.open .dropdown-toggle.btn-success{background-image:none}.btn-primary{color:#fff;/*background-color:#2C3E50;border-color:#2C3E50;*/font-weight:700}.btn-primary.active,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open .dropdown-toggle.btn-primary{color:#fff;/*background-color:#1a242f;border-color:#161f29*/}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#2C3E50;border-color:#2C3E50}.btn-primary .badge{color:#2C3E50;background-color:#fff}.btn-success{color:#fff;background-color:#18BC9C;border-color:#18BC9C;font-weight:700}.btn-success.active,.btn-success:active,.btn-success:focus,.btn-success:hover,.open .dropdown-toggle.btn-success{color:#fff;background-color:#128f76;border-color:#11866f}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#18BC9C;border-color:#18BC9C}.btn-success .badge{color:#18BC9C;background-color:#fff}.btn-social{display:inline-block;border:2px solid #fff;border-radius:100%;text-align:center;font-size:20px;line-height:45px}.btn.active,.btn:active,.btn:focus{outline:0}.scroll-top{position:fixed;right:2%;bottom:2%;z-index:1049}.scroll-top .btn{font-size:20px;border-radius:100%;line-height:28px}.scroll-top .btn:focus{outline:0}.portfolio-modal .modal-content{border-radius:0;background-clip:border-box;-webkit-box-shadow:none;box-shadow:none;border:none;min-height:100%;padding:100px 0;text-align:center}.portfolio-modal .modal-content h2{margin:0;font-size:3em}.portfolio-modal .modal-content img{margin-bottom:30px}.portfolio-modal .modal-content .item-details{margin:30px 0}.portfolio-modal .close-modal{position:absolute;width:75px;height:75px;background-color:transparent;top:25px;right:25px;cursor:pointer}.portfolio-modal .close-modal:hover{opacity:.3}.portfolio-modal .close-modal .lr{height:75px;width:1px;margin-left:35px;background-color:#2C3E50;transform:rotate(45deg);-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);z-index:1051}.portfolio-modal .close-modal .lr .rl{height:75px;width:1px;background-color:#2C3E50;transform:rotate(90deg);-ms-transform:rotate(90deg);-webkit-transform:rotate(90deg);z-index:1052}.portfolio-modal .modal-backdrop{opacity:0;display:none}
\ No newline at end of file
$(function() {
$(function() {
$("#contactForm input,#contactForm textarea").jqBootstrapValidation({
preventSubmit: true,
submitError: function($form, event, errors) {
// additional error messages or events
},
submitSuccess: function($form, event) {
// Prevent spam click and default submit behaviour
$("#btnSubmit").attr("disabled", true);
event.preventDefault();
// get values from FORM
var name = $("input#name").val();
var email = $("input#email").val();
var phone = $("input#phone").val();
var message = $("textarea#message").val();
var firstName = name; // For Success/Failure Message
// Check for white space in name for Success/Fail message
if (firstName.indexOf(' ') >= 0) {
firstName = name.split(' ').slice(0, -1).join(' ');
}
$.ajax({
url: "././mail/contact_me.php",
type: "POST",
data: {
name: name,
phone: phone,
email: email,
message: message
},
cache: false,
success: function() {
// Enable button & show success message
$("#btnSubmit").attr("disabled", false);
$('#success').html("<div class='alert alert-success'>");
$('#success > .alert-success').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;")
.append("</button>");
$('#success > .alert-success')
.append("<strong>Your message has been sent. </strong>");
$('#success > .alert-success')
.append('</div>');
//clear all fields
$('#contactForm').trigger("reset");
},
error: function() {
// Fail message
$('#success').html("<div class='alert alert-danger'>");
$('#success > .alert-danger').html("<button type='button' class='close' data-dismiss='alert' aria-hidden='true'>&times;")
.append("</button>");
$('#success > .alert-danger').append("<strong>Sorry " + firstName + ", it seems that my mail server is not responding. Please try again later!");
$('#success > .alert-danger').append('</div>');
//clear all fields
$('#contactForm').trigger("reset");
},
});
},
filter: function() {
return $(this).is(":visible");
},
});
$("a[data-toggle=\"tab\"]").click(function(e) {
e.preventDefault();
$(this).tab("show");
});
});
// When clicking on Full hide fail/success boxes
$('#name').focus(function() {
$('#success').html('');
});
// Freelancer Theme JavaScript
// Freelancer Theme JavaScript
(function($) {
"use strict"; // Start of use strict
// jQuery for page scrolling feature - requires jQuery Easing plugin
$('.page-scroll a').bind('click', function(event) {
var $anchor = $(this);
$('html, body').stop().animate({
scrollTop: ($($anchor.attr('href')).offset().top - 50)
}, 1250, 'easeInOutExpo');
event.preventDefault();
});
// Highlight the top nav as scrolling occurs
$('body').scrollspy({
target: '.navbar-fixed-top',
offset: 51
});
// Closes the Responsive Menu on Menu Item Click
$('.navbar-collapse ul li a').click(function(){
$('.navbar-toggle:visible').click();
});
// Offset for Main Navigation
$('#mainNav').affix({
offset: {
top: 100
}
})
// Floating label headings for the contact form
$(function() {
$("body").on("input propertychange", ".floating-label-form-group", function(e) {
$(this).toggleClass("floating-label-form-group-with-value", !!$(e.target).val());
}).on("focus", ".floating-label-form-group", function() {
$(this).addClass("floating-label-form-group-with-focus");
}).on("blur", ".floating-label-form-group", function() {
$(this).removeClass("floating-label-form-group-with-focus");
});
});
})(jQuery); // End of use strict
/*!
/*!
* Start Bootstrap - Freelancer v3.3.7+1 (http://startbootstrap.com/template-overviews/freelancer)
* Copyright 2013-2016 Start Bootstrap
* Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE)
*/
!function(o){"use strict";o(".page-scroll a").bind("click",function(t){var l=o(this);o("html, body").stop().animate({scrollTop:o(l.attr("href")).offset().top-50},1250,"easeInOutExpo"),t.preventDefault()}),o("body").scrollspy({target:".navbar-fixed-top",offset:51}),o(".navbar-collapse ul li a").click(function(){o(".navbar-toggle:visible").click()}),o("#mainNav").affix({offset:{top:100}}),o(function(){o("body").on("input propertychange",".floating-label-form-group",function(t){o(this).toggleClass("floating-label-form-group-with-value",!!o(t.target).val())}).on("focus",".floating-label-form-group",function(){o(this).addClass("floating-label-form-group-with-focus")}).on("blur",".floating-label-form-group",function(){o(this).removeClass("floating-label-form-group-with-focus")})})}(jQuery);
\ No newline at end of file
// Animated Icons
// Animated Icons
// --------------------------
.@{fa-css-prefix}-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear;
}
.@{fa-css-prefix}-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8);
}
@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
// Bordered & Pulled
// Bordered & Pulled
// -------------------------
.@{fa-css-prefix}-border {
padding: .2em .25em .15em;
border: solid .08em @fa-border-color;
border-radius: .1em;
}
.@{fa-css-prefix}-pull-left { float: left; }
.@{fa-css-prefix}-pull-right { float: right; }
.@{fa-css-prefix} {
&.@{fa-css-prefix}-pull-left { margin-right: .3em; }
&.@{fa-css-prefix}-pull-right { margin-left: .3em; }
}
/* Deprecated as of 4.4.0 */
.pull-right { float: right; }
.pull-left { float: left; }
.@{fa-css-prefix} {
&.pull-left { margin-right: .3em; }
&.pull-right { margin-left: .3em; }
}
// Base Class Definition
// Base Class Definition
// -------------------------
.@{fa-css-prefix} {
display: inline-block;
font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
// Fixed Width Icons
// Fixed Width Icons
// -------------------------
.@{fa-css-prefix}-fw {
width: (18em / 14);
text-align: center;
}
/*!
/*!
* Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/
@import "variables.less";
@import "mixins.less";
@import "path.less";
@import "core.less";
@import "larger.less";
@import "fixed-width.less";
@import "list.less";
@import "bordered-pulled.less";
@import "animated.less";
@import "rotated-flipped.less";
@import "stacked.less";
@import "icons.less";
@import "screen-reader.less";
// Icon Sizes
// Icon Sizes
// -------------------------
/* makes the font 33% larger relative to the icon container */
.@{fa-css-prefix}-lg {
font-size: (4em / 3);
line-height: (3em / 4);
vertical-align: -15%;
}
.@{fa-css-prefix}-2x { font-size: 2em; }
.@{fa-css-prefix}-3x { font-size: 3em; }
.@{fa-css-prefix}-4x { font-size: 4em; }
.@{fa-css-prefix}-5x { font-size: 5em; }
// List Icons
// List Icons
// -------------------------
.@{fa-css-prefix}-ul {
padding-left: 0;
margin-left: @fa-li-width;
list-style-type: none;
> li { position: relative; }
}
.@{fa-css-prefix}-li {
position: absolute;
left: -@fa-li-width;
width: @fa-li-width;
top: (2em / 14);
text-align: center;
&.@{fa-css-prefix}-lg {
left: (-@fa-li-width + (4em / 14));
}
}
// Mixins
// Mixins
// --------------------------
.fa-icon() {
display: inline-block;
font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.fa-icon-rotate(@degrees, @rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})";
-webkit-transform: rotate(@degrees);
-ms-transform: rotate(@degrees);
transform: rotate(@degrees);
}
.fa-icon-flip(@horiz, @vert, @rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)";
-webkit-transform: scale(@horiz, @vert);
-ms-transform: scale(@horiz, @vert);
transform: scale(@horiz, @vert);
}
// Only display content to screen readers. A la Bootstrap 4.
//
// See: http://a11yproject.com/posts/how-to-hide-content/
.sr-only() {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
border: 0;
}
// Use in conjunction with .sr-only to only display content when it's focused.
//
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
//
// Credit: HTML5 Boilerplate
.sr-only-focusable() {
&:active,
&:focus {
position: static;
width: auto;
height: auto;
margin: 0;
overflow: visible;
clip: auto;
}
}
/* FONT PATH
/* FONT PATH
* -------------------------- */
@font-face {
font-family: 'FontAwesome';
src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),
url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
// src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
font-weight: normal;
font-style: normal;
}
// Rotated & Flipped Icons
// Rotated & Flipped Icons
// -------------------------
.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
// Hook for IE8-9
// -------------------------
:root .@{fa-css-prefix}-rotate-90,
:root .@{fa-css-prefix}-rotate-180,
:root .@{fa-css-prefix}-rotate-270,
:root .@{fa-css-prefix}-flip-horizontal,
:root .@{fa-css-prefix}-flip-vertical {
filter: none;
}
// Screen Readers
// Screen Readers
// -------------------------
.sr-only { .sr-only(); }
.sr-only-focusable { .sr-only-focusable(); }
// Stacked Icons
// Stacked Icons
// -------------------------
.@{fa-css-prefix}-stack {
position: relative;
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
vertical-align: middle;
}
.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
position: absolute;
left: 0;
width: 100%;
text-align: center;
}
.@{fa-css-prefix}-stack-1x { line-height: inherit; }
.@{fa-css-prefix}-stack-2x { font-size: 2em; }
.@{fa-css-prefix}-inverse { color: @fa-inverse; }
// Spinning Icons
// Spinning Icons
// --------------------------
.#{$fa-css-prefix}-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear;
}
.#{$fa-css-prefix}-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8);
}
@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
// Bordered & Pulled
// Bordered & Pulled
// -------------------------
.#{$fa-css-prefix}-border {
padding: .2em .25em .15em;
border: solid .08em $fa-border-color;
border-radius: .1em;
}
.#{$fa-css-prefix}-pull-left { float: left; }
.#{$fa-css-prefix}-pull-right { float: right; }
.#{$fa-css-prefix} {
&.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
&.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
}
/* Deprecated as of 4.4.0 */
.pull-right { float: right; }
.pull-left { float: left; }
.#{$fa-css-prefix} {
&.pull-left { margin-right: .3em; }
&.pull-right { margin-left: .3em; }
}
// Base Class Definition
// Base Class Definition
// -------------------------
.#{$fa-css-prefix} {
display: inline-block;
font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
// Fixed Width Icons
// Fixed Width Icons
// -------------------------
.#{$fa-css-prefix}-fw {
width: (18em / 14);
text-align: center;
}
// Icon Sizes
// Icon Sizes
// -------------------------
/* makes the font 33% larger relative to the icon container */
.#{$fa-css-prefix}-lg {
font-size: (4em / 3);
line-height: (3em / 4);
vertical-align: -15%;
}
.#{$fa-css-prefix}-2x { font-size: 2em; }
.#{$fa-css-prefix}-3x { font-size: 3em; }
.#{$fa-css-prefix}-4x { font-size: 4em; }
.#{$fa-css-prefix}-5x { font-size: 5em; }
// List Icons
// List Icons
// -------------------------
.#{$fa-css-prefix}-ul {
padding-left: 0;
margin-left: $fa-li-width;
list-style-type: none;
> li { position: relative; }
}
.#{$fa-css-prefix}-li {
position: absolute;
left: -$fa-li-width;
width: $fa-li-width;
top: (2em / 14);
text-align: center;
&.#{$fa-css-prefix}-lg {
left: -$fa-li-width + (4em / 14);
}
}
// Mixins
// Mixins
// --------------------------
@mixin fa-icon() {
display: inline-block;
font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
@mixin fa-icon-rotate($degrees, $rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})";
-webkit-transform: rotate($degrees);
-ms-transform: rotate($degrees);
transform: rotate($degrees);
}
@mixin fa-icon-flip($horiz, $vert, $rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)";
-webkit-transform: scale($horiz, $vert);
-ms-transform: scale($horiz, $vert);
transform: scale($horiz, $vert);
}
// Only display content to screen readers. A la Bootstrap 4.
//
// See: http://a11yproject.com/posts/how-to-hide-content/
@mixin sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
border: 0;
}
// Use in conjunction with .sr-only to only display content when it's focused.
//
// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
//
// Credit: HTML5 Boilerplate
@mixin sr-only-focusable {
&:active,
&:focus {
position: static;
width: auto;
height: auto;
margin: 0;
overflow: visible;
clip: auto;
}
}
/* FONT PATH
/* FONT PATH
* -------------------------- */
@font-face {
font-family: 'FontAwesome';
src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
font-weight: normal;
font-style: normal;
}
// Rotated & Flipped Icons
// Rotated & Flipped Icons
// -------------------------
.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
// Hook for IE8-9
// -------------------------
:root .#{$fa-css-prefix}-rotate-90,
:root .#{$fa-css-prefix}-rotate-180,
:root .#{$fa-css-prefix}-rotate-270,
:root .#{$fa-css-prefix}-flip-horizontal,
:root .#{$fa-css-prefix}-flip-vertical {
filter: none;
}
// Screen Readers
// Screen Readers
// -------------------------
.sr-only { @include sr-only(); }
.sr-only-focusable { @include sr-only-focusable(); }
// Stacked Icons
// Stacked Icons
// -------------------------
.#{$fa-css-prefix}-stack {
position: relative;
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
vertical-align: middle;
}
.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
position: absolute;
left: 0;
width: 100%;
text-align: center;
}
.#{$fa-css-prefix}-stack-1x { line-height: inherit; }
.#{$fa-css-prefix}-stack-2x { font-size: 2em; }
.#{$fa-css-prefix}-inverse { color: $fa-inverse; }
/*!
/*!
* Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/
@import "variables";
@import "mixins";
@import "path";
@import "core";
@import "larger";
@import "fixed-width";
@import "list";
@import "bordered-pulled";
@import "animated";
@import "rotated-flipped";
@import "stacked";
@import "icons";
@import "screen-reader";
This source diff could not be displayed because it is too large. You can view the blob instead.
var mainActiveId='home';
var mainActiveId='home';
var firstUrl = null;//第一个页面
var secondUrl = null;//第二个页面
function UrlSearch() {
var name,value;
var str=location.href; //取得整个地址栏
var num=str.indexOf("?")
str=str.substr(num+1); //取得所有参数 stringvar.substr(start [, length ]
str = str.replace("&amp;","&");
var arr=str.split("&"); //各个参数放到数组里
for(var i=0;i < arr.length;i++){
num=arr[i].indexOf("=");
if(num>0){
name=arr[i].substring(0,num);
value=arr[i].substr(num+1);
this[name]=value;
}
}
}
function replaceEmpty(str) {
if(isEmpty(str)){
return '';
}
return str;
}
function isEmpty(str) {
if(str=="undefined" || str==null || str.length == 0) {
return true;
}
return false;
}
function addCookie(name,value,expiresHours){
var cookieString=name+"="+escape(value)+";path=/";
//判断是否设置过期时间
if(expiresHours>0){
var date=new Date();
date.setTime(date.getTime+expiresHours*3600*1000);
cookieString=cookieString+";expires="+date.toGMTString()+";path=/";
}
document.cookie=cookieString;
}
function getCookie(name){
var strCookie=document.cookie;
var arrCookie=strCookie.split("; ");
for(var i=0;i<arrCookie.length;i++){
var arr=arrCookie[i].split("=");
if(arr[0]==name)return arr[1];
}
return "";
}
function deleteCookie(name){
var date=new Date();
date.setTime(date.getTime()-10000);
document.cookie=name+"=v; expires="+date.toGMTString();
}
function getFileName(param){
  var myFile = document.getElementById(param).value;
  var length = myFile.length;
  var x = myFile.lastIndexOf("\\");
  x++;
  var fileName = myFile.substring(x,length);
$("#"+param + "Name").val(fileName);
  }
function locationUrl(url,activeId){
//每次跳转切换页面时,设置该页面page=1
page =1;
//滚动条设置为页面顶部。不设置的话,假设第一个页面加载了10页,第二个页面切换过去后,由于滚动条在下边,会一直加载10页才停止
window.scrollTo(0,0);
if(mainActiveId != null && mainActiveId != "" && activeId != null && activeId != ""){
$("#"+mainActiveId).removeAttr("class");
$("#"+activeId).attr("class", "active");
mainActiveId = activeId;
}
goUrl(url,null);
}
var xmlhttp = new getXMLObject();
function goUrl(url,params) {
fixUrl(url,params);
if(xmlhttp) {
//var params = "";
xmlhttp.open("POST",url,true);
xmlhttp.onreadystatechange = handleServerResponse;
xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');
xmlhttp.send(params);
}
}
//XML OBJECT
function getXMLObject() {
var xmlHttp = false;
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP") // For Old Microsoft
// Browsers
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP") // For Microsoft
// IE 6.0+
} catch (e2) {
xmlHttp = false // No Browser accepts the XMLHTTP Object then false
}
}
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest(); // For Mozilla, Opera Browsers
}
return xmlHttp; // Mandatory Statement returning the ajax object created
}
function fixUrl(url, params){
if(params != null){
url = url + "?" + params;
}
if(firstUrl == null){
firstUrl = url;
}else if(secondUrl == null){
secondUrl = url;
}else{
if(flag == 1){
firstUrl = url;
flag = 2;
}else{
secondUrl = url;
flag = 1;
}
}
}
function handleServerResponse() {
if (xmlhttp.readyState == 4) {
//document.getElementById("mainSection").innerHTML =xmlhttp.responseText;
var text = xmlhttp.responseText;
if(text.indexOf("<title>Favorites error Page</title>") >= 0){
window.location.href="/error.html";
}else{
$("#content").html(xmlhttp.responseText);
}
}
}
function smartFavoritesFun(title,description,selectLabelName){
if ($('#userId').val() == "" || $('#userId').val() == 0) {
return;
}
$.ajax({
type: "POST",
url:"/collect/getFavoriteResult",
data:{'title':title,'description':description},
success: function(maps) {
var favoritesStr = "";
for(var i = 0; i < maps.favoritesList.length; i++){
if(maps.favoritesList[i].id == maps.favoritesResult){
favoritesStr += "<a id=\"smartFavorites" + maps.favoritesList[i].id + "\""
+ " href=\"javascript:void(0);\" class=\"active\" onclick=\"switchFavorites(this.id,\'" + selectLabelName + "\'" + ")\">"
+ maps.favoritesList[i].name + "</a>";
}else{
favoritesStr += "<a id=\"smartFavorites" + maps.favoritesList[i].id + "\""
+ " href=\"javascript:void(0);\" onclick=\"switchFavorites(this.id,\'" + selectLabelName + "\'" + ")\">"
+ maps.favoritesList[i].name + "</a>";
}
}
$("#smartFavoritesList").append(favoritesStr);
$("#"+selectLabelName).val(maps.favoritesResult);
},
error: function (jqXHR, textStatus, errorThrown) {
console.log(jqXHR.responseText);
console.log(jqXHR.status);
console.log(jqXHR.readyState);
console.log(jqXHR.statusText);
console.log(textStatus);
console.log(errorThrown);
}
});
}
function switchFavorites(id,selectLabelName){
var favoritesId = id.substring(14);
$("#"+selectLabelName).val(favoritesId);
}
\ No newline at end of file
var page = 1;
var page = 1;
function loadMore(){
$.ajax({
async: false,
type: 'POST',
dataType: 'json',
data:'page='+page,
url: "/letter/getLetterList",
error : function(XMLHttpRequest, textStatus, errorThrown) {
console.log(XMLHttpRequest);
console.log(textStatus);
console.log(errorThrown);
},
success: function(letters){
listLetter(letters);
if(letters.length > 0){
reload();
}
page++;
}
});
}
function listLetter(letters){
var letterList = '';
for(var i=0; i<letters.length; i++){
var item =
"<li>" +
"<div class=\"timeline-panel\">"+
"<div class=\"popover right\">"+
"<div class=\"popover-content\">"+
"<div class=\"table-grid table-grid-align-middle mb\">"+
"<div class=\"col col-xxs\">"+
"<a href=\"javascript:void(0);\" onclick=\"locationUrl(\'/user/"+ letters[i].sendUserId + "/0\',\'\');\">"+
"<img src=\""+(letters[i].profilePicture==null?'img/favicon.png':letters[i].profilePicture) +"\" alt=\"\" class=\"media-object img-circle thumb48\" />"+
"</a>"+
"</div>"+
"<div class=\"col\">"+
"<p class=\"m0\">"+
"<a href=\"javascript:void(0);\" class=\"text-muted\" onclick=\"locationUrl(\'/user/" + letters[i].sendUserId + "/0\',\'\');\">"+
"<strong class=\"send-user-name\">"+letters[i].sendUserName+"</strong>"+
"</a>"+
"<small class=\"ml\">"+
"<span>"+letters[i].createTime+"</span>"+
"给我"+(letters[i].type == 'REPLY'?'回复':'发')+"了私信"+
"</small>"+
"</p>"+
"</div>"+
"<div class=\"col text-right\">"+
"<!-- <div class=\"btn btn-default\" data-toggle=\"modal\" data-target=\"#modal-revoke\">撤销</div> -->"+
"<div class=\"btn btn-default btn-reply\">回复</div>"+
"</div>"+
"</div>"+
"<p>"+(letters[i].type == 'REPLY'?'回复:':'')+letters[i].content+"</p>"+
"<div class=\"collapse\">"+
"<div class=\"media\">"+
"<div class=\"media-body\">"+
"<form data-parsley-validate=\"true\" onsubmit=\"return false\">"+
"<div class=\"input-group\">"+
"<input type=\"text\" class=\"form-control\" required=\"required\" placeholder=\"输入回复...\" />"+
"<span class=\"input-group-btn\">"+
"<button type=\"submit\" class=\"btn btn-default\" onclick=\"sendLetter('reply','"+letters[i].id+"',this)\" value=\""+letters[i].id+"\">发送</button>"+
"</span>"+
"</div>"+
"</form>"+
"</div>"+
"</div>"+
"</div>"+
"</div>"+
"</div>"+
"</div>"+
"</li>";
letterList = letterList + item;
}
$("#letterList").append(letterList);
}
// 发送私信
function sendLetter(type,pid,obj){
var content = '';
var receiveUserId = '';
var ok = false;
var msg = '';
if("original" == type){
content = $("#letterContent").val();
receiveUserId = $("#userId").val();
ok = $('#sendLetterForm').parsley().isValid({force: true});
msg = '发送';
}else{
content = $(obj).parent().parent().children(0).val();
var _this = $(obj).parent().parent().parent().parent().parent().parent();
var _form = $(obj).parent().parent().parent();
ok = _form.parsley().isValid({force: true});
msg = '回复';
}
if(!ok){
return;
}
var url = '/letter/sendLetter';
$.ajax({
url : url,
data : {'content':content,'sendType':type,'receiveUserId':receiveUserId,'pid':pid},
type : 'POST',
dataType : "json",
error : function(XMLHttpRequest, textStatus, errorThrown) {
},
success : function(data) {
if(data.rspCode == '000000'){
if("original" == type){
$("#sendLetterBtn").attr("aria-hidden","true");
$("#sendLetterBtn").attr("data-dismiss","modal");
$("#sendLetterForm")[0].reset();
}else{
_form[0].reset();
if( _this.hasClass('in')){
_this.removeClass('in');
}
}
toastr.success(msg+'私信成功', '操作成功');
}else{
toastr.error(data.rspMsg, '操作失败');
}
}
});
}
var page=1;
var page=1;
var gconfig;
var gfollows;
//关注某人或取消关注某人
function changeFollow(followIdStr){
var userId = document.getElementById("userId").value;
var textStr = document.getElementById(followIdStr).innerText;
var status = "";
if(textStr == "关注"){
status = "follow";
}else if(textStr == "取消关注"){
status = "unfollow";
}
var followId = followIdStr.substring(6);
if(userId != "0"){
$.ajax({
async: false,
type: 'POST',
dataType: 'json',
data:{'status':status,'userId':followId},
url: '/follow/changeFollowStatus',
error : function(XMLHttpRequest, textStatus, errorThrown) {
console.log(XMLHttpRequest);
console.log(textStatus);
console.log(errorThrown);
},
success: function(response){
if(response.rspCode == '000000'){
if(textStr == "关注"){
document.getElementById(followIdStr).innerText = "取消关注";
}else{
document.getElementById(followIdStr).innerText = "关注";
}
}
}
});
}else{
window.location.href="/login";
}
}
function loadFollows(){
$.ajax({
async: false,
type: 'POST',
dataType: 'json',
url: '/user/getFollows',
error : function(XMLHttpRequest, textStatus, errorThrown) {
console.log(XMLHttpRequest);
console.log(textStatus);
console.log(errorThrown);
},
success: function(follows){
gfollows=follows;
initFollows(follows);
}
});
}
function initFollows(follows){
$("#friends").html("");
var friends="";
for(var i=0;i<follows.length;i++){
var name="<a href=\"javascript:void(0);\" onclick=\"showAt('"+follows[i]+"')\" >"+follows[i]+"</a>";
friends=friends+name;
}
$("#friends").append(friends);
}
function loadConfig(){
$.ajax({
async: true,
type: 'POST',
dataType: 'json',
url: '/user/getConfig',
error : function(XMLHttpRequest, textStatus, errorThrown) {
console.log(XMLHttpRequest);
console.log(textStatus);
console.log(errorThrown);
},
success: function(config){
gconfig=config;
$("#defaultCollectType").html("");
$("#defaultModel").html("");
$("#defaultFavorites").html("");
$("#defaultClear").html("");
initConfigDatas(config);
//设置默认选中收藏夹
obj = document.getElementById("layoutFavoritesName");
for(i=0;i<obj.length;i++){
if(obj[i].value == config.defaultFavorties){
obj[i].selected = true;
$("#defaultFavorites").append("<strong>默认收藏夹(" +obj[i].text +")");
}
}
}
});
}
function initConfigDatas(config){
$("#defaultCollectType").append("<strong>默认"+config.collectTypeName+"收藏(点击切换)</strong>")
$("#defaultModel").append("<strong>收藏时显示" +config.modelName+"模式</strong>");
$("#defaultClear").append("<strong>"+config.clearName+"清除无效文章</strong>");
}
function loadFavorites(){
$.ajax({
async: false,
type: 'POST',
dataType: 'json',
url: '/favorites/getFavorites/0',
error : function(XMLHttpRequest, textStatus, errorThrown) {
console.log(XMLHttpRequest);
console.log(textStatus);
console.log(errorThrown);
},
success: function(favorites){
$("#layoutFavoritesName").html("");
initFavorites(favorites);
}
});
}
function initFavorites(favorites){
$("#favoritesSelect").empty();
for(var i=0;i<favorites.length;i++){
var id = favorites[i].id ;
var name = favorites[i].name;
//collct favorites
$("#favoritesSelect").append("<option value=\"" + id + "\">" + name + "</option>");
$("#layoutFavoritesName").append("<option value=\"" + id + "\">" + name + "</option>");
}
}
function lookAroundInit(){
if ($('#userId').val() != "" && $('#userId').val() != 0) {
loadConfig();
loadFavorites();
}
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
/* ========================================================================
/* ========================================================================
Component: layout
========================================================================== */
body,
.wrapper > section {
background-color: #f5f7fa;
}
.wrapper > .aside {
background-color: #2c3e50;
}
/* ========================================================================
Component: top-navbar
========================================================================== */
.topnavbar {
background-color: #ffffff;
}
.topnavbar .navbar-header {
background-color: transparent;
background-image: -webkit-linear-gradient(left, #2c3e50 0%, #2c3e50 100%);
background-image: -o-linear-gradient(left, #2c3e50 0%, #2c3e50 100%);
background-image: linear-gradient(to right, #2c3e50 0%, #2c3e50 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2c3e50', endColorstr='#ff2c3e50', GradientType=1);
}
@media only screen and (min-width: 768px) {
.topnavbar .navbar-header {
background-image: none;
}
}
.topnavbar .navbar-nav > li > a,
.topnavbar .navbar-nav > .open > a {
color: #2c3e50;
}
.topnavbar .navbar-nav > li > a:hover,
.topnavbar .navbar-nav > .open > a:hover,
.topnavbar .navbar-nav > li > a:focus,
.topnavbar .navbar-nav > .open > a:focus {
color: #9c9c9c;
}
.topnavbar .navbar-nav > .active > a,
.topnavbar .navbar-nav > .open > a,
.topnavbar .navbar-nav > .active > a:hover,
.topnavbar .navbar-nav > .open > a:hover,
.topnavbar .navbar-nav > .active > a:focus,
.topnavbar .navbar-nav > .open > a:focus {
background-color: transparent;
}
.topnavbar .navbar-nav > li > [data-toggle='navbar-search'] {
color: #9c9c9c;
}
.topnavbar .nav-wrapper {
background-color: #2c3e50;
background-image: -webkit-linear-gradient(left, #2c3e50 0%, #2c3e50 100%);
background-image: -o-linear-gradient(left, #2c3e50 0%, #2c3e50 100%);
background-image: linear-gradient(to right, #2c3e50 0%, #2c3e50 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2c3e50', endColorstr='#ff2c3e50', GradientType=1);
}
@media only screen and (min-width: 768px) {
.topnavbar {
background-color: #2c3e50;
background-image: -webkit-linear-gradient(left, #2c3e50 0%, #2c3e50 100%);
background-image: -o-linear-gradient(left, #2c3e50 0%, #2c3e50 100%);
background-image: linear-gradient(to right, #2c3e50 0%, #2c3e50 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2c3e50', endColorstr='#ff2c3e50', GradientType=1);
}
.topnavbar .navbar-nav > .open > a,
.topnavbar .navbar-nav > .open > a:hover,
.topnavbar .navbar-nav > .open > a:focus {
box-shadow: 0 -3px 0 rgba(255, 255, 255, 0.5) inset;
}
.topnavbar .navbar-nav > li > a,
.topnavbar .navbar-nav > .open > a {
color: #9c9c9c;
}
.topnavbar .navbar-nav > li > a:hover,
.topnavbar .navbar-nav > .open > a:hover,
.topnavbar .navbar-nav > li > a:focus,
.topnavbar .navbar-nav > .open > a:focus {
color: #ffffff;
}
}
/* ========================================================================
Component: sidebar
========================================================================== */
.sidebar {
background-color: #2c3e50;
}
.sidebar .nav-heading {
color: #919da8;
}
.sidebar .nav > li > a,
.sidebar .nav > li > .nav-item {
color: #9c9c9c;
}
.sidebar .nav > li > a:focus,
.sidebar .nav > li > .nav-item:focus,
.sidebar .nav > li > a:hover,
.sidebar .nav > li > .nav-item:hover {
color: #ffffff;
}
.sidebar .nav > li > a > em,
.sidebar .nav > li > .nav-item > em {
color: inherits;
}
.sidebar .nav > li.active,
.sidebar .nav > li.open,
.sidebar .nav > li.active > a,
.sidebar .nav > li.open > a,
.sidebar .nav > li.active .nav,
.sidebar .nav > li.open .nav {
background-color: #18bc9c;
color: #ffffff;
}
.sidebar .nav > li.active > a > em,
.sidebar .nav > li.open > a > em {
color: #ffffff;
}
.sidebar .nav > li.active {
border-left-color: #ffffff;
}
.sidebar-subnav {
background-color: #2c3e50;
}
.sidebar-subnav > .sidebar-subnav-header {
color: #9c9c9c;
}
.sidebar-subnav > li > a,
.sidebar-subnav > li > .nav-item {
color: #9c9c9c;
}
.sidebar-subnav > li > a:focus,
.sidebar-subnav > li > .nav-item:focus,
.sidebar-subnav > li > a:hover,
.sidebar-subnav > li > .nav-item:hover {
color: #ffffff;
}
.sidebar-subnav > li.active > a,
.sidebar-subnav > li.active > .nav-item {
color: #ffffff;
}
.sidebar-subnav > li.active > a:after,
.sidebar-subnav > li.active > .nav-item:after {
border-color: #ffffff;
background-color: #ffffff;
}
/* ========================================================================
Component: offsidebar
========================================================================== */
.offsidebar {
border-left: 1px solid #cccccc;
background-color: #ffffff;
color: #515253;
}
;(function ( $, window, document, undefined ) {
;(function ( $, window, document, undefined ) {
/**
* animo is a powerful little tool that makes managing CSS animations extremely easy. Stack animations, set callbacks, make magic.
* Modern browsers and almost all mobile browsers support CSS animations (http://caniuse.com/css-animation).
*
* @author Daniel Raftery : twitter/ThrivingKings
* @version 1.0.2
*/
function animo( element, options, callback, other_cb ) {
// Default configuration
var defaults = {
duration: 1,
animation: null,
iterate: 1,
timing: "linear",
keep: false
};
// Browser prefixes for CSS
this.prefixes = ["", "-moz-", "-o-animation-", "-webkit-"];
// Cache the element
this.element = $(element);
this.bare = element;
// For stacking of animations
this.queue = [];
// Hacky
this.listening = false;
// Figure out where the callback is
var cb = (typeof callback == "function" ? callback : other_cb);
// Options can sometimes be a command
switch(options) {
case "blur":
defaults = {
amount: 3,
duration: 0.5,
focusAfter: null
};
this.options = $.extend( defaults, callback );
this._blur(cb);
break;
case "focus":
this._focus();
break;
case "rotate":
defaults = {
degrees: 15,
duration: 0.5
};
this.options = $.extend( defaults, callback );
this._rotate(cb);
break;
case "cleanse":
this.cleanse();
break;
default:
this.options = $.extend( defaults, options );
this.init(cb);
break;
}
}
animo.prototype = {
// A standard CSS animation
init: function(callback) {
var $me = this;
// Are we stacking animations?
if(Object.prototype.toString.call( $me.options.animation ) === '[object Array]') {
$.merge($me.queue, $me.options.animation);
} else {
$me.queue.push($me.options.animation);
}
$me.cleanse();
$me.animate(callback);
},
// The actual adding of the class and listening for completion
animate: function(callback) {
this.element.addClass('animated');
this.element.addClass(this.queue[0]);
this.element.data("animo", this.queue[0]);
var ai = this.prefixes.length;
// Add the options for each prefix
while(ai--) {
this.element.css(this.prefixes[ai]+"animation-duration", this.options.duration+"s");
this.element.css(this.prefixes[ai]+"animation-iteration-count", this.options.iterate);
this.element.css(this.prefixes[ai]+"animation-timing-function", this.options.timing);
}
var $me = this, _cb = callback;
if($me.queue.length>1) {
_cb = null;
}
// Listen for the end of the animation
this._end("AnimationEnd", function() {
// If there are more, clean it up and move on
if($me.element.hasClass($me.queue[0])) {
if(!$me.options.keep) {
$me.cleanse();
}
$me.queue.shift();
if($me.queue.length) {
$me.animate(callback);
}
}
}, _cb);
},
cleanse: function() {
this.element.removeClass('animated');
this.element.removeClass(this.queue[0]);
this.element.removeClass(this.element.data("animo"));
var ai = this.prefixes.length;
while(ai--) {
this.element.css(this.prefixes[ai]+"animation-duration", "");
this.element.css(this.prefixes[ai]+"animation-iteration-count", "");
this.element.css(this.prefixes[ai]+"animation-timing-function", "");
this.element.css(this.prefixes[ai]+"transition", "");
this.element.css(this.prefixes[ai]+"transform", "");
this.element.css(this.prefixes[ai]+"filter", "");
}
},
_blur: function(callback) {
if(this.element.is("img")) {
var svg_id = "svg_" + (((1 + Math.random()) * 0x1000000) | 0).toString(16).substring(1);
var filter_id = "filter_" + (((1 + Math.random()) * 0x1000000) | 0).toString(16).substring(1);
$('body').append('<svg version="1.1" xmlns="http://www.w3.org/2000/svg" id="'+svg_id+'" style="height:0;position:absolute;top:-1000px;"><filter id="'+filter_id+'"><feGaussianBlur stdDeviation="'+this.options.amount+'" /></filter></svg>');
var ai = this.prefixes.length;
while(ai--) {
this.element.css(this.prefixes[ai]+"filter", "blur("+this.options.amount+"px)");
this.element.css(this.prefixes[ai]+"transition", this.options.duration+"s all linear");
}
this.element.css("filter", "url(#"+filter_id+")");
this.element.data("svgid", svg_id);
} else {
var color = this.element.css('color');
var ai = this.prefixes.length;
// Add the options for each prefix
while(ai--) {
this.element.css(this.prefixes[ai]+"transition", "all "+this.options.duration+"s linear");
}
this.element.css("text-shadow", "0 0 "+this.options.amount+"px "+color);
this.element.css("color", "transparent");
}
this._end("TransitionEnd", null, callback);
var $me = this;
if(this.options.focusAfter) {
var focus_wait = window.setTimeout(function() {
$me._focus();
focus_wait = window.clearTimeout(focus_wait);
}, (this.options.focusAfter*1000));
}
},
_focus: function() {
var ai = this.prefixes.length;
if(this.element.is("img")) {
while(ai--) {
this.element.css(this.prefixes[ai]+"filter", "");
this.element.css(this.prefixes[ai]+"transition", "");
}
var $svg = $('#'+this.element.data('svgid'));
$svg.remove();
} else {
while(ai--) {
this.element.css(this.prefixes[ai]+"transition", "");
}
this.element.css("text-shadow", "");
this.element.css("color", "");
}
},
_rotate: function(callback) {
var ai = this.prefixes.length;
// Add the options for each prefix
while(ai--) {
this.element.css(this.prefixes[ai]+"transition", "all "+this.options.duration+"s linear");
this.element.css(this.prefixes[ai]+"transform", "rotate("+this.options.degrees+"deg)");
}
this._end("TransitionEnd", null, callback);
},
_end: function(type, todo, callback) {
var $me = this;
var binding = type.toLowerCase()+" webkit"+type+" o"+type+" MS"+type;
this.element.bind(binding, function() {
$me.element.unbind(binding);
if(typeof todo == "function") {
todo();
}
if(typeof callback == "function") {
callback($me);
}
});
}
};
$.fn.animo = function ( options, callback, other_cb ) {
return this.each(function() {
new animo( this, options, callback, other_cb );
});
};
})( jQuery, window, document );
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论