From 2dff636223d5262f56659b0e9218f4282caee2f5 Mon Sep 17 00:00:00 2001 From: "zhang.xin" Date: Fri, 25 Mar 2016 14:35:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=B3=A8=E5=86=8C=EF=BC=8C?= =?UTF-8?q?=E7=99=BB=E9=99=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- skywalking-webui/pom.xml | 227 ++++++++-------- .../skywalking/web/common/BaseController.java | 17 +- .../controller/AnalysisResultController.java | 7 - .../controller/CallChainViewController.java | 17 -- .../web/controller/PortalController.java | 6 +- .../web/controller/UserController.java | 7 - .../controller/UserMaintainController.java | 104 ++++++++ .../web/dao/impl/UserMaintainDao.java | 80 ++++++ .../web/dao/inter/IUserMaintainDao.java | 13 + .../skywalking/web/util/DBConnectUtil.java | 49 ++++ .../skywalking/web/vo/LoginUserInfo.java | 2 +- .../skywalking/web/vo/SignInUserInfo.java | 7 + .../ai/cloud/skywalking/web/vo/UserInfo.java | 70 +++++ .../resources/spring/springmvc-servlet.xml | 7 +- .../node_modules/skywalking/img/logo.png | Bin 0 -> 71428 bytes .../node_modules/skywalking/js/jquery-md5.js | 250 ++++++++++++++++++ .../main/webapp/pages/analysis/summary.ftl | 29 -- .../src/main/webapp/pages/common/commons.ftl | 5 + .../src/main/webapp/pages/commons/commons.ftl | 40 --- .../src/main/webapp/pages/index.ftl | 64 +++-- .../src/main/webapp/pages/searchResult.ftl | 28 -- .../src/main/webapp/pages/usr/login.ftl | 114 +++++--- .../src/main/webapp/pages/usr/register.ftl | 97 +++++++ 23 files changed, 932 insertions(+), 308 deletions(-) delete mode 100644 skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/AnalysisResultController.java delete mode 100644 skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/CallChainViewController.java delete mode 100644 skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/UserController.java create mode 100644 skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/controller/UserMaintainController.java create mode 100644 skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/impl/UserMaintainDao.java create mode 100644 skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/dao/inter/IUserMaintainDao.java create mode 100644 skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/util/DBConnectUtil.java create mode 100644 skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/vo/SignInUserInfo.java create mode 100644 skywalking-webui/src/main/java/com/ai/cloud/skywalking/web/vo/UserInfo.java create mode 100644 skywalking-webui/src/main/webapp/node_modules/skywalking/img/logo.png create mode 100644 skywalking-webui/src/main/webapp/node_modules/skywalking/js/jquery-md5.js delete mode 100644 skywalking-webui/src/main/webapp/pages/analysis/summary.ftl create mode 100644 skywalking-webui/src/main/webapp/pages/common/commons.ftl delete mode 100644 skywalking-webui/src/main/webapp/pages/commons/commons.ftl delete mode 100644 skywalking-webui/src/main/webapp/pages/searchResult.ftl create mode 100644 skywalking-webui/src/main/webapp/pages/usr/register.ftl 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 0000000000000000000000000000000000000000..d4bb9939e936a78bbc26c29e8c73245413c871ce GIT binary patch literal 71428 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 I-kpd43r1Jtg#Z8m literal 0 HcmV?d00001 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/> -
-
- +