Commit 69b92326dd319d214472b217c26eef018cfa1ac8

Authored by 潘钊
1 parent f92b8717

解决pjax和angularJs的冲突

src/main/java/com/bsth/StartCommand.java
1 -package com.bsth;  
2 -  
3 -  
4 -import java.util.concurrent.Executors;  
5 -import java.util.concurrent.ScheduledExecutorService;  
6 -import java.util.concurrent.TimeUnit;  
7 -  
8 -import org.slf4j.Logger;  
9 -import org.slf4j.LoggerFactory;  
10 -import org.springframework.beans.factory.annotation.Autowired;  
11 -import org.springframework.boot.CommandLineRunner;  
12 -import org.springframework.stereotype.Component;  
13 -  
14 -import com.bsth.gpsdata.thread.GpsBufferRefreshThread;  
15 -import com.bsth.security.SecurityMetadataSourceService;  
16 -  
17 -/**  
18 - * 随应用启动运行  
19 - * @author PanZhao  
20 - *  
21 - */  
22 -@Component  
23 -public class StartCommand implements CommandLineRunner{  
24 -  
25 - Logger logger = LoggerFactory.getLogger(this.getClass());  
26 -  
27 - @Autowired  
28 - SecurityMetadataSourceService invocationSecurityMetadataSourceService;  
29 -  
30 - public static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);  
31 -  
32 - @Autowired  
33 - GpsBufferRefreshThread gpsRefreshThread;  
34 -  
35 - @Override  
36 - public void run(String... arg0){  
37 -  
38 - try {  
39 - //启动时加载所有资源  
40 - invocationSecurityMetadataSourceService.loadResourceDefine();  
41 -  
42 - /**  
43 - * 定时GPS实时数据更新线程,每次执行完成4秒后开始下一次  
44 - * 如果抛出异常,后续执行将被取消  
45 - */  
46 - //scheduler.scheduleWithFixedDelay(gpsRefreshThread, 0, 4, TimeUnit.SECONDS);  
47 - } catch (Exception e) {  
48 - e.printStackTrace();  
49 - }  
50 - }  
51 -} 1 +package com.bsth;
  2 +
  3 +
  4 +import java.util.concurrent.Executors;
  5 +import java.util.concurrent.ScheduledExecutorService;
  6 +
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.boot.CommandLineRunner;
  11 +import org.springframework.stereotype.Component;
  12 +
  13 +import com.bsth.gpsdata.thread.GpsBufferRefreshThread;
  14 +import com.bsth.security.SecurityMetadataSourceService;
  15 +
  16 +/**
  17 + * 随应用启动运行
  18 + * @author PanZhao
  19 + *
  20 + */
  21 +@Component
  22 +public class StartCommand implements CommandLineRunner{
  23 +
  24 + Logger logger = LoggerFactory.getLogger(this.getClass());
  25 +
  26 + @Autowired
  27 + SecurityMetadataSourceService invocationSecurityMetadataSourceService;
  28 +
  29 + public static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
  30 +
  31 + @Autowired
  32 + GpsBufferRefreshThread gpsRefreshThread;
  33 +
  34 + @Override
  35 + public void run(String... arg0){
  36 +
  37 + try {
  38 + //启动时加载所有资源
  39 + invocationSecurityMetadataSourceService.loadResourceDefine();
  40 +
  41 + /**
  42 + * 定时GPS实时数据更新线程,每次执行完成4秒后开始下一次
  43 + * 如果抛出异常,后续执行将被取消
  44 + */
  45 + //scheduler.scheduleWithFixedDelay(gpsRefreshThread, 0, 4, TimeUnit.SECONDS);
  46 + } catch (Exception e) {
  47 + e.printStackTrace();
  48 + }
  49 + }
  50 +}
src/main/java/com/bsth/controller/IndexController.java 0 → 100644
  1 +package com.bsth.controller;
  2 +
  3 +import java.io.BufferedInputStream;
  4 +import java.io.IOException;
  5 +import java.io.InputStream;
  6 +
  7 +import javax.servlet.http.HttpServletResponse;
  8 +
  9 +import org.apache.commons.lang3.StringUtils;
  10 +import org.slf4j.Logger;
  11 +import org.slf4j.LoggerFactory;
  12 +import org.springframework.web.bind.annotation.RequestMapping;
  13 +import org.springframework.web.bind.annotation.RestController;
  14 +
  15 +@RestController
  16 +@RequestMapping("/")
  17 +public class IndexController {
  18 +
  19 + Logger logger = LoggerFactory.getLogger(this.getClass());
  20 +
  21 + String indexSource;
  22 +
  23 + /**
  24 + * 构造函数
  25 + */
  26 + public IndexController() {
  27 + BufferedInputStream bis = null;
  28 +
  29 + try {
  30 + InputStream is = IndexController.class.getClassLoader().getResourceAsStream("static/index.html");
  31 + bis = new BufferedInputStream(is);
  32 + StringBuilder source = new StringBuilder();
  33 + byte[] buffer = new byte[bis.available()];
  34 +
  35 + while (bis.read(buffer) != -1) {
  36 + source.append(new String(buffer));
  37 + }
  38 +
  39 + indexSource = source.toString();
  40 + } catch (Exception e) {
  41 + logger.error("", e);
  42 + } finally {
  43 + try {
  44 + bis.close();
  45 + } catch (IOException e) {
  46 + logger.error("", e);
  47 + }
  48 + }
  49 + }
  50 +
  51 + /**
  52 + *
  53 + * @Title: index
  54 + * @Description: TODO(输出首页 index.html)
  55 + */
  56 + @RequestMapping
  57 + public void index(String initFragment, HttpServletResponse resp) {
  58 +
  59 + // 初始打开的片段地址
  60 + String outStr = StringUtils.replace(indexSource, "^_^initFragment^_^",
  61 + initFragment == null ? "" : initFragment);
  62 +
  63 + resp.setContentType("text/html;charset=UTF-8");
  64 + try {
  65 + resp.getOutputStream().write(outStr.getBytes());
  66 + } catch (IOException e) {
  67 + logger.error("", e);
  68 + }
  69 +
  70 + }
  71 +}
