span class="pull-left add"> 0   utils/redis/connect.py
  • 1 0
      utils/redis/rkeys.py
  • 0 0
      utils/user/__init__.py
  • 18 0
      utils/user/userinfo_save.py
  • + 29 - 0
    .editorconfig

    @@ -0,0 +1,29 @@
    1
    +# EditorConfig is awesome: http://EditorConfig.org
    2
    +
    3
    +# top-most EditorConfig file
    4
    +root = true
    5
    +
    6
    +# Unix-style newlines with a newline ending every file
    7
    +[*]
    8
    +end_of_line = lf
    9
    +insert_final_newline = false
    10
    +
    11
    +# 4 space indentation
    12
    +[*.py]
    13
    +indent_style = space
    14
    +indent_size = 4
    15
    +
    16
    +# Tab indentation (no size specified)
    17
    +[*.js]
    18
    +indent_style = space
    19
    +indent_size = 4
    20
    +
    21
    +# Tab indentation (no size specified)
    22
    +[*.html]
    23
    +indent_style = space
    24
    +indent_size = 4
    25
    +
    26
    +# Matches the exact files either package.json or .travis.yml
    27
    +[{package.json,.travis.yml}]
    28
    +indent_style = space
    29
    +indent_size = 2

    + 32 - 0
    .gitignore

    @@ -0,0 +1,32 @@
    1
    +*.db
    2
    +*.rdb
    3
    +*.swp
    4
    +*.idea
    5
    +*.sqlite3
    6
    +*.DS_Store
    7
    +*.python-version
    8
    +
    9
    +# Compiled python modules.
    10
    +*.pyc
    11
    +
    12
    +# Setuptools distribution folder.
    13
    +/build/
    14
    +/dist/
    15
    +
    16
    +# Python egg metadata, regenerated from source files by setuptools.
    17
    +/*.egg-info
    18
    +/*.egg
    19
    +
    20
    +# Locked file for Excel etc
    21
    +.~lock.*
    22
    +
    23
    +# Django File
    24
    +local_settings.py
    25
    +local_settings_dev.py
    26
    +
    27
    +# Django Dir
    28
    +media/
    29
    +collect_static/
    30
    +
    31
    +# Qiniu
    32
    +.qiniu_pythonsdk_hostscache.json

    + 8 - 0
    .isort.cfg

    @@ -0,0 +1,8 @@
    1
    +# See the menu of settings available here:
    2
    +#   https://github.com/timothycrosley/isort/wiki/isort-Settings
    3
    +
    4
    +[settings]
    5
    +indent='    '
    6
    +line_length=120
    7
    +lines_after_imports=2
    8
    +skip=build,migrations,.tox

    + 2 - 0
    README.md

    @@ -0,0 +1,2 @@
    1
    +# Django
    2
    +  * https://docs.djangoproject.com/en/dev/releases/

    + 0 - 0
    api/__init__.py


    + 7 - 0
    api/admin.py

    @@ -0,0 +1,7 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +from __future__ import unicode_literals
    3
    +
    4
    +from django.contrib import admin
    5
    +
    6
    +
    7
    +# Register your models here.

    + 8 - 0
    api/apps.py

    @@ -0,0 +1,8 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +from __future__ import unicode_literals
    3
    +
    4
    +from django.apps import AppConfig
    5
    +
    6
    +
    7
    +class ApiConfig(AppConfig):
    8
    +    name = 'api'

    + 0 - 0
    api/migrations/__init__.py


    + 7 - 0
    api/models.py

    @@ -0,0 +1,7 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +from __future__ import unicode_literals
    3
    +
    4
    +from django.db import models
    5
    +
    6
    +
    7
    +# Create your models here.

    + 27 - 0
    api/oauth_views.py

    @@ -0,0 +1,27 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +from __future__ import division
    4
    +
    5
    +from django.conf import settings
    6
    +from django.db import transaction
    7
    +from django.shortcuts import redirect
    8
    +from django.urls import reverse
    9
    +from furl import furl
    10
    +
    11
    +from utils.redis.connect import r
    12
    +from utils.user.userinfo_save import userinfo_save
    13
    +
    14
    +
    15
    +@transaction.atomic
    16
    +def oauth_redirect(request):
    17
    +    # Save profile or something else
    18
    +    user = userinfo_save(request.GET)
    19
    +
    20
    +    token_check_key = getattr(user, settings.TOKEN_CHECK_KEY)
    21
    +
    22
    +    query_params = {
    23
    +        settings.TOKEN_CHECK_KEY: token_check_key,
    24
    +        'vtoken': r.token(token_check_key, ex=False, buf=False),
    25
    +    }
    26
    +
    27
    +    return redirect(furl(reverse('page:user_oauth')).add(request.GET).add(query_params).url)

    + 7 - 0
    api/tests.py

    @@ -0,0 +1,7 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +from __future__ import unicode_literals
    3
    +
    4
    +from django.test import TestCase
    5
    +
    6
    +
    7
    +# Create your tests here.

    + 14 - 0
    api/urls.py

    @@ -0,0 +1,14 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +from django.urls import re_path
    4
    +
    5
    +from api import oauth_views
    6
    +
    7
    +
    8
    +urlpatterns = [
    9
    +]
    10
    +
    11
    +urlpatterns += [
    12
    +    re_path(r'^3rd/or$', oauth_views.oauth_redirect, name='3rd_or'),
    13
    +    re_path(r'^3rd/oauth_redirect$', oauth_views.oauth_redirect, name='3rd_oauth_redirect'),
    14
    +]

    + 4 - 0
    api/views.py

    @@ -0,0 +1,4 @@
    1
    +from django.shortcuts import render
    2
    +
    3
    +
    4
    +# Create your views here.

    + 9 - 0
    check.sh

    @@ -0,0 +1,9 @@
    1
    +#!/bin/bash
    2
    +
    3
    +echo '>> iSort'
    4
    +./isort.sh
    5
    +echo
    6
    +
    7
    +echo '>> PEP8'
    8
    +./pep8.sh
    9
    +echo

    + 0 - 0
    commands/__init__.py


    + 4 - 0
    commands/admin.py

    @@ -0,0 +1,4 @@
    1
    +from django.contrib import admin
    2
    +
    3
    +
    4
    +# Register your models here.

    + 7 - 0
    commands/apps.py

    @@ -0,0 +1,7 @@
    1
    +from __future__ import unicode_literals
    2
    +
    3
    +from django.apps import AppConfig
    4
    +
    5
    +
    6
    +class CommandConfig(AppConfig):
    7
    +    name = 'commands'

    + 0 - 0
    commands/management/__init__.py


    + 0 - 0
    commands/management/commands/__init__.py


    + 37 - 0
    commands/management/commands/cmd_bak.py

    @@ -0,0 +1,37 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +import logging
    4
    +
    5
    +from django.db import transaction
    6
    +from django_six import CompatibilityBaseCommand, close_old_connections
    7
    +
    8
    +from utils.redis.connect import r
    9
    +
    10
    +
    11
    +logger = logging.getLogger('console')
    12
    +
    13
    +
    14
    +class Command(CompatibilityBaseCommand):
    15
    +    def handle(self, *args, **options):
    16
    +
    17
    +        logger.info('Templet bak cmd is dealing')
    18
    +
    19
    +        while True:
    20
    +            # r.rpush('TEMPLET_CMD_KEY', '')
    21
    +            # kv = r.blpop('TEMPLET_CMD_KEY', 60)
    22
    +            # k, v = (kv[0], kv[1]) if kv else (None, None)
    23
    +            #
    24
    +            # r.rpushjson('TEMPLET_CMD_KEY', {})
    25
    +            k, v = r.blpopjson('TEMPLET_CMD_KEY', 60)
    26
    +
    27
    +            if not v:
    28
    +                continue
    29
    +
    30
    +            logger.info(v)
    31
    +
    32
    +            close_old_connections()
    33
    +
    34
    +            with transaction.atomic():
    35
    +                pass
    36
    +
    37
    +            close_old_connections()

    + 55 - 0
    commands/management/commands/cmd_bak2.py

    @@ -0,0 +1,55 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +import logging
    4
    +from collections import deque
    5
    +
    6
    +from django.db import transaction
    7
    +from django_six import CompatibilityBaseCommand, close_old_connections
    8
    +
    9
    +from utils.redis.connect import r
    10
    +
    11
    +
    12
    +logger = logging.getLogger('console')
    13
    +
    14
    +
    15
    +class Command(CompatibilityBaseCommand):
    16
    +    def handle(self, *args, **options):
    17
    +
    18
    +        logger.info('Templet bak cmd is dealing')
    19
    +
    20
    +        keys = deque(['TEMPLET_CMD_KEY1', 'TEMPLET_CMD_KEY2'])
    21
    +
    22
    +        while True:
    23
    +            # r.rpush('TEMPLET_CMD_KEY', '')
    24
    +            # kv = r.blpop('TEMPLET_CMD_KEY', 60)
    25
    +            # k, v = (kv[0], kv[1]) if kv else (None, None)
    26
    +            #
    27
    +            # r.rpushjson('TEMPLET_CMD_KEY', {})
    28
    +            #
    29
    +            # Refer: https://redis.io/commands/blpop
    30
    +            # Keys are checked in the order that they are given.
    31
    +            # If not rotate keys.
    32
    +            # Some keys may not be checked at all times.
    33
    +            k, v = r.blpopjson(keys, 60)
    34
    +
    35
    +            keys.rotate(1)
    36
    +
    37
    +            if not v:
    38
    +                continue
    39
    +
    40
    +            logger.info(v)
    41
    +
    42
    +            close_old_connections()
    43
    +
    44
    +            if k == 'TEMPLET_CMD_KEY1':
    45
    +                with transaction.atomic():
    46
    +                    pass
    47
    +
    48
    +            elif k == 'TEMPLET_CMD_KEY2':
    49
    +                with transaction.atomic():
    50
    +                    pass
    51
    +
    52
    +            else:
    53
    +                continue
    54
    +
    55
    +            close_old_connections()

    + 24 - 0
    commands/management/commands/cmd_bak3.py

    @@ -0,0 +1,24 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +import logging
    4
    +
    5
    +from django.db import transaction
    6
    +from django_six import CompatibilityBaseCommand, close_old_connections
    7
    +
    8
    +
    9
    +logger = logging.getLogger('console')
    10
    +
    11
    +
    12
    +class Command(CompatibilityBaseCommand):
    13
    +    def handle(self, *args, **options):
    14
    +        # Crontab
    15
    +        # 5 0 * * * /home/../python /home/../manage.py cmd_bak3
    16
    +
    17
    +        logger.info('Templet bak cmd is dealing')
    18
    +
    19
    +        close_old_connections()
    20
    +
    21
    +        with transaction.atomic():
    22
    +            pass
    23
    +
    24
    +        close_old_connections()

    + 0 - 0
    commands/migrations/__init__.py


    + 6 - 0
    commands/models.py

    @@ -0,0 +1,6 @@
    1
    +from __future__ import unicode_literals
    2
    +
    3
    +from django.db import models
    4
    +
    5
    +
    6
    +# Create your models here.

    + 4 - 0
    commands/tests.py

    @@ -0,0 +1,4 @@
    1
    +from django.test import TestCase
    2
    +
    3
    +
    4
    +# Create your tests here.

    + 4 - 0
    commands/views.py

    @@ -0,0 +1,4 @@
    1
    +from django.shortcuts import render
    2
    +
    3
    +
    4
    +# Create your views here.

    + 0 - 0
    data/__init__.py


    + 7 - 0
    data/admin.py

    @@ -0,0 +1,7 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +from __future__ import unicode_literals
    3
    +
    4
    +from django.contrib import admin
    5
    +
    6
    +
    7
    +# Register your models here.

    + 8 - 0
    data/apps.py

    @@ -0,0 +1,8 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +from __future__ import unicode_literals
    3
    +
    4
    +from django.apps import AppConfig
    5
    +
    6
    +
    7
    +class DataConfig(AppConfig):
    8
    +    name = 'data'

    + 0 - 0
    data/migrations/__init__.py


    + 7 - 0
    data/models.py

    @@ -0,0 +1,7 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +from __future__ import unicode_literals
    3
    +
    4
    +from django.db import models
    5
    +
    6
    +
    7
    +# Create your models here.

    + 3982 - 0
    data/static/data/cn/area.json

    @@ -0,0 +1,3982 @@
    1
    +{
    2
    +  "86": {
    3
    +    "110000": "北京市",
    4
    +    "120000": "天津市",
    5
    +    "130000": "河北省",
    6
    +    "140000": "山西省",
    7
    +    "150000": "内蒙古自治区",
    8
    +    "210000": "辽宁省",
    9
    +    "220000": "吉林省",
    10
    +    "230000": "黑龙江省",
    11
    +    "310000": "上海市",
    12
    +    "320000": "江苏省",
    13
    +    "330000": "浙江省",
    14
    +    "340000": "安徽省",
    15
    +    "350000": "福建省",
    16
    +    "360000": "江西省",
    17
    +    "370000": "山东省",
    18
    +    "410000": "河南省",
    19
    +    "420000": "湖北省",
    20
    +    "430000": "湖南省",
    21
    +    "440000": "广东省",
    22
    +    "450000": "广西壮族自治区",
    23
    +    "460000": "海南省",
    24
    +    "500000": "重庆市",
    25
    +    "510000": "四川省",
    26
    +    "520000": "贵州省",
    27
    +    "530000": "云南省",
    28
    +    "540000": "西藏自治区",
    29
    +    "610000": "陕西省",
    30
    +    "620000": "甘肃省",
    31
    +    "630000": "青海省",
    32
    +    "640000": "宁夏回族自治区",
    33
    +    "650000": "新疆维吾尔自治区",
    34
    +    "710000": "台湾省",
    35
    +    "810000": "香港特别行政区",
    36
    +    "820000": "澳门特别行政区"
    37
    +  },
    38
    +  "110000": {
    39
    +    "110100": "市辖区"
    40
    +  },
    41
    +  "110100": {
    42
    +    "110101": "东城区",
    43
    +    "110102": "西城区",
    44
    +    "110105": "朝阳区",
    45
    +    "110106": "丰台区",
    46
    +    "110107": "石景山区",
    47
    +    "110108": "海淀区",
    48
    +    "110109": "门头沟区",
    49
    +    "110111": "房山区",
    50
    +    "110112": "通州区",
    51
    +    "110113": "顺义区",
    52
    +    "110114": "昌平区",
    53
    +    "110115": "大兴区",
    54
    +    "110116": "怀柔区",
    55
    +    "110117": "平谷区",
    56
    +    "110118": "密云区",
    57
    +    "110119": "延庆区"
    58
    +  },
    59
    +  "120000": {
    60
    +    "120100": "市辖区"
    61
    +  },
    62
    +  "120100": {
    63
    +    "120101": "和平区",
    64
    +    "120102": "河东区",
    65
    +    "120103": "河西区",
    66
    +    "120104": "南开区",
    67
    +    "120105": "河北区",
    68
    +    "120106": "红桥区",
    69
    +    "120110": "东丽区",
    70
    +    "120111": "西青区",
    71
    +    "120112": "津南区",
    72
    +    "120113": "北辰区",
    73
    +    "120114": "武清区",
    74
    +    "120115": "宝坻区",
    75
    +    "120116": "滨海新区",
    76
    +    "120117": "宁河区",
    77
    +    "120118": "静海区",
    78
    +    "120119": "蓟州区"
    79
    +  },
    80
    +  "130000": {
    81
    +    "130100": "石家庄市",
    82
    +    "130200": "唐山市",
    83
    +    "130300": "秦皇岛市",
    84
    +    "130400": "邯郸市",
    85
    +    "130500": "邢台市",
    86
    +    "130600": "保定市",
    87
    +    "130700": "张家口市",
    88
    +    "130800": "承德市",
    89
    +    "130900": "沧州市",
    90
    +    "131000": "廊坊市",
    91
    +    "131100": "衡水市",
    92
    +    "139001": "定州市",
    93
    +    "139002": "辛集市"
    94
    +  },
    95
    +  "130100": {
    96
    +    "130102": "长安区",
    97
    +    "130104": "桥西区",
    98
    +    "130105": "新华区",
    99
    +    "130107": "井陉矿区",
    100
    +    "130108": "裕华区",
    101
    +    "130109": "藁城区",
    102
    +    "130110": "鹿泉区",
    103
    +    "130111": "栾城区",
    104
    +    "130121": "井陉县",
    105
    +    "130123": "正定县",
    106
    +    "130125": "行唐县",
    107
    +    "130126": "灵寿县",
    108
    +    "130127": "高邑县",
    109
    +    "130128": "深泽县",
    110
    +    "130129": "赞皇县",
    111
    +    "130130": "无极县",
    112
    +    "130131": "平山县",
    113
    +    "130132": "元氏县",
    114
    +    "130133": "赵县",
    115
    +    "130183": "晋州市",
    116
    +    "130184": "新乐市"
    117
    +  },
    118
    +  "130200": {
    119
    +    "130202": "路南区",
    120
    +    "130203": "路北区",
    121
    +    "130204": "古冶区",
    122
    +    "130205": "开平区",
    123
    +    "130207": "丰南区",
    124
    +    "130208": "丰润区",
    125
    +    "130209": "曹妃甸区",
    126
    +    "130223": "滦县",
    127
    +    "130224": "滦南县",
    128
    +    "130225": "乐亭县",
    129
    +    "130227": "迁西县",
    130
    +    "130229": "玉田县",
    131
    +    "130281": "遵化市",
    132
    +    "130283": "迁安市"
    133
    +  },
    134
    +  "130300": {
    135
    +    "130302": "海港区",
    136
    +    "130303": "山海关区",
    137
    +    "130304": "北戴河区",
    138
    +    "130306": "抚宁区",
    139
    +    "130321": "青龙满族自治县",
    140
    +    "130322": "昌黎县",
    141
    +    "130324": "卢龙县"
    142
    +  },
    143
    +  "130400": {
    144
    +    "130402": "邯山区",
    145
    +    "130403": "丛台区",
    146
    +    "130404": "复兴区",
    147
    +    "130406": "峰峰矿区",
    148
    +    "130421": "邯郸县",
    149
    +    "130423": "临漳县",
    150
    +    "130424": "成安县",
    151
    +    "130425": "大名县",
    152
    +    "130426": "涉县",
    153
    +    "130427": "磁县",
    154
    +    "130428": "肥乡县",
    155
    +    "130429": "永年县",
    156
    +    "130430": "邱县",
    157
    +    "130431": "鸡泽县",
    158
    +    "130432": "广平县",
    159
    +    "130433": "馆陶县",
    160
    +    "130434": "魏县",
    161
    +    "130435": "曲周县",
    162
    +    "130481": "武安市"
    163
    +  },
    164
    +  "130500": {
    165
    +    "130502": "桥东区",
    166
    +    "130503": "桥西区",
    167
    +    "130521": "邢台县",
    168
    +    "130522": "临城县",
    169
    +    "130523": "内丘县",
    170
    +    "130524": "柏乡县",
    171
    +    "130525": "隆尧县",
    172
    +    "130526": "任县",
    173
    +    "130527": "南和县",
    174
    +    "130528": "宁晋县",
    175
    +    "130529": "巨鹿县",
    176
    +    "130530": "新河县",
    177
    +    "130531": "广宗县",
    178
    +    "130532": "平乡县",
    179
    +    "130533": "威县",
    180
    +    "130534": "清河县",
    181
    +    "130535": "临西县",
    182
    +    "130581": "南宫市",
    183
    +    "130582": "沙河市"
    184
    +  },
    185
    +  "130600": {
    186
    +    "130602": "竞秀区",
    187
    +    "130606": "莲池区",
    188
    +    "130607": "满城区",
    189
    +    "130608": "清苑区",
    190
    +    "130609": "徐水区",
    191
    +    "130623": "涞水县",
    192
    +    "130624": "阜平县",
    193
    +    "130626": "定兴县",
    194
    +    "130627": "唐县",
    195
    +    "130628": "高阳县",
    196
    +    "130629": "容城县",
    197
    +    "130630": "涞源县",
    198
    +    "130631": "望都县",
    199
    +    "130632": "安新县",
    200
    +    "130633": "易县",
    201
    +    "130634": "曲阳县",
    202
    +    "130635": "蠡县",
    203
    +    "130636": "顺平县",
    204
    +    "130637": "博野县",
    205
    +    "130638": "雄县",
    206
    +    "130681": "涿州市",
    207
    +    "130683": "安国市",
    208
    +    "130684": "高碑店市"
    209
    +  },
    210
    +  "130700": {
    211
    +    "130702": "桥东区",
    212
    +    "130703": "桥西区",
    213
    +    "130705": "宣化区",
    214
    +    "130706": "下花园区",
    215
    +    "130708": "万全区",
    216
    +    "130709": "崇礼区",
    217
    +    "130722": "张北县",
    218
    +    "130723": "康保县",
    219
    +    "130724": "沽源县",
    220
    +    "130725": "尚义县",
    221
    +    "130726": "蔚县",
    222
    +    "130727": "阳原县",
    223
    +    "130728": "怀安县",
    224
    +    "130730": "怀来县",
    225
    +    "130731": "涿鹿县",
    226
    +    "130732": "赤城县"
    227
    +  },
    228
    +  "130800": {
    229
    +    "130802": "双桥区",
    230
    +    "130803": "双滦区",
    231
    +    "130804": "鹰手营子矿区",
    232
    +    "130821": "承德县",
    233
    +    "130822": "兴隆县",
    234
    +    "130823": "平泉县",
    235
    +    "130824": "滦平县",
    236
    +    "130825": "隆化县",
    237
    +    "130826": "丰宁满族自治县",
    238
    +    "130827": "宽城满族自治县",
    239
    +    "130828": "围场满族蒙古族自治县"
    240
    +  },
    241
    +  "130900": {
    242
    +    "130902": "新华区",
    243
    +    "130903": "运河区",
    244
    +    "130921": "沧县",
    245
    +    "130922": "青县",
    246
    +    "130923": "东光县",
    247
    +    "130924": "海兴县",
    248
    +    "130925": "盐山县",
    249
    +    "130926": "肃宁县",
    250
    +    "130927": "南皮县",
    251
    +    "130928": "吴桥县",
    252
    +    "130929": "献县",
    253
    +    "130930": "孟村回族自治县",
    254
    +    "130981": "泊头市",
    255
    +    "130982": "任丘市",
    256
    +    "130983": "黄骅市",
    257
    +    "130984": "河间市"
    258
    +  },
    259
    +  "131000": {
    260
    +    "131002": "安次区",
    261
    +    "131003": "广阳区",
    262
    +    "131022": "固安县",
    263
    +    "131023": "永清县",
    264
    +    "131024": "香河县",
    265
    +    "131025": "大城县",
    266
    +    "131026": "文安县",
    267
    +    "131028": "大厂回族自治县",
    268
    +    "131081": "霸州市",
    269
    +    "131082": "三河市"
    270
    +  },
    271
    +  "131100": {
    272
    +    "131102": "桃城区",
    273
    +    "131103": "冀州区",
    274
    +    "131121": "枣强县",
    275
    +    "131122": "武邑县",
    276
    +    "131123": "武强县",
    277
    +    "131124": "饶阳县",
    278
    +    "131125": "安平县",
    279
    +    "131126": "故城县",
    280
    +    "131127": "景县",
    281
    +    "131128": "阜城县",
    282
    +    "131182": "深州市"
    283
    +  },
    284
    +  "140000": {
    285
    +    "140100": "太原市",
    286
    +    "140200": "大同市",
    287
    +    "140300": "阳泉市",
    288
    +    "140400": "长治市",
    289
    +    "140500": "晋城市",
    290
    +    "140600": "朔州市",
    291
    +    "140700": "晋中市",
    292
    +    "140800": "运城市",
    293
    +    "140900": "忻州市",
    294
    +    "141000": "临汾市",
    295
    +    "141100": "吕梁市"
    296
    +  },
    297
    +  "140100": {
    298
    +    "140105": "小店区",
    299
    +    "140106": "迎泽区",
    300
    +    "140107": "杏花岭区",
    301
    +    "140108": "尖草坪区",
    302
    +    "140109": "万柏林区",
    303
    +    "140110": "晋源区",
    304
    +    "140121": "清徐县",
    305
    +    "140122": "阳曲县",
    306
    +    "140123": "娄烦县",
    307
    +    "140181": "古交市"
    308
    +  },
    309
    +  "140200": {
    310
    +    "140202": "城区",
    311
    +    "140203": "矿区",
    312
    +    "140211": "南郊区",
    313
    +    "140212": "新荣区",
    314
    +    "140221": "阳高县",
    315
    +    "140222": "天镇县",
    316
    +    "140223": "广灵县",
    317
    +    "140224": "灵丘县",
    318
    +    "140225": "浑源县",
    319
    +    "140226": "左云县",
    320
    +    "140227": "大同县"
    321
    +  },
    322
    +  "140300": {
    323
    +    "140302": "城区",
    324
    +    "140303": "矿区",
    325
    +    "140311": "郊区",
    326
    +    "140321": "平定县",
    327
    +    "140322": "盂县"
    328
    +  },
    329
    +  "140400": {
    330
    +    "140402": "城区",
    331
    +    "140411": "郊区",
    332
    +    "140421": "长治县",
    333
    +    "140423": "襄垣县",
    334
    +    "140424": "屯留县",
    335
    +    "140425": "平顺县",
    336
    +    "140426": "黎城县",
    337
    +    "140427": "壶关县",
    338
    +    "140428": "长子县",
    339
    +    "140429": "武乡县",
    340
    +    "140430": "沁县",
    341
    +    "140431": "沁源县",
    342
    +    "140481": "潞城市"
    343
    +  },
    344
    +  "140500": {
    345
    +    "140502": "城区",
    346
    +    "140521": "沁水县",
    347
    +    "140522": "阳城县",
    348
    +    "140524": "陵川县",
    349
    +    "140525": "泽州县",
    350
    +    "140581": "高平市"
    351
    +  },
    352
    +  "140600": {
    353
    +    "140602": "朔城区",
    354
    +    "140603": "平鲁区",
    355
    +    "140621": "山阴县",
    356
    +    "140622": "应县",
    357
    +    "140623": "右玉县",
    358
    +    "140624": "怀仁县"
    359
    +  },
    360
    +  "140700": {
    361
    +    "140702": "榆次区",
    362
    +    "140721": "榆社县",
    363
    +    "140722": "左权县",
    364
    +    "140723": "和顺县",
    365
    +    "140724": "昔阳县",
    366
    +    "140725": "寿阳县",
    367
    +    "140726": "太谷县",
    368
    +    "140727": "祁县",
    369
    +    "140728": "平遥县",
    370
    +    "140729": "灵石县",
    371
    +    "140781": "介休市"
    372
    +  },
    373
    +  "140800": {
    374
    +    "140802": "盐湖区",
    375
    +    "140821": "临猗县",
    376
    +    "140822": "万荣县",
    377
    +    "140823": "闻喜县",
    378
    +    "140824": "稷山县",
    379
    +    "140825": "新绛县",
    380
    +    "140826": "绛县",
    381
    +    "140827": "垣曲县",
    382
    +    "140828": "夏县",
    383
    +    "140829": "平陆县",
    384
    +    "140830": "芮城县",
    385
    +    "140881": "永济市",
    386
    +    "140882": "河津市"
    387
    +  },
    388
    +  "140900": {
    389
    +    "140902": "忻府区",
    390
    +    "140921": "定襄县",
    391
    +    "140922": "五台县",
    392
    +    "140923": "代县",
    393
    +    "140924": "繁峙县",
    394
    +    "140925": "宁武县",
    395
    +    "140926": "静乐县",
    396
    +    "140927": "神池县",
    397
    +    "140928": "五寨县",
    398
    +    "140929": "岢岚县",
    399
    +    "140930": "河曲县",
    400
    +    "140931": "保德县",
    401
    +    "140932": "偏关县",
    402
    +    "140981": "原平市"
    403
    +  },
    404
    +  "141000": {
    405
    +    "141002": "尧都区",
    406
    +    "141021": "曲沃县",
    407
    +    "141022": "翼城县",
    408
    +    "141023": "襄汾县",
    409
    +    "141024": "洪洞县",
    410
    +    "141025": "古县",
    411
    +    "141026": "安泽县",
    412
    +    "141027": "浮山县",
    413
    +    "141028": "吉县",
    414
    +    "141029": "乡宁县",
    415
    +    "141030": "大宁县",
    416
    +    "141031": "隰县",
    417
    +    "141032": "永和县",
    418
    +    "141033": "蒲县",
    419
    +    "141034": "汾西县",
    420
    +    "141081": "侯马市",
    421
    +    "141082": "霍州市"
    422
    +  },
    423
    +  "141100": {
    424
    +    "141102": "离石区",
    425
    +    "141121": "文水县",
    426
    +    "141122": "交城县",
    427
    +    "141123": "兴县",
    428
    +    "141124": "临县",
    429
    +    "141125": "柳林县",
    430
    +    "141126": "石楼县",
    431
    +    "141127": "岚县",
    432
    +    "141128": "方山县",
    433
    +    "141129": "中阳县",
    434
    +    "141130": "交口县",
    435
    +    "141181": "孝义市",
    436
    +    "141182": "汾阳市"
    437
    +  },
    438
    +  "150000": {
    439
    +    "150100": "呼和浩特市",
    440
    +    "150200": "包头市",
    441
    +    "150300": "乌海市",
    442
    +    "150400": "赤峰市",
    443
    +    "150500": "通辽市",
    444
    +    "150600": "鄂尔多斯市",
    445
    +    "150700": "呼伦贝尔市",
    446
    +    "150800": "巴彦淖尔市",
    447
    +    "150900": "乌兰察布市",
    448
    +    "152200": "兴安盟",
    449
    +    "152500": "锡林郭勒盟",
    450
    +    "152900": "阿拉善盟"
    451
    +  },
    452
    +  "150100": {
    453
    +    "150102": "新城区",
    454
    +    "150103": "回民区",
    455
    +    "150104": "玉泉区",
    456
    +    "150105": "赛罕区",
    457
    +    "150121": "土默特左旗",
    458
    +    "150122": "托克托县",
    459
    +    "150123": "和林格尔县",
    460
    +    "150124": "清水河县",
    461
    +    "150125": "武川县"
    462
    +  },
    463
    +  "150200": {
    464
    +    "150202": "东河区",
    465
    +    "150203": "昆都仑区",
    466
    +    "150204": "青山区",
    467
    +    "150205": "石拐区",
    468
    +    "150206": "白云鄂博矿区",
    469
    +    "150207": "九原区",
    470
    +    "150221": "土默特右旗",
    471
    +    "150222": "固阳县",
    472
    +    "150223": "达尔罕茂明安联合旗"
    473
    +  },
    474
    +  "150300": {
    475
    +    "150302": "海勃湾区",
    476
    +    "150303": "海南区",
    477
    +    "150304": "乌达区"
    478
    +  },
    479
    +  "150400": {
    480
    +    "150402": "红山区",
    481
    +    "150403": "元宝山区",
    482
    +    "150404": "松山区",
    483
    +    "150421": "阿鲁科尔沁旗",
    484
    +    "150422": "巴林左旗",
    485
    +    "150423": "巴林右旗",
    486
    +    "150424": "林西县",
    487
    +    "150425": "克什克腾旗",
    488
    +    "150426": "翁牛特旗",
    489
    +    "150428": "喀喇沁旗",
    490
    +    "150429": "宁城县",
    491
    +    "150430": "敖汉旗"
    492
    +  },
    493
    +  "150500": {
    494
    +    "150502": "科尔沁区",
    495
    +    "150521": "科尔沁左翼中旗",
    496
    +    "150522": "科尔沁左翼后旗",
    497
    +    "150523": "开鲁县",
    498
    +    "150524": "库伦旗",
    499
    +    "150525": "奈曼旗",
    500
    +    "150526": "扎鲁特旗",
    501
    +    "150581": "霍林郭勒市"
    502
    +  },
    503
    +  "150600": {
    504
    +    "150602": "东胜区",
    505
    +    "150603": "康巴什区",
    506
    +    "150621": "达拉特旗",
    507
    +    "150622": "准格尔旗",
    508
    +    "150623": "鄂托克前旗",
    509
    +    "150624": "鄂托克旗",
    510
    +    "150625": "杭锦旗",
    511
    +    "150626": "乌审旗",
    512
    +    "150627": "伊金霍洛旗"
    513
    +  },
    514
    +  "150700": {
    515
    +    "150702": "海拉尔区",
    516
    +    "150703": "扎赉诺尔区",
    517
    +    "150721": "阿荣旗",
    518
    +    "150722": "莫力达瓦达斡尔族自治旗",
    519
    +    "150723": "鄂伦春自治旗",
    520
    +    "150724": "鄂温克族自治旗",
    521
    +    "150725": "陈巴尔虎旗",
    522
    +    "150726": "新巴尔虎左旗",
    523
    +    "150727": "新巴尔虎右旗",
    524
    +    "150781": "满洲里市",
    525
    +    "150782": "牙克石市",
    526
    +    "150783": "扎兰屯市",
    527
    +    "150784": "额尔古纳市",
    528
    +    "150785": "根河市"
    529
    +  },
    530
    +  "150800": {
    531
    +    "150802": "临河区",
    532
    +    "150821": "五原县",
    533
    +    "150822": "磴口县",
    534
    +    "150823": "乌拉特前旗",
    535
    +    "150824": "乌拉特中旗",
    536
    +    "150825": "乌拉特后旗",
    537
    +    "150826": "杭锦后旗"
    538
    +  },
    539
    +  "150900": {
    540
    +    "150902": "集宁区",
    541
    +    "150921": "卓资县",
    542
    +    "150922": "化德县",
    543
    +    "150923": "商都县",
    544
    +    "150924": "兴和县",
    545
    +    "150925": "凉城县",
    546
    +    "150926": "察哈尔右翼前旗",
    547
    +    "150927": "察哈尔右翼中旗",
    548
    +    "150928": "察哈尔右翼后旗",
    549
    +    "150929": "四子王旗",
    550
    +    "150981": "丰镇市"
    551
    +  },
    552
    +  "152200": {
    553
    +    "152201": "乌兰浩特市",
    554
    +    "152202": "阿尔山市",
    555
    +    "152221": "科尔沁右翼前旗",
    556
    +    "152222": "科尔沁右翼中旗",
    557
    +    "152223": "扎赉特旗",
    558
    +    "152224": "突泉县"
    559
    +  },
    560
    +  "152500": {
    561
    +    "152501": "二连浩特市",
    562
    +    "152502": "锡林浩特市",
    563
    +    "152522": "阿巴嘎旗",
    564
    +    "152523": "苏尼特左旗",
    565
    +    "152524": "苏尼特右旗",
    566
    +    "152525": "东乌珠穆沁旗",
    567
    +    "152526": "西乌珠穆沁旗",
    568
    +    "152527": "太仆寺旗",
    569
    +    "152528": "镶黄旗",
    570
    +    "152529": "正镶白旗",
    571
    +    "152530": "正蓝旗",
    572
    +    "152531": "多伦县"
    573
    +  },
    574
    +  "152900": {
    575
    +    "152921": "阿拉善左旗",
    576
    +    "152922": "阿拉善右旗",
    577
    +    "152923": "额济纳旗"
    578
    +  },
    579
    +  "210000": {
    580
    +    "210100": "沈阳市",
    581
    +    "210200": "大连市",
    582
    +    "210300": "鞍山市",
    583
    +    "210400": "抚顺市",
    584
    +    "210500": "本溪市",
    585
    +    "210600": "丹东市",
    586
    +    "210700": "锦州市",
    587
    +    "210800": "营口市",
    588
    +    "210900": "阜新市",
    589
    +    "211000": "辽阳市",
    590
    +    "211100": "盘锦市",
    591
    +    "211200": "铁岭市",
    592
    +    "211300": "朝阳市",
    593
    +    "211400": "葫芦岛市"
    594
    +  },
    595
    +  "210100": {
    596
    +    "210102": "和平区",
    597
    +    "210103": "沈河区",
    598
    +    "210104": "大东区",
    599
    +    "210105": "皇姑区",
    600
    +    "210106": "铁西区",
    601
    +    "210111": "苏家屯区",
    602
    +    "210112": "浑南区",
    603
    +    "210113": "沈北新区",
    604
    +    "210114": "于洪区",
    605
    +    "210115": "辽中区",
    606
    +    "210123": "康平县",
    607
    +    "210124": "法库县",
    608
    +    "210181": "新民市"
    609
    +  },
    610
    +  "210200": {
    611
    +    "210202": "中山区",
    612
    +    "210203": "西岗区",
    613
    +    "210204": "沙河口区",
    614
    +    "210211": "甘井子区",
    615
    +    "210212": "旅顺口区",
    616
    +    "210213": "金州区",
    617
    +    "210214": "普兰店区",
    618
    +    "210224": "长海县",
    619
    +    "210281": "瓦房店市",
    620
    +    "210283": "庄河市"
    621
    +  },
    622
    +  "210300": {
    623
    +    "210302": "铁东区",
    624
    +    "210303": "铁西区",
    625
    +    "210304": "立山区",
    626
    +    "210311": "千山区",
    627
    +    "210321": "台安县",
    628
    +    "210323": "岫岩满族自治县",
    629
    +    "210381": "海城市"
    630
    +  },
    631
    +  "210400": {
    632
    +    "210402": "新抚区",
    633
    +    "210403": "东洲区",
    634
    +    "210404": "望花区",
    635
    +    "210411": "顺城区",
    636
    +    "210421": "抚顺县",
    637
    +    "210422": "新宾满族自治县",
    638
    +    "210423": "清原满族自治县"
    639
    +  },
    640
    +  "210500": {
    641
    +    "210502": "平山区",
    642
    +    "210503": "溪湖区",
    643
    +    "210504": "明山区",
    644
    +    "210505": "南芬区",
    645
    +    "210521": "本溪满族自治县",
    646
    +    "210522": "桓仁满族自治县"
    647
    +  },
    648
    +  "210600": {
    649
    +    "210602": "元宝区",
    650
    +    "210603": "振兴区",
    651
    +    "210604": "振安区",
    652
    +    "210624": "宽甸满族自治县",
    653
    +    "210681": "东港市",
    654
    +    "210682": "凤城市"
    655
    +  },
    656
    +  "210700": {
    657
    +    "210702": "古塔区",
    658
    +    "210703": "凌河区",
    659
    +    "210711": "太和区",
    660
    +    "210726": "黑山县",
    661
    +    "210727": "义县",
    662
    +    "210781": "凌海市",
    663
    +    "210782": "北镇市"
    664
    +  },
    665
    +  "210800": {
    666
    +    "210802": "站前区",
    667
    +    "210803": "西市区",
    668
    +    "210804": "鲅鱼圈区",
    669
    +    "210811": "老边区",
    670
    +    "210881": "盖州市",
    671
    +    "210882": "大石桥市"
    672
    +  },
    673
    +  "210900": {
    674
    +    "210902": "海州区",
    675
    +    "210903": "新邱区",
    676
    +    "210904": "太平区",
    677
    +    "210905": "清河门区",
    678
    +    "210911": "细河区",
    679
    +    "210921": "阜新蒙古族自治县",
    680
    +    "210922": "彰武县"
    681
    +  },
    682
    +  "211000": {
    683
    +    "211002": "白塔区",
    684
    +    "211003": "文圣区",
    685
    +    "211004": "宏伟区",
    686
    +    "211005": "弓长岭区",
    687
    +    "211011": "太子河区",
    688
    +    "211021": "辽阳县",
    689
    +    "211081": "灯塔市"
    690
    +  },
    691
    +  "211100": {
    692
    +    "211102": "双台子区",
    693
    +    "211103": "兴隆台区",
    694
    +    "211104": "大洼区",
    695
    +    "211122": "盘山县"
    696
    +  },
    697
    +  "211200": {
    698
    +    "211202": "银州区",
    699
    +    "211204": "清河区",
    700
    +    "211221": "铁岭县",
    701
    +    "211223": "西丰县",
    702
    +    "211224": "昌图县",
    703
    +    "211281": "调兵山市",
    704
    +    "211282": "开原市"
    705
    +  },
    706
    +  "211300": {
    707
    +    "211302": "双塔区",
    708
    +    "211303": "龙城区",
    709
    +    "211321": "朝阳县",
    710
    +    "211322": "建平县",
    711
    +    "211324": "喀喇沁左翼蒙古族自治县",
    712
    +    "211381": "北票市",
    713
    +    "211382": "凌源市"
    714
    +  },
    715
    +  "211400": {
    716
    +    "211402": "连山区",
    717
    +    "211403": "龙港区",
    718
    +    "211404": "南票区",
    719
    +    "211421": "绥中县",
    720
    +    "211422": "建昌县",
    721
    +    "211481": "兴城市"
    722
    +  },
    723
    +  "220000": {
    724
    +    "220100": "长春市",
    725
    +    "220200": "吉林市",
    726
    +    "220300": "四平市",
    727
    +    "220400": "辽源市",
    728
    +    "220500": "通化市",
    729
    +    "220600": "白山市",
    730
    +    "220700": "松原市",
    731
    +    "220800": "白城市",
    732
    +    "222400": "延边朝鲜族自治州"
    733
    +  },
    734
    +  "220100": {
    735
    +    "220102": "南关区",
    736
    +    "220103": "宽城区",
    737
    +    "220104": "朝阳区",
    738
    +    "220105": "二道区",
    739
    +    "220106": "绿园区",
    740
    +    "220112": "双阳区",
    741
    +    "220113": "九台区",
    742
    +    "220122": "农安县",
    743
    +    "220182": "榆树市",
    744
    +    "220183": "德惠市"
    745
    +  },
    746
    +  "220200": {
    747
    +    "220202": "昌邑区",
    748
    +    "220203": "龙潭区",
    749
    +    "220204": "船营区",
    750
    +    "220211": "丰满区",
    751
    +    "220221": "永吉县",
    752
    +    "220281": "蛟河市",
    753
    +    "220282": "桦甸市",
    754
    +    "220283": "舒兰市",
    755
    +    "220284": "磐石市"
    756
    +  },
    757
    +  "220300": {
    758
    +    "220302": "铁西区",
    759
    +    "220303": "铁东区",
    760
    +    "220322": "梨树县",
    761
    +    "220323": "伊通满族自治县",
    762
    +    "220381": "公主岭市",
    763
    +    "220382": "双辽市"
    764
    +  },
    765
    +  "220400": {
    766
    +    "220402": "龙山区",
    767
    +    "220403": "西安区",
    768
    +    "220421": "东丰县",
    769
    +    "220422": "东辽县"
    770
    +  },
    771
    +  "220500": {
    772
    +    "220502": "东昌区",
    773
    +    "220503": "二道江区",
    774
    +    "220521": "通化县",
    775
    +    "220523": "辉南县",
    776
    +    "220524": "柳河县",
    777
    +    "220581": "梅河口市",
    778
    +    "220582": "集安市"
    779
    +  },
    780
    +  "220600": {
    781
    +    "220602": "浑江区",
    782
    +    "220605": "江源区",
    783
    +    "220621": "抚松县",
    784
    +    "220622": "靖宇县",
    785
    +    "220623": "长白朝鲜族自治县",
    786
    +    "220681": "临江市"
    787
    +  },
    788
    +  "220700": {
    789
    +    "220702": "宁江区",
    790
    +    "220721": "前郭尔罗斯蒙古族自治县",
    791
    +    "220722": "长岭县",
    792
    +    "220723": "乾安县",
    793
    +    "220781": "扶余市"
    794
    +  },
    795
    +  "220800": {
    796
    +    "220802": "洮北区",
    797
    +    "220821": "镇赉县",
    798
    +    "220822": "通榆县",
    799
    +    "220881": "洮南市",
    800
    +    "220882": "大安市"
    801
    +  },
    802
    +  "222400": {
    803
    +    "222401": "延吉市",
    804
    +    "222402": "图们市",
    805
    +    "222403": "敦化市",
    806
    +    "222404": "珲春市",
    807
    +    "222405": "龙井市",
    808
    +    "222406": "和龙市",
    809
    +    "222424": "汪清县",
    810
    +    "222426": "安图县"
    811
    +  },
    812
    +  "230000": {
    813
    +    "230100": "哈尔滨市",
    814
    +    "230200": "齐齐哈尔市",
    815
    +    "230300": "鸡西市",
    816
    +    "230400": "鹤岗市",
    817
    +    "230500": "双鸭山市",
    818
    +    "230600": "大庆市",
    819
    +    "230700": "伊春市",
    820
    +    "230800": "佳木斯市",
    821
    +    "230900": "七台河市",
    822
    +    "231000": "牡丹江市",
    823
    +    "231100": "黑河市",
    824
    +    "231200": "绥化市",
    825
    +    "232700": "大兴安岭地区"
    826
    +  },
    827
    +  "230100": {
    828
    +    "230102": "道里区",
    829
    +    "230103": "南岗区",
    830
    +    "230104": "道外区",
    831
    +    "230108": "平房区",
    832
    +    "230109": "松北区",
    833
    +    "230110": "香坊区",
    834
    +    "230111": "呼兰区",
    835
    +    "230112": "阿城区",
    836
    +    "230113": "双城区",
    837
    +    "230123": "依兰县",
    838
    +    "230124": "方正县",
    839
    +    "230125": "宾县",
    840
    +    "230126": "巴彦县",
    841
    +    "230127": "木兰县",
    842
    +    "230128": "通河县",
    843
    +    "230129": "延寿县",
    844
    +    "230183": "尚志市",
    845
    +    "230184": "五常市"
    846
    +  },
    847
    +  "230200": {
    848
    +    "230202": "龙沙区",
    849
    +    "230203": "建华区",
    850
    +    "230204": "铁锋区",
    851
    +    "230205": "昂昂溪区",
    852
    +    "230206": "富拉尔基区",
    853
    +    "230207": "碾子山区",
    854
    +    "230208": "梅里斯达斡尔族区",
    855
    +    "230221": "龙江县",
    856
    +    "230223": "依安县",
    857
    +    "230224": "泰来县",
    858
    +    "230225": "甘南县",
    859
    +    "230227": "富裕县",
    860
    +    "230229": "克山县",
    861
    +    "230230": "克东县",
    862
    +    "230231": "拜泉县",
    863
    +    "230281": "讷河市"
    864
    +  },
    865
    +  "230300": {
    866
    +    "230302": "鸡冠区",
    867
    +    "230303": "恒山区",
    868
    +    "230304": "滴道区",
    869
    +    "230305": "梨树区",
    870
    +    "230306": "城子河区",
    871
    +    "230307": "麻山区",
    872
    +    "230321": "鸡东县",
    873
    +    "230381": "虎林市",
    874
    +    "230382": "密山市"
    875
    +  },
    876
    +  "230400": {
    877
    +    "230402": "向阳区",
    878
    +    "230403": "工农区",
    879
    +    "230404": "南山区",
    880
    +    "230405": "兴安区",
    881
    +    "230406": "东山区",
    882
    +    "230407": "兴山区",
    883
    +    "230421": "萝北县",
    884
    +    "230422": "绥滨县"
    885
    +  },
    886
    +  "230500": {
    887
    +    "230502": "尖山区",
    888
    +    "230503": "岭东区",
    889
    +    "230505": "四方台区",
    890
    +    "230506": "宝山区",
    891
    +    "230521": "集贤县",
    892
    +    "230522": "友谊县",
    893
    +    "230523": "宝清县",
    894
    +    "230524": "饶河县"
    895
    +  },
    896
    +  "230600": {
    897
    +    "230602": "萨尔图区",
    898
    +    "230603": "龙凤区",
    899
    +    "230604": "让胡路区",
    900
    +    "230605": "红岗区",
    901
    +    "230606": "大同区",
    902
    +    "230621": "肇州县",
    903
    +    "230622": "肇源县",
    904
    +    "230623": "林甸县",
    905
    +    "230624": "杜尔伯特蒙古族自治县"
    906
    +  },
    907
    +  "230700": {
    908
    +    "230702": "伊春区",
    909
    +    "230703": "南岔区",
    910
    +    "230704": "友好区",
    911
    +    "230705": "西林区",
    912
    +    "230706": "翠峦区",
    913
    +    "230707": "新青区",
    914
    +    "230708": "美溪区",
    915
    +    "230709": "金山屯区",
    916
    +    "230710": "五营区",
    917
    +    "230711": "乌马河区",
    918
    +    "230712": "汤旺河区",
    919
    +    "230713": "带岭区",
    920
    +    "230714": "乌伊岭区",
    921
    +    "230715": "红星区",
    922
    +    "230716": "上甘岭区",
    923
    +    "230722": "嘉荫县",
    924
    +    "230781": "铁力市"
    925
    +  },
    926
    +  "230800": {
    927
    +    "230803": "向阳区",
    928
    +    "230804": "前进区",
    929
    +    "230805": "东风区",
    930
    +    "230811": "郊区",
    931
    +    "230822": "桦南县",
    932
    +    "230826": "桦川县",
    933
    +    "230828": "汤原县",
    934
    +    "230881": "同江市",
    935
    +    "230882": "富锦市",
    936
    +    "230883": "抚远市"
    937
    +  },
    938
    +  "230900": {
    939
    +    "230902": "新兴区",
    940
    +    "230903": "桃山区",
    941
    +    "230904": "茄子河区",
    942
    +    "230921": "勃利县"
    943
    +  },
    944
    +  "231000": {
    945
    +    "231002": "东安区",
    946
    +    "231003": "阳明区",
    947
    +    "231004": "爱民区",
    948
    +    "231005": "西安区",
    949
    +    "231025": "林口县",
    950
    +    "231081": "绥芬河市",
    951
    +    "231083": "海林市",
    952
    +    "231084": "宁安市",
    953
    +    "231085": "穆棱市",
    954
    +    "231086": "东宁市"
    955
    +  },
    956
    +  "231100": {
    957
    +    "231102": "爱辉区",
    958
    +    "231121": "嫩江县",
    959
    +    "231123": "逊克县",
    960
    +    "231124": "孙吴县",
    961
    +    "231181": "北安市",
    962
    +    "231182": "五大连池市"
    963
    +  },
    964
    +  "231200": {
    965
    +    "231202": "北林区",
    966
    +    "231221": "望奎县",
    967
    +    "231222": "兰西县",
    968
    +    "231223": "青冈县",
    969
    +    "231224": "庆安县",
    970
    +    "231225": "明水县",
    971
    +    "231226": "绥棱县",
    972
    +    "231281": "安达市",
    973
    +    "231282": "肇东市",
    974
    +    "231283": "海伦市"
    975
    +  },
    976
    +  "232700": {
    977
    +    "232721": "呼玛县",
    978
    +    "232722": "塔河县",
    979
    +    "232723": "漠河县"
    980
    +  },
    981
    +  "310000": {
    982
    +    "310100": "市辖区"
    983
    +  },
    984
    +  "310100": {
    985
    +    "310101": "黄浦区",
    986
    +    "310104": "徐汇区",
    987
    +    "310105": "长宁区",
    988
    +    "310106": "静安区",
    989
    +    "310107": "普陀区",
    990
    +    "310109": "虹口区",
    991
    +    "310110": "杨浦区",
    992
    +    "310112": "闵行区",
    993
    +    "310113": "宝山区",
    994
    +    "310114": "嘉定区",
    995
    +    "310115": "浦东新区",
    996
    +    "310116": "金山区",
    997
    +    "310117": "松江区",
    998
    +    "310118": "青浦区",
    999
    +    "310120": "奉贤区",
    1000
    +    "310151": "崇明区"
    1001
    +  },
    1002
    +  "320000": {
    1003
    +    "320100": "南京市",
    1004
    +    "320200": "无锡市",
    1005
    +    "320300": "徐州市",
    1006
    +    "320400": "常州市",
    1007
    +    "320500": "苏州市",
    1008
    +    "320600": "南通市",
    1009
    +    "320700": "连云港市",
    1010
    +    "320800": "淮安市",
    1011
    +    "320900": "盐城市",
    1012
    +    "321000": "扬州市",
    1013
    +    "321100": "镇江市",
    1014
    +    "321200": "泰州市",
    1015
    +    "321300": "宿迁市"
    1016
    +  },
    1017
    +  "320100": {
    1018
    +    "320102": "玄武区",
    1019
    +    "320104": "秦淮区",
    1020
    +    "320105": "建邺区",
    1021
    +    "320106": "鼓楼区",
    1022
    +    "320111": "浦口区",
    1023
    +    "320113": "栖霞区",
    1024
    +    "320114": "雨花台区",
    1025
    +    "320115": "江宁区",
    1026
    +    "320116": "六合区",
    1027
    +    "320117": "溧水区",
    1028
    +    "320118": "高淳区"
    1029
    +  },
    1030
    +  "320200": {
    1031
    +    "320205": "锡山区",
    1032
    +    "320206": "惠山区",
    1033
    +    "320211": "滨湖区",
    1034
    +    "320213": "梁溪区",
    1035
    +    "320214": "新吴区",
    1036
    +    "320281": "江阴市",
    1037
    +    "320282": "宜兴市"
    1038
    +  },
    1039
    +  "320300": {
    1040
    +    "320302": "鼓楼区",
    1041
    +    "320303": "云龙区",
    1042
    +    "320305": "贾汪区",
    1043
    +    "320311": "泉山区",
    1044
    +    "320312": "铜山区",
    1045
    +    "320321": "丰县",
    1046
    +    "320322": "沛县",
    1047
    +    "320324": "睢宁县",
    1048
    +    "320381": "新沂市",
    1049
    +    "320382": "邳州市"
    1050
    +  },
    1051
    +  "320400": {
    1052
    +    "320402": "天宁区",
    1053
    +    "320404": "钟楼区",
    1054
    +    "320411": "新北区",
    1055
    +    "320412": "武进区",
    1056
    +    "320413": "金坛区",
    1057
    +    "320481": "溧阳市"
    1058
    +  },
    1059
    +  "320500": {
    1060
    +    "320505": "虎丘区",
    1061
    +    "320506": "吴中区",
    1062
    +    "320507": "相城区",
    1063
    +    "320508": "姑苏区",
    1064
    +    "320509": "吴江区",
    1065
    +    "320581": "常熟市",
    1066
    +    "320582": "张家港市",
    1067
    +    "320583": "昆山市",
    1068
    +    "320585": "太仓市"
    1069
    +  },
    1070
    +  "320600": {
    1071
    +    "320602": "崇川区",
    1072
    +    "320611": "港闸区",
    1073
    +    "320612": "通州区",
    1074
    +    "320621": "海安县",
    1075
    +    "320623": "如东县",
    1076
    +    "320681": "启东市",
    1077
    +    "320682": "如皋市",
    1078
    +    "320684": "海门市"
    1079
    +  },
    1080
    +  "320700": {
    1081
    +    "320703": "连云区",
    1082
    +    "320706": "海州区",
    1083
    +    "320707": "赣榆区",
    1084
    +    "320722": "东海县",
    1085
    +    "320723": "灌云县",
    1086
    +    "320724": "灌南县"
    1087
    +  },
    1088
    +  "320800": {
    1089
    +    "320803": "淮安区",
    1090
    +    "320804": "淮阴区",
    1091
    +    "320812": "清江浦区",
    1092
    +    "320813": "洪泽区",
    1093
    +    "320826": "涟水县",
    1094
    +    "320830": "盱眙县",
    1095
    +    "320831": "金湖县"
    1096
    +  },
    1097
    +  "320900": {
    1098
    +    "320902": "亭湖区",
    1099
    +    "320903": "盐都区",
    1100
    +    "320904": "大丰区",
    1101
    +    "320921": "响水县",
    1102
    +    "320922": "滨海县",
    1103
    +    "320923": "阜宁县",
    1104
    +    "320924": "射阳县",
    1105
    +    "320925": "建湖县",
    1106
    +    "320981": "东台市"
    1107
    +  },
    1108
    +  "321000": {
    1109
    +    "321002": "广陵区",
    1110
    +    "321003": "邗江区",
    1111
    +    "321012": "江都区",
    1112
    +    "321023": "宝应县",
    1113
    +    "321081": "仪征市",
    1114
    +    "321084": "高邮市"
    1115
    +  },
    1116
    +  "321100": {
    1117
    +    "321102": "京口区",
    1118
    +    "321111": "润州区",
    1119
    +    "321112": "丹徒区",
    1120
    +    "321181": "丹阳市",
    1121
    +    "321182": "扬中市",
    1122
    +    "321183": "句容市"
    1123
    +  },
    1124
    +  "321200": {
    1125
    +    "321202": "海陵区",
    1126
    +    "321203": "高港区",
    1127
    +    "321204": "姜堰区",
    1128
    +    "321281": "兴化市",
    1129
    +    "321282": "靖江市",
    1130
    +    "321283": "泰兴市"
    1131
    +  },
    1132
    +  "321300": {
    1133
    +    "321302": "宿城区",
    1134
    +    "321311": "宿豫区",
    1135
    +    "321322": "沭阳县",
    1136
    +    "321323": "泗阳县",
    1137
    +    "321324": "泗洪县"
    1138
    +  },
    1139
    +  "330000": {
    1140
    +    "330100": "杭州市",
    1141
    +    "330200": "宁波市",
    1142
    +    "330300": "温州市",
    1143
    +    "330400": "嘉兴市",
    1144
    +    "330500": "湖州市",
    1145
    +    "330600": "绍兴市",
    1146
    +    "330700": "金华市",
    1147
    +    "330800": "衢州市",
    1148
    +    "330900": "舟山市",
    1149
    +    "331000": "台州市",
    1150
    +    "331100": "丽水市"
    1151
    +  },
    1152
    +  "330100": {
    1153
    +    "330102": "上城区",
    1154
    +    "330103": "下城区",
    1155
    +    "330104": "江干区",
    1156
    +    "330105": "拱墅区",
    1157
    +    "330106": "西湖区",
    1158
    +    "330108": "滨江区",
    1159
    +    "330109": "萧山区",
    1160
    +    "330110": "余杭区",
    1161
    +    "330111": "富阳区",
    1162
    +    "330122": "桐庐县",
    1163
    +    "330127": "淳安县",
    1164
    +    "330182": "建德市",
    1165
    +    "330185": "临安市"
    1166
    +  },
    1167
    +  "330200": {
    1168
    +    "330203": "海曙区",
    1169
    +    "330204": "江东区",
    1170
    +    "330205": "江北区",
    1171
    +    "330206": "北仑区",
    1172
    +    "330211": "镇海区",
    1173
    +    "330212": "鄞州区",
    1174
    +    "330225": "象山县",
    1175
    +    "330226": "宁海县",
    1176
    +    "330281": "余姚市",
    1177
    +    "330282": "慈溪市",
    1178
    +    "330283": "奉化市"
    1179
    +  },
    1180
    +  "330300": {
    1181
    +    "330302": "鹿城区",
    1182
    +    "330303": "龙湾区",
    1183
    +    "330304": "瓯海区",
    1184
    +    "330305": "洞头区",
    1185
    +    "330324": "永嘉县",
    1186
    +    "330326": "平阳县",
    1187
    +    "330327": "苍南县",
    1188
    +    "330328": "文成县",
    1189
    +    "330329": "泰顺县",
    1190
    +    "330381": "瑞安市",
    1191
    +    "330382": "乐清市"
    1192
    +  },
    1193
    +  "330400": {
    1194
    +    "330402": "南湖区",
    1195
    +    "330411": "秀洲区",
    1196
    +    "330421": "嘉善县",
    1197
    +    "330424": "海盐县",
    1198
    +    "330481": "海宁市",
    1199
    +    "330482": "平湖市",
    1200
    +    "330483": "桐乡市"
    1201
    +  },
    1202
    +  "330500": {
    1203
    +    "330502": "吴兴区",
    1204
    +    "330503": "南浔区",
    1205
    +    "330521": "德清县",
    1206
    +    "330522": "长兴县",
    1207
    +    "330523": "安吉县"
    1208
    +  },
    1209
    +  "330600": {
    1210
    +    "330602": "越城区",
    1211
    +    "330603": "柯桥区",
    1212
    +    "330604": "上虞区",
    1213
    +    "330624": "新昌县",
    1214
    +    "330681": "诸暨市",
    1215
    +    "330683": "嵊州市"
    1216
    +  },
    1217
    +  "330700": {
    1218
    +    "330702": "婺城区",
    1219
    +    "330703": "金东区",
    1220
    +    "330723": "武义县",
    1221
    +    "330726": "浦江县",
    1222
    +    "330727": "磐安县",
    1223
    +    "330781": "兰溪市",
    1224
    +    "330782": "义乌市",
    1225
    +    "330783": "东阳市",
    1226
    +    "330784": "永康市"
    1227
    +  },
    1228
    +  "330800": {
    1229
    +    "330802": "柯城区",
    1230
    +    "330803": "衢江区",
    1231
    +    "330822": "常山县",
    1232
    +    "330824": "开化县",
    1233
    +    "330825": "龙游县",
    1234
    +    "330881": "江山市"
    1235
    +  },
    1236
    +  "330900": {
    1237
    +    "330902": "定海区",
    1238
    +    "330903": "普陀区",
    1239
    +    "330921": "岱山县",
    1240
    +    "330922": "嵊泗县"
    1241
    +  },
    1242
    +  "331000": {
    1243
    +    "331002": "椒江区",
    1244
    +    "331003": "黄岩区",
    1245
    +    "331004": "路桥区",
    1246
    +    "331021": "玉环县",
    1247
    +    "331022": "三门县",
    1248
    +    "331023": "天台县",
    1249
    +    "331024": "仙居县",
    1250
    +    "331081": "温岭市",
    1251
    +    "331082": "临海市"
    1252
    +  },
    1253
    +  "331100": {
    1254
    +    "331102": "莲都区",
    1255
    +    "331121": "青田县",
    1256
    +    "331122": "缙云县",
    1257
    +    "331123": "遂昌县",
    1258
    +    "331124": "松阳县",
    1259
    +    "331125": "云和县",
    1260
    +    "331126": "庆元县",
    1261
    +    "331127": "景宁畲族自治县",
    1262
    +    "331181": "龙泉市"
    1263
    +  },
    1264
    +  "340000": {
    1265
    +    "340100": "合肥市",
    1266
    +    "340200": "芜湖市",
    1267
    +    "340300": "蚌埠市",
    1268
    +    "340400": "淮南市",
    1269
    +    "340500": "马鞍山市",
    1270
    +    "340600": "淮北市",
    1271
    +    "340700": "铜陵市",
    1272
    +    "340800": "安庆市",
    1273
    +    "341000": "黄山市",
    1274
    +    "341100": "滁州市",
    1275
    +    "341200": "阜阳市",
    1276
    +    "341300": "宿州市",
    1277
    +    "341500": "六安市",
    1278
    +    "341600": "亳州市",
    1279
    +    "341700": "池州市",
    1280
    +    "341800": "宣城市"
    1281
    +  },
    1282
    +  "340100": {
    1283
    +    "340102": "瑶海区",
    1284
    +    "340103": "庐阳区",
    1285
    +    "340104": "蜀山区",
    1286
    +    "340111": "包河区",
    1287
    +    "340121": "长丰县",
    1288
    +    "340122": "肥东县",
    1289
    +    "340123": "肥西县",
    1290
    +    "340124": "庐江县",
    1291
    +    "340181": "巢湖市"
    1292
    +  },
    1293
    +  "340200": {
    1294
    +    "340202": "镜湖区",
    1295
    +    "340203": "弋江区",
    1296
    +    "340207": "鸠江区",
    1297
    +    "340208": "三山区",
    1298
    +    "340221": "芜湖县",
    1299
    +    "340222": "繁昌县",
    1300
    +    "340223": "南陵县",
    1301
    +    "340225": "无为县"
    1302
    +  },
    1303
    +  "340300": {
    1304
    +    "340302": "龙子湖区",
    1305
    +    "340303": "蚌山区",
    1306
    +    "340304": "禹会区",
    1307
    +    "340311": "淮上区",
    1308
    +    "340321": "怀远县",
    1309
    +    "340322": "五河县",
    1310
    +    "340323": "固镇县"
    1311
    +  },
    1312
    +  "340400": {
    1313
    +    "340402": "大通区",
    1314
    +    "340403": "田家庵区",
    1315
    +    "340404": "谢家集区",
    1316
    +    "340405": "八公山区",
    1317
    +    "340406": "潘集区",
    1318
    +    "340421": "凤台县",
    1319
    +    "340422": "寿县"
    1320
    +  },
    1321
    +  "340500": {
    1322
    +    "340503": "花山区",
    1323
    +    "340504": "雨山区",
    1324
    +    "340506": "博望区",
    1325
    +    "340521": "当涂县",
    1326
    +    "340522": "含山县",
    1327
    +    "340523": "和县"
    1328
    +  },
    1329
    +  "340600": {
    1330
    +    "340602": "杜集区",
    1331
    +    "340603": "相山区",
    1332
    +    "340604": "烈山区",
    1333
    +    "340621": "濉溪县"
    1334
    +  },
    1335
    +  "340700": {
    1336
    +    "340705": "铜官区",
    1337
    +    "340706": "义安区",
    1338
    +    "340711": "郊区",
    1339
    +    "340722": "枞阳县"
    1340
    +  },
    1341
    +  "340800": {
    1342
    +    "340802": "迎江区",
    1343
    +    "340803": "大观区",
    1344
    +    "340811": "宜秀区",
    1345
    +    "340822": "怀宁县",
    1346
    +    "340824": "潜山县",
    1347
    +    "340825": "太湖县",
    1348
    +    "340826": "宿松县",
    1349
    +    "340827": "望江县",
    1350
    +    "340828": "岳西县",
    1351
    +    "340881": "桐城市"
    1352
    +  },
    1353
    +  "341000": {
    1354
    +    "341002": "屯溪区",
    1355
    +    "341003": "黄山区",
    1356
    +    "341004": "徽州区",
    1357
    +    "341021": "歙县",
    1358
    +    "341022": "休宁县",
    1359
    +    "341023": "黟县",
    1360
    +    "341024": "祁门县"
    1361
    +  },
    1362
    +  "341100": {
    1363
    +    "341102": "琅琊区",
    1364
    +    "341103": "南谯区",
    1365
    +    "341122": "来安县",
    1366
    +    "341124": "全椒县",
    1367
    +    "341125": "定远县",
    1368
    +    "341126": "凤阳县",
    1369
    +    "341181": "天长市",
    1370
    +    "341182": "明光市"
    1371
    +  },
    1372
    +  "341200": {
    1373
    +    "341202": "颍州区",
    1374
    +    "341203": "颍东区",
    1375
    +    "341204": "颍泉区",
    1376
    +    "341221": "临泉县",
    1377
    +    "341222": "太和县",
    1378
    +    "341225": "阜南县",
    1379
    +    "341226": "颍上县",
    1380
    +    "341282": "界首市"
    1381
    +  },
    1382
    +  "341300": {
    1383
    +    "341302": "埇桥区",
    1384
    +    "341321": "砀山县",
    1385
    +    "341322": "萧县",
    1386
    +    "341323": "灵璧县",
    1387
    +    "341324": "泗县"
    1388
    +  },
    1389
    +  "341500": {
    1390
    +    "341502": "金安区",
    1391
    +    "341503": "裕安区",
    1392
    +    "341504": "叶集区",
    1393
    +    "341522": "霍邱县",
    1394
    +    "341523": "舒城县",
    1395
    +    "341524": "金寨县",
    1396
    +    "341525": "霍山县"
    1397
    +  },
    1398
    +  "341600": {
    1399
    +    "341602": "谯城区",
    1400
    +    "341621": "涡阳县",
    1401
    +    "341622": "蒙城县",
    1402
    +    "341623": "利辛县"
    1403
    +  },
    1404
    +  "341700": {
    1405
    +    "341702": "贵池区",
    1406
    +    "341721": "东至县",
    1407
    +    "341722": "石台县",
    1408
    +    "341723": "青阳县"
    1409
    +  },
    1410
    +  "341800": {
    1411
    +    "341802": "宣州区",
    1412
    +    "341821": "郎溪县",
    1413
    +    "341822": "广德县",
    1414
    +    "341823": "泾县",
    1415
    +    "341824": "绩溪县",
    1416
    +    "341825": "旌德县",
    1417
    +    "341881": "宁国市"
    1418
    +  },
    1419
    +  "350000": {
    1420
    +    "350100": "福州市",
    1421
    +    "350200": "厦门市",
    1422
    +    "350300": "莆田市",
    1423
    +    "350400": "三明市",
    1424
    +    "350500": "泉州市",
    1425
    +    "350600": "漳州市",
    1426
    +    "350700": "南平市",
    1427
    +    "350800": "龙岩市",
    1428
    +    "350900": "宁德市"
    1429
    +  },
    1430
    +  "350100": {
    1431
    +    "350102": "鼓楼区",
    1432
    +    "350103": "台江区",
    1433
    +    "350104": "仓山区",
    1434
    +    "350105": "马尾区",
    1435
    +    "350111": "晋安区",
    1436
    +    "350121": "闽侯县",
    1437
    +    "350122": "连江县",
    1438
    +    "350123": "罗源县",
    1439
    +    "350124": "闽清县",
    1440
    +    "350125": "永泰县",
    1441
    +    "350128": "平潭县",
    1442
    +    "350181": "福清市",
    1443
    +    "350182": "长乐市"
    1444
    +  },
    1445
    +  "350200": {
    1446
    +    "350203": "思明区",
    1447
    +    "350205": "海沧区",
    1448
    +    "350206": "湖里区",
    1449
    +    "350211": "集美区",
    1450
    +    "350212": "同安区",
    1451
    +    "350213": "翔安区"
    1452
    +  },
    1453
    +  "350300": {
    1454
    +    "350302": "城厢区",
    1455
    +    "350303": "涵江区",
    1456
    +    "350304": "荔城区",
    1457
    +    "350305": "秀屿区",
    1458
    +    "350322": "仙游县"
    1459
    +  },
    1460
    +  "350400": {
    1461
    +    "350402": "梅列区",
    1462
    +    "350403": "三元区",
    1463
    +    "350421": "明溪县",
    1464
    +    "350423": "清流县",
    1465
    +    "350424": "宁化县",
    1466
    +    "350425": "大田县",
    1467
    +    "350426": "尤溪县",
    1468
    +    "350427": "沙县",
    1469
    +    "350428": "将乐县",
    1470
    +    "350429": "泰宁县",
    1471
    +    "350430": "建宁县",
    1472
    +    "350481": "永安市"
    1473
    +  },
    1474
    +  "350500": {
    1475
    +    "350502": "鲤城区",
    1476
    +    "350503": "丰泽区",
    1477
    +    "350504": "洛江区",
    1478
    +    "350505": "泉港区",
    1479
    +    "350521": "惠安县",
    1480
    +    "350524": "安溪县",
    1481
    +    "350525": "永春县",
    1482
    +    "350526": "德化县",
    1483
    +    "350527": "金门县",
    1484
    +    "350581": "石狮市",
    1485
    +    "350582": "晋江市",
    1486
    +    "350583": "南安市"
    1487
    +  },
    1488
    +  "350600": {
    1489
    +    "350602": "芗城区",
    1490
    +    "350603": "龙文区",
    1491
    +    "350622": "云霄县",
    1492
    +    "350623": "漳浦县",
    1493
    +    "350624": "诏安县",
    1494
    +    "350625": "长泰县",
    1495
    +    "350626": "东山县",
    1496
    +    "350627": "南靖县",
    1497
    +    "350628": "平和县",
    1498
    +    "350629": "华安县",
    1499
    +    "350681": "龙海市"
    1500
    +  },
    1501
    +  "350700": {
    1502
    +    "350702": "延平区",
    1503
    +    "350703": "建阳区",
    1504
    +    "350721": "顺昌县",
    1505
    +    "350722": "浦城县",
    1506
    +    "350723": "光泽县",
    1507
    +    "350724": "松溪县",
    1508
    +    "350725": "政和县",
    1509
    +    "350781": "邵武市",
    1510
    +    "350782": "武夷山市",
    1511
    +    "350783": "建瓯市"
    1512
    +  },
    1513
    +  "350800": {
    1514
    +    "350802": "新罗区",
    1515
    +    "350803": "永定区",
    1516
    +    "350821": "长汀县",
    1517
    +    "350823": "上杭县",
    1518
    +    "350824": "武平县",
    1519
    +    "350825": "连城县",
    1520
    +    "350881": "漳平市"
    1521
    +  },
    1522
    +  "350900": {
    1523
    +    "350902": "蕉城区",
    1524
    +    "350921": "霞浦县",
    1525
    +    "350922": "古田县",
    1526
    +    "350923": "屏南县",
    1527
    +    "350924": "寿宁县",
    1528
    +    "350925": "周宁县",
    1529
    +    "350926": "柘荣县",
    1530
    +    "350981": "福安市",
    1531
    +    "350982": "福鼎市"
    1532
    +  },
    1533
    +  "360000": {
    1534
    +    "360100": "南昌市",
    1535
    +    "360200": "景德镇市",
    1536
    +    "360300": "萍乡市",
    1537
    +    "360400": "九江市",
    1538
    +    "360500": "新余市",
    1539
    +    "360600": "鹰潭市",
    1540
    +    "360700": "赣州市",
    1541
    +    "360800": "吉安市",
    1542
    +    "360900": "宜春市",
    1543
    +    "361000": "抚州市",
    1544
    +    "361100": "上饶市"
    1545
    +  },
    1546
    +  "360100": {
    1547
    +    "360102": "东湖区",
    1548
    +    "360103": "西湖区",
    1549
    +    "360104": "青云谱区",
    1550
    +    "360105": "湾里区",
    1551
    +    "360111": "青山湖区",
    1552
    +    "360112": "新建区",
    1553
    +    "360121": "南昌县",
    1554
    +    "360123": "安义县",
    1555
    +    "360124": "进贤县"
    1556
    +  },
    1557
    +  "360200": {
    1558
    +    "360202": "昌江区",
    1559
    +    "360203": "珠山区",
    1560
    +    "360222": "浮梁县",
    1561
    +    "360281": "乐平市"
    1562
    +  },
    1563
    +  "360300": {
    1564
    +    "360302": "安源区",
    1565
    +    "360313": "湘东区",
    1566
    +    "360321": "莲花县",
    1567
    +    "360322": "上栗县",
    1568
    +    "360323": "芦溪县"
    1569
    +  },
    1570
    +  "360400": {
    1571
    +    "360402": "濂溪区",
    1572
    +    "360403": "浔阳区",
    1573
    +    "360421": "九江县",
    1574
    +    "360423": "武宁县",
    1575
    +    "360424": "修水县",
    1576
    +    "360425": "永修县",
    1577
    +    "360426": "德安县",
    1578
    +    "360428": "都昌县",
    1579
    +    "360429": "湖口县",
    1580
    +    "360430": "彭泽县",
    1581
    +    "360481": "瑞昌市",
    1582
    +    "360482": "共青城市",
    1583
    +    "360483": "庐山市"
    1584
    +  },
    1585
    +  "360500": {
    1586
    +    "360502": "渝水区",
    1587
    +    "360521": "分宜县"
    1588
    +  },
    1589
    +  "360600": {
    1590
    +    "360602": "月湖区",
    1591
    +    "360622": "余江县",
    1592
    +    "360681": "贵溪市"
    1593
    +  },
    1594
    +  "360700": {
    1595
    +    "360702": "章贡区",
    1596
    +    "360703": "南康区",
    1597
    +    "360721": "赣县",
    1598
    +    "360722": "信丰县",
    1599
    +    "360723": "大余县",
    1600
    +    "360724": "上犹县",
    1601
    +    "360725": "崇义县",
    1602
    +    "360726": "安远县",
    1603
    +    "360727": "龙南县",
    1604
    +    "360728": "定南县",
    1605
    +    "360729": "全南县",
    1606
    +    "360730": "宁都县",
    1607
    +    "360731": "于都县",
    1608
    +    "360732": "兴国县",
    1609
    +    "360733": "会昌县",
    1610
    +    "360734": "寻乌县",
    1611
    +    "360735": "石城县",
    1612
    +    "360781": "瑞金市"
    1613
    +  },
    1614
    +  "360800": {
    1615
    +    "360802": "吉州区",
    1616
    +    "360803": "青原区",
    1617
    +    "360821": "吉安县",
    1618
    +    "360822": "吉水县",
    1619
    +    "360823": "峡江县",
    1620
    +    "360824": "新干县",
    1621
    +    "360825": "永丰县",
    1622
    +    "360826": "泰和县",
    1623
    +    "360827": "遂川县",
    1624
    +    "360828": "万安县",
    1625
    +    "360829": "安福县",
    1626
    +    "360830": "永新县",
    1627
    +    "360881": "井冈山市"
    1628
    +  },
    1629
    +  "360900": {
    1630
    +    "360902": "袁州区",
    1631
    +    "360921": "奉新县",
    1632
    +    "360922": "万载县",
    1633
    +    "360923": "上高县",
    1634
    +    "360924": "宜丰县",
    1635
    +    "360925": "靖安县",
    1636
    +    "360926": "铜鼓县",
    1637
    +    "360981": "丰城市",
    1638
    +    "360982": "樟树市",
    1639
    +    "360983": "高安市"
    1640
    +  },
    1641
    +  "361000": {
    1642
    +    "361002": "临川区",
    1643
    +    "361021": "南城县",
    1644
    +    "361022": "黎川县",
    1645
    +    "361023": "南丰县",
    1646
    +    "361024": "崇仁县",
    1647
    +    "361025": "乐安县",
    1648
    +    "361026": "宜黄县",
    1649
    +    "361027": "金溪县",
    1650
    +    "361028": "资溪县",
    1651
    +    "361029": "东乡县",
    1652
    +    "361030": "广昌县"
    1653
    +  },
    1654
    +  "361100": {
    1655
    +    "361102": "信州区",
    1656
    +    "361103": "广丰区",
    1657
    +    "361121": "上饶县",
    1658
    +    "361123": "玉山县",
    1659
    +    "361124": "铅山县",
    1660
    +    "361125": "横峰县",
    1661
    +    "361126": "弋阳县",
    1662
    +    "361127": "余干县",
    1663
    +    "361128": "鄱阳县",
    1664
    +    "361129": "万年县",
    1665
    +    "361130": "婺源县",
    1666
    +    "361181": "德兴市"
    1667
    +  },
    1668
    +  "370000": {
    1669
    +    "370100": "济南市",
    1670
    +    "370200": "青岛市",
    1671
    +    "370300": "淄博市",
    1672
    +    "370400": "枣庄市",
    1673
    +    "370500": "东营市",
    1674
    +    "370600": "烟台市",
    1675
    +    "370700": "潍坊市",
    1676
    +    "370800": "济宁市",
    1677
    +    "370900": "泰安市",
    1678
    +    "371000": "威海市",
    1679
    +    "371100": "日照市",
    1680
    +    "371200": "莱芜市",
    1681
    +    "371300": "临沂市",
    1682
    +    "371400": "德州市",
    1683
    +    "371500": "聊城市",
    1684
    +    "371600": "滨州市",
    1685
    +    "371700": "菏泽市"
    1686
    +  },
    1687
    +  "370100": {
    1688
    +    "370102": "历下区",
    1689
    +    "370103": "市中区",
    1690
    +    "370104": "槐荫区",
    1691
    +    "370105": "天桥区",
    1692
    +    "370112": "历城区",
    1693
    +    "370113": "长清区",
    1694
    +    "370124": "平阴县",
    1695
    +    "370125": "济阳县",
    1696
    +    "370126": "商河县",
    1697
    +    "370181": "章丘市"
    1698
    +  },
    1699
    +  "370200": {
    1700
    +    "370202": "市南区",
    1701
    +    "370203": "市北区",
    1702
    +    "370211": "黄岛区",
    1703
    +    "370212": "崂山区",
    1704
    +    "370213": "李沧区",
    1705
    +    "370214": "城阳区",
    1706
    +    "370281": "胶州市",
    1707
    +    "370282": "即墨市",
    1708
    +    "370283": "平度市",
    1709
    +    "370285": "莱西市"
    1710
    +  },
    1711
    +  "370300": {
    1712
    +    "370302": "淄川区",
    1713
    +    "370303": "张店区",
    1714
    +    "370304": "博山区",
    1715
    +    "370305": "临淄区",
    1716
    +    "370306": "周村区",
    1717
    +    "370321": "桓台县",
    1718
    +    "370322": "高青县",
    1719
    +    "370323": "沂源县"
    1720
    +  },
    1721
    +  "370400": {
    1722
    +    "370402": "市中区",
    1723
    +    "370403": "薛城区",
    1724
    +    "370404": "峄城区",
    1725
    +    "370405": "台儿庄区",
    1726
    +    "370406": "山亭区",
    1727
    +    "370481": "滕州市"
    1728
    +  },
    1729
    +  "370500": {
    1730
    +    "370502": "东营区",
    1731
    +    "370503": "河口区",
    1732
    +    "370505": "垦利区",
    1733
    +    "370522": "利津县",
    1734
    +    "370523": "广饶县"
    1735
    +  },
    1736
    +  "370600": {
    1737
    +    "370602": "芝罘区",
    1738
    +    "370611": "福山区",
    1739
    +    "370612": "牟平区",
    1740
    +    "370613": "莱山区",
    1741
    +    "370634": "长岛县",
    1742
    +    "370681": "龙口市",
    1743
    +    "370682": "莱阳市",
    1744
    +    "370683": "莱州市",
    1745
    +    "370684": "蓬莱市",
    1746
    +    "370685": "招远市",
    1747
    +    "370686": "栖霞市",
    1748
    +    "370687": "海阳市"
    1749
    +  },
    1750
    +  "370700": {
    1751
    +    "370702": "潍城区",
    1752
    +    "370703": "寒亭区",
    1753
    +    "370704": "坊子区",
    1754
    +    "370705": "奎文区",
    1755
    +    "370724": "临朐县",
    1756
    +    "370725": "昌乐县",
    1757
    +    "370781": "青州市",
    1758
    +    "370782": "诸城市",
    1759
    +    "370783": "寿光市",
    1760
    +    "370784": "安丘市",
    1761
    +    "370785": "高密市",
    1762
    +    "370786": "昌邑市"
    1763
    +  },
    1764
    +  "370800": {
    1765
    +    "370811": "任城区",
    1766
    +    "370812": "兖州区",
    1767
    +    "370826": "微山县",
    1768
    +    "370827": "鱼台县",
    1769
    +    "370828": "金乡县",
    1770
    +    "370829": "嘉祥县",
    1771
    +    "370830": "汶上县",
    1772
    +    "370831": "泗水县",
    1773
    +    "370832": "梁山县",
    1774
    +    "370881": "曲阜市",
    1775
    +    "370883": "邹城市"
    1776
    +  },
    1777
    +  "370900": {
    1778
    +    "370902": "泰山区",
    1779
    +    "370911": "岱岳区",
    1780
    +    "370921": "宁阳县",
    1781
    +    "370923": "东平县",
    1782
    +    "370982": "新泰市",
    1783
    +    "370983": "肥城市"
    1784
    +  },
    1785
    +  "371000": {
    1786
    +    "371002": "环翠区",
    1787
    +    "371003": "文登区",
    1788
    +    "371082": "荣成市",
    1789
    +    "371083": "乳山市"
    1790
    +  },
    1791
    +  "371100": {
    1792
    +    "371102": "东港区",
    1793
    +    "371103": "岚山区",
    1794
    +    "371121": "五莲县",
    1795
    +    "371122": "莒县"
    1796
    +  },
    1797
    +  "371200": {
    1798
    +    "371202": "莱城区",
    1799
    +    "371203": "钢城区"
    1800
    +  },
    1801
    +  "371300": {
    1802
    +    "371302": "兰山区",
    1803
    +    "371311": "罗庄区",
    1804
    +    "371312": "河东区",
    1805
    +    "371321": "沂南县",
    1806
    +    "371322": "郯城县",
    1807
    +    "371323": "沂水县",
    1808
    +    "371324": "兰陵县",
    1809
    +    "371325": "费县",
    1810
    +    "371326": "平邑县",
    1811
    +    "371327": "莒南县",
    1812
    +    "371328": "蒙阴县",
    1813
    +    "371329": "临沭县"
    1814
    +  },
    1815
    +  "371400": {
    1816
    +    "371402": "德城区",
    1817
    +    "371403": "陵城区",
    1818
    +    "371422": "宁津县",
    1819
    +    "371423": "庆云县",
    1820
    +    "371424": "临邑县",
    1821
    +    "371425": "齐河县",
    1822
    +    "371426": "平原县",
    1823
    +    "371427": "夏津县",
    1824
    +    "371428": "武城县",
    1825
    +    "371481": "乐陵市",
    1826
    +    "371482": "禹城市"
    1827
    +  },
    1828
    +  "371500": {
    1829
    +    "371502": "东昌府区",
    1830
    +    "371521": "阳谷县",
    1831
    +    "371522": "莘县",
    1832
    +    "371523": "茌平县",
    1833
    +    "371524": "东阿县",
    1834
    +    "371525": "冠县",
    1835
    +    "371526": "高唐县",
    1836
    +    "371581": "临清市"
    1837
    +  },
    1838
    +  "371600": {
    1839
    +    "371602": "滨城区",
    1840
    +    "371603": "沾化区",
    1841
    +    "371621": "惠民县",
    1842
    +    "371622": "阳信县",
    1843
    +    "371623": "无棣县",
    1844
    +    "371625": "博兴县",
    1845
    +    "371626": "邹平县"
    1846
    +  },
    1847
    +  "371700": {
    1848
    +    "371702": "牡丹区",
    1849
    +    "371703": "定陶区",
    1850
    +    "371721": "曹县",
    1851
    +    "371722": "单县",
    1852
    +    "371723": "成武县",
    1853
    +    "371724": "巨野县",
    1854
    +    "371725": "郓城县",
    1855
    +    "371726": "鄄城县",
    1856
    +    "371728": "东明县"
    1857
    +  },
    1858
    +  "410000": {
    1859
    +    "410100": "郑州市",
    1860
    +    "410200": "开封市",
    1861
    +    "410300": "洛阳市",
    1862
    +    "410400": "平顶山市",
    1863
    +    "410500": "安阳市",
    1864
    +    "410600": "鹤壁市",
    1865
    +    "410700": "新乡市",
    1866
    +    "410800": "焦作市",
    1867
    +    "410900": "濮阳市",
    1868
    +    "411000": "许昌市",
    1869
    +    "411100": "漯河市",
    1870
    +    "411200": "三门峡市",
    1871
    +    "411300": "南阳市",
    1872
    +    "411400": "商丘市",
    1873
    +    "411500": "信阳市",
    1874
    +    "411600": "周口市",
    1875
    +    "411700": "驻马店市",
    1876
    +    "419001": "济源市"
    1877
    +  },
    1878
    +  "410100": {
    1879
    +    "410102": "中原区",
    1880
    +    "410103": "二七区",
    1881
    +    "410104": "管城回族区",
    1882
    +    "410105": "金水区",
    1883
    +    "410106": "上街区",
    1884
    +    "410108": "惠济区",
    1885
    +    "410122": "中牟县",
    1886
    +    "410181": "巩义市",
    1887
    +    "410182": "荥阳市",
    1888
    +    "410183": "新密市",
    1889
    +    "410184": "新郑市",
    1890
    +    "410185": "登封市"
    1891
    +  },
    1892
    +  "410200": {
    1893
    +    "410202": "龙亭区",
    1894
    +    "410203": "顺河回族区",
    1895
    +    "410204": "鼓楼区",
    1896
    +    "410205": "禹王台区",
    1897
    +    "410211": "金明区",
    1898
    +    "410212": "祥符区",
    1899
    +    "410221": "杞县",
    1900
    +    "410222": "通许县",
    1901
    +    "410223": "尉氏县",
    1902
    +    "410225": "兰考县"
    1903
    +  },
    1904
    +  "410300": {
    1905
    +    "410302": "老城区",
    1906
    +    "410303": "西工区",
    1907
    +    "410304": "瀍河回族区",
    1908
    +    "410305": "涧西区",
    1909
    +    "410306": "吉利区",
    1910
    +    "410311": "洛龙区",
    1911
    +    "410322": "孟津县",
    1912
    +    "410323": "新安县",
    1913
    +    "410324": "栾川县",
    1914
    +    "410325": "嵩县",
    1915
    +    "410326": "汝阳县",
    1916
    +    "410327": "宜阳县",
    1917
    +    "410328": "洛宁县",
    1918
    +    "410329": "伊川县",
    1919
    +    "410381": "偃师市"
    1920
    +  },
    1921
    +  "410400": {
    1922
    +    "410402": "新华区",
    1923
    +    "410403": "卫东区",
    1924
    +    "410404": "石龙区",
    1925
    +    "410411": "湛河区",
    1926
    +    "410421": "宝丰县",
    1927
    +    "410422": "叶县",
    1928
    +    "410423": "鲁山县",
    1929
    +    "410425": "郏县",
    1930
    +    "410481": "舞钢市",
    1931
    +    "410482": "汝州市"
    1932
    +  },
    1933
    +  "410500": {
    1934
    +    "410502": "文峰区",
    1935
    +    "410503": "北关区",
    1936
    +    "410505": "殷都区",
    1937
    +    "410506": "龙安区",
    1938
    +    "410522": "安阳县",
    1939
    +    "410523": "汤阴县",
    1940
    +    "410526": "滑县",
    1941
    +    "410527": "内黄县",
    1942
    +    "410581": "林州市"
    1943
    +  },
    1944
    +  "410600": {
    1945
    +    "410602": "鹤山区",
    1946
    +    "410603": "山城区",
    1947
    +    "410611": "淇滨区",
    1948
    +    "410621": "浚县",
    1949
    +    "410622": "淇县"
    1950
    +  },
    1951
    +  "410700": {
    1952
    +    "410702": "红旗区",
    1953
    +    "410703": "卫滨区",
    1954
    +    "410704": "凤泉区",
    1955
    +    "410711": "牧野区",
    1956
    +    "410721": "新乡县",
    1957
    +    "410724": "获嘉县",
    1958
    +    "410725": "原阳县",
    1959
    +    "410726": "延津县",
    1960
    +    "410727": "封丘县",
    1961
    +    "410728": "长垣县",
    1962
    +    "410781": "卫辉市",
    1963
    +    "410782": "辉县市"
    1964
    +  },
    1965
    +  "410800": {
    1966
    +    "410802": "解放区",
    1967
    +    "410803": "中站区",
    1968
    +    "410804": "马村区",
    1969
    +    "410811": "山阳区",
    1970
    +    "410821": "修武县",
    1971
    +    "410822": "博爱县",
    1972
    +    "410823": "武陟县",
    1973
    +    "410825": "温县",
    1974
    +    "410882": "沁阳市",
    1975
    +    "410883": "孟州市"
    1976
    +  },
    1977
    +  "410900": {
    1978
    +    "410902": "华龙区",
    1979
    +    "410922": "清丰县",
    1980
    +    "410923": "南乐县",
    1981
    +    "410926": "范县",
    1982
    +    "410927": "台前县",
    1983
    +    "410928": "濮阳县"
    1984
    +  },
    1985
    +  "411000": {
    1986
    +    "411002": "魏都区",
    1987
    +    "411023": "许昌县",
    1988
    +    "411024": "鄢陵县",
    1989
    +    "411025": "襄城县",
    1990
    +    "411081": "禹州市",
    1991
    +    "411082": "长葛市"
    1992
    +  },
    1993
    +  "411100": {
    1994
    +    "411102": "源汇区",
    1995
    +    "411103": "郾城区",
    1996
    +    "411104": "召陵区",
    1997
    +    "411121": "舞阳县",
    1998
    +    "411122": "临颍县"
    1999
    +  },
    2000
    +  "411200": {
    2001
    +    "411202": "湖滨区",
    2002
    +    "411203": "陕州区",
    2003
    +    "411221": "渑池县",
    2004
    +    "411224": "卢氏县",
    2005
    +    "411281": "义马市",
    2006
    +    "411282": "灵宝市"
    2007
    +  },
    2008
    +  "411300": {
    2009
    +    "411302": "宛城区",
    2010
    +    "411303": "卧龙区",
    2011
    +    "411321": "南召县",
    2012
    +    "411322": "方城县",
    2013
    +    "411323": "西峡县",
    2014
    +    "411324": "镇平县",
    2015
    +    "411325": "内乡县",
    2016
    +    "411326": "淅川县",
    2017
    +    "411327": "社旗县",
    2018
    +    "411328": "唐河县",
    2019
    +    "411329": "新野县",
    2020
    +    "411330": "桐柏县",
    2021
    +    "411381": "邓州市"
    2022
    +  },
    2023
    +  "411400": {
    2024
    +    "411402": "梁园区",
    2025
    +    "411403": "睢阳区",
    2026
    +    "411421": "民权县",
    2027
    +    "411422": "睢县",
    2028
    +    "411423": "宁陵县",
    2029
    +    "411424": "柘城县",
    2030
    +    "411425": "虞城县",
    2031
    +    "411426": "夏邑县",
    2032
    +    "411481": "永城市"
    2033
    +  },
    2034
    +  "411500": {
    2035
    +    "411502": "浉河区",
    2036
    +    "411503": "平桥区",
    2037
    +    "411521": "罗山县",
    2038
    +    "411522": "光山县",
    2039
    +    "411523": "新县",
    2040
    +    "411524": "商城县",
    2041
    +    "411525": "固始县",
    2042
    +    "411526": "潢川县",
    2043
    +    "411527": "淮滨县",
    2044
    +    "411528": "息县"
    2045
    +  },
    2046
    +  "411600": {
    2047
    +    "411602": "川汇区",
    2048
    +    "411621": "扶沟县",
    2049
    +    "411622": "西华县",
    2050
    +    "411623": "商水县",
    2051
    +    "411624": "沈丘县",
    2052
    +    "411625": "郸城县",
    2053
    +    "411626": "淮阳县",
    2054
    +    "411627": "太康县",
    2055
    +    "411628": "鹿邑县",
    2056
    +    "411681": "项城市"
    2057
    +  },
    2058
    +  "411700": {
    2059
    +    "411702": "驿城区",
    2060
    +    "411721": "西平县",
    2061
    +    "411722": "上蔡县",
    2062
    +    "411723": "平舆县",
    2063
    +    "411724": "正阳县",
    2064
    +    "411725": "确山县",
    2065
    +    "411726": "泌阳县",
    2066
    +    "411727": "汝南县",
    2067
    +    "411728": "遂平县",
    2068
    +    "411729": "新蔡县"
    2069
    +  },
    2070
    +  "420000": {
    2071
    +    "420100": "武汉市",
    2072
    +    "420200": "黄石市",
    2073
    +    "420300": "十堰市",
    2074
    +    "420500": "宜昌市",
    2075
    +    "420600": "襄阳市",
    2076
    +    "420700": "鄂州市",
    2077
    +    "420800": "荆门市",
    2078
    +    "420900": "孝感市",
    2079
    +    "421000": "荆州市",
    2080
    +    "421100": "黄冈市",
    2081
    +    "421200": "咸宁市",
    2082
    +    "421300": "随州市",
    2083
    +    "422800": "恩施土家族苗族自治州",
    2084
    +    "429004": "仙桃市",
    2085
    +    "429005": "潜江市",
    2086
    +    "429006": "天门市",
    2087
    +    "429021": "神农架林区"
    2088
    +  },
    2089
    +  "420100": {
    2090
    +    "420102": "江岸区",
    2091
    +    "420103": "江汉区",
    2092
    +    "420104": "硚口区",
    2093
    +    "420105": "汉阳区",
    2094
    +    "420106": "武昌区",
    2095
    +    "420107": "青山区",
    2096
    +    "420111": "洪山区",
    2097
    +    "420112": "东西湖区",
    2098
    +    "420113": "汉南区",
    2099
    +    "420114": "蔡甸区",
    2100
    +    "420115": "江夏区",
    2101
    +    "420116": "黄陂区",
    2102
    +    "420117": "新洲区"
    2103
    +  },
    2104
    +  "420200": {
    2105
    +    "420202": "黄石港区",
    2106
    +    "420203": "西塞山区",
    2107
    +    "420204": "下陆区",
    2108
    +    "420205": "铁山区",
    2109
    +    "420222": "阳新县",
    2110
    +    "420281": "大冶市"
    2111
    +  },
    2112
    +  "420300": {
    2113
    +    "420302": "茅箭区",
    2114
    +    "420303": "张湾区",
    2115
    +    "420304": "郧阳区",
    2116
    +    "420322": "郧西县",
    2117
    +    "420323": "竹山县",
    2118
    +    "420324": "竹溪县",
    2119
    +    "420325": "房县",
    2120
    +    "420381": "丹江口市"
    2121
    +  },
    2122
    +  "420500": {
    2123
    +    "420502": "西陵区",
    2124
    +    "420503": "伍家岗区",
    2125
    +    "420504": "点军区",
    2126
    +    "420505": "猇亭区",
    2127
    +    "420506": "夷陵区",
    2128
    +    "420525": "远安县",
    2129
    +    "420526": "兴山县",
    2130
    +    "420527": "秭归县",
    2131
    +    "420528": "长阳土家族自治县",
    2132
    +    "420529": "五峰土家族自治县",
    2133
    +    "420581": "宜都市",
    2134
    +    "420582": "当阳市",
    2135
    +    "420583": "枝江市"
    2136
    +  },
    2137
    +  "420600": {
    2138
    +    "420602": "襄城区",
    2139
    +    "420606": "樊城区",
    2140
    +    "420607": "襄州区",
    2141
    +    "420624": "南漳县",
    2142
    +    "420625": "谷城县",
    2143
    +    "420626": "保康县",
    2144
    +    "420682": "老河口市",
    2145
    +    "420683": "枣阳市",
    2146
    +    "420684": "宜城市"
    2147
    +  },
    2148
    +  "420700": {
    2149
    +    "420702": "梁子湖区",
    2150
    +    "420703": "华容区",
    2151
    +    "420704": "鄂城区"
    2152
    +  },
    2153
    +  "420800": {
    2154
    +    "420802": "东宝区",
    2155
    +    "420804": "掇刀区",
    2156
    +    "420821": "京山县",
    2157
    +    "420822": "沙洋县",
    2158
    +    "420881": "钟祥市"
    2159
    +  },
    2160
    +  "420900": {
    2161
    +    "420902": "孝南区",
    2162
    +    "420921": "孝昌县",
    2163
    +    "420922": "大悟县",
    2164
    +    "420923": "云梦县",
    2165
    +    "420981": "应城市",
    2166
    +    "420982": "安陆市",
    2167
    +    "420984": "汉川市"
    2168
    +  },
    2169
    +  "421000": {
    2170
    +    "421002": "沙市区",
    2171
    +    "421003": "荆州区",
    2172
    +    "421022": "公安县",
    2173
    +    "421023": "监利县",
    2174
    +    "421024": "江陵县",
    2175
    +    "421081": "石首市",
    2176
    +    "421083": "洪湖市",
    2177
    +    "421087": "松滋市"
    2178
    +  },
    2179
    +  "421100": {
    2180
    +    "421102": "黄州区",
    2181
    +    "421121": "团风县",
    2182
    +    "421122": "红安县",
    2183
    +    "421123": "罗田县",
    2184
    +    "421124": "英山县",
    2185
    +    "421125": "浠水县",
    2186
    +    "421126": "蕲春县",
    2187
    +    "421127": "黄梅县",
    2188
    +    "421181": "麻城市",
    2189
    +    "421182": "武穴市"
    2190
    +  },
    2191
    +  "421200": {
    2192
    +    "421202": "咸安区",
    2193
    +    "421221": "嘉鱼县",
    2194
    +    "421222": "通城县",
    2195
    +    "421223": "崇阳县",
    2196
    +    "421224": "通山县",
    2197
    +    "421281": "赤壁市"
    2198
    +  },
    2199
    +  "421300": {
    2200
    +    "421303": "曾都区",
    2201
    +    "421321": "随县",
    2202
    +    "421381": "广水市"
    2203
    +  },
    2204
    +  "422800": {
    2205
    +    "422801": "恩施市",
    2206
    +    "422802": "利川市",
    2207
    +    "422822": "建始县",
    2208
    +    "422823": "巴东县",
    2209
    +    "422825": "宣恩县",
    2210
    +    "422826": "咸丰县",
    2211
    +    "422827": "来凤县",
    2212
    +    "422828": "鹤峰县"
    2213
    +  },
    2214
    +  "430000": {
    2215
    +    "430100": "长沙市",
    2216
    +    "430200": "株洲市",
    2217
    +    "430300": "湘潭市",
    2218
    +    "430400": "衡阳市",
    2219
    +    "430500": "邵阳市",
    2220
    +    "430600": "岳阳市",
    2221
    +    "430700": "常德市",
    2222
    +    "430800": "张家界市",
    2223
    +    "430900": "益阳市",
    2224
    +    "431000": "郴州市",
    2225
    +    "431100": "永州市",
    2226
    +    "431200": "怀化市",
    2227
    +    "431300": "娄底市",
    2228
    +    "433100": "湘西土家族苗族自治州"
    2229
    +  },
    2230
    +  "430100": {
    2231
    +    "430102": "芙蓉区",
    2232
    +    "430103": "天心区",
    2233
    +    "430104": "岳麓区",
    2234
    +    "430105": "开福区",
    2235
    +    "430111": "雨花区",
    2236
    +    "430112": "望城区",
    2237
    +    "430121": "长沙县",
    2238
    +    "430124": "宁乡县",
    2239
    +    "430181": "浏阳市"
    2240
    +  },
    2241
    +  "430200": {
    2242
    +    "430202": "荷塘区",
    2243
    +    "430203": "芦淞区",
    2244
    +    "430204": "石峰区",
    2245
    +    "430211": "天元区",
    2246
    +    "430221": "株洲县",
    2247
    +    "430223": "攸县",
    2248
    +    "430224": "茶陵县",
    2249
    +    "430225": "炎陵县",
    2250
    +    "430281": "醴陵市"
    2251
    +  },
    2252
    +  "430300": {
    2253
    +    "430302": "雨湖区",
    2254
    +    "430304": "岳塘区",
    2255
    +    "430321": "湘潭县",
    2256
    +    "430381": "湘乡市",
    2257
    +    "430382": "韶山市"
    2258
    +  },
    2259
    +  "430400": {
    2260
    +    "430405": "珠晖区",
    2261
    +    "430406": "雁峰区",
    2262
    +    "430407": "石鼓区",
    2263
    +    "430408": "蒸湘区",
    2264
    +    "430412": "南岳区",
    2265
    +    "430421": "衡阳县",
    2266
    +    "430422": "衡南县",
    2267
    +    "430423": "衡山县",
    2268
    +    "430424": "衡东县",
    2269
    +    "430426": "祁东县",
    2270
    +    "430481": "耒阳市",
    2271
    +    "430482": "常宁市"
    2272
    +  },
    2273
    +  "430500": {
    2274
    +    "430502": "双清区",
    2275
    +    "430503": "大祥区",
    2276
    +    "430511": "北塔区",
    2277
    +    "430521": "邵东县",
    2278
    +    "430522": "新邵县",
    2279
    +    "430523": "邵阳县",
    2280
    +    "430524": "隆回县",
    2281
    +    "430525": "洞口县",
    2282
    +    "430527": "绥宁县",
    2283
    +    "430528": "新宁县",
    2284
    +    "430529": "城步苗族自治县",
    2285
    +    "430581": "武冈市"
    2286
    +  },
    2287
    +  "430600": {
    2288
    +    "430602": "岳阳楼区",
    2289
    +    "430603": "云溪区",
    2290
    +    "430611": "君山区",
    2291
    +    "430621": "岳阳县",
    2292
    +    "430623": "华容县",
    2293
    +    "430624": "湘阴县",
    2294
    +    "430626": "平江县",
    2295
    +    "430681": "汨罗市",
    2296
    +    "430682": "临湘市"
    2297
    +  },
    2298
    +  "430700": {
    2299
    +    "430702": "武陵区",
    2300
    +    "430703": "鼎城区",
    2301
    +    "430721": "安乡县",
    2302
    +    "430722": "汉寿县",
    2303
    +    "430723": "澧县",
    2304
    +    "430724": "临澧县",
    2305
    +    "430725": "桃源县",
    2306
    +    "430726": "石门县",
    2307
    +    "430781": "津市市"
    2308
    +  },
    2309
    +  "430800": {
    2310
    +    "430802": "永定区",
    2311
    +    "430811": "武陵源区",
    2312
    +    "430821": "慈利县",
    2313
    +    "430822": "桑植县"
    2314
    +  },
    2315
    +  "430900": {
    2316
    +    "430902": "资阳区",
    2317
    +    "430903": "赫山区",
    2318
    +    "430921": "南县",
    2319
    +    "430922": "桃江县",
    2320
    +    "430923": "安化县",
    2321
    +    "430981": "沅江市"
    2322
    +  },
    2323
    +  "431000": {
    2324
    +    "431002": "北湖区",
    2325
    +    "431003": "苏仙区",
    2326
    +    "431021": "桂阳县",
    2327
    +    "431022": "宜章县",
    2328
    +    "431023": "永兴县",
    2329
    +    "431024": "嘉禾县",
    2330
    +    "431025": "临武县",
    2331
    +    "431026": "汝城县",
    2332
    +    "431027": "桂东县",
    2333
    +    "431028": "安仁县",
    2334
    +    "431081": "资兴市"
    2335
    +  },
    2336
    +  "431100": {
    2337
    +    "431102": "零陵区",
    2338
    +    "431103": "冷水滩区",
    2339
    +    "431121": "祁阳县",
    2340
    +    "431122": "东安县",
    2341
    +    "431123": "双牌县",
    2342
    +    "431124": "道县",
    2343
    +    "431125": "江永县",
    2344
    +    "431126": "宁远县",
    2345
    +    "431127": "蓝山县",
    2346
    +    "431128": "新田县",
    2347
    +    "431129": "江华瑶族自治县"
    2348
    +  },
    2349
    +  "431200": {
    2350
    +    "431202": "鹤城区",
    2351
    +    "431221": "中方县",
    2352
    +    "431222": "沅陵县",
    2353
    +    "431223": "辰溪县",
    2354
    +    "431224": "溆浦县",
    2355
    +    "431225": "会同县",
    2356
    +    "431226": "麻阳苗族自治县",
    2357
    +    "431227": "新晃侗族自治县",
    2358
    +    "431228": "芷江侗族自治县",
    2359
    +    "431229": "靖州苗族侗族自治县",
    2360
    +    "431230": "通道侗族自治县",
    2361
    +    "431281": "洪江市"
    2362
    +  },
    2363
    +  "431300": {
    2364
    +    "431302": "娄星区",
    2365
    +    "431321": "双峰县",
    2366
    +    "431322": "新化县",
    2367
    +    "431381": "冷水江市",
    2368
    +    "431382": "涟源市"
    2369
    +  },
    2370
    +  "433100": {
    2371
    +    "433101": "吉首市",
    2372
    +    "433122": "泸溪县",
    2373
    +    "433123": "凤凰县",
    2374
    +    "433124": "花垣县",
    2375
    +    "433125": "保靖县",
    2376
    +    "433126": "古丈县",
    2377
    +    "433127": "永顺县",
    2378
    +    "433130": "龙山县"
    2379
    +  },
    2380
    +  "440000": {
    2381
    +    "440100": "广州市",
    2382
    +    "440200": "韶关市",
    2383
    +    "440300": "深圳市",
    2384
    +    "440400": "珠海市",
    2385
    +    "440500": "汕头市",
    2386
    +    "440600": "佛山市",
    2387
    +    "440700": "江门市",
    2388
    +    "440800": "湛江市",
    2389
    +    "440900": "茂名市",
    2390
    +    "441200": "肇庆市",
    2391
    +    "441300": "惠州市",
    2392
    +    "441400": "梅州市",
    2393
    +    "441500": "汕尾市",
    2394
    +    "441600": "河源市",
    2395
    +    "441700": "阳江市",
    2396
    +    "441800": "清远市",
    2397
    +    "441900": "东莞市",
    2398
    +    "442000": "中山市",
    2399
    +    "445100": "潮州市",
    2400
    +    "445200": "揭阳市",
    2401
    +    "445300": "云浮市"
    2402
    +  },
    2403
    +  "440100": {
    2404
    +    "440103": "荔湾区",
    2405
    +    "440104": "越秀区",
    2406
    +    "440105": "海珠区",
    2407
    +    "440106": "天河区",
    2408
    +    "440111": "白云区",
    2409
    +    "440112": "黄埔区",
    2410
    +    "440113": "番禺区",
    2411
    +    "440114": "花都区",
    2412
    +    "440115": "南沙区",
    2413
    +    "440117": "从化区",
    2414
    +    "440118": "增城区"
    2415
    +  },
    2416
    +  "440200": {
    2417
    +    "440203": "武江区",
    2418
    +    "440204": "浈江区",
    2419
    +    "440205": "曲江区",
    2420
    +    "440222": "始兴县",
    2421
    +    "440224": "仁化县",
    2422
    +    "440229": "翁源县",
    2423
    +    "440232": "乳源瑶族自治县",
    2424
    +    "440233": "新丰县",
    2425
    +    "440281": "乐昌市",
    2426
    +    "440282": "南雄市"
    2427
    +  },
    2428
    +  "440300": {
    2429
    +    "440303": "罗湖区",
    2430
    +    "440304": "福田区",
    2431
    +    "440305": "南山区",
    2432
    +    "440306": "宝安区",
    2433
    +    "440307": "龙岗区",
    2434
    +    "440308": "盐田区"
    2435
    +  },
    2436
    +  "440400": {
    2437
    +    "440402": "香洲区",
    2438
    +    "440403": "斗门区",
    2439
    +    "440404": "金湾区"
    2440
    +  },
    2441
    +  "440500": {
    2442
    +    "440507": "龙湖区",
    2443
    +    "440511": "金平区",
    2444
    +    "440512": "濠江区",
    2445
    +    "440513": "潮阳区",
    2446
    +    "440514": "潮南区",
    2447
    +    "440515": "澄海区",
    2448
    +    "440523": "南澳县"
    2449
    +  },
    2450
    +  "440600": {
    2451
    +    "440604": "禅城区",
    2452
    +    "440605": "南海区",
    2453
    +    "440606": "顺德区",
    2454
    +    "440607": "三水区",
    2455
    +    "440608": "高明区"
    2456
    +  },
    2457
    +  "440700": {
    2458
    +    "440703": "蓬江区",
    2459
    +    "440704": "江海区",
    2460
    +    "440705": "新会区",
    2461
    +    "440781": "台山市",
    2462
    +    "440783": "开平市",
    2463
    +    "440784": "鹤山市",
    2464
    +    "440785": "恩平市"
    2465
    +  },
    2466
    +  "440800": {
    2467
    +    "440802": "赤坎区",
    2468
    +    "440803": "霞山区",
    2469
    +    "440804": "坡头区",
    2470
    +    "440811": "麻章区",
    2471
    +    "440823": "遂溪县",
    2472
    +    "440825": "徐闻县",
    2473
    +    "440881": "廉江市",
    2474
    +    "440882": "雷州市",
    2475
    +    "440883": "吴川市"
    2476
    +  },
    2477
    +  "440900": {
    2478
    +    "440902": "茂南区",
    2479
    +    "440904": "电白区",
    2480
    +    "440981": "高州市",
    2481
    +    "440982": "化州市",
    2482
    +    "440983": "信宜市"
    2483
    +  },
    2484
    +  "441200": {
    2485
    +    "441202": "端州区",
    2486
    +    "441203": "鼎湖区",
    2487
    +    "441204": "高要区",
    2488
    +    "441223": "广宁县",
    2489
    +    "441224": "怀集县",
    2490
    +    "441225": "封开县",
    2491
    +    "441226": "德庆县",
    2492
    +    "441284": "四会市"
    2493
    +  },
    2494
    +  "441300": {
    2495
    +    "441302": "惠城区",
    2496
    +    "441303": "惠阳区",
    2497
    +    "441322": "博罗县",
    2498
    +    "441323": "惠东县",
    2499
    +    "441324": "龙门县"
    2500
    +  },
    2501
    +  "441400": {
    2502
    +    "441402": "梅江区",
    2503
    +    "441403": "梅县区",
    2504
    +    "441422": "大埔县",
    2505
    +    "441423": "丰顺县",
    2506
    +    "441424": "五华县",
    2507
    +    "441426": "平远县",
    2508
    +    "441427": "蕉岭县",
    2509
    +    "441481": "兴宁市"
    2510
    +  },
    2511
    +  "441500": {
    2512
    +    "441502": "城区",
    2513
    +    "441521": "海丰县",
    2514
    +    "441523": "陆河县",
    2515
    +    "441581": "陆丰市"
    2516
    +  },
    2517
    +  "441600": {
    2518
    +    "441602": "源城区",
    2519
    +    "441621": "紫金县",
    2520
    +    "441622": "龙川县",
    2521
    +    "441623": "连平县",
    2522
    +    "441624": "和平县",
    2523
    +    "441625": "东源县"
    2524
    +  },
    2525
    +  "441700": {
    2526
    +    "441702": "江城区",
    2527
    +    "441704": "阳东区",
    2528
    +    "441721": "阳西县",
    2529
    +    "441781": "阳春市"
    2530
    +  },
    2531
    +  "441800": {
    2532
    +    "441802": "清城区",
    2533
    +    "441803": "清新区",
    2534
    +    "441821": "佛冈县",
    2535
    +    "441823": "阳山县",
    2536
    +    "441825": "连山壮族瑶族自治县",
    2537
    +    "441826": "连南瑶族自治县",
    2538
    +    "441881": "英德市",
    2539
    +    "441882": "连州市"
    2540
    +  },
    2541
    +  "445100": {
    2542
    +    "445102": "湘桥区",
    2543
    +    "445103": "潮安区",
    2544
    +    "445122": "饶平县"
    2545
    +  },
    2546
    +  "445200": {
    2547
    +    "445202": "榕城区",
    2548
    +    "445203": "揭东区",
    2549
    +    "445222": "揭西县",
    2550
    +    "445224": "惠来县",
    2551
    +    "445281": "普宁市"
    2552
    +  },
    2553
    +  "445300": {
    2554
    +    "445302": "云城区",
    2555
    +    "445303": "云安区",
    2556
    +    "445321": "新兴县",
    2557
    +    "445322": "郁南县",
    2558
    +    "445381": "罗定市"
    2559
    +  },
    2560
    +  "450000": {
    2561
    +    "450100": "南宁市",
    2562
    +    "450200": "柳州市",
    2563
    +    "450300": "桂林市",
    2564
    +    "450400": "梧州市",
    2565
    +    "450500": "北海市",
    2566
    +    "450600": "防城港市",
    2567
    +    "450700": "钦州市",
    2568
    +    "450800": "贵港市",
    2569
    +    "450900": "玉林市",
    2570
    +    "451000": "百色市",
    2571
    +    "451100": "贺州市",
    2572
    +    "451200": "河池市",
    2573
    +    "451300": "来宾市",
    2574
    +    "451400": "崇左市"
    2575
    +  },
    2576
    +  "450100": {
    2577
    +    "450102": "兴宁区",
    2578
    +    "450103": "青秀区",
    2579
    +    "450105": "江南区",
    2580
    +    "450107": "西乡塘区",
    2581
    +    "450108": "良庆区",
    2582
    +    "450109": "邕宁区",
    2583
    +    "450110": "武鸣区",
    2584
    +    "450123": "隆安县",
    2585
    +    "450124": "马山县",
    2586
    +    "450125": "上林县",
    2587
    +    "450126": "宾阳县",
    2588
    +    "450127": "横县"
    2589
    +  },
    2590
    +  "450200": {
    2591
    +    "450202": "城中区",
    2592
    +    "450203": "鱼峰区",
    2593
    +    "450204": "柳南区",
    2594
    +    "450205": "柳北区",
    2595
    +    "450206": "柳江区",
    2596
    +    "450222": "柳城县",
    2597
    +    "450223": "鹿寨县",
    2598
    +    "450224": "融安县",
    2599
    +    "450225": "融水苗族自治县",
    2600
    +    "450226": "三江侗族自治县"
    2601
    +  },
    2602
    +  "450300": {
    2603
    +    "450302": "秀峰区",
    2604
    +    "450303": "叠彩区",
    2605
    +    "450304": "象山区",
    2606
    +    "450305": "七星区",
    2607
    +    "450311": "雁山区",
    2608
    +    "450312": "临桂区",
    2609
    +    "450321": "阳朔县",
    2610
    +    "450323": "灵川县",
    2611
    +    "450324": "全州县",
    2612
    +    "450325": "兴安县",
    2613
    +    "450326": "永福县",
    2614
    +    "450327": "灌阳县",
    2615
    +    "450328": "龙胜各族自治县",
    2616
    +    "450329": "资源县",
    2617
    +    "450330": "平乐县",
    2618
    +    "450331": "荔浦县",
    2619
    +    "450332": "恭城瑶族自治县"
    2620
    +  },
    2621
    +  "450400": {
    2622
    +    "450403": "万秀区",
    2623
    +    "450405": "长洲区",
    2624
    +    "450406": "龙圩区",
    2625
    +    "450421": "苍梧县",
    2626
    +    "450422": "藤县",
    2627
    +    "450423": "蒙山县",
    2628
    +    "450481": "岑溪市"
    2629
    +  },
    2630
    +  "450500": {
    2631
    +    "450502": "海城区",
    2632
    +    "450503": "银海区",
    2633
    +    "450512": "铁山港区",
    2634
    +    "450521": "合浦县"
    2635
    +  },
    2636
    +  "450600": {
    2637
    +    "450602": "港口区",
    2638
    +    "450603": "防城区",
    2639
    +    "450621": "上思县",
    2640
    +    "450681": "东兴市"
    2641
    +  },
    2642
    +  "450700": {
    2643
    +    "450702": "钦南区",
    2644
    +    "450703": "钦北区",
    2645
    +    "450721": "灵山县",
    2646
    +    "450722": "浦北县"
    2647
    +  },
    2648
    +  "450800": {
    2649
    +    "450802": "港北区",
    2650
    +    "450803": "港南区",
    2651
    +    "450804": "覃塘区",
    2652
    +    "450821": "平南县",
    2653
    +    "450881": "桂平市"
    2654
    +  },
    2655
    +  "450900": {
    2656
    +    "450902": "玉州区",
    2657
    +    "450903": "福绵区",
    2658
    +    "450921": "容县",
    2659
    +    "450922": "陆川县",
    2660
    +    "450923": "博白县",
    2661
    +    "450924": "兴业县",
    2662
    +    "450981": "北流市"
    2663
    +  },
    2664
    +  "451000": {
    2665
    +    "451002": "右江区",
    2666
    +    "451021": "田阳县",
    2667
    +    "451022": "田东县",
    2668
    +    "451023": "平果县",
    2669
    +    "451024": "德保县",
    2670
    +    "451026": "那坡县",
    2671
    +    "451027": "凌云县",
    2672
    +    "451028": "乐业县",
    2673
    +    "451029": "田林县",
    2674
    +    "451030": "西林县",
    2675
    +    "451031": "隆林各族自治县",
    2676
    +    "451081": "靖西市"
    2677
    +  },
    2678
    +  "451100": {
    2679
    +    "451102": "八步区",
    2680
    +    "451103": "平桂区",
    2681
    +    "451121": "昭平县",
    2682
    +    "451122": "钟山县",
    2683
    +    "451123": "富川瑶族自治县"
    2684
    +  },
    2685
    +  "451200": {
    2686
    +    "451202": "金城江区",
    2687
    +    "451221": "南丹县",
    2688
    +    "451222": "天峨县",
    2689
    +    "451223": "凤山县",
    2690
    +    "451224": "东兰县",
    2691
    +    "451225": "罗城仫佬族自治县",
    2692
    +    "451226": "环江毛南族自治县",
    2693
    +    "451227": "巴马瑶族自治县",
    2694
    +    "451228": "都安瑶族自治县",
    2695
    +    "451229": "大化瑶族自治县",
    2696
    +    "451281": "宜州市"
    2697
    +  },
    2698
    +  "451300": {
    2699
    +    "451302": "兴宾区",
    2700
    +    "451321": "忻城县",
    2701
    +    "451322": "象州县",
    2702
    +    "451323": "武宣县",
    2703
    +    "451324": "金秀瑶族自治县",
    2704
    +    "451381": "合山市"
    2705
    +  },
    2706
    +  "451400": {
    2707
    +    "451402": "江州区",
    2708
    +    "451421": "扶绥县",
    2709
    +    "451422": "宁明县",
    2710
    +    "451423": "龙州县",
    2711
    +    "451424": "大新县",
    2712
    +    "451425": "天等县",
    2713
    +    "451481": "凭祥市"
    2714
    +  },
    2715
    +  "460000": {
    2716
    +    "460100": "海口市",
    2717
    +    "460200": "三亚市",
    2718
    +    "460300": "三沙市",
    2719
    +    "460400": "儋州市",
    2720
    +    "469001": "五指山市",
    2721
    +    "469002": "琼海市",
    2722
    +    "469005": "文昌市",
    2723
    +    "469006": "万宁市",
    2724
    +    "469007": "东方市",
    2725
    +    "469021": "定安县",
    2726
    +    "469022": "屯昌县",
    2727
    +    "469023": "澄迈县",
    2728
    +    "469024": "临高县",
    2729
    +    "469025": "白沙黎族自治县",
    2730
    +    "469026": "昌江黎族自治县",
    2731
    +    "469027": "乐东黎族自治县",
    2732
    +    "469028": "陵水黎族自治县",
    2733
    +    "469029": "保亭黎族苗族自治县",
    2734
    +    "469030": "琼中黎族苗族自治县"
    2735
    +  },
    2736
    +  "460100": {
    2737
    +    "460105": "秀英区",
    2738
    +    "460106": "龙华区",
    2739
    +    "460107": "琼山区",
    2740
    +    "460108": "美兰区"
    2741
    +  },
    2742
    +  "460200": {
    2743
    +    "460202": "海棠区",
    2744
    +    "460203": "吉阳区",
    2745
    +    "460204": "天涯区",
    2746
    +    "460205": "崖州区"
    2747
    +  },
    2748
    +  "500000": {
    2749
    +    "500100": "市辖区"
    2750
    +  },
    2751
    +  "500100": {
    2752
    +    "500101": "万州区",
    2753
    +    "500102": "涪陵区",
    2754
    +    "500103": "渝中区",
    2755
    +    "500104": "大渡口区",
    2756
    +    "500105": "江北区",
    2757
    +    "500106": "沙坪坝区",
    2758
    +    "500107": "九龙坡区",
    2759
    +    "500108": "南岸区",
    2760
    +    "500109": "北碚区",
    2761
    +    "500110": "綦江区",
    2762
    +    "500111": "大足区",
    2763
    +    "500112": "渝北区",
    2764
    +    "500113": "巴南区",
    2765
    +    "500114": "黔江区",
    2766
    +    "500115": "长寿区",
    2767
    +    "500116": "江津区",
    2768
    +    "500117": "合川区",
    2769
    +    "500118": "永川区",
    2770
    +    "500119": "南川区",
    2771
    +    "500120": "璧山区",
    2772
    +    "500151": "铜梁区",
    2773
    +    "500152": "潼南区",
    2774
    +    "500153": "荣昌区",
    2775
    +    "500154": "开州区",
    2776
    +    "500228": "梁平县",
    2777
    +    "500229": "城口县",
    2778
    +    "500230": "丰都县",
    2779
    +    "500231": "垫江县",
    2780
    +    "500232": "武隆县",
    2781
    +    "500233": "忠县",
    2782
    +    "500235": "云阳县",
    2783
    +    "500236": "奉节县",
    2784
    +    "500237": "巫山县",
    2785
    +    "500238": "巫溪县",
    2786
    +    "500240": "石柱土家族自治县",
    2787
    +    "500241": "秀山土家族苗族自治县",
    2788
    +    "500242": "酉阳土家族苗族自治县",
    2789
    +    "500243": "彭水苗族土家族自治县"
    2790
    +  },
    2791
    +  "510000": {
    2792
    +    "510100": "成都市",
    2793
    +    "510300": "自贡市",
    2794
    +    "510400": "攀枝花市",
    2795
    +    "510500": "泸州市",
    2796
    +    "510600": "德阳市",
    2797
    +    "510700": "绵阳市",
    2798
    +    "510800": "广元市",
    2799
    +    "510900": "遂宁市",
    2800
    +    "511000": "内江市",
    2801
    +    "511100": "乐山市",
    2802
    +    "511300": "南充市",
    2803
    +    "511400": "眉山市",
    2804
    +    "511500": "宜宾市",
    2805
    +    "511600": "广安市",
    2806
    +    "511700": "达州市",
    2807
    +    "511800": "雅安市",
    2808
    +    "511900": "巴中市",
    2809
    +    "512000": "资阳市",
    2810
    +    "513200": "阿坝藏族羌族自治州",
    2811
    +    "513300": "甘孜藏族自治州",
    2812
    +    "513400": "凉山彝族自治州"
    2813
    +  },
    2814
    +  "510100": {
    2815
    +    "510104": "锦江区",
    2816
    +    "510105": "青羊区",
    2817
    +    "510106": "金牛区",
    2818
    +    "510107": "武侯区",
    2819
    +    "510108": "成华区",
    2820
    +    "510112": "龙泉驿区",
    2821
    +    "510113": "青白江区",
    2822
    +    "510114": "新都区",
    2823
    +    "510115": "温江区",
    2824
    +    "510116": "双流区",
    2825
    +    "510121": "金堂县",
    2826
    +    "510124": "郫县",
    2827
    +    "510129": "大邑县",
    2828
    +    "510131": "蒲江县",
    2829
    +    "510132": "新津县",
    2830
    +    "510181": "都江堰市",
    2831
    +    "510182": "彭州市",
    2832
    +    "510183": "邛崃市",
    2833
    +    "510184": "崇州市",
    2834
    +    "510185": "简阳市"
    2835
    +  },
    2836
    +  "510300": {
    2837
    +    "510302": "自流井区",
    2838
    +    "510303": "贡井区",
    2839
    +    "510304": "大安区",
    2840
    +    "510311": "沿滩区",
    2841
    +    "510321": "荣县",
    2842
    +    "510322": "富顺县"
    2843
    +  },
    2844
    +  "510400": {
    2845
    +    "510402": "东区",
    2846
    +    "510403": "西区",
    2847
    +    "510411": "仁和区",
    2848
    +    "510421": "米易县",
    2849
    +    "510422": "盐边县"
    2850
    +  },
    2851
    +  "510500": {
    2852
    +    "510502": "江阳区",
    2853
    +    "510503": "纳溪区",
    2854
    +    "510504": "龙马潭区",
    2855
    +    "510521": "泸县",
    2856
    +    "510522": "合江县",
    2857
    +    "510524": "叙永县",
    2858
    +    "510525": "古蔺县"
    2859
    +  },
    2860
    +  "510600": {
    2861
    +    "510603": "旌阳区",
    2862
    +    "510623": "中江县",
    2863
    +    "510626": "罗江县",
    2864
    +    "510681": "广汉市",
    2865
    +    "510682": "什邡市",
    2866
    +    "510683": "绵竹市"
    2867
    +  },
    2868
    +  "510700": {
    2869
    +    "510703": "涪城区",
    2870
    +    "510704": "游仙区",
    2871
    +    "510705": "安州区",
    2872
    +    "510722": "三台县",
    2873
    +    "510723": "盐亭县",
    2874
    +    "510725": "梓潼县",
    2875
    +    "510726": "北川羌族自治县",
    2876
    +    "510727": "平武县",
    2877
    +    "510781": "江油市"
    2878
    +  },
    2879
    +  "510800": {
    2880
    +    "510802": "利州区",
    2881
    +    "510811": "昭化区",
    2882
    +    "510812": "朝天区",
    2883
    +    "510821": "旺苍县",
    2884
    +    "510822": "青川县",
    2885
    +    "510823": "剑阁县",
    2886
    +    "510824": "苍溪县"
    2887
    +  },
    2888
    +  "510900": {
    2889
    +    "510903": "船山区",
    2890
    +    "510904": "安居区",
    2891
    +    "510921": "蓬溪县",
    2892
    +    "510922": "射洪县",
    2893
    +    "510923": "大英县"
    2894
    +  },
    2895
    +  "511000": {
    2896
    +    "511002": "市中区",
    2897
    +    "511011": "东兴区",
    2898
    +    "511024": "威远县",
    2899
    +    "511025": "资中县",
    2900
    +    "511028": "隆昌县"
    2901
    +  },
    2902
    +  "511100": {
    2903
    +    "511102": "市中区",
    2904
    +    "511111": "沙湾区",
    2905
    +    "511112": "五通桥区",
    2906
    +    "511113": "金口河区",
    2907
    +    "511123": "犍为县",
    2908
    +    "511124": "井研县",
    2909
    +    "511126": "夹江县",
    2910
    +    "511129": "沐川县",
    2911
    +    "511132": "峨边彝族自治县",
    2912
    +    "511133": "马边彝族自治县",
    2913
    +    "511181": "峨眉山市"
    2914
    +  },
    2915
    +  "511300": {
    2916
    +    "511302": "顺庆区",
    2917
    +    "511303": "高坪区",
    2918
    +    "511304": "嘉陵区",
    2919
    +    "511321": "南部县",
    2920
    +    "511322": "营山县",
    2921
    +    "511323": "蓬安县",
    2922
    +    "511324": "仪陇县",
    2923
    +    "511325": "西充县",
    2924
    +    "511381": "阆中市"
    2925
    +  },
    2926
    +  "511400": {
    2927
    +    "511402": "东坡区",
    2928
    +    "511403": "彭山区",
    2929
    +    "511421": "仁寿县",
    2930
    +    "511423": "洪雅县",
    2931
    +    "511424": "丹棱县",
    2932
    +    "511425": "青神县"
    2933
    +  },
    2934
    +  "511500": {
    2935
    +    "511502": "翠屏区",
    2936
    +    "511503": "南溪区",
    2937
    +    "511521": "宜宾县",
    2938
    +    "511523": "江安县",
    2939
    +    "511524": "长宁县",
    2940
    +    "511525": "高县",
    2941
    +    "511526": "珙县",
    2942
    +    "511527": "筠连县",
    2943
    +    "511528": "兴文县",
    2944
    +    "511529": "屏山县"
    2945
    +  },
    2946
    +  "511600": {
    2947
    +    "511602": "广安区",
    2948
    +    "511603": "前锋区",
    2949
    +    "511621": "岳池县",
    2950
    +    "511622": "武胜县",
    2951
    +    "511623": "邻水县",
    2952
    +    "511681": "华蓥市"
    2953
    +  },
    2954
    +  "511700": {
    2955
    +    "511702": "通川区",
    2956
    +    "511703": "达川区",
    2957
    +    "511722": "宣汉县",
    2958
    +    "511723": "开江县",
    2959
    +    "511724": "大竹县",
    2960
    +    "511725": "渠县",
    2961
    +    "511781": "万源市"
    2962
    +  },
    2963
    +  "511800": {
    2964
    +    "511802": "雨城区",
    2965
    +    "511803": "名山区",
    2966
    +    "511822": "荥经县",
    2967
    +    "511823": "汉源县",
    2968
    +    "511824": "石棉县",
    2969
    +    "511825": "天全县",
    2970
    +    "511826": "芦山县",
    2971
    +    "511827": "宝兴县"
    2972
    +  },
    2973
    +  "511900": {
    2974
    +    "511902": "巴州区",
    2975
    +    "511903": "恩阳区",
    2976
    +    "511921": "通江县",
    2977
    +    "511922": "南江县",
    2978
    +    "511923": "平昌县"
    2979
    +  },
    2980
    +  "512000": {
    2981
    +    "512002": "雁江区",
    2982
    +    "512021": "安岳县",
    2983
    +    "512022": "乐至县"
    2984
    +  },
    2985
    +  "513200": {
    2986
    +    "513201": "马尔康市",
    2987
    +    "513221": "汶川县",
    2988
    +    "513222": "理县",
    2989
    +    "513223": "茂县",
    2990
    +    "513224": "松潘县",
    2991
    +    "513225": "九寨沟县",
    2992
    +    "513226": "金川县",
    2993
    +    "513227": "小金县",
    2994
    +    "513228": "黑水县",
    2995
    +    "513230": "壤塘县",
    2996
    +    "513231": "阿坝县",
    2997
    +    "513232": "若尔盖县",
    2998
    +    "513233": "红原县"
    2999
    +  },
    3000
    +  "513300": {
    3001
    +    "513301": "康定市",
    3002
    +    "513322": "泸定县",
    3003
    +    "513323": "丹巴县",
    3004
    +    "513324": "九龙县",
    3005
    +    "513325": "雅江县",
    3006
    +    "513326": "道孚县",
    3007
    +    "513327": "炉霍县",
    3008
    +    "513328": "甘孜县",
    3009
    +    "513329": "新龙县",
    3010
    +    "513330": "德格县",
    3011
    +    "513331": "白玉县",
    3012
    +    "513332": "石渠县",
    3013
    +    "513333": "色达县",
    3014
    +    "513334": "理塘县",
    3015
    +    "513335": "巴塘县",
    3016
    +    "513336": "乡城县",
    3017
    +    "513337": "稻城县",
    3018
    +    "513338": "得荣县"
    3019
    +  },
    3020
    +  "513400": {
    3021
    +    "513401": "西昌市",
    3022
    +    "513422": "木里藏族自治县",
    3023
    +    "513423": "盐源县",
    3024
    +    "513424": "德昌县",
    3025
    +    "513425": "会理县",
    3026
    +    "513426": "会东县",
    3027
    +    "513427": "宁南县",
    3028
    +    "513428": "普格县",
    3029
    +    "513429": "布拖县",
    3030
    +    "513430": "金阳县",
    3031
    +    "513431": "昭觉县",
    3032
    +    "513432": "喜德县",
    3033
    +    "513433": "冕宁县",
    3034
    +    "513434": "越西县",
    3035
    +    "513435": "甘洛县",
    3036
    +    "513436": "美姑县",
    3037
    +    "513437": "雷波县"
    3038
    +  },
    3039
    +  "520000": {
    3040
    +    "520100": "贵阳市",
    3041
    +    "520200": "六盘水市",
    3042
    +    "520300": "遵义市",
    3043
    +    "520400": "安顺市",
    3044
    +    "520500": "毕节市",
    3045
    +    "520600": "铜仁市",
    3046
    +    "522300": "黔西南布依族苗族自治州",
    3047
    +    "522600": "黔东南苗族侗族自治州",
    3048
    +    "522700": "黔南布依族苗族自治州"
    3049
    +  },
    3050
    +  "520100": {
    3051
    +    "520102": "南明区",
    3052
    +    "520103": "云岩区",
    3053
    +    "520111": "花溪区",
    3054
    +    "520112": "乌当区",
    3055
    +    "520113": "白云区",
    3056
    +    "520115": "观山湖区",
    3057
    +    "520121": "开阳县",
    3058
    +    "520122": "息烽县",
    3059
    +    "520123": "修文县",
    3060
    +    "520181": "清镇市"
    3061
    +  },
    3062
    +  "520200": {
    3063
    +    "520201": "钟山区",
    3064
    +    "520203": "六枝特区",
    3065
    +    "520221": "水城县",
    3066
    +    "520222": "盘县"
    3067
    +  },
    3068
    +  "520300": {
    3069
    +    "520302": "红花岗区",
    3070
    +    "520303": "汇川区",
    3071
    +    "520304": "播州区",
    3072
    +    "520322": "桐梓县",
    3073
    +    "520323": "绥阳县",
    3074
    +    "520324": "正安县",
    3075
    +    "520325": "道真仡佬族苗族自治县",
    3076
    +    "520326": "务川仡佬族苗族自治县",
    3077
    +    "520327": "凤冈县",
    3078
    +    "520328": "湄潭县",
    3079
    +    "520329": "余庆县",
    3080
    +    "520330": "习水县",
    3081
    +    "520381": "赤水市",
    3082
    +    "520382": "仁怀市"
    3083
    +  },
    3084
    +  "520400": {
    3085
    +    "520402": "西秀区",
    3086
    +    "520403": "平坝区",
    3087
    +    "520422": "普定县",
    3088
    +    "520423": "镇宁布依族苗族自治县",
    3089
    +    "520424": "关岭布依族苗族自治县",
    3090
    +    "520425": "紫云苗族布依族自治县"
    3091
    +  },
    3092
    +  "520500": {
    3093
    +    "520502": "七星关区",
    3094
    +    "520521": "大方县",
    3095
    +    "520522": "黔西县",
    3096
    +    "520523": "金沙县",
    3097
    +    "520524": "织金县",
    3098
    +    "520525": "纳雍县",
    3099
    +    "520526": "威宁彝族回族苗族自治县",
    3100
    +    "520527": "赫章县"
    3101
    +  },
    3102
    +  "520600": {
    3103
    +    "520602": "碧江区",
    3104
    +    "520603": "万山区",
    3105
    +    "520621": "江口县",
    3106
    +    "520622": "玉屏侗族自治县",
    3107
    +    "520623": "石阡县",
    3108
    +    "520624": "思南县",
    3109
    +    "520625": "印江土家族苗族自治县",
    3110
    +    "520626": "德江县",
    3111
    +    "520627": "沿河土家族自治县",
    3112
    +    "520628": "松桃苗族自治县"
    3113
    +  },
    3114
    +  "522300": {
    3115
    +    "522301": "兴义市",
    3116
    +    "522322": "兴仁县",
    3117
    +    "522323": "普安县",
    3118
    +    "522324": "晴隆县",
    3119
    +    "522325": "贞丰县",
    3120
    +    "522326": "望谟县",
    3121
    +    "522327": "册亨县",
    3122
    +    "522328": "安龙县"
    3123
    +  },
    3124
    +  "522600": {
    3125
    +    "522601": "凯里市",
    3126
    +    "522622": "黄平县",
    3127
    +    "522623": "施秉县",
    3128
    +    "522624": "三穗县",
    3129
    +    "522625": "镇远县",
    3130
    +    "522626": "岑巩县",
    3131
    +    "522627": "天柱县",
    3132
    +    "522628": "锦屏县",
    3133
    +    "522629": "剑河县",
    3134
    +    "522630": "台江县",
    3135
    +    "522631": "黎平县",
    3136
    +    "522632": "榕江县",
    3137
    +    "522633": "从江县",
    3138
    +    "522634": "雷山县",
    3139
    +    "522635": "麻江县",
    3140
    +    "522636": "丹寨县"
    3141
    +  },
    3142
    +  "522700": {
    3143
    +    "522701": "都匀市",
    3144
    +    "522702": "福泉市",
    3145
    +    "522722": "荔波县",
    3146
    +    "522723": "贵定县",
    3147
    +    "522725": "瓮安县",
    3148
    +    "522726": "独山县",
    3149
    +    "522727": "平塘县",
    3150
    +    "522728": "罗甸县",
    3151
    +    "522729": "长顺县",
    3152
    +    "522730": "龙里县",
    3153
    +    "522731": "惠水县",
    3154
    +    "522732": "三都水族自治县"
    3155
    +  },
    3156
    +  "530000": {
    3157
    +    "530100": "昆明市",
    3158
    +    "530300": "曲靖市",
    3159
    +    "530400": "玉溪市",
    3160
    +    "530500": "保山市",
    3161
    +    "530600": "昭通市",
    3162
    +    "530700": "丽江市",
    3163
    +    "530800": "普洱市",
    3164
    +    "530900": "临沧市",
    3165
    +    "532300": "楚雄彝族自治州",
    3166
    +    "532500": "红河哈尼族彝族自治州",
    3167
    +    "532600": "文山壮族苗族自治州",
    3168
    +    "532800": "西双版纳傣族自治州",
    3169
    +    "532900": "大理白族自治州",
    3170
    +    "533100": "德宏傣族景颇族自治州",
    3171
    +    "533300": "怒江傈僳族自治州",
    3172
    +    "533400": "迪庆藏族自治州"
    3173
    +  },
    3174
    +  "530100": {
    3175
    +    "530102": "五华区",
    3176
    +    "530103": "盘龙区",
    3177
    +    "530111": "官渡区",
    3178
    +    "530112": "西山区",
    3179
    +    "530113": "东川区",
    3180
    +    "530114": "呈贡区",
    3181
    +    "530122": "晋宁县",
    3182
    +    "530124": "富民县",
    3183
    +    "530125": "宜良县",
    3184
    +    "530126": "石林彝族自治县",
    3185
    +    "530127": "嵩明县",
    3186
    +    "530128": "禄劝彝族苗族自治县",
    3187
    +    "530129": "寻甸回族彝族自治县",
    3188
    +    "530181": "安宁市"
    3189
    +  },
    3190
    +  "530300": {
    3191
    +    "530302": "麒麟区",
    3192
    +    "530303": "沾益区",
    3193
    +    "530321": "马龙县",
    3194
    +    "530322": "陆良县",
    3195
    +    "530323": "师宗县",
    3196
    +    "530324": "罗平县",
    3197
    +    "530325": "富源县",
    3198
    +    "530326": "会泽县",
    3199
    +    "530381": "宣威市"
    3200
    +  },
    3201
    +  "530400": {
    3202
    +    "530402": "红塔区",
    3203
    +    "530403": "江川区",
    3204
    +    "530422": "澄江县",
    3205
    +    "530423": "通海县",
    3206
    +    "530424": "华宁县",
    3207
    +    "530425": "易门县",
    3208
    +    "530426": "峨山彝族自治县",
    3209
    +    "530427": "新平彝族傣族自治县",
    3210
    +    "530428": "元江哈尼族彝族傣族自治县"
    3211
    +  },
    3212
    +  "530500": {
    3213
    +    "530502": "隆阳区",
    3214
    +    "530521": "施甸县",
    3215
    +    "530523": "龙陵县",
    3216
    +    "530524": "昌宁县",
    3217
    +    "530581": "腾冲市"
    3218
    +  },
    3219
    +  "530600": {
    3220
    +    "530602": "昭阳区",
    3221
    +    "530621": "鲁甸县",
    3222
    +    "530622": "巧家县",
    3223
    +    "530623": "盐津县",
    3224
    +    "530624": "大关县",
    3225
    +    "530625": "永善县",
    3226
    +    "530626": "绥江县",
    3227
    +    "530627": "镇雄县",
    3228
    +    "530628": "彝良县",
    3229
    +    "530629": "威信县",
    3230
    +    "530630": "水富县"
    3231
    +  },
    3232
    +  "530700": {
    3233
    +    "530702": "古城区",
    3234
    +    "530721": "玉龙纳西族自治县",
    3235
    +    "530722": "永胜县",
    3236
    +    "530723": "华坪县",
    3237
    +    "530724": "宁蒗彝族自治县"
    3238
    +  },
    3239
    +  "530800": {
    3240
    +    "530802": "思茅区",
    3241
    +    "530821": "宁洱哈尼族彝族自治县",
    3242
    +    "530822": "墨江哈尼族自治县",
    3243
    +    "530823": "景东彝族自治县",
    3244
    +    "530824": "景谷傣族彝族自治县",
    3245
    +    "530825": "镇沅彝族哈尼族拉祜族自治县",
    3246
    +    "530826": "江城哈尼族彝族自治县",
    3247
    +    "530827": "孟连傣族拉祜族佤族自治县",
    3248
    +    "530828": "澜沧拉祜族自治县",
    3249
    +    "530829": "西盟佤族自治县"
    3250
    +  },
    3251
    +  "530900": {
    3252
    +    "530902": "临翔区",
    3253
    +    "530921": "凤庆县",
    3254
    +    "530922": "云县",
    3255
    +    "530923": "永德县",
    3256
    +    "530924": "镇康县",
    3257
    +    "530925": "双江拉祜族佤族布朗族傣族自治县",
    3258
    +    "530926": "耿马傣族佤族自治县",
    3259
    +    "530927": "沧源佤族自治县"
    3260
    +  },
    3261
    +  "532300": {
    3262
    +    "532301": "楚雄市",
    3263
    +    "532322": "双柏县",
    3264
    +    "532323": "牟定县",
    3265
    +    "532324": "南华县",
    3266
    +    "532325": "姚安县",
    3267
    +    "532326": "大姚县",
    3268
    +    "532327": "永仁县",
    3269
    +    "532328": "元谋县",
    3270
    +    "532329": "武定县",
    3271
    +    "532331": "禄丰县"
    3272
    +  },
    3273
    +  "532500": {
    3274
    +    "532501": "个旧市",
    3275
    +    "532502": "开远市",
    3276
    +    "532503": "蒙自市",
    3277
    +    "532504": "弥勒市",
    3278
    +    "532523": "屏边苗族自治县",
    3279
    +    "532524": "建水县",
    3280
    +    "532525": "石屏县",
    3281
    +    "532527": "泸西县",
    3282
    +    "532528": "元阳县",
    3283
    +    "532529": "红河县",
    3284
    +    "532530": "金平苗族瑶族傣族自治县",
    3285
    +    "532531": "绿春县",
    3286
    +    "532532": "河口瑶族自治县"
    3287
    +  },
    3288
    +  "532600": {
    3289
    +    "532601": "文山市",
    3290
    +    "532622": "砚山县",
    3291
    +    "532623": "西畴县",
    3292
    +    "532624": "麻栗坡县",
    3293
    +    "532625": "马关县",
    3294
    +    "532626": "丘北县",
    3295
    +    "532627": "广南县",
    3296
    +    "532628": "富宁县"
    3297
    +  },
    3298
    +  "532800": {
    3299
    +    "532801": "景洪市",
    3300
    +    "532822": "勐海县",
    3301
    +    "532823": "勐腊县"
    3302
    +  },
    3303
    +  "532900": {
    3304
    +    "532901": "大理市",
    3305
    +    "532922": "漾濞彝族自治县",
    3306
    +    "532923": "祥云县",
    3307
    +    "532924": "宾川县",
    3308
    +    "532925": "弥渡县",
    3309
    +    "532926": "南涧彝族自治县",
    3310
    +    "532927": "巍山彝族回族自治县",
    3311
    +    "532928": "永平县",
    3312
    +    "532929": "云龙县",
    3313
    +    "532930": "洱源县",
    3314
    +    "532931": "剑川县",
    3315
    +    "532932": "鹤庆县"
    3316
    +  },
    3317
    +  "533100": {
    3318
    +    "533102": "瑞丽市",
    3319
    +    "533103": "芒市",
    3320
    +    "533122": "梁河县",
    3321
    +    "533123": "盈江县",
    3322
    +    "533124": "陇川县"
    3323
    +  },
    3324
    +  "533300": {
    3325
    +    "533301": "泸水市",
    3326
    +    "533323": "福贡县",
    3327
    +    "533324": "贡山独龙族怒族自治县",
    3328
    +    "533325": "兰坪白族普米族自治县"
    3329
    +  },
    3330
    +  "533400": {
    3331
    +    "533401": "香格里拉市",
    3332
    +    "533422": "德钦县",
    3333
    +    "533423": "维西傈僳族自治县"
    3334
    +  },
    3335
    +  "540000": {
    3336
    +    "540100": "拉萨市",
    3337
    +    "540200": "日喀则市",
    3338
    +    "540300": "昌都市",
    3339
    +    "540400": "林芝市",
    3340
    +    "540500": "山南市",
    3341
    +    "542400": "那曲地区",
    3342
    +    "542500": "阿里地区"
    3343
    +  },
    3344
    +  "540100": {
    3345
    +    "540102": "城关区",
    3346
    +    "540103": "堆龙德庆区",
    3347
    +    "540121": "林周县",
    3348
    +    "540122": "当雄县",
    3349
    +    "540123": "尼木县",
    3350
    +    "540124": "曲水县",
    3351
    +    "540126": "达孜县",
    3352
    +    "540127": "墨竹工卡县"
    3353
    +  },
    3354
    +  "540200": {
    3355
    +    "540202": "桑珠孜区",
    3356
    +    "540221": "南木林县",
    3357
    +    "540222": "江孜县",
    3358
    +    "540223": "定日县",
    3359
    +    "540224": "萨迦县",
    3360
    +    "540225": "拉孜县",
    3361
    +    "540226": "昂仁县",
    3362
    +    "540227": "谢通门县",
    3363
    +    "540228": "白朗县",
    3364
    +    "540229": "仁布县",
    3365
    +    "540230": "康马县",
    3366
    +    "540231": "定结县",
    3367
    +    "540232": "仲巴县",
    3368
    +    "540233": "亚东县",
    3369
    +    "540234": "吉隆县",
    3370
    +    "540235": "聂拉木县",
    3371
    +    "540236": "萨嘎县",
    3372
    +    "540237": "岗巴县"
    3373
    +  },
    3374
    +  "540300": {
    3375
    +    "540302": "卡若区",
    3376
    +    "540321": "江达县",
    3377
    +    "540322": "贡觉县",
    3378
    +    "540323": "类乌齐县",
    3379
    +    "540324": "丁青县",
    3380
    +    "540325": "察雅县",
    3381
    +    "540326": "八宿县",
    3382
    +    "540327": "左贡县",
    3383
    +    "540328": "芒康县",
    3384
    +    "540329": "洛隆县",
    3385
    +    "540330": "边坝县"
    3386
    +  },
    3387
    +  "540400": {
    3388
    +    "540402": "巴宜区",
    3389
    +    "540421": "工布江达县",
    3390
    +    "540422": "米林县",
    3391
    +    "540423": "墨脱县",
    3392
    +    "540424": "波密县",
    3393
    +    "540425": "察隅县",
    3394
    +    "540426": "朗县"
    3395
    +  },
    3396
    +  "540500": {
    3397
    +    "540502": "乃东区",
    3398
    +    "540521": "扎囊县",
    3399
    +    "540522": "贡嘎县",
    3400
    +    "540523": "桑日县",
    3401
    +    "540524": "琼结县",
    3402
    +    "540525": "曲松县",
    3403
    +    "540526": "措美县",
    3404
    +    "540527": "洛扎县",
    3405
    +    "540528": "加查县",
    3406
    +    "540529": "隆子县",
    3407
    +    "540530": "错那县",
    3408
    +    "540531": "浪卡子县"
    3409
    +  },
    3410
    +  "542400": {
    3411
    +    "542421": "那曲县",
    3412
    +    "542422": "嘉黎县",
    3413
    +    "542423": "比如县",
    3414
    +    "542424": "聂荣县",
    3415
    +    "542425": "安多县",
    3416
    +    "542426": "申扎县",
    3417
    +    "542427": "索县",
    3418
    +    "542428": "班戈县",
    3419
    +    "542429": "巴青县",
    3420
    +    "542430": "尼玛县",
    3421
    +    "542431": "双湖县"
    3422
    +  },
    3423
    +  "542500": {
    3424
    +    "542521": "普兰县",
    3425
    +    "542522": "札达县",
    3426
    +    "542523": "噶尔县",
    3427
    +    "542524": "日土县",
    3428
    +    "542525": "革吉县",
    3429
    +    "542526": "改则县",
    3430
    +    "542527": "措勤县"
    3431
    +  },
    3432
    +  "610000": {
    3433
    +    "610100": "西安市",
    3434
    +    "610200": "铜川市",
    3435
    +    "610300": "宝鸡市",
    3436
    +    "610400": "咸阳市",
    3437
    +    "610500": "渭南市",
    3438
    +    "610600": "延安市",
    3439
    +    "610700": "汉中市",
    3440
    +    "610800": "榆林市",
    3441
    +    "610900": "安康市",
    3442
    +    "611000": "商洛市"
    3443
    +  },
    3444
    +  "610100": {
    3445
    +    "610102": "新城区",
    3446
    +    "610103": "碑林区",
    3447
    +    "610104": "莲湖区",
    3448
    +    "610111": "灞桥区",
    3449
    +    "610112": "未央区",
    3450
    +    "610113": "雁塔区",
    3451
    +    "610114": "阎良区",
    3452
    +    "610115": "临潼区",
    3453
    +    "610116": "长安区",
    3454
    +    "610117": "高陵区",
    3455
    +    "610122": "蓝田县",
    3456
    +    "610124": "周至县",
    3457
    +    "610125": "户县"
    3458
    +  },
    3459
    +  "610200": {
    3460
    +    "610202": "王益区",
    3461
    +    "610203": "印台区",
    3462
    +    "610204": "耀州区",
    3463
    +    "610222": "宜君县"
    3464
    +  },
    3465
    +  "610300": {
    3466
    +    "610302": "渭滨区",
    3467
    +    "610303": "金台区",
    3468
    +    "610304": "陈仓区",
    3469
    +    "610322": "凤翔县",
    3470
    +    "610323": "岐山县",
    3471
    +    "610324": "扶风县",
    3472
    +    "610326": "眉县",
    3473
    +    "610327": "陇县",
    3474
    +    "610328": "千阳县",
    3475
    +    "610329": "麟游县",
    3476
    +    "610330": "凤县",
    3477
    +    "610331": "太白县"
    3478
    +  },
    3479
    +  "610400": {
    3480
    +    "610402": "秦都区",
    3481
    +    "610403": "杨陵区",
    3482
    +    "610404": "渭城区",
    3483
    +    "610422": "三原县",
    3484
    +    "610423": "泾阳县",
    3485
    +    "610424": "乾县",
    3486
    +    "610425": "礼泉县",
    3487
    +    "610426": "永寿县",
    3488
    +    "610427": "彬县",
    3489
    +    "610428": "长武县",
    3490
    +    "610429": "旬邑县",
    3491
    +    "610430": "淳化县",
    3492
    +    "610431": "武功县",
    3493
    +    "610481": "兴平市"
    3494
    +  },
    3495
    +  "610500": {
    3496
    +    "610502": "临渭区",
    3497
    +    "610503": "华州区",
    3498
    +    "610522": "潼关县",
    3499
    +    "610523": "大荔县",
    3500
    +    "610524": "合阳县",
    3501
    +    "610525": "澄城县",
    3502
    +    "610526": "蒲城县",
    3503
    +    "610527": "白水县",
    3504
    +    "610528": "富平县",
    3505
    +    "610581": "韩城市",
    3506
    +    "610582": "华阴市"
    3507
    +  },
    3508
    +  "610600": {
    3509
    +    "610602": "宝塔区",
    3510
    +    "610603": "安塞区",
    3511
    +    "610621": "延长县",
    3512
    +    "610622": "延川县",
    3513
    +    "610623": "子长县",
    3514
    +    "610625": "志丹县",
    3515
    +    "610626": "吴起县",
    3516
    +    "610627": "甘泉县",
    3517
    +    "610628": "富县",
    3518
    +    "610629": "洛川县",
    3519
    +    "610630": "宜川县",
    3520
    +    "610631": "黄龙县",
    3521
    +    "610632": "黄陵县"
    3522
    +  },
    3523
    +  "610700": {
    3524
    +    "610702": "汉台区",
    3525
    +    "610721": "南郑县",
    3526
    +    "610722": "城固县",
    3527
    +    "610723": "洋县",
    3528
    +    "610724": "西乡县",
    3529
    +    "610725": "勉县",
    3530
    +    "610726": "宁强县",
    3531
    +    "610727": "略阳县",
    3532
    +    "610728": "镇巴县",
    3533
    +    "610729": "留坝县",
    3534
    +    "610730": "佛坪县"
    3535
    +  },
    3536
    +  "610800": {
    3537
    +    "610802": "榆阳区",
    3538
    +    "610803": "横山区",
    3539
    +    "610821": "神木县",
    3540
    +    "610822": "府谷县",
    3541
    +    "610824": "靖边县",
    3542
    +    "610825": "定边县",
    3543
    +    "610826": "绥德县",
    3544
    +    "610827": "米脂县",
    3545
    +    "610828": "佳县",
    3546
    +    "610829": "吴堡县",
    3547
    +    "610830": "清涧县",
    3548
    +    "610831": "子洲县"
    3549
    +  },
    3550
    +  "610900": {
    3551
    +    "610902": "汉滨区",
    3552
    +    "610921": "汉阴县",
    3553
    +    "610922": "石泉县",
    3554
    +    "610923": "宁陕县",
    3555
    +    "610924": "紫阳县",
    3556
    +    "610925": "岚皋县",
    3557
    +    "610926": "平利县",
    3558
    +    "610927": "镇坪县",
    3559
    +    "610928": "旬阳县",
    3560
    +    "610929": "白河县"
    3561
    +  },
    3562
    +  "611000": {
    3563
    +    "611002": "商州区",
    3564
    +    "611021": "洛南县",
    3565
    +    "611022": "丹凤县",
    3566
    +    "611023": "商南县",
    3567
    +    "611024": "山阳县",
    3568
    +    "611025": "镇安县",
    3569
    +    "611026": "柞水县"
    3570
    +  },
    3571
    +  "620000": {
    3572
    +    "620100": "兰州市",
    3573
    +    "620200": "嘉峪关市",
    3574
    +    "620300": "金昌市",
    3575
    +    "620400": "白银市",
    3576
    +    "620500": "天水市",
    3577
    +    "620600": "武威市",
    3578
    +    "620700": "张掖市",
    3579
    +    "620800": "平凉市",
    3580
    +    "620900": "酒泉市",
    3581
    +    "621000": "庆阳市",
    3582
    +    "621100": "定西市",
    3583
    +    "621200": "陇南市",
    3584
    +    "622900": "临夏回族自治州",
    3585
    +    "623000": "甘南藏族自治州"
    3586
    +  },
    3587
    +  "620100": {
    3588
    +    "620102": "城关区",
    3589
    +    "620103": "七里河区",
    3590
    +    "620104": "西固区",
    3591
    +    "620105": "安宁区",
    3592
    +    "620111": "红古区",
    3593
    +    "620121": "永登县",
    3594
    +    "620122": "皋兰县",
    3595
    +    "620123": "榆中县"
    3596
    +  },
    3597
    +  "620300": {
    3598
    +    "620302": "金川区",
    3599
    +    "620321": "永昌县"
    3600
    +  },
    3601
    +  "620400": {
    3602
    +    "620402": "白银区",
    3603
    +    "620403": "平川区",
    3604
    +    "620421": "靖远县",
    3605
    +    "620422": "会宁县",
    3606
    +    "620423": "景泰县"
    3607
    +  },
    3608
    +  "620500": {
    3609
    +    "620502": "秦州区",
    3610
    +    "620503": "麦积区",
    3611
    +    "620521": "清水县",
    3612
    +    "620522": "秦安县",
    3613
    +    "620523": "甘谷县",
    3614
    +    "620524": "武山县",
    3615
    +    "620525": "张家川回族自治县"
    3616
    +  },
    3617
    +  "620600": {
    3618
    +    "620602": "凉州区",
    3619
    +    "620621": "民勤县",
    3620
    +    "620622": "古浪县",
    3621
    +    "620623": "天祝藏族自治县"
    3622
    +  },
    3623
    +  "620700": {
    3624
    +    "620702": "甘州区",
    3625
    +    "620721": "肃南裕固族自治县",
    3626
    +    "620722": "民乐县",
    3627
    +    "620723": "临泽县",
    3628
    +    "620724": "高台县",
    3629
    +    "620725": "山丹县"
    3630
    +  },
    3631
    +  "620800": {
    3632
    +    "620802": "崆峒区",
    3633
    +    "620821": "泾川县",
    3634
    +    "620822": "灵台县",
    3635
    +    "620823": "崇信县",
    3636
    +    "620824": "华亭县",
    3637
    +    "620825": "庄浪县",
    3638
    +    "620826": "静宁县"
    3639
    +  },
    3640
    +  "620900": {
    3641
    +    "620902": "肃州区",
    3642
    +    "620921": "金塔县",
    3643
    +    "620922": "瓜州县",
    3644
    +    "620923": "肃北蒙古族自治县",
    3645
    +    "620924": "阿克塞哈萨克族自治县",
    3646
    +    "620981": "玉门市",
    3647
    +    "620982": "敦煌市"
    3648
    +  },
    3649
    +  "621000": {
    3650
    +    "621002": "西峰区",
    3651
    +    "621021": "庆城县",
    3652
    +    "621022": "环县",
    3653
    +    "621023": "华池县",
    3654
    +    "621024": "合水县",
    3655
    +    "621025": "正宁县",
    3656
    +    "621026": "宁县",
    3657
    +    "621027": "镇原县"
    3658
    +  },
    3659
    +  "621100": {
    3660
    +    "621102": "安定区",
    3661
    +    "621121": "通渭县",
    3662
    +    "621122": "陇西县",
    3663
    +    "621123": "渭源县",
    3664
    +    "621124": "临洮县",
    3665
    +    "621125": "漳县",
    3666
    +    "621126": "岷县"
    3667
    +  },
    3668
    +  "621200": {
    3669
    +    "621202": "武都区",
    3670
    +    "621221": "成县",
    3671
    +    "621222": "文县",
    3672
    +    "621223": "宕昌县",
    3673
    +    "621224": "康县",
    3674
    +    "621225": "西和县",
    3675
    +    "621226": "礼县",
    3676
    +    "621227": "徽县",
    3677
    +    "621228": "两当县"
    3678
    +  },
    3679
    +  "622900": {
    3680
    +    "622901": "临夏市",
    3681
    +    "622921": "临夏县",
    3682
    +    "622922": "康乐县",
    3683
    +    "622923": "永靖县",
    3684
    +    "622924": "广河县",
    3685
    +    "622925": "和政县",
    3686
    +    "622926": "东乡族自治县",
    3687
    +    "622927": "积石山保安族东乡族撒拉族自治县"
    3688
    +  },
    3689
    +  "623000": {
    3690
    +    "623001": "合作市",
    3691
    +    "623021": "临潭县",
    3692
    +    "623022": "卓尼县",
    3693
    +    "623023": "舟曲县",
    3694
    +    "623024": "迭部县",
    3695
    +    "623025": "玛曲县",
    3696
    +    "623026": "碌曲县",
    3697
    +    "623027": "夏河县"
    3698
    +  },
    3699
    +  "630000": {
    3700
    +    "630100": "西宁市",
    3701
    +    "630200": "海东市",
    3702
    +    "632200": "海北藏族自治州",
    3703
    +    "632300": "黄南藏族自治州",
    3704
    +    "632500": "海南藏族自治州",
    3705
    +    "632600": "果洛藏族自治州",
    3706
    +    "632700": "玉树藏族自治州",
    3707
    +    "632800": "海西蒙古族藏族自治州"
    3708
    +  },
    3709
    +  "630100": {
    3710
    +    "630102": "城东区",
    3711
    +    "630103": "城中区",
    3712
    +    "630104": "城西区",
    3713
    +    "630105": "城北区",
    3714
    +    "630121": "大通回族土族自治县",
    3715
    +    "630122": "湟中县",
    3716
    +    "630123": "湟源县"
    3717
    +  },
    3718
    +  "630200": {
    3719
    +    "630202": "乐都区",
    3720
    +    "630203": "平安区",
    3721
    +    "630222": "民和回族土族自治县",
    3722
    +    "630223": "互助土族自治县",
    3723
    +    "630224": "化隆回族自治县",
    3724
    +    "630225": "循化撒拉族自治县"
    3725
    +  },
    3726
    +  "632200": {
    3727
    +    "632221": "门源回族自治县",
    3728
    +    "632222": "祁连县",
    3729
    +    "632223": "海晏县",
    3730
    +    "632224": "刚察县"
    3731
    +  },
    3732
    +  "632300": {
    3733
    +    "632321": "同仁县",
    3734
    +    "632322": "尖扎县",
    3735
    +    "632323": "泽库县",
    3736
    +    "632324": "河南蒙古族自治县"
    3737
    +  },
    3738
    +  "632500": {
    3739
    +    "632521": "共和县",
    3740
    +    "632522": "同德县",
    3741
    +    "632523": "贵德县",
    3742
    +    "632524": "兴海县",
    3743
    +    "632525": "贵南县"
    3744
    +  },
    3745
    +  "632600": {
    3746
    +    "632621": "玛沁县",
    3747
    +    "632622": "班玛县",
    3748
    +    "632623": "甘德县",
    3749
    +    "632624": "达日县",
    3750
    +    "632625": "久治县",
    3751
    +    "632626": "玛多县"
    3752
    +  },
    3753
    +  "632700": {
    3754
    +    "632701": "玉树市",
    3755
    +    "632722": "杂多县",
    3756
    +    "632723": "称多县",
    3757
    +    "632724": "治多县",
    3758
    +    "632725": "囊谦县",
    3759
    +    "632726": "曲麻莱县"
    3760
    +  },
    3761
    +  "632800": {
    3762
    +    "632801": "格尔木市",
    3763
    +    "632802": "德令哈市",
    3764
    +    "632821": "乌兰县",
    3765
    +    "632822": "都兰县",
    3766
    +    "632823": "天峻县"
    3767
    +  },
    3768
    +  "640000": {
    3769
    +    "640100": "银川市",
    3770
    +    "640200": "石嘴山市",
    3771
    +    "640300": "吴忠市",
    3772
    +    "640400": "固原市",
    3773
    +    "640500": "中卫市"
    3774
    +  },
    3775
    +  "640100": {
    3776
    +    "640104": "兴庆区",
    3777
    +    "640105": "西夏区",
    3778
    +    "640106": "金凤区",
    3779
    +    "640121": "永宁县",
    3780
    +    "640122": "贺兰县",
    3781
    +    "640181": "灵武市"
    3782
    +  },
    3783
    +  "640200": {
    3784
    +    "640202": "大武口区",
    3785
    +    "640205": "惠农区",
    3786
    +    "640221": "平罗县"
    3787
    +  },
    3788
    +  "640300": {
    3789
    +    "640302": "利通区",
    3790
    +    "640303": "红寺堡区",
    3791
    +    "640323": "盐池县",
    3792
    +    "640324": "同心县",
    3793
    +    "640381": "青铜峡市"
    3794
    +  },
    3795
    +  "640400": {
    3796
    +    "640402": "原州区",
    3797
    +    "640422": "西吉县",
    3798
    +    "640423": "隆德县",
    3799
    +    "640424": "泾源县",
    3800
    +    "640425": "彭阳县"
    3801
    +  },
    3802
    +  "640500": {
    3803
    +    "640502": "沙坡头区",
    3804
    +    "640521": "中宁县",
    3805
    +    "640522": "海原县"
    3806
    +  },
    3807
    +  "650000": {
    3808
    +    "650100": "乌鲁木齐市",
    3809
    +    "650200": "克拉玛依市",
    3810
    +    "650400": "吐鲁番市",
    3811
    +    "650500": "哈密市",
    3812
    +    "652300": "昌吉回族自治州",
    3813
    +    "652700": "博尔塔拉蒙古自治州",
    3814
    +    "652800": "巴音郭楞蒙古自治州",
    3815
    +    "652900": "阿克苏地区",
    3816
    +    "653000": "克孜勒苏柯尔克孜自治州",
    3817
    +    "653100": "喀什地区",
    3818
    +    "653200": "和田地区",
    3819
    +    "654000": "伊犁哈萨克自治州",
    3820
    +    "654200": "塔城地区",
    3821
    +    "654300": "阿勒泰地区",
    3822
    +    "659001": "石河子市",
    3823
    +    "659002": "阿拉尔市",
    3824
    +    "659003": "图木舒克市",
    3825
    +    "659004": "五家渠市",
    3826
    +    "659006": "铁门关市"
    3827
    +  },
    3828
    +  "650100": {
    3829
    +    "650102": "天山区",
    3830
    +    "650103": "沙依巴克区",
    3831
    +    "650104": "新市区",
    3832
    +    "650105": "水磨沟区",
    3833
    +    "650106": "头屯河区",
    3834
    +    "650107": "达坂城区",
    3835
    +    "650109": "米东区",
    3836
    +    "650121": "乌鲁木齐县"
    3837
    +  },
    3838
    +  "650200": {
    3839
    +    "650202": "独山子区",
    3840
    +    "650203": "克拉玛依区",
    3841
    +    "650204": "白碱滩区",
    3842
    +    "650205": "乌尔禾区"
    3843
    +  },
    3844
    +  "650400": {
    3845
    +    "650402": "高昌区",
    3846
    +    "650421": "鄯善县",
    3847
    +    "650422": "托克逊县"
    3848
    +  },
    3849
    +  "650500": {
    3850
    +    "650502": "伊州区",
    3851
    +    "650521": "巴里坤哈萨克自治县",
    3852
    +    "650522": "伊吾县"
    3853
    +  },
    3854
    +  "652300": {
    3855
    +    "652301": "昌吉市",
    3856
    +    "652302": "阜康市",
    3857
    +    "652323": "呼图壁县",
    3858
    +    "652324": "玛纳斯县",
    3859
    +    "652325": "奇台县",
    3860
    +    "652327": "吉木萨尔县",
    3861
    +    "652328": "木垒哈萨克自治县"
    3862
    +  },
    3863
    +  "652700": {
    3864
    +    "652701": "博乐市",
    3865
    +    "652702": "阿拉山口市",
    3866
    +    "652722": "精河县",
    3867
    +    "652723": "温泉县"
    3868
    +  },
    3869
    +  "652800": {
    3870
    +    "652801": "库尔勒市",
    3871
    +    "652822": "轮台县",
    3872
    +    "652823": "尉犁县",
    3873
    +    "652824": "若羌县",
    3874
    +    "652825": "且末县",
    3875
    +    "652826": "焉耆回族自治县",
    3876
    +    "652827": "和静县",
    3877
    +    "652828": "和硕县",
    3878
    +    "652829": "博湖县"
    3879
    +  },
    3880
    +  "652900": {
    3881
    +    "652901": "阿克苏市",
    3882
    +    "652922": "温宿县",
    3883
    +    "652923": "库车县",
    3884
    +    "652924": "沙雅县",
    3885
    +    "652925": "新和县",
    3886
    +    "652926": "拜城县",
    3887
    +    "652927": "乌什县",
    3888
    +    "652928": "阿瓦提县",
    3889
    +    "652929": "柯坪县"
    3890
    +  },
    3891
    +  "653000": {
    3892
    +    "653001": "阿图什市",
    3893
    +    "653022": "阿克陶县",
    3894
    +    "653023": "阿合奇县",
    3895
    +    "653024": "乌恰县"
    3896
    +  },
    3897
    +  "653100": {
    3898
    +    "653101": "喀什市",
    3899
    +    "653121": "疏附县",
    3900
    +    "653122": "疏勒县",
    3901
    +    "653123": "英吉沙县",
    3902
    +    "653124": "泽普县",
    3903
    +    "653125": "莎车县",
    3904
    +    "653126": "叶城县",
    3905
    +    "653127": "麦盖提县",
    3906
    +    "653128": "岳普湖县",
    3907
    +    "653129": "伽师县",
    3908
    +    "653130": "巴楚县",
    3909
    +    "653131": "塔什库尔干塔吉克自治县"
    3910
    +  },
    3911
    +  "653200": {
    3912
    +    "653201": "和田市",
    3913
    +    "653221": "和田县",
    3914
    +    "653222": "墨玉县",
    3915
    +    "653223": "皮山县",
    3916
    +    "653224": "洛浦县",
    3917
    +    "653225": "策勒县",
    3918
    +    "653226": "于田县",
    3919
    +    "653227": "民丰县"
    3920
    +  },
    3921
    +  "654000": {
    3922
    +    "654002": "伊宁市",
    3923
    +    "654003": "奎屯市",
    3924
    +    "654004": "霍尔果斯市",
    3925
    +    "654021": "伊宁县",
    3926
    +    "654022": "察布查尔锡伯自治县",
    3927
    +    "654023": "霍城县",
    3928
    +    "654024": "巩留县",
    3929
    +    "654025": "新源县",
    3930
    +    "654026": "昭苏县",
    3931
    +    "654027": "特克斯县",
    3932
    +    "654028": "尼勒克县"
    3933
    +  },
    3934
    +  "654200": {
    3935
    +    "654201": "塔城市",
    3936
    +    "654202": "乌苏市",
    3937
    +    "654221": "额敏县",
    3938
    +    "654223": "沙湾县",
    3939
    +    "654224": "托里县",
    3940
    +    "654225": "裕民县",
    3941
    +    "654226": "和布克赛尔蒙古自治县"
    3942
    +  },
    3943
    +  "654300": {
    3944
    +    "654301": "阿勒泰市",
    3945
    +    "654321": "布尔津县",
    3946
    +    "654322": "富蕴县",
    3947
    +    "654323": "福海县",
    3948
    +    "654324": "哈巴河县",
    3949
    +    "654325": "青河县",
    3950
    +    "654326": "吉木乃县"
    3951
    +  },
    3952
    +  "810000": {
    3953
    +    "810001": "中西區",
    3954
    +    "810002": "灣仔區",
    3955
    +    "810003": "東區",
    3956
    +    "810004": "南區",
    3957
    +    "810005": "油尖旺區",
    3958
    +    "810006": "深水埗區",
    3959
    +    "810007": "九龍城區",
    3960
    +    "810008": "黃大仙區",
    3961
    +    "810009": "觀塘區",
    3962
    +    "810010": "荃灣區",
    3963
    +    "810011": "屯門區",
    3964
    +    "810012": "元朗區",
    3965
    +    "810013": "北區",
    3966
    +    "810014": "大埔區",
    3967
    +    "810015": "西貢區",
    3968
    +    "810016": "沙田區",
    3969
    +    "810017": "葵青區",
    3970
    +    "810018": "離島區"
    3971
    +  },
    3972
    +  "820000": {
    3973
    +    "820001": "花地瑪堂區",
    3974
    +    "820002": "花王堂區",
    3975
    +    "820003": "望德堂區",
    3976
    +    "820004": "大堂區",
    3977
    +    "820005": "風順堂區",
    3978
    +    "820006": "嘉模堂區",
    3979
    +    "820007": "路氹填海區",
    3980
    +    "820008": "聖方濟各堂區"
    3981
    +  }
    3982
    +}

    + 7 - 0
    data/tests.py

    @@ -0,0 +1,7 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +from __future__ import unicode_literals
    3
    +
    4
    +from django.test import TestCase
    5
    +
    6
    +
    7
    +# Create your tests here.

    + 7 - 0
    data/views.py

    @@ -0,0 +1,7 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +from __future__ import unicode_literals
    3
    +
    4
    +from django.shortcuts import render
    5
    +
    6
    +
    7
    +# Create your views here.

    + 0 - 0
    docs/COMMANDS.md


    + 2 - 0
    docs/CRONTAB.md

    @@ -0,0 +1,2 @@
    1
    +# 定时任务
    2
    +# m h  dom mon dow   command

    + 3 - 0
    isort.sh

    @@ -0,0 +1,3 @@
    1
    +#!/bin/bash
    2
    +
    3
    +isort .

    + 23 - 0
    manage.py

    @@ -0,0 +1,23 @@
    1
    +#!/usr/bin/env python
    2
    +import os
    3
    +import sys
    4
    +
    5
    +
    6
    +if __name__ == "__main__":
    7
    +    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tiwen.settings")
    8
    +    try:
    9
    +        from django.core.management import execute_from_command_line
    10
    +    except ImportError:
    11
    +        # The above import may fail for some other reason. Ensure that the
    12
    +        # issue is really that Django is missing to avoid masking other
    13
    +        # exceptions on Python 2.
    14
    +        try:
    15
    +            import django
    16
    +        except ImportError:
    17
    +            raise ImportError(
    18
    +                "Couldn't import Django. Are you sure it's installed and "
    19
    +                "available on your PYTHONPATH environment variable? Did you "
    20
    +                "forget to activate a virtual environment?"
    21
    +            )
    22
    +        raise
    23
    +    execute_from_command_line(sys.argv)

    + 10 - 0
    pep8.sh

    @@ -0,0 +1,10 @@
    1
    +#!/bin/bash
    2
    +
    3
    +# Ignoring autogenerated files
    4
    +#  -- Migration directories
    5
    +# Ignoring error codes
    6
    +#  -- E128 continuation line under-indented for visual indent
    7
    +#  -- E402 module level import not at top of file
    8
    +#  -- E501 line too long
    9
    +
    10
    +pycodestyle --exclude=build,migrations,.tox --ignore=E128,E402,E501 .

    + 8 - 0
    requirements.txt

    @@ -0,0 +1,8 @@
    1
    +StatusCode==1.0.0
    2
    +furl==2.1.3
    3
    +jsonfield==3.1.0
    4
    +mysqlclient==2.1.1
    5
    +rlog==0.3
    6
    +-r requirements_dj.txt
    7
    +-r requirements_pywe.txt
    8
    +-r requirements_redis.txt

    + 3 - 0
    requirements_deploy.txt

    @@ -0,0 +1,3 @@
    1
    +ipdb==0.13.9
    2
    +ipython==7.34.0
    3
    +uwsgi==2.0.20

    + 2 - 0
    requirements_dev.txt

    @@ -0,0 +1,2 @@
    1
    +isort==5.10.1
    2
    +pycodestyle==2.8.0

    + 15 - 0
    requirements_dj.txt

    @@ -0,0 +1,15 @@
    1
    +Django==3.2.14
    2
    +django-admin==2.0.1
    3
    +django-detect==1.0.20
    4
    +django-file==1.0.4
    5
    +django-json-render==1.0.3
    6
    +django-json-response==1.1.5
    7
    +django-logit==1.1.3
    8
    +django-models-ext==1.1.10
    9
    +django-redis-connector==1.0.4
    10
    +django-response==1.1.1
    11
    +django-rlog==1.0.7
    12
    +django-short-url==1.1.6
    13
    +django-six==1.0.4
    14
    +django-uniapi==1.0.10
    15
    +django-we==1.5.6

    + 2 - 0
    requirements_pywe.txt

    @@ -0,0 +1,2 @@
    1
    +pywe-oauth==1.1.1
    2
    +pywe-pay==1.0.14

    + 3 - 0
    requirements_redis.txt

    @@ -0,0 +1,3 @@
    1
    +hiredis==2.0.0
    2
    +redis==4.3.4
    3
    +redis-extensions==4.0.1

    + 4 - 0
    sysctl.sh

    @@ -0,0 +1,4 @@
    1
    +#!/bin/bash
    2
    +
    3
    +sudo sysctl -w net.core.somaxconn=65535
    4
    +sudo sysctl -w net.core.netdev_max_backlog=65535

    + 0 - 0
    tiwen/__init__.py


    + 30 - 0
    tiwen/basemodels.py

    @@ -0,0 +1,30 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +from django.db import models
    4
    +from django.utils.translation import gettext_lazy as _
    5
    +
    6
    +
    7
    +class BaseModelMixin(models.Model):
    8
    +    status = models.BooleanField(_('status'), default=True, help_text=_('Status'))
    9
    +    created_at = models.DateTimeField(_('created_at'), auto_now_add=True, editable=True, help_text=_('Create Time'))
    10
    +    updated_at = models.DateTimeField(_('updated_at'), auto_now=True, editable=True, help_text=_('Update Time'))
    11
    +
    12
    +    class Meta:
    13
    +        abstract = True
    14
    +
    15
    +
    16
    +class SexModelMixin(models.Model):
    17
    +    UNKNOWN = 0
    18
    +    MALE = 1
    19
    +    FEMALE = 2
    20
    +
    21
    +    SEX_TUPLE = (
    22
    +        (UNKNOWN, '未知'),
    23
    +        (MALE, '男'),
    24
    +        (FEMALE, '女'),
    25
    +    )
    26
    +
    27
    +    sex = models.IntegerField(_('sex'), choices=SEX_TUPLE, default=UNKNOWN, help_text=_('Sex'))
    28
    +
    29
    +    class Meta:
    30
    +        abstract = True

    + 93 - 0
    tiwen/decorators.py

    @@ -0,0 +1,93 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +from functools import wraps
    4
    +
    5
    +from django.conf import settings
    6
    +from django.shortcuts import redirect
    7
    +from furl import furl
    8
    +from pywe_oauth import get_oauth_redirect_url
    9
    +from pywe_sign import check_signature
    10
    +
    11
    +from utils.error.errno_utils import SignatureStatusCode
    12
    +from utils.error.response_utils import response
    13
    +from utils.redis.connect import r
    14
    +
    15
    +
    16
    +def check_user_cookie(func=None, key=settings.COOKIE_USER_CHECK_KEY):
    17
    +    def decorator(func):
    18
    +        @wraps(func)
    19
    +        def returned_wrapper(request, *args, **kwargs):
    20
    +            user_id = request.get_signed_cookie(key, default='', salt=settings.COOKIE_SALT)
    21
    +            if not user_id:
    22
    +                return redirect(get_oauth_redirect_url(settings.WECHAT_OAUTH2_REDIRECT_URI, 'snsapi_userinfo', request.get_full_path()))
    23
    +            return func(request, *args, **kwargs)
    24
    +        return returned_wrapper
    25
    +
    26
    +    if not func:
    27
    +        def foo(func):
    28
    +            return decorator(func)
    29
    +        return foo
    30
    +
    31
    +    return decorator(func)
    32
    +
    33
    +
    34
    +def check_token(func=None, entry=None):
    35
    +    def decorator(func):
    36
    +        @wraps(func)
    37
    +        def returned_wrapper(request, *args, **kwargs):
    38
    +            if not settings.DEBUG and request.wechat:
    39
    +                vtoken = request.GET.get('vtoken', '') or request.POST.get('vtoken', '')
    40
    +                token_check_key = request.GET.get(settings.TOKEN_CHECK_KEY, '') or request.POST.get(settings.TOKEN_CHECK_KEY, '')
    41
    +                if not r.token_exists(token_check_key, vtoken):
    42
    +                    # 3rd OAuth
    43
    +                    # return redirect(settings.WECHAT_OAUTH2_REDIRECT_URL)
    44
    +                    # Current OAuth
    45
    +                    redirect_url = furl(entry or settings.WECHAT_OAUTH2_REDIRECT_ENTRY).add({}).url
    46
    +                    return redirect(get_oauth_redirect_url(settings.WECHAT_OAUTH2_REDIRECT_URI, 'snsapi_userinfo', redirect_url))
    47
    +            return func(request, *args, **kwargs)
    48
    +        return returned_wrapper
    49
    +
    50
    +    if not func:
    51
    +        def foo(func):
    52
    +            return decorator(func)
    53
    +        return foo
    54
    +
    55
    +    return decorator(func)
    56
    +
    57
    +
    58
    +def check_sign(func=None, method='POST'):
    59
    +    def decorator(func):
    60
    +        @wraps(func)
    61
    +        def returned_wrapper(request, *args, **kwargs):
    62
    +            if not settings.DEBUG and not check_signature(getattr(request, method).dict(), settings.PARAMS_SIGN_KEY):
    63
    +                return response(SignatureStatusCode.SIGNATURE_ERROR)
    64
    +            return func(request, *args, **kwargs)
    65
    +        return returned_wrapper
    66
    +
    67
    +    if not func:
    68
    +        def foo(func):
    69
    +            return decorator(func)
    70
    +        return foo
    71
    +
    72
    +    return decorator(func)
    73
    +
    74
    +
    75
    +def check_cookie(func=None, entry=None):
    76
    +    def decorator(func):
    77
    +        @wraps(func)
    78
    +        def returned_wrapper(request, *args, **kwargs):
    79
    +            if not settings.DEBUG and not request.COOKIES.get('user_id'):
    80
    +                # 3rd OAuth
    81
    +                # return redirect(settings.WECHAT_OAUTH2_REDIRECT_URL)
    82
    +                # Current OAuth
    83
    +                redirect_url = furl(entry or settings.WECHAT_OAUTH2_REDIRECT_ENTRY).add({}).url
    84
    +                return redirect(get_oauth_redirect_url(settings.WECHAT_OAUTH2_REDIRECT_URI, 'snsapi_userinfo', redirect_url))
    85
    +            return func(request, *args, **kwargs)
    86
    +        return returned_wrapper
    87
    +
    88
    +    if not func:
    89
    +        def foo(func):
    90
    +            return decorator(func)
    91
    +        return foo
    92
    +
    93
    +    return decorator(func)

    + 12 - 0
    tiwen/deploy.bak/supervisor_commands/pollqueue.ini

    @@ -0,0 +1,12 @@
    1
    +[program:pollqueue]
    2
    +command=/home/diors/env/bin/python /home/diors/work/tiwen/manage.py poll_queue
    3
    +autostart=true
    4
    +autorestart=true
    5
    +startretries=3
    6
    +exitcodes=0,1,2
    7
    +stopsignal=KILL
    8
    +stopasgroup=true
    9
    +killasgroup=true
    10
    +stdout_logfile=/var/log/supervisor_pollqueue_access.log
    11
    +stderr_logfile=/var/log/supervisor_pollqueue_error.log
    12
    +user=diors

    + 12 - 0
    tiwen/deploy.bak/supervisor_commands/rlistlog.ini

    @@ -0,0 +1,12 @@
    1
    +[program:rlistlog]
    2
    +command=/home/diors/env/bin/python /home/diors/work/tiwen/manage.py rlistlog --key=django:logit:tiwen --filename=/tmp/tiwen.logit.log
    3
    +autostart=true
    4
    +autorestart=true
    5
    +startretries=3
    6
    +exitcodes=0,1,2
    7
    +stopsignal=KILL
    8
    +stopasgroup=true
    9
    +killasgroup=true
    10
    +stdout_logfile=/var/log/supervisor_rlistlog_access.log
    11
    +stderr_logfile=/var/log/supervisor_rlistlog_error.log
    12
    +user=diors

    + 35 - 0
    tiwen/deploy.bak/tiwen.ini

    @@ -0,0 +1,35 @@
    1
    +# Refer: https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
    2
    +# tiwen_uwsgi.ini file
    3
    +[uwsgi]
    4
    +
    5
    +# Django-related settings
    6
    +# the base directory (full path)
    7
    +chdir           = /home/diors/work/tiwen
    8
    +# Django's wsgi file
    9
    +module          = tiwen.wsgi
    10
    +# the virtualenv (full path)
    11
    +# home            = /path/to/virtualenv
    12
    +
    13
    +# process-related settings
    14
    +# master
    15
    +master          = true
    16
    +# maximum number of worker processes
    17
    +processes       = 10
    18
    +# the socket (use the full path to be safe
    19
    +socket          = /home/diors/work/tiwen/tiwen/deploy/tiwen.sock
    20
    +# ... with appropriate permissions - may be needed
    21
    +chmod-socket    = 777
    22
    +# clear environment on exit
    23
    +vacuum          = true
    24
    +
    25
    +# connect() to unix:///home/xxx/xxx.sock failed (11: Resource temporarily unavailable) while connecting to upstream
    26
    +# Exec sysctl.sh first
    27
    +# #!/bin/bash
    28
    +# sudo sysctl -w net.core.somaxconn=65535
    29
    +# sudo sysctl -w net.core.netdev_max_backlog=65535
    30
    +reload-mercy    = 64
    31
    +max-requests    = 8192
    32
    +listen          = 8192
    33
    +
    34
    +# recv() failed (104: Connection reset by peer) while reading response header from upstream
    35
    +buffer-size     = 65535

    + 35 - 0
    tiwen/deploy.bak/tiwen2.ini

    @@ -0,0 +1,35 @@
    1
    +# Refer: https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
    2
    +# tiwen_uwsgi.ini file
    3
    +[uwsgi]
    4
    +
    5
    +# Django-related settings
    6
    +# the base directory (full path)
    7
    +chdir           = /home/diors/work/tiwen
    8
    +# Django's wsgi file
    9
    +module          = tiwen.wsgi
    10
    +# the virtualenv (full path)
    11
    +# home            = /path/to/virtualenv
    12
    +
    13
    +# process-related settings
    14
    +# master
    15
    +master          = true
    16
    +# maximum number of worker processes
    17
    +processes       = 10
    18
    +# the socket (use the full path to be safe
    19
    +socket          = /home/diors/work/tiwen/tiwen/deploy/tiwen2.sock
    20
    +# ... with appropriate permissions - may be needed
    21
    +chmod-socket    = 777
    22
    +# clear environment on exit
    23
    +vacuum          = true
    24
    +
    25
    +# connect() to unix:///home/xxx/xxx.sock failed (11: Resource temporarily unavailable) while connecting to upstream
    26
    +# Exec sysctl.sh first
    27
    +# #!/bin/bash
    28
    +# sudo sysctl -w net.core.somaxconn=65535
    29
    +# sudo sysctl -w net.core.netdev_max_backlog=65535
    30
    +reload-mercy    = 64
    31
    +max-requests    = 8192
    32
    +listen          = 8192
    33
    +
    34
    +# recv() failed (104: Connection reset by peer) while reading response header from upstream
    35
    +buffer-size     = 65535

    + 96 - 0
    tiwen/deploy.bak/tiwen_nginx.conf

    @@ -0,0 +1,96 @@
    1
    +# tiwen_nginx.conf
    2
    +
    3
    +# the upstream component nginx needs to connect to
    4
    +upstream tiwen {
    5
    +    # Single Server
    6
    +    # server unix:///home/diors/work/tiwen/tiwen/deploy/tiwen.sock; # for a file socket
    7
    +    # Multi Server
    8
    +    # server unix:///home/diors/work/tiwen/tiwen/deploy/tiwen.sock max_fails=0 weight=1; # for a file socket
    9
    +    # server unix:///home/diors/work/tiwen/tiwen/deploy/tiwen2.sock max_fails=0 weight=1; # for a file socket
    10
    +    server 127.0.0.1:8888; # for a web port socket (we'll use this first)
    11
    +}
    12
    +
    13
    +# configuration of the server
    14
    +server {
    15
    +    # the port your site will be served on
    16
    +    listen      80;
    17
    +    # the domain name it will serve for
    18
    +    server_name .a.com; # substitute your machine's IP address or FQDN
    19
    +    charset     utf-8;
    20
    +
    21
    +    # access_log off;  # 设置是否存储访问日志
    22
    +    # access_log /var/log/nginx/tiwen_access.log;
    23
    +    # error_log /var/log/nginx/tiwen_error.log;
    24
    +
    25
    +    # max upload size
    26
    +    client_max_body_size 75M;   # adjust to taste
    27
    +
    28
    +    # JS接口安全域名 & 业务域名 验证
    29
    +    location /xxx.txt {
    30
    +        alias /home/diors/work/tiwen/docs/we/xxx.txt;
    31
    +    }
    32
    +
    33
    +    # Django media
    34
    +    location /media  {
    35
    +        alias /home/diors/work/tiwen/media;  # your Django project's media files - amend as required
    36
    +    }
    37
    +
    38
    +    location /static {
    39
    +        alias /home/diors/work/tiwen/collect_static; # your Django project's static files - amend as required
    40
    +    }
    41
    +
    42
    +    # Finally, send all non-media requests to the Django server.
    43
    +    location / {
    44
    +        # uwsgi_pass  tiwen;
    45
    +        proxy_pass  http://tiwen;
    46
    +        include     /home/diors/work/tiwen/tiwen/deploy/uwsgi_params; # the uwsgi_params file you installed
    47
    +    }
    48
    +}
    49
    +
    50
    +# configuration of the server
    51
    +server {
    52
    +    # the port your site will be served on
    53
    +    listen      443;
    54
    +    # the domain name it will serve for
    55
    +    server_name .a.com; # substitute your machine's IP address or FQDN
    56
    +    charset     utf-8;
    57
    +
    58
    +    # access_log /var/log/nginx/tiwen_ssl_access.log;
    59
    +    # error_log /var/log/nginx/tiwen_ssl_error.log;
    60
    +
    61
    +    ssl on;
    62
    +    ssl_certificate   cert/214180103970874.pem;
    63
    +    ssl_certificate_key  cert/214180103970874.key;
    64
    +    ssl_session_timeout 5m;
    65
    +    # worker process * exited on signal 11
    66
    +    # 同一台服务器部署多个 SSL 转发,Nginx 默认是开启 Session 缓存的,导致冲突,验证不通过,连接直接退出
    67
    +    # 解决方案:禁用 Ningx SSL Session 的缓存
    68
    +    ssl_session_cache none;
    69
    +    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    70
    +    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    71
    +    ssl_prefer_server_ciphers on;
    72
    +
    73
    +    # max upload size
    74
    +    client_max_body_size 75M;   # adjust to taste
    75
    +
    76
    +    # JS接口安全域名 & 业务域名 验证
    77
    +    location /xxx.txt {
    78
    +        alias /home/diors/work/tiwen/docs/we/xxx.txt;
    79
    +    }
    80
    +
    81
    +    # Django media
    82
    +    location /media  {
    83
    +        alias /home/diors/work/tiwen/media;  # your Django project's media files - amend as required
    84
    +    }
    85
    +
    86
    +    location /static {
    87
    +        alias /home/diors/work/tiwen/collect_static; # your Django project's static files - amend as required
    88
    +    }
    89
    +
    90
    +    # Finally, send all non-media requests to the Django server.
    91
    +    location / {
    92
    +        # uwsgi_pass  tiwen;
    93
    +        proxy_pass  http://tiwen;
    94
    +        include     /home/diors/work/tiwen/tiwen/deploy/uwsgi_params; # the uwsgi_params file you installed
    95
    +    }
    96
    +}

    + 12 - 0
    tiwen/deploy.bak/tiwen_supervisor.ini

    @@ -0,0 +1,12 @@
    1
    +[program:tiwen]
    2
    +command=/home/diors/env/bin/uwsgi --ini /home/diors/work/tiwen/tiwen/deploy/tiwen.ini
    3
    +autostart=true
    4
    +autorestart=true
    5
    +startretries=3
    6
    +exitcodes=0,1,2
    7
    +stopsignal=KILL
    8
    +stopasgroup=true
    9
    +killasgroup=true
    10
    +stdout_logfile=/var/log/supervisor_tiwen_access.log
    11
    +stderr_logfile=/var/log/supervisor_tiwen_error.log
    12
    +user=diors

    + 12 - 0
    tiwen/deploy.bak/tiwen_supervisor2.ini

    @@ -0,0 +1,12 @@
    1
    +[program:tiwen2]
    2
    +command=/home/diors/env/bin/uwsgi --ini /home/diors/work/tiwen/tiwen/deploy/tiwen2.ini
    3
    +autostart=true
    4
    +autorestart=true
    5
    +startretries=3
    6
    +exitcodes=0,1,2
    7
    +stopsignal=KILL
    8
    +stopasgroup=true
    9
    +killasgroup=true
    10
    +stdout_logfile=/var/log/supervisor_tiwen2_access.log
    11
    +stderr_logfile=/var/log/supervisor_tiwen2_error.log
    12
    +user=diors

    + 15 - 0
    tiwen/deploy.bak/uwsgi_params

    @@ -0,0 +1,15 @@
    1
    +uwsgi_param	QUERY_STRING		$query_string;
    2
    +uwsgi_param	REQUEST_METHOD		$request_method;
    3
    +uwsgi_param	CONTENT_TYPE		$content_type;
    4
    +uwsgi_param	CONTENT_LENGTH		$content_length;
    5
    +
    6
    +uwsgi_param	REQUEST_URI		$request_uri;
    7
    +uwsgi_param	PATH_INFO		$document_uri;
    8
    +uwsgi_param	DOCUMENT_ROOT		$document_root;
    9
    +uwsgi_param	SERVER_PROTOCOL		$server_protocol;
    10
    +uwsgi_param	UWSGI_SCHEME		$scheme;
    11
    +
    12
    +uwsgi_param	REMOTE_ADDR		$remote_addr;
    13
    +uwsgi_param	REMOTE_PORT		$remote_port;
    14
    +uwsgi_param	SERVER_PORT		$server_port;
    15
    +uwsgi_param	SERVER_NAME		$server_name;

    + 5 - 0
    tiwen/django_file_callback_settings.py

    @@ -0,0 +1,5 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +
    4
    +def DJANGO_FILE_UPLOAD_CALLBACK_FUNC(request, file_path=None, file_url=None):
    5
    +    """ DJANGO FILE UPLOAD Callback Func """

    + 84 - 0
    tiwen/django_we_callback_settings.py

    @@ -0,0 +1,84 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +
    4
    +def DJANGO_WE_CFG_FUNC(request, state=None):
    5
    +    """ WeChat CFG Callback Func """
    6
    +
    7
    +
    8
    +def DJANGO_WE_QUOTE_STATE_FUNC(request, state):
    9
    +    """ WeChat Quote Callback Func """
    10
    +    from utils.redis.connect import r
    11
    +    return r.quote(state, short_uuid=True)
    12
    +
    13
    +
    14
    +def DJANGO_WE_UNQUOTE_STATE_FUNC(request, state):
    15
    +    """ WeChat UnQuote Callback Func """
    16
    +    from utils.redis.connect import r
    17
    +
    18
    +    # If Not Buf, When Wechat Multi Request, Unquote Will Get None
    19
    +    # Then Once Should ReOAuth, Will Raise Error
    20
    +    return r.unquote(state, buf=True) or state
    21
    +
    22
    +
    23
    +def DJANGO_WE_BASE_FUNC(code, state, access_info=None):
    24
    +    """ WeChat Base Redirect Callback Func """
    25
    +
    26
    +
    27
    +def DJANGO_WE_BASE_COOKIE_FUNC(code, state, access_info=None):
    28
    +    """ WeChat Base Set Cookie Redirect Callback Func """
    29
    +
    30
    +
    31
    +def DJANGO_WE_USERINFO_FUNC(code, state, access_info=None, userinfo=None):
    32
    +    """ WeChat Userinfo Redirect Callback Func """
    33
    +    from django.conf import settings
    34
    +
    35
    +    from utils.redis.connect import r
    36
    +    from utils.user.userinfo_save import userinfo_save
    37
    +
    38
    +    # Save profile or something else
    39
    +    user = userinfo_save(userinfo)
    40
    +
    41
    +    token_check_key = getattr(user, settings.TOKEN_CHECK_KEY)
    42
    +
    43
    +    return {
    44
    +        settings.TOKEN_CHECK_KEY: token_check_key,
    45
    +        'vtoken': r.token(token_check_key, ex=True, time=r.REDIS_EXPIRED_ONE_DAY, buf=False, short_uuid=True),
    46
    +    }
    47
    +
    48
    +
    49
    +def DJANGO_WE_USERINFO_COOKIE_FUNC(code, state, access_info=None, userinfo=None):
    50
    +    """ WeChat Userinfo Set Cookie Redirect Callback Func """
    51
    +    from django.conf import settings
    52
    +
    53
    +    from utils.user.userinfo_save import userinfo_save
    54
    +
    55
    +    # Save profile or something else
    56
    +    user = userinfo_save(userinfo)
    57
    +
    58
    +    token_check_key = getattr(user, settings.TOKEN_CHECK_KEY)
    59
    +
    60
    +    return {}, settings.TOKEN_CHECK_KEY, token_check_key
    61
    +
    62
    +
    63
    +def DJANGO_WE_SHARE_FUNC(request, state=None):
    64
    +    """ WeChat Share Callback Func """
    65
    +    # from django.conf import settings
    66
    +    # return settings.WECHAT_OAUTH2_REDIRECT_URL
    67
    +
    68
    +
    69
    +def DJANGO_WE_MESSAGE_CALLBACK_FUNC(request, xmldict, decrypted):
    70
    +    """ WeChat Message Callback Func """
    71
    +
    72
    +
    73
    +def DJANGO_WE_COMPONENT_AUTH_FUNC(request, xmldict, decrypted):
    74
    +    """ WeChat COMPONENT Auth Func """
    75
    +
    76
    +
    77
    +def DJANGO_WE_COMPONENT_CALLBACK_FUNC(request, appid, xmldict, decrypted):
    78
    +    """ WeChat COMPONENT Callback Func """
    79
    +
    80
    +
    81
    +def DJANGO_WE_REDIS_OBJ_FUNC(request):
    82
    +    """ WeChat Redis Object Callback Func """
    83
    +    from utils.redis.connect import r
    84
    +    return r

    + 16 - 0
    tiwen/func_settings.py

    @@ -0,0 +1,16 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +import redis_extensions as redis
    4
    +
    5
    +
    6
    +def redis_conf(conf):
    7
    +    return {
    8
    +        'host': conf.get('HOST', 'localhost'),
    9
    +        'port': conf.get('PORT', 6379),
    10
    +        'password': '{0}:{1}'.format(conf.get('USER', ''), conf.get('PASSWORD', '')) if conf.get('USER') else '',
    11
    +        'db': conf.get('db', 0),
    12
    +    }
    13
    +
    14
    +
    15
    +def redis_connect(conf):
    16
    +    return redis.StrictRedisExtensions(connection_pool=redis.ConnectionPool(**redis_conf(conf)))

    + 17 - 0
    tiwen/local_settings_bak.py

    @@ -0,0 +1,17 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +# DEBUG = False
    4
    +
    5
    +ALLOWED_HOSTS = ['127.0.0.1', 'localhost', 'tiwen']
    6
    +
    7
    +# DOMAIN
    8
    +DOMAIN = 'http://a.com'
    9
    +
    10
    +# 邮件设置
    11
    +# 只有当 DEBUG = False 的时候,才会邮件发送报错信息
    12
    +SERVER_EMAIL = 'error.notify@exmail.com'
    13
    +EMAIL_HOST_USER = 'error.notify@exmail.com'
    14
    +EMAIL_HOST_PASSWORD = '<^_^>pwd<^_^>'
    15
    +DEFAULT_FROM_EMAIL = 'error.notify <error.notify@exmail.com>'
    16
    +ADMINS = [('Zhang San', 'san.zhang@exmail.com'), ('Li Si', 'si.li@exmail.com')]
    17
    +EMAIL_SUBJECT_PREFIX = '[Templet] '

    + 27 - 0
    tiwen/local_settings_dev_bak.py

    @@ -0,0 +1,27 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +import os
    4
    +
    5
    +
    6
    +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    7
    +PROJ_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
    8
    +
    9
    +TEMPLATES = [
    10
    +    {
    11
    +        'BACKEND': 'django.template.backends.django.DjangoTemplates',
    12
    +        'DIRS': [os.path.join(BASE_DIR, 'templates')],
    13
    +        # 'APP_DIRS': True,
    14
    +        'OPTIONS': {
    15
    +            'context_processors': [
    16
    +                'django.template.context_processors.debug',
    17
    +                'django.template.context_processors.request',
    18
    +                'django.contrib.auth.context_processors.auth',
    19
    +                'django.contrib.messages.context_processors.messages',
    20
    +            ],
    21
    +            'loaders': [
    22
    +                'django.template.loaders.filesystem.Loader',
    23
    +                'django.template.loaders.app_directories.Loader',
    24
    +            ],
    25
    +        },
    26
    +    },
    27
    +]

    + 401 - 0
    tiwen/settings.py

    @@ -0,0 +1,401 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +"""
    4
    +Django settings for tiwen project.
    5
    +
    6
    +Generated by 'django-admin startproject' using Django 1.11.3.
    7
    +
    8
    +For more information on this file, see
    9
    +https://docs.djangoproject.com/en/1.11/topics/settings/
    10
    +
    11
    +For the full list of settings and their values, see
    12
    +https://docs.djangoproject.com/en/1.11/ref/settings/
    13
    +"""
    14
    +
    15
    +import os
    16
    +
    17
    +# try:
    18
    +#     from func_settings import redis_connect
    19
    +#     REDIS_CACHE = redis_connect(REDIS.get('default', {}))
    20
    +# except ImportError:
    21
    +#     REDIS_CACHE = None
    22
    +from django_redis_connector import connector
    23
    +
    24
    +
    25
    +# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    26
    +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    27
    +PROJ_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
    28
    +
    29
    +
    30
    +# Quick-start development settings - unsuitable for production
    31
    +# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
    32
    +
    33
    +# SECURITY WARNING: keep the secret key used in production secret!
    34
    +SECRET_KEY = '0=hpv21&am(7(k5ab!^zjvvl=ntj)^i@7)87t47uzumt_5rq$+'
    35
    +
    36
    +# SECURITY WARNING: don't run with debug turned on in production!
    37
    +DEBUG = True
    38
    +
    39
    +ALLOWED_HOSTS = []
    40
    +
    41
    +
    42
    +# Application definition
    43
    +
    44
    +INSTALLED_APPS = [
    45
    +    'django.contrib.admin',
    46
    +    'django.contrib.auth',
    47
    +    'django.contrib.contenttypes',
    48
    +    'django.contrib.sessions',
    49
    +    'django.contrib.messages',
    50
    +    'django.contrib.staticfiles',
    51
    +    # 'django_file_upload',
    52
    +    # 'django_short_url',
    53
    +    'django_uniapi',
    54
    +    'django_admin',
    55
    +    # 'django_rlog',
    56
    +    'django_we',
    57
    +    'commands',
    58
    +    'api',
    59
    +]
    60
    +
    61
    +MIDDLEWARE = [
    62
    +    'django.middleware.security.SecurityMiddleware',
    63
    +    'django.contrib.sessions.middleware.SessionMiddleware',
    64
    +    'django.middleware.common.CommonMiddleware',
    65
    +    # 'django.middleware.csrf.CsrfViewMiddleware',
    66
    +    'django.contrib.auth.middleware.AuthenticationMiddleware',
    67
    +    'django.contrib.messages.middleware.MessageMiddleware',
    68
    +    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    69
    +    'detect.middleware.UserAgentDetectionMiddleware',
    70
    +]
    71
    +
    72
    +ROOT_URLCONF = 'tiwen.urls'
    73
    +
    74
    +TEMPLATES = [
    75
    +    {
    76
    +        'BACKEND': 'django.template.backends.django.DjangoTemplates',
    77
    +        'DIRS': [os.path.join(BASE_DIR, 'templates')],
    78
    +        # 'APP_DIRS': True,
    79
    +        'OPTIONS': {
    80
    +            'context_processors': [
    81
    +                'django.template.context_processors.debug',
    82
    +                'django.template.context_processors.request',
    83
    +                'django.contrib.auth.context_processors.auth',
    84
    +                'django.contrib.messages.context_processors.messages',
    85
    +            ],
    86
    +            'loaders': [
    87
    +                ('django.template.loaders.cached.Loader', [
    88
    +                    'django.template.loaders.filesystem.Loader',
    89
    +                    'django.template.loaders.app_directories.Loader',
    90
    +                ]),
    91
    +            ],
    92
    +        },
    93
    +    },
    94
    +]
    95
    +
    96
    +WSGI_APPLICATION = 'tiwen.wsgi.application'
    97
    +
    98
    +
    99
    +# Database
    100
    +# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
    101
    +
    102
    +DATABASES = {
    103
    +    # Create Database
    104
    +    # CREATE DATABASE tiwen DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    105
    +    'default': {
    106
    +        'ENGINE': 'django.db.backends.mysql',
    107
    +        'NAME': 'tiwen',
    108
    +        'USER': 'root',
    109
    +        'PASSWORD': '',
    110
    +        'HOST': '127.0.0.1',
    111
    +        'PORT': 3306,
    112
    +        'CONN_MAX_AGE': 600,
    113
    +        'OPTIONS': {
    114
    +            'charset': 'utf8mb4',
    115
    +        },
    116
    +    }
    117
    +}
    118
    +
    119
    +
    120
    +# Password validation
    121
    +# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
    122
    +
    123
    +AUTH_PASSWORD_VALIDATORS = [
    124
    +    {
    125
    +        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    126
    +    },
    127
    +    {
    128
    +        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    129
    +    },
    130
    +    {
    131
    +        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    132
    +    },
    133
    +    {
    134
    +        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    135
    +    },
    136
    +]
    137
    +
    138
    +
    139
    +# Internationalization
    140
    +# https://docs.djangoproject.com/en/1.11/topics/i18n/
    141
    +
    142
    +LANGUAGE_CODE = 'zh-Hans'
    143
    +
    144
    +TIME_ZONE = 'Asia/Shanghai'
    145
    +
    146
    +USE_I18N = True
    147
    +
    148
    +USE_L10N = True
    149
    +
    150
    +USE_TZ = True
    151
    +
    152
    +
    153
    +# Static files (CSS, JavaScript, Images)
    154
    +# https://docs.djangoproject.com/en/1.11/howto/static-files/
    155
    +
    156
    +STATICFILES_DIRS = (
    157
    +    os.path.join(PROJ_DIR, 'static').replace('\\', '/'),
    158
    +)
    159
    +
    160
    +STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static').replace('\\', '/')
    161
    +
    162
    +STATIC_URL = '/static/'
    163
    +
    164
    +STATICFILES_FINDERS = (
    165
    +    'django.contrib.staticfiles.finders.FileSystemFinder',
    166
    +    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    167
    +    # 'django.contrib.staticfiles.finders.DefaultStorageFinder',
    168
    +)
    169
    +
    170
    +MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/')
    171
    +
    172
    +MEDIA_URL = '/media/'
    173
    +
    174
    +# File 设置
    175
    +FILE_UPLOAD_MAX_MEMORY_SIZE = 5242880  # InMemoryUploadedFile 文件最大值,设置为 5 MB
    176
    +FILE_UPLOAD_PERMISSIONS = 0o644  # TemporaryUploadedFile 文件权限设置
    177
    +
    178
    +# DOMAIN
    179
    +DOMAIN = 'http://a.com'
    180
    +
    181
    +# Redis 设置
    182
    +REDIS = {
    183
    +    'default': {
    184
    +        'HOST': '127.0.0.1',
    185
    +        'PORT': 6379,
    186
    +        'USER': '',
    187
    +        'PASSWORD': '',
    188
    +        'db': 0,
    189
    +        'decode_responses': True,
    190
    +    }
    191
    +}
    192
    +
    193
    +# 微信设置
    194
    +WECHAT = {
    195
    +    'JSAPI': {
    196
    +        'trade_type': 'JSAPI',  # JSAPI-网页支付、NATIVE-原生支付、APP-APP支付、MICROPAY-刷卡支付
    197
    +        'token': '5201314',
    198
    +        'appID': '',
    199
    +        'appsecret': '',
    200
    +        'encodingaeskey': '',
    201
    +        'mchID': '',
    202
    +        'apiKey': '',
    203
    +        'mch_cert': '',
    204
    +        'mch_key': '',
    205
    +        'redpack': {
    206
    +
    207
    +        }
    208
    +    },
    209
    +}
    210
    +
    211
    +WECHAT_DEFAULT_CFG = 'JSAPI'
    212
    +
    213
    +# 微信唯一标识
    214
    +# Choices: 'unionid' or 'openid'
    215
    +#
    216
    +# models.py
    217
    +#   'unique_identifier': self.unionid if settings.WECHAT_UNIQUE_IDENTIFICATION == 'unionid' else self.openid,
    218
    +# views.py
    219
    +#   unique_identifier = request.POST.get(settings.WECHAT_UNIQUE_IDENTIFICATION, '')
    220
    +#   profile = Profile.objects.get(**{settings.WECHAT_UNIQUE_IDENTIFICATION: unique_identifier})
    221
    +#
    222
    +# If not bind to OpenPlat, change `WECHAT_UNIQUE_IDENTIFICATION` as `openid`
    223
    +WECHAT_UNIQUE_IDENTIFICATION = 'unionid'
    224
    +
    225
    +# Token 错误重授权设置
    226
    +TOKEN_CHECK_KEY = ''
    227
    +# TOKEN_CHECK_KEY = 'user_id'
    228
    +WECHAT_OAUTH2_REDIRECT_ENTRY = ''
    229
    +WECHAT_OAUTH2_REDIRECT_URL = ''
    230
    +
    231
    +# Cookie 设置
    232
    +DJANGO_WE_COOKIE_MAX_AGE = COOKIE_MAX_AGE = 31536000  # 单位:秒,1年:365 * 24 * 60 * 60 = 31536000
    233
    +DJANGO_WE_COOKIE_SALT = COOKIE_SALT = 'djwe'  # Salt for ``set_signed_cookie``
    234
    +# Cookie 校验设置
    235
    +COOKIE_USER_CHECK_KEY = ''
    236
    +# COOKIE_USER_CHECK_KEY = 'user_id'
    237
    +
    238
    +# 邮件设置
    239
    +# https://docs.djangoproject.com/en/1.11/howto/error-reporting/#email-reports
    240
    +# When DEBUG is False, Django will email the users listed in the ADMINS setting
    241
    +# whenever your code raises an unhandled exception and results in an internal server error (HTTP status code 500).
    242
    +# 只有当 DEBUG = False 的时候,才会邮件发送报错信息
    243
    +# Email address that error messages come from.
    244
    +SERVER_EMAIL = 'error.notify@exmail.com'
    245
    +# The email backend to use. For possible shortcuts see django.core.mail.
    246
    +# The default is to use the SMTP backend.
    247
    +# Third-party backends can be specified by providing a Python path
    248
    +# to a module that defines an EmailBackend class.
    249
    +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    250
    +# Host for sending email.
    251
    +EMAIL_HOST = 'smtp.exmail.qq.com'
    252
    +# Port for sending email.
    253
    +EMAIL_PORT = 25
    254
    +# Optional SMTP authentication information for EMAIL_HOST.
    255
    +EMAIL_HOST_USER = 'error.notify@exmail.com'
    256
    +EMAIL_HOST_PASSWORD = '<^_^>pwd<^_^>'
    257
    +EMAIL_USE_TLS = False
    258
    +EMAIL_USE_SSL = False
    259
    +EMAIL_SSL_CERTFILE = None
    260
    +EMAIL_SSL_KEYFILE = None
    261
    +# Default: None
    262
    +# Specifies a timeout in seconds for blocking operations like the connection attempt.
    263
    +# socket.error: [Errno 110] Connection timed out
    264
    +# 如果不设置 EMAIL_TIMEOUT,一旦 sock.connect 连接有问题 error: (110, 'Connection timed out')
    265
    +# 就会导致进程一直卡住,最终导致服务崩溃
    266
    +# EMAIL_TIMEOUT = None
    267
    +EMAIL_TIMEOUT = 3
    268
    +# Default email address to use for various automated correspondence from
    269
    +# the site managers.
    270
    +DEFAULT_FROM_EMAIL = 'error.notify <error.notify@exmail.com>'
    271
    +# People who get code error notifications.
    272
    +# In the format [('Full Name', 'email@example.com'), ('Full Name', 'anotheremail@example.com')]
    273
    +# Default: [], not send code error notifications.
    274
    +# https://github.com/django/django/blob/5fcfe5361e5b8c9738b1ee4c1e9a6f293a7dda40/django/core/mail/__init__.py#L90
    275
    +# ADMINS = [('Zhang San', 'san.zhang@exmail.com'), ('Li Si', 'si.li@exmail.com')]
    276
    +ADMINS = []
    277
    +# Not-necessarily-technical managers of the site. They get broken link
    278
    +# notifications and other various emails.
    279
    +MANAGERS = ADMINS
    280
    +# Subject-line prefix for email messages send with django.core.mail.mail_admins
    281
    +# or ...mail_managers.  Make sure to include the trailing space.
    282
    +EMAIL_SUBJECT_PREFIX = '[Templet] '
    283
    +
    284
    +# Django-Admin Settings
    285
    +DJANGO_ADMIN_DISABLE_DELETE_SELECTED = False
    286
    +
    287
    +# Django-FILE-UPLOAD Settings
    288
    +DJANGO_FILE_UPLOAD_USE_YM = True
    289
    +DJANGO_FILE_UPLOAD_USE_DT = True
    290
    +
    291
    +# Django-Logit Settings
    292
    +DJANGO_LOGIT_ENABLED = True
    293
    +DJANGO_LOGIT_BODY_FLAG = False
    294
    +DJANGO_LOGIT_RES_FLAG = False
    295
    +
    296
    +# Django-Onerror Settings
    297
    +DJANGO_ONERROR_ACCEPT_REPORT = True
    298
    +DJANGO_ONERROR_ADMIN_SITE_REGISTER = True
    299
    +
    300
    +# Django-Short-URL Settings
    301
    +# Redirect url when short url not exists
    302
    +DJANGO_SHORT_URL_REDIRECT_URL = ''
    303
    +
    304
    +# Django-We Settings
    305
    +DJANGO_WE_QUOTE_OR_NOT = True
    306
    +DJANGO_WE_MODEL_DISPLAY_OR_NOT = True
    307
    +# Enable Cookie or not
    308
    +# DJANGO_WE_BASE_REDIRECT_SET_COOKIE = False
    309
    +# DJANGO_WE_USERINFO_REDIRECT_SET_COOKIE = True
    310
    +# Cookie Config
    311
    +DJANGO_WE_COOKIE_MAX_AGE = COOKIE_MAX_AGE
    312
    +DJANGO_WE_COOKIE_SALT = COOKIE_SALT
    313
    +
    314
    +# 开发调试相关配置
    315
    +if DEBUG:
    316
    +    try:
    317
    +        from .local_settings_dev import *
    318
    +    except ImportError:
    319
    +        pass
    320
    +
    321
    +try:
    322
    +    from .local_settings import *
    323
    +except ImportError:
    324
    +    pass
    325
    +
    326
    +try:
    327
    +    from .django_file_callback_settings import *
    328
    +except ImportError:
    329
    +    pass
    330
    +
    331
    +try:
    332
    +    from .django_we_callback_settings import *
    333
    +except ImportError:
    334
    +    pass
    335
    +
    336
    +# 依赖 local_settings 中的配置
    337
    +# 微信授权设置
    338
    +# WECHAT_OAUTH2_REDIRECT_URI = '{0}/we/oauth2?scope={{0}}&redirect_url={{1}}'.format(DOMAIN)
    339
    +# Shorten URL
    340
    +# ``o`` is short for oauth2
    341
    +# ``r`` is short for redirect_url
    342
    +WECHAT_OAUTH2_REDIRECT_URI = '{0}/we/o?scope={{0}}&r={{1}}'.format(DOMAIN)
    343
    +WECHAT_OAUTH2_USERINFO_REDIRECT_URI = '{0}/we/o?r={{0}}'.format(DOMAIN)  # Scope default snsapi_userinfo
    344
    +WECHAT_BASE_REDIRECT_URI = '{0}/we/base_redirect'.format(DOMAIN)
    345
    +WECHAT_USERINFO_REDIRECT_URI = '{0}/we/userinfo_redirect'.format(DOMAIN)
    346
    +WECHAT_DIRECT_BASE_REDIRECT_URI = '{0}/we/direct_base_redirect'.format(DOMAIN)
    347
    +WECHAT_DIRECT_USERINFO_REDIRECT_URI = '{0}/we/direct_userinfo_redirect'.format(DOMAIN)
    348
    +
    349
    +# Redis 连接
    350
    +WECHAT_REDIS_OBJ = REDIS_CACHE = connector(REDIS.get('default', {}))
    351
    +
    352
    +# LOGGER 设置
    353
    +# python manage.py rlistlog --key=django:logit:tiwen --filename=/tmp/tiwen.logit.log
    354
    +LOGGING = {
    355
    +    'version': 1,
    356
    +    'disable_existing_loggers': False,
    357
    +    'formatters': {
    358
    +        'verbose': {
    359
    +            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
    360
    +        },
    361
    +        'simple': {
    362
    +            'format': '%(levelname)s %(message)s'
    363
    +        },
    364
    +    },
    365
    +    'handlers': {
    366
    +        'logit': {
    367
    +            'level': 'DEBUG',
    368
    +            'class': 'rlog.RedisListHandler',
    369
    +            'redis_client': REDIS_CACHE,
    370
    +            'key': 'django:logit:tiwen',
    371
    +            'formatter': 'verbose',
    372
    +        },
    373
    +        'console': {
    374
    +            'level': 'DEBUG',
    375
    +            'class': 'logging.StreamHandler',
    376
    +            'formatter': 'verbose'
    377
    +        },
    378
    +    },
    379
    +    'loggers': {
    380
    +        'logit': {
    381
    +            'handlers': ['logit'],
    382
    +            'level': 'DEBUG',
    383
    +            'propagate': True,
    384
    +        },
    385
    +        'console': {
    386
    +            'handlers': ['console'],
    387
    +            'level': 'DEBUG',
    388
    +            'propagate': True,
    389
    +        },
    390
    +    },
    391
    +}
    392
    +
    393
    +# MAX_BIGINT
    394
    +# Why Not ``sys.maxint``
    395
    +# n bit platform sys.maxint = 2 ** (n - 1) - 1
    396
    +# 64 bit 9223372036854775807, 32 bit 2147483647
    397
    +from django.db.models import BigIntegerField  # isort:skip
    398
    +MAX_BIGINT = BigIntegerField.MAX_BIGINT
    399
    +
    400
    +# DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
    401
    +DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'

    + 68 - 0
    tiwen/static/tiwen/css/common.css

    @@ -0,0 +1,68 @@
    1
    +.text-center {
    2
    +    text-align: center;
    3
    +}
    4
    +
    5
    +/*
    6
    +  文本溢出省略,元素需要设置定宽度
    7
    +  */
    8
    +/* 单行 */
    9
    +.text_ellipsis {
    10
    +    overflow: hidden;
    11
    +    white-space: nowrap;
    12
    +    text-overflow: ellipsis;
    13
    +}
    14
    +/* 多行 */
    15
    +.a {
    16
    +    overflow: hidden;
    17
    +    text-overflow: ellipsis;
    18
    +    display: -webkit-box;
    19
    +    -webkit-line-clamp: 2;
    20
    +    -webkit-box-orient: vertical;
    21
    +}
    22
    +
    23
    +/*
    24
    +  浮动 & 清除浮动
    25
    + */
    26
    +.fl {
    27
    +    float: left;
    28
    +}
    29
    +
    30
    +.fr {
    31
    +    float: right;
    32
    +}
    33
    +
    34
    +.clearfix {
    35
    +    zoom: 1;
    36
    +}
    37
    +
    38
    +.clearfix:after {
    39
    +    content: "\200B";
    40
    +    display: block;
    41
    +    height: 0;
    42
    +    clear: both;
    43
    +}
    44
    +
    45
    +.clearfix:after {content:"."; display:block; height:0; visibility:hidden; clear:both; }
    46
    +.clearfix { *zoom:1; }
    47
    +
    48
    +/*
    49
    +  解决安卓微信点击图片预览问题
    50
    +  这个会让 img 标签的点击事件失效,如果想要点击图片就要给上面再写一层
    51
    +  需要长按识别二维码的时候,则再单独给该图片添加
    52
    +  ```css
    53
    +  pointer-events: auto;
    54
    +  ```
    55
    +  来恢复对应的点击事件
    56
    +  */
    57
    +img {
    58
    +    pointer-events: none;
    59
    +}
    60
    +
    61
    +.clickable {
    62
    +    pointer-events: auto;
    63
    +}
    64
    +
    65
    +/* Input 自动填充后,移除 Chrome 默认黄色 */
    66
    +input:-webkit-autofill {
    67
    +    box-shadow: 0 0 0 1000px white inset !important;
    68
    +}

    + 574 - 0
    tiwen/static/tiwen/js/jswe.js

    @@ -0,0 +1,574 @@
    1
    +!(function(e, t) {
    2
    +    var config = {
    3
    +        wxconfig: 'http://api.tt4it.com/wx/jsapi_signature',
    4
    +        callback: 'callback'
    5
    +    }, wxData = {
    6
    +        debug: false,
    7
    +        imgUrl: '',
    8
    +        link: '',
    9
    +        desc: '',
    10
    +        title: '',
    11
    +        timeLine: ''
    12
    +    }, wxConfig = {
    13
    +        hide: false,
    14
    +        baseFlag: false,
    15
    +        baseHide: false,
    16
    +        close: false,
    17
    +        hideMenuItems: [],
    18
    +        showMenuItems: []
    19
    +    }, jsApiList = [
    20
    +        'checkJsApi',
    21
    +        'onMenuShareTimeline',
    22
    +        'onMenuShareAppMessage',
    23
    +        'onMenuShareQQ',
    24
    +        'onMenuShareWeibo',
    25
    +        'onMenuShareQZone',
    26
    +        'hideMenuItems',
    27
    +        'showMenuItems',
    28
    +        'hideAllNonBaseMenuItem',
    29
    +        'showAllNonBaseMenuItem',
    30
    +        'translateVoice',
    31
    +        'startRecord',
    32
    +        'stopRecord',
    33
    +        'onRecordEnd',
    34
    +        'playVoice',
    35
    +        'pauseVoice',
    36
    +        'stopVoice',
    37
    +        'uploadVoice',
    38
    +        'downloadVoice',
    39
    +        'chooseImage',
    40
    +        'previewImage',
    41
    +        'uploadImage',
    42
    +        'downloadImage',
    43
    +        'getLocalImgData',
    44
    +        'getNetworkType',
    45
    +        'openLocation',
    46
    +        'getLocation',
    47
    +        'hideOptionMenu',
    48
    +        'showOptionMenu',
    49
    +        'closeWindow',
    50
    +        'scanQRCode',
    51
    +        'chooseWXPay',
    52
    +        'openEnterpriseRedPacket',
    53
    +        'openProductSpecificView',
    54
    +        'addCard',
    55
    +        'chooseCard',
    56
    +        'openCard'
    57
    +    ], wxApiFun
    58
    +
    59
    +    function isEmpty(obj) {
    60
    +        if (obj == null) return true
    61
    +        if (obj.length > 0) return false
    62
    +        if (obj.length === 0) return true
    63
    +        for (var key in obj) {
    64
    +            if (Object.prototype.hasOwnProperty.call(obj, key)) return false
    65
    +        }
    66
    +        return true
    67
    +    }
    68
    +
    69
    +    function isNotEmpty(obj) {
    70
    +        return !isEmpty(obj)
    71
    +    }
    72
    +
    73
    +    function isOpenOnPC() {  // 判断当前网页是否在 PC 浏览器中打开
    74
    +        var ua = navigator.userAgent
    75
    +        return /windows nt/i.test(ua) || /macintosh/i.test(ua) || /linux x86_64/i.test(ua)
    76
    +    }
    77
    +
    78
    +    function isOpenInWeixin() {  // 判断当前网页是否在微信内置浏览器中打开
    79
    +        return /micromessenger/i.test(navigator.userAgent)
    80
    +    }
    81
    +
    82
    +    function getWeixinVersion() {
    83
    +        var ua = navigator.userAgent,
    84
    +            mt = ua.match(/micromessenger\/([\d.]+)/i)
    85
    +        return (mt ? mt[1] : '')
    86
    +    }
    87
    +
    88
    +    // This function checks whether Wechat is the appointed version or not
    89
    +    // Cmp: http://jsperf.com/regexp-test-vs-indexof-ignore-upper-and-lower
    90
    +    function isWeixinVersion(version) {
    91
    +        // return new RegExp('micromessenger/' + version , 'i').test(navigator.userAgent)
    92
    +        return navigator.userAgent.toLowerCase().indexOf('micromessenger/' + version) != -1
    93
    +    }
    94
    +
    95
    +    function hideOptionMenu() {
    96
    +        wxConfig.hide = true
    97
    +        fixedWxData()
    98
    +    }
    99
    +
    100
    +    function showOptionMenu() {
    101
    +        wxConfig.hide = false
    102
    +        fixedWxData()
    103
    +    }
    104
    +
    105
    +    function hideMenuItems(items) {
    106
    +        wxConfig.hideMenuItems = items
    107
    +        fixedWxData()
    108
    +    }
    109
    +
    110
    +    function showMenuItems(items) {
    111
    +        wxConfig.showMenuItems = items
    112
    +        fixedWxData()
    113
    +    }
    114
    +
    115
    +    function hideAllNonBaseMenuItem() {
    116
    +        wxConfig.baseFlag = true
    117
    +        wxConfig.baseHide = true
    118
    +        fixedWxData()
    119
    +    }
    120
    +
    121
    +    function showAllNonBaseMenuItem() {
    122
    +        wxConfig.baseFlag = true
    123
    +        wxConfig.baseHide = false
    124
    +        fixedWxData()
    125
    +    }
    126
    +
    127
    +    function closeWindow() {
    128
    +        wxConfig.close = true
    129
    +        fixedWxData()
    130
    +    }
    131
    +
    132
    +    function wxReady(data) {
    133
    +        data = typeof data === 'object' ? data : JSON.parse(data)
    134
    +        wx.config({
    135
    +            debug: wxData.debug,
    136
    +            appId: data.appId,
    137
    +            timestamp: data.timestamp,
    138
    +            nonceStr: data.nonceStr,
    139
    +            signature: data.signature,
    140
    +            jsApiList: jsApiList
    141
    +        })
    142
    +
    143
    +        var callbacks = {
    144
    +            trigger: function (res) {
    145
    +                // alert('用户点击发送给朋友')
    146
    +                if (JSWE.wxTrigger) {JSWE.wxTrigger(res)}
    147
    +            },
    148
    +            success: function (res) {
    149
    +                // alert('已分享')
    150
    +                if (JSWE.wxSuccess) {JSWE.wxSuccess(res)}
    151
    +            },
    152
    +            cancel: function (res) {
    153
    +                // alert('已取消')
    154
    +                if (JSWE.wxCancel) {JSWE.wxCancel(res)}
    155
    +            },
    156
    +            fail: function (res) {
    157
    +                // alert(JSON.stringify(res))
    158
    +                if (JSWE.wxFail) {JSWE.wxFail(res)}
    159
    +            }
    160
    +        }, shareInfo = function(flag) {
    161
    +            var _share = {
    162
    +                title: flag ? wxData.title : (wxData.timeLine || wxData.desc),
    163
    +                link: wxData.link,
    164
    +                imgUrl: wxData.imgUrl,
    165
    +                trigger: callbacks.trigger,
    166
    +                success: callbacks.success,
    167
    +                cancel: callbacks.cancel,
    168
    +                fail: callbacks.fail
    169
    +            }
    170
    +            if (flag) _share.desc = wxData.desc
    171
    +            return _share
    172
    +        }, wxShareApi = function() {
    173
    +            // 2. 分享接口
    174
    +            // 2.1 监听“分享给朋友”,按钮点击、自定义分享内容及分享结果接口
    175
    +            wx.onMenuShareAppMessage(shareInfo(1))
    176
    +            // 2.2 监听“分享到朋友圈”按钮点击、自定义分享内容及分享结果接口
    177
    +            wx.onMenuShareTimeline(shareInfo(0))
    178
    +            // 2.3 监听“分享到QQ”按钮点击、自定义分享内容及分享结果接口
    179
    +            wx.onMenuShareQQ(shareInfo(1))
    180
    +            // 2.4 监听“分享到微博”按钮点击、自定义分享内容及分享结果接口
    181
    +            wx.onMenuShareWeibo(shareInfo(1))
    182
    +            // 2.5 监听“分享到QQ空间”按钮点击、自定义分享内容及分享结果接口
    183
    +            wx.onMenuShareQZone(shareInfo(1))
    184
    +        }, wxMenuApi = function () {
    185
    +            // 8. 界面操作接口
    186
    +            // 8.1 隐藏右上角菜单
    187
    +            // 8.2 显示右上角菜单
    188
    +            if (wxConfig.hide) {wx.hideOptionMenu()} else {wx.showOptionMenu()}
    189
    +            // 8.3 批量隐藏菜单项
    190
    +            if (isNotEmpty(wxConfig.hideMenuItems)) {
    191
    +                wx.hideMenuItems({
    192
    +                    menuList: wxConfig.hideMenuItems,
    193
    +                    success: function (res) {
    194
    +                        if (JSWE.wxHideMenuItemsSuccess) {JSWE.wxHideMenuItemsSuccess(res)}
    195
    +                    },
    196
    +                    fail: function (res) {
    197
    +                        if (JSWE.wxHideMenuItemsFail) {JSWE.wxHideMenuItemsFail(res)}
    198
    +                    }
    199
    +                })
    200
    +            }
    201
    +            // 8.4 批量显示菜单项
    202
    +            if (isNotEmpty(wxConfig.showMenuItems)) {
    203
    +                wx.showMenuItems({
    204
    +                    menuList: wxConfig.showMenuItems,
    205
    +                    success: function (res) {
    206
    +                        if (JSWE.wxShowMenuItemsSuccess) {JSWE.wxShowMenuItemsSuccess(res)}
    207
    +                    },
    208
    +                    fail: function (res) {
    209
    +                        if (JSWE.wxShowMenuItemsFail) {JSWE.wxShowMenuItemsFail(res)}
    210
    +                    }
    211
    +                })
    212
    +            }
    213
    +            // 8.5 隐藏所有非基本菜单项
    214
    +            // 8.6 显示所有被隐藏的非基本菜单项
    215
    +            if (wxConfig.baseFlag) {
    216
    +                if (wxConfig.baseHide) {wx.hideAllNonBaseMenuItem()} else {wx.showAllNonBaseMenuItem()}
    217
    +            }
    218
    +            // 8.7 关闭当前窗口
    219
    +            if (wxConfig.close) {wx.closeWindow()}
    220
    +        }, wxVoiceApi = function() {
    221
    +            // 4.3 监听录音自动停止
    222
    +            wx.onVoiceRecordEnd({
    223
    +                complete: function (res) {
    224
    +                    voice.localId = res.localId
    225
    +                    if (JSWE.wxVoiceRecordEnd) {JSWE.wxVoiceRecordEnd(res)}
    226
    +                }
    227
    +            })
    228
    +            // 4.7 监听录音播放停止
    229
    +            wx.onVoicePlayEnd({
    230
    +                complete: function (res) {
    231
    +                    if (JSWE.wxVoicePlayEnd) {JSWE.wxVoicePlayEnd(res)}
    232
    +                }
    233
    +            })
    234
    +        }, wxApi = function () {
    235
    +            wxShareApi()
    236
    +            wxMenuApi()
    237
    +            wxVoiceApi()
    238
    +        }
    239
    +
    240
    +        wx.ready(wxApi)
    241
    +
    242
    +        return wxApiFun = wxApi
    243
    +    }
    244
    +
    245
    +    if (isOpenInWeixin() || isOpenOnPC()) {
    246
    +        if ('undefined' !== typeof JSWE_CONF_UPDATE) JSWE_CONF_UPDATE(config)
    247
    +        $.ajax({
    248
    +            url: config.wxconfig,
    249
    +            type: 'get',
    250
    +            dataType: 'jsonp',
    251
    +            jsonpCallback: config.callback,
    252
    +            data: {
    253
    +                url: window.location.href.split('#')[0]
    254
    +            },
    255
    +            success: wxReady
    256
    +        })
    257
    +    }
    258
    +
    259
    +    function initWxData(data, flag) {
    260
    +        for(var d in data) {if (d in wxData) wxData[d] = data[d]}
    261
    +        if (flag) fixedWxData()
    262
    +    }
    263
    +
    264
    +    function changeWxData(key, value, flag) {
    265
    +        if (key in falDwxDataata) {wxData[key] = value}
    266
    +        if (flag) fixedWxData()
    267
    +    }
    268
    +
    269
    +    function fixedWxData() {
    270
    +        if ('undefined' !== typeof wxApiFun) wxApiFun()
    271
    +    }
    272
    +
    273
    +    // 3 智能接口
    274
    +    var voice = {
    275
    +        localId: '',
    276
    +        serverId: ''
    277
    +    }
    278
    +    // 3.1 识别音频并返回识别结果
    279
    +    function translateVoice() {
    280
    +        if (voice.localId == '') {
    281
    +            if (JSWE.wxTranslateVoiceEmpty) {JSWE.wxTranslateVoiceEmpty()}
    282
    +            return
    283
    +        }
    284
    +        wx.translateVoice({
    285
    +            localId: voice.localId,
    286
    +            complete: function (res) {
    287
    +                if (JSWE.wxTranslateVoiceComplete) {JSWE.wxTranslateVoiceComplete(res)}
    288
    +            }
    289
    +        })
    290
    +    }
    291
    +
    292
    +    // 4 音频接口
    293
    +    // 4.1 开始录音
    294
    +    function startRecord() {
    295
    +        wx.startRecord({
    296
    +            cancel: function () {
    297
    +                if (JSWE.wxStartRecordCancel) {JSWE.wxStartRecordCancel(res)}
    298
    +            }
    299
    +        })
    300
    +    }
    301
    +
    302
    +    // 4.2 停止录音
    303
    +    function stopRecord() {
    304
    +        wx.stopRecord({
    305
    +          success: function (res) {
    306
    +              voice.localId = res.localId
    307
    +              if (JSWE.wxStopRecordSuccess) {JSWE.wxStopRecordSuccess(res)}
    308
    +          },
    309
    +          fail: function (res) {
    310
    +              if (JSWE.wxStopRecordFail) {JSWE.wxStopRecordFail(res)}
    311
    +          }
    312
    +        })
    313
    +    }
    314
    +
    315
    +    // 4.4 播放音频
    316
    +    function playVoice() {
    317
    +        if (voice.localId == '') {
    318
    +            if (JSWE.wxPlayVoiceEmpty) {JSWE.wxPlayVoiceEmpty()}
    319
    +            return
    320
    +        }
    321
    +        wx.playVoice({
    322
    +            localId: voice.localId
    323
    +        })
    324
    +    }
    325
    +
    326
    +    // 4.5 暂停播放音频
    327
    +    function pauseVoice() {
    328
    +        if (voice.localId == '') {
    329
    +            if (JSWE.wxPauseVoiceEmpty) {JSWE.wxPauseVoiceEmpty()}
    330
    +            return
    331
    +        }
    332
    +        wx.pauseVoice({
    333
    +            localId: voice.localId
    334
    +        })
    335
    +    }
    336
    +
    337
    +    // 4.6 停止播放音频
    338
    +    function stopVoice() {
    339
    +        if (voice.localId == '') {
    340
    +            if (JSWE.wxStopVoiceEmpty) {JSWE.wxStopVoiceEmpty()}
    341
    +            return
    342
    +        }
    343
    +        wx.stopVoice({
    344
    +            localId: voice.localId
    345
    +        })
    346
    +    }
    347
    +
    348
    +    // 4.8 上传语音
    349
    +    function uploadVoice() {
    350
    +        var localId = voice.localId
    351
    +        if (localId == '') {
    352
    +            if (JSWE.wxUploadVoiceEmpty) {JSWE.wxUploadVoiceEmpty()}
    353
    +            return
    354
    +        }
    355
    +        wx.uploadVoice({
    356
    +            localId: localId,
    357
    +            success: function (res) {
    358
    +                voice.serverId = res.serverId
    359
    +                if (JSWE.wxUploadVoiceSuccess) {JSWE.wxUploadVoiceSuccess(res, localId)}
    360
    +            }
    361
    +        })
    362
    +    }
    363
    +
    364
    +    // 4.9 下载语音
    365
    +    function downloadVoice() {
    366
    +        var serverId = voice.serverId
    367
    +        if (serverId == '') {
    368
    +            if (JSWE.wxDownloadVoiceEmpty) {JSWE.wxDownloadVoiceEmpty()}
    369
    +            return
    370
    +        }
    371
    +        wx.downloadVoice({
    372
    +            serverId: serverId,
    373
    +            success: function (res) {
    374
    +                voice.localId = res.localId
    375
    +                if (JSWE.wxDownloadVoiceSuccess) {JSWE.wxDownloadVoiceSuccess(res, serverId)}
    376
    +            }
    377
    +        })
    378
    +    }
    379
    +
    380
    +    // 5 图片接口
    381
    +    var images = {
    382
    +        localIds: [],
    383
    +        serverIds: []
    384
    +    }
    385
    +    // 5.1 拍照、本地选图
    386
    +    function chooseImage(choose_params) {
    387
    +        if ('undefined' === typeof choose_params) choose_params = {}
    388
    +        wx.chooseImage({
    389
    +            count: choose_params.count || 9, // 默认9
    390
    +            sizeType: choose_params.sizeType || ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
    391
    +            sourceType: choose_params.sourceType || ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
    392
    +            success: function (res) {
    393
    +                images.localIds = res.localIds // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
    394
    +                // 判断是否直接上传
    395
    +                if (choose_params.directUpload) {setTimeout(uploadImages({localIds: images.localIds, isShowProgressTips: choose_params.isShowProgressTips || 1}), 100)}
    396
    +                // 拍照、本地选图成功后的回调函数
    397
    +                if (JSWE.wxChooseImageSuccess) {JSWE.wxChooseImageSuccess(res, choose_params.extras || {})}
    398
    +            }
    399
    +        })
    400
    +    }
    401
    +
    402
    +    // 5.2 图片预览
    403
    +    function previewImage(preview_params) {
    404
    +        wx.previewImage({
    405
    +            current: preview_params.current, // 当前显示图片的链接,不填则默认为 urls 的第一张
    406
    +            urls: preview_params.urls // 需要预览的图片链接列表
    407
    +        })
    408
    +    }
    409
    +
    410
    +    // 5.3 上传图片
    411
    +    function uploadImage(upload_params) {
    412
    +        // 上传图片为异步处理,重复上传同一图片,返回的serverId也是不同的
    413
    +        var localId = upload_params.localId
    414
    +        wx.uploadImage({
    415
    +            localId: localId, // 需要上传的图片的本地ID,由chooseImage接口获得
    416
    +            isShowProgressTips: upload_params.isShowProgressTips || 1, // 默认为1,显示进度提示
    417
    +            success: function (res) {
    418
    +                images.serverIds.push(res.serverId) // 返回图片的服务器端ID
    419
    +                // 上传图片成功后的回调函数
    420
    +                if (JSWE.wxUploadImageSuccess) {JSWE.wxUploadImageSuccess(res, localId)}
    421
    +            }
    422
    +        })
    423
    +    }
    424
    +
    425
    +    function uploadImages(upload_params) {
    426
    +        var localIds = upload_params.localIds, isShowProgressTips = upload_params.isShowProgressTips || 1
    427
    +        images.serverIds = []
    428
    +        for (var idx in localIds) {uploadImage({localId: localIds[idx], isShowProgressTips: isShowProgressTips})}
    429
    +    }
    430
    +
    431
    +    // 5.4 下载图片
    432
    +    function downloadImage(download_params) {
    433
    +        var serverId = download_params.serverId
    434
    +        wx.downloadImage({
    435
    +            serverId: serverId, // 需要下载的图片的服务器端ID,由uploadImage接口获得
    436
    +            isShowProgressTips: download_params.isShowProgressTips || 1, // 默认为1,显示进度提示
    437
    +            success: function (res) {
    438
    +                images.localId.push(res.localId)
    439
    +                if (JSWE.wxDownloadImageSuccess) {JSWE.wxDownloadImageSuccess(res, serverId)}
    440
    +            }
    441
    +        })
    442
    +    }
    443
    +
    444
    +    function downloadImages(download_params) {
    445
    +        var serverIds = download_params.serverIds, isShowProgressTips = download_params.isShowProgressTips || 1
    446
    +        images.localIds = []
    447
    +        for (var idx in serverIds) {downloadImage({serverId: serverIds[idx], isShowProgressTips: isShowProgressTips})}
    448
    +    }
    449
    +
    450
    +    function getLocalImgData(localId) {
    451
    +        wx.getLocalImgData({
    452
    +            localId: localId, // 图片的localID
    453
    +            success: function (res) {
    454
    +                // var localData = res.localData; // localData是图片的base64数据,可以用img标签显示
    455
    +                if (JSWE.wxGetLocalImgDataSuccess) {JSWE.wxGetLocalImgDataSuccess(res)}
    456
    +            }
    457
    +        })
    458
    +    }
    459
    +
    460
    +    // 9 微信原生接口
    461
    +    // 9.1.1 扫描二维码并返回结果
    462
    +    // 9.1.2 扫描二维码并返回结果
    463
    +    function scanQRCode(scan_params) {
    464
    +        if ('undefined' === typeof scan_params) scan_params = {}
    465
    +        wx.scanQRCode({
    466
    +            needResult: scan_params.needResult || 0,  // 默认为0,0扫描结果由微信处理,1直接返回扫描结果
    467
    +            scanType: scan_params.scanType || ['qrCode', 'barCode'],  // 可以指定扫二维码还是一维码,默认二者都有
    468
    +            success: function (res) {  // 当 needResult 为 1 时,扫码返回的结果
    469
    +                if (JSWE.wxScanQRCodeSuccess) {JSWE.wxScanQRCodeSuccess(res)}
    470
    +            }
    471
    +        })
    472
    +    }
    473
    +
    474
    +    // QRCode & BarCode is different
    475
    +    function parseScanQRCodeResultStr(resultStr) {
    476
    +        var strs = resultStr.split(',')
    477
    +        return strs[strs.length - 1]
    478
    +    }
    479
    +
    480
    +    // 10 微信支付接口
    481
    +    // 10.1 发起一个支付请求
    482
    +    function chooseWXPay(wxpay_params) {
    483
    +        wx.chooseWXPay({
    484
    +            timestamp: wxpay_params.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
    485
    +            nonceStr: wxpay_params.nonceStr, // 支付签名随机串,不长于 32 位
    486
    +            package: wxpay_params.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
    487
    +            signType: wxpay_params.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
    488
    +            paySign: wxpay_params.paySign, // 支付签名
    489
    +            success: function (res) {
    490
    +                // 支付成功后的回调函数
    491
    +                if (JSWE.wxPaySuccess) {JSWE.wxPaySuccess(res)}
    492
    +            }
    493
    +        })
    494
    +    }
    495
    +
    496
    +    // xx 微信原生企业红包接口
    497
    +    // xx.1 发起一个发送原生企业红包请求
    498
    +    function openEnterpriseRedPacket(wxredpack_params) {
    499
    +        wx.openEnterpriseRedPacket({
    500
    +            timeStamp: wxredpack_params.timeStamp, // 红包签名时间戳,注意原生企业红包接口timeStamp字段名需大写其中的S字符,而支付接口timeStamp字段名无需大写其中的S字符。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
    501
    +            nonceStr: wxredpack_params.nonceStr, // 红包签名随机串,不长于 32 位
    502
    +            package: encodeURIComponent(wxredpack_params.package), // 发放红包接口返回的prepay_id参数值,提交格式如:prepay_id=***)
    503
    +            signType: wxredpack_params.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
    504
    +            paySign: wxredpack_params.paySign, // 红包签名
    505
    +            success: function (res) {
    506
    +                // 发送原生企业红包成功后的回调函数
    507
    +                if (JSWE.wxEnterpriseRedPacketSuccess) {JSWE.wxEnterpriseRedPacketSuccess(res)}
    508
    +            }
    509
    +        })
    510
    +    }
    511
    +
    512
    +    var v = {
    513
    +        version: '1.0.5',
    514
    +
    515
    +        // Basic Vars
    516
    +        config: config,
    517
    +        wxData: wxData,
    518
    +        jsApiList: jsApiList,
    519
    +
    520
    +        isEmpty: isEmpty,
    521
    +        isNotEmpty: isNotEmpty,
    522
    +
    523
    +        // Weixin Function
    524
    +        isOpenInWeixin: isOpenInWeixin,
    525
    +        getWeixinVersion: getWeixinVersion,
    526
    +        isWeixinVersion: isWeixinVersion,
    527
    +
    528
    +        // Menu Function
    529
    +        hideOptionMenu: hideOptionMenu,
    530
    +        showOptionMenu: showOptionMenu,
    531
    +        hideMenuItems: hideMenuItems,
    532
    +        showMenuItems: showMenuItems,
    533
    +        hideAllNonBaseMenuItem: hideAllNonBaseMenuItem,
    534
    +        showAllNonBaseMenuItem: showAllNonBaseMenuItem,
    535
    +        closeWindow: closeWindow,
    536
    +
    537
    +        // Share Function
    538
    +        initWxData: initWxData,
    539
    +        changeWxData: changeWxData,
    540
    +        fixedWxData: fixedWxData,
    541
    +
    542
    +        // Voice Function
    543
    +        voice: voice,
    544
    +        translateVoice: translateVoice,
    545
    +        startRecord: startRecord,
    546
    +        stopRecord: stopRecord,
    547
    +        playVoice: playVoice,
    548
    +        pauseVoice: pauseVoice,
    549
    +        stopVoice: stopVoice,
    550
    +        uploadVoice: uploadVoice,
    551
    +        downloadVoice: downloadVoice,
    552
    +
    553
    +        // Image Function
    554
    +        images: images,
    555
    +        chooseImage: chooseImage,
    556
    +        previewImage: previewImage,
    557
    +        uploadImage: uploadImage,
    558
    +        uploadImages: uploadImages,
    559
    +        downloadImage: downloadImage,
    560
    +        downloadImages: downloadImages,
    561
    +        getLocalImgData: getLocalImgData,
    562
    +
    563
    +        // Scan Function
    564
    +        scanQRCode: scanQRCode,
    565
    +        parseScanQRCodeResultStr: parseScanQRCodeResultStr,
    566
    +
    567
    +        // Pay Function
    568
    +        chooseWXPay: chooseWXPay,
    569
    +
    570
    +        // EnterpriseRedPacket Function
    571
    +        openEnterpriseRedPacket: openEnterpriseRedPacket
    572
    +    }
    573
    +    e.JSWE = e.V = v
    574
    +})(window)

    + 56 - 0
    tiwen/urls.py

    @@ -0,0 +1,56 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +"""tiwen URL Configuration
    4
    +
    5
    +The `urlpatterns` list routes URLs to views. For more information please see:
    6
    +    https://docs.djangoproject.com/en/1.11/topics/http/urls/
    7
    +Examples:
    8
    +Function views
    9
    +    1. Add an import:  from my_app import views
    10
    +    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
    11
    +Class-based views
    12
    +    1. Add an import:  from other_app.views import Home
    13
    +    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
    14
    +Including another URLconf
    15
    +    1. Import the include() function: from django.conf.urls import url, include
    16
    +    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
    17
    +"""
    18
    +from django.conf import settings
    19
    +from django.conf.urls.static import static
    20
    +from django.contrib import admin
    21
    +from django.urls import include, re_path
    22
    +
    23
    +
    24
    +urlpatterns = [
    25
    +    re_path(r'^admin/', admin.site.urls),
    26
    +]
    27
    +
    28
    +urlpatterns += [
    29
    +    re_path(r'^api/', include(('api.urls', 'api'), namespace='api')),
    30
    +    re_path(r'^uniapi/', include(('django_uniapi.urls', 'uniapi'), namespace='uniapi')),
    31
    +]
    32
    +
    33
    +urlpatterns += [
    34
    +    # url(r'^s/', include(('django_short_url.urls', 'django_short_url'), namespace='django_short_url')),
    35
    +]
    36
    +
    37
    +urlpatterns += [
    38
    +    re_path(r'^w/', include(('django_we.urls', 'shortwechat'), namespace='shortwechat')),
    39
    +    re_path(r'^we/', include(('django_we.urls', 'wechat'), namespace='wechat')),
    40
    +]
    41
    +
    42
    +urlpatterns += [
    43
    +    # re_path(r'^p/', include(('page.urls', 'shortpage'), namespace='shortpage')),
    44
    +    # re_path(r'^page/', include(('page.urls', 'page'), namespace='page')),
    45
    +]
    46
    +
    47
    +if settings.DEBUG:
    48
    +    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    49
    +    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    50
    +
    51
    +# AdminSite
    52
    +admin.site.site_header = 'Django administration'
    53
    +admin.site.site_title = 'Django site admin'
    54
    +# Make site_url/index_title None to hidden
    55
    +admin.site.site_url = '/'
    56
    +admin.site.index_title = 'Site administration'

    + 17 - 0
    tiwen/wsgi.py

    @@ -0,0 +1,17 @@
    1
    +"""
    2
    +WSGI config for tiwen project.
    3
    +
    4
    +It exposes the WSGI callable as a module-level variable named ``application``.
    5
    +
    6
    +For more information on this file, see
    7
    +https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/
    8
    +"""
    9
    +
    10
    +import os
    11
    +
    12
    +from django.core.wsgi import get_wsgi_application
    13
    +
    14
    +
    15
    +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tiwen.settings")
    16
    +
    17
    +application = get_wsgi_application()

    + 0 - 0
    utils/__init__.py


    + 0 - 0
    utils/error/__init__.py


    + 77 - 0
    utils/error/errno_utils.py

    @@ -0,0 +1,77 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +from StatusCode import BaseStatusCode, StatusCodeField
    4
    +
    5
    +
    6
    +class ParamStatusCode(BaseStatusCode):
    7
    +    """ 4000xx 参数相关错误码 """
    8
    +    PARAM_NOT_FOUND = StatusCodeField(400000, 'Param Not Found', description='参数不存在')
    9
    +
    10
    +
    11
    +class ProfileStatusCode(BaseStatusCode):
    12
    +    """ 4001xx 用户相关错误码 """
    13
    +    PROFILE_NOT_FOUND = StatusCodeField(400101, 'Profile Not Found', description='用户不存在')
    14
    +
    15
    +
    16
    +class PhoneStatusCode(BaseStatusCode):
    17
    +    """ 4002xx 手机相关错误码 """
    18
    +    INVALID_PHONE = StatusCodeField(400200, 'Invalid Phone', description='非法手机号')
    19
    +    PHONE_NOT_FOUND = StatusCodeField(400201, 'Phone Not Found', description='手机号不存在')
    20
    +    PHONE_ALREADY_EXISTS = StatusCodeField(400202, 'Phone Already Exists', description='手机号已存在')
    21
    +
    22
    +
    23
    +class OrderStatusCode(BaseStatusCode):
    24
    +    """ 4040xx 订单/支付相关错误码 """
    25
    +    UNIFIED_ORDER_FAIL = StatusCodeField(404000, 'Unified Order Fail', description='统一下单失败')
    26
    +    ORDER_NOT_FOUND = StatusCodeField(404001, 'Order Not Found', description='订单不存在')
    27
    +    # 订单支付状态
    28
    +    ORDER_NOT_PAY = StatusCodeField(404011, 'Order Not Pay', description='订单未支付')
    29
    +    ORDER_PAYING = StatusCodeField(404012, 'Order Paying', description='订单支付中')
    30
    +    ORDER_PAY_FAIL = StatusCodeField(404013, 'Order Pay Fail', description='微信支付失败')
    31
    +    # 通知校验状态
    32
    +    SIGN_CHECK_FAIL = StatusCodeField(404090, 'Sign Check Fail', description='签名校验失败')
    33
    +    FEE_CHECK_FAIL = StatusCodeField(404091, 'FEE Check Fail', description='金额校验失败')
    34
    +
    35
    +
    36
    +class PayStatusCode(BaseStatusCode):
    37
    +    """ 4041xx 支付相关错误码 """
    38
    +
    39
    +
    40
    +class WithdrawStatusCode(BaseStatusCode):
    41
    +    """ 4042xx 提现相关错误码 """
    42
    +    BALANCE_INSUFFICIENT = StatusCodeField(404200, 'Balance Insufficient', description='提现金额不足')
    43
    +
    44
    +
    45
    +class TokenStatusCode(BaseStatusCode):
    46
    +    """ 4090xx 票据相关错误码 """
    47
    +    TOKEN_NOT_FOUND = StatusCodeField(409001, 'Token Not Found', description='票据不存在')
    48
    +
    49
    +
    50
    +class SignatureStatusCode(BaseStatusCode):
    51
    +    """ 4091xx 签名校验错误 """
    52
    +    SIGNATURE_ERROR = StatusCodeField(409101, 'Signature Error', description='签名错误')
    53
    +
    54
    +
    55
    +class GVCodeStatusCode(BaseStatusCode):
    56
    +    """ 4092xx 图形验证码相关错误码 """
    57
    +    GRAPHIC_VCODE_ERROR = StatusCodeField(409201, 'Graphic VCode Error', description='图形验证码错误')
    58
    +
    59
    +
    60
    +class SVCodeStatusCode(BaseStatusCode):
    61
    +    """ 4093xx 短信验证码相关错误码 """
    62
    +    SMS_QUOTA_LIMIT = StatusCodeField(409300, 'SMS Quota Limit', description='短信次数超限')
    63
    +    SMS_VCODE_ERROR = StatusCodeField(409301, 'SMS VCode Error', description='验证码错误,请稍后重试')
    64
    +    SMS_VCODE_HAS_SEND = StatusCodeField(409302, 'SMS VCode Has Send', description='验证码已发送,请勿重复获取')
    65
    +
    66
    +
    67
    +class InsufficientStatusCode(BaseStatusCode):
    68
    +    """ 4095xx 不足相关错误码 """
    69
    +    BALANCE_INSUFFICIENT = StatusCodeField(409501, 'Balance Insufficient', description='余额不足')
    70
    +    INTEGRAL_INSUFFICIENT = StatusCodeField(409502, 'Integral Insufficient', description='积分不足')
    71
    +
    72
    +
    73
    +class PermissionStatusCode(BaseStatusCode):
    74
    +    """ 4099xx 权限相关错误码 """
    75
    +    PERMISSION_DENIED = StatusCodeField(409900, 'Permission Denied', description='权限不足')
    76
    +    UPLOAD_PERMISSION_DENIED = StatusCodeField(409910, 'Upload Permission Denied', description='上传权限不足')
    77
    +    UPDATE_PERMISSION_DENIED = StatusCodeField(409930, 'Update Permission Denied', description='更新权限不足')

    + 24 - 0
    utils/error/response_utils.py

    @@ -0,0 +1,24 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +from json_response import JsonpResponse, JsonResponse
    4
    +from StatusCode import StatusCodeField
    5
    +
    6
    +
    7
    +def response_data(status_code=200, message=None, description=None, data={}, **kwargs):
    8
    +    return dict({
    9
    +        'status': status_code,
    10
    +        'message': message,
    11
    +        'description': description,
    12
    +        'data': data,
    13
    +    }, **kwargs)
    14
    +
    15
    +
    16
    +def response(status_code=200, message=None, description=None, data={}, msg_args=[], msg_kwargs={}, desc_args=[], desc_kwargs={}, request=None, callback=None, **kwargs):
    17
    +    # Final Message and Description
    18
    +    message, description = (message or status_code.message, description or status_code.description) if isinstance(status_code, StatusCodeField) else (message, description)
    19
    +    # Final Response Data
    20
    +    resp_data = response_data(status_code, (message or '').format(*msg_args, **msg_kwargs), (description or '').format(*desc_args, **desc_kwargs), data, **kwargs)
    21
    +    # Assign Callback
    22
    +    callback = callback or (request and request.GET.get('callback'))
    23
    +    # Call JsonResponse or JsonpResponse
    24
    +    return JsonpResponse(callback, resp_data, safe=False) if callback else JsonResponse(resp_data, safe=False)

    + 0 - 0
    utils/redis/__init__.py


    + 6 - 0
    utils/redis/connect.py

    @@ -0,0 +1,6 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +from django.conf import settings
    4
    +
    5
    +
    6
    +r = settings.REDIS_CACHE

    + 1 - 0
    utils/redis/rkeys.py

    @@ -0,0 +1 @@
    1
    +# -*- coding: utf-8 -*-

    + 0 - 0
    utils/user/__init__.py


    + 18 - 0
    utils/user/userinfo_save.py

    @@ -0,0 +1,18 @@
    1
    +# -*- coding: utf-8 -*-
    2
    +
    3
    +
    4
    +def userinfo_save(userinfo):
    5
    +    """ Save profile or something else """
    6
    +    # from account.models import UserInfo
    7
    +    # from django.conf import settings
    8
    +    #
    9
    +    # unique_identifier = userinfo.get(settings.WECHAT_UNIQUE_IDENTIFICATION, '')
    10
    +    #
    11
    +    # user, created = UserInfo.objects.select_for_update().get_or_create(**{settings.WECHAT_UNIQUE_IDENTIFICATION: unique_identifier})
    12
    +    # user.unionid = userinfo.get('unionid', '')
    13
    +    # user.openid = userinfo.get('openid', '')
    14
    +    # user.nickname = userinfo.get('nickname', '')
    15
    +    # user.avatar = userinfo.get('headimgurl', '')
    16
    +    # user.save()
    17
    +    #
    18
    +    # return user

    Kodo/kodo - Gogs: Go Git Service

    4 Commits (cc95284ded6fdde436fb17e324ce4e5a2afbb049)

    Autor SHA1 Mensaje Fecha
      huangqimin 4ce7f5c87b :art: Member Relative APIs %!s(int64=7) %!d(string=hace) años
      Brightcells 2f29afecbd modify version in operation %!s(int64=10) %!d(string=hace) años
      Brightcells af2b3f483f change download.html to be generated from download.tmpl.html %!s(int64=10) %!d(string=hace) años
      Brightcells 4defb80fdc gogs first init %!s(int64=11) %!d(string=hace) años