left.jsp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. <%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
  2. <%@ page import="cn.sinobest.framework.comm.iface.IOperator" %>
  3. <%@ page import="cn.sinobest.sysmngr.comm.ConVar,cn.sinobest.framework.util.ConfUtil,cn.sinobest.framework.comm.Environment" %>
  4. <%@include file="./taglib.jsp" %>
  5. <%
  6. String jsMin = "";
  7. if (Environment.getAppProductMode()) {
  8. jsMin = "-min";
  9. }
  10. final String headtoken=Environment.HEADER_TOKEN;
  11. %>
  12. <jsp:useBean id="treebean" scope="page" class="cn.sinobest.sysmngr.web.left.LeftTreeBean"></jsp:useBean>
  13. <%
  14. response.setHeader("Pragma","No-cache");
  15. response.setHeader("Cache-Control","no-cache");
  16. response.setDateHeader("Expires", 0);
  17. IOperator Operator = null;
  18. Object obj = request.getSession().getAttribute(ConVar.LOGIN_SESSION_ID);
  19. if(obj != null){
  20. Operator = (IOperator)obj;
  21. }
  22. StringBuilder model= treebean.getTreeMenus(Operator.getMenus(),request);
  23. //字典获取方法
  24. final String DICT_MODE = ConfUtil.getSysParam("app.dictMode","server");
  25. Cookie[] cookies=request.getCookies();
  26. String styleMode="blue";
  27. for(Cookie cookie:cookies){
  28. if("b2cPlatform".equals(cookie.getName())){
  29. styleMode=cookie.getValue();
  30. }
  31. }
  32. %>
  33. <html>
  34. <head>
  35. <meta http-equiv="pragma" content="no-cache">
  36. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  37. <meta http-equiv="X-UA-Compatible" content="<%=Environment.XUACompatible %>" />
  38. <% if ("-min".equals(jsMin)) { %>
  39. <link href="${ctx}/themes/default/fw-all-default<%=jsMin%>.css?v=${deployVersion}" rel="stylesheet" type="text/css">
  40. <% } else { %>
  41. <link href="${ctx}/themes/default/letf.css?v=${deployVersion}" rel="stylesheet" type="text/css">
  42. <link href="${ctx}/themes/default/default.css?v=${deployVersion}" rel="stylesheet" type="text/css">
  43. <% } %>
  44. <link href="${ctx}/themes/default/style_<%=styleMode%>.css?v=${deployVersion}"
  45. rel="stylesheet" type="text/css" id="cssfile" />
  46. <!--[if IE 6]>
  47. <link href="${ctx}/themes/default/ie6.css" rel="stylesheet" type="text/css">
  48. <![endif]-->
  49. <link href="${ctx}/js/comm/ui/dynatree/ui.dynatree<%=jsMin%>.css" rel="stylesheet" type="text/css">
  50. <style>
  51. .searchIcon{
  52. position: absolute;
  53. left: 5px;
  54. top : 3px;
  55. background: url("<%=request.getContextPath()%>/themes/default/images/search.png");
  56. width: 16px;
  57. height: 16px;
  58. }
  59. .localstorage {
  60. border: 1px #cccccc solid;
  61. color: #006699;
  62. clip: height;
  63. background-color: #ffffff;
  64. height: 20px;
  65. font-weight:bold;
  66. padding-top: 5px;
  67. padding-right: 5px;
  68. padding-bottom: 5px;
  69. padding-left: 5px;
  70. width: 130px
  71. }
  72. .localstoragehover {
  73. border: 1px #006699 solid;
  74. color: #333333;
  75. clip: height;
  76. background-color: #C8D8F0;
  77. height: 20px;
  78. padding-top: 5px;
  79. padding-right: 5px;
  80. padding-bottom: 5px;
  81. padding-left: 5px;
  82. width: 130px
  83. }
  84. </style>
  85. <script type="text/javascript">
  86. var contextPath='${ctx}';
  87. var _selfUrl = '${url}';
  88. var headtoken= '<%=headtoken%>';
  89. </script>
  90. <script src="${ctx}/js/comm/lib/jquery.js" language="JavaScript" type="text/javascript"></script>
  91. <% if ("-min".equals(jsMin)) { %>
  92. <script src="${ctx}/js/comm/fw-comm-all<%=jsMin%>.js?v=${deployVersion}" language="JavaScript" type="text/javascript"></script>
  93. <% } else { %>
  94. <script src="${ctx}/js/comm/lib/ui.core.js" language="JavaScript" type="text/javascript"></script>
  95. <script src="${ctx}/js/comm/lib/ui.widget.js" language="JavaScript" type="text/javascript"></script>
  96. <script src="${ctx}/js/comm/ui/dynatree/jquery.dynatree.js" language="JavaScript" type="text/javascript"></script>
  97. <% if(DICT_MODE.equalsIgnoreCase("local")) { %>
  98. <script src="${ctx}/js/comm/fn/deployJava.js" language="JavaScript" type="text/javascript"></script>
  99. <% }else if(DICT_MODE.equalsIgnoreCase("localstorage")){%>
  100. <script src="${ctx}/js/comm/lib/jquery.cookie.js" language="JavaScript" type="text/javascript"></script>
  101. <script src="${ctx}/js/comm/lib/json2.js" language="JavaScript" type="text/javascript"></script>
  102. <%} %>
  103. <script src="${ctx}/js/comm/fw/pinyin.dict.js" language="JavaScript" type="text/javascript"></script>
  104. <% } %>
  105. </head>
  106. <body class="leftbody">
  107. <div id="div_tree" >
  108. <table style="padding-left:1px" width="100%" height="97%" border=0 cellpadding=0 cellspacing=0 >
  109. <tr height="25" >
  110. <td align="left" class="menubutton" width="100%" >
  111. <div >
  112. <table width="100%" border="0" cellspacing="0" cellpadding="0">
  113. <tr>
  114. <td align="center"><a href="#" id="zk">全部展开</a> | <a href="#" id="gb">全部关闭</a></td>
  115. </tr>
  116. </table>
  117. </div>
  118. </td>
  119. </tr>
  120. <tr>
  121. <td>
  122. <a href="###" id="searchIcon" class="searchIcon"></a>
  123. <input id="searchText" class="textbox" style="display:none;"></input>
  124. </td>
  125. </tr>
  126. <tr>
  127. <td>
  128. <div id="menuTree"></div>
  129. </td>
  130. </tr>
  131. <tr height="100%">
  132. <td>
  133. </td>
  134. </tr>
  135. <tr height="20" >
  136. <td align="center">
  137. <% if(DICT_MODE.equalsIgnoreCase("local")) { %>
  138. <script type="text/javascript">
  139. var attributes = {
  140. id : 'dictapplet',
  141. width : 100,
  142. height : 20,
  143. code:'cn.sinobest.framework.applet.DictCacheApplet',
  144. archive: contextPath+'/applet/DictApplet-0.0.1-SNAPSHOT.jar'
  145. };
  146. var parameters = {
  147. boxbgcolor:'white',
  148. MAYSCRIPT:true,
  149. scriptable:true,
  150. boxborder:false,
  151. userid:"<%=Operator.getOperID()%>",
  152. myxxid:"<%=session.getId()%>",
  153. serviceUrl:_getUrl()+'/downFile.do',
  154. contextPath:_getUrl()
  155. };
  156. deployJava.runApplet(attributes, parameters, '1.5');
  157. function _getUrl(){
  158. var url = window.location.toString();
  159. var count = 0;
  160. var pos = 0;
  161. for(var i=0;i<url.length;i++){
  162. if(url.charAt(i) == "/"){
  163. count++;
  164. }
  165. if(count == 4){
  166. pos = i;
  167. break;
  168. }
  169. }
  170. return url.substring(0,pos);
  171. }
  172. </script>
  173. <% }else if(DICT_MODE.equalsIgnoreCase("localstorage")){ %>
  174. <div id='localstorage' title="亲!字典显示不出来么?双击点我试试!" class='localstorage'>字典盒子</div>
  175. <script type="text/javascript">
  176. var dictflag=false;
  177. // 系统登录自动判断字典是否需要下载
  178. updatedict();
  179. function updatedict(version){
  180. if(!window.localStorage){
  181. return;
  182. }
  183. if(dictflag){
  184. return;
  185. }
  186. if(version==null){
  187. version=localStorage.DICTVERSION;
  188. }
  189. var services=[];
  190. var service={'serviceId':'localStorageDictService','method':'getDict','parameters':{'VERSION':version}};
  191. services.push(service);
  192. dictflag=!dictflag;
  193. $.ajax({
  194. url:contextPath+'/ajaxAdapter.do'
  195. ,data:{parameters:JSON.stringify(services),shareArguments:JSON.stringify({})}
  196. ,dataType :'json'
  197. ,cache:false
  198. ,async:false
  199. ,contentType: "application/x-www-form-urlencoded; charset=utf-8"
  200. ,type:'post'
  201. ,error:function (request, textStatus, errorThrown) {
  202. setTimeout(function(){
  203. dictflag=!dictflag;
  204. $('#localstorage').html('字典盒子');
  205. },500);
  206. }
  207. ,success:function (data, textStatus) {
  208. setTimeout(function(){
  209. dictflag=!dictflag;
  210. $('#localstorage').html('字典盒子');
  211. },500);
  212. if(data!=null && data[headtoken]!=null){
  213. token=data[headtoken];//更新全局变量token标志
  214. }
  215. //校验业务处理是否正确执行
  216. if("1"!=data.FHZ){//出错了,弹出错误提醒
  217. if ("loginTimeout" == data.FHZ) {
  218. if(window.confirm(data.MSG||'')){
  219. window.top.location.href=_selfUrl;
  220. }
  221. } else {
  222. alert(data.MSG||'');
  223. }
  224. }else{
  225. var mData=data.RTN;
  226. var needdown=mData[0]['NEEDDOWN'];
  227. if(needdown){
  228. localStorage.removeItem("DICTS");
  229. localStorage.setItem("DICTS",JSON.stringify(mData[0]['DICTS']));
  230. localStorage.removeItem("BIGDICTS");
  231. localStorage.setItem("BIGDICTS",JSON.stringify(mData[0]['BIGDICTS']));
  232. localStorage.removeItem("DICTVERSION");
  233. localStorage.DICTVERSION=mData[0]['DICTVERSION'];
  234. }
  235. }
  236. }
  237. ,beforeSend:function(XMLHttpRequest ){
  238. $('#localstorage').html('字典初始化中...');
  239. var cToken = $.cookie(headtoken) || token;XMLHttpRequest.setRequestHeader(headtoken,cToken);
  240. }
  241. ,complete:function( ){
  242. }
  243. });
  244. }
  245. /**
  246. * 绑定搜索按钮和搜索文本输入框的事件
  247. */
  248. $(function(){
  249. $("#localstorage").bind('mouseover',function(){
  250. $("#localstorage").removeClass("localstorage");
  251. $("#localstorage").addClass("localstoragehover");
  252. });
  253. $("#localstorage").bind('mouseleave',function(){
  254. $("#localstorage").removeClass("localstoragehover");
  255. $("#localstorage").addClass("localstorage");
  256. });
  257. $("#localstorage").bind('dblclick',function(){
  258. updatedict('V0');
  259. });
  260. });
  261. </script>
  262. <% }%>
  263. </td>
  264. </tr>
  265. <tr height=30 >
  266. <td align="center"><img src="${ctx}/themes/default/images/hnisi.jpg"></img></td>
  267. </tr>
  268. </table>
  269. </div>
  270. </body>
  271. <script type="text/javascript">
  272. var model='';
  273. <%if(!model.toString().equals("")){%>
  274. model=<%=model.toString()%>;
  275. <%}%>
  276. $(function(){
  277. // Attach the dynatree widget to an existing <div id="tree"> element
  278. // and pass the tree options as an argument to the dynatree() function:
  279. $("#menuTree").dynatree({
  280. selectMode:1,
  281. minExpandLevel:2,
  282. imagePath: "images/",
  283. onClick: function(dtnode, event) {
  284. // A DynaTreeNode object is passed to the activation handler
  285. // Note: we also get this event, if persistence is on, and the page is reloaded.
  286. var url= dtnode.data.url;
  287. if (!url ||url.length==0){
  288. return;
  289. }
  290. //新窗口中打开
  291. if( event.altKey ) {
  292. window.open(url);
  293. }else{
  294. top.frames['workspace'].location.href=url;
  295. }
  296. //alert("You activated " + dtnode.data.url);
  297. },
  298. children:model
  299. });
  300. //全部展开
  301. $('#zk').click(function(){
  302. $("#menuTree").dynatree("getRoot").visit(function(dtnode){
  303. dtnode.expand(true);
  304. });
  305. });
  306. //全部展开
  307. $('#gb').click(function(){
  308. $("#menuTree").dynatree("getRoot").visit(function(dtnode){
  309. dtnode.expand(false);
  310. });
  311. });
  312. });
  313. </script>
  314. <script type="text/javascript">
  315. /**
  316. * 搜索功能模块,入口请搜索“[main]”
  317. */
  318. (function(model){
  319. var mNodes = {mLevelOneNodes:{},mLevelTwoNodes:{},mLevelThreeNodes:{}};
  320. var bParseModel = false;
  321. /***
  322. * 功能:返回一个符合搜索条件的数据模型
  323. * 过程:
  324. * 1. 解析model,分别得出第一级菜单,第二级菜单,第三级菜单的数据
  325. * 2. 搜索出符合条件的三级菜单
  326. * 3. 为三级菜单加上对应的一二级菜单,得出最终的数据模型
  327. * @param model json类型,完整的数据模型
  328. * @param sSearchText string类型,搜索文本内容
  329. * @return 返回一个过滤后的菜单数据模型
  330. */
  331. function fnFilterModel(sSearchText){
  332. //1. 解析model,分别得出第一级菜单,第二级菜单,第三级菜单的数据
  333. if(!bParseModel){
  334. fnParseModel(model);
  335. }
  336. if(!sSearchText){
  337. return model;
  338. }
  339. sSearchText = sSearchText.replace(/(^\s*)|(\s*$)/g,'');
  340. var mLevelThreeNodes = mNodes.mLevelThreeNodes;
  341. var arrMatchKeys = [];
  342. //2. 搜索出符合条件的三级菜单
  343. for(var key in mLevelThreeNodes){
  344. var node = mLevelThreeNodes[key];
  345. if(node.title.indexOf(sSearchText)!=-1){
  346. arrMatchKeys.push(node.key);
  347. }
  348. }
  349. var mTmpNodes = {};
  350. var retModel = [];
  351. //3. 为三级菜单加上对应的一二级菜单,得出最终的数据模型
  352. for(var i in arrMatchKeys){
  353. var levelThreeKey = arrMatchKeys[i];
  354. var levelTwoKey = levelThreeKey.substring(0,4);
  355. var levelOneKey = levelThreeKey.substring(0,2);
  356. var levelThreeNode = mNodes.mLevelThreeNodes[levelThreeKey];
  357. if(!mTmpNodes[levelTwoKey]){
  358. var levelTwoNode = $.extend({},mNodes.mLevelTwoNodes[levelTwoKey]);
  359. levelTwoNode.children = [levelThreeNode];
  360. mTmpNodes[levelTwoKey] = levelTwoNode;
  361. if(!mTmpNodes[levelOneKey]){
  362. var levelOneNode = $.extend({},mNodes.mLevelOneNodes[levelOneKey]);
  363. levelOneNode.children = [levelTwoNode];
  364. mTmpNodes[levelOneKey] = levelOneNode;
  365. retModel.push(levelOneNode);
  366. }else{
  367. mTmpNodes[levelOneKey].children.push(levelTwoNode);
  368. }
  369. }else{
  370. mTmpNodes[levelTwoKey].children.push(levelThreeNode);
  371. }
  372. }
  373. return retModel;
  374. }
  375. /**
  376. * 功能:解析model,按第一级、第二级、第三级菜单存放在 mNodes = {mLevelOneNodes:{},mLevelTwoNodes:{},mLevelThreeNodes:{}}中
  377. */
  378. function fnParseModel(){
  379. var children = model;
  380. if(Object.prototype.toString.call(children) !== "[object Array]"){
  381. return false;
  382. }
  383. var mLevelOneNodes = {};
  384. var mLevelTwoNodes = {};
  385. var mLevelThreeNodes = {};
  386. var arrLevelOneNodeAttrs = ["key","title","isFolder"];
  387. var arrLevelTwoNodeAttrs = ["key","title","isFolder"];
  388. var arrLevelThreeNodeAttrs = ["key","title","url"];
  389. for(var i in children){
  390. var levelOneNode = children[i];
  391. _fnCopyNode(levelOneNode,mLevelOneNodes,arrLevelOneNodeAttrs);
  392. if(Object.prototype.toString.call(levelOneNode.children) !== "[object Array]"){
  393. continue;
  394. }
  395. for(var j in levelOneNode.children){
  396. var levelTwoNode = levelOneNode.children[j];
  397. _fnCopyNode(levelTwoNode,mLevelTwoNodes,arrLevelTwoNodeAttrs);
  398. if(Object.prototype.toString.call(levelTwoNode.children) !== "[object Array]"){
  399. continue;
  400. }
  401. for(var k in levelTwoNode.children){
  402. var levelThreeNode = levelTwoNode.children[k];
  403. _fnCopyNode(levelThreeNode,mLevelThreeNodes,arrLevelThreeNodeAttrs);
  404. }
  405. }
  406. }
  407. mNodes.mLevelOneNodes = mLevelOneNodes;
  408. mNodes.mLevelTwoNodes = mLevelTwoNodes;
  409. mNodes.mLevelThreeNodes = mLevelThreeNodes;
  410. bParseModel = true;
  411. function _fnCopyNode(srcNode,mDestNodes,arrNodeAttrs){
  412. var obj = {};
  413. for(var i in arrNodeAttrs){
  414. var attrName = arrNodeAttrs[i];
  415. obj[attrName] = srcNode[attrName];
  416. }
  417. mDestNodes[srcNode.key] = obj;
  418. }
  419. }
  420. /**
  421. * 绑定搜索按钮和搜索文本输入框的事件
  422. */
  423. $(function(){
  424. var $searchText = $("#searchText");
  425. var bShow = false;
  426. /**
  427. * 点击搜索放大镜图标的时候,隐藏或者显示搜索框
  428. */
  429. $("#searchIcon").bind('click dblclick',function(){
  430. if(bShow){
  431. $searchText.css({display:"none"});
  432. }else{
  433. $searchText.css({display:"inline"});
  434. setTimeout($searchText.focus(),0);
  435. }
  436. bShow = !bShow;
  437. });
  438. var root = $("#menuTree").dynatree("getRoot");
  439. /**
  440. * 搜索菜单
  441. */
  442. function fnSearch(){
  443. var sSearchText = $("#searchText").val();
  444. root.removeChildren();
  445. root.addChild(fnFilterModel(sSearchText));
  446. if(""!==sSearchText){
  447. root.visit(function(dtnode){
  448. dtnode.expand(true);
  449. });
  450. }
  451. };
  452. var timeoutSearch;
  453. /**
  454. * [main]在搜索文本文本框录入内容的时候,搜索菜单
  455. */
  456. $searchText.bind("propertychange",function(e){
  457. clearTimeout(timeoutSearch);
  458. timeoutSearch = setTimeout(fnSearch,0);
  459. });
  460. });
  461. })(model);//搜索功能模块
  462. </script>
  463. <script type="text/javascript">
  464. parent.mLoadStatus.TreeMenu = true;
  465. </script>
  466. </html>