main.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. /**
  2. * 应用唯一全局对象
  3. * @namespace ONEMAP
  4. * @type {*|Object}
  5. */
  6. var ONEMAP = ONEMAP || {}; //全局变量
  7. /**
  8. * 模块对象
  9. * @namespace ONEMAP.M
  10. * @type {Object}
  11. */
  12. ONEMAP.M = {}; //模块
  13. /**
  14. * 视图对象
  15. * @namespace ONEMAP.V
  16. * @type {Object}
  17. */
  18. ONEMAP.V = {}; //视图
  19. /**
  20. * 管理对象
  21. * @namespace ONEMAP.C
  22. * @type {Object}
  23. */
  24. ONEMAP.C = {}; //管理
  25. /**
  26. * 共用工具对象
  27. * @namespace ONEMAP.T
  28. * @type {Object}
  29. */
  30. ONEMAP.T = {}; //共用
  31. /**
  32. * 数据对象
  33. * @namespace ONEMAP.D
  34. * @type {Object}
  35. */
  36. ONEMAP.D = {}; //数据
  37. //新旧用户动作id对照表
  38. ONEMAP.D.newToOld = {
  39. 1002: 26013,
  40. 1003: 26015,
  41. 1005: 26014,
  42. 1006: 26020,
  43. 1007: 26018,
  44. 1008: 26021,
  45. 1010: 26020,
  46. 1011: 26020,
  47. 1012: 26017,
  48. 1013: 26019,
  49. 1030: 26011,
  50. 1033: 26007,
  51. 1034: 26010,
  52. 1035: 26011,
  53. 1046: 26027,
  54. 1047: 26027,
  55. 1048: 26026,
  56. 1049: 26027,
  57. 1050: 26025,
  58. 1055: 26026,
  59. 1056: 26027,
  60. 1057: 26025,
  61. 1060: 26029,
  62. 1061: 26029,
  63. 1062: 26029,
  64. 1063: 26029,
  65. 1065: 26029,
  66. 1066: 26029,
  67. 1068: 26029,
  68. 1072: 26024,
  69. 1074: 26024,
  70. 1087: 26003,
  71. 1088: 26003,
  72. 1091: 26029,
  73. 1092: 26029,
  74. 1095: 26029
  75. }
  76. //专题图数据
  77. ONEMAP.D.Thematic = {};
  78. //地图显示专题图数据集
  79. ONEMAP.D.ThematicInMapData = {};
  80. //浏览器类型
  81. ONEMAP.M.liuLanQi = "";
  82. //require 配置
  83. require.config({
  84. baseUrl: "./",
  85. waitSeconds: 25,
  86. urlArgs: "v=" + onemapVersion,
  87. paths: {
  88. text: "scripts/vendor/require/text",
  89. html: "scripts/vendor/require/html",
  90. css: "scripts/vendor/require/css",
  91. image: "scripts/vendor/require/image",
  92. async: "scripts/vendor/require/async",
  93. font: "scripts/vendor/require/font",
  94. //modDir
  95. modDir: "scripts/mod",
  96. meteoDir: "scripts/meteo",
  97. layoutDir: "scripts/layout",
  98. vendorDir: "scripts/vendor",
  99. jbDir: "jbDraw",
  100. lgDir: "layerGuid",
  101. //handlebars
  102. handlebars: "scripts/vendor/handlebars/handlebars",
  103. jqueryDir: "scripts/vendor/jquery",
  104. jquery: "scripts/vendor/jquery/jquery",
  105. //kindeditor
  106. kindeditor: "scripts/vendor/kindeditor/kindeditor-all",
  107. kindeditorDir: "scripts/vendor/kindeditor",
  108. },
  109. shim: {
  110. "kindeditor": {
  111. deps: ["css!kindeditorDir/themes/default/default"]
  112. },
  113. "jqueryDir/jquery-ui": {
  114. deps: ["css!jqueryDir/jquery-ui", "jquery"]
  115. },
  116. "jqueryDir/jquery.iviewer.min": {
  117. deps: ["jqueryDir/jquery-ui", "jqueryDir/jquery.mousewheel"]
  118. },
  119. "handlebars": {
  120. exports: "Handlebars"
  121. },
  122. }
  123. });
  124. require([''],
  125. function() {
  126. $.ajaxSetup({
  127. cache: false
  128. });
  129. /**
  130. *
  131. * 订阅分发模块
  132. * 可以实现 某模块数据改变并通过 订阅分发模块
  133. * 告知其他订阅该组信息的模块进行相应的事件处理
  134. * @exports ONEMAP.C.publisher
  135. * @type {Object}
  136. */
  137. ONEMAP.C.publisher = {
  138. /**
  139. * 订阅人员分组集合
  140. * @type {Object}
  141. * @default []
  142. */
  143. subscribers: {
  144. any: []
  145. },
  146. /**
  147. * 注册订阅
  148. * @type {Function}
  149. * @param fn {Function} 事件
  150. * @param group {String} 订阅组名称
  151. * @example
  152. * ONEMAP.C.publisher.subscribe(function(){//something to do},'sideBarLayoutChange');
  153. */
  154. subscribe: function(fn, group) {
  155. group = group || 'any';
  156. if (typeof(this.subscribers[group]) === "undefined") {
  157. this.subscribers[group] = [];
  158. }
  159. this.subscribers[group].push(fn);
  160. },
  161. /**
  162. * 取消订阅
  163. * @type {Function}
  164. * @param fn {Function} 事件
  165. * @param group {String} 订阅组名称
  166. * @example
  167. * ONEMAP.C.publisher.unSubscribe(function(){//something to do},'sideBarLayoutChange');
  168. */
  169. unSubscribe: function(fn, group) {
  170. this.visitSubscribers('unSubscribe', fn, group);
  171. },
  172. /**
  173. * 推送订阅
  174. * @type {Function}
  175. * @param publicArg {*} 传递的参数
  176. * @param group {String} 订阅组名称
  177. * @example
  178. * ONEMAP.C.publisher.publish('','sideBarLayoutChange');
  179. */
  180. publish: function(publicArg, group) {
  181. this.visitSubscribers('publish', publicArg, group);
  182. },
  183. /**
  184. * 执行事件分发||执行取消订阅
  185. * @type {Function}
  186. * @param action {String} 执行方式
  187. * @param arg {*} 传递的参数
  188. * @param group {String} 订阅组名称
  189. */
  190. visitSubscribers: function(action, arg, group) {
  191. var pubGroup = group || 'any';
  192. if (this.subscribers[pubGroup]) {
  193. var subscribers = this.subscribers[pubGroup];
  194. var i;
  195. var max = subscribers.length;
  196. for (i = 0; i < max; i++) {
  197. if (action === 'publish') {
  198. subscribers[i](arg);
  199. } else {
  200. if (subscribers[i] === arg) {
  201. subscribers.splice(i, 1);
  202. }
  203. }
  204. }
  205. }
  206. }
  207. };
  208. /**
  209. * 定时器
  210. * 用于记录应用的timeOut事件集合
  211. * @exports ONEMAP.C.timeOut
  212. * @type {Object}
  213. * @example
  214. * ONEMAP.C.timeOut.mapDrag = setTimeOut(function(){},3000);
  215. */
  216. ONEMAP.C.timeOut = {};
  217. /**
  218. * 加密解密 调用 CryptoJS库
  219. * @exports ONEMAP.C.encryption
  220. * @type {Object}
  221. */
  222. ONEMAP.C.encryption = {
  223. /**
  224. * BASE64加密
  225. * @type {Function}
  226. * @param str {String} 加密前的文本
  227. * @returns {String} 加密后的文本
  228. */
  229. enCode: function(str) {
  230. return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(str));
  231. },
  232. /**
  233. * BASE64解密
  234. * @type {Function}
  235. * @param str {String} 解密前的文本
  236. * @returns {String} 解密后的明文
  237. */
  238. deCode: function(str) {
  239. return CryptoJS.enc.Base64.parse(str).toString(CryptoJS.enc.Utf8);
  240. }
  241. };
  242. /**
  243. * loading 加载列队 控制当前有加载 显示loading条,如果该列队都加载完成后,隐藏loading条
  244. * 发送请求前 load , 回调回来 loaded
  245. * @exports ONEMAP.V.loading
  246. * @type {Object}
  247. */
  248. ONEMAP.V.loading = {
  249. /**
  250. * 在线loading统计
  251. * @type {Number}
  252. * @default 0
  253. */
  254. count: 0,
  255. /**
  256. * 添加一个加载统计
  257. * @type {Function}
  258. * @example
  259. * ONEMAP.V.loading.load()
  260. */
  261. load: function() {
  262. this.count++;
  263. $("#loading").slideDown(50);
  264. //超时设置
  265. if (ONEMAP.C.timeOut.loading) {
  266. clearTimeout(ONEMAP.C.timeOut.loading);
  267. }
  268. ONEMAP.C.timeOut.loading = setTimeout(function() {
  269. ONEMAP.V.loading.killLoad();
  270. }, 8000);
  271. },
  272. /**
  273. * 加载完成后调用一次,表示从加载列队中删除一此统计数
  274. * @type {Function}
  275. * @example
  276. * //加载
  277. * ONEMAP.V.loading.load();
  278. * //do something
  279. * //完成此次加载
  280. * ONEMAP.V.loading.loaded();
  281. */
  282. loaded: function() {
  283. this.count--;
  284. if (this.count === 0) {
  285. $("#loading").slideUp(50);
  286. }
  287. },
  288. /**
  289. * 强制删除加载列队统计
  290. * @type {Function}
  291. * @example
  292. * ONEMAP.V.loading.killLoad();
  293. */
  294. killLoad: function() {
  295. this.count = 0;
  296. $("#loading").slideUp(50);
  297. ONEMAP.C.timeOut.loading = null;
  298. }
  299. };
  300. /**
  301. * 获取url参数
  302. * @param {[type]} name [description]
  303. * @return {[type]} [description]
  304. */
  305. ONEMAP.T.getQueryString = function(name) {
  306. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  307. var r = window.location.search.substr(1).match(reg);
  308. if (r != null) return decodeURI(r[2]);
  309. return '';
  310. };
  311. /**
  312. * POST方式提交数据
  313. * @exports ONEMAP.T.POST
  314. * @type {Function}
  315. * @param URL {String}
  316. * @param PARAMS {Object}
  317. */
  318. ONEMAP.T.POST = function(URL, PARAMS) {
  319. var temp = document.createElement("form");
  320. temp.action = URL;
  321. temp.method = 'post';
  322. temp.style.display = "none";
  323. temp.target = '_blank';
  324. for (var x in PARAMS) {
  325. var opt = document.createElement("textarea");
  326. opt.name = x;
  327. opt.value = PARAMS[x];
  328. temp.appendChild(opt);
  329. }
  330. document.body.appendChild(temp);
  331. temp.submit();
  332. setTimeout(function() {
  333. document.body.removeChild(temp);
  334. }, 1000);
  335. return temp;
  336. },
  337. /**
  338. * 当前用户状态 包含浏览方式 当前城市信息 数据库里保存的历史记录 当前正在使用的模块
  339. * @exports ONEMAP.D.user
  340. * @type {Object}
  341. */
  342. ONEMAP.D.user = {
  343. //当前正在浏览的方式: pc/mobile
  344. viewType: 'pc',
  345. searchKeyWord: null,
  346. //用户令牌
  347. ticket: '',
  348. action_list: [],
  349. name: "游客",
  350. guest: true
  351. };
  352. /**
  353. * 当前城市信息
  354. * @type {Object}
  355. */
  356. ONEMAP.D.cityInfo = {
  357. name: null, //中文名称
  358. center: null,
  359. bounds: null,
  360. zoom: null,
  361. guid: null //唯一标识符
  362. }
  363. ONEMAP.D.currentSideBarMod = null;
  364. ONEMAP.D.appendToMyLayer = null;
  365. /**
  366. * 全局设置
  367. * @type {Object}
  368. */
  369. //ONEMAP.D.globalSettingData = null;
  370. ONEMAP.D.globalSettingData = {
  371. }
  372. /**
  373. * 统计地图上叠加的专题图
  374. * @type {Number}
  375. */
  376. ONEMAP.D.overLayerCount = 0;
  377. /**
  378. * cookie管理
  379. * @exports ONEMAP.C.cookie
  380. * @type {Object}
  381. */
  382. ONEMAP.C.cookie = {
  383. /**
  384. * 设置cookie
  385. * @type {Function}
  386. * @param name {String} 名称
  387. * @param value {String} 值
  388. * @param days {Number} 过期时间(天)
  389. * @example
  390. * ONEMAP.C.cookie.set('cookieName','cookieValue',20);
  391. */
  392. set: function(name, value, days) {
  393. //document.cookie = ONEMAP.C.encryption.enCode(name) + "=" + ONEMAP.C.encryption.enCode(escape(value));
  394. document.cookie = name + "=" + value;
  395. },
  396. /**
  397. * 获取cookie
  398. * @type {Function}
  399. * @param name {String} 名称
  400. * @returns {null|String} 返回值
  401. * @example
  402. * ONEMAP.C.cookie.get('cookieName');
  403. */
  404. get: function(name) {
  405. // var arr, reg = new RegExp("(^| )" + ONEMAP.C.encryption.enCode(name) + "=([^;]*)(;|$)");
  406. var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
  407. arr = document.cookie.match(reg);
  408. if (arr) {
  409. // return ONEMAP.C.encryption.deCode(unescape(arr[2]));
  410. return arr[2];
  411. } else {
  412. return null;
  413. }
  414. },
  415. /**
  416. * 删除cookie
  417. * @type {Function}
  418. * @param name {String} 名称
  419. * @example
  420. * ONEMAP.C.cookie.del('cookieName');
  421. */
  422. del: function(name) {
  423. var exp = new Date();
  424. exp.setTime(exp.getTime() - 1);
  425. var cval = this.get(name);
  426. // if (cval !== null) document.cookie = ONEMAP.C.encryption.enCode(name) + "=" + cval + ";expires=" + exp.toGMTString();
  427. if (cval !== null) document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
  428. }
  429. };
  430. /**
  431. * 对象合并
  432. * @exports ONEMAP.T.objExtend
  433. * @type {Function}
  434. * @param o {Object} 原始的
  435. * @param n {Object} 需要并入的
  436. * @param override {Boolean} 是否覆盖掉已有属性或者方法
  437. */
  438. ONEMAP.T.objExtend = function(o, n, override) {
  439. for (var p in n) {
  440. if (n.hasOwnProperty(p) && (!o.hasOwnProperty(p) || override)) {
  441. o[p] = n[p];
  442. }
  443. }
  444. };
  445. /**
  446. * 字符串长度截取
  447. * @exports ONEMAP.T.stringSub
  448. * @type {Function}
  449. * @param s {String} 原始字符串
  450. * @param n {Number} 保留的长度
  451. * @returns {String} 返回截取后的字符串
  452. */
  453. ONEMAP.T.stringSub = function(s, n) {
  454. var r = /[^\x00-\xff]/g;
  455. if (s.replace(r, "mm").length <= n) return s;
  456. var m = Math.floor(n / 2);
  457. for (var i = m; i < s.length; i++) {
  458. if (s.substr(0, i).replace(r, "mm").length >= n) return s.substr(0, i) + "...";
  459. }
  460. return s;
  461. };
  462. /**
  463. * 将obj的个属性名放到一个数组里并返回,方便取到长度和名称
  464. * @type {Function}
  465. * @exports ONEMAP.T.getObjNameAry
  466. * @param obj {Object} 需要查询的对象
  467. * @returns {Array} 返回结果数组
  468. */
  469. ONEMAP.T.getObjNameAry = function(obj) {
  470. var item;
  471. var count = [];
  472. for (item in obj) {
  473. if (obj.hasOwnProperty(item)) {
  474. count.push(item);
  475. }
  476. }
  477. return count;
  478. };
  479. /**
  480. * 判断一个对象是否为空对象
  481. * @exports ONEMAP.T.isEmptyObject
  482. * @type {Function}
  483. * @param obj {Object} 需要查询的对象
  484. * @returns {boolean} 返回 true || false
  485. */
  486. ONEMAP.T.isEmptyObject = function(obj) {
  487. for (var name in obj) {
  488. return false;
  489. }
  490. return true;
  491. };
  492. /**
  493. * 判断是否为Json格式
  494. * @exports ONEMAP.T.isJson
  495. * @type {Function}
  496. * @param obj {Object} 需要查询的Json对象
  497. * @returns {boolean} 返回true || false
  498. */
  499. ONEMAP.T.isJson = function(obj) {
  500. var isJson = typeof obj === "object" && Object.prototype.toString.call(obj).toLowerCase() === "[object object]" && !obj.length;
  501. return isJson;
  502. };
  503. /**
  504. * 检测flash player的版本
  505. * @exports ONEMAP.T.flashChecker
  506. * @type {Function}
  507. * @returns {Object}
  508. */
  509. ONEMAP.T.flashChecker = function() {
  510. var hasFlash = 0;
  511. var flashVersion = 0;
  512. if (document.all) {
  513. var swf = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
  514. if (swf) {
  515. hasFlash = 1;
  516. VSwf = swf.GetVariable('$version');
  517. flashVersion = parseInt(VSwf.split(" ")[1].split(",")[0]);
  518. }
  519. } else {
  520. if (navigator.plugins && navigator.plugins.length > 0) {
  521. var swf = navigator.plugins["Shockwave Flash"];
  522. }
  523. if (swf) {
  524. hasFlash = 1;
  525. var words = swf.description.split(" ");
  526. for (var i = 0; i < words.length; i++) {
  527. if (isNaN(parseInt(words[i]))) continue;
  528. flashVersion = parseInt(words[i]);
  529. }
  530. }
  531. }
  532. return {
  533. f: hasFlash,
  534. v: flashVersion
  535. };
  536. };
  537. /**
  538. * 没有权限提示
  539. * @param {[type]} modFunction [description]
  540. * @param {[type]} modTips [description]
  541. * @return {[type]} [description]
  542. */
  543. ONEMAP.C.noPermission = function(modFunction, modTips) {
  544. if (modTips == undefined) {
  545. modTips = "未登录";
  546. }
  547. ONEMAP.C.publisher.publish({
  548. type: 'warning',
  549. message: '您' + modTips + '!'
  550. }, 'noteBar::add');
  551. return false;
  552. };
  553. ONEMAP.T.noPermission = function(modFunction, modTips) {
  554. if (modTips == undefined) {
  555. modTips = "未登录";
  556. }
  557. ONEMAP.C.publisher.publish({
  558. type: 'warning',
  559. message: '您' + modTips + '!'
  560. }, 'noteBar::add');
  561. return false;
  562. };
  563. /**
  564. * 登出
  565. * @return {[type]} [description]
  566. */
  567. ONEMAP.C.logout = function(modName) {
  568. ONEMAP.C.cookie.del('session');
  569. delete ONEMAP.D.user.ticket;
  570. setTimeout(function() {
  571. if (onemapUrlConfig.accessType == 'oauth') {
  572. var jumpUrl = onemapUrlConfig.login_serverUrl + '/account/logout?next=' + onemapUrlConfig.login_serverUrl + '/go/?site=' + onemapUrlConfig.siteUrl;
  573. window.location.replace(jumpUrl);
  574. }
  575. }, 500);
  576. return false;
  577. };
  578. /**
  579. * 生成随机uuid4
  580. * @param {[type]} options [description]
  581. * @return {[type]} [description]
  582. */
  583. ONEMAP.C.uuid4 = function() {
  584. var text = "";
  585. var length = [8, 4, 4, 4, 12];
  586. var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  587. for (var j = 0; j < 5; j++) {
  588. for (var i = 0; i < length[j]; i++) {
  589. text += possible.charAt(Math.floor(Math.random() * possible.length));
  590. }
  591. if (j < 3) {
  592. text += "-"
  593. }
  594. }
  595. return text;
  596. }
  597. /**
  598. * 登入
  599. * @return {[type]} [description]
  600. */
  601. ONEMAP.C.login = function() {
  602. ONEMAP.D.globalSettingData = onemapUrlConfig.defaultGlobalSettingData;
  603. ONEMAP.D.isLoad = true;
  604. require(['layoutDir/layout'], function(layout) {
  605. layout.init();
  606. });
  607. }
  608. //获取更多基本信息
  609. ONEMAP.C.getInf = function(id) {
  610. $.ajax({
  611. url: onemapUrlConfig.oauthServiceUrl + '/v1.0/user?id=' + id,
  612. type: 'GET',
  613. dataType: 'json'
  614. })
  615. .done(function(data) {
  616. _.merge(ONEMAP.D.user, data.data);
  617. })
  618. }
  619. map23DData.show3DAlert = false;
  620. ONEMAP.C.login();
  621. });