src/main/java/com/bsth/filter/ResourceFilter.java
@@ -41,8 +41,9 @@ public class ResourceFilter extends BaseFilter { @@ -41,8 +41,9 @@ public class ResourceFilter extends BaseFilter {
41 41
42 File f = new File(fPath); 42 File f = new File(fPath);
43 43
  44 +
44 if (f.exists() && f.isFile() ){ 45 if (f.exists() && f.isFile() ){
45 - response.sendRedirect("/?_=" + joinParam(request)); 46 + request.getRequestDispatcher("/?initFragment=" + joinParam(request)).forward(request, response);;
46 }else 47 }else
47 response.sendRedirect("/"); 48 response.sendRedirect("/");
48 } 49 }
src/main/resources/static/assets/bower_components/angular/angular.js
@@ -5873,7 +5873,23 @@ function Browser(window, document, $log, $sniffer) { @@ -5873,7 +5873,23 @@ function Browser(window, document, $log, $sniffer) {
5873 // the new location.href if a reload happened or if there is a bug like in iOS 9 (see 5873 // the new location.href if a reload happened or if there is a bug like in iOS 9 (see
5874 // https://openradar.appspot.com/22186109). 5874 // https://openradar.appspot.com/22186109).
5875 // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 5875 // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172
5876 - return pendingLocation || location.href.replace(/%27/g,"'"); 5876 +
  5877 + /**
  5878 + * 2016年05月18号 潘钊
  5879 + * #########################
  5880 + */
  5881 + if(!pendingLocation){
  5882 + var h = location.href;
  5883 + if(h.indexOf('pages') != -1
  5884 + && location.hash == ''){
  5885 + return h.substr(0, h.indexOf('pages')).replace(/%27/g,"'");
  5886 + }
  5887 + }
  5888 + /**
  5889 + * #######################
  5890 + */
  5891 +
  5892 + return pendingLocation || location.href.replace(/%27/g,"'");
5877 } 5893 }
5878 }; 5894 };
5879 5895
@@ -11714,7 +11730,7 @@ function trimEmptyHash(url) { @@ -11714,7 +11730,7 @@ function trimEmptyHash(url) {
11714 11730
11715 11731
11716 function stripFile(url) { 11732 function stripFile(url) {
11717 - return url.substr(0, stripHash(url).lastIndexOf('/') + 1); 11733 + return url.substr(0, stripHash(url).lastIndexOf('/') + 1);
11718 } 11734 }
11719 11735
11720 /* return the server only (scheme://host:port) */ 11736 /* return the server only (scheme://host:port) */
@@ -12595,6 +12611,7 @@ function $LocationProvider() { @@ -12595,6 +12611,7 @@ function $LocationProvider() {
12595 12611
12596 $rootScope.$evalAsync(function() { 12612 $rootScope.$evalAsync(function() {
12597 var newUrl = $location.absUrl(); 12613 var newUrl = $location.absUrl();
  12614 +
12598 var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, 12615 var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
12599 $location.$$state, oldState).defaultPrevented; 12616 $location.$$state, oldState).defaultPrevented;
12600 12617
@@ -12606,7 +12623,12 @@ function $LocationProvider() { @@ -12606,7 +12623,12 @@ function $LocationProvider() {
12606 $location.$$parse(oldUrl); 12623 $location.$$parse(oldUrl);
12607 $location.$$state = oldState; 12624 $location.$$state = oldState;
12608 } else { 12625 } else {
12609 - if (urlOrStateChanged) { 12626 + //if (urlOrStateChanged ) {
  12627 + /**
  12628 + * 2016年05月18 潘钊修改
  12629 + * 忽略stste里携带pjax标记的 (!oldState || !oldState.pjax)
  12630 + */
  12631 + if (urlOrStateChanged && (!oldState || !oldState.pjax)) {
12610 setBrowserUrlWithFallback(newUrl, currentReplace, 12632 setBrowserUrlWithFallback(newUrl, currentReplace,
12611 oldState === $location.$$state ? null : $location.$$state); 12633 oldState === $location.$$state ? null : $location.$$state);
12612 } 12634 }
src/main/resources/static/assets/plugins/jquery.pjax.js
@@ -286,6 +286,11 @@ function pjax(options) { @@ -286,6 +286,11 @@ function pjax(options) {
286 container: context.selector, 286 container: context.selector,
287 fragment: options.fragment, 287 fragment: options.fragment,
288 timeout: options.timeout 288 timeout: options.timeout
  289 + /**
  290 + * 2016年05月18 潘钊修改
  291 + * 添加一个pjax的标记,供angular.js路由判断
  292 + */
  293 + ,pjax: true
289 } 294 }
290 295
291 if (options.push || options.replace) { 296 if (options.push || options.replace) {
@@ -364,6 +369,7 @@ function pjax(options) { @@ -364,6 +369,7 @@ function pjax(options) {
364 // Cache current container element before replacing it 369 // Cache current container element before replacing it
365 cachePush(pjax.state.id, cloneContents(context)) 370 cachePush(pjax.state.id, cloneContents(context))
366 371
  372 + //window.history.pushState(null, "", options.requestUrl)
367 window.history.pushState(null, "", options.requestUrl) 373 window.history.pushState(null, "", options.requestUrl)
368 } 374 }
369 375
@@ -421,6 +427,23 @@ if ('state' in window.history) { @@ -421,6 +427,23 @@ if ('state' in window.history) {
421 // You probably shouldn't use pjax on pages with other pushState 427 // You probably shouldn't use pjax on pages with other pushState
422 // stuff yet. 428 // stuff yet.
423 function onPjaxPopstate(event) { 429 function onPjaxPopstate(event) {
  430 + debugger
  431 +
  432 +/**
  433 + * 2016年05月18 潘钊修改
  434 + */
  435 +if(document.location.hash){
  436 + event.stopPropagation();
  437 +
  438 + var oldUrl = $.url()
  439 + ,newUrl = oldUrl.attr('protocol') + '://' + oldUrl.attr('host') + ':' + oldUrl.attr('port');
  440 + history.replaceState({}, document.title, newUrl + '/' + document.location.hash);
  441 +
  442 + return;
  443 +}
  444 +/**
  445 + * -----end------
  446 + */
424 447
425 // Hitting back or forward should override any pending PJAX request. 448 // Hitting back or forward should override any pending PJAX request.
426 if (!initialPop) { 449 if (!initialPop) {
@@ -564,6 +587,15 @@ function cloneContents(container) { @@ -564,6 +587,15 @@ function cloneContents(container) {
564 var cloned = container.clone() 587 var cloned = container.clone()
565 // Unmark script tags as already being eval'd so they can get executed again 588 // Unmark script tags as already being eval'd so they can get executed again
566 // when restored from cache. HAXX: Uses jQuery internal method. 589 // when restored from cache. HAXX: Uses jQuery internal method.
  590 + /**
  591 + * 2016年05月19 潘钊修改
  592 + * 在缓存里打一个标记
  593 + * ##################
  594 + */
  595 + cloned.append('<input type="hidden" id="historyCache" value="1"/>')
  596 + /**
  597 + * ##################
  598 + */
567 cloned.find('script').each(function(){ 599 cloned.find('script').each(function(){
568 if (!this.src) jQuery._data(this, 'globalEval', false) 600 if (!this.src) jQuery._data(this, 'globalEval', false)
569 }) 601 })
src/main/resources/static/index.html
@@ -6,29 +6,33 @@ @@ -6,29 +6,33 @@
6 <meta name=”renderer” content=”webkit”> 6 <meta name=”renderer” content=”webkit”>
7 <meta http-equiv=”X-UA-Compatible” content=”IE=Edge,chrome=1″ > 7 <meta http-equiv=”X-UA-Compatible” content=”IE=Edge,chrome=1″ >
8 8
  9 +<meta http-equiv="Pragma" content="no-cache">
  10 +<meta http-equiv="Cache-control" content="no-cache">
  11 +<meta http-equiv="Cache" content="no-cache">
  12 +
9 <!-- Font Awesome 图标字体 --> 13 <!-- Font Awesome 图标字体 -->
10 -<link href="metronic_v4.5.4/plugins/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css" /> 14 +<link href="/metronic_v4.5.4/plugins/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
11 <!-- Bootstrap style --> 15 <!-- Bootstrap style -->
12 -<link href="metronic_v4.5.4/plugins/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" /> 16 +<link href="/metronic_v4.5.4/plugins/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
13 <!-- jsTree 数插件 --> 17 <!-- jsTree 数插件 -->
14 -<link href="metronic_v4.5.4/plugins/jstree/dist/themes/default/style.min.css" rel="stylesheet" type="text/css" />  
15 -<!-- multi-select 多选下拉框美化 -->  
16 -<link href="metronic_v4.5.4/plugins/jquery-multi-select/css/multi-select.css" rel="stylesheet" type="text/css" />  
17 -<!-- metronic style -->  
18 -<link href="metronic_v4.5.4/layout4/css/themes/default.min.css" rel="stylesheet" type="text/css" id="style_color" />  
19 -<link href="metronic_v4.5.4/css/components.css" rel="stylesheet" type="text/css" />  
20 -<link href="metronic_v4.5.4/css/plugins.css" rel="stylesheet" type="text/css" />  
21 -<link href="metronic_v4.5.4/layout4/css/layout.min.css" rel="stylesheet" type="text/css" />  
22 -<link href="metronic_v4.5.4/layout4/css/custom.min.css" rel="stylesheet" type="text/css" /> 18 +<link href="/metronic_v4.5.4/plugins/jstree/dist/themes/default/style.min.css" rel="stylesheet" type="text/css" />
  19 +<!-- MULTI-select 多选下拉框美化 -->
  20 +<link href="/metronic_v4.5.4/plugins/jquery-multi-select/css/multi-select.css" rel="stylesheet" type="text/css" />
  21 +<!-- METRONIC style -->
  22 +<link href="/metronic_v4.5.4/layout4/css/themes/default.min.css" rel="stylesheet" type="text/css" id="style_color" />
  23 +<link href="/metronic_v4.5.4/css/components.css" rel="stylesheet" type="text/css" />
  24 +<link href="/metronic_v4.5.4/css/plugins.css" rel="stylesheet" type="text/css" />
  25 +<link href="/metronic_v4.5.4/layout4/css/layout.min.css" rel="stylesheet" type="text/css" />
  26 +<link href="/metronic_v4.5.4/layout4/css/custom.min.css" rel="stylesheet" type="text/css" />
23 <!-- select2 下拉框插件 --> 27 <!-- select2 下拉框插件 -->
24 -<link href="metronic_v4.5.4/plugins/select2/css/select2.min.css" rel="stylesheet" type="text/css" />  
25 -<link href="metronic_v4.5.4/plugins/select2/css/select2-bootstrap.min.css" rel="stylesheet" type="text/css" /> 28 +<link href="/metronic_v4.5.4/plugins/select2/css/select2.min.css" rel="stylesheet" type="text/css" />
  29 +<link href="/metronic_v4.5.4/plugins/select2/css/select2-bootstrap.min.css" rel="stylesheet" type="text/css" />
26 <!-- layer 弹层 插件 --> 30 <!-- layer 弹层 插件 -->
27 -<link href="assets/plugins/layer-v2.2/layer/skin/layer.css" rel="stylesheet" type="text/css" /> 31 +<link href="/assets/plugins/layer-v2.2/layer/skin/layer.css" rel="stylesheet" type="text/css" />
28 <!-- iCheck 单选框和复选框 --> 32 <!-- iCheck 单选框和复选框 -->
29 -<link href="metronic_v4.5.4/plugins/icheck/skins/all.css" rel="stylesheet" type="text/css" /> 33 +<link href="/metronic_v4.5.4/plugins/icheck/skins/all.css" rel="stylesheet" type="text/css" />
30 <!-- 日期控件 --> 34 <!-- 日期控件 -->
31 -<link href="metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/css/bootstrap-datetimepicker.min.css" rel="stylesheet" type="text/css" /> 35 +<link href="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/css/bootstrap-datetimepicker.min.css" rel="stylesheet" type="text/css" />
32 36
33 <style type="text/css"> 37 <style type="text/css">
34 .searchForm{ 38 .searchForm{
@@ -137,33 +141,6 @@ tr.row-active td { @@ -137,33 +141,6 @@ tr.row-active td {
137 </li> 141 </li>
138 <li> 142 <li>
139 <ul class="dropdown-menu-list scroller" style="height: 250px;" data-handle-color="#637283"> 143 <ul class="dropdown-menu-list scroller" style="height: 250px;" data-handle-color="#637283">
140 - <li>  
141 - <a href="javascript:;">  
142 - <span class="time">现在</span>  
143 - <span class="details">  
144 - <span class="label label-sm label-icon label-info"> </span>  
145 - W1B-020 成山路请求出场  
146 - </span>  
147 - </a>  
148 - </li>  
149 - <li>  
150 - <a href="javascript:;">  
151 - <span class="time">10分钟前</span>  
152 - <span class="details">  
153 - <span class="label label-sm label-icon label-success"> </span>  
154 - W1B-375 速度正常,超速约10分钟  
155 - </span>  
156 - </a>  
157 - </li>  
158 - <li>  
159 - <a href="javascript:;">  
160 - <span class="time">20分钟前</span>  
161 - <span class="details">  
162 - <span class="label label-sm label-icon label-danger"> </span>  
163 - W1B-375 超速警报  
164 - </span>  
165 - </a>  
166 - </li>  
167 </ul> 144 </ul>
168 </li> 145 </li>
169 </ul> 146 </ul>
@@ -202,7 +179,7 @@ tr.row-active td { @@ -202,7 +179,7 @@ tr.row-active td {
202 </div> 179 </div>
203 <div class="page-content-wrapper"> 180 <div class="page-content-wrapper">
204 <div class="page-content"> 181 <div class="page-content">
205 - <div id="pjax-container"></div> 182 + <div id="pjax-container" ></div>
206 <div id="route-container"> 183 <div id="route-container">
207 <div ng-app="ScheduleApp"> 184 <div ng-app="ScheduleApp">
208 <div ng-controller="ScheduleAppController"> 185 <div ng-controller="ScheduleAppController">
@@ -211,8 +188,6 @@ tr.row-active td { @@ -211,8 +188,6 @@ tr.row-active td {
211 </div> 188 </div>
212 </div> 189 </div>
213 </div> 190 </div>
214 -  
215 -  
216 </div> 191 </div>
217 </div> 192 </div>
218 193
@@ -249,80 +224,82 @@ tr.row-active td { @@ -249,80 +224,82 @@ tr.row-active td {
249 224
250 </script> 225 </script>
251 <!--[if lt IE 9]> 226 <!--[if lt IE 9]>
252 -<script src="assets/plugins/respond.min.js"></script>  
253 -<script src="assets/plugins/excanvas.min.js"></script> 227 +<script src="/assets/plugins/respond.min.js"></script>
  228 +<script src="/assets/plugins/excanvas.min.js"></script>
254 <![endif]--> 229 <![endif]-->
255 -<!-- jquery -->  
256 -<script src="metronic_v4.5.4/plugins/jquery.min.js" ></script> 230 +<!-- jQuery -->
  231 +<script src="/metronic_v4.5.4/plugins/jquery.min.js" ></script>
257 <!-- bootstrap --> 232 <!-- bootstrap -->
258 -<script src="metronic_v4.5.4/plugins/bootstrap/js/bootstrap.min.js" ></script>  
259 -<!-- metronic js -->  
260 -<script src="metronic_v4.5.4/scripts/app.min.js" ></script>  
261 -<script src="metronic_v4.5.4/layout4/scripts/layout.min.js" ></script> 233 +<script src="/metronic_v4.5.4/plugins/bootstrap/js/bootstrap.min.js" ></script>
  234 +<!-- MTRONIC JS -->
  235 +<script src="/metronic_v4.5.4/scripts/app.min.js" ></script>
  236 +<script src="/metronic_v4.5.4/layout4/scripts/layout.min.js" ></script>
262 <!-- 虚拟滚动条 --> 237 <!-- 虚拟滚动条 -->
263 -<script src="metronic_v4.5.4/plugins/jquery-slimscroll/jquery.slimscroll.min.js" ></script> 238 +<script src="/metronic_v4.5.4/plugins/jquery-slimscroll/jquery.slimscroll.min.js" ></script>
264 <!-- jsTree 树插件 --> 239 <!-- jsTree 树插件 -->
265 -<script src="metronic_v4.5.4/plugins/jstree/dist/jstree.min.js" ></script>  
266 -<!-- bootstrap-hover-dropdown -->  
267 -<script src="metronic_v4.5.4/plugins/bootstrap-hover-dropdown/bootstrap-hover-dropdown.min.js" ></script> 240 +<script src="/metronic_v4.5.4/plugins/jstree/dist/jstree.min.js" ></script>
  241 +<!-- bootstrap-hover-dropDown -->
  242 +<script src="/metronic_v4.5.4/plugins/bootstrap-hover-dropdown/bootstrap-hover-dropdown.min.js" ></script>
268 <!-- jquery.validate 表单验证 --> 243 <!-- jquery.validate 表单验证 -->
269 -<script src="metronic_v4.5.4/plugins/jquery-validation/js/jquery.validate.min.js"></script>  
270 -<script src="metronic_v4.5.4/plugins/jquery-validation/js/localization/messages_zh.js"></script> 244 +<script src="/metronic_v4.5.4/plugins/jquery-validation/js/jquery.validate.min.js"></script>
  245 +<script src="/metronic_v4.5.4/plugins/jquery-validation/js/localization/messages_zh.js"></script>
271 <!-- 向导式插件 --> 246 <!-- 向导式插件 -->
272 -<script src="metronic_v4.5.4//plugins/bootstrap-wizard/jquery.bootstrap.wizard.min.js"></script> 247 +<script src="/metronic_v4.5.4//plugins/bootstrap-wizard/jquery.bootstrap.wizard.min.js"></script>
273 <!-- iCheck 单选框和复选框 --> 248 <!-- iCheck 单选框和复选框 -->
274 -<script src="metronic_v4.5.4/plugins/icheck/icheck.min.js" type="text/javascript"></script> 249 +<script src="/metronic_v4.5.4/plugins/icheck/icheck.min.js" ></script>
275 <!-- select2 下拉框 --> 250 <!-- select2 下拉框 -->
276 -<script src="metronic_v4.5.4/plugins/select2/js/select2.full.min.js" type="text/javascript"></script>  
277 -<!-- multi-select 多选下拉框美化 -->  
278 -<script src="metronic_v4.5.4/plugins/jquery-multi-select/js/jquery.multi-select.js" type="text/javascript"></script>  
279 -<!-- pjax -->  
280 -<script src="assets/plugins/jquery.pjax.js"></script> 251 +<script src="/metronic_v4.5.4/plugins/select2/js/select2.full.min.js" ></script>
  252 +<!-- MULTI SELECT 多选下拉框 -->
  253 +<script src="/metronic_v4.5.4/plugins/jquery-multi-select/js/jquery.multi-select.js" ></script>
  254 +<!-- PJAX -->
  255 +<script src="/assets/plugins/jquery.pjax.js"></script>
281 <!-- layer 弹层 --> 256 <!-- layer 弹层 -->
282 -<script src="assets/plugins/layer-v2.2/layer/layer.js"></script>  
283 -<!-- jquery.purl url解析 -->  
284 -<script src="assets/plugins/purl.js"></script>  
285 -<!-- jquery.serializejson json序列化插件 -->  
286 -<script src="assets/plugins/jquery.serializejson.js"></script> 257 +<script src="/assets/plugins/layer-v2.2/layer/layer.js"></script>
  258 +<!-- jquery.purl URL解析 -->
  259 +<script src="/assets/plugins/purl.js"></script>
  260 +<!-- jquery.serializejson JSON序列化插件 -->
  261 +<script src="/assets/plugins/jquery.serializejson.js"></script>
287 <!-- art-template 模版引擎 --> 262 <!-- art-template 模版引擎 -->
288 -<script src="assets/plugins/template.js"></script> 263 +<script src="/assets/plugins/template.js"></script>
289 <!-- jquery.pageinator 分页 --> 264 <!-- jquery.pageinator 分页 -->
290 -<script src="assets/plugins/jqPaginator.min.js"></script> 265 +<script src="/assets/plugins/jqPaginator.min.js"></script>
291 <!-- moment.js 日期处理类库 --> 266 <!-- moment.js 日期处理类库 -->
292 -<script src="assets/plugins/moment-with-locales.js"></script> 267 +<script src="/assets/plugins/moment-with-locales.js"></script>
293 268
294 -<script src="assets/plugins/pinyin.js"></script> 269 +<script src="/assets/plugins/pinyin.js"></script>
295 <!-- 日期控件 --> 270 <!-- 日期控件 -->
296 -<script src="metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/js/bootstrap-datetimepicker.min.js" type="text/javascript"></script> 271 +<script src="/metronic_v4.5.4/plugins/bootstrap-datetimepicker-2/js/bootstrap-datetimepicker.min.js" type="text/javascript"></script>
297 272
298 <!-- 地图相关 --> 273 <!-- 地图相关 -->
299 <!-- 百度 --> 274 <!-- 百度 -->
300 -<script src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT" ></script> 275 +<!-- <script src="http://api.map.baidu.com/api?v=2.0&ak=IGGrr4UjwIYzatoCRFKEL8sT" ></script>
301 <script src="http://api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js" ></script> 276 <script src="http://api.map.baidu.com/library/TrafficControl/1.4/src/TrafficControl_min.js" ></script>
302 -<!-- 高德 -->  
303 -<script src="http://webapi.amap.com/maps?v=1.3&key=16cb1c5043847e09ef9edafdd77befda"></script> 277 +高德
  278 +<script src="http://webapi.amap.com/maps?v=1.3&key=16cb1c5043847e09ef9edafdd77befda"></script> -->
304 279
305 -<script src="assets/js/common.js"></script>  
306 -<!-- d3.js --> 280 +<script src="/assets/js/common.js"></script>
  281 +<!-- d3 -->
307 <script src="http://apps.bdimg.com/libs/d3/3.4.8/d3.min.js"></script> 282 <script src="http://apps.bdimg.com/libs/d3/3.4.8/d3.min.js"></script>
  283 +
308 <!-- TODO:angularJS相关库 --> 284 <!-- TODO:angularJS相关库 -->
309 285
310 <!-- angularJS相关库 --> 286 <!-- angularJS相关库 -->
311 -<script src="assets/bower_components/angular/angular.min.js"></script>  
312 -<script src="assets/bower_components/angular-resource/angular-resource.min.js"></script>  
313 -<script src="assets/bower_components/angular-sanitize/angular-sanitize.min.js"></script>  
314 -<script src="assets/bower_components/angular-touch/angular-touch.min.js"></script>  
315 -<script src="assets/bower_components/angular-ui-router/release/angular-ui-router.min.js"></script>  
316 -<script src="assets/bower_components/oclazyload/dist/ocLazyLoad.min.js"></script>  
317 -<script src="assets/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js"></script>  
318 -  
319 -<!-- schedule计划调度AngularJS模块主js -->  
320 -<script src="pages/scheduleApp/module/main.js"></script>  
321 - 287 +<script src="/assets/bower_components/angular/angular.js"></script>
  288 +<script src="/assets/bower_components/angular-resource/angular-resource.min.js"></script>
  289 +<script src="/assets/bower_components/angular-sanitize/angular-sanitize.min.js"></script>
  290 +<script src="/assets/bower_components/angular-touch/angular-touch.min.js"></script>
  291 +<script src="/assets/bower_components/angular-ui-router/release/angular-ui-router.min.js"></script>
  292 +<script src="/assets/bower_components/oclazyload/dist/ocLazyLoad.min.js"></script>
  293 +<script src="/assets/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js"></script>
  294 +<!-- schedule计划调度AngularJS模块主JS -->
  295 +<script src="/pages/scheduleApp/module/main.js"></script>
322 296
323 <script type="text/javascript"> 297 <script type="text/javascript">
324 - 298 +//初始打开的片段地址
  299 +var initFragment = "^_^initFragment^_^";
  300 +//静态文件目录
325 var dir = '/pages/'; 301 var dir = '/pages/';
  302 +//片段容器
326 var pjaxContainer = '#pjax-container' 303 var pjaxContainer = '#pjax-container'
327 ,angJsContainer = '#route-container'; 304 ,angJsContainer = '#route-container';
328 305
@@ -334,15 +311,13 @@ $(function(){ @@ -334,15 +311,13 @@ $(function(){
334 $(document).on('click','#leftMenuSidebar a[data-pjax]', function(){ 311 $(document).on('click','#leftMenuSidebar a[data-pjax]', function(){
335 $('#leftMenuSidebar li.nav-item.active').removeClass('active'); 312 $('#leftMenuSidebar li.nav-item.active').removeClass('active');
336 $(this).parent().addClass('active'); 313 $(this).parent().addClass('active');
337 -  
338 showPjax(); 314 showPjax();
339 }); 315 });
340 316
341 //angularjs左菜单点击事件 317 //angularjs左菜单点击事件
342 - $(document).on('click','#leftMenuSidebar a[data-angularjs]', function(){ 318 + $(document).on('click','#leftMenuSidebar a[data-angularjs]', function(){
343 $('#leftMenuSidebar li.nav-item.active').removeClass('active'); 319 $('#leftMenuSidebar li.nav-item.active').removeClass('active');
344 $(this).parent().addClass('active'); 320 $(this).parent().addClass('active');
345 -  
346 showAngJs(); 321 showAngJs();
347 }); 322 });
348 323
@@ -355,24 +330,20 @@ $(function(){ @@ -355,24 +330,20 @@ $(function(){
355 }); 330 });
356 var menuHtml = template('menu_list_temp', {list: treeArray}); 331 var menuHtml = template('menu_list_temp', {list: treeArray});
357 $('#leftMenuSidebar').html(menuHtml); 332 $('#leftMenuSidebar').html(menuHtml);
358 -  
359 - /*  
360 - * ----------- 检查URL ----------------  
361 - */  
362 - var p = $.url().param('_')  
363 - ,h = location.hash;  
364 - if(p && p.indexOf(dir) != -1){ 333 +
  334 + //----------- 检查URL ----------------
  335 + var h = location.hash;
  336 + if(initFragment && initFragment != ''){
365 showPjax(); 337 showPjax();
366 //普通片段 338 //普通片段
367 - loadPage(p); 339 + loadPage(initFragment);
368 //选中菜单 340 //选中菜单
369 $.each($('#leftMenuSidebar a'), function(i, item){ 341 $.each($('#leftMenuSidebar a'), function(i, item){
370 - if(urlPattern($(item).attr('href'), p)){ 342 + if(urlPattern($(item).attr('href'), initFragment)){
371 activeLeftMenu(item); 343 activeLeftMenu(item);
372 } 344 }
373 }); 345 });
374 - }  
375 - else if(h){ 346 + }else if(h){
376 //angularjs片段 347 //angularjs片段
377 showAngJs(); 348 showAngJs();
378 //选中菜单 349 //选中菜单
@@ -384,18 +355,19 @@ $(function(){ @@ -384,18 +355,19 @@ $(function(){
384 } 355 }
385 else{ 356 else{
386 //加载主页 357 //加载主页
387 - loadPage('pages/home.html'); 358 + loadPage('/pages/home.html');
388 } 359 }
389 }); 360 });
390 }); 361 });
391 362
  363 +
392 //modal关闭时销毁dom 364 //modal关闭时销毁dom
393 $(document).on('hidden.bs.modal', '.modal', function(){ 365 $(document).on('hidden.bs.modal', '.modal', function(){
394 $(this).remove(); 366 $(this).remove();
395 }); 367 });
396 368
397 function loadPage(url){ 369 function loadPage(url){
398 - $.pjax({url: url, container: pjaxContainer}); 370 + $.pjax({url: url, container: pjaxContainer})
399 } 371 }
400 372
401 function urlPattern(a , b){ 373 function urlPattern(a , b){
@@ -409,15 +381,11 @@ $(function(){ @@ -409,15 +381,11 @@ $(function(){
409 } 381 }
410 382
411 function showPjax(){ 383 function showPjax(){
412 - console.log("showPjax");  
413 -  
414 $(angJsContainer).hide(); 384 $(angJsContainer).hide();
415 $(pjaxContainer).show(); 385 $(pjaxContainer).show();
416 } 386 }
417 387
418 function showAngJs(){ 388 function showAngJs(){
419 - console.log("showAngJs");  
420 -  
421 $(pjaxContainer).html('').hide(); 389 $(pjaxContainer).html('').hide();
422 $(angJsContainer).show(); 390 $(angJsContainer).show();
423 } 391 }
src/main/resources/static/pages/permission/resource/edit.html
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 <ul class="page-breadcrumb breadcrumb"> 7 <ul class="page-breadcrumb breadcrumb">
8 <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li> 8 <li><a href="/pages/home.html" data-pjax>首页</a> <i class="fa fa-circle"></i></li>
9 <li><span class="active">权限管理</span> <i class="fa fa-circle"></i></li> 9 <li><span class="active">权限管理</span> <i class="fa fa-circle"></i></li>
10 - <li><a href="list.html" data-pjax>资源管理</a> <i class="fa fa-circle"></i></li> 10 + <li><a href="javascript:;" class="back" data-pjax>资源管理</a> <i class="fa fa-circle"></i></li>
11 <li><span class="active">编辑资源</span></li> 11 <li><span class="active">编辑资源</span></li>
12 </ul> 12 </ul>
13 13
@@ -82,7 +82,7 @@ @@ -82,7 +82,7 @@
82 <div class="row"> 82 <div class="row">
83 <div class="col-md-offset-3 col-md-4"> 83 <div class="col-md-offset-3 col-md-4">
84 <button type="submit" class="btn green" ><i class="fa fa-check"></i> 保存</button> 84 <button type="submit" class="btn green" ><i class="fa fa-check"></i> 保存</button>
85 - <a type="button" class="btn default" href="list.html" data-pjax><i class="fa fa-times"></i> 取消</a> 85 + <a type="button" class="btn default back" href="javascript:;" ><i class="fa fa-times"></i> 取消</a>
86 </div> 86 </div>
87 </div> 87 </div>
88 </div> 88 </div>
@@ -93,6 +93,10 @@ @@ -93,6 +93,10 @@
93 93
94 <script> 94 <script>
95 $(function(){ 95 $(function(){
  96 + $('a.back').on('click', function(){
  97 + history.back();
  98 + });
  99 +
96 var id = $.url().param('no'); 100 var id = $.url().param('no');
97 101
98 if(!id){ 102 if(!id){
src/main/resources/static/pages/permission/resource/list.html
@@ -151,14 +151,40 @@ @@ -151,14 +151,40 @@
151 151
152 <script type="text/javascript"> 152 <script type="text/javascript">
153 $(function(){ 153 $(function(){
154 -  
155 var page = 0, initPagination; 154 var page = 0, initPagination;
156 var icheckOptions = { 155 var icheckOptions = {
157 checkboxClass: 'icheckbox_flat-blue', 156 checkboxClass: 'icheckbox_flat-blue',
158 increaseArea: '20%' 157 increaseArea: '20%'
159 } 158 }
160 159
161 - jsDoQuery(null,true); 160 + var init = function(){
  161 + jsDoQuery(null,true);
  162 +
  163 + //模块下拉框
  164 + getModuleTreeData(function(treeData){
  165 + var options = '<option value="">请选择...</option>';
  166 + $.each(treeData, function(i, g){
  167 + var dArray = g.children;
  168 +
  169 + for(var i = 0,d; d = dArray[i++];){
  170 + options += '<optgroup label="'+d.name+'">';
  171 + if(!d.children)
  172 + continue;
  173 +
  174 + $.each(d.children, function(i, m){
  175 + options += '<option value="'+m.id+'">'+m.name+'</option>'
  176 + });
  177 + options += '</optgroup>';
  178 + }
  179 + });
  180 + $('#moduleSelect').html(options)/* .select2() */;
  181 + });
  182 + }
  183 +
  184 + //if($('#historyCache').length == 0){
  185 + init();
  186 + //}
  187 +
162 188
163 //重置 189 //重置
164 $('tr.filter .filter-cancel').on('click', function(){ 190 $('tr.filter .filter-cancel').on('click', function(){
@@ -184,26 +210,6 @@ $(function(){ @@ -184,26 +210,6 @@ $(function(){
184 jsDoQuery(params, true); 210 jsDoQuery(params, true);
185 }); 211 });
186 212
187 - //模块下拉框  
188 - getModuleTreeData(function(treeData){  
189 - var options = '<option value="">请选择...</option>';  
190 - $.each(treeData, function(i, g){  
191 - var dArray = g.children;  
192 -  
193 - for(var i = 0,d; d = dArray[i++];){  
194 - options += '<optgroup label="'+d.name+'">';  
195 - if(!d.children)  
196 - continue;  
197 -  
198 - $.each(d.children, function(i, m){  
199 - options += '<option value="'+m.id+'">'+m.name+'</option>'  
200 - });  
201 - options += '</optgroup>';  
202 - }  
203 - });  
204 - $('#moduleSelect').html(options).select2();  
205 - });  
206 -  
207 /* 213 /*
208 * 获取数据 p: 要提交的参数, pagination: 是否重新分页 214 * 获取数据 p: 要提交的参数, pagination: 是否重新分页
209 */ 215 */