diff --git a/skywalking-webui/pom.xml b/skywalking-webui/pom.xml index cd1e9baf8..853e10d55 100644 --- a/skywalking-webui/pom.xml +++ b/skywalking-webui/pom.xml @@ -1,123 +1,128 @@ - 4.0.0 - com.ai.cloud - skywalking-webui - 1.0-SNAPSHOT - http://maven.apache.org - war + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.ai.cloud + skywalking-webui + 1.0-SNAPSHOT + http://maven.apache.org + war - - UTF-8 - 4.1.6.RELEASE - - - skywalking - - - maven-compiler-plugin - - 1.7 - 1.7 - ${project.build.sourceEncoding} - - - - org.apache.maven.plugins - maven-resources-plugin - 2.4.3 - - ${project.build.sourceEncoding} - - - - + + UTF-8 + 4.1.6.RELEASE + + + skywalking + + + maven-compiler-plugin + + 1.7 + 1.7 + ${project.build.sourceEncoding} + + + + org.apache.maven.plugins + maven-resources-plugin + 2.4.3 + + ${project.build.sourceEncoding} + + + + - - - com.ai.cloud - skywalking-protocol - 1.0-SNAPSHOT - + + + com.ai.cloud + skywalking-protocol + 1.0-SNAPSHOT + - - org.springframework - spring-webmvc - ${project.spring.version} - - - org.springframework - spring-jdbc - ${project.spring.version} - - - org.springframework - spring-context-support - ${project.spring.version} - + + org.springframework + spring-webmvc + ${project.spring.version} + + + org.springframework + spring-jdbc + ${project.spring.version} + + + org.springframework + spring-context-support + ${project.spring.version} + - - org.freemarker - freemarker-gae - 2.3.23 - - - org.freemarker - freemarker - 2.3.23 - + + org.freemarker + freemarker-gae + 2.3.23 + + + org.freemarker + freemarker + 2.3.23 + + + com.alibaba + fastjson + 1.2.7 + - - com.alibaba - fastjson - 1.2.7 - + + org.apache.logging.log4j + log4j-core + 2.2 + + + org.apache.logging.log4j + log4j-1.2-api + 2.2 + + + org.apache.logging.log4j + log4j-slf4j-impl + 2.2 + - - org.apache.logging.log4j - log4j-core - 2.2 - - - org.apache.logging.log4j - log4j-1.2-api - 2.2 - - - org.apache.logging.log4j - log4j-slf4j-impl - 2.2 - - - - javax.servlet - javax.servlet-api - 3.1.0 - - - mysql - mysql-connector-java - 5.1.36 - - - org.apache.commons - commons-dbcp2 - 2.0 - - - org.apache.hbase - hbase-client - 1.1.2 - - - org.aspectj - aspectjweaver - 1.8.7 - - + + javax.servlet + javax.servlet-api + 3.1.0 + + + mysql + mysql-connector-java + 5.1.36 + + + org.apache.commons + commons-dbcp2 + 2.0 + + + org.apache.hbase + hbase-client + 1.1.2 + + + org.aspectj + aspectjweaver + 1.8.7 + + com.google.code.gson gson 2.2.2 - + + + com.zaxxer + HikariCP + 2.4.3 + + \ No newline at end of file diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/common/BaseController.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/common/BaseController.java index e14bbafb6..0694b4b50 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/common/BaseController.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/common/BaseController.java @@ -1,7 +1,18 @@ package com.ai.cloud.skywalking.web.common; -/** - * Created by xin on 16-3-19. - */ +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.ModelAttribute; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + public class BaseController { + @ModelAttribute + public void initPath(HttpServletRequest request, HttpServletResponse response, ModelMap model) { + String base = request.getContextPath(); + String fullPath = request.getScheme() + "://" + request.getServerName() + + ":" + request.getServerPort() + base; + model.addAttribute("_base", base); + + } } diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/AnalysisResultController.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/AnalysisResultController.java deleted file mode 100644 index cde85f291..000000000 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/AnalysisResultController.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.ai.cloud.skywalking.web.controller; - -/** - * Created by xin on 16-3-21. - */ -public class AnalysisResultController { -} diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/CallChainViewController.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/CallChainViewController.java deleted file mode 100644 index 61bffcb30..000000000 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/CallChainViewController.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.ai.cloud.skywalking.web.controller; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; - -/** - * Created by xin on 16-3-19. - */ -@Controller -@RequestMapping("/trace") -public class CallChainViewController { - - @RequestMapping("/view") - public String view(){ - return ""; - } -} diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/PortalController.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/PortalController.java index b492d790a..d4cb8d5fc 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/PortalController.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/PortalController.java @@ -1,14 +1,14 @@ package com.ai.cloud.skywalking.web.controller; -import com.sun.org.apache.xpath.internal.operations.String; +import com.ai.cloud.skywalking.web.common.BaseController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller -public class PortalController { +public class PortalController extends BaseController{ @RequestMapping("/index") public String index() { - return null; + return "index"; } } diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/UserController.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/UserController.java deleted file mode 100644 index a5add6d2c..000000000 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/UserController.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.ai.cloud.skywalking.web.controller; - -/** - * Created by xin on 16-3-21. - */ -public class UserController { -} diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/UserMaintainController.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/UserMaintainController.java new file mode 100644 index 000000000..d8e65c44b --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/UserMaintainController.java @@ -0,0 +1,104 @@ +package com.ai.cloud.skywalking.web.controller; + +import com.ai.cloud.skywalking.web.common.BaseController; +import com.ai.cloud.skywalking.web.dao.inter.IUserMaintainDao; +import com.ai.cloud.skywalking.web.vo.LoginUserInfo; +import com.ai.cloud.skywalking.web.vo.SignInUserInfo; +import com.ai.cloud.skywalking.web.vo.UserInfo; +import com.ai.cloud.util.Constants; +import com.ai.cloud.util.common.StringUtil; +import com.alibaba.fastjson.JSONObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * Created by xin on 16-3-24. + */ +@RequestMapping("/usr") +@Controller +public class UserMaintainController extends BaseController { + private Logger logger = LogManager.getLogger(UserMaintainController.class); + + @Autowired + private IUserMaintainDao iUserMaintainDao; + + @RequestMapping("/login") + public String loginPage() { + return "usr/login"; + } + + @RequestMapping(value = "/doLogin", produces = "application/json; charset=UTF-8") + @ResponseBody + public String doLogin(LoginUserInfo loginInfo) { + JSONObject result = new JSONObject(); + try { + if (validateUserInfo(loginInfo, result)) { + return result.toJSONString(); + } + + LoginUserInfo dbLoginInfo = iUserMaintainDao.queryUserInfoByName(loginInfo.getUserName()); + logger.info("{}", dbLoginInfo.getPassword()); + if (dbLoginInfo == null || !loginInfo.getPassword().equals(dbLoginInfo.getPassword())) { + result.put("code", "400"); + result.put("message", "Username or password is not correct"); + return result.toJSONString(); + } + + result.put("code", "200"); + result.put("message", "Login success"); + } catch (Exception e) { + logger.error("Failed to login the user[{}] and password[{}]", loginInfo.getUserName(), + loginInfo.getPassword(), e); + result.put("code", "500"); + result.put("message", "fatal error. please try it again."); + } + return result.toJSONString(); + } + + private boolean validateUserInfo(UserInfo loginInfo, JSONObject result) { + if (StringUtil.isBlank(loginInfo.getUserName()) || StringUtil.isBlank(loginInfo.getPassword())) { + result.put("code", "400"); + result.put("message", "Username or password is null"); + return true; + } + return false; + } + + @RequestMapping("/register") + public String registerPage() { + return "usr/register"; + } + + @RequestMapping(value = "/doRegister", produces = "application/json; charset=UTF-8") + @ResponseBody + public String doRegister(SignInUserInfo signInUserInfo) { + JSONObject result = new JSONObject(); + try { + + if (validateUserInfo(signInUserInfo, result)) { + return result.toJSONString(); + } + signInUserInfo.setRoleType(Constants.ROLE_TYPE_USER); + signInUserInfo.setSts(Constants.STR_VAL_A); + iUserMaintainDao.addUser(signInUserInfo); + if (StringUtil.isBlank(signInUserInfo.getUid())) { + result.put("code", "500"); + result.put("message", "Failed to register user" + signInUserInfo.getUserName()); + return result.toJSONString(); + } + + result.put("code", "200"); + result.put("message", "register success"); + } catch (Exception e) { + logger.error("Failed to register the user[{}]", signInUserInfo.getUserName(), + signInUserInfo.getPassword(), e); + result.put("code", "500"); + result.put("message", "fatal error. please try it again."); + } + return result.toJSONString(); + } +} diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/UserMaintainDao.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/UserMaintainDao.java new file mode 100644 index 000000000..76670a113 --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/UserMaintainDao.java @@ -0,0 +1,80 @@ +package com.ai.cloud.skywalking.web.dao.impl; + +import com.ai.cloud.skywalking.web.dao.inter.IUserMaintainDao; +import com.ai.cloud.skywalking.web.util.DBConnectUtil; +import com.ai.cloud.skywalking.web.vo.LoginUserInfo; +import com.ai.cloud.skywalking.web.vo.SignInUserInfo; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Statement; + +@Repository +public class UserMaintainDao implements IUserMaintainDao { + @Autowired + private JdbcTemplate jdbcTemplate; + + @Autowired + private DBConnectUtil dbConnectUtil; + + private static Logger logger = LogManager.getLogger(UserMaintainDao.class); + + @Override + public LoginUserInfo queryUserInfoByName(String userName) { + logger.debug("query user name {} ", userName); + LoginUserInfo userInfo = null; + String sql = "select uid,user_name,password from user_info where user_name = ? "; + try { + PreparedStatement ps = dbConnectUtil.getConnection().prepareStatement(sql); + ps.setString(1, userName); + ResultSet rs = ps.executeQuery(); + if (rs.next()) { + userInfo = new LoginUserInfo(); + userInfo.setUid(rs.getString("uid")); + userInfo.setUserName(rs.getString("user_name")); + userInfo.setPassword(rs.getString("password")); + } + } catch (Exception e) { + logger.error("Failed to query the user[{}]", userName, e); + } + + logger.info("result : {}", userInfo); + return userInfo; + } + + @Override + public void addUser(final SignInUserInfo userInfo) { + final String sql = "insert into user_info(user_name,password,role_type," + + "create_time,sts,modify_time) values (?,?,?,?,?,?)"; + int num = -1; + try { + PreparedStatement pstmt = dbConnectUtil.getConnection(). + prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); + int i = 0; + pstmt.setString(++i, userInfo.getUserName()); + pstmt.setString(++i, userInfo.getPassword()); + pstmt.setString(++i, userInfo.getRoleType()); + pstmt.setTimestamp(++i, userInfo.getCreateTime()); + pstmt.setString(++i, userInfo.getSts()); + pstmt.setTimestamp(++i, userInfo.getModifyTime()); + + pstmt.executeUpdate(); + ResultSet results = pstmt.getGeneratedKeys(); + if (results.next()) { + num = results.getInt(1); + } + } catch (Exception e) { + logger.error("Failed to register the user[{}]", userInfo.getUserName(), e); + throw new RuntimeException("Failed to register the user " + userInfo.getUserName(), e); + } + logger.info("用户注册成功:{}", num); + userInfo.setUid(String.valueOf(num)); + } + + +} diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IUserMaintainDao.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IUserMaintainDao.java new file mode 100644 index 000000000..e3714feb6 --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IUserMaintainDao.java @@ -0,0 +1,13 @@ +package com.ai.cloud.skywalking.web.dao.inter; + +import com.ai.cloud.skywalking.web.vo.LoginUserInfo; +import com.ai.cloud.skywalking.web.vo.SignInUserInfo; + +/** + * Created by xin on 16-3-25. + */ +public interface IUserMaintainDao { + LoginUserInfo queryUserInfoByName(String userName); + + void addUser(SignInUserInfo userInfo); +} diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/DBConnectUtil.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/DBConnectUtil.java new file mode 100644 index 000000000..170180734 --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/DBConnectUtil.java @@ -0,0 +1,49 @@ +package com.ai.cloud.skywalking.web.util; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Repository; + +import java.sql.Connection; +import java.sql.SQLException; + +@Repository +public class DBConnectUtil { + + @Value("#{configProperties['jdbc.url']}") + private String dbURL; + @Value("#{configProperties['jdbc.username']}") + private String dbUser; + @Value("#{configProperties['jdbc.password']}") + private String password; + @Value("#{configProperties['jdbc.driverClassName']}") + private String dbDriverClass; + + private static Logger logger = LogManager.getLogger(DBConnectUtil.class); + + private static HikariDataSource hikariDataSource; + + public Connection getConnection() { + if (hikariDataSource == null) { + HikariConfig config = new HikariConfig(); + config.setJdbcUrl(dbURL); + config.setUsername(dbUser); + config.setPassword(password); + config.setDriverClassName(dbDriverClass); + config.addDataSourceProperty("cachePrepStmts", "true"); + config.addDataSourceProperty("prepStmtCacheSize", "250"); + config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); + hikariDataSource = new HikariDataSource(config); + } + try { + return hikariDataSource.getConnection(); + } catch (SQLException e) { + logger.error("Failed to get connection", e); + throw new RuntimeException("Cannot get connection."); + } + + } +} diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/vo/LoginUserInfo.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/vo/LoginUserInfo.java index db45f6da4..2f5ced3ac 100644 --- a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/vo/LoginUserInfo.java +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/vo/LoginUserInfo.java @@ -3,5 +3,5 @@ package com.ai.cloud.skywalking.web.vo; /** * Created by xin on 16-3-21. */ -public class LoginUserInfo { +public class LoginUserInfo extends UserInfo{ } diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/vo/SignInUserInfo.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/vo/SignInUserInfo.java new file mode 100644 index 000000000..a1f835701 --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/vo/SignInUserInfo.java @@ -0,0 +1,7 @@ +package com.ai.cloud.skywalking.web.vo; + +/** + * Created by xin on 16-3-25. + */ +public class SignInUserInfo extends UserInfo{ +} diff --git a/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/vo/UserInfo.java b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/vo/UserInfo.java new file mode 100644 index 000000000..7aaa61aee --- /dev/null +++ b/skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/vo/UserInfo.java @@ -0,0 +1,70 @@ +package com.ai.cloud.skywalking.web.vo; + +import java.sql.Timestamp; + +/** + * Created by xin on 16-3-25. + */ +public class UserInfo { + private String uid; + private String userName; + private String password; + private String roleType; + private Timestamp createTime; + private String sts; + private Timestamp modifyTime; + + public void setUid(String uid) { + this.uid = uid; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getUserName() { + return userName; + } + + public String getPassword() { + return password; + } + + public String getUid() { + return uid; + } + + public String getRoleType() { + return roleType; + } + + public String getSts() { + return sts; + } + + public Timestamp getCreateTime() { + if (createTime == null){ + return new Timestamp(System.currentTimeMillis()); + } + return createTime; + } + + public Timestamp getModifyTime() { + if (modifyTime == null){ + return new Timestamp(System.currentTimeMillis()); + } + return modifyTime; + } + + public void setRoleType(String roleType) { + this.roleType = roleType; + } + + public void setSts(String sts) { + this.sts = sts; + } +} diff --git a/skywalking-webui/src/main/resources/spring/springmvc-servlet.xml b/skywalking-webui/src/main/resources/spring/springmvc-servlet.xml index be26b1f78..be903d29b 100644 --- a/skywalking-webui/src/main/resources/spring/springmvc-servlet.xml +++ b/skywalking-webui/src/main/resources/spring/springmvc-servlet.xml @@ -44,8 +44,7 @@ - + classpath:jdbc.properties @@ -53,6 +52,10 @@ + + + + diff --git a/skywalking-webui/src/main/webapp/node_modules/skywalking/img/logo.png b/skywalking-webui/src/main/webapp/node_modules/skywalking/img/logo.png new file mode 100644 index 000000000..d4bb9939e Binary files /dev/null and b/skywalking-webui/src/main/webapp/node_modules/skywalking/img/logo.png differ diff --git a/skywalking-webui/src/main/webapp/node_modules/skywalking/js/jquery-md5.js b/skywalking-webui/src/main/webapp/node_modules/skywalking/js/jquery-md5.js new file mode 100644 index 000000000..bbbb85007 --- /dev/null +++ b/skywalking-webui/src/main/webapp/node_modules/skywalking/js/jquery-md5.js @@ -0,0 +1,250 @@ +/** + * jQuery MD5 hash algorithm function + * + * + * Calculate the md5 hash of a String + * String $.md5 ( String str ) + * + * + * Calculates the MD5 hash of str using the » RSA Data Security, Inc. MD5 + * Message-Digest Algorithm, and returns that hash. MD5 (Message-Digest + * algorithm 5) is a widely-used cryptographic hash function with a 128-bit hash + * value. MD5 has been employed in a wide variety of security applications, and + * is also commonly used to check the integrity of data. The generated hash is + * also non-reversable. Data cannot be retrieved from the message digest, the + * digest uniquely identifies the data. MD5 was developed by Professor Ronald L. + * Rivest in 1994. Its 128 bit (16 byte) message digest makes it a faster + * implementation than SHA-1. This script is used to process a variable length + * message into a fixed-length output of 128 bits using the MD5 algorithm. It is + * fully compatible with UTF-8 encoding. It is very useful when u want to + * transfer encrypted passwords over the internet. If you plan using UTF-8 + * encoding in your project don't forget to set the page encoding to UTF-8 + * (Content-Type meta tag). This function orginally get from the WebToolkit and + * rewrite for using as the jQuery plugin. + * + * Example Code + * $.md5("I'm Persian."); + * Result + * "b8c901d0f02223f9761016cfff9d68df" + * + * + * @alias Muhammad Hussein Fattahizadeh < muhammad [AT] semnanweb [DOT] com > + * @link http://www.semnanweb.com/jquery-plugin/md5.html + * @see http://www.webtoolkit.info/ + * @license http://www.gnu.org/licenses/gpl.html [GNU General Public License] + * @param {jQuery} + * {md5:function(string)) + * @return string + */ + +(function($) { + + var rotateLeft = function(lValue, iShiftBits) { + return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); + } + + var addUnsigned = function(lX, lY) { + var lX4, lY4, lX8, lY8, lResult; + lX8 = (lX & 0x80000000); + lY8 = (lY & 0x80000000); + lX4 = (lX & 0x40000000); + lY4 = (lY & 0x40000000); + lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF); + if (lX4 & lY4) + return (lResult ^ 0x80000000 ^ lX8 ^ lY8); + if (lX4 | lY4) { + if (lResult & 0x40000000) + return (lResult ^ 0xC0000000 ^ lX8 ^ lY8); + else + return (lResult ^ 0x40000000 ^ lX8 ^ lY8); + } else { + return (lResult ^ lX8 ^ lY8); + } + } + + var F = function(x, y, z) { + return (x & y) | ((~x) & z); + } + + var G = function(x, y, z) { + return (x & z) | (y & (~z)); + } + + var H = function(x, y, z) { + return (x ^ y ^ z); + } + + var I = function(x, y, z) { + return (y ^ (x | (~z))); + } + + var FF = function(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(F(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + }; + + var GG = function(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(G(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + }; + + var HH = function(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(H(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + }; + + var II = function(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(I(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + }; + + var convertToWordArray = function(string) { + var lWordCount; + var lMessageLength = string.length; + var lNumberOfWordsTempOne = lMessageLength + 8; + var lNumberOfWordsTempTwo = (lNumberOfWordsTempOne - (lNumberOfWordsTempOne % 64)) / 64; + var lNumberOfWords = (lNumberOfWordsTempTwo + 1) * 16; + var lWordArray = Array(lNumberOfWords - 1); + var lBytePosition = 0; + var lByteCount = 0; + while (lByteCount < lMessageLength) { + lWordCount = (lByteCount - (lByteCount % 4)) / 4; + lBytePosition = (lByteCount % 4) * 8; + lWordArray[lWordCount] = (lWordArray[lWordCount] | (string + .charCodeAt(lByteCount) << lBytePosition)); + lByteCount++; + } + lWordCount = (lByteCount - (lByteCount % 4)) / 4; + lBytePosition = (lByteCount % 4) * 8; + lWordArray[lWordCount] = lWordArray[lWordCount] + | (0x80 << lBytePosition); + lWordArray[lNumberOfWords - 2] = lMessageLength << 3; + lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; + return lWordArray; + }; + + var wordToHex = function(lValue) { + var WordToHexValue = "", WordToHexValueTemp = "", lByte, lCount; + for (lCount = 0; lCount <= 3; lCount++) { + lByte = (lValue >>> (lCount * 8)) & 255; + WordToHexValueTemp = "0" + lByte.toString(16); + WordToHexValue = WordToHexValue + + WordToHexValueTemp.substr(WordToHexValueTemp.length - 2, + 2); + } + return WordToHexValue; + }; + + var uTF8Encode = function(string) { + string = string.replace(/\x0d\x0a/g, "\x0a"); + var output = ""; + for (var n = 0; n < string.length; n++) { + var c = string.charCodeAt(n); + if (c < 128) { + output += String.fromCharCode(c); + } else if ((c > 127) && (c < 2048)) { + output += String.fromCharCode((c >> 6) | 192); + output += String.fromCharCode((c & 63) | 128); + } else { + output += String.fromCharCode((c >> 12) | 224); + output += String.fromCharCode(((c >> 6) & 63) | 128); + output += String.fromCharCode((c & 63) | 128); + } + } + return output; + }; + + $.extend({ + md5 : function(string) { + var x = Array(); + var k, AA, BB, CC, DD, a, b, c, d; + var S11 = 7, S12 = 12, S13 = 17, S14 = 22; + var S21 = 5, S22 = 9, S23 = 14, S24 = 20; + var S31 = 4, S32 = 11, S33 = 16, S34 = 23; + var S41 = 6, S42 = 10, S43 = 15, S44 = 21; + string = uTF8Encode(string); + x = convertToWordArray(string); + a = 0x67452301; + b = 0xEFCDAB89; + c = 0x98BADCFE; + d = 0x10325476; + for (k = 0; k < x.length; k += 16) { + AA = a; + BB = b; + CC = c; + DD = d; + a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478); + d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756); + c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB); + b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE); + a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF); + d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A); + c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613); + b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501); + a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8); + d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF); + c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1); + b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE); + a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122); + d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193); + c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E); + b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821); + a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562); + d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340); + c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51); + b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA); + a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D); + d = GG(d, a, b, c, x[k + 10], S22, 0x2441453); + c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681); + b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8); + a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6); + d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6); + c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87); + b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED); + a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905); + d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8); + c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9); + b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A); + a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942); + d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681); + c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122); + b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C); + a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44); + d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9); + c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60); + b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70); + a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6); + d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA); + c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085); + b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05); + a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039); + d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5); + c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8); + b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665); + a = II(a, b, c, d, x[k + 0], S41, 0xF4292244); + d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97); + c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7); + b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039); + a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3); + d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92); + c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D); + b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1); + a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F); + d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0); + c = II(c, d, a, b, x[k + 6], S43, 0xA3014314); + b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1); + a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82); + d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235); + c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB); + b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391); + a = addUnsigned(a, AA); + b = addUnsigned(b, BB); + c = addUnsigned(c, CC); + d = addUnsigned(d, DD); + } + var tempValue = wordToHex(a) + wordToHex(b) + wordToHex(c) + + wordToHex(d); + return tempValue.toLowerCase(); + } + }); +})(jQuery); \ No newline at end of file diff --git a/skywalking-webui/src/main/webapp/pages/analysis/summary.ftl b/skywalking-webui/src/main/webapp/pages/analysis/summary.ftl deleted file mode 100644 index da214483f..000000000 --- a/skywalking-webui/src/main/webapp/pages/analysis/summary.ftl +++ /dev/null @@ -1,29 +0,0 @@ -<#import "../commons/commons.ftl" as common> - - - - - Skywalking - - - - - - -
-<@common.navbar/> -
-
- -
-
- -
-
-<@common.searchBox /> -
- - - \ No newline at end of file diff --git a/skywalking-webui/src/main/webapp/pages/common/commons.ftl b/skywalking-webui/src/main/webapp/pages/common/commons.ftl new file mode 100644 index 000000000..cab6266e6 --- /dev/null +++ b/skywalking-webui/src/main/webapp/pages/common/commons.ftl @@ -0,0 +1,5 @@ +<#macro importResources> + + + + \ No newline at end of file diff --git a/skywalking-webui/src/main/webapp/pages/commons/commons.ftl b/skywalking-webui/src/main/webapp/pages/commons/commons.ftl deleted file mode 100644 index 1cc18110f..000000000 --- a/skywalking-webui/src/main/webapp/pages/commons/commons.ftl +++ /dev/null @@ -1,40 +0,0 @@ -<#macro navbar> - - - -<#macro searchBox> -
-
- -
-
-
- - - - -
-
-
- - diff --git a/skywalking-webui/src/main/webapp/pages/index.ftl b/skywalking-webui/src/main/webapp/pages/index.ftl index be6015441..65ff6b21d 100644 --- a/skywalking-webui/src/main/webapp/pages/index.ftl +++ b/skywalking-webui/src/main/webapp/pages/index.ftl @@ -1,34 +1,48 @@ -<#import "./commons/commons.ftl" as common> +<#import "./common/commons.ftl" as common> - - Skywalking - - - + + +<@common.importResources /> - -
-<@common.navbar/> -
-
- +