userThematic.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. /**
  2. * @fileoverview 用户 地点记录 模块
  3. * @author Song.Huang
  4. * @version 1.0.0
  5. */
  6. define([
  7. 'html!templates/user/userThematic',
  8. 'css!styles/user/userThematic'
  9. ],
  10. function(tplLayout) {
  11. /**
  12. * 模块数据 用于数据存储和外部调用
  13. * @type {Object}
  14. * 数据存放
  15. */
  16. var modValue = {
  17. options: {
  18. page: 1,
  19. pageSize: 20
  20. },
  21. favData: null,
  22. appendToMyLayer: null
  23. }
  24. /**
  25. * 模块状态,用于存储模块的状态 例如:收起,关闭
  26. * @type {Object}
  27. */
  28. var status = {
  29. initialized: false,
  30. isFirstAdd: true, //是否第一次添加收藏专题图
  31. showInfoData: false
  32. }
  33. //分页
  34. var pageContainer,
  35. favPageBtnGroup,
  36. pageJump;
  37. var overLayerOpacityControl;
  38. /**
  39. * 初始化
  40. * @type {Function}
  41. */
  42. function init() {
  43. setLayout();
  44. subscribe();
  45. showPage({
  46. page: 1
  47. });
  48. }
  49. /**
  50. * 设置界面
  51. */
  52. function setLayout() {
  53. $("#usrCenterContent").empty().append(tplLayout);
  54. if (!status.initialized) {
  55. $("#userThematicInfoDetail").appendTo('#wrapper');
  56. status.initialized = true;
  57. }
  58. pageContainer = $('<div id="userFavPage"></div>').appendTo($("#usrCenterContent"));
  59. $("#userFav").mCustomScrollbar({
  60. scrollInertia: 1000
  61. });
  62. layoutResize();
  63. $(window).resize(function() {
  64. layoutResize();
  65. });
  66. }
  67. /**
  68. * 界面重置
  69. * @return {[type]} [description]
  70. */
  71. function layoutResize() {
  72. $("#userFav").css({ height: $(window).height() - 154 });
  73. $("#userFav").mCustomScrollbar("update");
  74. }
  75. /**
  76. * 显示指定参数的列表
  77. * @type {Function}
  78. * @param options {Object} 参数
  79. * @see options
  80. * @private
  81. */
  82. function showPage(options) {
  83. ONEMAP.T.objExtend(modValue.options, options, true);
  84. getFavData();
  85. }
  86. /**
  87. * 获取收藏数据
  88. * @type {Function}
  89. * @private
  90. */
  91. function getFavData() {
  92. ONEMAP.V.loading.load();
  93. $.ajax({
  94. type: "get",
  95. dataType: 'json',
  96. url: onemapUrlConfig.userCenterUrl + '/thematic/list' +
  97. '?page=' + modValue.options.page +
  98. '&size=' + modValue.options.pageSize,
  99. success: function(data) {
  100. ONEMAP.V.loading.loaded();
  101. if(data.code == 4){
  102. ONEMAP.T.noPermission('addFav',data.message);
  103. return false;
  104. }
  105. if(data.code == 3){
  106. ONEMAP.T.logout('addFav');
  107. return false;
  108. }
  109. modValue.favData = data;
  110. if(data.total>0){
  111. setTimeout(function(){
  112. setFavItem();
  113. },100)
  114. } else {
  115. $("#userFavList").html("暂无数据");
  116. }
  117. },
  118. error: function(errorData) {
  119. ONEMAP.V.loading.loaded();
  120. }
  121. });
  122. }
  123. /**
  124. * 设置收藏列表item
  125. * @type {Function}
  126. * @private
  127. */
  128. function setFavItem() {
  129. var count = 0;
  130. $("#userFavList").empty();
  131. if (modValue.favData['list'].length > 0) {
  132. for (var i = 0, l = modValue.favData['list'].length; i < l; i++) {
  133. var da = modValue.favData['list'][i];
  134. count++;
  135. var itemHtml = $('<dt fid="' + da._id + '"><span class="num">' + count + '</span><span class="name">' + da.name + '</span>' +
  136. '<span class="option"><a class="del" title="删除">删除</a><a class="edit" title="编辑">编辑</a></span></dt>');
  137. itemHtml.bind('mouseenter', function() {
  138. $(this).addClass('hover');
  139. }).bind('mouseleave', function() {
  140. $(this).removeClass('hover');
  141. });
  142. itemHtml.find('.name').bind('click', { da: da }, function(e) {
  143. if (status.isFirstAdd) {
  144. status.isFirstAdd = false;
  145. } else {
  146. removeCurrentOverLayer();
  147. }
  148. addOverLayerToMap(e.data.da);
  149. map23DControl.setView({
  150. center: {
  151. lat: e.data.da.center_lat,
  152. lng: e.data.da.center_lon
  153. },
  154. zoom: e.data.da.initial_zoom
  155. })
  156. });
  157. itemHtml.find('.del').bind('click', { da: da }, function(e) {
  158. delForm(e.data.da, $(this));
  159. });
  160. itemHtml.find('.edit').bind('click', { da: da }, function(e) {
  161. editForm(e.data.da, $(this));
  162. });
  163. $("#userFavList").append(itemHtml);
  164. }
  165. //分页
  166. pageContainer.empty();
  167. var countPages = (parseInt(modValue.favData.total % modValue.favData.size) > 0 ? parseInt(modValue.favData.total / modValue.favData.size + 1) : parseInt(modValue.favData.total / modValue.favData.size));
  168. if (countPages == 0) {
  169. countPages = 1;
  170. }
  171. // pageJump = $('<div id="userFavPageJump" class="count"><span>第</span><input class="page_num input input-small" value="' + modValue.favData.current_page + '" type="text" /><span>/' + countPages + '页</span></div>');
  172. pageJump = $('<div id="userFavPageJump" class="count"><div class="firstpage"></div><div class="uppage"></div>'+
  173. '<div class="fg"></div><div id="thematicPageJump" class="count"><span>'+modValue.favData.current_page+'/'+countPages+'页</span>'+
  174. '</div><div class="fg"></div><div class="nextpage"></div><div class="endpage"></div><div class="btn-group"></div></div>');
  175. pageJump.appendTo(pageContainer);
  176. if (modValue.favData.size < modValue.favData.total) {
  177. $("#userFavPageJump .firstpage").bind('click',function(){
  178. showPage({page:1});
  179. })
  180. $("#userFavPageJump .uppage").bind('click',function(){
  181. if(modValue.favData.current_page == 1){
  182. return false;
  183. }else{
  184. modValue.favData.current_page = modValue.favData.current_page-1;
  185. showPage({page:modValue.favData.current_page});
  186. }
  187. })
  188. $("#userFavPageJump .nextpage").bind('click',function(){
  189. if(modValue.favData.current_page == countPages){
  190. return false;
  191. }else{
  192. modValue.favData.current_page = modValue.favData.current_page+1;
  193. showPage({page:modValue.favData.current_page});
  194. }
  195. })
  196. $("#userFavPageJump .endpage").bind('click',function(){
  197. showPage({page:countPages});
  198. })
  199. }
  200. } else {
  201. pageContainer.empty();
  202. $("#userFavList").append('<p class="not-result">暂无数据!</p>');
  203. }
  204. $("#userFav").mCustomScrollbar("update");
  205. }
  206. /**
  207. * 添加专题图层到地图层
  208. * @type {Function}
  209. * @param obj {Object} 构造好了的专题图对象
  210. * @private
  211. */
  212. function addOverLayerToMap(data) {
  213. //添加到23D地图上
  214. //如果是2D 添加透明度控件
  215. modValue.currentOverLayerGuid = map23DControl.tileLayer({
  216. action: 'add',
  217. layer: {
  218. url2D: onemapUrlConfig.thematicTileUrl + '/' + data.t_id + '?l={z}&x={x}&y={y}',
  219. url3D: onemapUrlConfig.thematicTileFo3DUrl + '/' + data.t_id + '?z=%d&x=%d&y=%d',
  220. minZoom: data['min_zoom'],
  221. maxZoom: data['max_zoom'],
  222. maxNativeZoom: data['max_zoom'],
  223. attribution: '',
  224. opacity: 1,
  225. imageType: 'png',
  226. name: data.name,
  227. guid: data.t_id
  228. }
  229. })
  230. ONEMAP.D.ThematicInMapData[modValue.currentOverLayerGuid] = {
  231. 'name': data.name,
  232. 'guid': data.t_id
  233. };
  234. if (status.showInfoData) {
  235. getShowInfo(data);
  236. }
  237. if (!modValue.appendToMyLayer) {
  238. var options = {
  239. action: "add",
  240. DOM: {
  241. name: data.name,
  242. type: "layer",
  243. guid: modValue.currentOverLayerGuid
  244. }
  245. }
  246. modValue.appendToMyLayer = ONEMAP.M.myLayers.myLayerControl(options);
  247. ONEMAP.C.publisher.subscribe(controlMyLayer, modValue.appendToMyLayer);
  248. }else{
  249. var options = {
  250. action: "update",
  251. DOM: {
  252. name: data.name,
  253. type: "layer"
  254. },
  255. DOMid:modValue.appendToMyLayer
  256. }
  257. ONEMAP.M.myLayers.myLayerControl(options);
  258. }
  259. ONEMAP.D.overLayerCount++;
  260. map2DViewer.map.setZoomScope(data['min_zoom'], data['max_zoom']);
  261. };
  262. /**
  263. * 我的图层控制当值图层
  264. */
  265. function controlMyLayer(options) {
  266. switch (options.action) {
  267. case 'remove':
  268. removeCurrentOverLayer();
  269. break;
  270. case 'opacity':
  271. setGropOpacity(options);
  272. break;
  273. case 'up':
  274. case 'down':
  275. setGroupZIndex(options);
  276. break;
  277. }
  278. };
  279. function setGroupZIndex(options) {
  280. }
  281. function setGropOpacity(options) {
  282. var options = options.options;
  283. if(modValue.currentOverLayerGuid){
  284. if(options.opacity == 1){
  285. map23DControl.tileLayer({
  286. action:'show',
  287. guid:modValue.currentOverLayerGuid,
  288. layer: {
  289. opacity:options.opacity
  290. }
  291. })
  292. }else if(options.opacity == 0){
  293. map23DControl.tileLayer({
  294. action:'hide',
  295. guid:modValue.currentOverLayerGuid,
  296. layer: {
  297. opacity:options.opacity
  298. }
  299. })
  300. }else{
  301. map23DControl.tileLayer({
  302. action:'update',
  303. guid:modValue.currentOverLayerGuid,
  304. layer: {
  305. opacity:options.opacity
  306. }
  307. })
  308. }
  309. }
  310. }
  311. /**
  312. * 移除当前显示专题图
  313. * @private
  314. */
  315. function removeCurrentOverLayer(data) {
  316. if (data != undefined) {
  317. status.showInfoData = false;
  318. $('#userThematicInfoDetail').hide();
  319. }
  320. if (modValue.currentOverLayerGuid) {
  321. delete ONEMAP.D.ThematicInMapData[modValue.currentOverLayerGuid];
  322. ONEMAP.D.overLayerCount--
  323. if (ONEMAP.D.overLayerCount == 0) {
  324. map2DViewer.map.setZoomScope(1, 19);
  325. }
  326. map23DControl.tileLayer({
  327. action: 'remove',
  328. guid: modValue.currentOverLayerGuid
  329. })
  330. modValue.currentOverLayerGuid = null;
  331. modValue.appendToMyLayer = null
  332. }
  333. };
  334. function cleanmap(){
  335. removeCurrentOverLayer()
  336. if(modValue.appendToMyLayer){
  337. var options = {
  338. action: "remove",
  339. DOMid:modValue.appendToMyLayer
  340. }
  341. ONEMAP.M.myLayers.myLayerControl(options);
  342. modValue.appendToMyLayer = null
  343. }
  344. }
  345. /**
  346. * 显示专题图详情
  347. */
  348. function getShowInfo(data) {
  349. var guid = data.t_id;
  350. var ajaxUrl = onemapUrlConfig.thematicDataServerUrl + '/production/metadata?production_id=' + guid;
  351. ONEMAP.V.loading.load();
  352. $.ajax({
  353. type: "get",
  354. dataType: 'jsonp',
  355. url: ajaxUrl,
  356. success: function(data) {
  357. ONEMAP.V.loading.loaded();
  358. //添加专题图信息到地图容器中
  359. addItemToContent(data.metadata);
  360. },
  361. error: function(data) {
  362. ONEMAP.V.loading.loaded();
  363. ONEMAP.C.publisher.publish({ type: 'error', message: '获取地图数据失败!' }, 'noteBar::add');
  364. }
  365. });
  366. };
  367. function addItemToContent(data) {
  368. $('#userThematicInfoDetail').show();
  369. var zIndex = ONEMAP.M.sideBar.getZIndex();
  370. $('#userThematicInfoDetail').css({ zIndex: zIndex });
  371. $('#userThematicInfoDetail .cover-content').empty();
  372. $('<h3>' + data.map_name + '</h3>').appendTo($('#userThematicInfoDetail .cover-content'));
  373. $('<p>作者: ' + data.author + '</p>').appendTo($('#userThematicInfoDetail .cover-content'));
  374. $('<p>创建时间: ' + data.created_time + '</p>').appendTo($('#userThematicInfoDetail .cover-content'));
  375. $('<p>发布者: ' + data.publisher + '</p>').appendTo($('#userThematicInfoDetail .cover-content'));
  376. $('<p>发布时间: ' + data.publication_date + '</p>').appendTo($('#userThematicInfoDetail .cover-content'));
  377. $('<p>地图来源: ' + data.original_atlas + '</p>').appendTo($('#userThematicInfoDetail .cover-content'));
  378. $('<p>最小缩放等级: ' + data.min_zoom_level + '</p>').appendTo($('#userThematicInfoDetail .cover-content'));
  379. $('<p>最大缩放等级: ' + data.max_zoom_level + '</p>').appendTo($('#userThematicInfoDetail .cover-content'));
  380. //$('<p>瓦片格式: '+data.image_format+'</p>').appendTo($('#userThematicInfoDetail .content'));
  381. //$('<p>瓦片质量: '+data.image_quality+'</p>').appendTo($('#userThematicInfoDetail .content'));
  382. $('<p>地图宽度: ' + data.map_image_width + '像素</p>').appendTo($('#userThematicInfoDetail .cover-content'));
  383. $('<p>地图高度: ' + data.map_image_height + '像素</p>').appendTo($('#userThematicInfoDetail .cover-content'));
  384. if (data.coordinate_system == 0) { data.coordinate_system = '无坐标图形' }
  385. $('<p>坐标系: ' + data.coordinate_system + '</p>').appendTo($('#userThematicInfoDetail .cover-content'));
  386. }
  387. function addThematicToMap(data) {
  388. if (!status.showInfoData) {
  389. status.showInfoData = true;
  390. getShowInfo(data);
  391. } else {
  392. status.showInfoData = false;
  393. $('#userThematicInfoDetail').hide();
  394. }
  395. };
  396. /**
  397. * 添加收藏
  398. */
  399. function addThematic(thematicData) {
  400. //构造数据
  401. var ajaxData = {};
  402. ajaxData.name = thematicData.name;
  403. ajaxData.center_lat = map23DData.view.center['lat'];
  404. ajaxData.center_lon = map23DData.view.center['lng'];
  405. ajaxData.initial_zoom = map23DData.view.zoom;
  406. ajaxData.t_id = thematicData.guid;
  407. ajaxData.min_zoom = thematicData.min_zoom;
  408. ajaxData.max_zoom = thematicData.max_zoom;
  409. ajaxData.map_type = thematicData.map_type;
  410. ajaxData.data_type = thematicData.data_type;
  411. ajaxData.thumb_min_id = thematicData.thumb_min_id;
  412. ONEMAP.V.loading.load();
  413. $.ajax({
  414. type: "get",
  415. dataType: 'json',
  416. url: onemapUrlConfig.userCenterUrl + '/thematic/add',
  417. data: ajaxData,
  418. success: function(data) {
  419. ONEMAP.V.loading.load();
  420. if (data.success) {
  421. ONEMAP.C.publisher.publish({ type: 'success', message: '收藏专题图(' + thematicData.name + ')成功' }, 'noteBar::add');
  422. getFavData();
  423. } else {
  424. ONEMAP.C.publisher.publish({ type: 'error', message: '收藏专题图(' + thematicData.name + ')失败/已收藏过该专题图' }, 'noteBar::add');
  425. }
  426. },
  427. error: function(errorData) {
  428. ONEMAP.V.loading.loaded();
  429. }
  430. });
  431. }
  432. /**
  433. * 编辑表单
  434. * @type {Function}
  435. * @param data {Object} 表单数据
  436. * @param self {Object} 父类
  437. * @private
  438. */
  439. function editForm(data, self) {
  440. var parent = self.parent().parent();
  441. var formHtml = $('<div class="form">' +
  442. '<input type="text" class="input input-small" maxlength="20" value="' + data.name + '" />' +
  443. '<button class="btn sure btn2 btn-small">确定</button>' +
  444. '<button class="btn cancel btn2 btn-small">取消</button>' +
  445. '</div> ');
  446. formHtml.find('.cancel').bind('click', function() {
  447. formHtml.remove();
  448. });
  449. parent.append(formHtml);
  450. formHtml.find('.sure').bind('click', { da: data, self: parent }, function(e) {
  451. updateFav(e);
  452. });
  453. }
  454. /**
  455. * 更新收藏
  456. * @type {Function}
  457. * @param e
  458. * @returns {boolean}
  459. * @private
  460. */
  461. function updateFav(e) {
  462. var name = e.data.self.find('.input').val();
  463. if (name === '' || name.indexOf(' ') >= 0) {
  464. ONEMAP.C.publisher.publish({ type: 'warning', message: '名称不能为空或包含空格' }, 'noteBar::add');
  465. e.data.self.find('.input').focus();
  466. return false;
  467. }
  468. if ((/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\s]/g).test(name)) {
  469. ONEMAP.C.publisher.publish({ type: 'warning', message: '名称只能包含英文、数字、中文' }, 'noteBar::add');
  470. e.data.self.find('.input').focus();
  471. return false;
  472. }
  473. e.data.self.find('.name').text(name);
  474. var fId = e.data.da.id;
  475. var ajaxData = { id: fId, name: name };
  476. e.data.self.find('.form').remove();
  477. ONEMAP.V.loading.load();
  478. $.ajax({
  479. type: "get",
  480. dataType: 'json',
  481. url: onemapUrlConfig.userCenterUrl + '/thematic/update',
  482. data: ajaxData,
  483. success: function(data) {
  484. ONEMAP.V.loading.loaded();
  485. if (data.code == 4) {
  486. ONEMAP.T.noPermission('updateFav');
  487. }
  488. if (data.code == 3) {
  489. ONEMAP.T.logout('updateFav');
  490. }
  491. if (data.success) {
  492. ONEMAP.C.publisher.publish({ type: 'success', message: '更新专题图(' + name + ')成功' }, 'noteBar::add');
  493. getFavData();
  494. } else if (data.hasOwnProperty('success') && !data.success) {
  495. ONEMAP.C.publisher.publish({ type: 'error', message: '更新专题图(' + name + ')失败,' + data.msg }, 'noteBar::add');
  496. } else {
  497. ONEMAP.C.publisher.publish({ type: 'error', message: '更新专题图(' + name + ')失败' }, 'noteBar::add');
  498. }
  499. },
  500. error: function(errorData) {
  501. ONEMAP.V.loading.loaded();
  502. }
  503. });
  504. }
  505. /**
  506. * 删除表单
  507. * @param {[type]} data [description]
  508. * @param {[type]} self [description]
  509. * @return {[type]} [description]
  510. */
  511. function delForm(data, self) {
  512. var parent = self.parent().parent();
  513. var formHtml = $('<div class="form">' +
  514. '<button class="btn cancel btn2 btn-small" style="float:right;margin-right:18px;">取消</button>' +
  515. '<button class="btn sure btn2 btn-small" style="float:right">确定</button>' +
  516. '</div> ');
  517. formHtml.find('.cancel').bind('click', function() {
  518. formHtml.remove();
  519. });
  520. parent.append(formHtml);
  521. formHtml.find('.sure').bind('click', { da: data, self: parent }, function(e) {
  522. delFav(e.data.da.id);
  523. });
  524. }
  525. /**
  526. * 删除收藏
  527. * @type {Function}
  528. * @param id {Number}
  529. * @private
  530. */
  531. function delFav(id) {
  532. var ajaxData = { id: id };
  533. ONEMAP.V.loading.load();
  534. $.ajax({
  535. type: "get",
  536. dataType: 'json',
  537. url: onemapUrlConfig.userCenterUrl + '/thematic/del',
  538. data: ajaxData,
  539. success: function(data) {
  540. ONEMAP.V.loading.loaded();
  541. if (data.code == 4) {
  542. ONEMAP.T.noPermission('delFav');
  543. }
  544. if (data.code == 3) {
  545. ONEMAP.T.logout('delFav');
  546. }
  547. if (data.success) {
  548. ONEMAP.C.publisher.publish({ type: 'success', message: '删除专题图成功' }, 'noteBar::add');
  549. getFavData();
  550. } else if (data.hasOwnProperty('success') && !data.success) {
  551. ONEMAP.C.publisher.publish({ type: 'error', message: '删除专题图失败,' + data.msg }, 'noteBar::add');
  552. } else {
  553. ONEMAP.C.publisher.publish({ type: 'error', message: '删除专题图失败' }, 'noteBar::add');
  554. }
  555. },
  556. error: function(errorData) {
  557. ONEMAP.V.loading.loaded();
  558. }
  559. });
  560. }
  561. /**
  562. * 注册订阅
  563. * @type {Function}
  564. * 推送:ONEMAP.C.publisher.publish(options,'userFavuleName::type');
  565. * 订阅:ONEMAP.C.publisher.subscribe(layoutResize,'sideBarLayoutChange');
  566. */
  567. function subscribe() {
  568. ONEMAP.C.publisher.subscribe(cleanmap, 'cleanMap');
  569. }
  570. /**
  571. * 取消订阅
  572. * @type {Function}
  573. * 取消订阅:ONEMAP.C.publisher.unSubscribe(layoutResize,'sideBarLayoutChange');
  574. */
  575. function unSubscribe() {}
  576. /**
  577. * 模块移除
  578. * @return {[type]} [description]
  579. */
  580. function remove() {
  581. status.initialized = false;
  582. status.isFirstAdd = true;
  583. modValue.options = {
  584. page: 1,
  585. pageSize: 20
  586. };
  587. }
  588. return ONEMAP.M.userThematic = {
  589. init: init,
  590. remove: remove,
  591. addThematic: addThematic,
  592. thematicData: modValue
  593. }
  594. });