dggyanguang/database/migrations/20190807030806_region.php

112 lines
4.1 KiB
PHP
Executable File

<?php
/**
* 省市区表迁移文件
*/
use think\Db;
use think\migration\Migrator;
use think\migration\db\Column;
class Region extends Migrator
{
/**
* 创建表并插入数据
*/
public function change()
{
$region = $this->table('region', ['comment' => '省市区表', 'engine' => 'InnoDB', 'encoding' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci']);
$region->addColumn('parent_id', 'integer', ['limit' => 11, 'default' => 0, 'comment' => '父级ID'])
->addColumn('level', 'boolean', ['limit' => 1, 'default' => 1, 'comment' => '等级'])
->addColumn('name', 'string', ['limit' => 50, 'default' => '', 'comment' => '名称'])
->addColumn('initial', 'string', ['limit' => 50, 'default' => '', 'comment' => '首字母'])
->addColumn('pinyin', 'string', ['limit' => 255, 'default' => '', 'comment' => '拼音'])
->addColumn('citycode', 'string', ['limit' => 10, 'default' => '', 'comment' => '城市编码'])
->addColumn('adcode', 'string', ['limit' => 10, 'default' => '', 'comment' => '区域编码'])
->addColumn('lng_lat', 'string', ['limit' => 30, 'default' => '', 'comment' => '中心经纬度'])
->addIndex(['name'], ['name' => 'index_name'])
->addIndex(['initial'], ['name' => 'index_initial'])
->addIndex(['pinyin'], ['name' => 'index_pinyin'])
->addIndex(['name', 'initial', 'pinyin'], ['name' => 'index_name_initial_pinyin'])
->create();
$this->insertData();
}
/**
* 插入数据
*/
public function insertData()
{
print ('正在下载json数据压缩包···' . "\n");
$online_zip = file_get_contents('http://json.think-region.yupoxiong.com/region.json.zip');
$zip_file = app()->getRuntimePath() . 'region.json.zip';
$json_file = app()->getRuntimePath() . 'region.json';
file_put_contents($zip_file, $online_zip);
print ('正在解压json数据压缩包···' . "\n");
$zipArc = new ZipArchive();
$zipArc->open($zip_file);
$zipArc->extractTo(app()->getRuntimePath());
$zipArc->close();
print ('正在读取json数据···' . "\n");
$json = file_get_contents($json_file);
$data = json_decode($json, true);
$msg = "\n" . '数据导入成功';
$total = count($data) + 1;
print ('正在导入数据···' . "\n");
Db::startTrans();
try {
foreach ($data as $key => $value) {
\yupoxiong\region\model\Region::create($value);
$this->showStatus($key + 1, $total, 10);
}
Db::commit();
} catch (\Exception $e) {
Db::rollback();
$msg = $e->getMessage();
}
print ($msg . "\n");
unset($data);
unlink($zip_file);
unlink($json_file);
}
/**
* 显示进度
* @param $done
* @param $total
* @param int $size
*/
protected function showStatus($done, $total, $size = 20)
{
static $start_time;
if ($done > $total) return;
if (empty($start_time)) $start_time = time();
$now = time();
$percent = (double)($done / $total);
$bar = floor($percent * $size);
$status_bar = "\r[";
$status_bar .= str_repeat('=', $bar);
if ($bar < $size) {
$status_bar .= '>';
$status_bar .= str_repeat(' ', $size - $bar);
} else {
$status_bar .= '=';
}
$display = number_format($percent * 100, 0);
$status_bar .= "] $display% $done/$total";
$rate = ($now - $start_time) / $done;
$left = $total - $done;
$eta = round($rate * $left, 2);
$elapsed = $now - $start_time;
$status_bar .= ' 预计剩余: ' . number_format($eta) . ' 秒. 已执行: ' . number_format($elapsed) . ' 秒.';
echo "$status_bar ";
flush();
if ($done === $total) {
echo "\n";
}
}
}