├── LICENSE ├── README.md ├── __init__.py ├── api ├── __init__.py ├── check_api.py └── git_class.py ├── chat ├── __init__.py ├── listener.py ├── manager.py ├── message.py └── model │ ├── __init__.py │ └── client.py ├── conf ├── __init__.py ├── application.conf └── config.py ├── index.py ├── model ├── __init__.py ├── client.py └── message.py ├── mongo_modules.py ├── push.py ├── pxe_ks └── dell.cfg ├── requirements.txt ├── salt_api ├── __init__.py ├── cmdb_mysql.py └── salt_https_api.py ├── salt_job_cache.py ├── salt_out.py ├── service.py ├── settings.py ├── socket_test.py ├── static ├── css │ ├── flags.css │ └── ipviking.css ├── data │ ├── country-codes.csv │ ├── eventstream │ ├── port-names.tsv │ └── readme-world.json ├── images │ ├── DarkNoiseBackground.png │ ├── down.svg │ ├── facebook.png │ ├── flags │ │ └── flags16.png │ ├── google+.png │ ├── linkedin.png │ ├── loading.gif │ ├── loading1.gif │ ├── loading2.gif │ ├── norse-white.png │ ├── twitter.png │ └── youtube.png ├── js │ ├── blank.gif │ ├── d3.v3.min.js │ ├── echarts │ │ └── js │ │ │ ├── echarts-map.js │ │ │ ├── echarts.js │ │ │ └── esl.js │ ├── fancybox_loading.gif │ ├── fancybox_loading@2x.gif │ ├── fancybox_overlay.png │ ├── fancybox_sprite.png │ ├── fancybox_sprite@2x.png │ ├── helpers │ │ ├── fancybox_buttons.png │ │ ├── jquery.fancybox-buttons.css │ │ ├── jquery.fancybox-buttons.js │ │ ├── jquery.fancybox-media.js │ │ ├── jquery.fancybox-thumbs.css │ │ └── jquery.fancybox-thumbs.js │ ├── ipviking.js │ ├── jquery-1.10.2.min.js │ ├── jquery.fancybox.css │ ├── jquery.fancybox.js │ ├── jquery.fancybox.pack.js │ ├── jquery.mousewheel.pack.js │ ├── presentations.js │ ├── queue.v1.min.js │ └── topojson.v1.min.js └── src │ ├── chart.js │ ├── chart │ ├── bar.js │ ├── base.js │ ├── chord.js │ ├── force.js │ ├── forceLayoutWorker.js │ ├── funnel.js │ ├── gauge.js │ ├── island.js │ ├── k.js │ ├── line.js │ ├── map.js │ ├── pie.js │ ├── radar.js │ └── scatter.js │ ├── component.js │ ├── component │ ├── axis.js │ ├── base.js │ ├── categoryAxis.js │ ├── dataRange.js │ ├── dataView.js │ ├── dataZoom.js │ ├── grid.js │ ├── legend.js │ ├── polar.js │ ├── roamController.js │ ├── timeline.js │ ├── title.js │ ├── toolbox.js │ ├── tooltip.js │ └── valueAxis.js │ ├── config.js │ ├── data │ └── Graph.js │ ├── echarts.js │ ├── layout │ ├── Force.js │ └── forceLayoutWorker.js │ ├── theme │ └── default.js │ └── util │ ├── accMath.js │ ├── coordinates.js │ ├── ecAnimation.js │ ├── ecData.js │ ├── ecEffect.js │ ├── ecQuery.js │ ├── kwargs.js │ ├── mapData │ ├── geoCoord.js │ ├── geoJson │ │ ├── an_hui_geo.js │ │ ├── ao_men_geo.js │ │ ├── bei_jing_geo.js │ │ ├── china_geo.js │ │ ├── chong_qing_geo.js │ │ ├── fu_jian_geo.js │ │ ├── gan_su_geo.js │ │ ├── guang_dong_geo.js │ │ ├── guang_xi_geo.js │ │ ├── gui_zhou_geo.js │ │ ├── hai_nan_geo.js │ │ ├── he_bei_geo.js │ │ ├── he_nan_geo.js │ │ ├── hei_long_jiang_geo.js │ │ ├── hu_bei_geo.js │ │ ├── hu_nan_geo.js │ │ ├── ji_lin_geo.js │ │ ├── jiang_su_geo.js │ │ ├── jiang_xi_geo.js │ │ ├── liao_ning_geo.js │ │ ├── nei_meng_gu_geo.js │ │ ├── ning_xia_geo.js │ │ ├── qing_hai_geo.js │ │ ├── shan_dong_geo.js │ │ ├── shan_xi_1_geo.js │ │ ├── shan_xi_2_geo.js │ │ ├── shang_hai_geo.js │ │ ├── si_chuan_geo.js │ │ ├── tai_wan_geo.js │ │ ├── tian_jin_geo.js │ │ ├── world_geo.js │ │ ├── xi_zang_geo.js │ │ ├── xiang_gang_geo.js │ │ ├── xin_jiang_geo.js │ │ ├── yun_nan_geo.js │ │ └── zhe_jiang_geo.js │ ├── params.js │ ├── rawData │ │ ├── encode.js │ │ └── geoJson │ │ │ ├── an_hui_geo.json │ │ │ ├── ao_men_geo.json │ │ │ ├── bei_jing_geo.json │ │ │ ├── china_city.json │ │ │ ├── china_geo.json │ │ │ ├── chong_qing_geo.json │ │ │ ├── fu_jian_geo.json │ │ │ ├── gan_su_geo.json │ │ │ ├── guang_dong_geo.json │ │ │ ├── guang_xi_geo.json │ │ │ ├── gui_zhou_geo.json │ │ │ ├── hai_nan_geo.json │ │ │ ├── he_bei_geo.json │ │ │ ├── he_nan_geo.json │ │ │ ├── hei_long_jiang_geo.json │ │ │ ├── hu_bei_geo.json │ │ │ ├── hu_nan_geo.json │ │ │ ├── ji_lin_geo.json │ │ │ ├── jiang_su_geo.json │ │ │ ├── jiang_xi_geo.json │ │ │ ├── liao_ning_geo.json │ │ │ ├── nei_meng_gu_geo.json │ │ │ ├── ning_xia_geo.json │ │ │ ├── qing_hai_geo.json │ │ │ ├── shan_dong_geo.json │ │ │ ├── shan_xi_1_geo.json │ │ │ ├── shan_xi_2_geo.json │ │ │ ├── shang_hai_geo.json │ │ │ ├── si_chuan_geo.json │ │ │ ├── tai_wan_geo.json │ │ │ ├── tian_jin_geo.json │ │ │ ├── world_geo.json │ │ │ ├── xi_zang_geo.json │ │ │ ├── xiang_gang_geo.json │ │ │ ├── xin_jiang_geo.json │ │ │ ├── yun_nan_geo.json │ │ │ └── zhe_jiang_geo.json │ └── textFixed.js │ ├── ndarray.js │ ├── number.js │ ├── projection │ ├── albers.js │ ├── mercator.js │ ├── normal.js │ └── svg.js │ └── shape │ ├── Candle.js │ ├── Chain.js │ ├── Chord.js │ ├── Cross.js │ ├── GaugePointer.js │ ├── HalfSmoothPolygon.js │ ├── HandlePolygon.js │ ├── Icon.js │ ├── MarkLine.js │ ├── Ribbon.js │ ├── Symbol.js │ └── normalIsCover.js ├── swan.py ├── templates ├── d3.html ├── login.html ├── project │ └── project_index.html ├── register.html ├── test.html ├── waf.html ├── waf1.html ├── waf_line.html ├── waf_pie.html ├── weibo_add.html └── weibo_list.html ├── test.py ├── test_mongo.py ├── tornado_main.py ├── urls.py ├── user_auth.py └── web_socket.py /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014 2 | 3 | Permission to use, copy, modify, and/or distribute this software for any 4 | purpose with or without fee is hereby granted, provided that the above 5 | copyright notice and this permission notice appear in all copies. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 10 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 12 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 13 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | swan api code 2 | 3 | 4 | ======= 5 | ```python 6 | http://api.map.baidu.com/location/ip?ak=jzHc8ZXG1XxDxmd2G54WmVF5&ip=61.188.216.37 7 | ``` 8 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: __init__.py 5 | # Desc: 2015-15/1/7:下午1:32 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | -------------------------------------------------------------------------------- /api/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: __init__.py 5 | # Desc: 2015-15/11/20:下午4:42 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | -------------------------------------------------------------------------------- /api/check_api.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | FileName: check_api.py 6 | Desc: 7 | Author: 苦咖啡 8 | Email: voilet@qq.com 9 | HomePage: http://blog.kukafei520.net 10 | Version: 0.0.1 11 | LastChange: 16/1/4 下午3:21 12 | History: 13 | """ 14 | 15 | import requests 16 | 17 | 18 | class CheckApi(object): 19 | """pxe api接口""" 20 | 21 | def __init__(self, **kwargs): 22 | self.data = kwargs 23 | self.headers = { 24 | 'CustomUser-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36', 25 | } 26 | self.proxies = { 27 | "http": "%s:80" % self.data.get("ip"), 28 | } 29 | 30 | def run(self): 31 | """执行""" 32 | try: 33 | result = requests.get(self.data.get("url"), headers=self.headers, proxies=self.proxies, timeout=10) 34 | except requests.exceptions.ConnectTimeout, e: 35 | print e 36 | print u"请求超时" 37 | return False, u"接口请求超时" 38 | except requests.TooManyRedirects, e: 39 | print e 40 | return False, u"接口过多重定向" 41 | except requests.ConnectionError, e: 42 | print e 43 | return False, u"连接错误" 44 | try: 45 | rst = result.json() 46 | if int(rst.get("retCode")) == 200: 47 | return True, rst.get("retMsg", "no message") 48 | else: 49 | return False, rst.get("retMsg", "no message") 50 | except: 51 | return False, "数据格式错误" 52 | 53 | 54 | if __name__ == '__main__': 55 | s = CheckApi(url="http://js.tv.funshion.com/search/vretrieve/v1?vtype=1026&cate=196&order=3", ip="192.168.111.5") 56 | print s.run() 57 | -------------------------------------------------------------------------------- /api/git_class.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: git_class.py 5 | # Desc: 2015-15/11/20:下午4:43 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | import requests 12 | from salt_api.salt_https_api import token_id, salt_api_token 13 | from conf.config import salt_api_url, salt_api_pass, salt_api_user 14 | 15 | 16 | class SaltApiGit(object): 17 | """pxe api接口""" 18 | 19 | def __init__(self, **kwargs): 20 | self.data = kwargs 21 | 22 | self.headers = { 23 | 'CustomUser-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36', 24 | "Accept": "application/x-yaml", 25 | } 26 | s = {'expr_form': 'list'} 27 | self.data.update(s) 28 | 29 | def checkout(self): 30 | """执行""" 31 | code_checkout = salt_api_token( 32 | {'client': 'local', 33 | 'fun': 'git.checkout', 34 | 'tgt': self.data.get("tgt"), 35 | "arg": self.data.get("arg"), 36 | 'timeout': 100, 37 | 'expr_form': 'list'}, 38 | salt_api_url, 39 | {"X-Auth-Token": self.data.get("token_api_id")} 40 | ) 41 | rst = code_checkout.run() 42 | return rst 43 | 44 | def config_set(self): 45 | """执行""" 46 | code_checkout = salt_api_token( 47 | {'client': 'local', 48 | 'fun': 'git.config_set', 49 | 'tgt': self.data.get("tgt"), 50 | "arg": self.data.get("arg"), 51 | 'timeout': 100, 52 | 'expr_form': 'list'}, 53 | salt_api_url, 54 | {"X-Auth-Token": self.data.get("token_api_id")} 55 | ) 56 | rst = code_checkout.run() 57 | return rst 58 | 59 | def setemail(self): 60 | """执行""" 61 | code_checkout = salt_api_token( 62 | {'client': 'local', 63 | 'fun': 'git.config_set', 64 | 'tgt': self.data.get("tgt"), 65 | "arg": self.data.get("arg"), 66 | 'timeout': 100, 67 | 'expr_form': 'list'}, 68 | salt_api_url, 69 | {"X-Auth-Token": self.data.get("token_api_id")} 70 | ) 71 | rst = code_checkout.run() 72 | return rst 73 | 74 | def pull(self): 75 | code_pull = salt_api_token( 76 | {'client': 'local', 77 | 'fun': 'git.pull', 78 | 'tgt': self.data.get("tgt"), 79 | "arg": self.data.get("arg"), 80 | 'timeout': 100, 81 | 'expr_form': 'list'}, 82 | salt_api_url, 83 | {"X-Auth-Token": self.data.get("token_api_id")} 84 | ) 85 | rst = code_pull.run() 86 | return rst 87 | 88 | def push(self): 89 | code_push = salt_api_token( 90 | {'client': 'local', 91 | 'fun': 'git.push', 92 | 'tgt': self.data.get("tgt"), 93 | "arg": self.data.get("arg"), 94 | 'timeout': 100, 95 | 'expr_form': 'list'}, 96 | salt_api_url, 97 | {"X-Auth-Token": self.data.get("token_api_id")} 98 | 99 | ) 100 | rst = code_push.run() 101 | 102 | return rst 103 | 104 | def reset(self): 105 | code_pull = salt_api_token( 106 | {'client': 'local', 107 | 'fun': 'git.reset', 108 | 'tgt': self.data.get("tgt"), 109 | "arg": self.data.get("arg"), 110 | 'timeout': 100, 111 | 'expr_form': 'list'}, 112 | salt_api_url, 113 | {"X-Auth-Token": self.data.get("token_api_id")} 114 | ) 115 | rst = code_pull.run() 116 | return rst 117 | 118 | def version(self): 119 | code_pull = salt_api_token( 120 | {'client': 'local', 121 | 'fun': 'git.revision', 122 | 'tgt': self.data.get("tgt"), 123 | "arg": self.data.get("arg"), 124 | 'timeout': 100, 125 | 'expr_form': 'list'}, 126 | salt_api_url, 127 | {"X-Auth-Token": self.data.get("token_api_id")} 128 | ) 129 | rst = code_pull.run() 130 | return rst 131 | 132 | def CmdRun(self): 133 | code_pull = salt_api_token( 134 | {'client': 'local', 135 | 'fun': 'cmd.run', 136 | 'tgt': self.data.get("tgt"), 137 | "arg": [self.data.get("arg"), "env='{\"LC_ALL\": \"zh_CN.UTF-8\"}'"], 138 | 'timeout': 100, 139 | 'expr_form': 'list'}, 140 | salt_api_url, 141 | {"X-Auth-Token": self.data.get("token_api_id")} 142 | ) 143 | rst = code_pull.run() 144 | return rst 145 | 146 | def fetch(self): 147 | """执行""" 148 | code_checkout = salt_api_token( 149 | {'client': 'local', 150 | 'fun': 'git.fetch', 151 | 'tgt': self.data.get("tgt"), 152 | "arg": self.data.get("arg"), 153 | 'timeout': 100, 154 | 'expr_form': 'list'}, 155 | salt_api_url, 156 | {"X-Auth-Token": self.data.get("token_api_id")} 157 | ) 158 | rst = code_checkout.run() 159 | return rst 160 | -------------------------------------------------------------------------------- /chat/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: __init__.py 5 | # Desc: 2015-15/2/26:下午9:31 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | from chat.listener import Listener -------------------------------------------------------------------------------- /chat/listener.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | import json 3 | import threading 4 | from tornado.log import app_log 5 | from chat.manager import ClientManager 6 | 7 | 8 | class Listener(threading.Thread): 9 | 10 | def __init__(self, r, channels): 11 | threading.Thread.__init__(self) 12 | self.redis = r 13 | self.pubsub = self.redis.pubsub() 14 | self.pubsub.subscribe(channels) 15 | 16 | def work(self, item): 17 | 18 | """ 19 | @param item: redis 消息对象 20 | """ 21 | 22 | data = item['data'] 23 | if data == 1L: 24 | return 25 | app_log.info(data) 26 | try: 27 | 28 | data = json.loads(data) 29 | print data 30 | if data.get('to_email') != 'groups': 31 | ClientManager.send_to(data.get('to_email'), data) 32 | else: 33 | ClientManager.send_to_all(data) 34 | except Exception as ex: 35 | app_log.exception(ex) 36 | 37 | def run(self): 38 | for item in self.pubsub.listen(): 39 | if item['data'] == "KILL": 40 | self.pubsub.unsubscribe() 41 | break 42 | else: 43 | self.work(item) 44 | 45 | -------------------------------------------------------------------------------- /chat/manager.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: manager.py 5 | # Desc: 2015-15/2/26:下午9:43 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | import json, time 13 | from tornado.log import app_log 14 | from chat.model import Client 15 | 16 | 17 | class ClientManager(object): 18 | _CLIENTS_MAP = {} 19 | 20 | @classmethod 21 | def get_clients(cls): 22 | """ 23 | 获取当前连接的clients 24 | 25 | @return: 26 | """ 27 | return cls._CLIENTS_MAP 28 | 29 | @classmethod 30 | def get_client_by_email(cls, jid): 31 | """ 32 | 根据websocket handler id获取当前连接client 33 | 防止websocket还未创建成功,数据已经写入redis,在此方法中使用所有消息延迟1秒发送 34 | @param identity: 35 | @return: 36 | """ 37 | # print "获取当前id", jid 38 | # time.sleep(1) 39 | app_log.info("current clients {0}".format(cls.get_clients())) 40 | try: 41 | client = cls._CLIENTS_MAP[jid] 42 | return client 43 | except Exception as ex: 44 | return None 45 | 46 | @classmethod 47 | def add_client(cls, identity, jid=None, handler=None): 48 | """ 49 | 添加新的client 50 | @param identity: websocket handler 编号 51 | @param nickname: 用户昵称 52 | @param email: 用户邮箱地址 唯一值 53 | @param handler : websocket handler实例对象 54 | @return: 55 | """ 56 | # print "增加websocket会话id", identity, jid 57 | client = Client(identity, jid=jid, handler=handler) 58 | cls._CLIENTS_MAP[jid] = client 59 | return client 60 | 61 | @classmethod 62 | def remove_client(cls, jid): 63 | """ 64 | 移除client 65 | @param email: 66 | """ 67 | app_log.debug("remove client[{0}]".format(jid)) 68 | del cls._CLIENTS_MAP[jid] 69 | 70 | @classmethod 71 | def send_to_all(cls, data): 72 | 73 | """ 74 | 向所有链接到当前服务器的客户端发送信息 75 | @param data: 76 | """ 77 | clients = cls.get_clients() 78 | for key in clients.keys(): 79 | try: 80 | clients[key].handler.write_message(json.dumps(data)) 81 | except Exception as ex: 82 | app_log.exception(ex) 83 | 84 | @classmethod 85 | def send_to(cls, to_email, data): 86 | 87 | """ 88 | 向特定用户发送消息 89 | @param source_email: 发送者邮箱 90 | @param to_email: 接受者邮箱地址 91 | @param data: 92 | """ 93 | to_email = cls.get_client_by_email(to_email) 94 | 95 | try: 96 | # print data 97 | # print type(data) 98 | to_email.handler.write_message(json.dumps(data)) 99 | except: 100 | # print "error" 101 | # print data 102 | pass 103 | 104 | @classmethod 105 | def publish(cls, redis=None, channel=None, message=None): 106 | redis.publish(channel, message) 107 | 108 | @classmethod 109 | def is_effective_connect(cls, handlerid): 110 | for key in cls._CLIENTS_MAP.keys(): 111 | client = cls._CLIENTS_MAP[key] 112 | if client.identity == handlerid: 113 | return True 114 | return False 115 | 116 | @classmethod 117 | def is_client_connected(cls, jid): 118 | """ 119 | 检查当前连接的客户端是否已经打开了多个浏览器窗口 120 | @param email: 用户登录用的电子邮箱地址 121 | """ 122 | try: 123 | client = cls.get_client_by_email(jid) 124 | if client: 125 | return True 126 | except Exception as ex: 127 | return False 128 | -------------------------------------------------------------------------------- /chat/message.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: message.py 5 | # Desc: 2015-15/2/26:下午9:42 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | # coding: utf-8 13 | import json 14 | import tornado.websocket 15 | from tornado.options import options 16 | from chat.manager import ClientManager 17 | 18 | 19 | class WebSocketHandler(tornado.websocket.WebSocketHandler): 20 | """ 21 | 允许所有websocket请求 22 | """ 23 | 24 | def check_origin(self, origin): 25 | return True 26 | 27 | def open(self): 28 | """ 29 | 1, 检查当前客户端时候已经打开浏览器窗口,是,发送错误提示信息 30 | """ 31 | print "websocket open" 32 | jid = self.get_argument('jid') 33 | ClientManager.add_client(str(id(self)), jid=jid, handler=self) 34 | 35 | def on_message(self, message): 36 | print message 37 | # pass 38 | 39 | def on_close(self): 40 | jid = self.get_argument('jid') 41 | _id = str(id(self)) 42 | print "关闭id是:", _id 43 | ClientManager.remove_client(jid) 44 | 45 | def send_to_all(self, data): 46 | print "send all" 47 | ClientManager.publish(self.settings['redis'], options.redis_channel, data) 48 | -------------------------------------------------------------------------------- /chat/model/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: __init__.py 5 | # Desc: 2015-15/2/26:下午9:44 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | from chat.model.client import Client -------------------------------------------------------------------------------- /chat/model/client.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | 4 | 5 | class Client(): 6 | 7 | def __init__(self, identity, jid='', handler=None): 8 | self._identity = identity 9 | self._handler = handler 10 | self._jid = jid 11 | 12 | @property 13 | def identity(self): 14 | identity = str(id(self._handler)) 15 | return identity 16 | 17 | @property 18 | def handler(self): 19 | return self._handler 20 | 21 | # @property 22 | # def nickname(self): 23 | # return self._nickname 24 | 25 | @property 26 | def email(self): 27 | return self._jid 28 | 29 | @property 30 | def avatar(self): 31 | return "none" 32 | # return Gavatar(self._email).get_default_avatar() 33 | 34 | def __str__(self): 35 | return self.identity 36 | -------------------------------------------------------------------------------- /conf/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: __init__.py 5 | # Desc: 2015-15/2/26:下午10:37 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | -------------------------------------------------------------------------------- /conf/application.conf: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | ##### redis config 4 | redis_host = "127.0.0.1" 5 | redis_db = 1 6 | redis_channel = "web_chat" 7 | 8 | ##### application 9 | port = 8888 10 | debug = True 11 | 12 | ##### logging 13 | logging = "info" 14 | 15 | 16 | config_url = "http://192.168.111.101" 17 | 18 | salt_api_url = "https://220.181.167.14/" 19 | salt_api_user = "salt" 20 | salt_api_pass = "992a15aecbcf5727df775c45a35738cf" 21 | 22 | websocket = "ws://127.0.0.1:8001/websocket" 23 | -------------------------------------------------------------------------------- /conf/config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: config.py 5 | # Desc: 2015-15/2/26:下午10:37 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | config_url = "http://192.168.111.101" 13 | 14 | salt_api_url = "https://192.168.111.101/" 15 | salt_api_user = "salt" 16 | salt_api_pass = "a0cc454b75d64a0892403f04b56e14c4" 17 | 18 | websocket = "ws://127.0.0.1:8001/websocket" 19 | -------------------------------------------------------------------------------- /model/__init__.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | from chat.model.client import Client 3 | __author__ = 'zheng' 4 | -------------------------------------------------------------------------------- /model/client.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | from chat.util.gavatar import Gavatar 3 | 4 | 5 | class Client(): 6 | 7 | def __init__(self, identity, nickname="", email='', handler=None): 8 | self._identity = identity 9 | self._handler = handler 10 | self._nickname = nickname 11 | self._email = email 12 | 13 | @property 14 | def identity(self): 15 | identity = str(id(self._handler)) 16 | return identity 17 | 18 | @property 19 | def handler(self): 20 | return self._handler 21 | 22 | @property 23 | def nickname(self): 24 | return self._nickname 25 | 26 | @property 27 | def email(self): 28 | return self._email 29 | 30 | @property 31 | def avatar(self): 32 | return Gavatar(self._email).get_default_avatar() 33 | 34 | def __str__(self): 35 | return self.identity 36 | -------------------------------------------------------------------------------- /model/message.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | __author__ = 'zheng' 3 | 4 | 5 | class Message(object): 6 | 7 | def __init__(self, from_email=None, to_email=None, nickname=None, avatar=None, message=None, type=None): 8 | self.from_email = from_email 9 | self.to_email = to_email 10 | self.nickname = nickname 11 | self.avatar = avatar 12 | self.message = message 13 | self.type = type 14 | 15 | def to_json(self): 16 | return self.__dict__ -------------------------------------------------------------------------------- /mongo_modules.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: mongo_modules.py 5 | # Desc: 2015-15/1/5:下午2:10 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | from mongoengine import * 13 | from datetime import datetime 14 | 15 | class mongo_swan(Document): 16 | project_name = StringField(max_length=50, required=True) 17 | swan_name = StringField() 18 | project_id = IntField() 19 | choose = IntField() 20 | salt_sls = StringField() 21 | config_name = StringField() 22 | check_port_status = BooleanField() 23 | check_port = StringField() 24 | bat_push = BooleanField() 25 | script = StringField() 26 | tgt = StringField() 27 | argall_str = StringField() 28 | datetime = DateTimeField(default=datetime.now()) -------------------------------------------------------------------------------- /pxe_ks/dell.cfg: -------------------------------------------------------------------------------- 1 | default vesamenu.c32 2 | #prompt 1 3 | timeout 30 4 | 5 | display boot.msg 6 | 7 | menu background splash.jpg 8 | menu title CentOS 6.2 www.fun.tv songxs and guojy or zhangzhang! 9 | menu color border 0 #ffffffff #00000000 10 | menu color sel 7 #ffffffff #ff000000 11 | menu color title 0 #ffffffff #00000000 12 | menu color tabmsg 0 #ffffffff #00000000 13 | menu color unsel 0 #ffffffff #00000000 14 | menu color hotsel 0 #ff000000 #ffffffff 15 | menu color hotkey 7 #ffffffff #ff000000 16 | menu color scrollbar 0 #ffffffff #00000000 17 | 18 | label linux 19 | menu label ^Install or upgrade an existing system 20 | menu default 21 | kernel vmlinuz 22 | append ks=http://192.168.50.99/dell.cfg ksdevice=em1 initrd=initrd.img 23 | label vesa 24 | menu label Install system with ^basic video driver 25 | kernel vmlinuz 26 | append initrd=initrd.img xdriver=vesa nomodeset 27 | label rescue 28 | menu label ^Rescue installed system 29 | kernel vmlinuz 30 | append initrd=initrd.img rescue 31 | label local 32 | menu label Boot from ^local drive 33 | localboot 0xffff 34 | label memtest86 35 | menu label ^Memory test 36 | kernel memtest 37 | append - -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | tornado 2 | futures 3 | websocket-client -------------------------------------------------------------------------------- /salt_api/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: __init__.py 5 | # Desc: 2014-14/12/30:下午4:37 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | -------------------------------------------------------------------------------- /salt_api/cmdb_mysql.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: cmdb_mysql.py 5 | # Desc: 2015-15/1/28:下午5:29 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | import MySQLdb 13 | import json 14 | def jobs_class(jid): 15 | db = MySQLdb.connect("127.0.0.1", "root", "a0cc454b75d64a0892403f04b56e14c4", "fun_cmdb") 16 | cursor = db.cursor() 17 | test = "select id,success from salt_returns where jid=%s" % (jid) 18 | cursor.execute(test) 19 | rows = cursor.fetchall() 20 | row = dict(rows) 21 | db.close() 22 | return row 23 | 24 | # s = jobs_class(20150115164022979374) 25 | # for i in s: 26 | # print i 27 | -------------------------------------------------------------------------------- /salt_api/salt_https_api.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: 5 | # Desc: 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # Version: 0.0.1 10 | # LastChange: 11 | # History: 12 | # ============================================================================= 13 | 14 | import urllib2, cookielib, urllib, yaml, json 15 | import requests 16 | from conf.config import salt_api_url, salt_api_pass, salt_api_user 17 | import redis 18 | 19 | requests.packages.urllib3.disable_warnings() 20 | 21 | 22 | class salt_api_token(object): 23 | def __init__(self, data, url, token=None): 24 | self.data = data 25 | self.url = url 26 | self.headers = { 27 | 'User-agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 28 | "Accept": "application/x-yaml", 29 | } 30 | self.headers.update(token) 31 | 32 | def run(self): 33 | print self.data 34 | req = requests.post(self.url, headers=self.headers, data=self.data, verify=False) 35 | context = req.text 36 | return yaml.load(context) 37 | 38 | 39 | class salt_api_jobs(object): 40 | def __init__(self, url, token=None): 41 | self.url = url 42 | self.headers = { 43 | 'User-agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 44 | "Accept": "application/x-yaml", 45 | } 46 | self.headers.update(token) 47 | 48 | def run(self): 49 | context = urllib2.Request(self.url, headers=self.headers) 50 | resp = urllib2.urlopen(context) 51 | context = resp.read() 52 | return yaml.load(context) 53 | 54 | 55 | def token_id(): 56 | key_redis = redis.Redis("192.168.111.101", port=6379, db=0) 57 | salt_key = key_redis.get("salt_key") 58 | if not salt_key: 59 | s = salt_api_token( 60 | { 61 | "username": salt_api_user, 62 | "password": salt_api_pass, 63 | "eauth": "pam" 64 | }, 65 | salt_api_url + "login", 66 | {} 67 | ) 68 | test = s.run() 69 | salt_token = [i["token"] for i in test["return"]] 70 | salt_token = salt_token[0] 71 | key_redis.set("salt_key", salt_token) 72 | key_redis.expire("salt_key", 10800) 73 | return salt_token 74 | else: 75 | return salt_key 76 | 77 | 78 | class salt_api_useradd(object): 79 | def __init__(self, data, url, token=None): 80 | self.data = data 81 | self.url = url 82 | self.headers = { 83 | 'User-agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 84 | "Accept": "application/x-yaml", 85 | } 86 | self.headers.update(token) 87 | 88 | def run(self): 89 | print self.data 90 | req = requests.post(self.url, headers=self.headers, data=self.data, verify=False) 91 | context = req.text 92 | return yaml.load(context) 93 | -------------------------------------------------------------------------------- /salt_job_cache.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: salt_job_cache.py 5 | # Desc: 2015-15/4/8:下午2:10 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | #!/bin/env python 13 | #coding=utf8 14 | 15 | # Import python libs 16 | import json 17 | import redis 18 | # Import salt modules 19 | import salt.config 20 | import salt.utils.event 21 | from salt.output import display_output 22 | opts={'extension_modules': '/var/cache/salt/master/extmods', 23 | 'color': False, 24 | 'state_verbose': True, 25 | } 26 | # Import third party libs 27 | # import MySQLdb 28 | 29 | __opts__ = salt.config.client_config('/etc/salt/master') 30 | 31 | # redis key pubsub 32 | rc = redis.Redis(host='192.168.111.101',port=6379,db=1) 33 | # ps = r.pubsub() 34 | 35 | # Listen Salt Master Event System 36 | event = salt.utils.event.MasterEvent(__opts__['sock_dir']) 37 | for eachevent in event.iter_events(full=True): 38 | ret = eachevent['data'] 39 | #print ret 40 | if "salt/job/" in eachevent['tag']: 41 | # Return Event 42 | print ret 43 | print ret.has_key('id') 44 | if ret.has_key('id') and ret.has_key('return'): 45 | # Igonre saltutil.find_job event 46 | if ret['fun'] == "saltutil.find_job": 47 | continue 48 | print "*" * 50 49 | display_output(ret["return"], "highstate", opts=opts) 50 | print json.dumps(ret["return"]) 51 | #r_sub_key = "%s" %(ret['jid']) 52 | #ps = rc.pubsub() 53 | #ps.subscribe("web_chat") 54 | #rc.publish("web_chat", json.dumps({"message": ret["return"], "to_email": r_sub_key, "id": ret["id"]})) 55 | #print "redis is ok" 56 | # Other Event 57 | else: 58 | pass -------------------------------------------------------------------------------- /salt_out.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: salt_out.py 5 | # Desc: 2015-15/4/8:下午2:16 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | s = {'fun_args': ['test'], 'jid': '20150408141422052250', 'return': {'file_|-/home/jm/logs_|-/home/jm/logs_|-directory': {'comment': 'No directory to create /home/jm/logs in', 'name': '/home/jm/logs', 'start_time': '14:12:12.475051', 'result': False, 'duration': 0.978, '__run_num__': 2, 'changes': {}}, 'pkg_|-jm-diamond_|-jm-diamond-client_|-installed': {'comment': 'An exception occurred in this state: Traceback (most recent call last):\n File "/usr/lib/python2.6/site-packages/salt/state.py", line 1554, in call\n **cdata[\'kwargs\'])\n File "/usr/lib/python2.6/site-packages/salt/states/pkg.py", line 833, in installed\n **kwargs)\n File "/usr/lib/python2.6/site-packages/salt/states/pkg.py", line 309, in _find_install_targets\n problems = _preflight_check(desired, **kwargs)\n File "/usr/lib/python2.6/site-packages/salt/states/pkg.py", line 455, in _preflight_check\n *list(desired.keys()), fromrepo=fromrepo, **kwargs\n File "/usr/lib/python2.6/site-packages/salt/modules/yumpkg.py", line 584, in check_db\n query_format=\'%{NAME}_|-%{ARCH}\'\n File "/usr/lib/python2.6/site-packages/salt/modules/yumpkg.py", line 154, in _repoquery\n \'{0}\'.format(comment)\nCommandExecutionError: Traceback (most recent call last):\n File "/usr/bin/repoquery", line 1241, in \n main(sys.argv)\n File "/usr/bin/repoquery", line 1235, in main\n repoq.runQuery(regexs)\n File "/usr/bin/repoquery", line 805, in runQuery\n pkgs = self.matchPkgs(items, plain_pkgs=plain_pkgs)\n File "/usr/bin/repoquery", line 742, in matchPkgs\n pkgs = self.returnPkgList(patterns=items)\n File "/usr/bin/repoquery", line 700, in returnPkgList\n ygh = self.doPackageLists(what, **kwargs)\n File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 2276, in doPackageLists\n avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,\n File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 883, in \n pkgSack = property(fget=lambda self: self._getSacks(),\n File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 668, in _getSacks\n self.repos.populateSack(which=repos)\n File "/usr/lib/python2.6/site-packages/yum/repos.py", line 294, in populateSack\n sack.populate(repo, mdtype, callback, cacheonly)\n File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 164, in populate\n if self._check_db_version(repo, mydbtype):\n File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 222, in _check_db_version\n return repo._check_db_version(mdtype)\n File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1263, in _check_db_version\n repoXML = self.repoXML\n File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1462, in \n repoXML = property(fget=lambda self: self._getRepoXML(),\n File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1454, in _getRepoXML\n self._loadRepoXML(text=self)\n File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1444, in _loadRepoXML\n return self._groupLoadRepoXML(text, self._mdpolicy2mdtypes())\n File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1419, in _groupLoadRepoXML\n if self._commonLoadRepoXML(text):\n File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1240, in _commonLoadRepoXML\n self._revertOldRepoXML()\n File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1090, in _revertOldRepoXML\n os.rename(old_data[\'old_local\'], old_data[\'local\'])\nOSError: [Errno 2] No such file or directory\n', 'name': 'jm-diamond-client', 'start_time': '14:12:12.481598', 'result': False, 'duration': 31944.605, '__run_num__': 6, 'changes': {}}, 'file_|-/home/jm/www_|-/home/jm/www_|-directory': {'comment': 'No directory to create /home/jm/www in', 'name': '/home/jm/www', 'start_time': '14:12:12.480473', 'result': False, 'duration': 0.893, '__run_num__': 5, 'changes': {}}, 'file_|-/home/jm/data_|-/home/jm/data_|-directory': {'comment': 'No directory to create /home/jm/data in', 'name': '/home/jm/data', 'start_time': '14:12:12.476208', 'result': False, 'duration': 0.875, '__run_num__': 3, 'changes': {}}, 'file_|-/etc/pam.d/su_|-/etc/pam.d/su_|-managed': {'comment': 'Source file salt://file/su.sls not found', 'name': '/etc/pam.d/su', 'start_time': '14:12:12.477256', 'result': False, 'duration': 3.018, '__run_num__': 4, 'changes': {}}, 'user_|-www-user_|-www_|-present': {'comment': 'User www is present and up to date', 'name': 'www', 'start_time': '14:12:12.472100', 'result': True, 'duration': 2.78, '__run_num__': 1, 'changes': {}}, 'group_|-www-user_|-www_|-present': {'comment': 'Group www is present and up to date', 'name': 'www', 'start_time': '14:12:12.471103', 'result': True, 'duration': 0.807, '__run_num__': 0, 'changes': {}}}, 'retcode': 2, 'success': True, 'cmd': '_return', '_stamp': '2015-04-08T14:15:06.217887', 'fun': 'state.sls', 'id': 'salt_test', 'out': 'highstate'} 13 | 14 | 15 | from salt.output import display_output 16 | opts={'extension_modules': '', 17 | 'color': True, 18 | 'state_verbose': True, 19 | } 20 | 21 | data = display_output(s["return"], "highstate", opts=opts) 22 | print data -------------------------------------------------------------------------------- /service.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: service.py 5 | # Desc: 2015-15/2/26:下午9:19 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | from settings import run 12 | 13 | if __name__ == '__main__': 14 | run() 15 | 16 | -------------------------------------------------------------------------------- /settings.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #-*- coding: utf-8 -*- 3 | #============================================================================= 4 | # FileName: 5 | # Desc: 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # Version: 0.0.1 10 | # LastChange: 2013-02-20 14:52:11 11 | # History: 12 | #============================================================================= 13 | 14 | 15 | import os 16 | 17 | #配置路由规则url 18 | # settings = { 19 | # 'debug': True, #此为调试模式,正式环境必须关闭 20 | # 'static_path': os.path.join(os.path.dirname(__file__), "static"), 21 | # 'template_path': os.path.join(os.path.dirname(__file__), "templates"), 22 | # "cookie_secret": "8i$2jaau-_w%yqwazz7xikka*^ekkvmn$4+25v8&ngz+$&qy#3", 23 | # "login_url": "/login", 24 | # # "xsrf_cookies": True, 25 | # } 26 | 27 | import os 28 | from os.path import abspath, dirname 29 | 30 | import redis 31 | import tornado.httpserver 32 | import tornado.web 33 | from tornado.log import app_log 34 | from tornado.options import define, options 35 | from urls import handlers 36 | from chat import Listener 37 | 38 | PROJECT_DIR = dirname(dirname(abspath(__file__))) 39 | TEMPLATE_DIR = os.path.join(PROJECT_DIR, 'templates') 40 | STATIC_DIR = os.path.join(PROJECT_DIR, 'static') 41 | CONF_DIR = os.path.join(PROJECT_DIR, 'swan_api/conf') 42 | CONF_FILE = CONF_DIR+os.path.sep+"application.conf" 43 | 44 | 45 | 46 | define('redis_host', default='localhost') 47 | define('redis_db', default=2, type=int) 48 | define('redis_channel', default='web_chat', help='message pubsub channel') 49 | define("debug", default=True, type=bool) 50 | define("port", default=8888, type=int) 51 | 52 | 53 | class Application(tornado.web.Application): 54 | 55 | _CLIENTS_MAP = {} 56 | 57 | def __init__(self): 58 | 59 | r = redis.Redis(host=options.redis_host, db=options.redis_db) 60 | client = Listener(r, [options.redis_channel]) 61 | 62 | client.start() 63 | settings = { 64 | "template_path": TEMPLATE_DIR, 65 | "static_path": STATIC_DIR, 66 | "login_url": "/", 67 | "debug": options.debug, 68 | "redis": r, 69 | "cookie_secret": "8i$2jaau-_w%yqwazz7xikka*^ekkvmn$4+25v8&ngz+$&qy#3", 70 | "xsrf_cookies": False, 71 | } 72 | tornado.web.Application.__init__(self, handlers, **settings) 73 | 74 | 75 | def run(): 76 | """ 77 | start chat application 78 | 79 | """ 80 | tornado.options.parse_command_line() 81 | tornado.options.parse_config_file(CONF_FILE) 82 | port = os.environ.get("PORT", options.port) 83 | http_server = tornado.httpserver.HTTPServer(Application()) 84 | http_server.listen(port) 85 | # app_log.info("application run on {0}".format(port)) 86 | try: 87 | tornado.ioloop.IOLoop.instance().start() 88 | except KeyboardInterrupt: 89 | pass 90 | 91 | 92 | 93 | if __name__ == "__main__": 94 | application = Application() 95 | 96 | -------------------------------------------------------------------------------- /socket_test.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: socket_test.py 5 | # Desc: 2015-15/1/7:下午12:21 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | import json 12 | from web_socket import web_socket_api 13 | s = {'return': [{'122_30': {'cmd_|-production_service_|-cd /data/tmp; tar -xf OpenPlayCtrlService.tar.gz;dos2unix install.sh;/bin/sh install.sh;rm -rf /data/tmp/*; /etc/init.d/OpenPlayCtrlService start;_|-run': {'comment': 'Command "cd /data/tmp; tar -xf OpenPlayCtrlService.tar.gz;dos2unix install.sh;/bin/sh install.sh;rm -rf /data/tmp/*; /etc/init.d/OpenPlayCtrlService start;" run', 'name': 'cd /data/tmp; tar -xf OpenPlayCtrlService.tar.gz;dos2unix install.sh;/bin/sh install.sh;rm -rf /data/tmp/*; /etc/init.d/OpenPlayCtrlService start;', 'duration': 234, '__run_num__': 2, 'start_time': '12:42:19.945692', 'changes': {'pid': 12479, 'retcode': 0, 'stderr': "dos2unix: converting file install.sh to UNIX format ...\ndos2unix: converting file install.sh to UNIX format ...\nstandard in must be a tty\ntouch: cannot touch `/var/lock/subsys/OpenPlayCtrlService.pid': Permission denied", 'stdout': 'begin create work path\nstart to backup the OpenPlayCtrlService dir\ncreated a new backup: OpenPlayCtrlService-20150107124220.tar.gz\n/data/tmp\nOpenPlayCtrlService has installed successful\nStarting OpenPlayCtrlService: [FAILED]'}, 'result': True}, 'file_|-production_service_|-/data/tmp/OpenPlayCtrlService.tar.gz_|-managed': {'comment': 'File /data/tmp/OpenPlayCtrlService.tar.gz updated', 'name': '/data/tmp/OpenPlayCtrlService.tar.gz', 'duration': 497, '__run_num__': 1, 'start_time': '12:42:19.447482', 'changes': {'diff': 'New file', 'group': 'gamma', 'mode': '0644', 'user': 'gamma'}, 'result': True}, 'cmd_|-clear_open_data_|-rm -rf /data/tmp/*_|-run': {'comment': 'Command "rm -rf /data/tmp/*" run', 'name': 'rm -rf /data/tmp/*', 'duration': 7, '__run_num__': 0, 'start_time': '12:42:19.438994', 'changes': {'pid': 12458, 'retcode': 0, 'stderr': '', 'stdout': ''}, 'result': True}}}]} 14 | # s = "%s" % (s) 15 | web_socket_api(json.dumps(s)) -------------------------------------------------------------------------------- /static/images/DarkNoiseBackground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/images/DarkNoiseBackground.png -------------------------------------------------------------------------------- /static/images/down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Untitled 2 4 | Created with Sketch (http://www.bohemiancoding.com/sketch) 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/images/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/images/facebook.png -------------------------------------------------------------------------------- /static/images/flags/flags16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/images/flags/flags16.png -------------------------------------------------------------------------------- /static/images/google+.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/images/google+.png -------------------------------------------------------------------------------- /static/images/linkedin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/images/linkedin.png -------------------------------------------------------------------------------- /static/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/images/loading.gif -------------------------------------------------------------------------------- /static/images/loading1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/images/loading1.gif -------------------------------------------------------------------------------- /static/images/loading2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/images/loading2.gif -------------------------------------------------------------------------------- /static/images/norse-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/images/norse-white.png -------------------------------------------------------------------------------- /static/images/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/images/twitter.png -------------------------------------------------------------------------------- /static/images/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/images/youtube.png -------------------------------------------------------------------------------- /static/js/blank.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/js/blank.gif -------------------------------------------------------------------------------- /static/js/fancybox_loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/js/fancybox_loading.gif -------------------------------------------------------------------------------- /static/js/fancybox_loading@2x.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/js/fancybox_loading@2x.gif -------------------------------------------------------------------------------- /static/js/fancybox_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/js/fancybox_overlay.png -------------------------------------------------------------------------------- /static/js/fancybox_sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/js/fancybox_sprite.png -------------------------------------------------------------------------------- /static/js/fancybox_sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/js/fancybox_sprite@2x.png -------------------------------------------------------------------------------- /static/js/helpers/fancybox_buttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voilet/push_api/91b5ab8f15029a698216791365b2f589dc340d5c/static/js/helpers/fancybox_buttons.png -------------------------------------------------------------------------------- /static/js/helpers/jquery.fancybox-buttons.css: -------------------------------------------------------------------------------- 1 | #fancybox-buttons { 2 | position: fixed; 3 | left: 0; 4 | width: 100%; 5 | z-index: 8050; 6 | } 7 | 8 | #fancybox-buttons.top { 9 | top: 10px; 10 | } 11 | 12 | #fancybox-buttons.bottom { 13 | bottom: 10px; 14 | } 15 | 16 | #fancybox-buttons ul { 17 | display: block; 18 | width: 166px; 19 | height: 30px; 20 | margin: 0 auto; 21 | padding: 0; 22 | list-style: none; 23 | border: 1px solid #111; 24 | border-radius: 3px; 25 | -webkit-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); 26 | -moz-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); 27 | box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); 28 | background: rgb(50,50,50); 29 | background: -moz-linear-gradient(top, rgb(68,68,68) 0%, rgb(52,52,52) 50%, rgb(41,41,41) 50%, rgb(51,51,51) 100%); 30 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgb(68,68,68)), color-stop(50%,rgb(52,52,52)), color-stop(50%,rgb(41,41,41)), color-stop(100%,rgb(51,51,51))); 31 | background: -webkit-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); 32 | background: -o-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); 33 | background: -ms-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); 34 | background: linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); 35 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#444444', endColorstr='#222222',GradientType=0 ); 36 | } 37 | 38 | #fancybox-buttons ul li { 39 | float: left; 40 | margin: 0; 41 | padding: 0; 42 | } 43 | 44 | #fancybox-buttons a { 45 | display: block; 46 | width: 30px; 47 | height: 30px; 48 | text-indent: -9999px; 49 | background-color: transparent; 50 | background-image: url('fancybox_buttons.png'); 51 | background-repeat: no-repeat; 52 | outline: none; 53 | opacity: 0.8; 54 | } 55 | 56 | #fancybox-buttons a:hover { 57 | opacity: 1; 58 | } 59 | 60 | #fancybox-buttons a.btnPrev { 61 | background-position: 5px 0; 62 | } 63 | 64 | #fancybox-buttons a.btnNext { 65 | background-position: -33px 0; 66 | border-right: 1px solid #3e3e3e; 67 | } 68 | 69 | #fancybox-buttons a.btnPlay { 70 | background-position: 0 -30px; 71 | } 72 | 73 | #fancybox-buttons a.btnPlayOn { 74 | background-position: -30px -30px; 75 | } 76 | 77 | #fancybox-buttons a.btnToggle { 78 | background-position: 3px -60px; 79 | border-left: 1px solid #111; 80 | border-right: 1px solid #3e3e3e; 81 | width: 35px 82 | } 83 | 84 | #fancybox-buttons a.btnToggleOn { 85 | background-position: -27px -60px; 86 | } 87 | 88 | #fancybox-buttons a.btnClose { 89 | border-left: 1px solid #111; 90 | width: 35px; 91 | background-position: -56px 0px; 92 | } 93 | 94 | #fancybox-buttons a.btnDisabled { 95 | opacity : 0.4; 96 | cursor: default; 97 | } -------------------------------------------------------------------------------- /static/js/helpers/jquery.fancybox-buttons.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Buttons helper for fancyBox 3 | * version: 1.0.5 (Mon, 15 Oct 2012) 4 | * @requires fancyBox v2.0 or later 5 | * 6 | * Usage: 7 | * $(".fancybox").fancybox({ 8 | * helpers : { 9 | * buttons: { 10 | * position : 'top' 11 | * } 12 | * } 13 | * }); 14 | * 15 | */ 16 | ;(function ($) { 17 | //Shortcut for fancyBox object 18 | var F = $.fancybox; 19 | 20 | //Add helper object 21 | F.helpers.buttons = { 22 | defaults : { 23 | skipSingle : false, // disables if gallery contains single image 24 | position : 'top', // 'top' or 'bottom' 25 | tpl : '
' 26 | }, 27 | 28 | list : null, 29 | buttons: null, 30 | 31 | beforeLoad: function (opts, obj) { 32 | //Remove self if gallery do not have at least two items 33 | 34 | if (opts.skipSingle && obj.group.length < 2) { 35 | obj.helpers.buttons = false; 36 | obj.closeBtn = true; 37 | 38 | return; 39 | } 40 | 41 | //Increase top margin to give space for buttons 42 | obj.margin[ opts.position === 'bottom' ? 2 : 0 ] += 30; 43 | }, 44 | 45 | onPlayStart: function () { 46 | if (this.buttons) { 47 | this.buttons.play.attr('title', 'Pause slideshow').addClass('btnPlayOn'); 48 | } 49 | }, 50 | 51 | onPlayEnd: function () { 52 | if (this.buttons) { 53 | this.buttons.play.attr('title', 'Start slideshow').removeClass('btnPlayOn'); 54 | } 55 | }, 56 | 57 | afterShow: function (opts, obj) { 58 | var buttons = this.buttons; 59 | 60 | if (!buttons) { 61 | this.list = $(opts.tpl).addClass(opts.position).appendTo('body'); 62 | 63 | buttons = { 64 | prev : this.list.find('.btnPrev').click( F.prev ), 65 | next : this.list.find('.btnNext').click( F.next ), 66 | play : this.list.find('.btnPlay').click( F.play ), 67 | toggle : this.list.find('.btnToggle').click( F.toggle ), 68 | close : this.list.find('.btnClose').click( F.close ) 69 | } 70 | } 71 | 72 | //Prev 73 | if (obj.index > 0 || obj.loop) { 74 | buttons.prev.removeClass('btnDisabled'); 75 | } else { 76 | buttons.prev.addClass('btnDisabled'); 77 | } 78 | 79 | //Next / Play 80 | if (obj.loop || obj.index < obj.group.length - 1) { 81 | buttons.next.removeClass('btnDisabled'); 82 | buttons.play.removeClass('btnDisabled'); 83 | 84 | } else { 85 | buttons.next.addClass('btnDisabled'); 86 | buttons.play.addClass('btnDisabled'); 87 | } 88 | 89 | this.buttons = buttons; 90 | 91 | this.onUpdate(opts, obj); 92 | }, 93 | 94 | onUpdate: function (opts, obj) { 95 | var toggle; 96 | 97 | if (!this.buttons) { 98 | return; 99 | } 100 | 101 | toggle = this.buttons.toggle.removeClass('btnDisabled btnToggleOn'); 102 | 103 | //Size toggle button 104 | if (obj.canShrink) { 105 | toggle.addClass('btnToggleOn'); 106 | 107 | } else if (!obj.canExpand) { 108 | toggle.addClass('btnDisabled'); 109 | } 110 | }, 111 | 112 | beforeClose: function () { 113 | if (this.list) { 114 | this.list.remove(); 115 | } 116 | 117 | this.list = null; 118 | this.buttons = null; 119 | } 120 | }; 121 | 122 | }(jQuery)); 123 | -------------------------------------------------------------------------------- /static/js/helpers/jquery.fancybox-media.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Media helper for fancyBox 3 | * version: 1.0.6 (Fri, 14 Jun 2013) 4 | * @requires fancyBox v2.0 or later 5 | * 6 | * Usage: 7 | * $(".fancybox").fancybox({ 8 | * helpers : { 9 | * media: true 10 | * } 11 | * }); 12 | * 13 | * Set custom URL parameters: 14 | * $(".fancybox").fancybox({ 15 | * helpers : { 16 | * media: { 17 | * youtube : { 18 | * params : { 19 | * autoplay : 0 20 | * } 21 | * } 22 | * } 23 | * } 24 | * }); 25 | * 26 | * Or: 27 | * $(".fancybox").fancybox({, 28 | * helpers : { 29 | * media: true 30 | * }, 31 | * youtube : { 32 | * autoplay: 0 33 | * } 34 | * }); 35 | * 36 | * Supports: 37 | * 38 | * Youtube 39 | * http://www.youtube.com/watch?v=opj24KnzrWo 40 | * http://www.youtube.com/embed/opj24KnzrWo 41 | * http://youtu.be/opj24KnzrWo 42 | * http://www.youtube-nocookie.com/embed/opj24KnzrWo 43 | * Vimeo 44 | * http://vimeo.com/40648169 45 | * http://vimeo.com/channels/staffpicks/38843628 46 | * http://vimeo.com/groups/surrealism/videos/36516384 47 | * http://player.vimeo.com/video/45074303 48 | * Metacafe 49 | * http://www.metacafe.com/watch/7635964/dr_seuss_the_lorax_movie_trailer/ 50 | * http://www.metacafe.com/watch/7635964/ 51 | * Dailymotion 52 | * http://www.dailymotion.com/video/xoytqh_dr-seuss-the-lorax-premiere_people 53 | * Twitvid 54 | * http://twitvid.com/QY7MD 55 | * Twitpic 56 | * http://twitpic.com/7p93st 57 | * Instagram 58 | * http://instagr.am/p/IejkuUGxQn/ 59 | * http://instagram.com/p/IejkuUGxQn/ 60 | * Google maps 61 | * http://maps.google.com/maps?q=Eiffel+Tower,+Avenue+Gustave+Eiffel,+Paris,+France&t=h&z=17 62 | * http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16 63 | * http://maps.google.com/?ll=48.859463,2.292626&spn=0.000965,0.002642&t=m&z=19&layer=c&cbll=48.859524,2.292532&panoid=YJ0lq28OOy3VT2IqIuVY0g&cbp=12,151.58,,0,-15.56 64 | */ 65 | ;(function ($) { 66 | "use strict"; 67 | 68 | //Shortcut for fancyBox object 69 | var F = $.fancybox, 70 | format = function( url, rez, params ) { 71 | params = params || ''; 72 | 73 | if ( $.type( params ) === "object" ) { 74 | params = $.param(params, true); 75 | } 76 | 77 | $.each(rez, function(key, value) { 78 | url = url.replace( '$' + key, value || '' ); 79 | }); 80 | 81 | if (params.length) { 82 | url += ( url.indexOf('?') > 0 ? '&' : '?' ) + params; 83 | } 84 | 85 | return url; 86 | }; 87 | 88 | //Add helper object 89 | F.helpers.media = { 90 | defaults : { 91 | youtube : { 92 | matcher : /(youtube\.com|youtu\.be|youtube-nocookie\.com)\/(watch\?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*)).*/i, 93 | params : { 94 | autoplay : 1, 95 | autohide : 1, 96 | fs : 1, 97 | rel : 0, 98 | hd : 1, 99 | wmode : 'opaque', 100 | enablejsapi : 1 101 | }, 102 | type : 'iframe', 103 | url : '//www.youtube.com/embed/$3' 104 | }, 105 | vimeo : { 106 | matcher : /(?:vimeo(?:pro)?.com)\/(?:[^\d]+)?(\d+)(?:.*)/, 107 | params : { 108 | autoplay : 1, 109 | hd : 1, 110 | show_title : 1, 111 | show_byline : 1, 112 | show_portrait : 0, 113 | fullscreen : 1 114 | }, 115 | type : 'iframe', 116 | url : '//player.vimeo.com/video/$1' 117 | }, 118 | metacafe : { 119 | matcher : /metacafe.com\/(?:watch|fplayer)\/([\w\-]{1,10})/, 120 | params : { 121 | autoPlay : 'yes' 122 | }, 123 | type : 'swf', 124 | url : function( rez, params, obj ) { 125 | obj.swf.flashVars = 'playerVars=' + $.param( params, true ); 126 | 127 | return '//www.metacafe.com/fplayer/' + rez[1] + '/.swf'; 128 | } 129 | }, 130 | dailymotion : { 131 | matcher : /dailymotion.com\/video\/(.*)\/?(.*)/, 132 | params : { 133 | additionalInfos : 0, 134 | autoStart : 1 135 | }, 136 | type : 'swf', 137 | url : '//www.dailymotion.com/swf/video/$1' 138 | }, 139 | twitvid : { 140 | matcher : /twitvid\.com\/([a-zA-Z0-9_\-\?\=]+)/i, 141 | params : { 142 | autoplay : 0 143 | }, 144 | type : 'iframe', 145 | url : '//www.twitvid.com/embed.php?guid=$1' 146 | }, 147 | twitpic : { 148 | matcher : /twitpic\.com\/(?!(?:place|photos|events)\/)([a-zA-Z0-9\?\=\-]+)/i, 149 | type : 'image', 150 | url : '//twitpic.com/show/full/$1/' 151 | }, 152 | instagram : { 153 | matcher : /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i, 154 | type : 'image', 155 | url : '//$1/p/$2/media/?size=l' 156 | }, 157 | google_maps : { 158 | matcher : /maps\.google\.([a-z]{2,3}(\.[a-z]{2})?)\/(\?ll=|maps\?)(.*)/i, 159 | type : 'iframe', 160 | url : function( rez ) { 161 | return '//maps.google.' + rez[1] + '/' + rez[3] + '' + rez[4] + '&output=' + (rez[4].indexOf('layer=c') > 0 ? 'svembed' : 'embed'); 162 | } 163 | } 164 | }, 165 | 166 | beforeLoad : function(opts, obj) { 167 | var url = obj.href || '', 168 | type = false, 169 | what, 170 | item, 171 | rez, 172 | params; 173 | 174 | for (what in opts) { 175 | if (opts.hasOwnProperty(what)) { 176 | item = opts[ what ]; 177 | rez = url.match( item.matcher ); 178 | 179 | if (rez) { 180 | type = item.type; 181 | params = $.extend(true, {}, item.params, obj[ what ] || ($.isPlainObject(opts[ what ]) ? opts[ what ].params : null)); 182 | 183 | url = $.type( item.url ) === "function" ? item.url.call( this, rez, params, obj ) : format( item.url, rez, params ); 184 | 185 | break; 186 | } 187 | } 188 | } 189 | 190 | if (type) { 191 | obj.href = url; 192 | obj.type = type; 193 | 194 | obj.autoHeight = false; 195 | } 196 | } 197 | }; 198 | 199 | }(jQuery)); -------------------------------------------------------------------------------- /static/js/helpers/jquery.fancybox-thumbs.css: -------------------------------------------------------------------------------- 1 | #fancybox-thumbs { 2 | position: fixed; 3 | left: 0; 4 | width: 100%; 5 | overflow: hidden; 6 | z-index: 8050; 7 | } 8 | 9 | #fancybox-thumbs.bottom { 10 | bottom: 2px; 11 | } 12 | 13 | #fancybox-thumbs.top { 14 | top: 2px; 15 | } 16 | 17 | #fancybox-thumbs ul { 18 | position: relative; 19 | list-style: none; 20 | margin: 0; 21 | padding: 0; 22 | } 23 | 24 | #fancybox-thumbs ul li { 25 | float: left; 26 | padding: 1px; 27 | opacity: 0.5; 28 | } 29 | 30 | #fancybox-thumbs ul li.active { 31 | opacity: 0.75; 32 | padding: 0; 33 | border: 1px solid #fff; 34 | } 35 | 36 | #fancybox-thumbs ul li:hover { 37 | opacity: 1; 38 | } 39 | 40 | #fancybox-thumbs ul li a { 41 | display: block; 42 | position: relative; 43 | overflow: hidden; 44 | border: 1px solid #222; 45 | background: #111; 46 | outline: none; 47 | } 48 | 49 | #fancybox-thumbs ul li img { 50 | display: block; 51 | position: relative; 52 | border: 0; 53 | padding: 0; 54 | max-width: none; 55 | } -------------------------------------------------------------------------------- /static/js/helpers/jquery.fancybox-thumbs.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Thumbnail helper for fancyBox 3 | * version: 1.0.7 (Mon, 01 Oct 2012) 4 | * @requires fancyBox v2.0 or later 5 | * 6 | * Usage: 7 | * $(".fancybox").fancybox({ 8 | * helpers : { 9 | * thumbs: { 10 | * width : 50, 11 | * height : 50 12 | * } 13 | * } 14 | * }); 15 | * 16 | */ 17 | ;(function ($) { 18 | //Shortcut for fancyBox object 19 | var F = $.fancybox; 20 | 21 | //Add helper object 22 | F.helpers.thumbs = { 23 | defaults : { 24 | width : 50, // thumbnail width 25 | height : 50, // thumbnail height 26 | position : 'bottom', // 'top' or 'bottom' 27 | source : function ( item ) { // function to obtain the URL of the thumbnail image 28 | var href; 29 | 30 | if (item.element) { 31 | href = $(item.element).find('img').attr('src'); 32 | } 33 | 34 | if (!href && item.type === 'image' && item.href) { 35 | href = item.href; 36 | } 37 | 38 | return href; 39 | } 40 | }, 41 | 42 | wrap : null, 43 | list : null, 44 | width : 0, 45 | 46 | init: function (opts, obj) { 47 | var that = this, 48 | list, 49 | thumbWidth = opts.width, 50 | thumbHeight = opts.height, 51 | thumbSource = opts.source; 52 | 53 | //Build list structure 54 | list = ''; 55 | 56 | for (var n = 0; n < obj.group.length; n++) { 57 | list += '
  • '; 58 | } 59 | 60 | this.wrap = $('
    ').addClass(opts.position).appendTo('body'); 61 | this.list = $('
      ' + list + '
    ').appendTo(this.wrap); 62 | 63 | //Load each thumbnail 64 | $.each(obj.group, function (i) { 65 | var el = obj.group[ i ], 66 | href = thumbSource( el ); 67 | 68 | if (!href) { 69 | return; 70 | } 71 | 72 | $("").load(function () { 73 | var width = this.width, 74 | height = this.height, 75 | widthRatio, heightRatio, parent; 76 | 77 | if (!that.list || !width || !height) { 78 | return; 79 | } 80 | 81 | //Calculate thumbnail width/height and center it 82 | widthRatio = width / thumbWidth; 83 | heightRatio = height / thumbHeight; 84 | 85 | parent = that.list.children().eq(i).find('a'); 86 | 87 | if (widthRatio >= 1 && heightRatio >= 1) { 88 | if (widthRatio > heightRatio) { 89 | width = Math.floor(width / heightRatio); 90 | height = thumbHeight; 91 | 92 | } else { 93 | width = thumbWidth; 94 | height = Math.floor(height / widthRatio); 95 | } 96 | } 97 | 98 | $(this).css({ 99 | width : width, 100 | height : height, 101 | top : Math.floor(thumbHeight / 2 - height / 2), 102 | left : Math.floor(thumbWidth / 2 - width / 2) 103 | }); 104 | 105 | parent.width(thumbWidth).height(thumbHeight); 106 | 107 | $(this).hide().appendTo(parent).fadeIn(300); 108 | 109 | }) 110 | .attr('src', href) 111 | .attr('title', el.title); 112 | }); 113 | 114 | //Set initial width 115 | this.width = this.list.children().eq(0).outerWidth(true); 116 | 117 | this.list.width(this.width * (obj.group.length + 1)).css('left', Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5))); 118 | }, 119 | 120 | beforeLoad: function (opts, obj) { 121 | //Remove self if gallery do not have at least two items 122 | if (obj.group.length < 2) { 123 | obj.helpers.thumbs = false; 124 | 125 | return; 126 | } 127 | 128 | //Increase bottom margin to give space for thumbs 129 | obj.margin[ opts.position === 'top' ? 0 : 2 ] += ((opts.height) + 15); 130 | }, 131 | 132 | afterShow: function (opts, obj) { 133 | //Check if exists and create or update list 134 | if (this.list) { 135 | this.onUpdate(opts, obj); 136 | 137 | } else { 138 | this.init(opts, obj); 139 | } 140 | 141 | //Set active element 142 | this.list.children().removeClass('active').eq(obj.index).addClass('active'); 143 | }, 144 | 145 | //Center list 146 | onUpdate: function (opts, obj) { 147 | if (this.list) { 148 | this.list.stop(true).animate({ 149 | 'left': Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5)) 150 | }, 150); 151 | } 152 | }, 153 | 154 | beforeClose: function () { 155 | if (this.wrap) { 156 | this.wrap.remove(); 157 | } 158 | 159 | this.wrap = null; 160 | this.list = null; 161 | this.width = 0; 162 | } 163 | } 164 | 165 | }(jQuery)); -------------------------------------------------------------------------------- /static/js/jquery.fancybox.css: -------------------------------------------------------------------------------- 1 | /*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */ 2 | .fancybox-wrap, 3 | .fancybox-skin, 4 | .fancybox-outer, 5 | .fancybox-inner, 6 | .fancybox-image, 7 | .fancybox-wrap iframe, 8 | .fancybox-wrap object, 9 | .fancybox-nav, 10 | .fancybox-nav span, 11 | .fancybox-tmp 12 | { 13 | padding: 0; 14 | margin: 0; 15 | border: 0; 16 | outline: none; 17 | vertical-align: top; 18 | } 19 | 20 | .fancybox-wrap { 21 | position: absolute; 22 | top: 0; 23 | left: 0; 24 | z-index: 8020; 25 | } 26 | 27 | .fancybox-skin { 28 | position: relative; 29 | background: #f9f9f9; 30 | color: #444; 31 | text-shadow: none; 32 | -webkit-border-radius: 4px; 33 | -moz-border-radius: 4px; 34 | border-radius: 4px; 35 | } 36 | 37 | .fancybox-opened { 38 | z-index: 8030; 39 | } 40 | 41 | .fancybox-opened .fancybox-skin { 42 | -webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); 43 | -moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); 44 | box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); 45 | } 46 | 47 | .fancybox-outer, .fancybox-inner { 48 | position: relative; 49 | } 50 | 51 | .fancybox-inner { 52 | overflow: hidden; 53 | } 54 | 55 | .fancybox-type-iframe .fancybox-inner { 56 | -webkit-overflow-scrolling: touch; 57 | } 58 | 59 | .fancybox-error { 60 | color: #444; 61 | font: 14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif; 62 | margin: 0; 63 | padding: 15px; 64 | white-space: nowrap; 65 | } 66 | 67 | .fancybox-image, .fancybox-iframe { 68 | display: block; 69 | width: 100%; 70 | height: 100%; 71 | } 72 | 73 | .fancybox-image { 74 | max-width: 100%; 75 | max-height: 100%; 76 | } 77 | 78 | #fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span { 79 | background-image: url(fancybox_sprite.png); 80 | } 81 | 82 | #fancybox-loading { 83 | position: fixed; 84 | top: 50%; 85 | left: 50%; 86 | margin-top: -22px; 87 | margin-left: -22px; 88 | background-position: 0 -108px; 89 | opacity: 0.8; 90 | cursor: pointer; 91 | z-index: 8060; 92 | } 93 | 94 | #fancybox-loading div { 95 | width: 44px; 96 | height: 44px; 97 | background: url(fancybox_loading.gif) center center no-repeat; 98 | } 99 | 100 | .fancybox-close { 101 | position: absolute; 102 | top: -18px; 103 | right: -18px; 104 | width: 36px; 105 | height: 36px; 106 | cursor: pointer; 107 | z-index: 8040; 108 | } 109 | 110 | .fancybox-nav { 111 | position: absolute; 112 | top: 0; 113 | width: 40%; 114 | height: 100%; 115 | cursor: pointer; 116 | text-decoration: none; 117 | background: transparent url(blank.gif); /* helps IE */ 118 | -webkit-tap-highlight-color: rgba(0,0,0,0); 119 | z-index: 8040; 120 | } 121 | 122 | .fancybox-prev { 123 | left: 0; 124 | } 125 | 126 | .fancybox-next { 127 | right: 0; 128 | } 129 | 130 | .fancybox-nav span { 131 | position: absolute; 132 | top: 50%; 133 | width: 36px; 134 | height: 34px; 135 | margin-top: -18px; 136 | cursor: pointer; 137 | z-index: 8040; 138 | visibility: hidden; 139 | } 140 | 141 | .fancybox-prev span { 142 | left: 10px; 143 | background-position: 0 -36px; 144 | } 145 | 146 | .fancybox-next span { 147 | right: 10px; 148 | background-position: 0 -72px; 149 | } 150 | 151 | .fancybox-nav:hover span { 152 | visibility: visible; 153 | } 154 | 155 | .fancybox-tmp { 156 | position: absolute; 157 | top: -99999px; 158 | left: -99999px; 159 | max-width: 99999px; 160 | max-height: 99999px; 161 | overflow: visible !important; 162 | } 163 | 164 | /* Overlay helper */ 165 | 166 | .fancybox-lock { 167 | overflow: visible !important; 168 | width: auto; 169 | } 170 | 171 | .fancybox-lock body { 172 | overflow: hidden !important; 173 | } 174 | 175 | .fancybox-lock-test { 176 | overflow-y: hidden !important; 177 | } 178 | 179 | .fancybox-overlay { 180 | position: absolute; 181 | top: 0; 182 | left: 0; 183 | overflow: hidden; 184 | display: none; 185 | z-index: 8010; 186 | background: url(fancybox_overlay.png); 187 | } 188 | 189 | .fancybox-overlay-fixed { 190 | position: fixed; 191 | bottom: 0; 192 | right: 0; 193 | } 194 | 195 | .fancybox-lock .fancybox-overlay { 196 | overflow: auto; 197 | overflow-y: scroll; 198 | } 199 | 200 | /* Title helper */ 201 | 202 | .fancybox-title { 203 | visibility: hidden; 204 | font: normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif; 205 | position: relative; 206 | text-shadow: none; 207 | z-index: 8050; 208 | } 209 | 210 | .fancybox-opened .fancybox-title { 211 | visibility: visible; 212 | } 213 | 214 | .fancybox-title-float-wrap { 215 | position: absolute; 216 | bottom: 0; 217 | right: 50%; 218 | margin-bottom: -35px; 219 | z-index: 8050; 220 | text-align: center; 221 | } 222 | 223 | .fancybox-title-float-wrap .child { 224 | display: inline-block; 225 | margin-right: -100%; 226 | padding: 2px 20px; 227 | background: transparent; /* Fallback for web browsers that doesn't support RGBa */ 228 | background: rgba(0, 0, 0, 0.8); 229 | -webkit-border-radius: 15px; 230 | -moz-border-radius: 15px; 231 | border-radius: 15px; 232 | text-shadow: 0 1px 2px #222; 233 | color: #FFF; 234 | font-weight: bold; 235 | line-height: 24px; 236 | white-space: nowrap; 237 | } 238 | 239 | .fancybox-title-outside-wrap { 240 | position: relative; 241 | margin-top: 10px; 242 | color: #fff; 243 | } 244 | 245 | .fancybox-title-inside-wrap { 246 | padding-top: 10px; 247 | } 248 | 249 | .fancybox-title-over-wrap { 250 | position: absolute; 251 | bottom: 0; 252 | left: 0; 253 | color: #fff; 254 | padding: 10px; 255 | background: #000; 256 | background: rgba(0, 0, 0, .8); 257 | } 258 | 259 | /*Retina graphics!*/ 260 | @media only screen and (-webkit-min-device-pixel-ratio: 1.5), 261 | only screen and (min--moz-device-pixel-ratio: 1.5), 262 | only screen and (min-device-pixel-ratio: 1.5){ 263 | 264 | #fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span { 265 | background-image: url(fancybox_sprite@2x.png); 266 | background-size: 44px 152px; /*The size of the normal image, half the size of the hi-res image*/ 267 | } 268 | 269 | #fancybox-loading div { 270 | background-image: url(fancybox_loading@2x.gif); 271 | background-size: 24px 24px; /*The size of the normal image, half the size of the hi-res image*/ 272 | } 273 | } -------------------------------------------------------------------------------- /static/js/jquery.mousewheel.pack.js: -------------------------------------------------------------------------------- 1 | /*! Copyright (c) 2013 Brandon Aaron (http://brandonaaron.net) 2 | * Licensed under the MIT License (LICENSE.txt). 3 | * 4 | * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. 5 | * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. 6 | * Thanks to: Seamus Leahy for adding deltaX and deltaY 7 | * 8 | * Version: 3.1.3 9 | * 10 | * Requires: 1.2.2+ 11 | */ 12 | ;(function(c){"function"===typeof define&&define.amd?define(["jquery"],c):"object"===typeof exports?module.exports=c:c(jQuery)})(function(c){function l(b){var a=b||window.event,h=[].slice.call(arguments,1),d=0,e=0,f=0,g=0,g=0;b=c.event.fix(a);b.type="mousewheel";a.wheelDelta&&(d=a.wheelDelta);a.detail&&(d=-1*a.detail);a.deltaY&&(d=f=-1*a.deltaY);a.deltaX&&(e=a.deltaX,d=-1*e);void 0!==a.wheelDeltaY&&(f=a.wheelDeltaY);void 0!==a.wheelDeltaX&&(e=-1*a.wheelDeltaX);g=Math.abs(d);if(!m||g p; ) { 5 | var u = a++, 6 | e = c[u], 7 | o = t.call(e, 1); 8 | o.push(l(u)), 9 | ++p, 10 | e[0].apply(null, o) 11 | } 12 | } 13 | function l(n) { 14 | return function (u, t) { 15 | --p, 16 | null == s && (null != u ? (s = u, a = d = 0 / 0, o()) : (c[n] = t, --d ? i || e() : o())) 17 | } 18 | } 19 | function o() { 20 | null != s ? m(s) : f ? m(s, c) : m.apply(null, [ 21 | s 22 | ].concat(c)) 23 | } 24 | var r, 25 | i, 26 | f, 27 | c = [ 28 | ], 29 | a = 0, 30 | p = 0, 31 | d = 0, 32 | s = null, 33 | m = u; 34 | return n || (n = 1 / 0), 35 | r = { 36 | defer: function () { 37 | return s || (c.push(arguments), ++d, e()), 38 | r 39 | }, 40 | await: function (n) { 41 | return m = n, 42 | f = !1, 43 | d || o(), 44 | r 45 | }, 46 | awaitAll: function (n) { 47 | return m = n, 48 | f = !0, 49 | d || o(), 50 | r 51 | } 52 | } 53 | } 54 | function u() { 55 | } 56 | var t = [ 57 | ].slice; 58 | n.version = '1.0.7', 59 | 'function' == typeof define && define.amd ? define(function () { 60 | return n 61 | }) : 'object' == typeof module && module.exports ? module.exports = n : this.queue = n 62 | }(); 63 | -------------------------------------------------------------------------------- /static/src/chart.js: -------------------------------------------------------------------------------- 1 | /** 2 | * echart图表库 3 | * 4 | * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 5 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 6 | */ 7 | define(function (/*require*/) { //chart 8 | var self = {}; 9 | 10 | var _chartLibrary = {}; //echart图表库 11 | 12 | /** 13 | * 定义图形实现 14 | * @param {Object} name 15 | * @param {Object} clazz 图形实现 16 | */ 17 | self.define = function (name, clazz) { 18 | _chartLibrary[name] = clazz; 19 | return self; 20 | }; 21 | 22 | /** 23 | * 获取图形实现 24 | * @param {Object} name 25 | */ 26 | self.get = function (name) { 27 | return _chartLibrary[name]; 28 | }; 29 | 30 | return self; 31 | }); -------------------------------------------------------------------------------- /static/src/component.js: -------------------------------------------------------------------------------- 1 | /** 2 | * echart组件库 3 | * 4 | * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 5 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 6 | * 7 | */ 8 | define(function (/*require*/) { // component 9 | var self = {}; 10 | 11 | var _componentLibrary = {}; // echart组件库 12 | 13 | /** 14 | * 定义图形实现 15 | * @param {Object} name 16 | * @param {Object} clazz 图形实现 17 | */ 18 | self.define = function (name, clazz) { 19 | _componentLibrary[name] = clazz; 20 | return self; 21 | }; 22 | 23 | /** 24 | * 获取图形实现 25 | * @param {Object} name 26 | */ 27 | self.get = function (name) { 28 | return _componentLibrary[name]; 29 | }; 30 | 31 | return self; 32 | }); -------------------------------------------------------------------------------- /static/src/component/grid.js: -------------------------------------------------------------------------------- 1 | /** 2 | * echarts组件: 网格 3 | * 4 | * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 5 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 6 | * 7 | */ 8 | define(function (require) { 9 | var Base = require('./base'); 10 | 11 | // 图形依赖 12 | var RectangleShape = require('zrender/shape/Rectangle'); 13 | 14 | var ecConfig = require('../config'); 15 | var zrUtil = require('zrender/tool/util'); 16 | 17 | /** 18 | * 构造函数 19 | * @param {Object} messageCenter echart消息中心 20 | * @param {ZRender} zr zrender实例 21 | * @param {Object} option 图表选项 22 | * @param {number=} option.grid.x 直角坐标系内绘图网格起始横坐标,数值单位px 23 | * @param {number=} option.grid.y 直角坐标系内绘图网格起始纵坐标,数值单位px 24 | * @param {number=} option.grid.width 直角坐标系内绘图网格宽度,数值单位px 25 | * @param {number=} option.grid.height 直角坐标系内绘图网格高度,数值单位px 26 | */ 27 | function Grid(ecTheme, messageCenter, zr, option, myChart) { 28 | Base.call(this, ecTheme, messageCenter, zr, option, myChart); 29 | 30 | this.refresh(option); 31 | } 32 | 33 | Grid.prototype = { 34 | type: ecConfig.COMPONENT_TYPE_GRID, 35 | 36 | getX: function () { 37 | return this._x; 38 | }, 39 | 40 | getY: function () { 41 | return this._y; 42 | }, 43 | 44 | getWidth: function () { 45 | return this._width; 46 | }, 47 | 48 | getHeight: function () { 49 | return this._height; 50 | }, 51 | 52 | getXend: function () { 53 | return this._x + this._width; 54 | }, 55 | 56 | getYend: function () { 57 | return this._y + this._height; 58 | }, 59 | 60 | getArea: function () { 61 | return { 62 | x: this._x, 63 | y: this._y, 64 | width: this._width, 65 | height: this._height 66 | }; 67 | }, 68 | 69 | getBbox: function() { 70 | return [ 71 | [ this._x, this._y ], 72 | [ this.getXend(), this.getYend() ] 73 | ]; 74 | }, 75 | 76 | /** 77 | * 实在找不到合适的地方做了,各种粗暴的写法~ -_- 78 | */ 79 | refixAxisShape: function(component) { 80 | var zeroX; 81 | var zeroY; 82 | var axisList = component.xAxis._axisList.concat(component.yAxis._axisList); 83 | var len = axisList.length; 84 | var axis; 85 | while (len--) { 86 | axis = axisList[len]; 87 | if (axis.type == ecConfig.COMPONENT_TYPE_AXIS_VALUE 88 | && axis._min < 0 89 | && axis._max >= 0 90 | ) { 91 | axis.isHorizontal() 92 | ? (zeroX = axis.getCoord(0)) 93 | : (zeroY = axis.getCoord(0)); 94 | } 95 | } 96 | if (typeof zeroX != 'undefined' || typeof zeroY != 'undefined') { 97 | len = axisList.length; 98 | while (len--) { 99 | axisList[len].refixAxisShape(zeroX, zeroY); 100 | } 101 | } 102 | }, 103 | 104 | refresh: function (newOption) { 105 | if (newOption 106 | || this._zrWidth != this.zr.getWidth() 107 | || this._zrHeight != this.zr.getHeight() 108 | ) { 109 | this.clear(); 110 | this.option = newOption || this.option; 111 | this.option.grid = this.reformOption(this.option.grid); 112 | 113 | var gridOption = this.option.grid; 114 | this._zrWidth = this.zr.getWidth(); 115 | this._zrHeight = this.zr.getHeight(); 116 | this._x = this.parsePercent(gridOption.x, this._zrWidth); 117 | this._y = this.parsePercent(gridOption.y, this._zrHeight); 118 | var x2 = this.parsePercent(gridOption.x2, this._zrWidth); 119 | var y2 = this.parsePercent(gridOption.y2, this._zrHeight); 120 | 121 | 122 | if (typeof gridOption.width == 'undefined') { 123 | this._width = this._zrWidth - this._x - x2; 124 | } 125 | else { 126 | this._width = this.parsePercent(gridOption.width, this._zrWidth); 127 | } 128 | this._width = this._width <= 0 ? 10 : this._width; 129 | 130 | if (typeof gridOption.height == 'undefined') { 131 | this._height = this._zrHeight - this._y - y2; 132 | } 133 | else { 134 | this._height = this.parsePercent(gridOption.height, this._zrHeight); 135 | } 136 | this._height = this._height <= 0 ? 10 : this._height; 137 | 138 | this._x = this.subPixelOptimize(this._x, gridOption.borderWidth); 139 | this._y = this.subPixelOptimize(this._y, gridOption.borderWidth); 140 | 141 | this.shapeList.push(new RectangleShape({ 142 | zlevel: this._zlevelBase, 143 | hoverable: false, 144 | style: { 145 | x: this._x, 146 | y: this._y, 147 | width: this._width, 148 | height: this._height, 149 | brushType: gridOption.borderWidth > 0 ? 'both' : 'fill', 150 | color: gridOption.backgroundColor, 151 | strokeColor: gridOption.borderColor, 152 | lineWidth: gridOption.borderWidth 153 | // type: this.option.splitArea.areaStyle.type, 154 | } 155 | })); 156 | this.zr.addShape(this.shapeList[0]); 157 | } 158 | } 159 | }; 160 | 161 | zrUtil.inherits(Grid, Base); 162 | 163 | require('../component').define('grid', Grid); 164 | 165 | return Grid; 166 | }); -------------------------------------------------------------------------------- /static/src/theme/default.js: -------------------------------------------------------------------------------- 1 | /** 2 | * echarts默认主题,开发中 3 | * 4 | * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 5 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 6 | * 7 | */ 8 | define(function() { 9 | var config = { 10 | }; 11 | 12 | return config; 13 | }); -------------------------------------------------------------------------------- /static/src/util/accMath.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 高精度数学运算 3 | */ 4 | define(function() { 5 | // 除法函数,用来得到精确的除法结果 6 | // 说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 7 | // 调用:accDiv(arg1,arg2) 8 | // 返回值:arg1除以arg2的精确结果 9 | function accDiv(arg1,arg2){ 10 | var s1 = arg1.toString(); 11 | var s2 = arg2.toString(); 12 | var m = 0; 13 | try { 14 | m = s2.split('.')[1].length; 15 | } 16 | catch(e) {} 17 | try { 18 | m -= s1.split('.')[1].length; 19 | } 20 | catch(e) {} 21 | 22 | return (s1.replace('.', '') - 0) / (s2.replace('.', '') - 0) * Math.pow(10, m); 23 | } 24 | 25 | // 乘法函数,用来得到精确的乘法结果 26 | // 说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。 27 | // 调用:accMul(arg1,arg2) 28 | // 返回值:arg1乘以arg2的精确结果 29 | function accMul(arg1, arg2) { 30 | var s1 = arg1.toString(); 31 | var s2 = arg2.toString(); 32 | var m = 0; 33 | try { 34 | m += s1.split('.')[1].length; 35 | } 36 | catch(e) {} 37 | try { 38 | m += s2.split('.')[1].length; 39 | } 40 | catch(e) {} 41 | 42 | return (s1.replace('.', '') - 0) * (s2.replace('.', '') - 0) / Math.pow(10, m); 43 | } 44 | 45 | // 加法函数,用来得到精确的加法结果 46 | // 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 47 | // 调用:accAdd(arg1,arg2) 48 | // 返回值:arg1加上arg2的精确结果 49 | function accAdd(arg1, arg2) { 50 | var r1 = 0; 51 | var r2 = 0; 52 | try { 53 | r1 = arg1.toString().split('.')[1].length; 54 | } 55 | catch(e) {} 56 | try { 57 | r2 = arg2.toString().split('.')[1].length; 58 | } 59 | catch(e) {} 60 | 61 | var m = Math.pow(10, Math.max(r1, r2)); 62 | return (Math.round(arg1 * m) + Math.round(arg2 * m)) / m; 63 | } 64 | 65 | //减法函数,用来得到精确的减法结果 66 | //说明:javascript的减法结果会有误差,在两个浮点数减法的时候会比较明显。这个函数返回较为精确的减法结果。 67 | //调用:accSub(arg1,arg2) 68 | //返回值:arg1减法arg2的精确结果 69 | function accSub(arg1,arg2) { 70 | return accAdd(arg1, -arg2); 71 | } 72 | 73 | return { 74 | accDiv : accDiv, 75 | accMul : accMul, 76 | accAdd : accAdd, 77 | accSub : accSub 78 | }; 79 | }); -------------------------------------------------------------------------------- /static/src/util/coordinates.js: -------------------------------------------------------------------------------- 1 | /** 2 | * echarts坐标处理方法 3 | * 4 | * @author Neil (杨骥, yangji01@baidu.com) 5 | */ 6 | 7 | define( 8 | function (require) { 9 | var zrMath = require('zrender/tool/math'); 10 | 11 | /** 12 | * 极坐标转直角坐标 13 | * 14 | * @param {number} 半径 15 | * @param {number} 角度 16 | * 17 | * @return {Array.} 直角坐标[x,y] 18 | */ 19 | function polar2cartesian(r, theta) { 20 | return [r * zrMath.sin(theta), r*zrMath.cos(theta)]; 21 | } 22 | 23 | /** 24 | * 直角坐标转极坐标 25 | * 26 | * @param {number} 横坐标 27 | * @param {number} 纵坐标 28 | * 29 | * @return {Array.} 极坐标[r,theta] 30 | */ 31 | function cartesian2polar(x, y) { 32 | return [Math.sqrt(x * x + y * y), Math.atan(y / x)]; 33 | } 34 | 35 | return { 36 | polar2cartesian : polar2cartesian, 37 | cartesian2polar : cartesian2polar 38 | }; 39 | } 40 | ); -------------------------------------------------------------------------------- /static/src/util/ecData.js: -------------------------------------------------------------------------------- 1 | /** 2 | * echarts通用私有数据服务 3 | * 4 | * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 5 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 6 | * 7 | */ 8 | define(function() { 9 | /** 10 | * 打包私有数据 11 | * 12 | * @param {shape} shape 修改目标 13 | * @param {Object} series 14 | * @param {number} seriesIndex 15 | * @param {number | Object} data 16 | * @param {number} dataIndex 17 | * @param {*=} special 18 | * @param {*=} special2 19 | */ 20 | function pack( 21 | shape, series, seriesIndex, data, dataIndex, name, special, special2 22 | ) { 23 | var value; 24 | if (typeof data != 'undefined') { 25 | value = data.value == null 26 | ? data 27 | : data.value; 28 | } 29 | 30 | shape._echartsData = { 31 | '_series' : series, 32 | '_seriesIndex' : seriesIndex, 33 | '_data' : data, 34 | '_dataIndex' : dataIndex, 35 | '_name' : name, 36 | '_value' : value, 37 | '_special' : special, 38 | '_special2' : special2 39 | }; 40 | return shape._echartsData; 41 | } 42 | 43 | /** 44 | * 从私有数据中获取特定项 45 | * @param {shape} shape 46 | * @param {string} key 47 | */ 48 | function get(shape, key) { 49 | var data = shape._echartsData; 50 | if (!key) { 51 | return data; 52 | } 53 | 54 | switch (key) { 55 | case 'series' : 56 | case 'seriesIndex' : 57 | case 'data' : 58 | case 'dataIndex' : 59 | case 'name' : 60 | case 'value' : 61 | case 'special' : 62 | case 'special2' : 63 | return data && data['_' + key]; 64 | } 65 | 66 | return null; 67 | } 68 | 69 | /** 70 | * 修改私有数据中获取特定项 71 | * @param {shape} shape 72 | * @param {string} key 73 | * @param {*} value 74 | */ 75 | function set(shape, key, value) { 76 | shape._echartsData = shape._echartsData || {}; 77 | switch (key) { 78 | case 'series' : // 当前系列值 79 | case 'seriesIndex' : // 系列数组位置索引 80 | case 'data' : // 当前数据值 81 | case 'dataIndex' : // 数据数组位置索引 82 | case 'name' : 83 | case 'value' : 84 | case 'special' : 85 | case 'special2' : 86 | shape._echartsData['_' + key] = value; 87 | break; 88 | } 89 | } 90 | 91 | /** 92 | * 私有数据克隆,把source拷贝到target上 93 | * @param {shape} source 源 94 | * @param {shape} target 目标 95 | */ 96 | function clone(source, target) { 97 | target._echartsData = { 98 | '_series' : source._echartsData._series, 99 | '_seriesIndex' : source._echartsData._seriesIndex, 100 | '_data' : source._echartsData._data, 101 | '_dataIndex' : source._echartsData._dataIndex, 102 | '_name' : source._echartsData._name, 103 | '_value' : source._echartsData._value, 104 | '_special' : source._echartsData._special, 105 | '_special2' : source._echartsData._special2 106 | }; 107 | } 108 | 109 | return { 110 | pack : pack, 111 | set : set, 112 | get : get, 113 | clone : clone 114 | }; 115 | }); -------------------------------------------------------------------------------- /static/src/util/ecQuery.js: -------------------------------------------------------------------------------- 1 | /** 2 | * echarts层级查找方法 3 | * 4 | * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 5 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 6 | * 7 | */ 8 | define(function() { 9 | var zrUtil = require('zrender/tool/util'); 10 | 11 | /** 12 | * 获取嵌套选项的基础方法 13 | * 返回optionTarget中位于optionLocation上的值,如果没有定义,则返回undefined 14 | */ 15 | function query(optionTarget, optionLocation) { 16 | if (typeof optionTarget == 'undefined') { 17 | return; 18 | } 19 | 20 | if (!optionLocation) { 21 | return optionTarget; 22 | } 23 | 24 | optionLocation = optionLocation.split('.'); 25 | var length = optionLocation.length; 26 | var curIdx = 0; 27 | while (curIdx < length) { 28 | optionTarget = optionTarget[optionLocation[curIdx]]; 29 | if (typeof optionTarget == 'undefined') { 30 | return; 31 | } 32 | curIdx++; 33 | } 34 | 35 | return optionTarget; 36 | } 37 | 38 | /** 39 | * 获取多级控制嵌套属性的基础方法 40 | * 返回ctrList中优先级最高(最靠前)的非undefined属性,ctrList中均无定义则返回undefined 41 | */ 42 | function deepQuery(ctrList, optionLocation) { 43 | var finalOption; 44 | for (var i = 0, l = ctrList.length; i < l; i++) { 45 | finalOption = query(ctrList[i], optionLocation); 46 | if (typeof finalOption != 'undefined') { 47 | return finalOption; 48 | } 49 | } 50 | } 51 | 52 | /** 53 | * 获取多级控制嵌套属性的基础方法 54 | * 根据ctrList中优先级合并产出目标属性 55 | */ 56 | function deepMerge(ctrList, optionLocation) { 57 | var finalOption; 58 | var len = ctrList.length; 59 | while (len--) { 60 | var tempOption = query(ctrList[len], optionLocation); 61 | if (typeof tempOption != 'undefined') { 62 | if (typeof finalOption == 'undefined') { 63 | finalOption = zrUtil.clone(tempOption); 64 | } 65 | else { 66 | zrUtil.merge( 67 | finalOption, tempOption, true 68 | ); 69 | } 70 | } 71 | } 72 | 73 | return finalOption; 74 | } 75 | 76 | return { 77 | query : query, 78 | deepQuery : deepQuery, 79 | deepMerge : deepMerge 80 | }; 81 | }); -------------------------------------------------------------------------------- /static/src/util/kwargs.js: -------------------------------------------------------------------------------- 1 | define(function (){ 2 | function kwargs(func, defaults) { 3 | /*jshint maxlen : 200*/ 4 | var removeComments = new RegExp('(\\/\\*[\\w\\\'\\,\\(\\)\\s\\r\\n\\*]*\\*\\/)|(\\/\\/[\\w\\s\\\'][^\\n\\r]*$)|(\\/]*>)', 'gim'); 5 | var removeWhitespc = new RegExp('\\s+', 'gim'); 6 | var matchSignature = new RegExp('function.*?\\((.*?)\\)', 'i'); 7 | // get the argument names from function source 8 | var names = func.toString() 9 | .replace(removeComments, '') 10 | .replace(removeWhitespc, '') 11 | .match(matchSignature)[1] 12 | .split(','); 13 | 14 | // Check the existance of default, if not create an object 15 | if(defaults !== Object(defaults)){ 16 | defaults = {}; 17 | } 18 | 19 | return function () { 20 | var args = Array.prototype.slice.call(arguments); 21 | var kwargs = args[args.length - 1]; 22 | 23 | // Check the existance of the kwargs 24 | if (kwargs && kwargs.constructor === Object) { 25 | args.pop(); 26 | } 27 | else{ 28 | kwargs = {}; 29 | } 30 | 31 | // Fill the arguments and apply them 32 | for (var i = 0; i < names.length; i++) { 33 | var name = names[i]; 34 | if (name in kwargs) { 35 | args[i] = kwargs[name]; 36 | } 37 | else if(name in defaults && args[i] == null){ 38 | args[i] = defaults[name]; 39 | } 40 | } 41 | 42 | return func.apply(this, args); 43 | }; 44 | } 45 | // As function prototype 46 | // Function.prototype.kwargs = kwargs; 47 | return kwargs; 48 | }); -------------------------------------------------------------------------------- /static/src/util/mapData/geoCoord.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 经纬度坐标,优先于自定计算 3 | */ 4 | define(function() { 5 | return { 6 | 'Russia': [ 100, 60 ], 7 | 'United States of America': [ -99, 38 ] 8 | }; 9 | }); -------------------------------------------------------------------------------- /static/src/util/mapData/geoJson/ao_men_geo.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | return {"type":"FeatureCollection","features":[{"type":"Feature","id":"8200","properties":{"name":"澳门","cp":[113.5715,22.1583],"childNum":1},"geometry":{"type":"Polygon","coordinates":["@@HQFMDIDGBI@E@EEKEGCEIGGEKEMGSEU@CBEDAJAP@F@LBT@JCHMPOdADCFADAB@LFLDFFP@DAB@@AF@D@B@@FBD@FADHBBHAD@FAJ@JEDCJI`gFIJW"],"encodeOffsets":[[116325,22699]]}}],"UTF8Encoding":true}; 3 | }); -------------------------------------------------------------------------------- /static/src/util/mapData/geoJson/fu_jian_geo.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | return {"type":"FeatureCollection","features":[{"type":"Feature","id":"3507","properties":{"name":"南平市","cp":[118.136,27.2845],"childNum":10},"geometry":{"type":"Polygon","coordinates":["@@@knyƒk@ƒKU¥šwV@nkƒWƒzUmk@@lKUa@aVI@UƒKUamKUUVaUI‚@Xƒ@UV@K±IUVVlUbUbUL@KWUXmWk@KkXmmkŃKUƒ™a@amUƒbkUkKWUnwUƒÇwV™UUƒÝUKV£U™@ƒnKWwXLVKm¥@wUXkmWk@ƒ@wX@lU„@šyVImaXwVƒƒ@kŽƒnU@mbk@mlUXƒmU@mV@n@bnW@bUIWJ—ImVUKWbUK@nkKƒaU@W_VUUmWmL@UU@™bUWUL@V@bmVUz@`mUUVVbXL@V™L@lmLUxmVamXkW@xWbU„VbUxkU±@ÅUmmkLUbW@@`kLknVlV@lbXxlVUXVV™ŽU„U@UbWŽkIWVUUUJkI@llbUxVL@V™VƒUU°ULUmWXUV@VULWb@™xm@UaVLVKUa@ƒw@V›bkmVambUUm@@VkK@„@b„xlxX@‚„n¤@Xƒ@@lkLWV@Žn„V„kb@bWJXLWx@nkxmm™bXn@VWVUn@VnJ@bVXl@„™VJXnWbX`lL„UlJVI@Žœ@VXV@Vl@bn@@Æmn@VšxXU@mVIlxšVššnI„l@nVJ‚aXI@mlU@aXkVm°klmnVV_naš°@V@xܦXK„V‚nnUlVXbVK‚LXKV@naV@@VVl@@lXblXšWnLlbVK²nš@@‚VLUnlV@lƒXxô°‚V@UnaUUlKXLVUVVUbVVlUnJVX„@VW@an@lb„@nl@VU@anƒšUVW@kƒaUm@InVVKVU@kUW@Uam@km@kVa@a@™nwšU@WlI@mVI@WXaW_nƒ@™nƒlkkW@U‚¥@kV@Uw@wUƒ@@IXK‚¥VIn@nU@`@Xl@VV„LnašW‚bVaUwnU„@VIšKlV"],"encodeOffsets":[[122119,28086]]}},{"type":"Feature","id":"3504","properties":{"name":"三明市","cp":[117.5317,26.3013],"childNum":11},"geometry":{"type":"Polygon","coordinates":["@@lL@Un@VVna‚bnUlœa@U‚x@„VbULUKVbn@šw‚@XaVK@UVUXWVnVKV¯„VšU@UUKVwka@klJVIVVXUlJXVaV@VƒšUUVWkUWwkaU@UklmlK@_X@ValKnnÆV²@lVVwUaVƒXa@wlXnW‚bnUVwnK@kšK@UWKUaVUnV@_VynU@a@UVKVXšaV@@VnKnXVV‚UX`V@„blL@mVLXaVLnU˜JXIVJ@amX@a@mnUV@„nVWnkl@naV@„ml„@@KmKUam@UU@ƒ@UlKU™Vk™U™K@aVaUwV™U¥UIkJ@wmI@‚mbkwkVW@UXƒKULU`™IVKUa@LƒkkVmUU@WlULUWÅU@I@ƒWW™nU@@w@a@ƒUam_XyVIVWkkƒ@mwVKXUV@nw˜VXkWƒÅ™U@ƒaƒU¯KUnƒK@ƒ¯šmUƒLXŽVLnWVbVbUVm@Ub¯¼W@amƒ`kb™amLUUUƒ™aUXV`@x@XmJ@n@L@xkJUU@kU@mWm@kUUwUUVWl@VUkIƒy@kkaVUUm™IWVXbWxU@k„mVkK@nWVX¦WxU@@bkx@VU@WŽk@™kUbmJUUmkUW@_kKWKƒ@knV¤kIUKWLUbV‚@Wbk@@VWL@VkI@lUXVxUVU@@mWIƒV@a¯nUaƒaUV@„ƒJ™b@bÞ°VbUš@X™aUVmL@‚VXblŽnV„°˜n@Vnx„@VUUUlK@InJVb@„Vlnn@V™L@VWJU„x@XlJUVVVl@LUUUJ@Lƒ„@lUL°¦k˜V„VnV@„xV„„l@blLnlšLVaXll@šnVUn@‚xn@nml°‚X@lb"],"encodeOffsets":[[119858,27754]]}},{"type":"Feature","id":"3508","properties":{"name":"龙岩市","cp":[116.8066,25.2026],"childNum":7},"geometry":{"type":"Polygon","coordinates":["@@ša„I@ƒVU„bVb°m@b„UXJ@nV@VUUwVW@klJ@UXK@Ul@Xa‚@UVaXKVLlJU£lm„@XLlL@`VXnlVVnIVašll@XV@@Ulw@aV@XwW¥XU@mlLnUlƒV@XwWaXUšJVnUVlb@l„zlJUVk@UXVVVxlVn@nXV@@lVVlI@w@K@mnI@W@wU_VWšbV„VVnKšbla„_n‚bX@°»Van@VUUaUamXUKW„K@a@Ukƒ@wWkXƒWW@wUU™Kw@_lyƒwUkU@@Uƒ@kamVmƒXašUVUka@Wk@»UUUVƒKkbWU™VUbk@mkƒxkƒƒKnIVUmW@kUKmXUmVaU@kU@m@KUWVkIWJ@ŽU@UI@wUUUa@KW»nU@mVkUmm@XwWU@ƒUUmL@ƒw@mnƒVUU@aWak@@amxU@UxULWVXbVLU`mbUImVU„ƒbn‚V@@bVn@bnVWxLmyUbƒIUKƒ@aƒVm™akbV‚UXW„UlKWbkV@„WLUlk@@nšbƒb@lkKmU@ƒUIWJkw¯UUVVxm@@XkbWx—›XKƒlUzWJkUUL@bmKkVƒ@@VUIUlWV@X„K@VkbWx°xUb@LUbk@@VWb@LXJ@VWXU@@bUVV„VVn@VVlLn„@l„@‚xk¦Vx@bVJXbƒn@JlnXxV@@„nJ@X@V@lmx„bUn@xVL@VVKlL@l„„nLVaVL@xkl@LƒxVl°š„X„WVX„Vl„œJWnxlJ"],"encodeOffsets":[[119194,26657]]}},{"type":"Feature","id":"3509","properties":{"name":"宁德市","cp":[119.6521,26.9824],"childNum":9},"geometry":{"type":"Polygon","coordinates":["@@@LVKVaVaUkVU²J@LVU„@@W‚VJUbVVnLVb„L@VUJ@bVbkL@Žl@Vn„y„XmlU@™xV¦„L@Ž„lmz@lnL@bVVšbVb@l„nšKVk„Vl¤@zXV@šl@XJVLVKnXVK‚VnU@wUm@šKUƒ@UlVlw@U@U@ƒUaUKlU@kXKlmXIWKXaVIVUVK@KU@@k„JVUnLVJUL@V‚IVa@VnLšKUnl`Vb„V„V@š‚Vbn@Vzn@lKnVlI„VVKUalkXJl@XXVWVLVUUmVU@Unm„£lK@Uk@WUXK@U@WVwVkšƒĠkĢǰaUÅUwmaţƒɱUÇa™w„±V¹XalKôx„@„UVaÜʓͿVóbÅLƒJm„¯Vk¦ƒŽk@mamXkKUƒUL›akbk@mV@LkJWb@Vk„mXk@UVmaUV@amLUKUamI@KUaU@WbU@UUUƒUIWJUkm@šƒw™Kk„VJm@kxǁVƒUK@mUVUkmlkkVm@amwƒLVWU@UbVLkšUbƒ@VƒmK@XaVWU_VJnwV@@kUmWakxƒ@kwWakIWxnbUJ™zƒ@kVW@@x@„XllnVW@xn¦ULWKXxmL@„VšU¤VL„ÞVVUšÈxV„mxXVlLlV„anV@bšbV„„LlÆnnlW@LXlWnXV"],"encodeOffsets":[[121816,27816]]}},{"type":"Feature","id":"3501","properties":{"name":"福州市","cp":[119.4543,25.9222],"childNum":9},"geometry":{"type":"Polygon","coordinates":["@@lxna@nJ@xlIVJV¦UšVxUb@bšLšVUlVškL@V@„VVn@Vb‚Ln‚@LU„lJXblx„@lwXbVn@lU@mxUIV`UXWb@‚nLU„„@Val™UKVaV@UX„Knx‚bn@lUkllnUVnV‚@VLU„È‚lwn@UIlƒšL„x‚™n@VlXIVJV„VVV@XaV@Vb@LnJVbVLnK@bVUnbVUl@nWlƒ@UXalI@KnUl@laœbVKV„lLnWnbl@„l¥°Unƒ„IÆKôa΀U„a@UUwÇWǓIUWUÅVkƨm@ƒ@£@KmLU¤ULˣJ™kUƒVǟUUķ@ĉVƒKUk@Ѱwôǚç@īšé@Åţ¥mīÛkm¼Å@ƒVķVó°ō¦U°ƒn@bVJXVVL@bUŽƒakLmx@xmxXzW`XbWnXV@bWLÛ@™aƒ@ƒaXbWVkaÝwU@mlWKkLWWkLUKULW@kVmVUU݁UamV—¤›n@xUVUzkJV¦lJU„"],"encodeOffsets":[[121253,26511]]}},{"type":"Feature","id":"3506","properties":{"name":"漳州市","cp":[117.5757,24.3732],"childNum":10},"geometry":{"type":"Polygon","coordinates":["@@@bl@Xb@bVVUŽm„@n„x‚@nKVV@„XVWxn@VnUl@nmVX¼@LVbVV@xVJV@@XIlJXU‚V@Ln‚@lVV@UbVnnWVL@lnXUVmJ„Ll„„wnll@VašUXVla„LVUVV@¼Xl@lbUV™VWbn„nUlb„@@VV@„aVUšmlUašUny@kU@Wkk@WaUVk@@ammk@@U@UlU@aUa@wl@šmXLllnL‚U@anVnU@L@VVV@KlXnWVnVanUšw@w@wm›nÅ@wƒaUam@Uk„mUl@@a„a@U@¥škôK‚wȯ°w@ŻkwǕaK›ÑÛk@ĕōřċ£ĵƒUKW»kÅŻLU@Ulġw@¤Vz™VUbkKUbmLmlULU¼UxmbXl@bWVƒb@bUnV‚UšVbULU@@VkbVL@`U@WX@ŽXV@b°„@b¯š@¤@Xm@@b@`U„VVUL"],"encodeOffsets":[[119712,24953]]}},{"type":"Feature","id":"3505","properties":{"name":"泉州市","cp":[118.3228,25.1147],"childNum":9},"geometry":{"type":"Polygon","coordinates":["@@Vl„xkz@`‚xšLVV@xXXW„Xl@xl„@V@bnV°™@„„LVm°L„V„bV@ƚX„Wl—UmxU@WVULnx„@llUXUJWzn`Vb@„@b@xV@šmXX@„@JÆVVXVKXkV@nVlU„l@KVbULšJV_VK„LVWX@lUVƒkIU¥lIVyVU@wœm˜£nUVWU@aƒm@UmWw@UX@@am™VUn@@aUUlUVanaWUXWmUnkšK@VšUlVVUUwš@XLWWX™ma@knm‚bVb„VXbVL‚@XJlInlšL„w˜mXóšw@çV»ÇçŋaķƧóƅóKġ°nÅUķƑUÇW@—¯xǰöÆlV„n@llšaš@„Lšbƒ`™@™„VšXVƒVx@V@bULVJUk‚Ç@ƒ¼ƒXUKk@mmULkaWbk@ƒx@UkL@a@K@U@UmKmbU@kV@UmVUbUmmXkW@LUU@U@KmVmU@bVmKkkWK™nk@@xVb@bkV@V@Vl@nn@bl@VUXbl@XlV@@lmz™VVbkŽ™nUVƒb"],"encodeOffsets":[[120398,25797]]}},{"type":"Feature","id":"3503","properties":{"name":"莆田市","cp":[119.0918,25.3455],"childNum":2},"geometry":{"type":"Polygon","coordinates":["@@VbނVVnUlUX@VKVLlKXXlKXL‚‚nkV@ÞxlbXUWa„b„@šbÜ@XK@aWUXmWaX_Wynw@wnwlK„bV@aUKWUUI@a„mV¯Ŏ¥ô¯ĸU„UÆ@n»¯aƿé@ţ¯nĉĬÝK™óó@™ÑU¼@è™xWô—nƒx™KmkkJWI@UKWaƒUUaamn@lnbWšXXWK™@VxUVkU™V@U™LmlnVWXXVmbUbkVVV@bm@UVnš@bW@@VXx‚n@V„n@bV‚UX"],"encodeOffsets":[[121388,26264]]}},{"type":"Feature","id":"3502","properties":{"name":"厦门市","cp":[118.1689,24.6478],"childNum":1},"geometry":{"type":"Polygon","coordinates":["@@@VlUV@nanL@V@V@L@blK@V„wl@XalbVKnnl@VL„W„»È@lVUIVK@a@UUw„WUU™šƒš@„_™aƒK™@™bkkm@UƒkõŁxóL™l@¦@Vƒb@bk@VŽƒnVln@Vb„b@xmÆnœ@x@x™x"],"encodeOffsets":[[120747,25465]]}}],"UTF8Encoding":true}; 3 | }); -------------------------------------------------------------------------------- /static/src/util/mapData/geoJson/ji_lin_geo.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | return {"type":"FeatureCollection","features":[{"type":"Feature","id":"2224","properties":{"name":"延边朝鲜族自治州","cp":[129.397,43.2587],"childNum":8},"geometry":{"type":"Polygon","coordinates":["@@Wxĵ„mš@„ó¤VX@@xܼƨš²xWxƒV„V@„XVƒ„„„ƒbWšXllaÞU°Ċ„@ô¼„LôÝWanV¥ƒÑnĉ°¥šÅX¥°¯@w°w@»°k£°mÈŹ‚mÈbƃŎ¦„K°z@Žkxl¦UbU¤šššklV„KŤÞȰ@@bšV@nVVUlÞ¦lUllœVlU°ÑU¯Vƒ°w„bXxl@V޲„˜@n„ô¼ƒó°™kmVk²ĕ‚w@wV™ÞÞ@@Ġƒö»˜¯œ@‚„šbnb°mÞ¯°V°„ÈJmX¥mam™UřƒUƒlaU¯™ƒ@w™Kk—l±n@@wƒkÝVUUl±¯I¯b™a™lƒ@™kLmakbƒ@ġƒŹé°™Þb°šékƒƒLm™„wX™‚aÅb@bVlƒbVb—ÒVbUb›UUanwƒakbVŽUV›ak„¯„UŽƒLmxV°UxnôŻX@J„Xkl‚bkbĉaƒbƒWU„ƒ@ƒk„WUU¯@@klmƒ@@™Å@aƒwWXlKkI@WbUaVIUanUƒƒ@ĕƒ¯K™„mUnWUwm@£ċèkUmbUmm@@nkJUalwk@@nmWUan_óaWmnw±KœIƒwl@UmƒI@an@@mlUÅmV_™KUkƒ@U`@_ƒKUmU™@U¯™mmb¯@kb™ImV¯ƒƒLkbƒKƒƒÛ@ÇnɱJóaÝĢkb@„›x—ÒÇllœ@‚޲V‚„ÆUVV„UÇ°X„óxlV¯„lV@bƒV@n—x›@—¤@„șŎnxV¼knšJ‚nšKX°˜¦UlnVbUbÆVnÞWVX¦llšb@l°œVJôÒnLVbšbXŽ"],"encodeOffsets":[[131086,44798]]}},{"type":"Feature","id":"2202","properties":{"name":"吉林市","cp":[126.8372,43.6047],"childNum":6},"geometry":{"type":"Polygon","coordinates":["@@ôl‚zšaÈV°„šK@„mŽ—LWl™nšVxUV‚È@ŽÝĬUÈn‚ôLša‚„²VmĀkV@„ĠĊnU@b„V@b˜@nl°UVnÞaôJ@bš™V„¦mlkššbmVXx¯@Vxm„nbƒ„šbÈK‚V@bÈL„wĠyônšmnbÜ@nn„V˜x@n²K‚„„J@k„al@nxÞU„Lź±Vwkw¯LWWUš™kŎīVwƒw„°y„Vĕ°wÈVlkÛ»@wW@Uô£@ƒn™ĶƒXwW™aUamKóÑUI¯›@k™akkW¥XUmÝÅUVaUa‚mVk—¥W¯™Lm™IlmU»mwȚō@ƒ˜£kJUÇk@am¯y¯UVwƒa@wġx¦ƒKƒƒ¯X°Ċ¯¦U°ċWULÅa±b¯@UkÅWmVƒ™ƒkIUlóŽċ¹™`óIƒlX„WŽXxmbUƒLݏƒbƧ@ƒx¯bƒÈ—l@xƒš¯zƒaݤ@nšm„VWb²bmn¯J¯Ò@n„š"],"encodeOffsets":[[128701,44303]]}},{"type":"Feature","id":"2208","properties":{"name":"白城市","cp":[123.0029,45.2637],"childNum":5},"geometry":{"type":"Polygon","coordinates":["@@ó™ǩŁ@WlwUaƑwÛÅÇéĉamKƒōÇ@Iƒ™ôġVƒȁÑŹçƒ™ÝUƧċĉwóóÝ@Ƒ»ğL¯ll²@ƆÅV@¦m‚Åb@nmlU²VxšlUn™@VbnW„bÇbk҃š„n@èlnlšU҄ްLšx@¼ĉb@҄šUŽċxՃènLVxƒÒƒbÅJ±a@_ÅJÅnƒŽVb„Kl„nUÜĊ@„Uš™xXVÆn„mšVššJÞ¯V™ĠwšƒXw°xWL„x„KV¦ôU„wVÝǬóÞޙ¼‚‚„ÞkŽVôȘxބU„lVn¦ÞšĊa°w„b°@šbÆw„lŤL²`„z°@V@@™nJVnl@@¥nUmmn„@mwnmmUnk@mlwUaƒLnƒ›wn¯°anƒWakI„ƒÇmXwÆamUXUlJXa‚UUklKUknmÞV@‚K@VWÞ@VkUwVƒ"],"encodeOffsets":[[127350,46553]]}},{"type":"Feature","id":"2207","properties":{"name":"松原市","cp":[124.0906,44.7198],"childNum":5},"geometry":{"type":"Polygon","coordinates":["@@„šźèȂÒU„óĢ„š@JŎȄ‚‚LnŽĊbÈêÜÆƒxVbkx@XǪłôš„kÞ`„šW„b@n°ašbšKšnVw°`š_X`W„š¦„ĊIkmVšakw‚K„x°UÞb„U@lšƒl@°¦œVW„šaÞbšxÞI@mVI@ƒVkŚUWK„¥nL‚a@ƒ„@ȍ„@°ƒÆ@nU@KÞalkUwVékUWw„™kU›VkkƒJk¯@»ókƒV¯ÆÇI@bĉô¯@™ķw¯nmmÅL¯wƒVƒUÞy@UówÇLkmm@@UóxkkĉmL¯wVwkWWX™mLõm@kűV_ƒƒô»ÛƒÆ¯@™Va™VšaĠVlmğwķUóÝƽ£ÇJkbǫaƽLW@nxݤkzƒy¯XɅm@VšôÇX¯Ė¯ºÝnUŽnLVlUÔmV"],"encodeOffsets":[[126068,45580]]}},{"type":"Feature","id":"2201","properties":{"name":"长春市","cp":[125.8154,44.2584],"childNum":5},"geometry":{"type":"Polygon","coordinates":["@@„U°xÆKnn°mĸxš°@Ċó@aÈJ°Å„Uôl@¼l°„IllœUlVƒšXxlVUêVxkllnÈUVll@Vx²IÞ¤VUlVnIôlރlwô_„›„bVaĶLXÅÞÇ@K˜¯@wÛaƒçn¥š¯WXyW¯XwƒUmmÛ@ma™nómğzƒxÇK@aUÇL™a„ƒmanƒUw°@WwnU™al™nkƒ¥šU™@aóIÝbUm¯Vmk—@@aƒU@amVğĉ@ƒlUnÿ±Uƒ™bóKmVÇÞī@ÇVUUw‚™šmXk˜Kn@ƒ™L¯ƒÇU™byókōè@b‚n@lÝX@x¯ô@ƙUV_maXm@aóƒJWxnX@ŽVVnĖVnUJ@nōÆÇ¼V¼kxƒLklÝw@xƒx@zV`ÅbmxU±xU„nnm‚kn‚ŽğU™bUŽ‚šUb@šÅ°Ü„󼄄U`Ʋ@lön‚KšnXWlXUx°xnKĊllôw@Vn@lnÈKôx@VÝz„V"],"encodeOffsets":[[128262,45940]]}},{"type":"Feature","id":"2206","properties":{"name":"白山市","cp":[127.2217,42.0941],"childNum":5},"geometry":{"type":"Polygon","coordinates":["@@Ušl¦kÒÆ°„IlÒU¤ôz„¼lJš„U„n‚ÆXVl°@²aÆbVKČXV¯°¥¯ĉ°W„„„L‚¥Ģw@x„bUx°V°zn‚‚b@ÈlVŽlIœ@˜w@m„U@akU°ƒkUôwWƒÈ¯VUƒVUƒÅ±U›@kÈk˜Ñœw@ƒlaÞġƒUÞ£@ƅ‚KnÑ̝@W‚aUaVUVkkw@a¯@¯™Ý™ƒVXnW@@WkXmK@xkKUb@bW@Uw¯„mmb@WKUbmUbUaWbƒJĉIVW@I—l±LkšmU™bUm™@ƒnkKWa¯n™@„`Ubma™„ĉL@bƚ—@W`ƒL@n¯‚Xb‚@kb@x™Lƒ„™@V‚kL±™™mlUIU¥mL@lÅx@_laƒƒ@U—aƒV@kmmƒK„£ƒƒLƒƒmKUnÅKVbmXVlèĉUUbml„ĢŤƒIlޝbǦœl‚@ô¼Ģ„@x°„l¤„n„a„l@x™b"],"encodeOffsets":[[129567,43262]]}},{"type":"Feature","id":"2205","properties":{"name":"通化市","cp":[125.9583,41.8579],"childNum":7},"geometry":{"type":"Polygon","coordinates":["@@ÆlXnĠx̰lȰš„K„°kXm‚@¦Vbk„ŤJšnݤk„VÞVVkȄb°y„™@w˜k„ǰa„wƨ@„aސ„K‚VnaWwXWƒ„kôJš_ČºôVkƒ»óyV£kуJůlÑk¥V™ša@wƒkƒbƒmk£¯ƒ@wġƒó»@›kÈ¥°ak„JÆ£ƒġnkVaĊVkçWUnUaÆLVmnL„„‚KU™±@—„m@a¯U„bmV¯m@_ƒK™™U™ƒaƒÅ™Wó¹ƒ@UanmWak@@wmI@y™@mk„JVa™@UaƒIkJ@n™@Um±kkxƒm™Ik„ƒbÇm@ްbXn„V@ްÈmlÞ¼¯XVº¯Lm„kWWXLmVVlknƒ@@lnWƙ„Vxbmšnšm„¯lÝaVȁè@¼V„„b™„ÆŽ°ÞUVšJ„„kx›I—xƒƒƒIV¤™ÒXxmn"],"encodeOffsets":[[128273,43330]]}},{"type":"Feature","id":"2203","properties":{"name":"四平市","cp":[124.541,43.4894],"childNum":5},"geometry":{"type":"Polygon","coordinates":["@@Ɇn°W„zlyÞ£mwX@ƾKǬblaÈIƾ¤ôÞĸVĠxnmmVƒ²w‚VnwÆaU_@y„w@wÞxlk„KlwU»È»ŎÅ@mVIUmmĕUU@mWXw„Iô‚@bWnnbU`‚šV@Űó@wÞW@km@aŎ烙@m°Ñ°Inm±aXaƒU™n@mƑšU¦@šÇޝaU£šaU™ġ¦ÅҙJōUŻókUÇ@™¥¯ak¯mUVak@@aċçÅaUƒm¦Ý`XbƄ@n`ƒI™xĊÞōÞml@šUb@Wl™_¯JkšÇUÝÆÅb@n™„llUb¯„±a@ƒ—ƒWĉJġ™Unóšm¤œxôaVnƒxôI@x„V@bmƙ„@lnLmޯޙxVb¯þ"],"encodeOffsets":[[126293,45124]]}},{"type":"Feature","id":"2204","properties":{"name":"辽源市","cp":[125.343,42.7643],"childNum":3},"geometry":{"type":"Polygon","coordinates":["@@żôŎVšIÆÑĢ¥Vš™bV¤°bȍ@™V¥ƒ™Þ£lÇUUUÝlƒÞ£™mţIlƒUa@¥nlWƒ¯ƒL¯™kÇġ¯ğwWmÅk¯UƒVU„„bWlXlmnƒbUx¯xVVknlŽUbV„ÇKUb@„™VnbmlnzUº±bmJUbWÈnèm҄š@X`WL"],"encodeOffsets":[[127879,44168]]}}],"UTF8Encoding":true}; 3 | }); -------------------------------------------------------------------------------- /static/src/util/mapData/geoJson/jiang_su_geo.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | return {"type":"FeatureCollection","features":[{"type":"Feature","id":"3209","properties":{"name":"盐城市","cp":[120.2234,33.5577],"childNum":8},"geometry":{"type":"Polygon","coordinates":["@@„n@‚°ĀÞ°@¦ULWKkx@bkLWb@lUlVXXJVbƒnUKmxXV@bm@@Xš‚„LޚܦXlVnš‚mzVJ@n@‚²ÞôkƃÞaȰĉ‚wnljÜó„éVÛnĊīČlj‚ĉ@ō@KÞUlU@ƒkklÇÈњÑlġXɛ@UġƒƒaU@U_ƒW@n™@kaUL@VW@kKmkUV@bkbWW@bkzma@ƒJWI@KUKULƒ@U¦™`@XUJ™U@KmXƒw¯KXkmy@aUIWJXXmV@K¯UU@@bVL@¤VLXbV@@JVXVK@„„JVn@bkKmakVVXUVVVlI@`U@nzVVƒb@¤n@@UlKXLVVšI@V@nV@V‚@ÈUx@šóVōšƒkÅWó@mU@bk@Ýwk@WbXxm@@J@zV@kVƒbV‚nLWVUX™WUXUŽWLUށ@Wl°z@VkxU@UVWIxWJkbƒĬ„nW@@bUl"],"encodeOffsets":[[122344,34504]]}},{"type":"Feature","id":"3203","properties":{"name":"徐州市","cp":[117.5208,34.3268],"childNum":7},"geometry":{"type":"Polygon","coordinates":["@@XKVX@WnIVx@K°Lnll@@I°K„nVašU°x²mlxš@VanU@aƒk@akmV@@w™@Ua@aUwVwUw@w›@UK@£kaĉlóIÇVkޱ@@kUKmVkIkxW@Ua¯UUm@UVI@WVI„JV@ƒ@Um@Uana„U@m‚I@J@XV@XaVlkXƒVaUUWLUyVIXmWak@ƒXkJókƒJUL@KWkk@ULU@Wa™lUIkJmI™mk„VbVš@lV°kXUKWKULU„mb@VUlVnƒb@VV@IVKUUmU@ak@@bmV@xklƒUƒU@UKmV@nƒJVbkXƒKUamLUJ¯UUVmI™bVV—Ll`@LƒLU`m@kXUVU@V„lxUK@xkIWbUKƒx@V‚kVVn™b¯@@U™@ƒxk‚mbkLÇK™b™@@XnJ@LmVklƒ@@XƒlUƒVkxƒakVVb@bVnUbU@@x˜VUšVb@š„ŽnIĊ`šXVVôJš_„K@xlU²Klk„U„@VaVVÈm@kVUVmnamUUaVƒXIVJ„@‚ç@¥nkVLn›„@@XVK@VUX@JVUV@UnVJVLUJVLUVlšnI„b‚KnU@m°™VanI@anV‚KVL„an„lK„blš„KÞk@¦@¤@„VKnLVK„L„KVzlWšLX@VmV@VbnU°@Ualk™˜WXLVU„KWkUUWšƒ@£Wa"],"encodeOffsets":[[121005,35213]]}},{"type":"Feature","id":"3206","properties":{"name":"南通市","cp":[121.1023,32.1625],"childNum":7},"geometry":{"type":"Polygon","coordinates":["@@VJ@bnzWl°L„xnW@LšVVI@Wš_V¥„@VKVL@LXJ„I‚@nbly@aXXla@aVUnllLX@@UVKlbš@@m„XV`V@„bĢ„lkČÇÆƒȘ¯šwnĕVĉVÿšUƒUĠƒŦğlXÑVǵ@±ōLʵ˝lÇbÝÞ¯xk@Çkķé™n¯@ğŽġƴǫ@kVVlUbƒL@xULǂóLUl¤@nkVV°VLkxVb@l™aUXUKWĖklVX@¤UšƒUkb"],"encodeOffsets":[[123087,33385]]}},{"type":"Feature","id":"3208","properties":{"name":"淮安市","cp":[118.927,33.4039],"childNum":5},"geometry":{"type":"Polygon","coordinates":["@@šnźUôÒɴ胚l¦nĖV‚kbmš„X@xVlVL@xUb@bUJVnUx‚šœ„lKVLÈx‚m„zXV@lW@XV‚b@bȚVxnb‚ƒVIXa°L„aÆVVaXUlK@aXIƄVlXKVUlIXalK@alwXLVK@¥Ý¯¯ÿ@ƒmVk@aX@ƒm„īlaXI‚wXJVUV@lw@U¯yb›UaƒUġUÅaUKVknaġm@kUm@wÆIV±nLÆw„ÇnUUkƒ@ƅÝU¯JÝI¯¦Ul@bƒ@@VVL@l@LƒLÅmƒL@b™@UaVaUWmLUKV¹KƒLWKX¥WI@mXk@UmaUVUU@VmL@W™bkIUWƒUmVóIkbmm™@UbVLUxmJkU@bkJWbnXU`Wz™KUÞÈlVb™Lmx@„kè@Æ"],"encodeOffsets":[[121062,33975]]}},{"type":"Feature","id":"3205","properties":{"name":"苏州市","cp":[120.6519,31.3989],"childNum":6},"geometry":{"type":"Polygon","coordinates":["@@ôèĊVnX°¤²„lxƒÈÜ@²x@J@b@X‚`nIUƙUUV@bl@VVnL@L@xƒJ@X@blJXnW@@`XbW„kVƒ@UbVxƒXUxkV@LóxVbUVWš²šVJĸklUǬ@ĢƳĠ°@šmƒī°»ÈÇ¥ULUU±a@bU@¯ƒU@KnImUVWUk™mXUVU@lIVaUUVWKUbUkWKU¥n£WakJUkUL›K¯L™KkƒVIn@VaUƒVUUƒ›UkVk@ƒU@amUkJƒ@UUlwX¥W@@UkVmk@JUakL›@kk¯ÝmJUn@nmVXlmbVVkn@„UJ@±WUxV¯a¯KōbżÇxUxƒšUUlWL"],"encodeOffsets":[[122794,31917]]}},{"type":"Feature","id":"3213","properties":{"name":"宿迁市","cp":[118.5535,33.7775],"childNum":4},"geometry":{"type":"Polygon","coordinates":["@@XbWnUJVzXKVVUbW„klUWbU@@W@IJ@nƒVmbVbn@@V@„UŽƒIUJ@XUJ@VVn°VVbX@lwlJnUVL@l²@lÈUôJĊklb@¤VLœ@@xVxUxVx@bVbš@@xU@ln„mnX˜mXLVmV@X@lxVnVJôL„LXa‚x@b„@@KVL@bn@@m@™@alLUUVaU¥nIV±‚I@mXI@aWWXU@LlUXWW_XWmaUwǙ@aaWUX@@kWUƒynÇwUKkL›ƒ™VwUmVI@aVa@wUKUk@wƒWn™laUmĕk¥„™ɳçóÑŹV™mmzkVmm@a@Ióƒk@@LWU@`—„WbXLWlkImJVn@`nXVbXŽmL@Vn@‚l@nUVl°Xx°U@LVĠ@z°˜@¦UV@Xn@VJmV"],"encodeOffsets":[[121005,34560]]}},{"type":"Feature","id":"3207","properties":{"name":"连云港市","cp":[119.1248,34.552],"childNum":5},"geometry":{"type":"Polygon","coordinates":["@@@‚lzXxmÆV„„@@¦„@l`XnlKšXXm‚KnLla„b„@„xmbm@kL@V@Vl@@VUXšJX„mbš@@„°Æ@èÈzlW°XĢJlÈ`lInbšWV_@mš™@UUķnƒôw°ÆmnaVƒVÛVmĸ»Ģw±Ý@@mUIny™UmWkۥݙƒK™@Wn@@aWUnwVL„mUaWIUWVk@kkJUVWLUkŃWJ@bkLWVUbÅUƒb¯KWbUJ„WXX`WXkV@KWVXX@bWJ@nJU²mJV¦UbVVkK@b@š@nm@@aUK@Lƒ@@awWbƒKóKUIUmkwW@U@UnWK—nmWƒn@b„l@bmVUb™@kw±n¯w™VUb"],"encodeOffsets":[[121253,35264]]}},{"type":"Feature","id":"3210","properties":{"name":"扬州市","cp":[119.4653,32.8162],"childNum":5},"geometry":{"type":"Polygon","coordinates":["@@VUXblVVV„b@xV@kz„V@l‚wVLUbVV@VU@VbUbl‚b@nkͰIÞV@Ɔ„VlmVƒÈÅxmKU²ÅJ@xVn@lĢnmbUlVLÆbĢV„V‚bœV‚aXk‚@VXKVVWšXVWXUmKU„aWaU@™¥@£XW‚UUV@@ynam_VWkUVUna@ÆV@mnkWmXkWU„W@k„@@akklƒlWUI@UnKl¥™I@VVma@a@I@U@a@anK@UmK@ÅVUnJl™kI@aVwka@mVIUW@UWL@WÅbmIƒƒULka™UWƒUxkLUKWlXL@VƒImƒÅVƒU™mĉL™Uól¯I±l@ÒUbVbUVVXUJUnVV@lnbl@"],"encodeOffsets":[[121928,33244]]}},{"type":"Feature","id":"3201","properties":{"name":"南京市","cp":[118.8062,31.9208],"childNum":3},"geometry":{"type":"Polygon","coordinates":["@@k@ma@kUUVmVIUWVUUaVa@Ѳk°Jôk@Wmk¯KmX¯aUakKƒƒWU„@XU‚LXaV@@mUaVUUl@VmkaUXm@ƒWUUna°IlmV™m™IUW‚@Uk@@aV@VVX@„V‚I°»nm„U@VKVan@m»UaU@U_@WlIUa™aVaUala@¯n@‚ƒkaUkUUWKU@mwkUUmmL@K@ƒLmUUVƒKƒVÅImU—JƒƒVkVVLšèVLVU@W„L„V„š@nVÜULVŽUL@bW@XbWbkJƒUUVUxVXmVk@WUUkVmIƒV@„nbnVWbƒJU„kUULƒa@Jma@XkK@VVL@L@JƒLUVU@V¼ƒnXlƒbm@kbUKmn@lVb@VXXV‚UV@b@LVbÆxXbl@@lV@U„VV@XVK²VlIš`„UbVbUlVVn@WXn@@VUV@„@KmbVLXқLkKƒV@nX@VVUV@b™nVllbšmnb„IWVXU@`lLlknVnmlLlbUmVInK°nUƒU@l@VU@Vn@„ƒ@alI„`VIXaVaVa"],"encodeOffsets":[[121928,33244]]}},{"type":"Feature","id":"3212","properties":{"name":"泰州市","cp":[120.0586,32.5525],"childNum":5},"geometry":{"type":"Polygon","coordinates":["@@lUU@@y@In@WwXal@Þxl@@anVô@ÆX„lŎ™ôU@™Vw@ÇUU@@m@U™JUUWKkL@Vm@@£„aUUmyV@@_kJUUVUUWlUnblL@aUmƒI@ƒULUW@IU@WaUK@£UK@aV@°V@LnUWWXIla„VV™@£UWlkXĕVLVWšb@kUalwUKU¯lU@mk£VôKȁVK@w„KVaUkķlUI±™ğ¥ÝUʚ™Ž¯ôm¦ƒĸ™‚@XXK@VVXUJ@nlbUx@blJkšmIUV@ÆnL@VmL@b@b@V@J@bnb‚U@UšJk¦mL@VVJkXk„ll@bƒ@@lƒXXVWlXnml@nÅU@ŽmbUVlVUXn`mb@zU@V‚VWX@¤š¦V@Xb"],"encodeOffsets":[[122592,34015]]}},{"type":"Feature","id":"3202","properties":{"name":"无锡市","cp":[120.3442,31.5527],"childNum":3},"geometry":{"type":"Polygon","coordinates":["@@nLƒÒlxUVkL™am@™ƒkVWUULUxVVVbUV@bVLU‚nnź™ÞVĠ¦X™VUUaôw@KlUVw„WUwVa„@lUXƒWa@_X@WmkI@a@W„I@w@KmKUUk@@aVUšVVÅmJ_@W@a@I±wÛ@ƑÇkw±ƒ¯£mWĉUóçƒK¯VkUWK@XkV¯UWabƒmUa™UUb™lln@b@xƒbXŽWX`@„VxUblL@bn@Vb@`m@XbWnn@l¤„n@xnVlU„™VLÆWœkV@VbÞJ‚_nƒl@nKVU@aU™U@mVk°WVLUV¯bVXŽ˜bXlVn@VmL@x—V@bl„š‚@œnW@X@VVJ@²VJVU"],"encodeOffsets":[[123064,32513]]}},{"type":"Feature","id":"3204","properties":{"name":"常州市","cp":[119.4543,31.5582],"childNum":3},"geometry":{"type":"Polygon","coordinates":["@@„L˜ŽnxUbVVƒL@xnnW‚nn@VVXn@‚yœImx„„°ƒšL„a‚¥n@VkšKVw„W@nX„VJ@b‚@UVn„ƒ@UnUV@L‚b@`VLklVÞn„Æ@VaXLl™ÈJšmmVUK@aVUUaUUVwVKXVlUš„n@šblKVUkw„ÑmKUVUI@±UI@U@WmX@›™kƒ@a˜U@wnK@UUmWk—aWU°aVUUK¯XUl@nVŽVš@bUVmLk@m„`ÝIUaU@›lÅXUKƒškVmU@wƒmk£m@XmWan@@_Uam@@akKVaUw@ƒW_XW„a@w@akmm@mL@UJmnUKƒ@@XnJWLkKUb@„Vxk„WƒL—aWVUImVULUK@L@lkLVVVllb„m@@°kbVbUbšbVbkJ@XV`V@Vbn¼"],"encodeOffsets":[[122097,32389]]}},{"type":"Feature","id":"3211","properties":{"name":"镇江市","cp":[119.4763,31.9702],"childNum":4},"geometry":{"type":"Polygon","coordinates":["@@šVĊKšn„VÆUn„„J@UWKXkVLlKVwX„šVlbVK„„nJÆaš„ķn¥°óÇIkšWKUbÅ@mƒUÝlkUK@_a@KVUVm„@mƒVU@@aUIWƒ@mƒXUx™LUlm@¦ƒb™K¯„ƒƒnw›Jzm@UW@UmmXmm@w„KUUVamw—ƒKm@UbUL@ŽƒVmn¯¼JƒUW@UUU@@bl@@VŽVXšJšnnU‚‚k¯JmbVV„Xn@VWlbUnk@VVUŽVb@nU@WbKWVƒ@XV„„lLVb°bnW°Lnl@X"],"encodeOffsets":[[122097,32997]]}}],"UTF8Encoding":true}; 3 | }); -------------------------------------------------------------------------------- /static/src/util/mapData/geoJson/nei_meng_gu_geo.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | return {"type":"FeatureCollection","features":[{"type":"Feature","id":"1507","properties":{"name":"呼伦贝尔市","cp":[120.8057,50.2185],"childNum":13},"geometry":{"type":"Polygon","coordinates":["@@„m@Łkƒ™Žƒklƒôƒ@£kJ°ý™ɅķÑó¤ğLĉÅlÇğŁW¯¯›™ƥóÿlwkţÈéÝƛó™°ÞÅxV¤ĉĖWƒ¯lȭţυ̃ɱÿķƅˋğɱřÝţϙȍƧĊţ@¯kWKUKm¹Å@ķJU@ƧÑƧ„ō¥˹Ɔ@L@„Þ‚VLnš@VōČWJX¦@JŻbU@ţÞmVU@ȁýóbkWWLƒƒÅ™¯UWġkmóƒ±UŹôV¼ƽ¼ƒł̥ĖƽǬʉxĉŽŻȗKΕ̛ʵƨʟÞ˹»Ƨţ»Ǖō˷Ȍ±ȚʊĠUɾɜɨmÜ֞߼˸ƅȂ¯ǖKˢğÈÒǔnƾŎՂ@šĊbôô̐¼ƒ@ĊôĊŽÞĀ™xšĖƧL±ŽœŽ‚Uš°U„°ĬƒČ°ÜƒêɴȂVł°@ƒ„nxŎèƒbȄÞȌ΀Ǹl޲IlxĊl²ÒmšôĖ™Èl„ĵºm„ÈêVþ„xɛČʉÇĵVmš„ÒƒÈɆôƐŰǀĊ°ÆǬĮƾb„yĊ@ĠšƒXǀċm»ôw°Ûk¥Çm¯ç™kkÇǫţǕéX_ĶWǖīŎaÆĵĸĊ@ȚȘ‚™ĊLĢĉ„VÆĉʊÇĕóaU¥šĉ°mkŰġUĠřk°mƒÑČÿ˜ÛƒWĸ£ʠšÆxÈÞŎÞ»ʈ²ĊÇČalÒ°Ť±ĸz„ŽĊKȲm¤Ŏ@Ò°¼nyȂUźīǖƳÈē°@šÝ̓@ƒÈkl¥Ççkxk™›JXÇƒUÅ@˜£k»„óƿīÛ@lÅJl¥óý@¯ƽġƍÅan™ċ™°é¯¹"],"encodeOffsets":[[128194,51014]]}},{"type":"Feature","id":"1529","properties":{"name":"阿拉善盟","cp":[102.019,40.1001],"childNum":3},"geometry":{"type":"Polygon","coordinates":["@@™ƏnǟƨʫšŹɆÿ°¯ÆV²ˢ™żÿ@ÝÆŁȰ¯ȀƳĉó™™@ğkyš¹@īš›ƒwl£Źƒƒ¯Ŧé@™ÇÇxŋĉƩUUŃōL™Ç™ĵóÝnƒóç@™™ó@ġƒƱ„¥ƒç™WUçÆōƒ@é—çťK™çȭVһƽ̻aW¥ȁ£ʵNJǓƲɳޗǔlżÞmĠóĬȂɲȮ@ÈĢŮźÔnĶŻǠšŎȭœгŃċóȭţΗÆƑÞƧÅΫóȘǫɱȁġlÛkǰȁÈnšõl¯ô„ÞɛÝkĢóWĊ„zÇɼʝ@ÇÈķlUČÅÜķnέƒǓKȮŎŎb°ĢǀŌ@ȼôĬmĠğŰōĖƧbЇƧōx@ķó£Ål±ĀƧīXÝġƃêĉK°Ýʇƅ@ΌʉżÅÒϱʈ@˺ƾ֛।࡬ţશóЈèʞUš¤Ґ_޸Ƒʠɽ̦ÝɜL׈ɛϜóȂJϚÈ@ǟͪaÞ»Ȯź"],"encodeOffsets":[[107764,42750]]}},{"type":"Feature","id":"1525","properties":{"name":"锡林郭勒盟","cp":[115.6421,44.176],"childNum":12},"geometry":{"type":"Polygon","coordinates":["@@ʶĬĊIȘƨƨŽ@ĬÛĢșŤĉĬƒĀóšU‚ÈŚÜènŦƐȤȄłϰUƨťƾÑ܆ğɲƜǔÈèʈƲĊƞƒšɆ¯̼V˺Ò˺ȂŤVĢêU܃x„Āˌ˘ƨ„ưѢmÞżU¼ÆlŎ@ĊçŎnÈÒͪŎźƒĸU°lżwUb°°°Vš£ÞlĠĉĊLޏɆnźÞ„n¦ĊaȂīġѝIĉůl»kƒ„™Çý„¥Ŏ¯ƒén£ġљÝȭxƒÇ™@Åçķ»óƱŎ¥™çWÿmlóa£Çb™yVÅČÇV»ÝU¯™KĉýǕċţnġ¯»ÇōUm»ğƒÑ™wƏbċÇŎċwˋÈÛÿʉѰŁkw@óÇ»ĉw™¥VÑŹU™mW»ğğljVÿŤÅźī@ř¯ğnõƐ@ÞÅnŁVljóJƒwĊÑkĕÝw¯nk¥ŏaó¦ĉƒV¦Å`ğуÑÝ@mwn¯m±@óƒÛKˍƏǓ±UšÝ™a¯lƒōšșk„èƒĬގn@ŤġŰk°ċx@œĉ`Ƨĕ°@ţÒĉwmĉ@ƒƒnƒƒa„™¥ķnƒÞĉVóÆókĉŽķ@ÝkƧƧÛaƒ°Ç@ÝÈU˜óbݼ@„ÛÒV°™@V¼ˋL™ÞɅŤŹǠVÞȗŤÇĖŚōbȁƜ"],"encodeOffsets":[[113817,44421]]}},{"type":"Feature","id":"1506","properties":{"name":"鄂尔多斯市","cp":[108.9734,39.2487],"childNum":8},"geometry":{"type":"Polygon","coordinates":["@@ĶL²ĬVłƑkkl@Ȏ™ŘWńÈĬȗ¯™ºlz@ĠššĊôŦô„ÒĠ°kÞܚ™n@¤„UĸèĸbŌÈXŽĸLlÒĢxɲÆ¤ÈÛƾJÈݰUšÅĶ»²VW¯ĸJôšbk‚V@ôlbnĊyÈzVôašb@ĸ‚ÞUl°yǬ²Ǭm°ššk„±lbn°@È»˜JX„VŎÑÆJ@k„LšƒÆl²™Ġ²ʊůĊġ‚řóƛÞÅ@m„ƒmLUÿóĉƧ@™»L@„›`ČĸmšȗÑţů±ĉğl¯Ā™wǎƒçƧŤÛI@±ÜĉǓçō°Uwô™ǫůķƳř±bÅ£™ÓÇwnÑó@ȁƽ@™ƒÇƧĢón»ŏĕóĊ¯b„Å™™VȯÅImƒōKU„™LǓ±Ýxċ—ŋ˜V±Āȗ°™„Źl±šÛ@WÒȁŚŹНŚÅèŌô„¼°ȰɞȂVĊ"],"encodeOffsets":[[109542,39983]]}},{"type":"Feature","id":"1504","properties":{"name":"赤峰市","cp":[118.6743,43.2642],"childNum":10},"geometry":{"type":"Polygon","coordinates":["@@ɲŁĢljĊwƾōÞĭ°_ŎŃźȹƒUČÿl»¯ôķVÿǬƽ™ɅġÅÑǫ»̐ʟȣU™¯wVWݍÈġW»Þ¹m݃ɛŎÿŎōͩůV¹›ō™éċ™óŹÅVVĢǩʈ@Ėċ@ķšÛšV°¯xÇÅţ¥™»°Ûô™ĉʟ„¥WýČ¥™w‚灻±mnÅķ¥ˋVƒbUÒġ»ÅxğLƧ™ƒbWĖÅxš¦U°ÝVóŰlô²@š¥ÜÞÛô„V@²±`𦙄™¯Ý@„ŽÅ„VÒō¼ôš™¤V²ŹĬÇĊƑƒţxƒç¯Lk»ʟlƽýmłÝÆƏ@mö°Ġ@ŚŹĬţÆUĀĠNJĠŽX¼šnźVUҚ¦Ċxȼ@ôlx¯łʊÒÜĀˌÇČxƍČÈƐašx„ÒĠŽn¼ŎVȐ‚¼Ģ°ŤmǖČĊþšLV°ÞŽU¼ċÈUƚzÈa‚¤ôbkŽ‚nXšè"],"encodeOffsets":[[122232,46328]]}},{"type":"Feature","id":"1508","properties":{"name":"巴彦淖尔市","cp":[107.5562,41.3196],"childNum":7},"geometry":{"type":"Polygon","coordinates":["@@²@Ζǀݴʶհĸ„˜ƒ¦Ķ™̒Uˌ¼ӾÇƾ¼̨UÞĉ˜Ƨ—éÝ»ƒĕĉ—ƐȍœōǪakó‚ó¯a@™ôţ™aV¯Þ¯°@²él¥ĵğťwōxó¯k±š—Vó@™aóbUÇyĉzmŽkaóŽU@l™aó‚ķIX°±Uĵ¼™Æ¯VÇÞƽIÇÜÅ£ɱŽġwkÑķKWŋÇķaķçƒV@£šmۙlÝğ¯ƒÑťóǿƴȯ°Åł@ÞŻĀˡš±ŽÅU¯°ɅĀ™źƧʬmǠšƐ"],"encodeOffsets":[[107764,42750]]}},{"type":"Feature","id":"1505","properties":{"name":"通辽市","cp":[121.4758,43.9673],"childNum":8},"geometry":{"type":"Polygon","coordinates":["@@ôƲĸ¼Æèš@„ÈȮwƾ»ʠĢ¥VÆ@²¥@»Ŏњ¯ĊJŤ£k»ÆÇX¯̼ōšī°aX£ôƒƾȁꥄƒ™aôŤ™ĢL°ƒĸ@Ȯ¼ÈÒʈŚôVXůÆaĠƛÈKƒķšĉôÿ@ğÈĉ™»ÇVn™ĉV›wXĠݰšČÿĸwVƒ™¯¯ǵ±™ĉ‚ǫ™ÅÅm»²Ż±ƽIm¥ţÈķ@¯šƧJV»ÞUÝç¯UġºU£ţŽóaÅÅlƒƒ™Ƨī¯K¯Þ݃ğL̑ȍƽ@ōŎōĀƑɜnÞݺX¼ÇĢގUX°xVšʠȤ̏Ǭ¼ÆÒɆ̚ŽǫƾUĀóĸ°‚k¼ċĀƑVŹȺōń¯`ÝĮƽŎĉxġNJɱłō¦"],"encodeOffsets":[[122097,46379]]}},{"type":"Feature","id":"1509","properties":{"name":"乌兰察布市","cp":[112.5769,41.77],"childNum":11},"geometry":{"type":"Polygon","coordinates":["@@ʠǠÞĸɲȺƒÒȂƛŎaƙÈĕȘţUÝźǟɆţšÝˌKU»š@U¯ÜÑ@ƒÞ»ôaV—ÞÇÈ@„¯ÜbƨƨÞlĸ@ĊôlôÅĊU„Ýĸmš¦ƒŽ„bm„„„Ċ@n‚ĊxŤÑ@¯‚ƨĖĊ_@›Čwl¯™ƒȭL›Ý„»ƽ¯ķů„Ǔ@ÇǓbċ™ÅÅÆwÿĠÇU£óaƒ¥¯aŎğĠţkw°»¯ůlÝĵkǻݰɱƧǫaóôɱ»Çk¯ŃóƒʇŐŻ›ĉNJŻĢ„ޝÒÈUl°ƒx°n„Ò™Ĭón™Ċğ°ÇŚĉ¦ʵVƒ°°ĬÛżÇJȁńʇʹó˂ƽŎ›Æţ¦"],"encodeOffsets":[[112984,43763]]}},{"type":"Feature","id":"1522","properties":{"name":"兴安盟","cp":[121.3879,46.1426],"childNum":6},"geometry":{"type":"Polygon","coordinates":["@@ÆXnlŎ°@LVLĠþœxĊUȮĊnU„ĠV@żaW¯XIŎġƒ¥Ý@K@w@K@I˺ŻŎ¦ƨƒƨÒŎIÆ@X@VºnX°lŎ@ƾĉˤƒȘǷȘÑÝݚÞbVţĸÿŤxÈĖƐށêÇKnĸ¥ô@›ķÞUnÒl@UŚaƒīˋƒ¯ÑƧx@±kXřƐƏÛéV™ˋ»lō¯ĉ„ÅÇÓǫޗĖġV@ğ»›°ĵ„ÇÞǓ¼¯m˜ÛÅŃĉĠÇƾb²çƒ™šéż¯VƒƒğÞml»ōÑV痻V¯™¯šĕÆU¯y°k¯¯V»ôDŽѰa@Źk™ġKţšóŽšbƒ„ʦƽȂó„W¤¯b™Ĭ̻ŎW°ÅÈl¼ţ¤ĉI™°ōÒ@¼±¦Å@UŽġ¦ʟŽƽ¼šÞĢÒm¤„êō°ƒ¦Èþƒšl„k¼Ċ۰JĢńȁĬ„°ƒżn‚ÇbV„ݼ@¼óĸţ¤@°Ånšl"],"encodeOffsets":[[122412,48482]]}},{"type":"Feature","id":"1502","properties":{"name":"包头市","cp":[110.3467,41.4899],"childNum":5},"geometry":{"type":"Polygon","coordinates":["@@źxżĀǔÆǬVȘĀŤ¥œÅƾōôˁʈͳȂŃÈIÜŻ¯ī„¯ōm™¯ɱ˝ƒķÒÝIÝ»ÅV™ƒlÅôфġ™ğVmÞnnƒWçkW܁XƝÆwU»Șĕš£ĉÑ𱱚Åk™„ƒK@lÅIō҃UW‚—IǼ¯@m‚kaƒ²™l¯™ǫnǫ±¯zkŽÝVķUô™˜l²ô°ŎwŦxĶĠk¦±ê¯@ݰU°šbóŤ@š°bôlôǩb›ŎƏȎĊ˜„ĖÞ¼˜ê—ƨÝĊ"],"encodeOffsets":[[112017,43465]]}},{"type":"Feature","id":"1501","properties":{"name":"呼和浩特市","cp":[111.4124,40.4901],"childNum":6},"geometry":{"type":"Polygon","coordinates":["@@ʶUĊ¥ÈřĠ¯šĉômšīƒÑ¯m„wk¯ÇV°ÑƒżġĊljǓɱţǓ›ƝóX¯ƒɛÒóa@nÝÆôƜŚĉĢʉŰĊҙ¤ȗĖV¼ÅxWƞۂlXXèm„ÝmUnšĠƒĢóÒkƚ„ÆUÞ¼ÞJĸѰ„ɲĕš°Ŏn"],"encodeOffsets":[[114098,42312]]}},{"type":"Feature","id":"1503","properties":{"name":"乌海市","cp":[106.886,39.4739],"childNum":1},"geometry":{"type":"Polygon","coordinates":["@@Ș°ÇīXњŗ@ȍlkƒlUٱīĵKō¼VŽÇôXĸ¯Ž@šťê„°ź„k¤„x™œ@Ĭ"],"encodeOffsets":[[109317,40799]]}}],"UTF8Encoding":true}; 3 | }); -------------------------------------------------------------------------------- /static/src/util/mapData/geoJson/ning_xia_geo.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | return {"type":"FeatureCollection","features":[{"type":"Feature","id":"6403","properties":{"name":"吴忠市","cp":[106.853,37.3755],"childNum":4},"geometry":{"type":"Polygon","coordinates":["@@nLV‚@šVLšaÞbn@@l˜š@bUVlUV„zVx™¤kÞVèšXnš‚@nm°a@UƒÑ„@VŽXnV@Va„UšŽVKUUU@@U‚@@KVa@U²@‚wXkWnk„±lLnU@UmmVKnIVWnI@UK›@UK@@UVKXkmWLWUXmlkVwUyVa@w„w@aVI„K@aVÈw„KlLVV@LnV„VVnU‚ܲ°WÈIUÆ@nÞ¼‚‚@¦™@UÞUVW@UxUxVn„b„K‚b¯ÞU`VbǬ™V@XXÆVVl°InmnUôƒ°¯‚anam£œWVX‚KXmškôaVU@ƒVak@@wmaƒn@K@UÛUWKXUƒÇƒ@UI™b@alW@akLUKV@@Ukw±Iš›nL@kmwkWmk@JUIƒůVmnnU@m@UƒK„VKlkUwkƒƒnVUKmbkI±š—KƒkmVkKƒb@U@aƒVkUmn™`kIlaUK@UUKmbUIݚUa@mUa@aƒ„m@UUULUK@bmKkbWI@WXwlkXƒWa@k@kKƒLVkkK@L@JUVmzUKlwUUnW˜£XVlKUwVU@aXI@aWaUw@W@_nam@¯‚UkWVkUWaU@nwmJkUVkWVUmUkJ@ImbUaƒ@@WÅ_mJknmak@@mƒXƒaUV@„ƒxUšƒ„@‚ƒ„@VUnkVƒ@Vn@`ULUbWLXVW@kbUJ@XW`@ƒnÅĖWJƒ@—m°@xƒxšbnUa‚w²lƒÞ°xŤIVVULۂWbšbkVVXÆ`UbVL„@kx°LlV@Vœ„WbƒJn@bl¤ULV„°@lmL@ƒƒ£U@@aUwmKULVxUVVx@„™@kU™@mK¯LÇa¯@"],"encodeOffsets":[[108124,38605]]}},{"type":"Feature","id":"6405","properties":{"name":"中卫市","cp":[105.4028,36.9525],"childNum":3},"geometry":{"type":"Polygon","coordinates":["@@°@Èb°KnLš@lVš@@ƒUwVUUwVKnLVx@bV@„¤@„nK@k‚¯UƒVKk£@a‚m„IXa›ƒ@UkU¯Klwƒ@UKVaÅ_UWlU™aXa܁VKUUţJ¯w„ݱkxVbmŽ™a„w@wn¯˜„@XIÆĕ„m‚@X_@WVIlaX@WUXKVaVK@_Um„@lUVm@U„ƒ@„ƒV™„w@ƒVUÛwm@@W@ImKUkU@Ua‚aXƒ@wWaUKkw@UVaUamLU™nk@»±`¯@k—W@Ua™ykbƒI„„@VWJkLWUkJƒwU@ƒn¤mL¯wm@Umƒ²XVWbnV@bmxƒVkxUblLUV@kVWKU¼ƒŽkUƒ@mn@JnV@bUnmJUn@„k‚@XlxšLVVnKlLVV@š@LkKULVbk`WL@lkXW@kVƒ@UÞUlÇX™lkaUbmV¯@@L@šƒV@bkb@xƒlW„—bƒbW@—±@UJ@IU@mVk„VxV@@l„Illœn@Vm@ƒVUbl„@JLmKÛXmVkU›KULU`@LĉwƒKUX„lVUl@Vb„JX¦̼bÞxŎxɜĖĠ„Ŏaô@"],"encodeOffsets":[[108124,38605]]}},{"type":"Feature","id":"6404","properties":{"name":"固原市","cp":[106.1389,35.9363],"childNum":6},"geometry":{"type":"MultiPolygon","coordinates":[["@@Vnn@°xnK‚£„mV@„xlIXVlKXI@Uƒƒ„JlašzVbX@l˜°@²_@¼mlVšnKVbUb@VlxVLXb@xW„bVbV@VlnL@J@Xn@Üx„b„W@nl@nblmnIÆ`@X„@Vbna@aVUUWVkƒ@kbWakbU@VwšW@_l@nmn@@alVlk@UkmVak@@a‚UXaƒL@¯@KVa@axWI@KnkVaVJn_lJ@„X@‚m@nVanUVb@mXLlJ„VWnLla„VVaVX@KXVVkVKlknKVa@aVU@KXb@klJUknUmƒ@K@_UW@alIUamaU¯kJma@IUK@U„@@UW@@aXLVƒVJVaXIƒKlaUkUV@ambUUJkIWJ@wUI™V@JU@UwV@@Um@™nU`@UkUmVUxWUUV@aÅb@aWXkKUUƒUUaWK@wnm@IVU@aXwm@UmVaUalk@anKUwlƒUwlkK@wmaƒUkmmIk@VmkUUbW@UVUnW@kV@xkVmbVnU‚™@UbUV@a›k@kkW@„kLW¤@„nV@VU@W_UV™UU`VLUV@IUVõVULU@UUUJ@wmkUJ@šWI@l@bkKkbVVƒbVbUL@UUJ@Vm@@L@xbVVVLVlVwX@Vb@bmUkbk@@JWIUVÅw@Km@UkWKXxWLÅ@UVUnWK@xkVW„@KULwWVXVWzXVVKVXkV›V@VUbV@U„VV@š@LXxVL@V„b‚Ž„LnKVLVxXVmb@l"],["@@@J@aƒU@LWK¯UUxVVn@Ġ„„LUW@UbUUUa@KUX"]],"encodeOffsets":[[[108023,37052]],[[108541,36299]]]}},{"type":"Feature","id":"6401","properties":{"name":"银川市","cp":[106.3586,38.1775],"childNum":4},"geometry":{"type":"Polygon","coordinates":["@@šUšwVK@UVWÞUšbšw„V@knV˜@@KU_VK@K„ƒn@W_XWlL@Vn@Ċw@Ulaœ@Wanamī@aƒ»ŋó@aÆÅɲÿUaV_°ÝaƒLƒaUmVwVwX@VUVݚ@@¥Ý»@mVÅÇJ¯XÛ±VUmƒUmU@KUUkKƒLÇxUŽ@bƒLUJ@bƒx@xUbVzUxklWnXV‚KnXWlUL@V@ŽVLœ@VL@ŽmJUXmJULnn@VmVkKƒ²mlXWlx±@@VUb@L@@VV@VVUL™ƒVUbU@WmUƒ@„Ò@V¯bmn@VŽƒ„@lVnUšnVWŽXVl@¦VVUn@x‚š@‚XL@¦‚lXxš„Vb"],"encodeOffsets":[[108563,39803]]}},{"type":"Feature","id":"6402","properties":{"name":"石嘴山市","cp":[106.4795,39.0015],"childNum":2},"geometry":{"type":"Polygon","coordinates":["@@U¯ķó±ÇÛ¯™ķmbXb›@kb@Vĉxm@@UkKWXX`m@ƒ„@LULV`@L—@mU@lƒU™x™aÝVUX@VUL™x™VkLWVšš@J„nVLXVlŽUV@zl‚VL@V@b„„n@lU²WVLlLVbUŽVxUx@xǀL˜xôҜk‚K²ŽVa‚U@wXa@W™ÈĉUa@‚bÈk„m@¯"],"encodeOffsets":[[109542,39938]]}}],"UTF8Encoding":true}; 3 | }); -------------------------------------------------------------------------------- /static/src/util/mapData/geoJson/qing_hai_geo.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | return {"type":"FeatureCollection","features":[{"type":"Feature","id":"6328","properties":{"name":"海西蒙古族藏族自治州","cp":[94.9768,37.1118],"childNum":7},"geometry":{"type":"MultiPolygon","coordinates":[["@@„V£°š@laœXô±źwš™ô@„Ulƒża܍n™Kƒw@U„aƒ™ša²L‚mÈLƚÈxlaUa„wÞmÜbÞUšnJ°a„kôƒ‚ÑkwÝVğwÇ@ÝkkV¯¥@ò„»„nŤ¥XImw@mVwša@Åw™mLkaW—wƒ¥l»kçƒó„»@ƒWÑĉŽğ@ĉ„™‚Ń„UwóřVómĵ»™™Ý@VǕ¯kšÝĊÅk™°ÓUklkU±šI„ÇÞkƒ±@šƽJƒ™@UġIk@W¦™VÑșÓÅnťKULnޝX›ƒ@¯mUÛ@WřmóKknōbƒxÝ@ƒŽU@kw@ÿÇLţšÝUkšmwƒŽk™lċVŚU¦™ŽƒLkUWlÅÑ@aƒ@ÅѱUóġʼƒÈĉmŻ@@wkw™Kl¯U™ġ@—„lÇU™Ó¯_ƒ‚Waĉ²Åló¼VbknƒKǎÅ@ƧĢō°Ý@ğ„W™ÅxUUm@™‚ÝXۂW„ULUè¯@mbUaƒLƒbUWġxIUJWz™a¯b™y™@ōÈóLU`ÇXUl™UĉV¯n›mÛbǕLklƒUĉVƒšóaġ„ƏbġKţnkbÝmmnÝWȭȃŽÝXţWókUÇl¯U¯‚ġUɅĀ@°¯„„š¯„VÆnmJ@ĊķnóJUbÝXUlVškL@lVxnnmb@¤Vzš`ÞÞŤ@„VnÆJV„°b„UôJkzlŽkl@²óš@ÆÇ°k˃šÇbÛU@lmb™XV˜kzƒV™ŽɅĀXˢlń„ĬŹ@›éÅ@ĉńưğbUšlŽɜ_°‚@xŦ˜škbVbƒKĢ„ŤVŎް@żÈźlĊ„ôKôb@nôxŦ„Æ@ôŽŎL@þÆb@šnnšWˌbÈx‚InaŎxlU@Ѳ±ƒğVŨƨbɲ@Þ¥ôUUķWVô¯ĊWʶnôaŤˁ@£nmnIôŽǪK°xUXô@Ŧa°m‚kXÆÞVŎkĊ°ÞLȄôyVašIlwX°UVwĢÑÜKôw@nV@œm°nmŽn„Ü‚ɞ£VbmŽXnƒ°ÜÒ@xx@V‚b²UlbkxVnšJUnVVĊ°KȚm°nxÇnn¤±¦@ŽUXVV@„lV„„bmVVȁŽVxšÒ™°šIšbźaȃšbVwš@šƒVL„™ƾÑ@ƒŦô¯ĊkôÑ"],["@@„@šƒ„@n„òVœa‚w²bVxšxÜaČVô_ĊJšIVmšL„a°@Ŏ¥XlK@ƒšk„l„KVbUb˜@nUĢn‚aÈ@lmǬ»Ġ¯œn‚mnƒƨVy™Ñǖ™Ġ»ɲInŽ‚@@ÅĢƳ@¯°™ôV„KÈbVIÇ¥¯@Ýó„™@ÑnīWKšƒk™‚k@¥š™¯™Åa™Xƒ±VÅw@±Ġ¯@»™š™n™Wmw@ƒ™@¯ƒVƒUUWçƒKĉ„a±VkkƒV¯w™x@šUJ‚x@bknÇb™mÅ@Uw±U¯¦UŽ™Kmš¯I¯Žť¼ğĊ™@ǃŹÈ¯@Ý»ÇnˡJƒbÛèÇnƒ„ÅK¯„ġĠʐW¼Ålm„@¤n²ƒŽÝb@b„š¯lƒ¯@ƒšÅ¤W„™¼nV@x„„°@Vx„@lbUblbX¼W‚œšÇ²lšUŽ@¼ŽV¦@bÇlVxUbVxÞbVšœbm¦ƒVV„"]],"encodeOffsets":[[[100452,39719]],[[91980,35742]]]}},{"type":"Feature","id":"6327","properties":{"name":"玉树藏族自治州","cp":[93.5925,33.9368],"childNum":6},"geometry":{"type":"Polygon","coordinates":["@@ɆÿĢV°°VÈklVôŤXÞW„ȮÇÞXnmÞnlaŤmĢLƐãôb„™ĊU„VlkǖKÜaœn°mĊUšVVkÈWV_ôKŎǚ@šz°ašbXyVI‚JĢwVX„a„KVbna°@VçVKXƒÜÞWšn@VVÆwXšĠƒÞ@Ŏ¯ƨġÆ@ȍ„LlmUaô»ÆkĊ±Xb„°`šÔV‚kȘƒĢ@Všk°šLlx@xż@Ċn„Çź»ô̲VÆÒ„@@bÆÒXklV„KšV¥Æ™ČUšk‚l„nxl™çƒ¥ċç@±m¥ƒwÅJƒ@™™™Vƒ„mÈIléÈa°U¥™™@kÞV‚K²ÑWƒ°w²Ñ‚K²ñšyƐ„ÝšVmw„»kkWĉ—JWUƒVÅwƒL™mÅ@@ƒmw„kn¥Vу»°™°@@»„¯„Lla„JônV‚UůƒU@W¯Umѯ¯k@WykU@¯„wV¥ƒkVwţƒk»šwWǜĉĶçšK„ƒÞ™ÇaĉbƒI™lUƒ@kwƒWƒXUƒ°w™±@UšKn£Wĉ—KWxƒkĕVƒšamwXw™@™„Wmnk@aƒVkƒ™bĉLƒl™Imm„wUÇ‚Wx™nÝJn@¥Æ™kwƒaXƒÜĉ™¯ÅV¯¤mkƒx¯kķܙ²VWôŹVUƒƒ@V£™¥@ƒ°wn@™m@¯@UbUôķŽmn@ÆÛ@ÇýVaUÇĊVƒ@Çlğ—¯xÝŤ™lVÈÈVƒx„ƒ¤Vx™„kK@™@ƒx@„kVƒĖġ¥kIWbXŽŎx@nƒxÅUW`ƒ_—@±ŽUa™LUxƒK¯„WbkVlb—bmŽƒLÛÆWIUwƒWkwÝV@kI›ŽéUb›UUk™V¯Km¯k@Umݐ¯m¯›m—L›Þĉ‚ÛUm™ġ£UxkKm°™Lw›šk@kšƒVm„ƒKVUk›@¯a¯Ģ™móKUU™x™ImlÅn™™ÇbXèVVU„°„@ŽšŽ@„‚xXnmš™ššŽ@¼ğ°@²ÆxU‚„²šWÆb°š™š@¦llš™„XLmĬ@҃šÞô°@ȦUJÇaƒLóU¯š@°ġƴ@Ɓ@mɱJğ¼ǕššÒUzƧ‚m„n›mğ°ǫ¼knÇ@bġmmV—@VaUaƒLƒk™l@„kLW‚ō¦¯@ƒb™KUn™JĉIó`ċUÛb™wUw±ax›bñUmƒƒ@™„ƒ@—bƒaƒbǏÅXm˜„ƒÝ„ÅôVbގ™bl„UšÞVޚ„U‚°„VUxƒ@U„V„@l`™¼nL@Ċ„LW„„¤kXķWġXUVVVķ„UbVb@°kVVxÈa‚@ȦĊbšaźJ„U@Ț„„˜Vœƒlš@XkôaWƒĢ™Þ@laĸUÆb²mÞLĠ™ÞÑôbšÒĊa„JVbm¦"],"encodeOffsets":[[93285,37030]]}},{"type":"Feature","id":"6326","properties":{"name":"果洛藏族自治州","cp":[99.3823,34.0466],"childNum":6},"geometry":{"type":"Polygon","coordinates":["@@ÞVŤ™ÈK@ĀlxV@„Þ@„wŎalmôLšnXÆÜ@nV‚°@œ„°WmVKŦLÆmȚԂҚUX¥l@ĢJVš@„ŽƾI@w™W°™™Ån¥›kÅÝVwôƒÈç„@lÑĊĕša„JnaÆLVw°kny°UnkÆVȍĊll¦„Vƾ@@™nUźƒÈǂIn°X„wÞKô¦VWV£„@£°ókċ±I™™am¯Va™»ČĉV¥°™@m„k„¥l@„Ċm@ašU™mwXƒ@wÆxšmĢ_„`VnÆbšKVw„@@ƒnUVğVmVVöIlŽl@@çÛmƒ£UDŽw°@VUƒ¯»m¯ƒJōĖÅLƒa@»ĉ̱`U_k`ÇçšóƒkX™lK@ƒakÝރš£WċkÝ™kxƒJݯÅw™xķxmIÅx„@k±J@ýŋš›¤UœkŽmV™°ÅÝxkwmġƒnÝVU„š¦ƒŤlmšóXk¤™UKƒç™@mVkK@klīƒ£mš¯VUbƒW¯¼ċb¯ĵam¼mVX„m@k¤ÇX‚ÇbƒUƒ„¯J¯„¯È@˜™bVXVҙ¤V¼kxݚV„@l‚V—„WxÛ¦Wš¯šmKnlŽkŽ‚šU‚@nƑUĉ„Ý@ǺۄċUĉ¥™UƒÞŏ™z±òL±Ò¯xX„±ÒLÝU@lššV¦¯‚ÇbkêÇJƒnU„šš@š„‚ÆI„xn¦‚‚@²Č脦‚è"],"encodeOffsets":[[99709,36130]]}},{"type":"Feature","id":"6325","properties":{"name":"海南藏族自治州","cp":[100.3711,35.9418],"childNum":5},"geometry":{"type":"Polygon","coordinates":["@@VxƒŽńƒš@ĊĠŽĊXÒ°UƾĕÞm°£nb@‚@LUUW„Ûº@nlÆǬšĠ£ÞV°UXb‚VȂǵ„éƒ@kWanm°@™x„z„K°¯ĠVšƒVƒkw™Lnm°kÞxÆa„¥@‚wnĉƏ@™œ_l›š_VwšmĸèŤÅČU@™˜Wn@ÑmKU™nğƒK@ƒ°¯UÿV£nmšLl™„UƒUÛé±óókkmƒnƒakV@ǰóÝXƒWəÞťIţxmm™VÛUVȂÓnWyȁĉkƒVš°WnkĊa„¥‚_œK°ÿWna@ƒmU¯wƒlÝIU¤UXó¥ÝLƒx¯WmJÇÈŹ„mV@šƽ@ƒUk¥ĉkċŽÅUml¯Vmz¯lUxÅKmbƒI™bĉĖk҃@Çèó„UxÆÞœlm¦šÆ¯ššX@x™Ž@Ž„²ÝlƒÈ™JV²klVl¯ÔlšĉƙްlUǖÞ@ššĶ¼nŽUôôŚ"],"encodeOffsets":[[101712,37632]]}},{"type":"Feature","id":"6322","properties":{"name":"海北藏族自治州","cp":[100.3711,37.9138],"childNum":4},"geometry":{"type":"Polygon","coordinates":["@@ōmġxƽUm±Lǿþġԙ@kxmWƒb¯I¯‚mIUx@bƒbŹVǎƒkĵbƒlĉI¯¥ƒUšm@ƒÆ¯È@šašóšUlƒČ»@w›œ»›wXaƒƒó°ţç݄kUƒaV¥ÅbÝw¯lmnšKlxU„™„ğU¯°ƒLƒyšw¯@mnXb‚l„@ƒêȁǶUWa¯VÝUğ¤ǫ™kÅ@mܹXƒVV@K@ma¯¤Ýnƽ˝V@„ƒ¼„ôlèk¼„¦˜xXŽlbnKšÆx@Ž™bUx@nnxWJţ¦ƒmƒ¼ñ@ް¦lUÞlÈ@ĠxÞUlxÒó„ƒl¯bmI™ŽÝVÛaÝnƒxVbkbÇwřÇKn±K™b„šƒb@V„xšLmŽÛŽŻbk„ƒVó@™šŹxó²›Wkb™@¯U¤ƒźĊ@lUX„°lÆôU„ƒlLX‚aœV°wšxUb°xÜôÈKVkÈmlwškÈKšwšK™™VUŤĉŎ»„»„Il¥na°LV»²¯Üy@w̃°ĸwlwĢw°±„_lVkš@°ƒbƒÆ¯zƒ‚„š„@l_„@̱lŚVlUaރ„LVƒnKlnȏ°IllČa˜wÞѰx„UU™@wƒVkmĠLô»„KÞýôaÞ¥ôĀÞmƁ„™‚mUƒŎV¥Èl°²°a²¥V„@@w„amm@Ñn@Æ£żƒVƒĠ£@W„¯Þƒšl@š»@Uk@"],"encodeOffsets":[[105087,37992]]}},{"type":"Feature","id":"6323","properties":{"name":"黄南藏族自治州","cp":[101.5686,35.1178],"childNum":4},"geometry":{"type":"Polygon","coordinates":["@@ôl²ôÜê„VƒVkš™KmnU¤V°@„„LmĠVšnLÈL@alb@al@n°Vš_XmWUÈamaVIn@n‚aV£œóVWƒ™U£°ašxÈ¥@™‚aĊwȹ@óša™ƒğbm@k„w@mƒaÆw@ƒ„In¯mmƒ@UkkWƒÑÅ@@kċÅçVkÝJÅkVykŹl¥@¯š™ĢU܃X¥òý—mmX™ÝÅlmU@£™Wly™XW»Åbƒl@aI›»k@klm@UxUUƒVƒ¼¯Xƒl™aUnķ‚ƒI@x™@¯„ƒK™„ĉUU`óšlȝô@¤ƒÞJ„k°xVŽ„n@ŽmbXޝ›L`ƒ¦ĉbml¯X™ŽUŽl„ȂĊXzm‚ȁÔU‚ÜVšUnnŤwŦJɚ݄XÞW¯ô@ÈlU„b„mln"],"encodeOffsets":[[103984,36344]]}},{"type":"Feature","id":"6321","properties":{"name":"海东地区","cp":[102.3706,36.2988],"childNum":6},"geometry":{"type":"Polygon","coordinates":["@@@҄bš¤ÆI°ôU¼š°UŽnnWx™š@b¯L@lUUWbXxWl„ƨnxVUllš„XVŽUŽnL@lȀý²KVnƾ‚ĢwV»ƒ@mÞ£nÆƒÞÑmL™ƒKUaVżĕƒWVk²ƒƒÆÝ@ƒXw°@„ô™@a°wóUUmIk™™aVmÞwmknyƒ¹VÿƧnŏm£X»˜™naV±„Ýw@ašb@aƒm¯„ĉVó¦kÝWKUU@WanU™b@ôǺĉxb@šÇ¦™w¯bV¤„šUX›ôU¤bmm@UJnbÇbXVWn™`¯Umk@@bka@bÇK"],"encodeOffsets":[[104108,37030]]}},{"type":"Feature","id":"6301","properties":{"name":"西宁市","cp":[101.4038,36.8207],"childNum":4},"geometry":{"type":"Polygon","coordinates":["@@@kmKVUƒWk™VkUmwƒƧXkWwXaVV@k°K@aš™XwmmV™¯V»¯óÅJ™£ƒamŽ—X@šċVţÆķç™nUx™`kœ›`@šÅmĊx@Žƒ¦U¦„blVރŤèô¯„„Wbœx›¼œŽ@xċ¼k„™V™ô™bÇ@Ű@„™n„V°¦ĊJ„kĶa„lȍźU„a@aVwnJ°°J„anXlwš@ĢÓ"],"encodeOffsets":[[104356,38042]]}}],"UTF8Encoding":true}; 3 | }); -------------------------------------------------------------------------------- /static/src/util/mapData/geoJson/shan_xi_1_geo.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | return {"type":"FeatureCollection","features":[{"type":"Feature","id":"6108","properties":{"name":"榆林市","cp":[109.8743,38.205],"childNum":12},"geometry":{"type":"Polygon","coordinates":["@@™ýVƒnIW»ƒW@»kUÇL—݃U¯¥ÇIUWWїUWwX¯mƒ@»n@ÜÈķô™@a±kȱƒw„ÑmwçċmU»ÆkkVyIm™ĉÿ@ƒÝ¹ƒWnwÇVš™Åaƒzmmĉ¦ó™kVmx™xU¼VškVm_UlVlk„°IV‚kmJa›¦k™™LmmV@XmKnšlUô›VXbƒbƒ@UaÇLğܙ™Åwƒ£mKnmċwÅ@UkƒbmaVƒƒƒn@m¯aU™Jm_k˜@kWXyl@@kÅamw™LU™Þ™ƒ™mWÅzUKƒš™Uk±@™b@nnK‚bX¤mzVšŽVxÇn„‚¯„@ÒknWƒƒVUbkķÈÑWkk@Va™™U@„mUkbƒÝÅ@Ý¥ÇbkĬ™XV`kLǍVmalUUa™nV±nwmkƒJ@Inƒ°KVw¯UnÅ@¥™ƒ™U±bUU˜±œmWbÛKWnUm`UƒVK@bmnœm‚Èż@V„L@xƒxmš„Ť°nŽ@VmK™²VlšlKk„ô@„êÜV@VXLlmš¦UššV°Ș¯²ÿ@¥š@ƁĊ˜²IšmĶnnb°b„KVƒĸLl„Þ@UȮš™Ü°IVƒÞÝސlŽœx@ŽķĀWŽ„Ux„èƐ@š°ŽXnšlĊ˰m„nƒšV„²V°ÒƦ„aބ„˜@zll@bÞšlš¼nKĊ¼óȂb²±šIǪÒ¯ĖV@„lxnVlk„JlaXwŌĉ„„@VnŽššlÆĕ„UÆLœèŌŤôxȚlUœ@šxlaUċĕXm„IWmnkšVVƒ„VW_@aÈWUUmk@ƒ¯çVm»™±W¯n¥V™mkXw±ÇVwƒ"],"encodeOffsets":[[113592,39645]]}},{"type":"Feature","id":"6106","properties":{"name":"延安市","cp":[109.1052,36.4252],"childNum":13},"geometry":{"type":"Polygon","coordinates":["@@@kkÇmIšmUwVkUƒƒU²WmšVkm@m`mIĢĕUƒVa@™mXƒƒÿVVkyUýšĕ@l_UmnƒW„KVkţ™™¥™aƒwğ@™@aôƒ„ƒWa„kUmƒa¯¯™a±£kx™mmxUwÝ@xmU™b¯K™wó„Ý@kmm¹Ub@lklVbmnnVUV@x›UknƧJUX@ŽƒLÇWkw™LķƧÅwWJk„ƒLkþĉxWz™JUnǚkš@Ɛk¼ÜÔÈKšè@°lșÆk¦l„n@l¼@l¯L™°UU™Vǰƒ¹—`m¼mXk‚™bUaƒV@U¯x@¦™Ç™„UUmlmUVm„nnmlkw™@@šƒ¦Å‚ÇLmx¯Iklš„@¦mưVUx¯Lm„@J„InlmxU²šmVbkV‚bUnȎlKU_šWlīÈaÞ¦Æ@„ÞlanV@ƒšVšUbl@XlÇÒĸlŽVa„UX„lm@ѰƒƒÈmUw‚U™nyW£amL@mša²@lšV„™VLÆynX„šÝšVššKnxÆb@lk@WzXŽ@ll—n`šIV‚°b@n„m„„‚Unb„aVlÆ@ČxmnnL„¤ÆxššĠÛÈKVb„@„aWaœU‚ókVm™nL@W‚UnnšKlšœ¥‚bnIlU¯JlƒUkVkn`lUU™V»šwnwlUôšĊ¥nn„yÆb"],"encodeOffsets":[[113074,37862]]}},{"type":"Feature","id":"6107","properties":{"name":"汉中市","cp":[106.886,33.0139],"childNum":11},"geometry":{"type":"Polygon","coordinates":["@@lKnb@n„lWb°bkxĸwVb@ł„nlŽ„ƒĊ¥šL@XŽl™ÈƒVblÈK‚b„akVwôml²`‚nœ@‚nVKœl˜k²xŎƒ°¦VU„JĊw@çnWçރVkUóÛ@¥kwš™šUmƒX¯WšÑkƒ@UymIUwlUn¥‚mUk²a°¯V»@™ÝVș„ÝċÅÅVl»@l@a°±@_kammÅb™a@ƒƒm@ż™KknõĠ—@mšƒ„¯LÅw›‚—LVxmb@¼kV™@mw¯wVakKW»X±¼¯Vkxƒb„¼WŽ@nx@x±bóakbƒ@ÝmU™@ķÓÛL™kƒVUm™k¯¤ÝLUlÝ@Ýz™š„x@x™°™™™bƒmƒX¯aUJW¯—k@bÇWƒwÛwWxƒ@XWlb@Žƒ„VŽÈUlwšLnl°VlUô¦œU°¤VšUxVXUxlbkVVlƒI„°„ÅVlU°m@k„ÇU¯xUlƒLUlVL@b™°ĠInĠ°ÈnK‚„@xÞa²n‚aUyšXUKVkšWô¼Èa‚z°JXUVÇV_„JVƒšz@Žnb"],"encodeOffsets":[[109137,34392]]}},{"type":"Feature","id":"6109","properties":{"name":"安康市","cp":[109.1162,32.7722],"childNum":10},"geometry":{"type":"Polygon","coordinates":["@@„bĊaƨèšwôô„¼šb°ašXVƒÞVUÞ@‚aXƒm¥kImx¯¯ƒV@anU@UÇéğL@ƒ¯¥V£mƒ@ÝÈb„K‚™„X°wČÿ˜ƒ„b@xÈblxȯĊ„„mÆUVƒ„nÈ@ƨÜLĢ¥ƒŹnƒ°Vnn˜K„aô_ȃšwU‚aXmnW‚¯kl›LXƒÇ™ō¦ÝaÅVmbğUn¥±wÅéVƒan¥ƒ„U„»°am¥„£ƒÝ@ƒ„wVw™¥nU„уUmmVwmķIÅaóVWxkblb@ból@œğÒĉ¤ċXƒ˜¯X™xk„Ç@óÆÅx@š™xķ_kmݎǣkblb@`¯²@bk‚‚@k¼ÆUČÆƒÞǚÞU@šU¼¯°±bVlnm¦kVVxnJVz@‚l„™ÒXW°n„™V™šlx@¦ôÜVUl݄Xèm@è"],"encodeOffsets":[[110644,34521]]}},{"type":"Feature","id":"6110","properties":{"name":"商洛市","cp":[109.8083,33.761],"childNum":7},"geometry":{"type":"Polygon","coordinates":["@@²nl‚ôbš„°aVwnKÞIš`°wšXôw°VĊ°@ŽÅš„ÞÆV„zÞK@xšŽ@a‚LŚ@b@ŽnLlƒ@šln„mnLVw„a„bVƒ‚VnbU¼„Vƒ°„bl„šbÈ@ĶŦb˜@nÇ@amIyUI@ĠVmôƒU™ƒVwkwlanJ„¯lwó¥@an°Jš_„‚@š™nóƒó@£l¥UwmašÑ@ƒUm±V_ƒJ—£›J—UW¥¯@ƒ_k¯¼mUƒVUè¯b@wmL™»ğVmağI¯¤ċIUW™XƒKĵ¦ķaƒJUb™IƒlUóVmk@WÅÅÇ@ƒmU„ÅVƒnĉƒÇ°kwÇa@wƒa—„ċxƒWšƒLÇa@Þn„U¤°¦@„ĠKÈê@VmV@b„U°°nwlJn¦W„bÝ@VŽ"],"encodeOffsets":[[111454,34628]]}},{"type":"Feature","id":"6103","properties":{"name":"宝鸡市","cp":[107.1826,34.3433],"childNum":10},"geometry":{"type":"Polygon","coordinates":["@@@ƒ„£@›°Išb@¯°ynʃaUƒlƒU£„Umšĵĉ@@ylUÞ@@£kWU¯WaU£¯ÇV¥ƒ@kb¯wƒn™¥ÇkUÇnUƒ@¯±›kULm›@m±_kŽónUxlŽƒbaÇLkŽUaDŽkšW@™Kĉ¦ƒ„kƒm@ŁUaķxlw¯aXaƒk@mmakL@šmšÛŽ@¼m„@l„XV`ƒn™KUš°°@²š¤UÈ@VxmôƒxKl„VV²aVw„Xla„Vlx@UVnŽÇnk°ƒVVL™lkI™šƒJÇk¯V@šknƘn@lznmlVkzVŽ„VVxš@Ux„z@x±¼VxxU„l‚kb˜@„¼Čk˜VXlĠkôV²w‚LUKlwœJ@a‚IV¥Þƒn¯Ün„‚„@nk˜l²kÆ@š°„aVbnI@™š‚Ťn"],"encodeOffsets":[[110408,35815]]}},{"type":"Feature","id":"6105","properties":{"name":"渭南市","cp":[109.7864,35.0299],"childNum":11},"geometry":{"type":"Polygon","coordinates":["@@@ÈôL„xUް„Þ@mŽÈnl¤nUôL‚wX`@ÞÝL™ŽUšmLô„„ŽôbVbnºlnÞ@ôƒšx°LšanV‚wÞ@Vxnwšnlw²¤šb°°„bVnƒlXbƒ„ó„@bš‚Ġ@„xšbš¦ŤšV™Xġ„£W¥ƽɽƒó@ýóƝÝ»„£X™mƅšĊkUƒ„@™™šó„kťaĵŽÇ@™akƒƒa„¯ƒUV»maUU„ƒaƒbUxmKƒnkm@™k„mK@ƒxó@¯n¯KǦ@ôÅèlxkx°nƒƾ¯KU¯WķL@VÝIUb™yWbX¼Ç°"],"encodeOffsets":[[111589,35657]]}},{"type":"Feature","id":"6104","properties":{"name":"咸阳市","cp":[108.4131,34.8706],"childNum":14},"geometry":{"type":"Polygon","coordinates":["@@šIXyĊwlý„KlƒXIVaķƒ™»a›£„¯aVU@a™‚wÈō‚ašL²»‚VœUln°WȯW»XašzVaÞJ@Uƒ»@¯Ýbğwly@£kÑţ±Wу@ka™IUƒƒnƒ@¯ƒómţU™b™U¯lÇIÝb@¤Ý@kV@zĊ@™ĶnƒVV¤k„V„„bmź¯z@°™a¯J@œƒ¤@„„bUx™bƒ„@`™xUÔ±ºVXœW‚„UnUJ‚L̝ÈKlblmÈXŎ°šU„°LšŽlkÞKš@Èxl_°ĶUÒkblš"],"encodeOffsets":[[111229,36394]]}},{"type":"Feature","id":"6101","properties":{"name":"西安市","cp":[109.1162,34.2004],"childNum":5},"geometry":{"type":"Polygon","coordinates":["@@°²@‚„mVVÈÈlš¦„m°xla„@U¦°ÈV¤XbV°lXÞaÈJ°kšVšaŤVôn°„„@„mV„šJlb„@XÒŤ²lÒ@¤kzĠxÞa@°„¼ĸK°XV‚°L„ƽ¯mlwkwÆç@óÈ¥°L°mô@„w@aƙK@b™@wÝLƒyÅUƒÝƙ@ĉ¯¯Uóx™W¯x™_ÝJmLUx¯b™ƒóak±mÝUU„™W¯b™aƒ»óó™xƧçĉbƒaĉxƒIUV¯¥ō„±w—l"],"encodeOffsets":[[110206,34532]]}},{"type":"Feature","id":"6102","properties":{"name":"铜川市","cp":[109.0393,35.1947],"childNum":2},"geometry":{"type":"Polygon","coordinates":["@@ÆxĸƨšKlxÈX„K@VWƨIlmœV@wVUmUnmUalk@kVaUaóaƒóƒnKV™šÞK@ÝW_xóKmVk£ÇmnÝ@¯ƒVƒwóK@ǯXkm›VU±¼™KbÇŎx‚š@bUV°bƒœ¤‚bš¼ĸ„Ub"],"encodeOffsets":[[111477,36192]]}}],"UTF8Encoding":true}; 3 | }); -------------------------------------------------------------------------------- /static/src/util/mapData/geoJson/tai_wan_geo.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | return {"type":"FeatureCollection","features":[{"type":"Feature","id":"7100","properties":{"name":"台湾","cp":[121.0295,23.6082],"childNum":1},"geometry":{"type":"Polygon","coordinates":["@@\\sŽ@pS}aekgKSu™SsMß`¡CqZ·be@Q^o@‹gieMp‹‰]}•}Ľc_Kk…{™ù“A¡r‰[uom@эĥJiq©mʼnq¯Bq]ÙYgSåk_gwU­isTE…“‘ĕiqiUEkue_‰OSsZ‹aWKo¡­q“ycY£w}‹ĩ™ĕS§Z©S™N¥SyLÑ¡±Ks^IY‰PdƒY[Uo†Fp}´\\¬\\j]ˆe܍ò‹¤¡–ā a\\bn™U㺹Ìs¼j®[cíȈEŽĝĆ`ļf¶Š®K|VØDdKGpVnU‚FjpH—F`†B’[pMºxÖjbpÎxp€¬‚|ΟÜÒCв®‚ÜAp„ZG~€Šd˜ÞàV¨|¸€`|Œ²tx~\\~|dFf^zG€ĄŚhœdL\\hĸž¼†ŠOªP®lV`p\\]Xpll˜æ¤œCpQ|oF}fMRi†NSon_²qämœM„NM‹\\•"],"encodeOffsets":[[124853,25650]]}}],"UTF8Encoding":true}; 3 | }); -------------------------------------------------------------------------------- /static/src/util/mapData/geoJson/xi_zang_geo.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | return {"type":"FeatureCollection","features":[{"type":"Feature","id":"5424","properties":{"name":"那曲地区","cp":[88.1982,33.3215],"childNum":10},"geometry":{"type":"Polygon","coordinates":["@@ƨʔĸbܺÞwnxźbÞ°ô@„ĶŽĸIȼĊJŎÈôUšÝƒ¤ǔLސŎ@ĢŽȘblƒôL„ÇźçȤôLš¥ÞIÞ¯Ķxʊťƨ™ƿÑĉXVķŦ¯ȂKÇǕšÑ¯IUš£¯Óƿ£VĕōÞÿÆwƒƑ„£ǖxÞĕ±ÇÝaUÑȃU¯‚UōÈ݃wWŁĵ™±Ý„óĢÿ°IÞ±mÅ̝mÿ„¥°UnÑŤĢĕĶwǬŻͪwŎ¼źÇĢ„Ġĕˎٰóƨ¼Èa‚m@¥°wǔ„ǖ°ŽƨÇŤœšġƨ„ŎŃôbÈÛŎĊ°@Ġw²ÑÞJƃÆb²ƒ°êĊUނlȲƒV„ÈKĊÒĸĉ›»ÅôťUÅǃk¯@ǂÑklǁÅl™Ģ™VÑóƒ@°@„ÛĸƒV¯ƒÇĊ™n¯Uĕšƽ¯m›¯b™È@Ò°Ĭƒbĵ›¼„‚kxķýÇJk£ÝaUÑÅóĶǟkÓʉnĉƒÝ¼Ƒ„ó»Þmn£m™Č¯@ƒȮÿV¯ĸƒ™k@Ýówƒ»ğ„ġ±ǓLō„ƒšV¼Əèķĉ™è±b@Òţ„UÑóakƒl£™Ó@¯L@™ÇlUóȁš¯aġÈÅĕÝLķ¯Ė¯@WĬ—x‚ÒÈnW°ţôU²ǓÓġ²V°¯ôƒǔÝL—ċšk™š»Ý»Ýš¯ÞƒVƒwۄÝÇōͩÈĉċ»ĉm¯£W¥ţKkóġƏW@¯±kōŽÈ›b@җšÇaƒÆ¯a™„ƒkóŽÛƒÇ¦Ýa¯šÝ™ĉ@ǻۄmƒǓxķƛ¯lVĀÅÞġb™™ÇJUÅV™ĖƑW™zō»ōšƒW™n@è¯ÞóVkwƩnkźÇބҙޯƒƒýğÇUxÆÈnè±bĉÝ»ÈуwšwÞ@m»ÈV@ýÇ°ķ™xƒa„ݯXċ¥ƒÈóW@ôkxlnxVÈóĊkŤġ¼@°¯ŰƑL̻۱ŎÝV—Þ›VƒÇÞŎÇakƞ‚š@èğŎĸżšƾ°ÒšLÞôĠKȰĖźVÈÒĠ„¤™VôšŽU„ÈþťL@ôǬÞlÜÈnÇÒUŚ™@šĊƨW°™°Xƒ‚@ČÇþ„ƴĉÒķ¦@ŽĢôWĀôłUÞĢǬ™ź°¼š@ƒôV°„bUÆnzm¤ƽĸƒÈ"],"encodeOffsets":[[88133,36721]]}},{"type":"Feature","id":"5425","properties":{"name":"阿里地区","cp":[82.3645,32.7667],"childNum":7},"geometry":{"type":"Polygon","coordinates":["@@„Çƾķn£myVŃaU¯„ó™@¯»šŹġǫVÝóŁXÿġó@ĸ¥ĊуƳÈý@ċ„Wš¯X¯ĉƧ‚™š@VřÈÑÇmkÛǫÝ@óŦKÇýVƒ™U󚏃£ğÇÑŹUȯĕğLÝó™K¯Ñ™ƽķŻĠō@灙lƝÈbƍÈ݂„œU˜ÝÞU²ō̼ůƒK°ů@¯UK±—ĊƧbōÇmçÈġƒóšÅób™™źóš¥kól™ç™KôĵUƒÅ„VŃķ¥nÅŏm¯¹Å‚™»@ÑǍóxÝkʇȤU¤ķb@ƒ¯ĊÇx¯ĸĉKm°šĀk¦l„„KnĬȀƾÛ¦WÆÅmNJĉ°ōUţ¤UšŎ°šŎKÞłÆ„Ǔ¦ƒÞ™‚™„ř¯bmUÝl¯Um™ğl¯£șwŎǫaÝnĉ̓k@¯™K™šō»ĉn™aÞ»ťnkml™ĸ¥UŚŻkÑťƒĉV™ôó°LôīĠU„ÿĉǕÅz±Kƒ¤„²ō¤¯Ė¯UÝ¥Vĵ™óÈťÝwķșÑk¤ó„™ƒWýĵĕ™„VĠƒV󍃎Ǔ„ķ°k±VU±ţ¦UǟÝřJVљ¥XUċUŎlÛƆǕÆȗƆ¯wŏÞÅ@™šĉl݁óŽƒÒ™nUôńlxólÝôێ±™™LÛôÝL@‚ġ¯X¯ÇUżóa󤛼XÒġŎóLk¦‚ôżĸĠ™¼™KġƆô¦„ÆƑÔĉ͝ImÒ°¦n°¯Þl˜ÝČn„ƒÒšKĠޚĕkƒlýƾťœšôI‚ĖŤÒnƜm¼¯lnżóÞ@Ůó¦™ôƽĖċŚn°Ý°ôÈUƜƒblÞóŽ@Žǖô°UÈƆ°X„þôŽô‚lѢšŽ²Ėm¦°š@¤™XŽĊblܚzkºƒĖmX„šŎWVšóÞn°lĠxȚa°»żLźƒ„b@ưXĠÝȚxĊĕŤaȚ‚°È@„„@èŤ¦Ü¼œW˜ÞkŽÈ@V°lŤkŎ±²¦ƐUšlj°aÈÑŎb̃ŎbÆ¥ÞIȘlššôVÈU‚™šb„kɲĶn„mnXb̼òƾĖŎ@̐ȂÑôÓĠĖʊšĊÔ"],"encodeOffsets":[[88133,36721]]}},{"type":"Feature","id":"5423","properties":{"name":"日喀则地区","cp":[86.2427,29.5093],"childNum":18},"geometry":{"type":"Polygon","coordinates":["@@ĶĖXþš„ôƒl£šÒĸÇÞxÇŦšôUĶÞ¦°V°ĕŎ£ƒ±„£²LÆyĊǖƒĀğVóĬ¯KóôUš‚ĊŦ„lҙżVÆķ¦kšlnŦmݼšbĊmŎ¼š™šL@°„lĊĵÞmǬbƍȚx°¤Ġknš°VÞkVn°aƒŚš‚š„Ýǔ¥ÅƒÝŁōL¯™ōV™Ť£ŎVĊ¯nljƏXÅÜ¥ǿƽmīƒLkƒl¥™ÿn¯ĊL°ķÈw°ĉ@ƑĸaV£ʈȣÞlôwȎ@Қ¼Æ°ºŐnmÆĸ¦UńƃV„ó͚LšèôkŰlĬ™¦Źôššôa™Æ„ôÇĢnèŎÈƨa˜ĉ²‚VLĢ»lţôĉUǂwkmlw@óôX„ÇȦ°WƒÞ„b‚wĸšÈ¯@þÇUn¼Ý@™x„xÇńÞ¼Ċ޲amçÅÇVwĠȄþ°„šÝƒÑÈÝlŹƪmlxôU°Ý@çšm„XŎ™Ŏ¼šyƒXšĕÆUVÈIššĢaÆÝUÿ°kĸƜǔwn„܃ȼĊ@ޚ°™Þbȥ܄ô„lšƒ°b„ÅÈb˜™@ќa‚ǯUU¯Vġš»ƒ™¯aV¯Ç°Å™mnÑŤçǬVǬ™±ĉ¯¥Vĕ¯Ýk£˜ō—w@±ġÛ°ÇVїƒ@ۘa@ČL™Ƴ™„ƒÇa¯¤ÝIĵ¼U¥ƿōķÅţŻókÝóĕ‚¥¯™U»Æ£X¯ġŃÛkݰV°ó¼¯èWôÞĖ„ȎƒŽkĀƧĀówm¥¯JŹÝJݙōVVŁaݐƑ@ƒ˜ğŭǂ¯_ƒ˜ĵ—›VnxŃón›ƒĵxÇĖĉVÝÈğV™Ò󃯐±Żĉ£ķÆÅL™Ljĉý˜ţۃ¯VƒnV¤ÝÈ@°ÅÞݤ™ŰğŁm¦ÝxóKƒ¥ɱÈUĠôêVôÛ¼ÇWÝçĵaō¦óĖƧlÇĢƑŽnŎDŽV¼¼‚ºÛ@m¦ƽ„ĉmm¯ÝKÛç¯bŏłĬ™bƒ¼ÅLmŽ„xť°ÅU™šÝXkŽÝmĉ¦W„¯K„ÒknÝaV„Ýè¯KɅńÝKnÞ¯¼"],"encodeOffsets":[[84117,30927]]}},{"type":"Feature","id":"5426","properties":{"name":"林芝地区","cp":[95.4602,29.1138],"childNum":7},"geometry":{"type":"Polygon","coordinates":["@@‚VÈłVôÈk@š°K@ŽšÔk¤l„ôbVÒŤƒ@ѲašçĸĊƐçU»„™ŎƒǔK̲Ġƒ„¼ôx@ޚlƨĬ„Ul¯ÈLV‚šÞJ„°Ünʊ„wÜbXê‚VÞ¯°ššanaU°wƼɴÑWѰmÈýÈam¥Þ£Ť@„¥ôblÞĢ„ź¥ôxÈÅmݚ™ƒĕŃV»ĉōŤōnóƒ»ÈīķIUƒĠѰġĸLÞ¯VÒÆ‚@bš¼WôÈ@V¼ôóŤKÈÑU»šwVǫżnWÒÈx™¼‚lŦ£ĊōŤx²¯@ƒÆƒU¯šçÆ@„¤°£„é°k°lšůÈó@¯ŤÇÈĉƒkkÿó¥ÝXķљÜ@ÒóŚÝ¯°ĉówÇ±¦ÅJUÒĉĀķw¯°m˝„±akxÝÅnƒ™»lуK@¯lU™¯UVѯóĊ¯mōğVǓƅƒÞƒWÝÈÛ@ƿô¯ÜġzÅþ¯ólmôʇġĊÅUͿřŏȁˋŁóÇˡōƧƒÇb™w°Ķôk¦šÒƒnUþġҙÔkǔķèó@ƒ²@ŘōńĵyƒzġaݤÅIƒ¤Ƀť¦ğѯ¤ķbóš¯ó±ŽU²°¤ČÜVnÈÆ‚„ŚŎ°ôĢ„þÆzèVĀǎĀǘƒXŹÑ¯¤ówċķk¦šłUÒġzÇ@ƒ™ÆÝx@²Þ@Ƥ„Uô¦Uš°x„U"],"encodeOffsets":[[94737,30809]]}},{"type":"Feature","id":"5421","properties":{"name":"昌都地区","cp":[97.0203,30.7068],"childNum":11},"geometry":{"type":"Polygon","coordinates":["@@™ŽVĖm°ĉš„ÈU°ķ„ƒÜ¯@@ô„UÒġškš‚ÆkÈlށÒ@Èl°È„VÆóŦƂœ¼‚a„ÅĢ™Ʉwnōw@¥Ŏ¦°ŹÞmVš°wnÿƒw„wÝw@¯šmÞŗ°wĠ˜ĸkÞğlĔ²¦°@„ĕĸwVóšal@nĢÇĊn°@¦šŽźUXçǔůĸVš™ÆK„ÈÝĠš²ÅĔô@lšŽÈ_m˜„zǖl„šaU¼ôwV°¯¦‚ĬÈa„l@Čǎ„¼™„nŽ˜I„xô»ɜ@ƨ¥ɆŁ„ŃǪȁkƛƨȍʊȡóĭ›@—ÈÇVƒůރĸƅmēƨť™ÅÈʉVǵ°ġVŭÅɧ°ÿnɛš£mƒķ²ŃóÑUĉ°mÇ»¯@mxUèţ°ȁÝç„ġU¯ÆÇţÈ@°Çô™Ű¯k¯lƒê¯¤ƒ£Å@™èV°Å„@„±°ţwĉŎť¤kš»ÇwXÑŻmUǬ™xV¼ÇÒţLóôU»Ç@X󙻂a@ÿŁUÑݰķK¯ĢğÒV„ĸJÇĬ„¼môţŎĊŎU¼Æ„„Ė™šnÞÇÆówʦġƒkÝóaƒ¦ţ@ݤn¦ÇbÇþ¯nXÒɳÒÅ»¯xVmb™b¯™Ý°UWéÛaƒxʉÛmƒ¯ÝI™‚UÇKk°ƒVƧīķ„U°ȭĀ@„ċ°nšm¤Ýnô¼ƒƒÞ»Ċ„ʊmlÔĵǠÆôVÒÞbl¤ÈIĸþlwƒœ»ĶŽ„a¯ī@њǰanœƾ°"],"encodeOffsets":[[97302,31917]]}},{"type":"Feature","id":"5422","properties":{"name":"山南地区","cp":[92.2083,28.3392],"childNum":12},"geometry":{"type":"Polygon","coordinates":["@@°ÞU˰¦²ĊôÇÜLǖĀɜŽȘŰÞLĸźêÞ@UÜUŤ°ɞ¯Ü„°WŦĀmŎ„¦ĢyVљŁl¥Čĸôx°£źÒ„Wȗ‚ÿȍUÿ‚çÅyƒýóġō¯ƒřŁmÇÛUċޝ£V±²°ôô™ĸa°£ĠÒŦ¥ɄŽ„£ÆJÞ£Ģb„yĶzŎŃ@ŗ„±ô@ĸçlǓšÓĢÑVý„m™Ñl¥ĵó‚¯̻̥™ƛǫÝһÇƧĉyţ¼ҍēVĶĉŎ°ĸmšÞVÝĸ™ÒÛaċ„ó™ŹĖƒèÈÈl¼k¤ÝX@`ސŏ¼Æō¼ÇçĉKUÝÝ£ğ¤@¦ġl¯Òġĉ¯óš™móxÝÞğVšƴċK@—b@ܘ„UÒ¯ÈĢÜ@²˜x—Ŏl¤"],"encodeOffsets":[[92363,29672]]}},{"type":"Feature","id":"5401","properties":{"name":"拉萨市","cp":[91.1865,30.1465],"childNum":8},"geometry":{"type":"Polygon","coordinates":["@@Ŏ²l@°‚XĢƐlôŤLX¦°¤ĊnȼÇĊŎͪÞÈ܃„x„U°Ýޙ޼™¼lšČ™˜ŽÞK„Ǔ°óU¯Ģ±ǔÔV±ŤóX¯ÇmÑ˜wXī°@°ĕĸÞKÆĖĢǰbȂ™ÇفUƒV¯wV™ó¥ƒVÅ£Ý@@±ÞwšÅ‚„È@ƒ¥nōťÿ¯Xۃɝ°ţ¯ÛVVÝ@ŹéķÝKȗůɛǕÿÛKóÈǫšǫUţèmҚn¯Æ°ÈU‚°b„š™¼UĢV°°V"],"encodeOffsets":[[92059,30696]]}}],"UTF8Encoding":true}; 3 | }); -------------------------------------------------------------------------------- /static/src/util/mapData/geoJson/xiang_gang_geo.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | return {"type":"FeatureCollection","features":[{"type":"Feature","id":"8100","properties":{"name":"香港","cp":[114.2784,22.3057],"childNum":1},"geometry":{"type":"Polygon","coordinates":["@@™@}ScTʟ@cWuJÁ–]„l¦RLj¼BĄà˜ ŽH@TOHCTDDDHDNAT@PEHDDNJLX@BABALHFF@DKHADBBLDHHFBLEJB@GDBBFBADDB@@KFAFBBJJA@BB@@FFDDADFF@FADDDBJC@AFBD@@DDD@DAA@D@DB@DHHBFJBBFEHDFAN@DGDC@DLCBDDCFDlAFBFCBEF@BC@GDAB@FD@DZJ‚X´HĐMja@Ý`p_PCZ@lLnRGSDMFK|a\\Y}­ƒ§™Mën"],"encodeOffsets":[[117078,22678]]}}],"UTF8Encoding":true}; 3 | }); -------------------------------------------------------------------------------- /static/src/util/mapData/geoJson/zhe_jiang_geo.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | return {"type":"FeatureCollection","features":[{"type":"Feature","id":"3311","properties":{"name":"丽水市","cp":[119.5642,28.1854],"childNum":9},"geometry":{"type":"Polygon","coordinates":["@@@V‚bVl@Xn‚UXƒKVŽ@¦nxlUXV‚n„KVmnL‚UV@bn¤lLXK˜²„`nnlJXIVJ‚I„Vnn°KnnVll@VLXWV@UkVaVK„zV@„ƒšVVaUK@U»VUl@@WnUUƒ@wVLn@Vwl@XW°LVbn@VU‚@X„l`@XnKVbkl@XVJlUnlV„„xlL@lnXl„@VšUnV°°„@a„UVLXblWVXn@VVUV@Lš¤VLV„U‚VbnalLUUVX_laVa„WVzXKV@@a@KUmImmXama@kU@yVIUK‚aVa@kXK@aWU@VIUmW@kkVm„Uš@VwUa@K@k@Uƒ`@kUKVk@UV@VaUm²Vy@klUUWUkVmUa@_ƒKVaXa›XmƒU@mUlWkaUXƒ@mmkL@w™JƒnVVÅbWKXa™@@I@aƒJUUÇ@V„UL™W@akLmb@K@a™XXw@mƒVmUVkUy@£@aU@@VkUWm@kUKƒXUWU_mW@wkkmJUUkLWWUXƒW@IkJ@k@mW_kӃ_Ul™Lƒm@I@aUa¯m@kƒa¯LUJƒ@mVVxUb™a@LUKkXƒbm@Uak@@a@Um`ƒIUbUJ@nUVW@@LnVV@lšUbVlUX@`š@blXklW„Ušm„Xlm¦U@@V¯bml@š@nUb@llnn@VbX@lV@ŽUVULmU@JVn„bVbkb™VWxU@@nUVk@"],"encodeOffsets":[[121546,28992]]}},{"type":"Feature","id":"3301","properties":{"name":"杭州市","cp":[119.5313,29.8773],"childNum":6},"geometry":{"type":"Polygon","coordinates":["@@X@l„°KXXlW„b@²„`šššb‚I„šX`l@„@bWl@n@VnLUV@V„@°¦@šl@XVlU@š@xVbUb@Vkb@‚@XVJVz™J@Lޚ@VmLUxUJ@LU„Vx‚b„xXUl@VaÈw„b‚aÞa@Vl@XUVx@V@V„LlbnV„al@lb„Vnn‚LnKnL@VlbVJXalIšb@KUU@mVInJ˜„U„Vl@xUšVLnUš@UÞaV@lkV@UanK„L@UlKVUnbÆmn@@nUlVnVJl@@UXU„L@WVIVJVxVLXV@IÜKnbn@V¥V@@I@ƒƒ„y°b@UUwnk°ÆƨVlUšçXm›£aƒÇ™IkVƒ@WV@@aWIUWUIkb@WW@UnƒK@UU@kaWVkƒVIVVnU@UWVUV@VmVkKkWIkVWaULU`UImJUImm—U@ƒƒwmwUV™IUWVkUamaU@mV—kƒb@KVU@aVU@anKULVJ‚U@kÛU™JUV›kkƒVakU@ƒaVwkW@UWkXmWaULUaUK@XƒJUUmƒVU@UVƒUkJ@ImwmKU@k„@lU„W@@akKm„kamIkWl_UwVm@UkaVUUaƒ@UamakbWlkL@aUalU@mkL@U@U™lmK@XkKm@Ýakb@xƒnXbƒ`ƒnUUU@›™U@™wU@@ƒmKkkƒV¯U@lULUbVbUb@V‚a@L™ºÝb@bLmK™x@VUL@bk@mxULWl"],"encodeOffsets":[[121185,30184]]}},{"type":"Feature","id":"3303","properties":{"name":"温州市","cp":[120.498,27.8119],"childNum":9},"geometry":{"type":"Polygon","coordinates":["@@ll@xnXV`VX„WVL@lXnlV@UV@@b@¤VzUlnV„U@nWxšW@b@LnalK@bšXVKUƒÈ@VV„I@b@Jš@WbXLÆaUU„mšI@xlKnn„@VWlbkXV‚@n„VWnœ‚WbUb„L@`VbUnVlVXkV@lUz±‚VnUbU@@VUlVL@l„_@V@l@LVbV@XLV`VÈlxn@lU@aœaVV‚k„@XJ@nl@@LU`°LVb„L°a@a„UVy@anI@a„a‚nV@²wÜJX@VšVV°k„na@WVk„aWwU@m@™ƒkƒaUĕ™ÝšÝŤnÈa„aóI›»@±X™WkUķ@kV±kw™ƒUkWw„™UƒÝ»ÛkɳlImaUaWóXÿǬk‚UnWVmmk™KţnŏÞğl™„UlUx@XWb„V@JkXƒ°mb@VULVxUVk@@LWWk@WIkšƒUkJmUkVmI@yƒ@Ua™kLm‚U@mUUUkaVk™@mK@UlUU@UmKmbUUUJ@n@KVLUL@VkJWXX`mnULWlkL@JVLVb@°kxkU@LVŽ™V@„VLV`UL@VUX"],"encodeOffsets":[[122502,28334]]}},{"type":"Feature","id":"3302","properties":{"name":"宁波市","cp":[121.5967,29.6466],"childNum":6},"geometry":{"type":"Polygon","coordinates":["@@Ċ¦ĸ°‚nXÞVšKškƨƑźÿ°»n„@wô¥ÜbœU°ÆXÞWóçĉݱIUƒÈ¥@U°wÆ»²mm_@aXƒVKÞVlk@akk›̅@£X»VwƏXWa¯aȗb™KƽۃĊ™xƒLóŽk@ƒƒƒ@¯nƒKUL@xkL›ÑkWULUUmJUXVŽU@mŽUX¯@V`mbXbV@@nn¤WXšx@škJ@nVVUVl²UbÝVUVk@Wx@V@„ƒVXzmlaƒL@VlLU`„XUVVVUnl@VbnJlnUVVnƒlUKkbmnn„VxlJnxmbU@UL@KUV™X@xmb@lk@mnVVUš™è"],"encodeOffsets":[[123784,30977]]}},{"type":"Feature","id":"3309","properties":{"name":"舟山市","cp":[122.2559,30.2234],"childNum":3},"geometry":{"type":"Polygon","coordinates":["@@l΢ƒʠþÆVĢLĊƒǬXĊ܄XôV„ÑÆw„ƒlšƏÈóVĭVǓ@ƒĉwɛkmK@ĉXīWaĉUĵÝmƒ¯ĉƒwĉ±±nż¯x@VǦV„²JĊÞôèÝXÅW¯›VÛaó¦@xƒŽmޝ¼ŹĀ"],"encodeOffsets":[[124437,30983]]}},{"type":"Feature","id":"3310","properties":{"name":"台州市","cp":[121.1353,28.6688],"childNum":7},"geometry":{"type":"Polygon","coordinates":["@@lV„IVWVz@bXJl@Xal@°„nLll@nVxnV„K@UJVbƒ¦°„k`UIWJXnƚ@bUJ„Xl@lb„Wn@UzVV@bVVšmVnnJVXna‚bšKUKnUVVUnVLlKVLXa„Jm£@mU@WanaU_°@VWnV@UVWnIVVVKlXœÒlK@wVK„L°m„@„„l@ô„Kšw„ĉƾůUƒl£@»UƒVk„m@ƅUƒƒaÛIŏmUk@m„w@a™£ƒWk@ţšƒIm±@ankôUlaU™Uw¯ƒōaƒbÇbţm™ÞšÞVĖ„b„l@š@n‚VXxƒbUl@XmbƒŽ¯lUUU™W@ÛI±xU@mƒb@bmJ@bUzƒV@b¯bƒKUa¯KV_@Kk@@mWIƒ@lUU›b@bkVm@kwUÇU_WKU@Ux™@ƒVUnllX@Vn‚J@UXV@bWL@lUbbVLUJ@z‚V@lnbWbnnnJVŽ@L"],"encodeOffsets":[[123312,29526]]}},{"type":"Feature","id":"3307","properties":{"name":"金华市","cp":[120.0037,29.1028],"childNum":8},"geometry":{"type":"Polygon","coordinates":["@@nbVb„@VbUVlb@VUnVxk`lXnJlbnƒlL@bX@Vƒ@klƒV@nLnx@JlI„V‚U@VUVn„VV„I@WVLVbVKXbWnXl@VlXUx„b@ŽlVUbl„œlVUšIÜVnalKX@@bV@@aUUlUƒwUw„@naWW„UVaUUšaVb„LlxXJVk°ƒUƒlkU¥@k„a@LVlXLVlšVWznVn@lxšJl_@WX_@mVa„a@alU@kVVna„KVLlK„b@UUaVašbnUWmXU@k@yVI@ařWmXIVJl_¯ƒ„¥UaVI@ƒLmUUw@mkkmK¯ƒk@Wbk@WI@aUyUXƒJkU@bU@WLUyƒXUbkbW`UVVkKmbUaVUƒUK™£@KVUUUm@UWkXWaUKƒV@b¯ƒ¯mU™V@UkƒmW@kkKƒwUƒmkkVUI@WlkUamL@Wk_Wƒ@UVm@Ua¯KWXk@Uxm@UK@xV„mV@Xk@UVV¼@‚VLUb™Uƒ„U@ƒyULUbVlU@@XlVUVVbƒU@lXXVW@XUVl@@VUVƒÈn@VVU„@lVa@„U„mL@`X@`WL@VUX@lUL@xlx"],"encodeOffsets":[[122119,29948]]}},{"type":"Feature","id":"3308","properties":{"name":"衢州市","cp":[118.6853,28.8666],"childNum":5},"geometry":{"type":"Polygon","coordinates":["@@XkVKnwl@@aVK@UšwnL‚K@aÞaš¹@Kb@UVaUaVaVK@k°V„UllnL@„V@šxV@œšV@VV„m„_Wa„m@wlaÞbn@lL@WnLšk@V@VlK@nkVVb@blKXklakw@wVK@kVW@UXK@_‚W@_nKVƒ@ƒUb@kVƒUUm@„ÇVU@Uk@VU@WUXWW@k„VUaVUkU@WWXUKk@Ukmm¯LmmƒUJUIWJkImmƒ_—±WLkKm£@aVUmKUnƒLmWUkVmw@¥U„LVWm@WUka@UmmLmm@@bUX™@@WUIm@UVUK@UVUUU™VVJmb@b„Xn‚mVƒ¼nnn¦mJUVƒL„V@VW@UzUlVnUbl`UnVl@XU@kl@bmÈUx™Vk@@J@„ƒ¼W@ÅaVVnzmVƒ„@WJk@kWJ@ƒlXbWbXxmVnšlLXb@°lKVXnWšbWV„„X„mbV@Xl‚bšI@Kn@@x@šVLlm"],"encodeOffsets":[[121185,30184]]}},{"type":"Feature","id":"3306","properties":{"name":"绍兴市","cp":[120.564,29.7565],"childNum":6},"geometry":{"type":"Polygon","coordinates":["@@„x@„˜VnnVJnIVJV_VKXblUXJlŽlLUŽUnU@UVVX@ŽmVUUUJl„XUlbV@@V„LVmX@@XlaVJVXXJ@b‚@XU„@lUšJ„È‚bœ¤Ō„JšçV™UUnml@@kna@wšWVU@LVKV@namwkIUwmƒnmlaVL„kUmVUkmmIUak@VmUUVUƒWV_kK@U„K‚bnkWy„U@ƒ@UXwl@VUÞUVak±VUUU@mlI@™™wXWƒIWbUKkLUKVmUUmVVL™LambUWmIUm™nUU@aUUVym@ƒXkak@ƒW@z@lWVXnmV™aUbVb@VƒakLUKƒLmbUU@lkV@bƒbUb@nW`@Xk`™Ikwm@mUXy™UUkWKUk@Kƒb@lV¦klV„¯„UlWIkwƒKUa™bVVUbƒVXXmbƒ@Vx„xkVVV@bU@@aW@kLmb@lVUIVKmL@bUV@bUV@L„a˜lnUV@nbVbUlVXšJVUnx"],"encodeOffsets":[[122997,30561]]}},{"type":"Feature","id":"3304","properties":{"name":"嘉兴市","cp":[120.9155,30.6354],"childNum":6},"geometry":{"type":"Polygon","coordinates":["@@@blIX@@VÜVUnn@l‚k„lKnI°Þl`²LVKVbnbVaVLUVn@W¦@VkVVb„@VI„`@blLnL‚aX@„VVb@U‚@XlVa„@@kVaUKV»U_lWXUƒƒ@alb„k@VllnLVKn@@UVIUw@y°IVVXU@VV@lw„m@wVkƾaœJ‚LkΡƧƒ™l™LÝUmW¯ķÿĉ¥ƒIŋŽWn™èkVƧU¯ÅmlVx@V¯aƒz„Ž@„@JU@U¦m@@šnVmn@V„LV‚"],"encodeOffsets":[[123233,31382]]}},{"type":"Feature","id":"3305","properties":{"name":"湖州市","cp":[119.8608,30.7782],"childNum":4},"geometry":{"type":"Polygon","coordinates":["@@kLlƒkm@VmÛU@UW@kJ@aUƒK@UnmmU@™maÛL@JWUUKUwUIUJ@XƒKWV@Vk@UIUmVk@mm@ÅnmaUVkL@VƒKmLVbU@klU@ÝbV™@mVUKV™@wUkVƒ—ƒmIUJ@nVV@L™akJWbUIka@UmKmLKmmƒUUVk@@nmLX`WXUV@Ž@nUl™kmlU@Ub„„ƒxVVšIlV„Žšnn„@@n˜„UҚ@„°n@@xmb@„VbnV@šš„@b@`@L@L@x@blVklVbnnV@‚aXb°VlU@W„b°U„LXWVUV™„™VwÈwÜ»ĸaĠnUVw²X@V@lVU@wlaUUVm@knUV›"],"encodeOffsets":[[123379,31500]]}}],"UTF8Encoding":true}; 3 | }); -------------------------------------------------------------------------------- /static/src/util/mapData/rawData/encode.js: -------------------------------------------------------------------------------- 1 | //docs.google.com/presentation/d/1XgKaFEgPIzF2psVgY62-KnylV81gsjCWu999h4QtaOE/ 2 | var fs = require('fs'); 3 | var glob = require('glob'); 4 | 5 | glob('geoJson/*.json', {}, function (err, files) { 6 | 7 | files.forEach(function (file) { 8 | var output = '../' + file.replace('.json', '.js'); 9 | var rawStr = fs.readFileSync(file, 'utf8'); 10 | var json = JSON.parse(rawStr); 11 | console.log(output); 12 | // Meta tag 13 | json.UTF8Encoding = true; 14 | var features = json.features; 15 | if (!features) { 16 | return; 17 | } 18 | features.forEach(function (feature){ 19 | var encodeOffsets = feature.geometry.encodeOffsets = []; 20 | var coordinates = feature.geometry.coordinates; 21 | if (feature.geometry.type === 'Polygon') { 22 | coordinates.forEach(function (coordinate, idx){ 23 | coordinates[idx] = encodePolygon( 24 | coordinate, encodeOffsets[idx] = [] 25 | ); 26 | }); 27 | } else if(feature.geometry.type === 'MultiPolygon') { 28 | coordinates.forEach(function (polygon, idx1){ 29 | encodeOffsets[idx1] = []; 30 | polygon.forEach(function (coordinate, idx2) { 31 | coordinates[idx1][idx2] = encodePolygon( 32 | coordinate, encodeOffsets[idx1][idx2] = [] 33 | ); 34 | }); 35 | }); 36 | } 37 | }); 38 | fs.writeFileSync( 39 | output, addAMDWrapper(JSON.stringify(json)), 'utf8' 40 | ); 41 | }); 42 | }); 43 | 44 | function encodePolygon(coordinate, encodeOffsets) { 45 | var result = ''; 46 | 47 | var prevX = quantize(coordinate[0][0]); 48 | var prevY = quantize(coordinate[0][1]); 49 | // Store the origin offset 50 | encodeOffsets[0] = prevX; 51 | encodeOffsets[1] = prevY; 52 | 53 | for (var i = 0; i < coordinate.length; i++) { 54 | var point = coordinate[i]; 55 | result+=encode(point[0], prevX); 56 | result+=encode(point[1], prevY); 57 | 58 | prevX = quantize(point[0]); 59 | prevY = quantize(point[1]); 60 | } 61 | 62 | return result; 63 | } 64 | 65 | function addAMDWrapper(jsonStr) { 66 | return ['define(function() {', 67 | ' return ' + jsonStr + ';', 68 | '});'].join('\n'); 69 | } 70 | 71 | function encode(val, prev){ 72 | // Quantization 73 | val = quantize(val); 74 | // var tmp = val; 75 | // Delta 76 | val = val - prev; 77 | 78 | if (((val << 1) ^ (val >> 15)) + 64 === 8232) { 79 | //WTF, 8232 will get syntax error in js code 80 | val--; 81 | } 82 | // ZigZag 83 | val = (val << 1) ^ (val >> 15); 84 | // add offset and get unicode 85 | return String.fromCharCode(val+64); 86 | // var tmp = {'tmp' : str}; 87 | // try{ 88 | // eval("(" + JSON.stringify(tmp) + ")"); 89 | // }catch(e) { 90 | // console.log(val + 64); 91 | // } 92 | } 93 | 94 | function quantize(val) { 95 | return Math.ceil(val * 1024); 96 | } -------------------------------------------------------------------------------- /static/src/util/mapData/rawData/geoJson/ao_men_geo.json: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection","features":[{"type":"Feature","id":"8200","properties":{"name":"澳门","cp":[113.5715,22.1583],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[113.5978,22.1666],[113.6016,22.1573],[113.6052,22.1507],[113.6074,22.1463],[113.6088,22.1424],[113.6101,22.1373],[113.6103,22.1338],[113.61,22.1309],[113.6067,22.1252],[113.6043,22.1215],[113.6016,22.1183],[113.5976,22.1151],[113.5928,22.1117],[113.5876,22.1084],[113.5801,22.1047],[113.571,22.1024],[113.5598,22.1023],[113.5578,22.1035],[113.5552,22.1053],[113.5538,22.1099],[113.5528,22.1178],[113.5528,22.1202],[113.5531,22.1264],[113.5542,22.1367],[113.554,22.1414],[113.5525,22.1454],[113.5458,22.1529],[113.5379,22.1702],[113.537,22.1726],[113.5351,22.1753],[113.5336,22.1768],[113.5327,22.1784],[113.5332,22.1845],[113.5361,22.1903],[113.5379,22.1932],[113.5406,22.2004],[113.5408,22.2023],[113.5396,22.2032],[113.5392,22.2037],[113.5389,22.2063],[113.5382,22.2086],[113.5382,22.2092],[113.5384,22.2096],[113.5416,22.2107],[113.5435,22.2106],[113.5464,22.2099],[113.5483,22.2138],[113.5497,22.2144],[113.5531,22.2138],[113.555,22.2132],[113.5581,22.2126],[113.5628,22.212],[113.5677,22.2095],[113.5703,22.2073],[113.5749,22.2029],[113.5904,22.1827],[113.593,22.1786],[113.5978,22.1666]]]}}]} -------------------------------------------------------------------------------- /static/src/util/mapData/rawData/geoJson/tai_wan_geo.json: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection","features":[{"type":"Feature","id":"7100","properties":{"name":"台湾","cp":[121.0295,23.6082],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[121.9263,25.0481],[121.94,25.0234],[121.9785,25.0234],[122.0018,25.0131],[121.9688,24.9829],[121.9235,24.9664],[121.9043,24.9451],[121.8851,24.939],[121.8755,24.9129],[121.8315,24.8669],[121.8219,24.8415],[121.815,24.7632],[121.8301,24.7151],[121.8288,24.6911],[121.8411,24.6327],[121.8576,24.6135],[121.8576,24.6053],[121.8727,24.5819],[121.8727,24.5441],[121.8535,24.5235],[121.8343,24.5167],[121.8576,24.4803],[121.8219,24.4652],[121.7917,24.4233],[121.7615,24.2997],[121.7436,24.2839],[121.7381,24.2619],[121.7038,24.2331],[121.6599,24.1418],[121.6187,24.0965],[121.6173,24.0484],[121.642,24.012],[121.6283,23.9859],[121.6049,23.9632],[121.6049,23.8918],[121.5665,23.7799],[121.572,23.7593],[121.5472,23.7071],[121.5253,23.578],[121.5005,23.5231],[121.5019,23.4984],[121.4868,23.4229],[121.4745,23.4036],[121.4648,23.3226],[121.4429,23.3075],[121.4236,23.28],[121.4127,23.2265],[121.3921,23.2004],[121.4017,23.1681],[121.3989,23.1345],[121.3577,23.0885],[121.3179,22.9841],[121.2973,22.9594],[121.2767,22.9491],[121.274,22.9271],[121.2479,22.8818],[121.2286,22.866],[121.1929,22.8577],[121.1833,22.833],[121.1957,22.7953],[121.1792,22.7836],[121.1737,22.7602],[121.1256,22.7211],[121.0721,22.6964],[121.0309,22.6682],[121.013,22.6366],[121.0007,22.5872],[120.9732,22.557],[120.9361,22.443],[120.8922,22.3386],[120.8826,22.2878],[120.8949,22.2356],[120.8853,22.1917],[120.8922,22.1423],[120.8826,22.1134],[120.8881,22.042],[120.84,21.9871],[120.8345,21.961],[120.8496,21.9301],[120.8441,21.9177],[120.8084,21.9253],[120.7768,21.9424],[120.7439,21.9301],[120.7301,21.9191],[120.7068,21.9534],[120.7095,21.9768],[120.6793,22.0338],[120.6931,22.086],[120.7068,22.1066],[120.6917,22.1423],[120.6738,22.2178],[120.6354,22.305],[120.5983,22.3544],[120.5502,22.3956],[120.4555,22.443],[120.439,22.4567],[120.4555,22.4794],[120.4115,22.4684],[120.3319,22.5275],[120.2715,22.5961],[120.2467,22.6572],[120.2673,22.7108],[120.2536,22.6929],[120.1685,22.9154],[120.1657,22.9532],[120.0572,23.0507],[120.0723,23.1729],[120.0916,23.2306],[120.1273,23.2848],[120.1218,23.3137],[120.1328,23.3878],[120.1341,23.3556],[120.152,23.3501],[120.1479,23.3734],[120.1588,23.3961],[120.1479,23.4283],[120.1506,23.4483],[120.174,23.4531],[120.1314,23.4558],[120.1465,23.4895],[120.1479,23.53],[120.1341,23.5533],[120.1273,23.6131],[120.1547,23.6865],[120.1753,23.703],[120.1987,23.7724],[120.2261,23.7957],[120.2577,23.8479],[120.2893,23.8774],[120.3593,24.0298],[120.4349,24.1006],[120.4335,24.137],[120.4884,24.1912],[120.5214,24.2667],[120.52,24.2901],[120.553,24.3031],[120.5489,24.3333],[120.5804,24.3697],[120.5983,24.413],[120.6752,24.4906],[120.6862,24.5414],[120.715,24.6004],[120.7466,24.6156],[120.7755,24.6526],[120.8318,24.678],[120.8592,24.7083],[120.873,24.7385],[120.9018,24.7563],[120.9045,24.7749],[120.9196,24.8037],[120.9155,24.8346],[121.0117,24.9726],[121.0309,25.0172],[121.0487,25.0234],[121.0625,25.0426],[121.1833,25.0887],[121.2437,25.1223],[121.2794,25.1147],[121.3316,25.1223],[121.3852,25.1443],[121.3962,25.1601],[121.4195,25.1731],[121.4044,25.1848],[121.4278,25.2061],[121.4497,25.25],[121.5308,25.2981],[121.5761,25.2967],[121.5994,25.2878],[121.6283,25.2644],[121.631,25.2342],[121.6502,25.2267],[121.6585,25.2068],[121.6928,25.2136],[121.6832,25.1903],[121.7052,25.1745],[121.7615,25.1498],[121.8411,25.1278],[121.8864,25.1209],[121.9194,25.1278],[121.9125,25.09],[121.9263,25.0481]]]}}]} -------------------------------------------------------------------------------- /static/src/util/mapData/rawData/geoJson/xiang_gang_geo.json: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection","features":[{"type":"Feature","id":"8100","properties":{"name":"香港","cp":[114.2784,22.3057],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[114.3333,22.1457],[114.2894,22.1457],[114.2592,22.1361],[114.2413,22.1457],[113.9447,22.1457],[113.9268,22.134],[113.9008,22.1395],[113.8376,22.1807],[113.8225,22.2144],[113.8445,22.2645],[113.8527,22.27],[113.8733,22.3304],[113.8747,22.4258],[113.9529,22.4691],[113.9996,22.5076],[114.0038,22.5069],[114.0134,22.4993],[114.0175,22.4979],[114.0271,22.4993],[114.0285,22.5014],[114.0326,22.5034],[114.0395,22.5021],[114.0491,22.5021],[114.0573,22.4993],[114.0614,22.5014],[114.0628,22.5082],[114.0683,22.5137],[114.0793,22.5144],[114.0807,22.513],[114.082,22.5124],[114.0875,22.5158],[114.0903,22.5192],[114.0903,22.5213],[114.0848,22.5247],[114.0834,22.5268],[114.0848,22.5282],[114.0903,22.5302],[114.0944,22.5336],[114.0971,22.5343],[114.1026,22.5316],[114.1081,22.5323],[114.1081,22.5288],[114.1095,22.5295],[114.1109,22.5323],[114.1122,22.5316],[114.1136,22.5336],[114.115,22.5336],[114.115,22.5282],[114.1177,22.5268],[114.1205,22.5282],[114.1219,22.5323],[114.126,22.5316],[114.126,22.533],[114.1273,22.533],[114.1273,22.5357],[114.1301,22.5378],[114.1328,22.5371],[114.1342,22.5391],[114.137,22.5398],[114.1397,22.5385],[114.1425,22.5405],[114.1438,22.5412],[114.1493,22.5391],[114.1493,22.5385],[114.1521,22.5391],[114.1534,22.5391],[114.1534,22.5419],[114.1562,22.5439],[114.1562,22.5453],[114.1548,22.5446],[114.1548,22.546],[114.1548,22.5481],[114.1562,22.5488],[114.1576,22.5522],[114.1617,22.5529],[114.1644,22.5577],[114.1658,22.5591],[114.1685,22.5563],[114.1727,22.5584],[114.1754,22.557],[114.1823,22.557],[114.1837,22.5529],[114.1864,22.5515],[114.1864,22.5529],[114.1919,22.5515],[114.1933,22.5529],[114.1946,22.5515],[114.1974,22.5529],[114.2194,22.5522],[114.2221,22.5529],[114.2249,22.5508],[114.2262,22.5488],[114.229,22.5481],[114.2303,22.546],[114.2303,22.5426],[114.2317,22.5412],[114.2331,22.5412],[114.2358,22.5433],[114.2358,22.5453],[114.2482,22.5501],[114.2812,22.5625],[114.3375,22.5659],[114.4391,22.5591],[114.4597,22.5426],[114.4597,22.4657],[114.4748,22.4334],[114.4981,22.4176],[114.5064,22.4155],[114.5187,22.4155],[114.5407,22.4217],[114.5627,22.4306],[114.5586,22.4203],[114.5613,22.4135],[114.5641,22.408],[114.5929,22.3915],[114.6066,22.3448],[114.5943,22.3057],[114.5641,22.2528],[114.5311,22.2013],[114.4995,22.1629],[114.4556,22.1299],[114.4171,22.1237],[114.3333,22.1457]]]}}]} -------------------------------------------------------------------------------- /static/src/util/mapData/textFixed.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 地图文本位置修正 3 | */ 4 | define(function() { 5 | // fix = [xFixed, yFixed, scale] 6 | // textX += fix[0]; 7 | // textY += fix[1]; 8 | return { 9 | //'南海诸岛' : [32, 83], 10 | // 全国 11 | '广东': [0, -10], 12 | '香港': [10, 10], 13 | '澳门': [-10, 18], 14 | '黑龙江' : [0, 20], 15 | //'北京': [-10, 0], 16 | '天津': [5, 5], 17 | // 广东 18 | '深圳市': [-35, 0], 19 | // 云南 20 | '红河哈尼族彝族自治州' : [0, 20], 21 | '楚雄彝族自治州': [-5, 15], 22 | // 新疆 23 | '石河子市': [-5, 5], 24 | '五家渠市': [0, -10], 25 | '昌吉回族自治州': [10, 10], 26 | // 海南 27 | '昌江黎族自治县': [0,20], 28 | '陵水黎族自治县': [0,20], 29 | '东方市': [0,20], 30 | // 陕西 31 | '渭南市': [0,20] 32 | }; 33 | }); -------------------------------------------------------------------------------- /static/src/util/number.js: -------------------------------------------------------------------------------- 1 | /** 2 | * echarts数字运算相关 3 | * 4 | * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 5 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 6 | * 7 | */ 8 | define(function() { 9 | function _trim(str) { 10 | return str.replace(/^\s+/, '').replace(/\s+$/, ''); 11 | } 12 | 13 | /** 14 | * 百分比计算 15 | */ 16 | function parsePercent(value, maxValue) { 17 | if (typeof value === 'string') { 18 | if (_trim(value).match(/%$/)) { 19 | return parseFloat(value) / 100 * maxValue; 20 | } 21 | 22 | return parseFloat(value); 23 | } 24 | 25 | return value; 26 | } 27 | 28 | /** 29 | * 获取中心坐标 30 | */ 31 | function parseCenter(zr, center) { 32 | return [ 33 | parsePercent(center[0], zr.getWidth()), 34 | parsePercent(center[1], zr.getHeight()) 35 | ]; 36 | } 37 | 38 | /** 39 | * 获取自适应半径 40 | */ 41 | function parseRadius(zr, radius) { 42 | // 传数组实现环形图,[内半径,外半径],传单个则默认为外半径为 43 | if (!(radius instanceof Array)) { 44 | radius = [0, radius]; 45 | } 46 | var zrSize = Math.min(zr.getWidth(), zr.getHeight()) / 2; 47 | return [ 48 | parsePercent(radius[0], zrSize), 49 | parsePercent(radius[1], zrSize) 50 | ]; 51 | } 52 | 53 | /** 54 | * 每三位默认加,格式化 55 | */ 56 | function addCommas(x) { 57 | if (isNaN(x)) { 58 | return '-'; 59 | } 60 | x = (x + '').split('.'); 61 | return x[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,'$1,') 62 | + (x.length > 1 ? ('.' + x[1]) : ''); 63 | } 64 | 65 | return { 66 | parsePercent : parsePercent, 67 | parseCenter : parseCenter, 68 | parseRadius : parseRadius, 69 | addCommas : addCommas 70 | }; 71 | }); -------------------------------------------------------------------------------- /static/src/util/projection/albers.js: -------------------------------------------------------------------------------- 1 | /** 2 | * echarts地图投射算法 3 | * 4 | * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 5 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 6 | * 7 | */ 8 | define(function() { 9 | // Derived from Tom Carden's Albers implementation for Protovis. 10 | // http://gist.github.com/476238 11 | // http://mathworld.wolfram.com/AlbersEqual-AreaConicProjection.html 12 | function _albers() { 13 | var radians = Math.PI / 180; 14 | var origin = [0, 0]; //[-98, 38], 15 | var parallels = [29.5, 45.5]; 16 | var scale = 1000; 17 | var translate = [0, 0]; //[480, 250], 18 | var lng0; // radians * origin[0] 19 | var n; 20 | var C; 21 | var p0; 22 | 23 | function albers(coordinates) { 24 | var t = n * (radians * coordinates[0] - lng0); 25 | var p = Math.sqrt( 26 | C - 2 * n * Math.sin(radians * coordinates[1]) 27 | ) / n; 28 | return [ 29 | scale * p * Math.sin(t) + translate[0], 30 | scale * (p * Math.cos(t) - p0) + translate[1] 31 | ]; 32 | } 33 | 34 | albers.invert = function (coordinates) { 35 | var x = (coordinates[0] - translate[0]) / scale; 36 | var y = (coordinates[1] - translate[1]) / scale; 37 | var p0y = p0 + y; 38 | var t = Math.atan2(x, p0y); 39 | var p = Math.sqrt(x * x + p0y * p0y); 40 | return [ 41 | (lng0 + t / n) / radians, 42 | Math.asin((C - p * p * n * n) / (2 * n)) / radians 43 | ]; 44 | }; 45 | 46 | function reload() { 47 | var phi1 = radians * parallels[0]; 48 | var phi2 = radians * parallels[1]; 49 | var lat0 = radians * origin[1]; 50 | var s = Math.sin(phi1); 51 | var c = Math.cos(phi1); 52 | lng0 = radians * origin[0]; 53 | n = 0.5 * (s + Math.sin(phi2)); 54 | C = c * c + 2 * n * s; 55 | p0 = Math.sqrt(C - 2 * n * Math.sin(lat0)) / n; 56 | return albers; 57 | } 58 | 59 | albers.origin = function (x) { 60 | if (!arguments.length) { 61 | return origin; 62 | } 63 | origin = [+x[0], +x[1]]; 64 | return reload(); 65 | }; 66 | 67 | albers.parallels = function (x) { 68 | if (!arguments.length) { 69 | return parallels; 70 | } 71 | parallels = [+x[0], +x[1]]; 72 | return reload(); 73 | }; 74 | 75 | albers.scale = function (x) { 76 | if (!arguments.length) { 77 | return scale; 78 | } 79 | scale = +x; 80 | return albers; 81 | }; 82 | 83 | albers.translate = function (x) { 84 | if (!arguments.length) { 85 | return translate; 86 | } 87 | translate = [+x[0], +x[1]]; 88 | return albers; 89 | }; 90 | 91 | return reload(); 92 | } 93 | 94 | return _albers; 95 | }); -------------------------------------------------------------------------------- /static/src/util/projection/mercator.js: -------------------------------------------------------------------------------- 1 | /** 2 | * echarts地图投射算法 3 | * 4 | * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 5 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 6 | * 7 | */ 8 | define(function() { 9 | // 墨卡托投射 10 | function _mercator() { 11 | var radians = Math.PI / 180; 12 | var scale = 500; 13 | var translate = [480, 250]; 14 | 15 | function mercator(coordinates) { 16 | var x = coordinates[0] / 360; 17 | var y = -(Math.log(Math.tan( 18 | Math.PI / 4 + coordinates[1] * radians / 2 19 | )) / radians) / 360; 20 | return [ 21 | scale * x + translate[0], 22 | scale * Math.max(-0.5, Math.min(0.5, y)) + translate[1] 23 | ]; 24 | } 25 | 26 | 27 | mercator.invert = function (coordinates) { 28 | var x = (coordinates[0] - translate[0]) / scale; 29 | var y = (coordinates[1] - translate[1]) / scale; 30 | return [ 31 | 360 * x, 32 | 2 * Math.atan(Math.exp(-360 * y * radians)) / radians - 90 33 | ]; 34 | }; 35 | 36 | mercator.scale = function (x) { 37 | if (!arguments.length) { 38 | return scale; 39 | } 40 | scale = +x; 41 | return mercator; 42 | }; 43 | 44 | mercator.translate = function (x) { 45 | if (!arguments.length) { 46 | return translate; 47 | } 48 | translate = [+x[0], +x[1]]; 49 | return mercator; 50 | }; 51 | 52 | return mercator; 53 | } 54 | 55 | return _mercator; 56 | }); -------------------------------------------------------------------------------- /static/src/util/shape/Candle.js: -------------------------------------------------------------------------------- 1 | /** 2 | * zrender 3 | * 4 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 5 | * 6 | * shape类:蜡烛 7 | * 可配图形属性: 8 | { 9 | // 基础属性 10 | shape : 'candle', // 必须,shape类标识,需要显式指定 11 | id : {string}, // 必须,图形唯一标识,可通过'zrender/tool/guid'方法生成 12 | zlevel : {number}, // 默认为0,z层level,决定绘画在哪层canvas中 13 | invisible : {boolean}, // 默认为false,是否可见 14 | 15 | // 样式属性,默认状态样式样式属性 16 | style : { 17 | x : {number}, // 必须,横坐标 18 | y : {Array}, // 必须,纵坐标数组 19 | }, 20 | 21 | // 样式属性,高亮样式属性,当不存在highlightStyle时使用基于默认样式扩展显示 22 | highlightStyle : { 23 | // 同style 24 | } 25 | 26 | // 交互属性,详见shape.Base 27 | 28 | // 事件属性,详见shape.Base 29 | } 30 | 例子: 31 | { 32 | shape : 'candle', 33 | id : '123456', 34 | zlevel : 1, 35 | style : { 36 | x : 200, 37 | y : [100,123,90,125], 38 | width : 150, 39 | color : '#eee', 40 | text : 'Baidu' 41 | }, 42 | myName : 'kener', // 可自带任何有效自定义属性 43 | 44 | clickable : true, 45 | onClick : function (eventPacket) { 46 | alert(eventPacket.target.myName); 47 | } 48 | } 49 | */ 50 | define(function (require) { 51 | var Base = require('zrender/shape/Base'); 52 | var zrUtil = require('zrender/tool/util'); 53 | 54 | function Candle(options) { 55 | Base.call(this, options); 56 | } 57 | 58 | Candle.prototype = { 59 | type: 'candle', 60 | _numberOrder : function (a, b) { 61 | return b - a; 62 | }, 63 | 64 | /** 65 | * 创建矩形路径 66 | * @param {Context2D} ctx Canvas 2D上下文 67 | * @param {Object} style 样式 68 | */ 69 | buildPath : function (ctx, style) { 70 | var yList = zrUtil.clone(style.y).sort(this._numberOrder); 71 | 72 | ctx.moveTo(style.x, yList[3]); 73 | ctx.lineTo(style.x, yList[2]); 74 | ctx.moveTo(style.x - style.width / 2, yList[2]); 75 | ctx.rect( 76 | style.x - style.width / 2, 77 | yList[2], 78 | style.width, 79 | yList[1] - yList[2] 80 | ); 81 | ctx.moveTo(style.x, yList[1]); 82 | ctx.lineTo(style.x, yList[0]); 83 | }, 84 | 85 | /** 86 | * 返回矩形区域,用于局部刷新和文字定位 87 | * @param {Object} style 88 | */ 89 | getRect : function (style) { 90 | if (!style.__rect) { 91 | var lineWidth = 0; 92 | if (style.brushType == 'stroke' || style.brushType == 'fill') { 93 | lineWidth = style.lineWidth || 1; 94 | } 95 | 96 | var yList = zrUtil.clone(style.y).sort(this._numberOrder); 97 | style.__rect = { 98 | x : Math.round(style.x - style.width / 2 - lineWidth / 2), 99 | y : Math.round(yList[3] - lineWidth / 2), 100 | width : style.width + lineWidth, 101 | height : yList[0] - yList[3] + lineWidth 102 | }; 103 | } 104 | 105 | return style.__rect; 106 | }, 107 | 108 | 109 | isCover : require('./normalIsCover') 110 | }; 111 | 112 | zrUtil.inherits(Candle, Base); 113 | 114 | return Candle; 115 | }); 116 | -------------------------------------------------------------------------------- /static/src/util/shape/Chain.js: -------------------------------------------------------------------------------- 1 | /** 2 | * zrender 3 | * 4 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 5 | * 6 | * shape类:时间轴线 7 | */ 8 | define(function (require) { 9 | var Base = require('zrender/shape/Base'); 10 | var IconShape = require('./Icon'); 11 | 12 | var dashedLineTo = require('zrender/shape/util/dashedLineTo'); 13 | var zrUtil = require('zrender/tool/util'); 14 | var matrix = require('zrender/tool/matrix'); 15 | 16 | function Chain(options) { 17 | Base.call(this, options); 18 | } 19 | 20 | Chain.prototype = { 21 | type : 'chain', 22 | 23 | /** 24 | * 画刷 25 | * @param ctx 画布句柄 26 | * @param e 形状实体 27 | * @param isHighlight 是否为高亮状态 28 | * @param updateCallback 需要异步加载资源的shape可以通过这个callback(e) 29 | * 让painter更新视图,base.brush没用,需要的话重载brush 30 | */ 31 | brush : function (ctx, isHighlight) { 32 | var style = this.style; 33 | 34 | if (isHighlight) { 35 | // 根据style扩展默认高亮样式 36 | style = this.getHighlightStyle( 37 | style, 38 | this.highlightStyle || {} 39 | ); 40 | } 41 | 42 | ctx.save(); 43 | this.setContext(ctx, style); 44 | 45 | // 设置transform 46 | this.setTransform(ctx); 47 | 48 | ctx.save(); 49 | ctx.beginPath(); 50 | this.buildLinePath(ctx, style); 51 | ctx.stroke(); 52 | ctx.restore(); 53 | 54 | this.brushSymbol(ctx, style); 55 | 56 | ctx.restore(); 57 | return; 58 | }, 59 | 60 | /** 61 | * 创建线条路径 62 | * @param {Context2D} ctx Canvas 2D上下文 63 | * @param {Object} style 样式 64 | */ 65 | buildLinePath : function (ctx, style) { 66 | var x = style.x; 67 | var y = style.y + 5; 68 | var width = style.width; 69 | var height = style.height / 2 - 10; 70 | 71 | ctx.moveTo(x, y); 72 | ctx.lineTo(x, y + height); 73 | ctx.moveTo(x + width, y); 74 | ctx.lineTo(x + width, y + height); 75 | 76 | ctx.moveTo(x, y + height / 2); 77 | if (!style.lineType || style.lineType == 'solid') { 78 | ctx.lineTo(x + width, y + height / 2); 79 | } 80 | else if (style.lineType == 'dashed' || style.lineType == 'dotted') { 81 | var dashLength = (style.lineWidth || 1) 82 | * (style.lineType == 'dashed' ? 5 : 1); 83 | dashedLineTo(ctx, x, y + height / 2, x + width, y + height / 2, dashLength); 84 | } 85 | }, 86 | 87 | /** 88 | * 标线始末标注 89 | */ 90 | brushSymbol : function (ctx, style) { 91 | var y = style.y + style.height / 4; 92 | ctx.save(); 93 | 94 | var chainPoint = style.chainPoint; 95 | var curPoint; 96 | for (var idx = 0, l = chainPoint.length; idx < l; idx++) { 97 | curPoint = chainPoint[idx]; 98 | if (curPoint.symbol != 'none') { 99 | ctx.beginPath(); 100 | var symbolSize = curPoint.symbolSize; 101 | IconShape.prototype.buildPath( 102 | ctx, 103 | { 104 | iconType : curPoint.symbol, 105 | x : curPoint.x - symbolSize, 106 | y : y - symbolSize, 107 | width : symbolSize * 2, 108 | height : symbolSize * 2, 109 | n : curPoint.n 110 | } 111 | ); 112 | ctx.fillStyle = curPoint.isEmpty ? '#fff' : style.strokeColor; 113 | ctx.closePath(); 114 | ctx.fill(); 115 | ctx.stroke(); 116 | } 117 | 118 | if (curPoint.showLabel) { 119 | ctx.font = curPoint.textFont; 120 | ctx.fillStyle = curPoint.textColor; 121 | ctx.textAlign = curPoint.textAlign; 122 | ctx.textBaseline = curPoint.textBaseline; 123 | if (curPoint.rotation) { 124 | ctx.save(); 125 | this._updateTextTransform(ctx, curPoint.rotation); 126 | ctx.fillText(curPoint.name, curPoint.textX, curPoint.textY); 127 | ctx.restore(); 128 | } 129 | else { 130 | ctx.fillText(curPoint.name, curPoint.textX, curPoint.textY); 131 | } 132 | } 133 | } 134 | 135 | ctx.restore(); 136 | }, 137 | 138 | _updateTextTransform : function (ctx, rotation) { 139 | var _transform = matrix.create(); 140 | matrix.identity(_transform); 141 | 142 | if (rotation[0] !== 0) { 143 | var originX = rotation[1] || 0; 144 | var originY = rotation[2] || 0; 145 | if (originX || originY) { 146 | matrix.translate( 147 | _transform, _transform, [-originX, -originY] 148 | ); 149 | } 150 | matrix.rotate(_transform, _transform, rotation[0]); 151 | if (originX || originY) { 152 | matrix.translate( 153 | _transform, _transform, [originX, originY] 154 | ); 155 | } 156 | } 157 | 158 | // 保存这个变换矩阵 159 | ctx.transform.apply(ctx, _transform); 160 | }, 161 | 162 | isCover : function (x, y) { 163 | var rect = this.style; 164 | if (x >= rect.x 165 | && x <= (rect.x + rect.width) 166 | && y >= rect.y 167 | && y <= (rect.y + rect.height) 168 | ) { 169 | // 矩形内 170 | return true; 171 | } 172 | else { 173 | return false; 174 | } 175 | } 176 | }; 177 | 178 | zrUtil.inherits(Chain, Base); 179 | 180 | return Chain; 181 | }); 182 | -------------------------------------------------------------------------------- /static/src/util/shape/Chord.js: -------------------------------------------------------------------------------- 1 | /** 2 | * zrender 3 | * 4 | * @author pissang (https://github.com/pissang) 5 | * 6 | * shape类:chord 7 | * 可配图形属性: 8 | { 9 | // 基础属性 10 | shape : 'chord', // 必须,shape类标识,需要显式指定 11 | id : {string}, // 必须,图形唯一标识,可通过'zrender/tool/guid'方法生成 12 | zlevel : {number}, // 默认为0,z层level,决定绘画在哪层canvas中 13 | invisible : {boolean}, // 默认为false,是否可见 14 | 15 | // 样式属性,默认状态样式样式属性 16 | style : { 17 | center : {array}, 18 | source0 : {number}, 19 | source1 : {number}, 20 | target0 : {number}, 21 | target1 : {number}, 22 | r : {number}, 23 | }, 24 | 25 | // 样式属性,高亮样式属性,当不存在highlightStyle时使用基于默认样式扩展显示 26 | highlightStyle : { 27 | // 同style 28 | } 29 | 30 | // 交互属性,详见shape.Base 31 | 32 | // 事件属性,详见shape.Base 33 | } 34 | */ 35 | define(function (require) { 36 | var Base = require('zrender/shape/Base'); 37 | var zrUtil = require('zrender/tool/util'); 38 | var _ctx = zrUtil.getContext(); 39 | 40 | function ChordShape(options) { 41 | Base.call(this, options); 42 | } 43 | 44 | ChordShape.prototype = { 45 | type : 'chord', 46 | 47 | // center, source0, source1, target0, target1, r 48 | buildPath : function (ctx, style) { 49 | var PI2 = Math.PI * 2; 50 | var cx = style.center[0]; 51 | var cy = style.center[1]; 52 | var r = style.r; 53 | var s0 = style.source0 / 180 * Math.PI; 54 | var s1 = style.source1 / 180 * Math.PI; 55 | var t0 = style.target0 / 180 * Math.PI; 56 | var t1 = style.target1 / 180 * Math.PI; 57 | var sx0 = cx + Math.cos(PI2 - s0) * r; 58 | var sy0 = cy - Math.sin(PI2 - s0) * r; 59 | var sx1 = cx + Math.cos(PI2 - s1) * r; 60 | var sy1 = cy - Math.sin(PI2 - s1) * r; 61 | var tx0 = cx + Math.cos(PI2 - t0) * r; 62 | var ty0 = cy - Math.sin(PI2 - t0) * r; 63 | var tx1 = cx + Math.cos(PI2 - t1) * r; 64 | var ty1 = cy - Math.sin(PI2 - t1) * r; 65 | 66 | ctx.moveTo(sx0, sy0); 67 | ctx.arc(cx, cy, style.r, s0, s1, false); 68 | ctx.bezierCurveTo( 69 | (cx - sx1) * 0.70 + sx1, 70 | (cy - sy1) * 0.70 + sy1, 71 | (cx - tx0) * 0.70 + tx0, 72 | (cy - ty0) * 0.70 + ty0, 73 | tx0, ty0 74 | ); 75 | // Chord to self 76 | if (style.source0 === style.target0 && 77 | style.source1 === style.target1) { 78 | return; 79 | } 80 | ctx.arc(cx, cy, style.r, t0, t1, false); 81 | ctx.bezierCurveTo( 82 | (cx - tx1) * 0.70 + tx1, 83 | (cy - ty1) * 0.70 + ty1, 84 | (cx - sx0) * 0.70 + sx0, 85 | (cy - sy0) * 0.70 + sy0, 86 | sx0, sy0 87 | ); 88 | }, 89 | 90 | getRect : function (){ 91 | return { 92 | x : 0, 93 | y : 0, 94 | width : 0, 95 | height : 0 96 | }; 97 | }, 98 | 99 | isCover : function (x, y) { 100 | if (!_ctx.isPointInPath) { // In ie 101 | return false; 102 | } 103 | var originPos = this.getTansform(x, y); 104 | x = originPos[0]; 105 | y = originPos[1]; 106 | 107 | _ctx.beginPath(); 108 | ChordShape.prototype.buildPath.call(null, _ctx, this.style); 109 | _ctx.closePath(); 110 | 111 | return _ctx.isPointInPath(x, y); 112 | } 113 | }; 114 | 115 | zrUtil.inherits(ChordShape, Base); 116 | 117 | return ChordShape; 118 | }); -------------------------------------------------------------------------------- /static/src/util/shape/Cross.js: -------------------------------------------------------------------------------- 1 | /** 2 | * zrender 3 | * 4 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 5 | * 6 | * shape类:十字准星 7 | * 可配图形属性: 8 | { 9 | // 基础属性 10 | shape : 'cross', // 必须,shape类标识,需要显式指定 11 | id : {string}, // 必须,图形唯一标识,可通过'zrender/tool/guid'方法生成 12 | zlevel : {number}, // 默认为0,z层level,决定绘画在哪层canvas中 13 | invisible : {boolean}, // 默认为false,是否可见 14 | 15 | // 样式属性,默认状态样式样式属性 16 | style : { 17 | rect : {Object}, // 必须,对角框 18 | x : {number}, // 必须,横坐标 19 | y : {number}, // 必须,纵坐标 20 | }, 21 | 22 | // 样式属性,高亮样式属性,当不存在highlightStyle时使用基于默认样式扩展显示 23 | highlightStyle : { 24 | // 同style 25 | } 26 | 27 | // 交互属性,详见shape.Base 28 | 29 | // 事件属性,详见shape.Base 30 | } 31 | */ 32 | define(function (require) { 33 | var Base = require('zrender/shape/Base'); 34 | var LineShape = require('zrender/shape/Line'); 35 | var zrUtil = require('zrender/tool/util'); 36 | 37 | function Cross(options) { 38 | Base.call(this, options); 39 | } 40 | 41 | Cross.prototype = { 42 | type : 'cross', 43 | 44 | /** 45 | * 创建矩形路径 46 | * @param {Context2D} ctx Canvas 2D上下文 47 | * @param {Object} style 样式 48 | */ 49 | buildPath : function (ctx, style) { 50 | var rect = style.rect; 51 | style.xStart = rect.x; 52 | style.xEnd = rect.x + rect.width; 53 | style.yStart = style.yEnd = style.y; 54 | LineShape.prototype.buildPath(ctx, style); 55 | style.xStart = style.xEnd = style.x; 56 | style.yStart = rect.y; 57 | style.yEnd = rect.y + rect.height; 58 | LineShape.prototype.buildPath(ctx, style); 59 | }, 60 | 61 | /** 62 | * 返回矩形区域,用于局部刷新和文字定位 63 | * @param {Object} style 64 | */ 65 | getRect : function (style) { 66 | return style.rect; 67 | }, 68 | 69 | isCover : require('./normalIsCover') 70 | }; 71 | 72 | zrUtil.inherits(Cross, Base); 73 | 74 | return Cross; 75 | }); 76 | -------------------------------------------------------------------------------- /static/src/util/shape/GaugePointer.js: -------------------------------------------------------------------------------- 1 | /** 2 | * zrender 3 | * 4 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 5 | * 6 | * shape类:仪表盘指针 7 | * 可配图形属性: 8 | { 9 | // 基础属性 10 | shape : 'gauge-pointer', // 必须,shape类标识,需要显式指定 11 | id : {string}, // 必须,图形唯一标识,可通过'zrender/tool/guid'方法生成 12 | zlevel : {number}, // 默认为0,z层level,决定绘画在哪层canvas中 13 | invisible : {boolean}, // 默认为false,是否可见 14 | 15 | // 样式属性,默认状态样式样式属性 16 | style : { 17 | xStart : {number}, // 必须,起点横坐标 18 | yStart : {number}, // 必须,起点纵坐标 19 | xEnd : {number}, // 必须,终点横坐标 20 | yEnd : {number}, // 必须,终点纵坐标 21 | strokeColor : {color}, // 默认为'#000',线条颜色(轮廓),支持rgba 22 | lineWidth : {number}, // 线条宽度 23 | }, 24 | 25 | // 交互属性,详见shape.Base 26 | 27 | // 事件属性,详见shape.Base 28 | } 29 | */ 30 | define(function (require) { 31 | var Base = require('zrender/shape/Base'); 32 | var zrUtil = require('zrender/tool/util'); 33 | 34 | function GaugePointer(options) { 35 | Base.call(this, options); 36 | } 37 | 38 | GaugePointer.prototype = { 39 | type: 'gauge-pointer', 40 | /** 41 | * 创建矩形路径 42 | * @param {Context2D} ctx Canvas 2D上下文 43 | * @param {Object} style 样式 44 | */ 45 | buildPath : function (ctx, style) { 46 | var r = style.r; 47 | var width = style.width; 48 | var angle = style.angle; 49 | var x = style.x - Math.cos(angle) * width * (width >= r / 3 ? 1 : 2); 50 | var y = style.y + Math.sin(angle) * width * (width >= r / 3 ? 1 : 2); 51 | 52 | angle = style.angle - Math.PI / 2; 53 | ctx.moveTo(x, y); 54 | ctx.lineTo( 55 | style.x + Math.cos(angle) * width, 56 | style.y - Math.sin(angle) * width 57 | ); 58 | ctx.lineTo( 59 | style.x + Math.cos(style.angle) * r, 60 | style.y - Math.sin(style.angle) * r 61 | ); 62 | ctx.lineTo( 63 | style.x - Math.cos(angle) * width, 64 | style.y + Math.sin(angle) * width 65 | ); 66 | ctx.lineTo(x, y); 67 | return; 68 | }, 69 | 70 | /** 71 | * 返回矩形区域,用于局部刷新和文字定位 72 | * @param {Object} style 73 | */ 74 | getRect : function(style) { 75 | if (style.__rect) { 76 | return style.__rect; 77 | } 78 | 79 | var width = style.width * 2; 80 | var xStart = style.x; 81 | var yStart = style.y; 82 | var xEnd = xStart + Math.cos(style.angle) * style.r; 83 | var yEnd = yStart - Math.sin(style.angle) * style.r; 84 | 85 | style.__rect = { 86 | x : Math.min(xStart, xEnd) - width, 87 | y : Math.min(yStart, yEnd) - width, 88 | width : Math.abs(xStart - xEnd) + width, 89 | height : Math.abs(yStart - yEnd) + width 90 | }; 91 | return style.__rect; 92 | }, 93 | 94 | isCover : require('./normalIsCover') 95 | }; 96 | 97 | zrUtil.inherits(GaugePointer, Base); 98 | 99 | return GaugePointer; 100 | }); 101 | -------------------------------------------------------------------------------- /static/src/util/shape/HalfSmoothPolygon.js: -------------------------------------------------------------------------------- 1 | /** 2 | * zrender 3 | * 4 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 5 | * 6 | * shape类:支持半平滑的polygon,折线面积图使用 7 | * 可配图形属性: 8 | { 9 | // 基础属性 10 | shape : 'halfSmoothPolygon', // 必须,shape类标识,需要显式指定 11 | id : {string}, // 必须,图形唯一标识,可通过'zrender/tool/guid'方法生成 12 | zlevel : {number}, // 默认为0,z层level,决定绘画在哪层canvas中 13 | invisible : {boolean}, // 默认为false,是否可见 14 | 15 | // 样式属性,默认状态样式样式属性 16 | style : { 17 | pointList : {Array}, // 必须,多边形各个顶角坐标 18 | }, 19 | 20 | // 样式属性,高亮样式属性,当不存在highlightStyle时使用基于默认样式扩展显示 21 | highlightStyle : { 22 | // 同style 23 | } 24 | 25 | // 交互属性,详见shape.Base 26 | 27 | // 事件属性,详见shape.Base 28 | } 29 | 例子: 30 | { 31 | shape : 'halfSmoothPolygon', 32 | id : '123456', 33 | zlevel : 1, 34 | style : { 35 | pointList : [[10, 10], [300, 20], [298, 400], [50, 450]] 36 | color : '#eee', 37 | text : 'Baidu' 38 | }, 39 | myName : 'kener', // 可自带任何有效自定义属性 40 | 41 | clickable : true, 42 | onClick : function (eventPacket) { 43 | alert(eventPacket.target.myName); 44 | } 45 | } 46 | */ 47 | define(function (require) { 48 | var Base = require('zrender/shape/Base'); 49 | var smoothBezier = require('zrender/shape/util/smoothBezier'); 50 | var zrUtil = require('zrender/tool/util'); 51 | 52 | function HalfSmoothPolygon(options) { 53 | Base.call(this, options); 54 | } 55 | 56 | HalfSmoothPolygon.prototype = { 57 | type : 'half-smooth-polygon', 58 | /** 59 | * 创建多边形路径 60 | * @param {Context2D} ctx Canvas 2D上下文 61 | * @param {Object} style 样式 62 | */ 63 | buildPath : function (ctx, style) { 64 | var pointList = style.pointList; 65 | if (pointList.length < 2) { 66 | // 少于2个点就不画了~ 67 | return; 68 | } 69 | if (style.smooth) { 70 | var controlPoints = smoothBezier( 71 | pointList.slice(0, -2), style.smooth, false, style.smoothConstraint 72 | ); 73 | 74 | ctx.moveTo(pointList[0][0], pointList[0][1]); 75 | var cp1; 76 | var cp2; 77 | var p; 78 | var l = pointList.length; 79 | for (var i = 0; i < l - 3; i++) { 80 | cp1 = controlPoints[i * 2]; 81 | cp2 = controlPoints[i * 2 + 1]; 82 | p = pointList[i + 1]; 83 | ctx.bezierCurveTo( 84 | cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1] 85 | ); 86 | } 87 | ctx.lineTo(pointList[l - 2][0], pointList[l - 2][1]); 88 | ctx.lineTo(pointList[l - 1][0], pointList[l - 1][1]); 89 | ctx.lineTo(pointList[0][0], pointList[0][1]); 90 | } 91 | else { 92 | require('zrender/shape/Polygon').prototype.buildPath( 93 | ctx, style 94 | ); 95 | } 96 | return; 97 | } 98 | }; 99 | 100 | zrUtil.inherits(HalfSmoothPolygon, Base); 101 | 102 | return HalfSmoothPolygon; 103 | }); -------------------------------------------------------------------------------- /static/src/util/shape/HandlePolygon.js: -------------------------------------------------------------------------------- 1 | /** 2 | * zrender 3 | * 4 | * @author Kener (@Kener-林峰, linzhifeng@baidu.com) 5 | * 6 | * shape类:handlePolygon,dataRange手柄 7 | */ 8 | define(function (require) { 9 | var Base = require('zrender/shape/Base'); 10 | var PolygonShape = require('zrender/shape/Polygon'); 11 | var zrUtil = require('zrender/tool/util'); 12 | 13 | function HandlePolygon(options) { 14 | Base.call(this, options); 15 | } 16 | 17 | HandlePolygon.prototype = { 18 | type : 'handle-polygon', 19 | /** 20 | * 创建多边形路径 21 | * @param {Context2D} ctx Canvas 2D上下文 22 | * @param {Object} style 样式 23 | */ 24 | buildPath : function (ctx, style) { 25 | PolygonShape.prototype.buildPath( 26 | ctx, style 27 | ); 28 | }, 29 | isCover : function (x, y) { 30 | var originPos = this.getTansform(x, y); 31 | x = originPos[0]; 32 | y = originPos[1]; 33 | 34 | // 不能缓存rect! 35 | var rect = this.style.rect; 36 | if (x >= rect.x 37 | && x <= (rect.x + rect.width) 38 | && y >= rect.y 39 | && y <= (rect.y + rect.height) 40 | ) { 41 | // 矩形内 42 | return true; 43 | } 44 | else { 45 | return false; 46 | } 47 | } 48 | }; 49 | zrUtil.inherits(HandlePolygon, Base); 50 | 51 | return HandlePolygon; 52 | }); 53 | -------------------------------------------------------------------------------- /static/src/util/shape/Ribbon.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @module echarts/util/shape/Ribbon 3 | * @author pissang (https://github.com/pissang) 4 | */ 5 | /** 6 | * @typedef {Object} IRibbonStyle 7 | * @property {number} x 8 | * @property {number} y 9 | * @property {number} source0 10 | * @property {number} source1 11 | * @property {number} target0 12 | * @property {number} target1 13 | * @property {number} r 14 | * @property {string} [brushType='fill'] 15 | * @property {string} [color='#000000'] 填充颜色 16 | * @property {string} [strokeColor='#000000'] 描边颜色 17 | * @property {string} [lineCape='butt'] 线帽样式,可以是 butt, round, square 18 | * @property {number} [lineWidth=1] 描边宽度 19 | * @property {number} [opacity=1] 绘制透明度 20 | * @property {number} [shadowBlur=0] 阴影模糊度,大于0有效 21 | * @property {string} [shadowColor='#000000'] 阴影颜色 22 | * @property {number} [shadowOffsetX=0] 阴影横向偏移 23 | * @property {number} [shadowOffsetY=0] 阴影纵向偏移 24 | * @property {string} [text] 图形中的附加文本 25 | * @property {string} [textColor='#000000'] 文本颜色 26 | * @property {string} [textFont] 附加文本样式,eg:'bold 18px verdana' 27 | * @property {string} [textPosition='end'] 附加文本位置, 可以是 inside, left, right, top, bottom 28 | * @property {string} [textAlign] 默认根据textPosition自动设置,附加文本水平对齐。 29 | * 可以是start, end, left, right, center 30 | * @property {string} [textBaseline] 默认根据textPosition自动设置,附加文本垂直对齐。 31 | * 可以是top, bottom, middle, alphabetic, hanging, ideographic 32 | */ 33 | define(function (require) { 34 | var Base = require('zrender/shape/Base'); 35 | var PathProxy = require('zrender/shape/util/PathProxy'); 36 | var zrUtil = require('zrender/tool/util'); 37 | var area = require('zrender/tool/area'); 38 | 39 | // var _ctx = zrUtil.getContext(); 40 | 41 | function RibbonShape(options) { 42 | Base.call(this, options); 43 | 44 | this._pathProxy = new PathProxy(); 45 | } 46 | 47 | RibbonShape.prototype = { 48 | type : 'chord', 49 | 50 | // center, source0, source1, target0, target1, r 51 | buildPath : function (ctx, style) { 52 | 53 | var path = this._pathProxy; 54 | path.begin(ctx); 55 | 56 | var PI2 = Math.PI * 2; 57 | var cx = style.x; 58 | var cy = style.y; 59 | var r = style.r; 60 | var s0 = style.source0 / 180 * Math.PI; 61 | var s1 = style.source1 / 180 * Math.PI; 62 | var t0 = style.target0 / 180 * Math.PI; 63 | var t1 = style.target1 / 180 * Math.PI; 64 | var sx0 = cx + Math.cos(PI2 - s0) * r; 65 | var sy0 = cy - Math.sin(PI2 - s0) * r; 66 | var sx1 = cx + Math.cos(PI2 - s1) * r; 67 | var sy1 = cy - Math.sin(PI2 - s1) * r; 68 | var tx0 = cx + Math.cos(PI2 - t0) * r; 69 | var ty0 = cy - Math.sin(PI2 - t0) * r; 70 | var tx1 = cx + Math.cos(PI2 - t1) * r; 71 | var ty1 = cy - Math.sin(PI2 - t1) * r; 72 | 73 | path.moveTo(sx0, sy0); 74 | path.arc(cx, cy, style.r, s0, s1, false); 75 | path.bezierCurveTo( 76 | (cx - sx1) * 0.70 + sx1, 77 | (cy - sy1) * 0.70 + sy1, 78 | (cx - tx0) * 0.70 + tx0, 79 | (cy - ty0) * 0.70 + ty0, 80 | tx0, ty0 81 | ); 82 | // Chord to self 83 | if (style.source0 === style.target0 84 | && style.source1 === style.target1 85 | ) { 86 | return; 87 | } 88 | path.arc(cx, cy, style.r, t0, t1, false); 89 | path.bezierCurveTo( 90 | (cx - tx1) * 0.70 + tx1, 91 | (cy - ty1) * 0.70 + ty1, 92 | (cx - sx0) * 0.70 + sx0, 93 | (cy - sy0) * 0.70 + sy0, 94 | sx0, sy0 95 | ); 96 | }, 97 | 98 | getRect : function (style) { 99 | if (style.__rect) { 100 | return style.__rect; 101 | } 102 | if (!this._pathProxy.isEmpty()) { 103 | this.buildPath(null, style); 104 | } 105 | return this._pathProxy.fastBoundingRect(); 106 | }, 107 | 108 | isCover : function (x, y) { 109 | var rect = this.getRect(this.style); 110 | if (x >= rect.x 111 | && x <= (rect.x + rect.width) 112 | && y >= rect.y 113 | && y <= (rect.y + rect.height) 114 | ) { 115 | return area.isInsidePath( 116 | this._pathProxy.pathCommands, 0, 'fill', x, y 117 | ); 118 | } 119 | } 120 | }; 121 | 122 | zrUtil.inherits(RibbonShape, Base); 123 | 124 | return RibbonShape; 125 | }); -------------------------------------------------------------------------------- /static/src/util/shape/normalIsCover.js: -------------------------------------------------------------------------------- 1 | // 由于大多数shape默认的isCover都是相同的逻辑 2 | // 所以在echarts里临时抽象一个module,用于isCover method 3 | // TODO: 对zrender的isCover和getRect方法进行抽象,重新整理该逻辑 4 | 5 | define(function () { 6 | return function (x, y) { 7 | var originPos = this.getTansform(x, y); 8 | x = originPos[0]; 9 | y = originPos[1]; 10 | 11 | // 快速预判并保留判断矩形 12 | var rect = this.style.__rect; 13 | if (!rect) { 14 | rect = this.style.__rect = this.getRect(this.style); 15 | } 16 | 17 | return x >= rect.x 18 | && x <= (rect.x + rect.width) 19 | && y >= rect.y 20 | && y <= (rect.y + rect.height); 21 | }; 22 | }); 23 | -------------------------------------------------------------------------------- /swan.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: swan.py 5 | # Desc: 2014-14/12/30:下午1:36 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | import requests 13 | from tornado.options import define, options 14 | 15 | from conf.config import salt_api_url, salt_api_user, salt_api_pass, config_url 16 | 17 | class open_service(object): 18 | 19 | def __init__(self, serverName, ip=None): 20 | self.serverName = serverName 21 | self.ip = ip 22 | self.headers = { 23 | 'User-agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 24 | "Accept": "application/json", 25 | } 26 | 27 | 28 | def push(self): 29 | url = "%s/autoDeploy/push?serverName=%s" % (config_url, self.serverName) 30 | req = requests.get(url, headers=self.headers) 31 | context = req.json() 32 | return context 33 | 34 | def online_run(self): 35 | url = "%s/autoDeploy/online?serverName=%s&ip=%s" % (config_url, self.serverName, self.ip) 36 | print url 37 | try: 38 | req = requests.get(url, headers=self.headers) 39 | context = req.json() 40 | print context 41 | except: 42 | context = {"retCode": 503, "retMsg": req.text} 43 | return context 44 | 45 | def offline_run(self): 46 | url = "%s/autoDeploy/offline?serverName=%s&ip=%s" % (config_url, self.serverName, self.ip) 47 | try: 48 | req = requests.get(url, headers=self.headers) 49 | context = req.json() 50 | print context 51 | except: 52 | context = {"retCode": 503, "retMsg": req.text} 53 | return context 54 | 55 | if __name__ == '__main__': 56 | status = {"retCode": 1} 57 | Open_push = open_service("OpenSubscribNotifyBackend") 58 | rest = Open_push.push() 59 | 60 | # if not rest: 61 | # print "推送api请求失败" 62 | # status["retCode"] = 0 63 | # else: 64 | # print "推送api请求完成" 65 | # 66 | if status["retCode"]: 67 | up_server = open_service("OpenSubscribNotifyBackend", "192.168.135.242") 68 | rest = up_server.online_run() 69 | 70 | if rest: 71 | print "上线成功" 72 | else: 73 | print "上线失败" 74 | 75 | # if status["retCode"]: 76 | # down_server = open_service("OpenSubscribNotifyBackend", "192.168.135.243") 77 | # rest = down_server.online_run() 78 | # 79 | # if rest: 80 | # print "下线成功" 81 | # else: 82 | # print "下线失败" 83 | 84 | 85 | -------------------------------------------------------------------------------- /templates/login.html: -------------------------------------------------------------------------------- 1 |
    2 | Name: 3 | 4 |
    -------------------------------------------------------------------------------- /templates/project/project_index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {% for i in project_data["test"] %} 9 |
  • {{ i["node"]["node"] }}
  • 10 |
  • {{ i["node"]["config"] }}
  • 11 |
  • {{ i["node"]["project_name"] }}
  • 12 | {% end %} 13 | 14 | -------------------------------------------------------------------------------- /templates/register.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
    8 | 9 | 10 | 11 | 12 |
    13 | 14 | -------------------------------------------------------------------------------- /templates/waf_line.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ECharts 6 | 7 | 8 | 9 | 10 | 11 | 12 |
    13 |
    14 |
    15 | 16 | 17 |
    18 | 19 |
    20 | 21 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /templates/waf_pie.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ECharts 6 | 7 | 8 | 9 | 10 | 11 | 12 |
    13 |
    14 |
    15 | 16 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /templates/weibo_add.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
    8 | 微博: 9 | 10 |
    11 | 12 | -------------------------------------------------------------------------------- /templates/weibo_list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | asdfsaf 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import logging 4 | 5 | import tornado.httpserver 6 | import tornado.ioloop 7 | import tornado.web 8 | import tornado.websocket 9 | from tornado.options import define, options 10 | from tornado.process import Subprocess 11 | 12 | define("port", default=7777, help="Run server on a specific port", type=int) 13 | 14 | html_template = """ 15 | 16 | 17 | 18 | tornado WebSocket example 19 | 20 | 21 | 22 | 23 |
    24 |

    tornado WebSocket example

    25 |
    26 | WebSocket status : 27 |
    28 |
     29 |       
    30 |
    31 |
    32 |
    33 | 57 | 58 | 59 | """ 60 | 61 | 62 | class IndexHandler(tornado.web.RequestHandler): 63 | def get(self): 64 | self.write(html_template) 65 | 66 | 67 | class LogStreamer(tornado.websocket.WebSocketHandler): 68 | def open(self): 69 | filename = "/tmp/simple_foobar.log" 70 | self.proc = Subprocess(["tail", "-f", filename, "-n", "0"], 71 | stdout=Subprocess.STREAM, 72 | bufsize=1) 73 | self.proc.set_exit_callback(self._close) 74 | self.proc.stdout.read_until("\n", self.write_line) 75 | 76 | def _close(self, *args, **kwargs): 77 | self.close() 78 | 79 | def on_close(self, *args, **kwargs): 80 | logging.info("trying to kill process") 81 | self.proc.proc.terminate() 82 | self.proc.proc.wait() 83 | 84 | def write_line(self, data): 85 | logging.info("Returning to client: %s" % data.strip()) 86 | self.write_message(data.strip() + "
    ") 87 | self.proc.stdout.read_until("\n", self.write_line) 88 | 89 | 90 | application = tornado.web.Application([ 91 | (r"/", IndexHandler), 92 | (r"/tail", LogStreamer), 93 | ]) 94 | 95 | if __name__ == "__main__": 96 | http_server = tornado.httpserver.HTTPServer(application) 97 | tornado.options.parse_command_line() 98 | http_server.listen(options.port) 99 | logging.info("TornadoLog started. Point your browser to http://localhost:%d/tail" % 100 | options.port) 101 | tornado.ioloop.IOLoop.instance().start() -------------------------------------------------------------------------------- /test_mongo.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: test_mongo.py 5 | # Desc: 2014-14/12/31:下午1:51 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | from mongoengine import * 13 | 14 | class shop_locations(Document): 15 | shop_id = IntField() 16 | shop_name = StringField() 17 | activated = StringField() 18 | address = StringField() 19 | category = StringField() 20 | lng = StringField() 21 | lat = StringField() 22 | location = ListField(FloatField()) 23 | 24 | if __name__ == '__main__': 25 | # 连接shop_locations库 26 | connect('config_center') 27 | # shop_id为1的记录是否存在,不存在则创建,存在则打印出地址 28 | try: 29 | sl = shop_locations.objects.get(shop_id=1) 30 | except shop_locations.DoesNotExist: 31 | sl = shop_locations() 32 | sl.shop_id = 1 33 | sl.shop_name = 'Starbucks' 34 | sl.activated = 'Y' 35 | sl.address = '921, Whitehorse Road, Box Hill,Melbourne,3128, Victoria, Australia' 36 | sl.category = 'cafe' 37 | sl.lng = '145.1225427' 38 | sl.lat = '-37.8181463' 39 | sl.location = [145.1225427, -37.8181463] 40 | sl.save() 41 | else: 42 | print sl.address 43 | print sl.shop_name 44 | print sl.category -------------------------------------------------------------------------------- /tornado_main.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: tornado_main.py 5 | # Desc: 2015-15/1/7:下午1:55 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | from concurrent.futures import ThreadPoolExecutor 13 | from functools import partial, wraps 14 | import time 15 | 16 | import tornado.ioloop 17 | import tornado.web 18 | from websocket import create_connection 19 | 20 | EXECUTOR = ThreadPoolExecutor(max_workers=1) 21 | 22 | 23 | def unblock(f): 24 | 25 | @tornado.web.asynchronous 26 | @wraps(f) 27 | def wrapper(*args, **kwargs): 28 | self = args[0] 29 | 30 | def callback(future): 31 | self.write(future.result()) 32 | self.finish() 33 | 34 | EXECUTOR.submit( 35 | partial(f, *args, **kwargs) 36 | ).add_done_callback( 37 | lambda future: tornado.ioloop.IOLoop.instance().add_callback( 38 | partial(callback, future))) 39 | 40 | return wrapper 41 | 42 | 43 | class MainHandler(tornado.web.RequestHandler): 44 | 45 | def get(self): 46 | self.write("Hello, world %s" % time.time()) 47 | 48 | 49 | class SleepHandler(tornado.web.RequestHandler): 50 | 51 | @unblock 52 | def get(self, n): 53 | time.sleep(float(n)) 54 | return "Awake! %s" % time.time() 55 | 56 | 57 | class SleepAsyncHandler(tornado.web.RequestHandler): 58 | 59 | @tornado.web.asynchronous 60 | def get(self, n): 61 | 62 | def callback(future): 63 | self.write(future.result()) 64 | self.finish() 65 | 66 | EXECUTOR.submit( 67 | partial(self.get_, n) 68 | ).add_done_callback( 69 | lambda future: tornado.ioloop.IOLoop.instance().add_callback( 70 | partial(callback, future))) 71 | 72 | def get_(self, n): 73 | time.sleep(float(n)) 74 | return "Awake! %s" % time.time() 75 | 76 | 77 | application = tornado.web.Application([ 78 | (r"/", MainHandler), 79 | (r"/sleep/(\d+)", SleepHandler), 80 | (r"/sleep_async/(\d+)", SleepAsyncHandler), 81 | ]) 82 | 83 | 84 | if __name__ == "__main__": 85 | application.listen(8888) 86 | tornado.ioloop.IOLoop.instance().start() -------------------------------------------------------------------------------- /urls.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | #-*- coding: utf-8 -*- 3 | #============================================================================= 4 | # FileName: urls.py 5 | # Desc: 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # Version: 0.0.1 10 | # LastChange: 2014 14-2-23 上午12:40 11 | # History: 12 | #============================================================================= 13 | 14 | 15 | from chat.message import WebSocketHandler 16 | # from index import MainHandler 17 | from push import push_data, git_swan, git_shell, GitJava 18 | 19 | handlers = [ 20 | (r'^/swan_api/git/', git_swan), 21 | (r'^/swan_api/shell/', git_shell), 22 | (r'^/swan_api/java/', GitJava), 23 | (r'^/swan_api/', push_data), 24 | (r'^/websocket/$', WebSocketHandler), 25 | 26 | ] -------------------------------------------------------------------------------- /user_auth.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: user_auth.py 5 | # Desc: 2015-15/1/16:下午3:43 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | import tornado.httpserver 13 | import tornado.ioloop 14 | import tornado.options 15 | import tornado.web 16 | import tornado.httpclient 17 | import time 18 | import tornado.websocket 19 | from tornado.escape import json_encode 20 | from salt_api.salt_https_api import token_id, salt_api_token, salt_api_useradd 21 | import nmap 22 | 23 | 24 | from functools import partial, wraps 25 | from concurrent.futures import ThreadPoolExecutor 26 | import json 27 | from websocket import create_connection 28 | import tornado.gen 29 | import tornado.concurrent 30 | from tornado.concurrent import run_on_executor 31 | # from salt.output import display_output 32 | import yaml 33 | from tornado.options import define, options 34 | define('salt_api_url') 35 | define('salt_api_pass') 36 | define('salt_api_user') 37 | 38 | EXECUTOR = ThreadPoolExecutor(max_workers=4) 39 | 40 | 41 | def unblock(f): 42 | 43 | @tornado.web.asynchronous 44 | @wraps(f) 45 | def wrapper(*args, **kwargs): 46 | self = args[0] 47 | def callback(future): 48 | self.write(future.result()) 49 | self.finish() 50 | 51 | EXECUTOR.submit( 52 | partial(f, *args, **kwargs) 53 | ).add_done_callback( 54 | lambda future: tornado.ioloop.IOLoop.instance().add_callback( 55 | partial(callback, future))) 56 | 57 | return wrapper 58 | 59 | 60 | # class push_data(tornado.web.RequestHandler): 61 | class user_add(tornado.web.RequestHandler): 62 | 63 | """注册方法""" 64 | 65 | # @tornado.web.asynchronous 66 | def get(self): 67 | self.write(json.dumps({"status": 403, "result": "error"}, indent=4)) 68 | 69 | executor = ThreadPoolExecutor(2) 70 | @tornado.web.asynchronous 71 | @tornado.gen.coroutine 72 | def post(self): 73 | user = self.get_argument("user") 74 | gid = self.get_argument("gid") 75 | uid = self.get_argument("uid") 76 | key = self.get_argument("key") 77 | group = self.get_argument("group") 78 | self.write(json.dumps({"status": 200, "result": "OK"}, indent=4)) 79 | self.finish() 80 | self.useradd(user, gid, uid, key, group) 81 | 82 | @run_on_executor 83 | def useradd(self, user, gid, uid, key, group): 84 | token_api_id = token_id() 85 | gid = "gid=%s" % (gid) 86 | uid = "uid=%s" % (uid) 87 | home = "home=/home/users/%s" %(user) 88 | shell = "shell=/bin/bash" 89 | print "111" 90 | # s = requests.post(salt_api_url, headers=headers, data='"client"="local", "fun"="user.add", "tgt"="hadoop01", [("arg",user), ("arg", gid), ("arg", uid), ("arg", home), ("arg", shell)]') 91 | list = salt_api_useradd( 92 | {'client': 'local', 'fun': 'user.add', 'tgt': "hadoop01", 93 | "arg": [user, gid, uid, home, shell], 'timeout': 100}, options.salt_api_url, 94 | {"X-Auth-Token": token_api_id} 95 | ) 96 | master_status = list.run() 97 | print master_status 98 | # key = "%s" % (key) 99 | # add_key = salt_api_useradd( 100 | # {'client': 'local', 'fun': 'cmd.script', 'tgt': "hadoop01", 101 | # "arg": ["salt://usr/user_key.sh", user, key, group], 'timeout': 100}, salt_api_url, 102 | # {"X-Auth-Token": token_api_id} 103 | # ) 104 | # print add_key 105 | # master_status = add_key.run() 106 | # print "#" * 100 107 | # print master_status 108 | return True 109 | 110 | # class push_data(tornado.web.RequestHandler): 111 | class user_del(tornado.web.RequestHandler): 112 | 113 | """注册方法""" 114 | 115 | # @tornado.web.asynchronous 116 | def get(self): 117 | self.write(json.dumps({"status": 403, "result": "error"}, indent=4)) 118 | 119 | executor = ThreadPoolExecutor(2) 120 | @tornado.web.asynchronous 121 | @tornado.gen.coroutine 122 | def post(self): 123 | user = self.get_argument("user") 124 | fqdn = self.get_argument("fqdn") 125 | self.write(json.dumps({"status": 200, "result": "OK"}, indent=4)) 126 | self.finish() 127 | self.userdel(user, fqdn) 128 | 129 | @run_on_executor 130 | def userdel(self, user, fqdn): 131 | token_api_id = token_id() 132 | user = "gid=%s" % (user) 133 | 134 | # s = requests.post(salt_api_url, headers=headers, data='"client"="local", "fun"="user.add", "tgt"="hadoop01", [("arg",user), ("arg", gid), ("arg", uid), ("arg", home), ("arg", shell)]') 135 | list = salt_api_useradd( 136 | {'client': 'local', 'fun': 'user.delete', 'tgt': fqdn, 137 | "arg": [user, 'remove=True', 'force=True'], 'timeout': 100}, options.salt_api_url, 138 | {"X-Auth-Token": token_api_id} 139 | ) 140 | master_status = list.run() 141 | print master_status 142 | 143 | return True -------------------------------------------------------------------------------- /web_socket.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # ============================================================================= 4 | # FileName: web_socket.py 5 | # Desc: 2015-15/1/6:下午6:30 6 | # Author: 苦咖啡 7 | # Email: voilet@qq.com 8 | # HomePage: http://blog.kukafei520.net 9 | # History: 10 | # ============================================================================= 11 | 12 | from websocket import create_connection 13 | import time 14 | import json 15 | 16 | # ws = create_connection("ws://127.0.0.1:8888/weebsocket/?jobs_id=r_220c3dbb05a1bae1e6ad0bec4a6ac331") 17 | # while True: 18 | ws = create_connection("ws://push-service.fun.tv/playcontrol/ws/pushsrv?mac=1c:a7:70:a8:0b:37&sn=142i96n68101037&fingerprint=Skyworth/SkyHi3751V800_A8H82/Hi3751V800:4.4.2/KOT49H/015.005.050:eng/test-keys&deviceId=1151&serialnum=unknown&androidid=ad9c1aec89b54c5c&board=bigfish&brand=Skyworth&cpuabi=armeabi-v7a&manufacturer=Skyworth+Inc.&modle=Skyworth+8H82+G8200&progduct=SkyHi3751V800_A8H82&versionrelease=4.4.2+HiDPTAndroid&versionsdk=19&densitydpi=240.0&density=1.5&widthpixels=1920&heightpixels=1080") 19 | #ws.send(json.dumps({"data": "测试信息哦", "to_mail": "r_220c3dbb05a1bae1e6ad0bec4a6ac331"})) 20 | result = ws.recv() 21 | # time.sleep(2) 22 | # print "Received '%s'" % result 23 | ws.close() 24 | 25 | --------------------------------------------------------------------------------