#头条创作挑战赛#
github上有中国的省市县开源项目,找到一个特别评分高的项目2.9K星星:
https://github.com/wecatch/china_regions
我修改的代码放到这里了,包括脚本和SQL:
https://github.com/freewebsys/china_regions_lite
设计思路,这个项目有多种方式的接入。
1,json文件,放服务端客户端都行,直接数据写死了。
2,数据库的ddl文件直接存储到数据库中。
个人偏向第二中,存储到数据库中,可以方便维护点,同时在做数据处理分析的时候。
可以直接 join 表,数据的修改查询也很方便。
git clone https://github.com/wecatch/china_regions.git
cd china_regions/mysql
# 有数据库相关脚本
但是现在有个问题,这个数据库的脚本是分3个表的,本身数据量也不大,没有必要分成三个表。
于是合并成一个 region 表得了。同时发现这个地区编码,为了兼容乡村使用的是 12 位的。
如果要是使用省市区,使用前 6 位就可以了。
数据库表设计:
CREATE TABLE `region` (
`id` varchar(10) NOT NULL COMMENT '地区主键编号',
`name` varchar(50) NOT NULL COMMENT '地区名称',
`parent_id` varchar(10) DEFAULT NULL COMMENT '地区父id',
`level` int(2) DEFAULT NULL COMMENT ' 1-省、自治区、直辖市 2-地级市, 3-市辖区、县',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='地区表';
-- 默认,父节点和level 都是0
但是现在有个问题,没有提供相关的数据库文件,是拆分的。
不用担心,作者已经有个python 的脚本了。直接修改 python 代码,自定义生成一个表就行了。
上pyhton3脚本,修改下官方的脚本就可以了:
# -*- coding:utf-8 -*-
import json
import os
import codecs
from collections import OrderedDict
ddl = """
CREATE TABLE `region` (
`id` varchar(10) NOT NULL COMMENT '地区主键编号',
`name` varchar(50) NOT NULL COMMENT '地区名称',
`parent_id` varchar(10) DEFAULT NULL COMMENT '地区父id',
`level` int(2) DEFAULT NULL COMMENT ' 1-省、自治区、直辖市 2-地级市, 3-市辖区、县',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='地区表';
"""
sql_tmp = "INSERT IGNORE INTO region ('id', 'name', 'parent_id', 'level') VALUES ('%s', '%s', '%s', '%s');
"
region_path = "mysql-region"
def make_data():
#只读取省市县数据。
source_file_list = ['county', 'city', 'province' ]
for k in list(reversed(source_file_list)):
data = codecs.open('json/%s.json' % k, 'r', 'utf-8').read()
json_data = json.loads(data)
mysql_data_list = []
if k == 'province':
for index, province in enumerate(json_data):
tmp_id = province['id']
mysql_data = sql_tmp % (province['id'][0:6], province['name'], 0, 1) # noqa
mysql_data_list.append(mysql_data)
if k == 'city':
index = 0
for province_id in sorted(json_data.keys()):
for city in json_data[province_id]:
index += 1
mysql_data = sql_tmp % (city['id'][0:6], city['name'], province_id[0:6], 2) # noqa
mysql_data_list.append(mysql_data)
if k == 'county':
index = 0
for city_id in sorted(json_data.keys()):
for county in json_data[city_id]:
index += 1
mysql_data = sql_tmp % (county['id'][0:6], county['name'], city_id[0:6], 3) # noqa
mysql_data_list.append(mysql_data)
if k in ['province', 'city', 'county']:
out_mysql = codecs.open(region_path + '/%s.sql' % k, 'w', 'utf-8')
index = 0
start = 0
while start < len(mysql_data_list):
end = start + 1000
out_mysql.write(''.join(mysql_data_list[start:end]))
start = end
out_mysql.close()
def main():
if not os.path.exists(region_path):
os.mkdir(region_path)
make_data()
if __name__ == '__main__':
main()
然后生成了省市区的相关的SQL代码:
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110000', '北京市', '0', '1');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('120000', '天津市', '0', '1');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('130000', '河北省', '0', '1');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('140000', '山西省', '0', '1');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('150000', '内蒙古自治区', '0', '1');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('210000', '辽宁省', '0', '1');
....
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110101', '东城区', '110100', '3');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110102', '西城区', '110100', '3');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110105', '朝阳区', '110100', '3');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110106', '丰台区', '110100', '3');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110107', '石景山区', '110100', '3');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110108', '海淀区', '110100', '3');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110109', '门头沟区', '110100', '3');
.....
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110101', '东城区', '110100', '3');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110102', '西城区', '110100', '3');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110105', '朝阳区', '110100', '3');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110106', '丰台区', '110100', '3');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110107', '石景山区', '110100', '3');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110108', '海淀区', '110100', '3');
INSERT IGNORE INTO region (`id`, `name`, `parent_id`, `level`) VALUES ('110109', '门头沟区', '110100', '3');
共 3644 条记录
....
数据都对 1 ,2 , 3 级数据都关联对了,同时对字符串进行裁剪了下,之前的区号是12 位,包括到乡镇。
这个是6 位符合邮编代码。其他的数据就不用了。
单个数据表可以解决 省市区的问题,要是到乡镇的话还是拆分成小表比较好。
查询速度也快了。要是就着三级查询,合并成一张表就行。
这个项目本地也可以启动
cd location-demo
npm install
npm run start
就可在 http://localhost:4200/ 访问了。
页面更新:2024-03-01
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号