CenterService/src/main/java/com/java110/center/CenterServiceApplicationStart.java
@@ -3,11 +3,15 @@ import com.java110.event.center.init.CenterServiceStartInit; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.web.client.RestTemplate; import java.nio.charset.Charset; /** @@ -31,7 +35,9 @@ @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); StringHttpMessageConverter m = new StringHttpMessageConverter(Charset.forName("UTF-8")); RestTemplate restTemplate = new RestTemplateBuilder().additionalMessageConverters(m).build(); return restTemplate; } public static void main(String[] args) throws Exception{ CenterService/src/main/java/com/java110/center/api/CacheApi.java
File was renamed from CenterService/src/main/java/com/java110/center/rest/CacheApi.java @@ -1,4 +1,4 @@ package com.java110.center.rest; package com.java110.center.api; import com.java110.center.smo.ICenterServiceCacheSMO; import com.java110.common.constant.ResponseConstant; CenterService/src/main/java/com/java110/center/api/HttpApi.java
File was renamed from CenterService/src/main/java/com/java110/center/rest/HttpApi.java @@ -1,4 +1,4 @@ package com.java110.center.rest; package com.java110.center.api; import com.alibaba.fastjson.JSONObject; import com.java110.center.smo.ICenterServiceSMO; CenterService/src/main/java/com/java110/center/smo/impl/CenterServiceSMOImpl.java
@@ -364,6 +364,8 @@ &&MappingCache.getValue(MappingConstant.KEY_NO_INVOKE_BUSINESS_SYSTEM).contains(dataFlow.getOrderTypeCd())){ //不用调用 下游系统的配置(一般不存在这种情况,这里主要是在没有下游系统的情况下测试中心服务用) DataFlowFactory.addCostTime(dataFlow, "invokeBusinessSystem", "调用下游系统耗时", startDate); dataFlow.setResponseBusinessJson(DataTransactionFactory.createCommonResponseJson(dataFlow.getTransactionId(), ResponseConstant.RESULT_CODE_SUCCESS, "成功",null)); return ; } CenterService/src/main/resources/application.yml
@@ -4,13 +4,16 @@ maxTotal: 100 maxIdle: 20 maxWaitMillis: 20000 host: 192.168.31.199 host: 135.192.86.200 port: 6379 eureka: instance: leaseRenewalIntervalInSeconds: 10 leaseExpirationDurationInSeconds: 30 client: serviceUrl: defaultZone: http://192.168.31.199:8761/eureka/ defaultZone: http://135.192.86.200:8761/eureka/ #defaultZone: http://localhost:8761/eureka/ server: port: 8001 @@ -19,7 +22,7 @@ name: center-service redis: database: 0 host: 192.168.31.199 host: 135.192.86.200 port: 6379 pool: max-active: 300 @@ -36,7 +39,7 @@ filters: stat,wall,log4j poolPreparedStatements: true type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://192.168.31.199:3306/TT url: jdbc:mysql://135.192.86.200:3306/TT maxPoolPreparedStatementPerConnectionSize: 20 password: TT@12345678 testOnBorrow: false @@ -52,8 +55,8 @@ kafka: consumer: zookeeper: connect: 192.168.31.199:2181 servers: 192.168.31.199:9092 connect: 135.192.86.200:2181 servers: 135.192.86.200:9092 enable: auto: commit: true @@ -71,8 +74,8 @@ producer: zookeeper: connect: 192.168.31.199:2181 servers: 192.168.31.199:9092 connect: 135.192.86.200:2181 servers: 135.192.86.200:9092 retries: 0 batch: size: 4096 ConsoleService/doc/img/20180507230124.jpg
ConsoleService/doc/img/20180507230330.jpg
ConsoleService/doc/img/20180507231045.jpg
ConsoleService/doc/img/20180507231201.jpg
ConsoleService/pom.xml
@@ -80,7 +80,7 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.java110.center.CenterServiceApplicationStart</mainClass> <mainClass>com.java110.console.ConsoleServiceApplicationStart</mainClass> </configuration> </plugin> </plugins> ConsoleService/src/main/java/com/java110/console/ConsoleServiceApplicationStart.java
@@ -1,5 +1,6 @@ package com.java110.console; import com.java110.service.init.ServiceStartInit; import org.apache.catalina.Context; import org.apache.catalina.connector.Connector; import org.apache.tomcat.util.descriptor.web.SecurityCollection; @@ -8,11 +9,15 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory; import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.web.client.RestTemplate; import java.nio.charset.Charset; /** @@ -36,7 +41,9 @@ @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); StringHttpMessageConverter m = new StringHttpMessageConverter(Charset.forName("UTF-8")); RestTemplate restTemplate = new RestTemplateBuilder().additionalMessageConverters(m).build(); return restTemplate; } @Bean @@ -61,7 +68,7 @@ Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); //Connector监听的http的端口号 connector.setPort(7001); connector.setPort(6001); connector.setSecure(false); //监听到http的端口号后转向到的https的端口号 connector.setRedirectPort(8443); @@ -70,6 +77,6 @@ public static void main(String[] args) throws Exception{ ApplicationContext context = SpringApplication.run(ConsoleServiceApplicationStart.class, args); ServiceStartInit.initSystemConfig(context); } } ConsoleService/src/main/java/com/java110/console/controller/ConsoleController.java
File was renamed from ConsoleService/src/main/java/com/java110/console/rest/ConsoleController.java @@ -1,14 +1,16 @@ package com.java110.console.rest; package com.java110.console.controller; import com.java110.common.exception.NoAuthorityException; import com.java110.common.exception.SMOException; import com.java110.console.smo.IConsoleServiceSMO; import com.java110.core.base.controller.BaseController; import com.java110.entity.service.PageData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -25,16 +27,22 @@ private IConsoleServiceSMO consoleServiceSMOImpl; @RequestMapping(path = "/") public String index(Model model) { public String index(Model model, HttpServletRequest request) { String template = "index"; try { //1.0 判断用户是否登录 String managerId = checkLogin(); //1.0 获取对象 PageData pd = this.getPageData(request); // 判断用户是否登录 checkLogin(pd); //2.0 查询菜单信息 List<Map> menuItems = consoleServiceSMOImpl.getMenuItemsByManageId(managerId); List<Map> menuItems = consoleServiceSMOImpl.getMenuItemsByManageId(pd.getUserId()); List<Map> removeMenuItems = new ArrayList<Map>(); for(Map menuItem : menuItems){ if(!"-1".equals(menuItem.get("parentId")) && !"1".equals(menuItem.get("level"))){ Map parentMenuItem = this.getMenuItemFromList(menuItems,menuItem.get("parentId").toString()); if(parentMenuItem == null){ continue; } if(parentMenuItem.containsKey("subMenus")){ List<Map> subMenus = (List<Map>) parentMenuItem.get("subMenus"); subMenus.add(menuItem); @@ -44,18 +52,23 @@ parentMenuItem.put("subMenus",subMenus); } menuItems.remove(menuItem); removeMenuItems.add(menuItem); } } removeMap(menuItems,removeMenuItems); model.addAttribute("menus",menuItems); //3.0 查询各个系统调用量 }catch (NoAuthorityException e){ //跳转到登录页面 template = "login"; template = "redirect:/login"; }catch (IllegalArgumentException e){ template = "error"; template = "redirect:/system/error"; }catch (SMOException e){ template = "error"; template = "redirect:/system/error"; }catch (Exception e){ logger.error("系统异常:",e); template = "redirect:/system/error"; }finally { return template; } @@ -64,13 +77,28 @@ private Map getMenuItemFromList(List<Map> menuItems,String parentId){ for(Map menuItem : menuItems){ if(menuItem.get("mId").equals(parentId)){ if(menuItem.get("mId").toString().equals(parentId)){ return menuItem; } } return null; } /** * 删除map * @param menuItems * @param removeMenuItems */ private void removeMap(List<Map> menuItems,List<Map> removeMenuItems){ if(removeMenuItems == null || removeMenuItems.size() == 0){ return; } for(Map removeMenuItem : removeMenuItems){ menuItems.remove(removeMenuItem); } } public IConsoleServiceSMO getConsoleServiceSMOImpl() { return consoleServiceSMOImpl; } ConsoleService/src/main/java/com/java110/console/controller/LoginController.java
New file @@ -0,0 +1,32 @@ package com.java110.console.controller; import com.java110.common.constant.ResponseConstant; import com.java110.common.exception.SMOException; import com.java110.common.factory.DataTransactionFactory; import com.java110.console.smo.IConsoleServiceSMO; import com.java110.core.base.controller.BaseController; import com.java110.entity.service.PageData; 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.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; /** * 登录 控制类 * Created by wuxw on 2018/5/2. */ @Controller public class LoginController extends BaseController { @RequestMapping(path = "/login",method = RequestMethod.GET) public String index(HttpServletRequest request){ return "login"; } } ConsoleService/src/main/java/com/java110/console/rest/LoginController.java
File was deleted ConsoleService/src/main/java/com/java110/console/rest/LoginRest.java
New file @@ -0,0 +1,59 @@ package com.java110.console.rest; import com.java110.common.constant.ResponseConstant; import com.java110.common.exception.SMOException; import com.java110.common.factory.DataTransactionFactory; import com.java110.console.smo.IConsoleServiceSMO; import com.java110.core.base.controller.BaseController; import com.java110.entity.service.PageData; import org.springframework.beans.factory.annotation.Autowired; 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.HttpServletRequest; /** * Created by wuxw on 2018/5/7. */ @RestController public class LoginRest extends BaseController { @Autowired private IConsoleServiceSMO consoleServiceSMOImpl; /** * 登录 * 协议: * {"meta":{"method":"login","requestTime":"20180506013211"},"param":{"userCode":"123","userPwd":"123","pageSign":""}}} } * * @param request * @return */ @RequestMapping(path = "/loginRest/login",method = RequestMethod.POST) public String login(HttpServletRequest request) { PageData pd = null; try { pd = this.getPageData(request); consoleServiceSMOImpl.login(pd); }catch (IllegalArgumentException e){ return DataTransactionFactory.pageResponseJson(pd,ResponseConstant.RESULT_PARAM_ERROR,e.getMessage(),null); }catch (SMOException e){ return DataTransactionFactory.pageResponseJson(pd,e.getResult().getCode(),e.getMessage(),null); }catch (Exception e){ logger.error("异常信息:",e); return DataTransactionFactory.pageResponseJson(pd,ResponseConstant.RESULT_CODE_ERROR,"请求参数出错 ",null); } return pd.getResJson().toJSONString(); } public IConsoleServiceSMO getConsoleServiceSMOImpl() { return consoleServiceSMOImpl; } public void setConsoleServiceSMOImpl(IConsoleServiceSMO consoleServiceSMOImpl) { this.consoleServiceSMOImpl = consoleServiceSMOImpl; } } ConsoleService/src/main/java/com/java110/console/smo/IConsoleServiceSMO.java
@@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONObject; import com.java110.common.exception.SMOException; import com.java110.entity.service.PageData; import java.util.List; import java.util.Map; @@ -21,9 +22,9 @@ /** * 用户登录 * @param userObj * @param pd * @return * @throws SMOException */ public String login(JSONObject userObj) throws SMOException; public void login(PageData pd) throws SMOException; } ConsoleService/src/main/java/com/java110/console/smo/impl/ConsoleServiceSMOImpl.java
@@ -2,16 +2,20 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.auth0.jwt.algorithms.Algorithm; import com.java110.common.cache.JWTCache; import com.java110.common.cache.MappingCache; import com.java110.common.constant.CommonConstant; import com.java110.common.constant.MappingConstant; import com.java110.common.constant.ResponseConstant; import com.java110.common.constant.ServiceCodeConstant; import com.java110.common.exception.SMOException; import com.java110.common.factory.AuthenticationFactory; import com.java110.common.factory.DataTransactionFactory; import com.java110.common.log.LoggerEngine; import com.java110.common.util.Assert; import com.java110.console.smo.IConsoleServiceSMO; import com.java110.entity.service.PageData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -40,59 +44,115 @@ */ @Override public List<Map> getMenuItemsByManageId(String manageId) throws SMOException,IllegalArgumentException{ //获取组件 String appId = MappingCache.getValue(MappingConstant.KEY_CONSOLE_SERVICE_APP_ID); Assert.hasLength(appId, "组件不能为空"); String centerServiceUrl = MappingCache.getValue(MappingConstant.KEY_CENTER_SERVICE_URL); Assert.hasLength(centerServiceUrl, "中心服务器地址没有配置"); String securityCode = MappingCache.getValue(MappingConstant.KEY_CONSOLE_SECURITY_CODE); Assert.hasLength(securityCode, "签名秘钥没有配置"); Map paramIn = new HashMap(); paramIn.put("manageId", manageId); paramIn.put("menuGroup",CommonConstant.MENU_GROUP_LEFT); String responseMsg = ""; String requestBody = DataTransactionFactory.createQueryOneCenterServiceRequestJson(appId, manageId, securityCode, DataTransactionFactory.createQueryOneBusinessRequestJson(ServiceCodeConstant.SERVICE_CODE_QUERY_MENU_ITEM, ServiceCodeConstant.SERVICE_CODE_QUERY_MENU_ITEM_NAME, paramIn)); if (MappingConstant.VALUE_ON.equals(MappingCache.getValue(MappingConstant.KEY_CONSOLE_SERVICE_SECURITY_ON_OFF))) { try { requestBody = DataTransactionFactory.encrypt(requestBody, 2048); //调用查询菜单信息 HttpHeaders header = new HttpHeaders(); header.add(CommonConstant.ENCRYPT, MappingConstant.VALUE_ON); header.add(CommonConstant.ENCRYPT_KEY_SIZE, "2048"); HttpEntity<String> httpEntity = new HttpEntity<String>(requestBody, header); responseMsg = restTemplate.postForObject(centerServiceUrl, httpEntity, String.class); responseMsg = DataTransactionFactory.decrypt(responseMsg, 2048); }catch (Exception e){ logger.error("调用接口失败",e); throw new SMOException(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR,"调用接口失败"+e); } } else { responseMsg = restTemplate.postForObject(centerServiceUrl,requestBody,String.class); } JSONObject businessObj = DataTransactionFactory.getOneBusinessFromCenterServiceResponseJson(responseMsg); Map paramIn = new HashMap(); paramIn.put("manageId", manageId); paramIn.put("menuGroup", CommonConstant.MENU_GROUP_LEFT); paramIn.put(CommonConstant.ORDER_USER_ID,manageId); paramIn.put(ServiceCodeConstant.SERVICE_CODE,ServiceCodeConstant.SERVICE_CODE_QUERY_MENU_ITEM); paramIn.put(ServiceCodeConstant.SERVICE_CODE_NAME,ServiceCodeConstant.SERVICE_CODE_QUERY_MENU_ITEM_NAME); JSONObject businessObj = doExecute(paramIn); JSONArray menus = businessObj.getJSONArray("menus"); return menus.toJavaList(Map.class); } /** * 用户登录 * @param userObj * @param pd * @return * @throws SMOException */ @Override public String login(JSONObject userObj) throws SMOException { return null; public void login(PageData pd) throws SMOException { String userCode = pd.getParam().getString("userCode"); String userPwd = pd.getParam().getString("userPwd"); String pageSign = pd.getParam().getString("pageSign"); Assert.hasText(userCode,"用户编码不能为空"); Assert.hasText(userPwd,"用户密码不能为空"); Map paramIn = new HashMap(); paramIn.put("userCode", userCode); paramIn.put(CommonConstant.ORDER_USER_ID,CommonConstant.ORDER_DEFAULT_USER_ID); paramIn.put(ServiceCodeConstant.SERVICE_CODE,ServiceCodeConstant.SERVICE_CODE_QUERY_USER_LOGIN); paramIn.put(ServiceCodeConstant.SERVICE_CODE_NAME,ServiceCodeConstant.SERVICE_CODE_QUERY_USER_LOGIN_NAME); //paramIn.put("userPwd", userPwd); JSONObject businessObj = doExecute(paramIn); JSONObject user = businessObj.getJSONObject("user"); //String newPwd = AuthenticationFactory.md5UserPassword(userPwd); if(!AuthenticationFactory.md5UserPassword(userPwd).equals(user.getString("userPwd"))){ throw new SMOException(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR,"密码不正确"); } String token = ""; try { Map userMap = new HashMap(); userMap.put(CommonConstant.LOGIN_USER_ID,user.getString("userId")); userMap.put(CommonConstant.LOGIN_USER_NAME,user.getString("userName")); token = AuthenticationFactory.createAndSaveToken(userMap); pd.setToken(token); }catch (Exception e){ logger.error("登录异常:",e); throw new SMOException(ResponseConstant.RESULT_CODE_INNER_ERROR,"系统内部错误,请联系管理员"); } //封装成功信息 pd.setResJson(DataTransactionFactory.pageResponseJson(pd.getTransactionId(),ResponseConstant.RESULT_CODE_SUCCESS,"登录成功 ",null)); } private JSONObject doExecute(Map paramIn) { //获取组件 String appId = MappingCache.getValue(MappingConstant.KEY_CONSOLE_SERVICE_APP_ID); Assert.hasLength(appId, "组件不能为空"); String centerServiceUrl = MappingCache.getValue(MappingConstant.KEY_CENTER_SERVICE_URL); Assert.hasLength(centerServiceUrl, "中心服务器地址没有配置"); String securityCode = MappingCache.getValue(MappingConstant.KEY_CONSOLE_SECURITY_CODE); Assert.hasLength(securityCode, "签名秘钥没有配置"); String serviceCode = paramIn.get(ServiceCodeConstant.SERVICE_CODE).toString(); String serviceCodeName = paramIn.get(ServiceCodeConstant.SERVICE_CODE_NAME).toString(); String userId = paramIn.get(CommonConstant.ORDER_USER_ID).toString(); if(paramIn.containsKey(ServiceCodeConstant.SERVICE_CODE)){ paramIn.remove(ServiceCodeConstant.SERVICE_CODE); } if(paramIn.containsKey(ServiceCodeConstant.SERVICE_CODE_NAME)){ paramIn.remove(ServiceCodeConstant.SERVICE_CODE_NAME); } if(paramIn.containsKey(CommonConstant.ORDER_USER_ID)){ paramIn.remove(CommonConstant.ORDER_USER_ID); } String responseMsg = ""; String requestBody = DataTransactionFactory.createQueryOneCenterServiceRequestJson(appId, userId, securityCode, DataTransactionFactory.createQueryOneBusinessRequestJson(serviceCode, serviceCodeName, paramIn)); if (MappingConstant.VALUE_ON.equals(MappingCache.getValue(MappingConstant.KEY_CONSOLE_SERVICE_SECURITY_ON_OFF))) { try { requestBody = DataTransactionFactory.encrypt(requestBody, 2048); //调用查询菜单信息 HttpHeaders header = new HttpHeaders(); header.add(CommonConstant.ENCRYPT, MappingConstant.VALUE_ON); header.add(CommonConstant.ENCRYPT_KEY_SIZE, "2048"); HttpEntity<String> httpEntity = new HttpEntity<String>(requestBody, header); responseMsg = restTemplate.postForObject(centerServiceUrl, httpEntity, String.class); responseMsg = DataTransactionFactory.decrypt(responseMsg, 2048); }catch (Exception e){ logger.error("调用接口失败",e); throw new SMOException(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR,"调用接口失败"+e); } } else { responseMsg = restTemplate.postForObject(centerServiceUrl,requestBody,String.class); } return DataTransactionFactory.getOneBusinessFromCenterServiceResponseJson(responseMsg); } public RestTemplate getRestTemplate() { return restTemplate; } ConsoleService/src/main/resources/application.yml
@@ -1,14 +1,26 @@ jedis: pool: config: maxTotal: 100 maxIdle: 20 maxWaitMillis: 20000 host: 135.192.86.200 port: 6379 eureka: instance: leaseRenewalIntervalInSeconds: 10 leaseExpirationDurationInSeconds: 30 client: serviceUrl: defaultZone: http://192.168.31.199:8761/eureka/ defaultZone: http://135.192.86.200:8761/eureka/ #defaultZone: http://localhost:8761/eureka/ server: port: 7001 port: 8443 ssl: keyStoreType: PKCS12 keyAlias: tomcat key-store: keystore.p12 key-store: classpath:keystore.p12 key-store-password: 12345678 session: cookie: @@ -18,7 +30,7 @@ name: console-service redis: database: 0 host: 192.168.31.199 host: 135.192.86.200 port: 6379 pool: max-active: 300 @@ -35,7 +47,7 @@ filters: stat,wall,log4j poolPreparedStatements: true type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://192.168.31.199:3306/TT url: jdbc:mysql://135.192.86.200:3306/TT maxPoolPreparedStatementPerConnectionSize: 20 password: TT@12345678 testOnBorrow: false @@ -58,4 +70,36 @@ suffix: .html check-template-location: true #============== kafka =================== kafka: consumer: zookeeper: connect: 135.192.86.200:2181 servers: 135.192.86.200:9092 enable: auto: commit: true session: timeout: 6000 auto: commit: interval: 100 offset: reset: latest topic: test group: id: consoleService concurrency: 10 producer: zookeeper: connect: 135.192.86.200:2181 servers: 135.192.86.200:9092 retries: 0 batch: size: 4096 linger: 1 buffer: memory: 40960 ConsoleService/src/main/resources/data/login.json
@@ -0,0 +1,11 @@ { "meta":{ "code":"0000",//主要用于,日志记录 "message":"成功", "responseTime":"", "transactionId":"10001010" //由系统返回 }, "data":{ //这里是返回参数 } } ConsoleService/src/main/resources/html/list_template.html
New file @@ -0,0 +1,1489 @@ <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <meta charset="utf-8" /> <title>jqGrid - Ace Admin</title> <meta name="description" content="Dynamic tables and grids using jqGrid plugin" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <!-- bootstrap & fontawesome --> <link rel="stylesheet" href="../assets/css/bootstrap.min.css" /> <link rel="stylesheet" href="../assets/font-awesome/4.5.0/css/font-awesome.min.css" /> <!-- page specific plugin styles --> <link rel="stylesheet" href="../assets/css/jquery-ui.min.css" /> <link rel="stylesheet" href="../assets/css/bootstrap-datepicker3.min.css" /> <link rel="stylesheet" href="../assets/css/ui.jqgrid.min.css" /> <!-- text fonts --> <link rel="stylesheet" href="../assets/css/fonts.googleapis.com.css" /> <!-- ace styles --> <link rel="stylesheet" href="../assets/css/ace.min.css" class="ace-main-stylesheet" id="main-ace-style" /> <!--[if lte IE 9]> <link rel="stylesheet" href="../assets/css/ace-part2.min.css" class="ace-main-stylesheet" /> <![endif]--> <link rel="stylesheet" href="../assets/css/ace-skins.min.css" /> <link rel="stylesheet" href="../assets/css/ace-rtl.min.css" /> <!--[if lte IE 9]> <link rel="stylesheet" href="../assets/css/ace-ie.min.css" /> <![endif]--> <!-- inline styles related to this page --> <!-- ace settings handler --> <script src="../assets/js/ace-extra.min.js"></script> <!-- HTML5shiv and Respond.js for IE8 to support HTML5 elements and media queries --> <!--[if lte IE 8]> <script src="../assets/js/html5shiv.min.js"></script> <script src="../assets/js/respond.min.js"></script> <![endif]--> </head> <body class="no-skin"> <div id="navbar" class="navbar navbar-default ace-save-state"> <div class="navbar-container ace-save-state" id="navbar-container"> <button type="button" class="navbar-toggle menu-toggler pull-left" id="menu-toggler" data-target="#sidebar"> <span class="sr-only">Toggle sidebar</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <div class="navbar-header pull-left"> <a href="index.html" class="navbar-brand"> <small> <i class="fa fa-leaf"></i> Ace Admin </small> </a> </div> <div class="navbar-buttons navbar-header pull-right" role="navigation"> <ul class="nav ace-nav"> <li class="grey dropdown-modal"> <a data-toggle="dropdown" class="dropdown-toggle" href="#"> <i class="ace-icon fa fa-tasks"></i> <span class="badge badge-grey">4</span> </a> <ul class="dropdown-menu-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close"> <li class="dropdown-header"> <i class="ace-icon fa fa-check"></i> 4 Tasks to complete </li> <li class="dropdown-content"> <ul class="dropdown-menu dropdown-navbar"> <li> <a href="#"> <div class="clearfix"> <span class="pull-left">Software Update</span> <span class="pull-right">65%</span> </div> <div class="progress progress-mini"> <div style="width:65%" class="progress-bar"></div> </div> </a> </li> <li> <a href="#"> <div class="clearfix"> <span class="pull-left">Hardware Upgrade</span> <span class="pull-right">35%</span> </div> <div class="progress progress-mini"> <div style="width:35%" class="progress-bar progress-bar-danger"></div> </div> </a> </li> <li> <a href="#"> <div class="clearfix"> <span class="pull-left">Unit Testing</span> <span class="pull-right">15%</span> </div> <div class="progress progress-mini"> <div style="width:15%" class="progress-bar progress-bar-warning"></div> </div> </a> </li> <li> <a href="#"> <div class="clearfix"> <span class="pull-left">Bug Fixes</span> <span class="pull-right">90%</span> </div> <div class="progress progress-mini progress-striped active"> <div style="width:90%" class="progress-bar progress-bar-success"></div> </div> </a> </li> </ul> </li> <li class="dropdown-footer"> <a href="#"> See tasks with details <i class="ace-icon fa fa-arrow-right"></i> </a> </li> </ul> </li> <li class="purple dropdown-modal"> <a data-toggle="dropdown" class="dropdown-toggle" href="#"> <i class="ace-icon fa fa-bell icon-animated-bell"></i> <span class="badge badge-important">8</span> </a> <ul class="dropdown-menu-right dropdown-navbar navbar-pink dropdown-menu dropdown-caret dropdown-close"> <li class="dropdown-header"> <i class="ace-icon fa fa-exclamation-triangle"></i> 8 Notifications </li> <li class="dropdown-content"> <ul class="dropdown-menu dropdown-navbar navbar-pink"> <li> <a href="#"> <div class="clearfix"> <span class="pull-left"> <i class="btn btn-xs no-hover btn-pink fa fa-comment"></i> New Comments </span> <span class="pull-right badge badge-info">+12</span> </div> </a> </li> <li> <a href="#"> <i class="btn btn-xs btn-primary fa fa-user"></i> Bob just signed up as an editor ... </a> </li> <li> <a href="#"> <div class="clearfix"> <span class="pull-left"> <i class="btn btn-xs no-hover btn-success fa fa-shopping-cart"></i> New Orders </span> <span class="pull-right badge badge-success">+8</span> </div> </a> </li> <li> <a href="#"> <div class="clearfix"> <span class="pull-left"> <i class="btn btn-xs no-hover btn-info fa fa-twitter"></i> Followers </span> <span class="pull-right badge badge-info">+11</span> </div> </a> </li> </ul> </li> <li class="dropdown-footer"> <a href="#"> See all notifications <i class="ace-icon fa fa-arrow-right"></i> </a> </li> </ul> </li> <li class="green dropdown-modal"> <a data-toggle="dropdown" class="dropdown-toggle" href="#"> <i class="ace-icon fa fa-envelope icon-animated-vertical"></i> <span class="badge badge-success">5</span> </a> <ul class="dropdown-menu-right dropdown-navbar dropdown-menu dropdown-caret dropdown-close"> <li class="dropdown-header"> <i class="ace-icon fa fa-envelope-o"></i> 5 Messages </li> <li class="dropdown-content"> <ul class="dropdown-menu dropdown-navbar"> <li> <a href="#" class="clearfix"> <img src="../assets/images/avatars/avatar.png" class="msg-photo" alt="Alex's Avatar" /> <span class="msg-body"> <span class="msg-title"> <span class="blue">Alex:</span> Ciao sociis natoque penatibus et auctor ... </span> <span class="msg-time"> <i class="ace-icon fa fa-clock-o"></i> <span>a moment ago</span> </span> </span> </a> </li> <li> <a href="#" class="clearfix"> <img src="../assets/images/avatars/avatar3.png" class="msg-photo" alt="Susan's Avatar" /> <span class="msg-body"> <span class="msg-title"> <span class="blue">Susan:</span> Vestibulum id ligula porta felis euismod ... </span> <span class="msg-time"> <i class="ace-icon fa fa-clock-o"></i> <span>20 minutes ago</span> </span> </span> </a> </li> <li> <a href="#" class="clearfix"> <img src="../assets/images/avatars/avatar4.png" class="msg-photo" alt="Bob's Avatar" /> <span class="msg-body"> <span class="msg-title"> <span class="blue">Bob:</span> Nullam quis risus eget urna mollis ornare ... </span> <span class="msg-time"> <i class="ace-icon fa fa-clock-o"></i> <span>3:15 pm</span> </span> </span> </a> </li> <li> <a href="#" class="clearfix"> <img src="../assets/images/avatars/avatar2.png" class="msg-photo" alt="Kate's Avatar" /> <span class="msg-body"> <span class="msg-title"> <span class="blue">Kate:</span> Ciao sociis natoque eget urna mollis ornare ... </span> <span class="msg-time"> <i class="ace-icon fa fa-clock-o"></i> <span>1:33 pm</span> </span> </span> </a> </li> <li> <a href="#" class="clearfix"> <img src="../assets/images/avatars/avatar5.png" class="msg-photo" alt="Fred's Avatar" /> <span class="msg-body"> <span class="msg-title"> <span class="blue">Fred:</span> Vestibulum id penatibus et auctor ... </span> <span class="msg-time"> <i class="ace-icon fa fa-clock-o"></i> <span>10:09 am</span> </span> </span> </a> </li> </ul> </li> <li class="dropdown-footer"> <a href="inbox.html"> See all messages <i class="ace-icon fa fa-arrow-right"></i> </a> </li> </ul> </li> <li class="light-blue dropdown-modal"> <a data-toggle="dropdown" href="#" class="dropdown-toggle"> <img class="nav-user-photo" src="../assets/images/avatars/user.jpg" alt="Jason's Photo" /> <span class="user-info"> <small>Welcome,</small> Jason </span> <i class="ace-icon fa fa-caret-down"></i> </a> <ul class="user-menu dropdown-menu-right dropdown-menu dropdown-yellow dropdown-caret dropdown-close"> <li> <a href="#"> <i class="ace-icon fa fa-cog"></i> Settings </a> </li> <li> <a href="profile.html"> <i class="ace-icon fa fa-user"></i> Profile </a> </li> <li class="divider"></li> <li> <a href="#"> <i class="ace-icon fa fa-power-off"></i> Logout </a> </li> </ul> </li> </ul> </div> </div><!-- /.navbar-container --> </div> <div class="main-container ace-save-state" id="main-container"> <script type="text/javascript"> try{ace.settings.loadState('main-container')}catch(e){} </script> <div id="sidebar" class="sidebar responsive ace-save-state"> <script type="text/javascript"> try{ace.settings.loadState('sidebar')}catch(e){} </script> <div class="sidebar-shortcuts" id="sidebar-shortcuts"> <div class="sidebar-shortcuts-large" id="sidebar-shortcuts-large"> <button class="btn btn-success"> <i class="ace-icon fa fa-signal"></i> </button> <button class="btn btn-info"> <i class="ace-icon fa fa-pencil"></i> </button> <button class="btn btn-warning"> <i class="ace-icon fa fa-users"></i> </button> <button class="btn btn-danger"> <i class="ace-icon fa fa-cogs"></i> </button> </div> <div class="sidebar-shortcuts-mini" id="sidebar-shortcuts-mini"> <span class="btn btn-success"></span> <span class="btn btn-info"></span> <span class="btn btn-warning"></span> <span class="btn btn-danger"></span> </div> </div><!-- /.sidebar-shortcuts --> <ul class="nav nav-list"> <li class=""> <a href="index.html"> <i class="menu-icon fa fa-tachometer"></i> <span class="menu-text"> Dashboard </span> </a> <b class="arrow"></b> </li> <li class=""> <a href="#" class="dropdown-toggle"> <i class="menu-icon fa fa-desktop"></i> <span class="menu-text"> UI & Elements </span> <b class="arrow fa fa-angle-down"></b> </a> <b class="arrow"></b> <ul class="submenu"> <li class=""> <a href="#" class="dropdown-toggle"> <i class="menu-icon fa fa-caret-right"></i> Layouts <b class="arrow fa fa-angle-down"></b> </a> <b class="arrow"></b> <ul class="submenu"> <li class=""> <a href="top-menu.html"> <i class="menu-icon fa fa-caret-right"></i> Top Menu </a> <b class="arrow"></b> </li> <li class=""> <a href="two-menu-1.html"> <i class="menu-icon fa fa-caret-right"></i> Two Menus 1 </a> <b class="arrow"></b> </li> <li class=""> <a href="two-menu-2.html"> <i class="menu-icon fa fa-caret-right"></i> Two Menus 2 </a> <b class="arrow"></b> </li> <li class=""> <a href="mobile-menu-1.html"> <i class="menu-icon fa fa-caret-right"></i> Default Mobile Menu </a> <b class="arrow"></b> </li> <li class=""> <a href="mobile-menu-2.html"> <i class="menu-icon fa fa-caret-right"></i> Mobile Menu 2 </a> <b class="arrow"></b> </li> <li class=""> <a href="mobile-menu-3.html"> <i class="menu-icon fa fa-caret-right"></i> Mobile Menu 3 </a> <b class="arrow"></b> </li> </ul> </li> <li class=""> <a href="typography.html"> <i class="menu-icon fa fa-caret-right"></i> Typography </a> <b class="arrow"></b> </li> <li class=""> <a href="elements.html"> <i class="menu-icon fa fa-caret-right"></i> Elements </a> <b class="arrow"></b> </li> <li class=""> <a href="buttons.html"> <i class="menu-icon fa fa-caret-right"></i> Buttons & Icons </a> <b class="arrow"></b> </li> <li class=""> <a href="content-slider.html"> <i class="menu-icon fa fa-caret-right"></i> Content Sliders </a> <b class="arrow"></b> </li> <li class=""> <a href="treeview.html"> <i class="menu-icon fa fa-caret-right"></i> Treeview </a> <b class="arrow"></b> </li> <li class=""> <a href="jquery-ui.html"> <i class="menu-icon fa fa-caret-right"></i> jQuery UI </a> <b class="arrow"></b> </li> <li class=""> <a href="nestable-list.html"> <i class="menu-icon fa fa-caret-right"></i> Nestable Lists </a> <b class="arrow"></b> </li> <li class=""> <a href="#" class="dropdown-toggle"> <i class="menu-icon fa fa-caret-right"></i> Three Level Menu <b class="arrow fa fa-angle-down"></b> </a> <b class="arrow"></b> <ul class="submenu"> <li class=""> <a href="#"> <i class="menu-icon fa fa-leaf green"></i> Item #1 </a> <b class="arrow"></b> </li> <li class=""> <a href="#" class="dropdown-toggle"> <i class="menu-icon fa fa-pencil orange"></i> 4th level <b class="arrow fa fa-angle-down"></b> </a> <b class="arrow"></b> <ul class="submenu"> <li class=""> <a href="#"> <i class="menu-icon fa fa-plus purple"></i> Add Product </a> <b class="arrow"></b> </li> <li class=""> <a href="#"> <i class="menu-icon fa fa-eye pink"></i> View Products </a> <b class="arrow"></b> </li> </ul> </li> </ul> </li> </ul> </li> <li class="active open"> <a href="#" class="dropdown-toggle"> <i class="menu-icon fa fa-list"></i> <span class="menu-text"> Tables </span> <b class="arrow fa fa-angle-down"></b> </a> <b class="arrow"></b> <ul class="submenu"> <li class=""> <a href="tables.html"> <i class="menu-icon fa fa-caret-right"></i> Simple & Dynamic </a> <b class="arrow"></b> </li> <li class="active"> <a href="jqgrid.html"> <i class="menu-icon fa fa-caret-right"></i> jqGrid plugin </a> <b class="arrow"></b> </li> </ul> </li> <li class=""> <a href="#" class="dropdown-toggle"> <i class="menu-icon fa fa-pencil-square-o"></i> <span class="menu-text"> Forms </span> <b class="arrow fa fa-angle-down"></b> </a> <b class="arrow"></b> <ul class="submenu"> <li class=""> <a href="form-elements.html"> <i class="menu-icon fa fa-caret-right"></i> Form Elements </a> <b class="arrow"></b> </li> <li class=""> <a href="form-elements-2.html"> <i class="menu-icon fa fa-caret-right"></i> Form Elements 2 </a> <b class="arrow"></b> </li> <li class=""> <a href="form-wizard.html"> <i class="menu-icon fa fa-caret-right"></i> Wizard & Validation </a> <b class="arrow"></b> </li> <li class=""> <a href="wysiwyg.html"> <i class="menu-icon fa fa-caret-right"></i> Wysiwyg & Markdown </a> <b class="arrow"></b> </li> <li class=""> <a href="dropzone.html"> <i class="menu-icon fa fa-caret-right"></i> Dropzone File Upload </a> <b class="arrow"></b> </li> </ul> </li> <li class=""> <a href="widgets.html"> <i class="menu-icon fa fa-list-alt"></i> <span class="menu-text"> Widgets </span> </a> <b class="arrow"></b> </li> <li class=""> <a href="calendar.html"> <i class="menu-icon fa fa-calendar"></i> <span class="menu-text"> Calendar <span class="badge badge-transparent tooltip-error" title="2 Important Events"> <i class="ace-icon fa fa-exclamation-triangle red bigger-130"></i> </span> </span> </a> <b class="arrow"></b> </li> <li class=""> <a href="gallery.html"> <i class="menu-icon fa fa-picture-o"></i> <span class="menu-text"> Gallery </span> </a> <b class="arrow"></b> </li> <li class=""> <a href="#" class="dropdown-toggle"> <i class="menu-icon fa fa-tag"></i> <span class="menu-text"> More Pages </span> <b class="arrow fa fa-angle-down"></b> </a> <b class="arrow"></b> <ul class="submenu"> <li class=""> <a href="profile.html"> <i class="menu-icon fa fa-caret-right"></i> User Profile </a> <b class="arrow"></b> </li> <li class=""> <a href="inbox.html"> <i class="menu-icon fa fa-caret-right"></i> Inbox </a> <b class="arrow"></b> </li> <li class=""> <a href="pricing.html"> <i class="menu-icon fa fa-caret-right"></i> Pricing Tables </a> <b class="arrow"></b> </li> <li class=""> <a href="invoice.html"> <i class="menu-icon fa fa-caret-right"></i> Invoice </a> <b class="arrow"></b> </li> <li class=""> <a href="timeline.html"> <i class="menu-icon fa fa-caret-right"></i> Timeline </a> <b class="arrow"></b> </li> <li class=""> <a href="search.html"> <i class="menu-icon fa fa-caret-right"></i> Search Results </a> <b class="arrow"></b> </li> <li class=""> <a href="email.html"> <i class="menu-icon fa fa-caret-right"></i> Email Templates </a> <b class="arrow"></b> </li> <li class=""> <a href="login.html"> <i class="menu-icon fa fa-caret-right"></i> Login & Register </a> <b class="arrow"></b> </li> </ul> </li> <li class=""> <a href="#" class="dropdown-toggle"> <i class="menu-icon fa fa-file-o"></i> <span class="menu-text"> Other Pages <span class="badge badge-primary">5</span> </span> <b class="arrow fa fa-angle-down"></b> </a> <b class="arrow"></b> <ul class="submenu"> <li class=""> <a href="faq.html"> <i class="menu-icon fa fa-caret-right"></i> FAQ </a> <b class="arrow"></b> </li> <li class=""> <a href="error-404.html"> <i class="menu-icon fa fa-caret-right"></i> Error 404 </a> <b class="arrow"></b> </li> <li class=""> <a href="error-500.html"> <i class="menu-icon fa fa-caret-right"></i> Error 500 </a> <b class="arrow"></b> </li> <li class=""> <a href="grid.html"> <i class="menu-icon fa fa-caret-right"></i> Grid </a> <b class="arrow"></b> </li> <li class=""> <a href="blank.html"> <i class="menu-icon fa fa-caret-right"></i> Blank Page </a> <b class="arrow"></b> </li> </ul> </li> </ul><!-- /.nav-list --> <div class="sidebar-toggle sidebar-collapse" id="sidebar-collapse"> <i id="sidebar-toggle-icon" class="ace-icon fa fa-angle-double-left ace-save-state" data-icon1="ace-icon fa fa-angle-double-left" data-icon2="ace-icon fa fa-angle-double-right"></i> </div> </div> <div class="main-content"> <div class="main-content-inner"> <div class="breadcrumbs ace-save-state" id="breadcrumbs"> <ul class="breadcrumb"> <li> <i class="ace-icon fa fa-home home-icon"></i> <a href="#">Home</a> </li> <li> <a href="#">Tables</a> </li> <li class="active">jqGrid plugin</li> </ul><!-- /.breadcrumb --> <div class="nav-search" id="nav-search"> <form class="form-search"> <span class="input-icon"> <input type="text" placeholder="Search ..." class="nav-search-input" id="nav-search-input" autocomplete="off" /> <i class="ace-icon fa fa-search nav-search-icon"></i> </span> </form> </div><!-- /.nav-search --> </div> <div class="page-content"> <div class="ace-settings-container" id="ace-settings-container"> <div class="btn btn-app btn-xs btn-warning ace-settings-btn" id="ace-settings-btn"> <i class="ace-icon fa fa-cog bigger-130"></i> </div> <div class="ace-settings-box clearfix" id="ace-settings-box"> <div class="pull-left width-50"> <div class="ace-settings-item"> <div class="pull-left"> <select id="skin-colorpicker" class="hide"> <option data-skin="no-skin" value="#438EB9">#438EB9</option> <option data-skin="skin-1" value="#222A2D">#222A2D</option> <option data-skin="skin-2" value="#C6487E">#C6487E</option> <option data-skin="skin-3" value="#D0D0D0">#D0D0D0</option> </select> </div> <span> Choose Skin</span> </div> <div class="ace-settings-item"> <input type="checkbox" class="ace ace-checkbox-2 ace-save-state" id="ace-settings-navbar" autocomplete="off" /> <label class="lbl" for="ace-settings-navbar"> Fixed Navbar</label> </div> <div class="ace-settings-item"> <input type="checkbox" class="ace ace-checkbox-2 ace-save-state" id="ace-settings-sidebar" autocomplete="off" /> <label class="lbl" for="ace-settings-sidebar"> Fixed Sidebar</label> </div> <div class="ace-settings-item"> <input type="checkbox" class="ace ace-checkbox-2 ace-save-state" id="ace-settings-breadcrumbs" autocomplete="off" /> <label class="lbl" for="ace-settings-breadcrumbs"> Fixed Breadcrumbs</label> </div> <div class="ace-settings-item"> <input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-rtl" autocomplete="off" /> <label class="lbl" for="ace-settings-rtl"> Right To Left (rtl)</label> </div> <div class="ace-settings-item"> <input type="checkbox" class="ace ace-checkbox-2 ace-save-state" id="ace-settings-add-container" autocomplete="off" /> <label class="lbl" for="ace-settings-add-container"> Inside <b>.container</b> </label> </div> </div><!-- /.pull-left --> <div class="pull-left width-50"> <div class="ace-settings-item"> <input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-hover" autocomplete="off" /> <label class="lbl" for="ace-settings-hover"> Submenu on Hover</label> </div> <div class="ace-settings-item"> <input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-compact" autocomplete="off" /> <label class="lbl" for="ace-settings-compact"> Compact Sidebar</label> </div> <div class="ace-settings-item"> <input type="checkbox" class="ace ace-checkbox-2" id="ace-settings-highlight" autocomplete="off" /> <label class="lbl" for="ace-settings-highlight"> Alt. Active Item</label> </div> </div><!-- /.pull-left --> </div><!-- /.ace-settings-box --> </div><!-- /.ace-settings-container --> <div class="page-header"> <h1> jqGrid <small> <i class="ace-icon fa fa-angle-double-right"></i> Dynamic tables and grids using jqGrid plugin </small> </h1> </div><!-- /.page-header --> <div class="row"> <div class="col-xs-12"> <!-- PAGE CONTENT BEGINS --> <div class="alert alert-info"> <button class="close" data-dismiss="alert"> <i class="ace-icon fa fa-times"></i> </button> <i class="ace-icon fa fa-hand-o-right"></i> Please note that demo server is not configured to save the changes, therefore you may see an error message. </div> <table id="grid-table"></table> <div id="grid-pager"></div> <!-- PAGE CONTENT ENDS --> </div><!-- /.col --> </div><!-- /.row --> </div><!-- /.page-content --> </div> </div><!-- /.main-content --> <div class="footer"> <div class="footer-inner"> <div class="footer-content"> <span class="bigger-120"> <span class="blue bolder">Ace</span> Application © 2013-2014 </span> <span class="action-buttons"> <a href="#"> <i class="ace-icon fa fa-twitter-square light-blue bigger-150"></i> </a> <a href="#"> <i class="ace-icon fa fa-facebook-square text-primary bigger-150"></i> </a> <a href="#"> <i class="ace-icon fa fa-rss-square orange bigger-150"></i> </a> </span> </div> </div> </div> <a href="#" id="btn-scroll-up" class="btn-scroll-up btn btn-sm btn-inverse"> <i class="ace-icon fa fa-angle-double-up icon-only bigger-110"></i> </a> </div><!-- /.main-container --> <!-- basic scripts --> <!--[if !IE]> --> <script src="../assets/js/jquery-2.1.4.min.js"></script> <!-- <![endif]--> <!--[if IE]> <script src="../assets/js/jquery-1.11.3.min.js"></script> <![endif]--> <script type="text/javascript"> if('ontouchstart' in document.documentElement) document.write("<script src='../assets/js/jquery.mobile.custom.min.js'>"+"<"+"/script>"); </script> <script src="../assets/js/bootstrap.min.js"></script> <!-- page specific plugin scripts --> <script src="../assets/js/bootstrap-datepicker.min.js"></script> <script src="../assets/js/jquery.jqGrid.min.js"></script> <script src="../assets/js/grid.locale-en.js"></script> <!-- ace scripts --> <script src="../assets/js/ace-elements.min.js"></script> <script src="../assets/js/ace.min.js"></script> <!-- inline scripts related to this page --> <script type="text/javascript"> var grid_data = [ {id:"1",name:"Desktop Computer",note:"note",stock:"Yes",ship:"FedEx", sdate:"2007-12-03"}, {id:"2",name:"Laptop",note:"Long text ",stock:"Yes",ship:"InTime",sdate:"2007-12-03"}, {id:"3",name:"LCD Monitor",note:"note3",stock:"Yes",ship:"TNT",sdate:"2007-12-03"}, {id:"4",name:"Speakers",note:"note",stock:"No",ship:"ARAMEX",sdate:"2007-12-03"}, {id:"5",name:"Laser Printer",note:"note2",stock:"Yes",ship:"FedEx",sdate:"2007-12-03"}, {id:"6",name:"Play Station",note:"note3",stock:"No", ship:"FedEx",sdate:"2007-12-03"}, {id:"7",name:"Mobile Telephone",note:"note",stock:"Yes",ship:"ARAMEX",sdate:"2007-12-03"}, {id:"8",name:"Server",note:"note2",stock:"Yes",ship:"TNT",sdate:"2007-12-03"}, {id:"9",name:"Matrix Printer",note:"note3",stock:"No", ship:"FedEx",sdate:"2007-12-03"}, {id:"10",name:"Desktop Computer",note:"note",stock:"Yes",ship:"FedEx", sdate:"2007-12-03"}, {id:"11",name:"Laptop",note:"Long text ",stock:"Yes",ship:"InTime",sdate:"2007-12-03"}, {id:"12",name:"LCD Monitor",note:"note3",stock:"Yes",ship:"TNT",sdate:"2007-12-03"}, {id:"13",name:"Speakers",note:"note",stock:"No",ship:"ARAMEX",sdate:"2007-12-03"}, {id:"14",name:"Laser Printer",note:"note2",stock:"Yes",ship:"FedEx",sdate:"2007-12-03"}, {id:"15",name:"Play Station",note:"note3",stock:"No", ship:"FedEx",sdate:"2007-12-03"}, {id:"16",name:"Mobile Telephone",note:"note",stock:"Yes",ship:"ARAMEX",sdate:"2007-12-03"}, {id:"17",name:"Server",note:"note2",stock:"Yes",ship:"TNT",sdate:"2007-12-03"}, {id:"18",name:"Matrix Printer",note:"note3",stock:"No", ship:"FedEx",sdate:"2007-12-03"}, {id:"19",name:"Matrix Printer",note:"note3",stock:"No", ship:"FedEx",sdate:"2007-12-03"}, {id:"20",name:"Desktop Computer",note:"note",stock:"Yes",ship:"FedEx", sdate:"2007-12-03"}, {id:"21",name:"Laptop",note:"Long text ",stock:"Yes",ship:"InTime",sdate:"2007-12-03"}, {id:"22",name:"LCD Monitor",note:"note3",stock:"Yes",ship:"TNT",sdate:"2007-12-03"}, {id:"23",name:"Speakers",note:"note",stock:"No",ship:"ARAMEX",sdate:"2007-12-03"} ]; var subgrid_data = [ {id:"1", name:"sub grid item 1", qty: 11}, {id:"2", name:"sub grid item 2", qty: 3}, {id:"3", name:"sub grid item 3", qty: 12}, {id:"4", name:"sub grid item 4", qty: 5}, {id:"5", name:"sub grid item 5", qty: 2}, {id:"6", name:"sub grid item 6", qty: 9}, {id:"7", name:"sub grid item 7", qty: 3}, {id:"8", name:"sub grid item 8", qty: 8} ]; jQuery(function($) { var grid_selector = "#grid-table"; var pager_selector = "#grid-pager"; var parent_column = $(grid_selector).closest('[class*="col-"]'); //resize to fit page size $(window).on('resize.jqGrid', function () { $(grid_selector).jqGrid( 'setGridWidth', parent_column.width() ); }) //resize on sidebar collapse/expand $(document).on('settings.ace.jqGrid' , function(ev, event_name, collapsed) { if( event_name === 'sidebar_collapsed' || event_name === 'main_container_fixed' ) { //setTimeout is for webkit only to give time for DOM changes and then redraw!!! setTimeout(function() { $(grid_selector).jqGrid( 'setGridWidth', parent_column.width() ); }, 20); } }) //if your grid is inside another element, for example a tab pane, you should use its parent's width: /** $(window).on('resize.jqGrid', function () { var parent_width = $(grid_selector).closest('.tab-pane').width(); $(grid_selector).jqGrid( 'setGridWidth', parent_width ); }) //and also set width when tab pane becomes visible $('#myTab a[data-toggle="tab"]').on('shown.bs.tab', function (e) { if($(e.target).attr('href') == '#mygrid') { var parent_width = $(grid_selector).closest('.tab-pane').width(); $(grid_selector).jqGrid( 'setGridWidth', parent_width ); } }) */ jQuery(grid_selector).jqGrid({ //direction: "rtl", //subgrid options subGrid : true, //subGridModel: [{ name : ['No','Item Name','Qty'], width : [55,200,80] }], //datatype: "xml", subGridOptions : { plusicon : "ace-icon fa fa-plus center bigger-110 blue", minusicon : "ace-icon fa fa-minus center bigger-110 blue", openicon : "ace-icon fa fa-chevron-right center orange" }, //for this example we are using local data subGridRowExpanded: function (subgridDivId, rowId) { var subgridTableId = subgridDivId + "_t"; $("#" + subgridDivId).html("<table id='" + subgridTableId + "'></table>"); $("#" + subgridTableId).jqGrid({ datatype: 'local', data: subgrid_data, colNames: ['No','Item Name','Qty'], colModel: [ { name: 'id', width: 50 }, { name: 'name', width: 150 }, { name: 'qty', width: 50 } ] }); }, data: grid_data, datatype: "local", height: 250, colNames:[' ', 'ID','Last Sales','Name', 'Stock', 'Ship via','Notes'], colModel:[ {name:'myac',index:'', width:80, fixed:true, sortable:false, resize:false, formatter:'actions', formatoptions:{ keys:true, //delbutton: false,//disable delete button delOptions:{recreateForm: true, beforeShowForm:beforeDeleteCallback}, //editformbutton:true, editOptions:{recreateForm: true, beforeShowForm:beforeEditCallback} } }, {name:'id',index:'id', width:60, sorttype:"int", editable: true}, {name:'sdate',index:'sdate',width:90, editable:true, sorttype:"date",unformat: pickDate}, {name:'name',index:'name', width:150,editable: true,editoptions:{size:"20",maxlength:"30"}}, {name:'stock',index:'stock', width:70, editable: true,edittype:"checkbox",editoptions: {value:"Yes:No"},unformat: aceSwitch}, {name:'ship',index:'ship', width:90, editable: true,edittype:"select",editoptions:{value:"FE:FedEx;IN:InTime;TN:TNT;AR:ARAMEX"}}, {name:'note',index:'note', width:150, sortable:false,editable: true,edittype:"textarea", editoptions:{rows:"2",cols:"10"}} ], viewrecords : true, rowNum:10, rowList:[10,20,30], pager : pager_selector, altRows: true, //toppager: true, multiselect: true, //multikey: "ctrlKey", multiboxonly: true, loadComplete : function() { var table = this; setTimeout(function(){ styleCheckbox(table); updateActionIcons(table); updatePagerIcons(table); enableTooltips(table); }, 0); }, editurl: "./dummy.php",//nothing is saved caption: "jqGrid with inline editing" //,autowidth: true, /** , grouping:true, groupingView : { groupField : ['name'], groupDataSorted : true, plusicon : 'fa fa-chevron-down bigger-110', minusicon : 'fa fa-chevron-up bigger-110' }, caption: "Grouping" */ }); $(window).triggerHandler('resize.jqGrid');//trigger window resize to make the grid get the correct size //enable search/filter toolbar //jQuery(grid_selector).jqGrid('filterToolbar',{defaultSearch:true,stringResult:true}) //jQuery(grid_selector).filterToolbar({}); //switch element when editing inline function aceSwitch( cellvalue, options, cell ) { setTimeout(function(){ $(cell) .find('input[type=checkbox]') .addClass('ace ace-switch ace-switch-5') .after('<span class="lbl"></span>'); }, 0); } //enable datepicker function pickDate( cellvalue, options, cell ) { setTimeout(function(){ $(cell) .find('input[type=text]') .datepicker({format:'yyyy-mm-dd' , autoclose:true}); }, 0); } //navButtons jQuery(grid_selector).jqGrid('navGrid',pager_selector, { //navbar options edit: true, editicon : 'ace-icon fa fa-pencil blue', add: true, addicon : 'ace-icon fa fa-plus-circle purple', del: true, delicon : 'ace-icon fa fa-trash-o red', search: true, searchicon : 'ace-icon fa fa-search orange', refresh: true, refreshicon : 'ace-icon fa fa-refresh green', view: true, viewicon : 'ace-icon fa fa-search-plus grey', }, { //edit record form //closeAfterEdit: true, //width: 700, recreateForm: true, beforeShowForm : function(e) { var form = $(e[0]); form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class="widget-header" />') style_edit_form(form); } }, { //new record form //width: 700, closeAfterAdd: true, recreateForm: true, viewPagerButtons: false, beforeShowForm : function(e) { var form = $(e[0]); form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar') .wrapInner('<div class="widget-header" />') style_edit_form(form); } }, { //delete record form recreateForm: true, beforeShowForm : function(e) { var form = $(e[0]); if(form.data('styled')) return false; form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class="widget-header" />') style_delete_form(form); form.data('styled', true); }, onClick : function(e) { //alert(1); } }, { //search form recreateForm: true, afterShowSearch: function(e){ var form = $(e[0]); form.closest('.ui-jqdialog').find('.ui-jqdialog-title').wrap('<div class="widget-header" />') style_search_form(form); }, afterRedraw: function(){ style_search_filters($(this)); } , multipleSearch: true, /** multipleGroup:true, showQuery: true */ }, { //view record form recreateForm: true, beforeShowForm: function(e){ var form = $(e[0]); form.closest('.ui-jqdialog').find('.ui-jqdialog-title').wrap('<div class="widget-header" />') } } ) function style_edit_form(form) { //enable datepicker on "sdate" field and switches for "stock" field form.find('input[name=sdate]').datepicker({format:'yyyy-mm-dd' , autoclose:true}) form.find('input[name=stock]').addClass('ace ace-switch ace-switch-5').after('<span class="lbl"></span>'); //don't wrap inside a label element, the checkbox value won't be submitted (POST'ed) //.addClass('ace ace-switch ace-switch-5').wrap('<label class="inline" />').after('<span class="lbl"></span>'); //update buttons classes var buttons = form.next().find('.EditButton .fm-button'); buttons.addClass('btn btn-sm').find('[class*="-icon"]').hide();//ui-icon, s-icon buttons.eq(0).addClass('btn-primary').prepend('<i class="ace-icon fa fa-check"></i>'); buttons.eq(1).prepend('<i class="ace-icon fa fa-times"></i>') buttons = form.next().find('.navButton a'); buttons.find('.ui-icon').hide(); buttons.eq(0).append('<i class="ace-icon fa fa-chevron-left"></i>'); buttons.eq(1).append('<i class="ace-icon fa fa-chevron-right"></i>'); } function style_delete_form(form) { var buttons = form.next().find('.EditButton .fm-button'); buttons.addClass('btn btn-sm btn-white btn-round').find('[class*="-icon"]').hide();//ui-icon, s-icon buttons.eq(0).addClass('btn-danger').prepend('<i class="ace-icon fa fa-trash-o"></i>'); buttons.eq(1).addClass('btn-default').prepend('<i class="ace-icon fa fa-times"></i>') } function style_search_filters(form) { form.find('.delete-rule').val('X'); form.find('.add-rule').addClass('btn btn-xs btn-primary'); form.find('.add-group').addClass('btn btn-xs btn-success'); form.find('.delete-group').addClass('btn btn-xs btn-danger'); } function style_search_form(form) { var dialog = form.closest('.ui-jqdialog'); var buttons = dialog.find('.EditTable') buttons.find('.EditButton a[id*="_reset"]').addClass('btn btn-sm btn-info').find('.ui-icon').attr('class', 'ace-icon fa fa-retweet'); buttons.find('.EditButton a[id*="_query"]').addClass('btn btn-sm btn-inverse').find('.ui-icon').attr('class', 'ace-icon fa fa-comment-o'); buttons.find('.EditButton a[id*="_search"]').addClass('btn btn-sm btn-purple').find('.ui-icon').attr('class', 'ace-icon fa fa-search'); } function beforeDeleteCallback(e) { var form = $(e[0]); if(form.data('styled')) return false; form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class="widget-header" />') style_delete_form(form); form.data('styled', true); } function beforeEditCallback(e) { var form = $(e[0]); form.closest('.ui-jqdialog').find('.ui-jqdialog-titlebar').wrapInner('<div class="widget-header" />') style_edit_form(form); } //it causes some flicker when reloading or navigating grid //it may be possible to have some custom formatter to do this as the grid is being created to prevent this //or go back to default browser checkbox styles for the grid function styleCheckbox(table) { /** $(table).find('input:checkbox').addClass('ace') .wrap('<label />') .after('<span class="lbl align-top" />') $('.ui-jqgrid-labels th[id*="_cb"]:first-child') .find('input.cbox[type=checkbox]').addClass('ace') .wrap('<label />').after('<span class="lbl align-top" />'); */ } //unlike navButtons icons, action icons in rows seem to be hard-coded //you can change them like this in here if you want function updateActionIcons(table) { /** var replacement = { 'ui-ace-icon fa fa-pencil' : 'ace-icon fa fa-pencil blue', 'ui-ace-icon fa fa-trash-o' : 'ace-icon fa fa-trash-o red', 'ui-icon-disk' : 'ace-icon fa fa-check green', 'ui-icon-cancel' : 'ace-icon fa fa-times red' }; $(table).find('.ui-pg-div span.ui-icon').each(function(){ var icon = $(this); var $class = $.trim(icon.attr('class').replace('ui-icon', '')); if($class in replacement) icon.attr('class', 'ui-icon '+replacement[$class]); }) */ } //replace icons with FontAwesome icons like above function updatePagerIcons(table) { var replacement = { 'ui-icon-seek-first' : 'ace-icon fa fa-angle-double-left bigger-140', 'ui-icon-seek-prev' : 'ace-icon fa fa-angle-left bigger-140', 'ui-icon-seek-next' : 'ace-icon fa fa-angle-right bigger-140', 'ui-icon-seek-end' : 'ace-icon fa fa-angle-double-right bigger-140' }; $('.ui-pg-table:not(.navtable) > tbody > tr > .ui-pg-button > .ui-icon').each(function(){ var icon = $(this); var $class = $.trim(icon.attr('class').replace('ui-icon', '')); if($class in replacement) icon.attr('class', 'ui-icon '+replacement[$class]); }) } function enableTooltips(table) { $('.navtable .ui-pg-button').tooltip({container:'body'}); $(table).find('.ui-pg-div').tooltip({container:'body'}); } //var selr = jQuery(grid_selector).jqGrid('getGridParam','selrow'); $(document).one('ajaxloadstart.page', function(e) { $.jgrid.gridDestroy(grid_selector); $('.ui-jqdialog').remove(); }); }); </script> </body> </html> ConsoleService/src/main/resources/html/login.html
@@ -40,7 +40,7 @@ <div class="main-content"> <div class="row"> <div class="col-sm-10 col-sm-offset-1"> <div class="login-container"> <div class="login-container" style="margin-top: 100px;"> <div class="center"> <h1> <i class="ace-icon fa fa-leaf green"></i> @@ -50,6 +50,7 @@ <h4 class="blue" id="id-company-text">© java110开发团队</h4> </div> <div class="space-6"></div> <div class="space-6"></div> <div class="position-relative"> @@ -67,29 +68,33 @@ <fieldset> <label class="block clearfix"> <span class="block input-icon input-icon-right"> <input type="text" class="form-control" placeholder="请输入用户编码" /> <input type="text" id="userCode" class="form-control" placeholder="请输入用户编码" /> <i class="ace-icon fa fa-user"></i> </span> </label> <label class="block clearfix"> <span class="block input-icon input-icon-right"> <input type="password" class="form-control" placeholder="请输入密码" /> <input type="password" id="userPwd" class="form-control" placeholder="请输入密码" /> <i class="ace-icon fa fa-lock"></i> </span> </label> <span id="errorInfo" style="display:none;color:#DD5A43!important"> 用户编码错误 </span> <div class="space"></div> <div class="clearfix"> <button type="button" class="width-35 pull-right btn btn-sm btn-primary"> <button type="button" class="width-35 pull-right btn btn-sm btn-primary" onclick="auth()"> <i class="ace-icon fa fa-key"></i> <span class="bigger-110">登录</span> </button> </div> <div class="space-4"></div> </fieldset> </form> @@ -117,7 +122,8 @@ <!--[if IE]> <script src="../assets/js/jquery-1.11.3.min.js"></script> <![endif]--> <script src="../javascript/login.js"></script> <script src="../javascript/java110_req_data.js"></script> <script src="../javascript/java110_auth.js"></script> <script type="text/javascript"> if('ontouchstart' in document.documentElement) document.write("<script src='../assets/js/jquery.mobile.custom.min.js'>"+"<"+"/script>"); </script> ConsoleService/src/main/resources/html/menu.html
@@ -7,7 +7,7 @@ <ul class="nav nav-list"> <li class="active"> <a href="index.html"> <a href="/"> <i class="menu-icon fa fa-tachometer"></i> <span class="menu-text"> 我的菜单 </span> </a> ConsoleService/src/main/resources/javascript/java110_auth.js
ConsoleService/src/main/resources/javascript/java110_req_data.js
ConsoleService/src/main/resources/static/assets/css/ace-ie.min.css
ConsoleService/src/main/resources/static/assets/css/ace-part2.min.css
ConsoleService/src/main/resources/static/assets/css/ace-rtl.min.css
ConsoleService/src/main/resources/static/assets/css/ace-skins.min.css
ConsoleService/src/main/resources/static/assets/css/ace.min.css
ConsoleService/src/main/resources/static/assets/css/bootstrap-colorpicker.min.css
ConsoleService/src/main/resources/static/assets/css/bootstrap-datepicker3.min.css
ConsoleService/src/main/resources/static/assets/css/bootstrap-datetimepicker.min.css
ConsoleService/src/main/resources/static/assets/css/bootstrap-duallistbox.min.css
ConsoleService/src/main/resources/static/assets/css/bootstrap-editable.min.css
ConsoleService/src/main/resources/static/assets/css/bootstrap-multiselect.min.css
ConsoleService/src/main/resources/static/assets/css/bootstrap-timepicker.min.css
ConsoleService/src/main/resources/static/assets/css/bootstrap.min.css
ConsoleService/src/main/resources/static/assets/css/chosen.min.css
ConsoleService/src/main/resources/static/assets/css/colorbox.min.css
ConsoleService/src/main/resources/static/assets/css/daterangepicker.min.css
ConsoleService/src/main/resources/static/assets/css/dropzone.min.css
ConsoleService/src/main/resources/static/assets/css/font-awesome.min.css
ConsoleService/src/main/resources/static/assets/css/fonts.googleapis.com.css
ConsoleService/src/main/resources/static/assets/css/fullcalendar.min.css
ConsoleService/src/main/resources/static/assets/css/images/meteorshower2.jpgConsoleService/src/main/resources/static/assets/css/images/pattern.jpgConsoleService/src/main/resources/static/assets/css/jquery-ui.custom.min.css
ConsoleService/src/main/resources/static/assets/css/jquery-ui.min.css
ConsoleService/src/main/resources/static/assets/css/jquery.gritter.min.css
ConsoleService/src/main/resources/static/assets/css/prettify.min.css
ConsoleService/src/main/resources/static/assets/css/select2.min.css
ConsoleService/src/main/resources/static/assets/css/ui.jqgrid.min.css
ConsoleService/src/main/resources/static/assets/font-awesome/4.5.0/css/font-awesome.min.css
ConsoleService/src/main/resources/static/assets/font-awesome/4.5.0/fonts/fontawesome-webfont.eotBinary files differ
ConsoleService/src/main/resources/static/assets/font-awesome/4.5.0/fonts/fontawesome-webfont.svg
ConsoleService/src/main/resources/static/assets/font-awesome/4.5.0/fonts/fontawesome-webfont.ttfBinary files differ
ConsoleService/src/main/resources/static/assets/font-awesome/4.5.0/fonts/fontawesome-webfont.woffBinary files differ
ConsoleService/src/main/resources/static/assets/font-awesome/4.5.0/fonts/fontawesome-webfont.woff2Binary files differ
ConsoleService/src/main/resources/static/assets/fonts/glyphicons-halflings-regular.eotBinary files differ
ConsoleService/src/main/resources/static/assets/fonts/glyphicons-halflings-regular.svg
ConsoleService/src/main/resources/static/assets/fonts/glyphicons-halflings-regular.ttfBinary files differ
ConsoleService/src/main/resources/static/assets/fonts/glyphicons-halflings-regular.woffBinary files differ
ConsoleService/src/main/resources/static/assets/fonts/glyphicons-halflings-regular.woff2Binary files differ
ConsoleService/src/main/resources/static/assets/images/avatars/avatar.pngConsoleService/src/main/resources/static/assets/images/avatars/avatar1.pngConsoleService/src/main/resources/static/assets/images/avatars/avatar2.pngConsoleService/src/main/resources/static/assets/images/avatars/avatar3.pngConsoleService/src/main/resources/static/assets/images/avatars/avatar4.pngConsoleService/src/main/resources/static/assets/images/avatars/avatar5.pngConsoleService/src/main/resources/static/assets/images/avatars/profile-pic.jpgConsoleService/src/main/resources/static/assets/images/avatars/user.jpgConsoleService/src/main/resources/static/assets/images/bootstrap-colorpicker/alpha-horizontal.pngConsoleService/src/main/resources/static/assets/images/bootstrap-colorpicker/alpha.pngConsoleService/src/main/resources/static/assets/images/bootstrap-colorpicker/hue-horizontal.pngConsoleService/src/main/resources/static/assets/images/bootstrap-colorpicker/hue.pngConsoleService/src/main/resources/static/assets/images/bootstrap-colorpicker/saturation.pngConsoleService/src/main/resources/static/assets/images/email/email1.pngConsoleService/src/main/resources/static/assets/images/email/email2.pngConsoleService/src/main/resources/static/assets/images/email/email3.pngConsoleService/src/main/resources/static/assets/images/email/email4.pngConsoleService/src/main/resources/static/assets/images/gallery/image-1.jpgConsoleService/src/main/resources/static/assets/images/gallery/image-2.jpgConsoleService/src/main/resources/static/assets/images/gallery/image-3.jpgConsoleService/src/main/resources/static/assets/images/gallery/image-4.jpgConsoleService/src/main/resources/static/assets/images/gallery/image-5.jpgConsoleService/src/main/resources/static/assets/images/gallery/image-6.jpgConsoleService/src/main/resources/static/assets/images/gallery/thumb-1.jpgConsoleService/src/main/resources/static/assets/images/gallery/thumb-2.jpgConsoleService/src/main/resources/static/assets/images/gallery/thumb-3.jpgConsoleService/src/main/resources/static/assets/images/gallery/thumb-4.jpgConsoleService/src/main/resources/static/assets/images/gallery/thumb-5.jpgConsoleService/src/main/resources/static/assets/images/gallery/thumb-6.jpgConsoleService/src/main/resources/static/assets/images/placeholder/165x90.pngConsoleService/src/main/resources/static/assets/images/placeholder/255x150.pngConsoleService/src/main/resources/static/assets/images/placeholder/530x270.pngConsoleService/src/main/resources/static/assets/images/placeholder/550x280.pngConsoleService/src/main/resources/static/assets/js/ace-editable.min.js
ConsoleService/src/main/resources/static/assets/js/ace-elements.min.js
ConsoleService/src/main/resources/static/assets/js/ace-extra.min.js
ConsoleService/src/main/resources/static/assets/js/ace.min.js
ConsoleService/src/main/resources/static/assets/js/autosize.min.js
ConsoleService/src/main/resources/static/assets/js/bootbox.js
ConsoleService/src/main/resources/static/assets/js/bootstrap-colorpicker.min.js
ConsoleService/src/main/resources/static/assets/js/bootstrap-datepicker.min.js
ConsoleService/src/main/resources/static/assets/js/bootstrap-datetimepicker.min.js
ConsoleService/src/main/resources/static/assets/js/bootstrap-editable.min.js
ConsoleService/src/main/resources/static/assets/js/bootstrap-markdown.min.js
ConsoleService/src/main/resources/static/assets/js/bootstrap-multiselect.min.js
ConsoleService/src/main/resources/static/assets/js/bootstrap-tag.min.js
ConsoleService/src/main/resources/static/assets/js/bootstrap-timepicker.min.js
ConsoleService/src/main/resources/static/assets/js/bootstrap-wysiwyg.min.js
ConsoleService/src/main/resources/static/assets/js/bootstrap.min.js
ConsoleService/src/main/resources/static/assets/js/buttons.colVis.min.js
ConsoleService/src/main/resources/static/assets/js/buttons.flash.min.js
ConsoleService/src/main/resources/static/assets/js/buttons.html5.min.js
ConsoleService/src/main/resources/static/assets/js/buttons.print.min.js
ConsoleService/src/main/resources/static/assets/js/chosen.jquery.min.js
ConsoleService/src/main/resources/static/assets/js/dataTables.buttons.min.js
ConsoleService/src/main/resources/static/assets/js/dataTables.select.min.js
ConsoleService/src/main/resources/static/assets/js/daterangepicker.min.js
ConsoleService/src/main/resources/static/assets/js/dropzone.min.js
ConsoleService/src/main/resources/static/assets/js/excanvas.min.js
ConsoleService/src/main/resources/static/assets/js/fullcalendar.min.js
ConsoleService/src/main/resources/static/assets/js/grid.locale-en.js
ConsoleService/src/main/resources/static/assets/js/holder.min.js
ConsoleService/src/main/resources/static/assets/js/html5shiv.min.js
ConsoleService/src/main/resources/static/assets/js/jquery-1.11.3.min.js
ConsoleService/src/main/resources/static/assets/js/jquery-2.1.4.min.js
ConsoleService/src/main/resources/static/assets/js/jquery-additional-methods.min.js
ConsoleService/src/main/resources/static/assets/js/jquery-typeahead.js
ConsoleService/src/main/resources/static/assets/js/jquery-ui.custom.min.js
ConsoleService/src/main/resources/static/assets/js/jquery-ui.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.bootstrap-duallistbox.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.colorbox.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.dataTables.bootstrap.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.dataTables.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.easypiechart.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.flot.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.flot.pie.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.flot.resize.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.gritter.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.hotkeys.index.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.inputlimiter.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.jqGrid.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.knob.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.maskedinput.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.mobile.custom.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.nestable.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.raty.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.sparkline.index.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.ui.touch-punch.min.js
ConsoleService/src/main/resources/static/assets/js/jquery.validate.min.js
ConsoleService/src/main/resources/static/assets/js/markdown.min.js
ConsoleService/src/main/resources/static/assets/js/moment.min.js
ConsoleService/src/main/resources/static/assets/js/prettify.min.js
ConsoleService/src/main/resources/static/assets/js/respond.min.js
ConsoleService/src/main/resources/static/assets/js/select2.min.js
ConsoleService/src/main/resources/static/assets/js/spin.js
ConsoleService/src/main/resources/static/assets/js/spinbox.min.js
ConsoleService/src/main/resources/static/assets/js/tree.min.js
ConsoleService/src/main/resources/static/assets/js/wizard.min.js
ConsoleService/src/main/resources/static/assets/swf/flashExport.swfBinary files differ
ConsoleService/src/main/resources/static/javascript/java110_auth.js
New file @@ -0,0 +1,53 @@ function auth(){ var userCode = $('#userCode').val(); var userPwd = $('#userPwd').val(); if(userCode == '' || userPwd == ''){ alertText("用户编码或密码不能为空") return ; } // 清除提示 clearAlertText(); doLogin(userCode,userPwd); } function clearAlertText(){ $("#errorInfo").html(''); $("#errorInfo").hide(); } function alertText(message){ $("#errorInfo").html(message); $("#errorInfo").show(); } function doLogin(userCode,userPwd){ var reqJson = JSON.stringify(createRequestData("login",{"userCode":userCode,"userPwd":userPwd,"pageSign":""})); $.ajax({ type: "POST", url: "/loginRest/login", data: reqJson, contentType: "application/text", dataType:"text", success: function(data){ processResponse(data); }, error: function(data){ alertText("网络超时,请稍后再试"); } }); } function processResponse(data){ var data = getResponseInfo(data) if(data.code != "0000"){ alertText(data.msg+",错误ID:"+data.id); return ; } $(location).attr('href', '/'); } ConsoleService/src/main/resources/static/javascript/java110_req_data.js
New file @@ -0,0 +1,43 @@ /** { "meta":{ "method":"",//主要用于,日志记录 "requestTime":"", "transactionId":"请求流水" //不需要填 有系统统一设置 }, "param":{ //这里写参数 } } **/ function createRequestData(method,reqParam){ var reqJson = { "meta":{ "method":method,//主要用于,日志记录 "requestTime":nowtime(), }, "param":{ //这里写参数 } }; reqJson.param = reqParam; return reqJson; } function nowtime(){ var time = new Date(); return time.getFullYear()+((time.getMonth()+1) > 9 ? (time.getMonth()+1) :'0'+(time.getMonth()+1))+(time.getDate()>9?time.getDate():'0'+time.getDate())+(time.getHours()>9?'':'0') +time.getHours()+(time.getMinutes()>9?'':'0') +time.getMinutes()+(time.getSeconds()>9?'':'0')+time.getSeconds() } function getResponseInfo(data){ var dataObj = eval('(' + data + ')'); // var dataObj = JSON.parse(data); var meta = dataObj.meta; var resData = {"code":meta.code,"msg":meta.message,"id":meta.transactionId,"data":dataObj.data} return resData; } Readme.md
@@ -10,133 +10,57 @@ 技术架构: Java + spring cloud + mybatis + mysql + activemq + redis Java + spring cloud + mybatis + mysql + kafka + redis 1.0 小区商家 1 美食 外卖 生鲜 超市 家政 其他 2.0 小区物业 2 小区公告 物业缴费(先不实现,只是用于通知作用,如电费,水费,气费) 房屋登记(先不实现) 停车位登记(先不实现) 意见保修 3.0 小区论坛 5 4.0 小区二手交易服务(后期实现) 5.0 小区拼车服务(附近小区显示5公里之内) 4 6.0 小区运动排名 6 服务依赖关系 目前提供服务: 1、上下班顺风车服务,用户发布服务,车主联系提供服务。 2、超市,便利店,饭馆外卖,家政商家入驻,提供送货上门服务,主要优势为,商家可以不需要花昂贵的钱租店铺,只需在家提供服务,为小区内无工作者提供就业机会。 3、为物业管理者提供免费的小区公告发布服务,方便及时查看公告,如 停电,停水 公告。 4、免费意见报修服务,用户可以向客户反馈自己的意见,和需要维修的东西,以至于物业管理者及时处理 5、小区论坛,方便小区内交流(正在规划中,欢迎合作)。 订单调度流程: 这里以wechat 服务 order 服务 user服务 为例说明   1>、受理过程 调用方发起订单受理,订单服务根据订单中每个(busiOrder节点下的actionTypeCd)业务动作,将订单信息预处理后转发相应模块受理数据。 服务安装说明: 2>、撤单过程 通用方发起撤单,订单服务根据撤单的boId 从数据库中查询信息,分别调相应服务撤单处理。 1、安装mysql,kafka,redis,git ,maven (详细安装请Google或百度) 3>、事物补偿 如果以上有失败的情况下,作废当前订单信息,订单服务发起消息广播(activemq 消息广播方式),让各模块监听广播监听相应数据,恢复以前数据。 2、git clone https://github.com/java110/MicroCommunity.git 下载代码 重要说明: 3、在相应服务下(如:CenterService 服务) src/main/application.yml 中修改mysql地址、用户名和密码、kafka地址、redis地址 订单调度 外围系统 如用户服务系统,商户服务系统,支付服务系统,必须要实现以下接口: 4、进入MicroCommunity 目录 执行 mvn clean install 打包 1、受理接口 2、作废订单接口 请求协议为: { 'data': [ 5、配置数据 将 java110-config/db 下的CenterService 和 ConsoleService 中的create_table.db 导入数据库中 { 'olId':'123456', 'newBoId': '123456', 'boId': '222222', 'actionTypeCd': 'C1' }, { 'olId':'123456', 'newBoId': '123456', 'boId': '222222', 'actionTypeCd': 'C1' }, { 'olId':'123456', 'newBoId': '123456', 'boId': '222222', 'actionTypeCd': 'C1' } ] } 6、启动 (1) 启动 eureka 命令为 java -jar eureka.jar (2) 启动 CenterService 命令为 java -jar CenterService.jar (3) 启动 ConsoleService 命令为 java -jar ConsoleService.jar 7、用post工具属性缓存 地址为:http://yourIp:8001/cacheApi/flush 如下图:  3、补偿事物(目前是activemq) 请求报文 这里data下为所有要作废的订单boId 8、在浏览器输入 http://yourIp:6001/ 如下图 { 'data': [  点击高级,继续前往。 9、登录系统,用户名为 admin 密码为 admin 如下图  点击登录,进入如下图: { 'boId': '222222', 'actionTypeCd': 'C1' }, { 'boId': '222222', 'actionTypeCd': 'M1' }, { 'boId': '222222', 'actionTypeCd': 'C1' } ] } 统一返回报文模板为: {  "RESULT_CODE": "0000", "RESULT_MSG": "成功", "RESULT_INFO":{} } RESULT_CODE 结果编码 0000 表示成功 1999 表示失败 RESULT_MSG 描述信息 RESULT_INFO 需要附带信息时,可以添加在这里 10、统一接口地址:http://yourIp:8001/httpApi/service 加入钉钉java110 工作群随时了解项目进度,和java110开发者零距离沟通 ReadmeBak.md
New file @@ -0,0 +1,145 @@ 微小区平台 分支说明: 分支管理说明,test为最新代码未测试代码(主要为了防止本地代码遗失),master 为最新测试过代码(待产品化),product 为产品化代码 开发工具: java1.8 + idea/eclipse + mysql 技术架构: Java + spring cloud + mybatis + mysql + activemq + redis 1.0 小区商家 1 美食 外卖 生鲜 超市 家政 其他 2.0 小区物业 2 小区公告 物业缴费(先不实现,只是用于通知作用,如电费,水费,气费) 房屋登记(先不实现) 停车位登记(先不实现) 意见保修 3.0 小区论坛 5 4.0 小区二手交易服务(后期实现) 5.0 小区拼车服务(附近小区显示5公里之内) 4 6.0 小区运动排名 6 目前提供服务: 1、上下班顺风车服务,用户发布服务,车主联系提供服务。 2、超市,便利店,饭馆外卖,家政商家入驻,提供送货上门服务,主要优势为,商家可以不需要花昂贵的钱租店铺,只需在家提供服务,为小区内无工作者提供就业机会。 3、为物业管理者提供免费的小区公告发布服务,方便及时查看公告,如 停电,停水 公告。 4、免费意见报修服务,用户可以向客户反馈自己的意见,和需要维修的东西,以至于物业管理者及时处理 5、小区论坛,方便小区内交流(正在规划中,欢迎合作)。 订单调度流程: 这里以wechat 服务 order 服务 user服务 为例说明  1>、受理过程 调用方发起订单受理,订单服务根据订单中每个(busiOrder节点下的actionTypeCd)业务动作,将订单信息预处理后转发相应模块受理数据。 2>、撤单过程 通用方发起撤单,订单服务根据撤单的boId 从数据库中查询信息,分别调相应服务撤单处理。 3>、事物补偿 如果以上有失败的情况下,作废当前订单信息,订单服务发起消息广播(activemq 消息广播方式),让各模块监听广播监听相应数据,恢复以前数据。 重要说明: 订单调度 外围系统 如用户服务系统,商户服务系统,支付服务系统,必须要实现以下接口: 1、受理接口 2、作废订单接口 请求协议为: { 'data': [ { 'olId':'123456', 'newBoId': '123456', 'boId': '222222', 'actionTypeCd': 'C1' }, { 'olId':'123456', 'newBoId': '123456', 'boId': '222222', 'actionTypeCd': 'C1' }, { 'olId':'123456', 'newBoId': '123456', 'boId': '222222', 'actionTypeCd': 'C1' } ] } 3、补偿事物(目前是activemq) 请求报文 这里data下为所有要作废的订单boId { 'data': [ { 'boId': '222222', 'actionTypeCd': 'C1' }, { 'boId': '222222', 'actionTypeCd': 'M1' }, { 'boId': '222222', 'actionTypeCd': 'C1' } ] } 统一返回报文模板为: { "RESULT_CODE": "0000", "RESULT_MSG": "成功", "RESULT_INFO":{} } RESULT_CODE 结果编码 0000 表示成功 1999 表示失败 RESULT_MSG 描述信息 RESULT_INFO 需要附带信息时,可以添加在这里 加入钉钉java110 工作群随时了解项目进度,和java110开发者零距离沟通  eureka/src/main/resources/application.yml
@@ -1,7 +1,9 @@ server: port: 8761 # 指定该Eureka实例的端口 eureka: server: enableSelfPreservation: false evictionIntervalTimerInMs: 4000 instance: hostname: discovery # 指定该Eureka实例的主机名 client: java110-bean/src/main/java/com/java110/entity/service/PageData.java
@@ -3,6 +3,7 @@ import com.alibaba.fastjson.JSONObject; import java.io.Serializable; import java.util.Map; /** * 页面请求数据封装 @@ -10,11 +11,15 @@ */ public class PageData implements Serializable { private String userId ; private String transactionId; private String requestTime; private String method; private String token; private JSONObject param; @@ -32,6 +37,16 @@ private JSONObject data; private Map<String,String> userInfo; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getTransactionId() { return transactionId; @@ -90,6 +105,10 @@ this.resJson = resJson; } public void setResJson(String resJsonString) { this.resJson = JSONObject.parseObject(resJsonString); } public String getCode() { return code; } @@ -122,6 +141,23 @@ this.data = data; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public Map<String, String> getUserInfo() { return userInfo; } public void setUserInfo(Map<String, String> userInfo) { this.userInfo = userInfo; } public PageData builder(String requestJson) throws IllegalArgumentException{ JSONObject reqJson = null; try { java110-common/src/main/java/com/java110/common/cache/JWTCache.java
@@ -1,7 +1,79 @@ package com.java110.common.cache; import com.java110.common.util.SerializeUtil; import com.java110.entity.mapping.Mapping; import redis.clients.jedis.Jedis; /** * Created by wuxw on 2018/5/5. */ public class JWTCache { public class JWTCache extends BaseCache{ /** * 获取值(用户ID) * @returne */ public static String getValue(String jdi){ Jedis redis = null; try { redis = getJedis(); return redis.get(jdi); }finally { if(redis != null){ redis.close(); } } } /** * 保存数据 * @param jdi */ public static void setValue(String jdi,String userId,int expireTime){ Jedis redis = null; try { redis = getJedis(); redis.set(jdi,userId); redis.expire(jdi,expireTime); }finally { if(redis != null){ redis.close(); } } } /** * 删除记录 * @param jdi */ public static void removeValue(String jdi){ Jedis redis = null; try { redis = getJedis(); redis.del(jdi); }finally { if(redis != null){ redis.close(); } } } /** * 重设超时间 * @param jdi * @param expireTime */ public static void resetExpireTime(String jdi,int expireTime){ Jedis redis = null; try { redis = getJedis(); redis.expire(jdi,expireTime); }finally { if(redis != null){ redis.close(); } } } } java110-common/src/main/java/com/java110/common/constant/CommonConstant.java
@@ -45,6 +45,36 @@ /** * 鉴权token */ public final static String COOKIE_AUTH_TOKEN = "java110_token"; public final static String COOKIE_AUTH_TOKEN = "_java110_token_"; public final static String DEFAULT_USER_PWD_SECRET = "@java110.com"; /** * 默认JWT 秘钥 */ public final static String DEFAULT_JWT_SECRET = "@java110_JWT"; /** * 默认过期时间 */ public final static String DEFAULT_JWT_EXPIRE_TIME = 2*60*60 + ""; /** * 登录时的用户ID */ public final static String LOGIN_USER_ID = "userId"; public final static String LOGIN_USER_NAME = "userName"; /** * 上下文对象 */ public final static String CONTEXT_PAGE_DATA = "pd"; public final static String ORDER_USER_ID = "ORDER_USER_ID"; public final static String ORDER_DEFAULT_USER_ID = "-1"; } java110-common/src/main/java/com/java110/common/constant/MappingConstant.java
@@ -66,6 +66,21 @@ */ public final static String KEY_CONSOLE_SERVICE_SECURITY_ON_OFF = "CONSOLE_SERVICE_SECURITY_ON_OFF"; /** * 用户秘钥 */ public final static String KEY_USER_PASSWORD_SECRET = "USER_PASSWORD_SECRET"; /** * JWT 秘钥 */ public final static String KEY_JWT_SECRET = "JWT_SECRET"; /** * JWT 秘钥 */ public final static String KEY_JWT_EXPIRE_TIME = "JWT_EXPIRE_TIME"; } java110-common/src/main/java/com/java110/common/constant/ServiceCodeConstant.java
@@ -16,6 +16,19 @@ */ public static final String SERVICE_CODE_QUERY_MENU_ITEM_NAME = "查询菜单"; /** * 查询菜单编码 */ public static final String SERVICE_CODE_QUERY_USER_LOGIN = "query.user.loginInfo"; /** * 查询菜单编码名称 */ public static final String SERVICE_CODE_QUERY_USER_LOGIN_NAME = "查询用户登录信息"; public static final String SERVICE_CODE = "SERVICE_CODE"; public static final String SERVICE_CODE_NAME = "SERVICE_CODE_NAME"; java110-common/src/main/java/com/java110/common/factory/AuthenticationFactory.java
@@ -2,10 +2,20 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.auth0.jwt.JWT; import com.auth0.jwt.JWTCreator; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTVerificationException; import com.auth0.jwt.interfaces.Claim; import com.auth0.jwt.interfaces.DecodedJWT; import com.java110.common.cache.JWTCache; import com.java110.common.cache.MappingCache; import com.java110.common.constant.CommonConstant; import com.java110.common.constant.MappingConstant; import com.java110.common.constant.ResponseConstant; import com.java110.common.exception.NoAuthorityException; import com.java110.common.util.DateUtil; import com.java110.common.util.StringUtil; import com.java110.entity.center.DataFlow; import org.apache.commons.codec.digest.DigestUtils; @@ -18,6 +28,9 @@ import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import java.util.HashMap; import java.util.Map; import java.util.UUID; /** * @@ -60,7 +73,7 @@ * @return */ public static String md5(String transactionId,String appId,String businesses,String code){ return md5(transactionId+appId+businesses).toLowerCase(); return md5(transactionId+appId+businesses+code).toLowerCase(); } /** @@ -223,6 +236,89 @@ return keyPairGenerator.generateKeyPair(); } /** * 用户密码 * @param userPwd * @return */ public static String md5UserPassword(String userPwd){ String userPasswordSecret = MappingCache.getValue(MappingConstant.KEY_USER_PASSWORD_SECRET); if(StringUtil.isNullOrNone(userPasswordSecret)){ userPasswordSecret = CommonConstant.DEFAULT_USER_PWD_SECRET; } return md5(md5(userPwd + userPasswordSecret)); } /** * 创建token * @return */ public static String createAndSaveToken(Map<String,String> info) throws Exception{ if(!info.containsKey(CommonConstant.LOGIN_USER_ID)){ throw new InvalidParameterException("参数中没有包含:"+CommonConstant.LOGIN_USER_ID); } String jdi = UUID.randomUUID().toString().replace("-",""); String jwtSecret = MappingCache.getValue(MappingConstant.KEY_JWT_SECRET); if(StringUtil.isNullOrNone(jwtSecret)){ jwtSecret = CommonConstant.DEFAULT_JWT_SECRET; } Algorithm algorithm = Algorithm.HMAC256(jwtSecret); JWTCreator.Builder jwt= JWT.create(); for(String key:info.keySet()){ if(CommonConstant.LOGIN_USER_ID.equals(key)){ continue; } jwt.withClaim(key,info.get(key)); } String expireTime = MappingCache.getValue(MappingConstant.KEY_JWT_EXPIRE_TIME); if(StringUtil.isNullOrNone(expireTime)){ expireTime = CommonConstant.DEFAULT_JWT_EXPIRE_TIME; } //保存token Id JWTCache.setValue(jdi,info.get(CommonConstant.LOGIN_USER_ID),Integer.parseInt(expireTime)); jwt.withIssuer("java110"); jwt.withJWTId(jdi); return jwt.sign(algorithm); } /** * 校验Token * @param token * @return * @throws Exception */ public static Map<String, String> verifyToken(String token) throws Exception{ String jwtSecret = MappingCache.getValue(MappingConstant.KEY_JWT_SECRET); if(StringUtil.isNullOrNone(jwtSecret)){ jwtSecret = CommonConstant.DEFAULT_JWT_SECRET; } Algorithm algorithm = Algorithm.HMAC256(jwtSecret); JWTVerifier verifier = JWT.require(algorithm).withIssuer("java110").build(); DecodedJWT jwt = verifier.verify(token); String jdi = jwt.getId(); //保存token Id String userId = JWTCache.getValue(jdi); if(StringUtil.isNullOrNone(userId)){ throw new JWTVerificationException("用户还未登录"); } String expireTime = MappingCache.getValue(MappingConstant.KEY_JWT_EXPIRE_TIME); if(StringUtil.isNullOrNone(expireTime)){ expireTime = CommonConstant.DEFAULT_JWT_EXPIRE_TIME; } //刷新过时时间 JWTCache.resetExpireTime(jdi,Integer.parseInt(expireTime)); Map<String, Claim> claims = jwt.getClaims(); // Add the claim to request header Map<String,String> paramOut = new HashMap<String, String>(); for(String key : claims.keySet()){ paramOut.put(key,claims.get(key).asString()); } paramOut.put(CommonConstant.LOGIN_USER_ID,userId); return paramOut; } /***********************************JWT start***************************************/ java110-common/src/main/java/com/java110/common/factory/DataTransactionFactory.java
@@ -9,6 +9,7 @@ import com.java110.common.util.SequenceUtil; import com.java110.common.util.StringUtil; import com.java110.entity.center.DataFlow; import com.java110.entity.service.PageData; import java.util.Date; import java.util.Map; @@ -243,7 +244,7 @@ JSONObject paramOut = JSONObject.parseObject("{\"meta\":{}}"); JSONObject metaObj = paramOut.getJSONObject("meta"); metaObj.put("transactionId",transactionId); metaObj.put("code",transactionId); metaObj.put("code",code); metaObj.put("message",message); metaObj.put("responseTime",DateUtil.getNowDefault()); if(data != null) { @@ -265,6 +266,18 @@ } /** * 页面返回封装 * @param code 编码 * @param message 信息 * @param data 数据 * @return * @throws Exception */ public static String pageResponseJson(PageData pd,String code, String message, JSONObject data){ return pageResponseJson(pd == null || StringUtil.isNullOrNone(pd.getTransactionId()) ? ResponseConstant.NO_TRANSACTION_ID:pd.getTransactionId(),code,message,data); } /** * 页面处理成功信息封装 * @param transactionId * @return java110-common/src/main/java/com/java110/common/util/DateUtil.java
@@ -64,6 +64,17 @@ return calendar.getTime(); } /** * 获取未来时间 * @param second 秒 * @return */ public static Date getFutureDate(int second){ Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.SECOND,second); return calendar.getTime(); } public static String getFormatTimeString(Date date, String pattern) { SimpleDateFormat sDateFormat = getDateFormat(pattern); java110-config/db/CenterService/create_table.db
@@ -210,14 +210,21 @@ '8000418002','4','Q','0' ); insert into c_service(service_code,invoke_model,business_type_cd,`name`,seq,url,provide_app_id,status_cd) values('query.user.userInfo','1','Q','用户信息查询',1,'http://...','8000418001','0'); insert into c_route(app_id,service_id,order_type_cd,status_cd) values( '8000418002','5','Q','0' ); insert into c_service(service_code,invoke_model,business_type_cd,`name`,seq,url,provide_app_id,status_cd) values('query.order.orderInfo','1','Q','订单信息',1,'http://center-service/businessApi/query','8000418001','0'); values('query.user.userInfo','S','Q','用户信息查询',1,'http://...','8000418001','0'); insert into c_service(service_code,invoke_model,business_type_cd,`name`,seq,url,provide_app_id,status_cd) values('query.console.menu','1','Q','查询菜单',1,'http://console-service/businessApi/query','8000418002','0'); values('query.order.orderInfo','S','Q','订单信息',1,'http://center-service/businessApi/query','8000418001','0'); insert into c_service(service_code,invoke_model,business_type_cd,`name`,seq,url,provide_app_id,status_cd) values('query.console.menu','S','Q','查询菜单',1,'http://console-service/businessApi/query','8000418002','0'); insert into c_service(service_code,invoke_model,business_type_cd,`name`,seq,url,provide_app_id,status_cd) values('query.user.loginInfo','S','Q','查询用户登录信息',1,'http://console-service/businessApi/query','8000418002','0'); INSERT INTO c_service_sql(service_code,`name`,params,query_model,`sql`,proc,template,remark,status_cd) VALUES('query.order.orderInfo','订单信息','oId','1','{ @@ -248,14 +255,26 @@ and mm.status_cd = ''0'' and mmc.m_id = mm.m_id and mmc.status_cd = ''0''" }','','{"PARAM:"{ }','','{"PARAM":{ "param1": "$.#menus#Array" },"TEMPLATE":"{ },"TEMPLATE":{ "response": { "code": "0000", "message": "成功" } }"}','','0'); }}','','0'); INSERT INTO c_service_sql(service_code,`name`,params,query_model,`sql`,proc,template,remark,status_cd) VALUES('query.user.loginInfo','查询用户登录信息','userCode','1','{ "param1":"select u.userId userId,u.name userName,u.password userPwd from user u where u.userCode = #userCode# and u.status_cd = ''0''" }','','{"PARAM":{ "param1": "$.#user#Object" },"TEMPLATE":{ "response": { "code": "0000", "message": "成功" } }}','','0'); java110-config/db/ConsoleService/create_table.db
@@ -38,11 +38,14 @@ insert into m_menu(name,level,parent_id,menu_group,user_id,remark) values('外部应用','2','1','LEFT','10001',''); insert into m_menu(name,level,parent_id,menu_group,user_id,remark) values('路由管理','2','1','LEFT','10001',''); insert into m_menu(name,level,parent_id,menu_group,user_id,remark) values('服务管理','2','1','LEFT','10001',''); insert into m_menu(name,level,parent_id,menu_group,user_id,remark) values('刷新缓存','2','1','LEFT','10001',''); insert into m_menu_ctg(m_id,url,template) values(2,'http://www.java110.com',''); insert into m_menu_ctg(m_id,url,template) values(3,'http://www.java110.com',''); insert into m_menu_ctg(m_id,url,template) values(4,'http://www.java110.com',''); insert into m_menu_ctg(m_id,url,template) values(5,'http://www.java110.com',''); insert into m_menu_ctg(m_id,url,template) values(5,'http://192.168.31.199:8001/cacheApi/flush',''); insert into m_menu_2_user(m_id,user_id) values(1,'10001'); insert into m_menu_2_user(m_id,user_id) values(2,'10001'); java110-config/src/main/resources/html/error.html
java110-core/src/main/java/com/java110/core/base/controller/BaseController.java
@@ -2,12 +2,14 @@ import com.alibaba.fastjson.JSONObject; import com.java110.common.constant.CommonConstant; import com.java110.common.constant.ResponseConstant; import com.java110.common.exception.NoAuthorityException; import com.java110.common.factory.PageDataFactory; import com.java110.common.log.LoggerEngine; import com.java110.common.util.SequenceUtil; import com.java110.common.util.StringUtil; import com.java110.core.base.AppBase; import com.java110.entity.service.PageData; import org.springframework.util.StringUtils; @@ -29,11 +31,10 @@ * 检查用户登录 * @throws NoAuthorityException */ protected String checkLogin() throws NoAuthorityException{ if(false){ protected void checkLogin(PageData pd) throws NoAuthorityException{ if(StringUtil.isNullOrNone(pd.getUserId())){ throw new NoAuthorityException(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR,"用户未登录,请登录!"); } return "10001"; } @@ -128,7 +129,10 @@ * @throws IllegalArgumentException */ protected PageData getPageData(HttpServletRequest request){ return request.getAttribute("pd") != null ?(PageData) request.getAttribute("pd") : null; if(request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA) == null){ throw new IllegalArgumentException("请求参数错误"); } return (PageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA); } } java110-service/src/main/java/com/java110/service/aop/PageProcessAspect.java
@@ -1,8 +1,10 @@ package com.java110.service.aop; import com.java110.common.constant.CommonConstant; import com.java110.common.factory.PageDataFactory; import com.java110.common.util.Assert; import com.java110.common.util.SequenceUtil; import com.java110.common.util.StringUtil; import com.java110.entity.service.PageData; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; @@ -11,9 +13,14 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Map; /** * 数据初始化 @@ -22,7 +29,7 @@ @Aspect @Component public class PageProcessAspect { @Pointcut("execution(public * com.java110..*.*Controller.*(..))") @Pointcut("execution(public * com.java110..*.*Controller.*(..)) || execution(public * com.java110..*.*Rest.*(..))") public void dataProcess(){} /** @@ -37,8 +44,10 @@ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); PageData pd = null; if("POST".equals(request.getMethod())){ BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream())); InputStream in = request.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); //reader. StringBuffer sb = new StringBuffer(); String str = ""; @@ -47,10 +56,23 @@ } str = sb.toString(); if(Assert.isPageJsonObject(str)){ PageData pd = PageDataFactory.newInstance().builder(str).setTransactionId(SequenceUtil.getPageTransactionId()); request.setAttribute("pd",pd); pd = PageDataFactory.newInstance().builder(str).setTransactionId(SequenceUtil.getPageTransactionId()); } } if(pd == null){ pd = PageDataFactory.newInstance().setTransactionId(SequenceUtil.getPageTransactionId()); } if(request.getAttribute("claims") != null && request.getAttribute("claims") instanceof Map){ Map<String,String> userInfo = (Map<String,String>)request.getAttribute("claims"); if(userInfo.containsKey(CommonConstant.LOGIN_USER_ID)){ pd.setUserId(userInfo.get(CommonConstant.LOGIN_USER_ID)); } pd.setUserInfo(userInfo); } request.setAttribute(CommonConstant.CONTEXT_PAGE_DATA,pd); } @@ -61,25 +83,36 @@ //后置异常通知 @AfterThrowing("dataProcess()") public void throwss(JoinPoint jp){ public void throwException(JoinPoint jp){ } //后置最终通知,final增强,不管是抛出异常或者正常退出都会执行 @After("dataProcess()") public void after(JoinPoint jp){ public void after(JoinPoint jp) throws IOException { // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); PageData pd =request.getAttribute("pd") != null ?(PageData)request.getAttribute("pd"):null ; //保存日志处理 if(pd != null){ HttpServletRequest request = attributes.getRequest(); PageData pd =request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA) != null ?(PageData)request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA):null ; //保存日志处理 if(pd == null){ return ; } if(!StringUtil.isNullOrNone(pd.getToken())) { HttpServletResponse response = attributes.getResponse(); Cookie cookie = new Cookie(CommonConstant.COOKIE_AUTH_TOKEN, pd.getToken()); cookie.setHttpOnly(true); cookie.setPath("/"); response.addCookie(cookie); response.flushBuffer(); } } //环绕通知,环绕增强,相当于MethodInterceptor @Around("dataProcess()") public Object arround(ProceedingJoinPoint pjp) { public Object around(ProceedingJoinPoint pjp) { try { Object o = pjp.proceed(); return o; java110-service/src/main/java/com/java110/service/api/BusinessApi.java
File was renamed from java110-service/src/main/java/com/java110/service/rest/BusinessApi.java @@ -1,4 +1,4 @@ package com.java110.service.rest; package com.java110.service.api; import com.java110.common.constant.ResponseConstant; import com.java110.common.factory.DataQueryFactory; java110-service/src/main/java/com/java110/service/configuration/ServiceConfiguration.java
@@ -14,7 +14,7 @@ public FilterRegistrationBean jwtFilter() { final FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(new JwtFilter()); registrationBean.addUrlPatterns("/secure/*"); registrationBean.addUrlPatterns("/"); return registrationBean; } java110-service/src/main/java/com/java110/service/controller/ErrorController.java
File was deleted java110-service/src/main/java/com/java110/service/controller/SystemErrorController.java
New file @@ -0,0 +1,33 @@ package com.java110.service.controller; import com.java110.common.constant.ResponseConstant; import com.java110.common.util.StringUtil; import com.java110.core.base.controller.BaseController; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import javax.servlet.http.HttpServletRequest; /** * 错误页面 * Created by wuxw on 2018/5/2. */ @Controller public class SystemErrorController extends BaseController { @RequestMapping(path = "/system/error") public String error(Model model, HttpServletRequest request) { String code = request.getParameter("code"); String msg = request.getParameter("msg"); if(StringUtil.isNullOrNone(code) || StringUtil.isNullOrNone(msg)){ code = ResponseConstant.RESULT_CODE_INNER_ERROR; msg = "系统内部异常"; } model.addAttribute("code",code); model.addAttribute("msg",msg); //3.0 查询各个系统调用量 return "error"; } } java110-service/src/main/java/com/java110/service/filter/JwtFilter.java
@@ -9,6 +9,7 @@ import com.java110.common.constant.CommonConstant; import com.java110.common.constant.ResponseConstant; import com.java110.common.exception.FilterException; import com.java110.common.factory.AuthenticationFactory; import com.java110.common.factory.DataTransactionFactory; import com.java110.common.util.StringUtil; import org.springframework.web.filter.GenericFilterBean; @@ -40,17 +41,10 @@ //获取token token = this.getToken(request); try { Algorithm algorithm = Algorithm.HMAC256("secret"); JWTVerifier verifier = JWT.require(algorithm).withIssuer("auth0").build(); DecodedJWT jwt = verifier.verify(token); Map<String, Claim> claims = jwt.getClaims(); // Add the claim to request header Map<String, String> claims = AuthenticationFactory.verifyToken(token); request.setAttribute("claims", claims); } catch (UnsupportedEncodingException e) { logger.error("解析token 失败 :", e); throw new FilterException(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR, "您还没有登录,请先登录"); } catch (JWTVerificationException e) { } catch (Exception e) { //Invalid signature/claims logger.error("解析token 失败 :", e); throw new FilterException(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR, "您还没有登录,请先登录"); @@ -63,11 +57,11 @@ DataTransactionFactory.pageResponseJson(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR,e.getMessage(),null), "UTF-8"); }else{ response.sendRedirect("/error?code="+e.getResult().getCode()+"&msg="+e.getResult().getMsg()); response.sendRedirect("/login?code="+e.getResult().getCode()+"&msg="+e.getResult().getMsg()); } }catch (Exception e){ response.sendRedirect("/error?code="+ResponseConstant.RESULT_CODE_INNER_ERROR+"&msg=鉴权失败"); response.sendRedirect("/login?code="+ResponseConstant.RESULT_CODE_INNER_ERROR+"&msg=鉴权失败"); } } java110-service/src/main/java/com/java110/service/init/ServiceStartInit.java
New file @@ -0,0 +1,22 @@ package com.java110.service.init; import com.java110.common.factory.ApplicationContextFactory; import org.springframework.context.ApplicationContext; /** * Created by wuxw on 2018/5/7. */ public class ServiceStartInit { public static void initSystemConfig(ApplicationContext context){ //加载配置文件,注册订单处理侦听 try { ApplicationContextFactory.setApplicationContext(context); } catch (Exception ex) { throw new IllegalStateException("system init error", ex); } } }