diff --git a/.example.env b/.example.env index c27f74caea59e0bc78bae1941793a6ac34c85a9c..f8aa1b52a06740844cae0c4a6cb4986b2dd311d5 100644 --- a/.example.env +++ b/.example.env @@ -1 +1,17 @@ -APP_DEBUG = true [APP] DEFAULT_TIMEZONE = Asia/Shanghai [DATABASE] TYPE = mysql HOSTNAME = 127.0.0.1 DATABASE = test USERNAME = username PASSWORD = password HOSTPORT = 3306 CHARSET = utf8 DEBUG = true [LANG] default_lang = zh-cn \ No newline at end of file +APP_DEBUG = true + +[APP] +DEFAULT_TIMEZONE = Asia/Shanghai + +[DATABASE] +TYPE = mysql +HOSTNAME = 127.0.0.1 +DATABASE = test +USERNAME = username +PASSWORD = password +HOSTPORT = 3306 +CHARSET = utf8mb4 +DEBUG = true + +[LANG] +default_lang = zh-cn \ No newline at end of file diff --git a/.gitignore b/.gitignore index 78d01d79406a03c2637ac80a842ae84c5b138a62..6d97a6447b698667d6606d6fb2d8fae8b8191567 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ /vendor *.log .env -composer.lock \ No newline at end of file +composer.lock +install.key \ No newline at end of file diff --git a/app/common.php b/app/common.php new file mode 100644 index 0000000000000000000000000000000000000000..ab213f5481a13fefc9a633232537688b90931290 --- /dev/null +++ b/app/common.php @@ -0,0 +1,68 @@ + $replace) { + $string = str_replace($pattern, $replace, $string); + } + } +} + +if (!function_exists('del_dir')) { + function del_dir(string $dir) + { + if (file_exists($dir)) { + $dh = opendir($dir); + while ($file = readdir($dh)) { + if ($file != "." && $file != "..") { + $fullpath = $dir . "/" . $file; + if (!is_dir($fullpath)) { + unlink($fullpath); + } else { + del_dir($fullpath); + } + } + } + closedir($dh); + rmdir($dir); + } + } +} \ No newline at end of file diff --git a/app/controller/Index.php b/app/controller/Index.php index 51da1263c32ab10d81b8314fb223386894cc6222..524202530b1b6e78e2722a05b17230e2ca484e88 100644 --- a/app/controller/Index.php +++ b/app/controller/Index.php @@ -1,4 +1,5 @@ 'DESC','id'=>'ASC']; + public $hasSoftDel = 1;//是否拥有软删除功能 + public $orderRule = ['sort' => 'DESC', 'id' => 'ASC']; public function _initialize() { $this->model = new \app\model\Area(); } - //查看 - public function index(){ - $where = $this->buildSearchParams(); - $order = $this->buildOrder(); - $sourceData = $this->model->where($where)->order($order)->with(['parent'])->select()->toArray(); - $isTree = $this->request->param('is_tree'); - if($isTree){ + public function index() + { + $where = $this->buildSearchParams(); + $order = $this->buildOrder(); + $sourceData = $this->model->where($where)->order($order)->with(['parent']); + $isTree = $this->request->param('is_tree'); + if ($isTree) { $menuTreeObj = Tree::instance(); - $menuTreeObj->init($sourceData); + $menuTreeObj->init($sourceData->select()->toArray()); $data = $menuTreeObj->getRootTrees(); - }else{ - $data = $sourceData; + } else { + $paging = $this->request->param('paging', false); + if ($paging) { + $limit = $this->request->param('limit', Config::get('paginate.limit')); + $data = $sourceData->paginate($limit)->toArray(); + $data['data'] = $this->getSelectedData($data['data']); + } else { + $data = $sourceData->select()->toArray(); + } } return $this->success('数据获取成功', $data); } - - - - //删除 public function del() { @@ -55,7 +59,7 @@ class Area extends Backend } $sourceData = $this->model->select()->toArray(); - $treeLib = Tree::instance(); + $treeLib = Tree::instance(); $treeLib->init($sourceData); $childIds = $treeLib->getChildIds($ids); @@ -66,28 +70,27 @@ class Area extends Backend } } - //回收站 - public function recycle(){ + public function recycle() + { $where = $this->buildSearchParams(); $order = $this->buildOrder(); - $limit = $this->request->param('limit', 10); + $limit = $this->request->param('limit', Config::get('paginate.limit')); $data = $this->model->onlyTrashed() - ->with(['parent']) - ->order($order)->where($where)->paginate($limit)->toArray(); + ->with(['parent']) + ->order($order)->where($where)->paginate($limit)->toArray(); return $this->success('回收站数据获取成功', $data); } - //设置排序 public function setSort() { - $id = $this->request->post('id'); - $fieldVal = $this->request->post('field_val'); - $isRecycle = $this->request->post('is_recycle'); + $id = $this->request->post('id'); + $fieldVal = $this->request->post('field_val'); + $isRecycle = $this->request->post('is_recycle'); $update['sort'] = $fieldVal; try { - if($isRecycle) { + if ($isRecycle) { $updateRes = $this->model->onlyTrashed()->where('id', '=', $id)->update($update); } else { $updateRes = $this->model->where('id', '=', $id)->update($update); diff --git a/app/controller/admin/Common.php b/app/controller/admin/Common.php index 3d32b627896c17f41b8595815326c0166b555842..0623a54b3e13a0b005b074c63cab4250b7d1da58 100644 --- a/app/controller/admin/Common.php +++ b/app/controller/admin/Common.php @@ -14,7 +14,7 @@ use think\File; class Common extends Backend { - protected $noNeedAuth = ['*']; + protected $noNeedAuth = ['*']; protected $noNeedLogin = ['getLoginNeedCaptchaConf']; /** @@ -30,7 +30,9 @@ class Common extends Backend public function upload() { try { - $uploadType = $this->request->param('upload_type', 'local'); + $defaultType = ConfServiceFacade::get('system.upload.defaultType', 'local'); + $uploadType = $this->request->param('upload_type', 'default'); + if ($uploadType == 'default') $uploadType = $defaultType; if (!in_array($uploadType, ['local', 'ali-oss', 'qiniu-kodo'])) { return $this->error($uploadType . '上传方式未定义'); } @@ -38,7 +40,7 @@ class Common extends Backend if (!$file) { return $this->error('上传失败,请选择需要上传的文件'); } - $fileExt = strtolower($file->getOriginalExtension()); + $fileExt = strtolower($file->getOriginalExtension()); $uploadDomain = new UploadDomain(); if (!$uploadDomain->check($file->getOriginalName(), $file->getSize(), $fileExt, $file->getMime())) { return $this->error($uploadDomain->getError()); @@ -49,13 +51,13 @@ class Common extends Backend * - 因为OSS存储时,不允许以/开头 */ $uploadDir = $this->request->param('dir'); - $object = $uploadDir ? $uploadDir . '/' . $saveName : $saveName;//设置了上传目录的上传文件名 - $filePath = $object; //保存到lt_files中的path + $object = $uploadDir ? $uploadDir . '/' . $saveName : $saveName;//设置了上传目录的上传文件名 + $filePath = $object; //保存到lt_files中的path //如果上传的是图片,验证图片的宽和高 $accept = $this->request->param('accept'); if ($accept == "image") { - $width = $this->request->param('width'); + $width = $this->request->param('width'); $height = $this->request->param('height'); if ($width || $height) { $imageInfo = getimagesize($file->getFileInfo()); @@ -68,17 +70,17 @@ class Common extends Backend $inputValue = ""; //上传至七牛云 if ($uploadType == 'qiniu-kodo') { - if(ConfServiceFacade::get('qiniuKodo.conf.switch') != 1){ - return $this->error('未开启七牛云KODO存储,请到七牛云KODO配置中开启'); + if (ConfServiceFacade::get('plugin.qiniu_kodo.switch') != 1) { + return $this->error('未开启七牛云KODO存储,请到七牛云KODO配置中开启,如果未安装七牛云KODO存储插件,请先到插件市场进行安装'); } $kodoConf = [ - 'accessKey' => ConfServiceFacade::get('qiniuKodo.conf.accessKey'), - 'secretKey' => ConfServiceFacade::get('qiniuKodo.conf.secretKey'), - 'bucket' => ConfServiceFacade::get('qiniuKodo.conf.bucket'), - 'domain' => ConfServiceFacade::get('qiniuKodo.conf.domain'), + 'accessKey' => ConfServiceFacade::get('plugin.qiniu_kodo.accessKey'), + 'secretKey' => ConfServiceFacade::get('plugin.qiniu_kodo.secretKey'), + 'bucket' => ConfServiceFacade::get('plugin.qiniu_kodo.bucket'), + 'domain' => ConfServiceFacade::get('plugin.qiniu_kodo.domain'), ]; - $kodo = Kodo::instance(); - $kodoRes = $kodo->upload($file->getPathname(), $object, $kodoConf); + $kodo = Kodo::instance(); + $kodoRes = $kodo->upload($file->getPathname(), $object, $kodoConf); if ($kodoRes) { $inputValue = $kodoRes; } else { @@ -88,17 +90,17 @@ class Common extends Backend //上传至阿里云 if ($uploadType == 'ali-oss') { - if(ConfServiceFacade::get('system.aliOss.switch') != 1){ + if (ConfServiceFacade::get('plugin.ali_oss.switch') != 1) { return $this->error('未开启阿里云OSS存储,请到阿里云OSS配置中开启'); } - $ossConf = [ - 'accessKeyID' => ConfServiceFacade::get('aliOss.conf.accessKeyID'), - 'accessKeySecret' => ConfServiceFacade::get('aliOss.conf.accessKeySecret'), - 'bucket' => ConfServiceFacade::get('aliOss.conf.bucket'), - 'endpoint' => ConfServiceFacade::get('aliOss.conf.endpoint'), - 'domain' => ConfServiceFacade::get('aliOss.conf.domain'), + $ossConf = [ + 'accessKeyID' => ConfServiceFacade::get('plugin.ali_oss.accessKeyID'), + 'accessKeySecret' => ConfServiceFacade::get('plugin.ali_oss.accessKeySecret'), + 'bucket' => ConfServiceFacade::get('plugin.ali_oss.bucket'), + 'endpoint' => ConfServiceFacade::get('plugin.ali_oss.endpoint'), + 'domain' => ConfServiceFacade::get('plugin.ali_oss.domain'), ]; - $oss = Oss::instance(); + $oss = Oss::instance(); $ossUploadRes = $oss->upload($file->getPathname(), $object, $ossConf); if ($ossUploadRes) { $inputValue = $ossUploadRes; @@ -109,9 +111,9 @@ class Common extends Backend //本地上传 if ($uploadType == 'local') { - $uploadDir = ltrim('/', $uploadDir); - $saveName = Filesystem::putFileAs('/' . $uploadDir, $file, '/' . $object); - $filePath = $saveName; + $uploadDir = ltrim('/', $uploadDir); + $saveName = Filesystem::putFileAs('/' . $uploadDir, $file, '/' . $object); + $filePath = $saveName; $staticDomain = Env::get('domain.static'); if ($staticDomain) { $inputValue = $staticDomain . '/storage/' . $saveName; @@ -122,22 +124,22 @@ class Common extends Backend //将inputValue存入lt_files表中 $filesModel = new \app\model\Files(); - $fileId = $filesModel->insertGetId([ - 'category_id' => 0, - 'name' => $file->getOriginalName(), - 'file_type' => $this->request->param('accept'), - 'path' => $filePath, - 'upload_type' => $uploadType, - 'size' => $file->getSize(), - 'ext' => $file->getExtension(), + $fileId = $filesModel->insertGetId([ + 'category_id' => 0, + 'name' => $file->getOriginalName(), + 'file_type' => $this->request->param('accept'), + 'path' => $filePath, + 'upload_type' => $uploadType, + 'size' => $file->getSize(), + 'ext' => $file->getExtension(), 'create_admin_user_id' => UserServiceFacade::getUser()->id, 'update_admin_user_id' => UserServiceFacade::getUser()->id, - 'create_time' => date('Y-m-d H:i:s'), - 'update_time' => date('Y-m-d H:i:s'), + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s'), ]); return $this->success('上传成功', [ - 'id' => $fileId, + 'id' => $fileId, 'path' => $inputValue, 'name' => $file->getOriginalName(), ]); @@ -149,32 +151,32 @@ class Common extends Backend // 获取阿里云sts的临时凭证,目前仅用于客户端直接上传到oss前获取到临时凭证进行上传 public function aliSts() { - if(ConfServiceFacade::get('aliOss.sts.switch') != 1){ + if (ConfServiceFacade::get('plugin.ali_oss_sts.switch') != 1) { return $this->error('阿里云OSS存储的STS方式,请到阿里云STS配置中开启'); } $uploadDomain = new UploadDomain(); - $fileName = $this->request->param('name'); - $fileSize = $this->request->param('size'); - $fileExt = $this->request->param('ext'); + $fileName = $this->request->param('name'); + $fileSize = $this->request->param('size'); + $fileExt = $this->request->param('ext'); if (!$uploadDomain->check($fileName, $fileSize, $fileExt, '')) { return $this->error($uploadDomain->getError()); } $stsConf = [ - 'accessKeyID' => ConfServiceFacade::get('aliOss.sts.accessKeyID'), - 'accessKeySecret' => ConfServiceFacade::get('aliOss.sts.accessKeySecret'), - 'ARN' => ConfServiceFacade::get('aliOss.sts.ARN'), - 'endpoint' => ConfServiceFacade::get('aliOss.sts.endpoint'), - 'domain' => ConfServiceFacade::get('aliOss.sts.domain'), - 'bucket' => ConfServiceFacade::get('aliOss.sts.bucket'), + 'accessKeyID' => ConfServiceFacade::get('plugin.ali_oss_sts.accessKeyID'), + 'accessKeySecret' => ConfServiceFacade::get('plugin.ali_oss_sts.accessKeySecret'), + 'ARN' => ConfServiceFacade::get('plugin.ali_oss_sts.ARN'), + 'endpoint' => ConfServiceFacade::get('plugin.ali_oss_sts.endpoint'), + 'domain' => ConfServiceFacade::get('plugin.ali_oss_sts.domain'), + 'bucket' => ConfServiceFacade::get('plugin.ali_oss_sts.bucket'), ]; - $oss = Oss::instance(); - $sts = $oss->sts($stsConf); - $file = new File('', false); + $oss = Oss::instance(); + $sts = $oss->sts($stsConf); + $file = new File('', false); if ($sts) { return $this->success('sts获取成功', [ - 'sts' => $sts, - 'path' => str_replace('\\', '/', $file->hashName()) . $fileExt, + 'sts' => $sts, + 'path' => str_replace('\\', '/', $file->hashName()) . $fileExt, 'index' => $this->request->param('index'), ]); } else { @@ -185,33 +187,33 @@ class Common extends Backend // 获取kodo上传凭证token public function kodoToken() { - if(ConfServiceFacade::get('qiniuKodo.conf.switch') != 1){ + if (ConfServiceFacade::get('plugin.qiniu_kodo.switch') != 1) { return $this->error('未开启七牛云KODO存储,请到七牛云KODO配置中开启'); } $uploadDomain = new UploadDomain(); - $fileName = $this->request->param('name'); - $fileSize = $this->request->param('size'); - $fileExt = $this->request->param('ext'); + $fileName = $this->request->param('name'); + $fileSize = $this->request->param('size'); + $fileExt = $this->request->param('ext'); if (!$uploadDomain->check($fileName, $fileSize, $fileExt, '')) { return $this->error($uploadDomain->getError()); } $kodoConf = [ - 'accessKey' => ConfServiceFacade::get('qiniuKodo.conf.accessKey'), - 'secretKey' => ConfServiceFacade::get('qiniuKodo.conf.secretKey'), - 'domain' => ConfServiceFacade::get('qiniuKodo.conf.domain'), - 'bucket' => ConfServiceFacade::get('qiniuKodo.conf.bucket'), + 'accessKey' => ConfServiceFacade::get('plugin.qiniu_kodo.accessKey'), + 'secretKey' => ConfServiceFacade::get('plugin.qiniu_kodo.secretKey'), + 'domain' => ConfServiceFacade::get('plugin.qiniu_kodo.domain'), + 'bucket' => ConfServiceFacade::get('plugin.qiniu_kodo.bucket'), ]; - $kodo = Kodo::instance(); - $token = $kodo->token($kodoConf); - $file = new File('', false); + $kodo = Kodo::instance(); + $token = $kodo->token($kodoConf); + $file = new File('', false); if ($token) { return $this->success('KodoToken获取成功', [ - 'token' => $token, - 'domain' => ConfServiceFacade::get('qiniuKodo.conf.domain'), - 'bucket' => ConfServiceFacade::get('qiniuKodo.conf.bucket'), - 'path' => str_replace('\\', '/', $file->hashName()) . $fileExt, - 'index' => $this->request->param('index'), + 'token' => $token, + 'domain' => ConfServiceFacade::get('plugin.qiniu_kodo.domain'), + 'bucket' => ConfServiceFacade::get('plugin.qiniu_kodo.bucket'), + 'path' => str_replace('\\', '/', $file->hashName()) . $fileExt, + 'index' => $this->request->param('index'), ]); } else { return $this->error('KodoToken获取失败,' . $kodo->getError()); @@ -221,8 +223,8 @@ class Common extends Backend //解锁屏幕 function unLockScreen() { - $password = $this->request->post('password'); - $userId = UserServiceFacade::getUser()->id; + $password = $this->request->post('password'); + $userId = UserServiceFacade::getUser()->id; $passwordHash = User::where('id', '=', $userId)->value('password'); if (!password_verify(md5($password), $passwordHash)) { return $this->error('解锁失败,密码错误'); diff --git a/app/controller/admin/Conf.php b/app/controller/admin/Conf.php index c31990f9e42d48331eec8802c7c3e87eb7fae394..6d418a290709704e506a3086246e795bcccc3023 100644 --- a/app/controller/admin/Conf.php +++ b/app/controller/admin/Conf.php @@ -38,8 +38,8 @@ class Conf extends Backend */ public function saveGroupConf() { - $post = $this->request->post(); - if(isset($post['laytpUploadFile'])){ + $post = $this->request->post(); + if (isset($post['laytpUploadFile'])) { unset($post['laytpUploadFile']); } $group = $post['group']; @@ -51,7 +51,7 @@ class Conf extends Backend if (is_array($value)) { $temp = []; foreach ($value['key'] as $arrK => $arrV) { - if($arrV){ + if ($arrV) { $temp[$arrV] = $value['value'][$arrK]; } } @@ -61,7 +61,7 @@ class Conf extends Backend $conf['key'] = $key; $conf['value'] = $value; $conf['form_type'] = $formType[$key]; - $allConf[] = $conf; + $allConf[] = $conf; } ConfServiceFacade::groupSet($allConf); return $this->success('保存成功', $allConf); @@ -74,7 +74,7 @@ class Conf extends Backend public function del() { $group = $this->request->param('group'); - $key = $this->request->param('key'); + $key = $this->request->param('key'); ConfServiceFacade::del($group, $key); return $this->success('删除成功'); } diff --git a/app/controller/admin/Files.php b/app/controller/admin/Files.php index 69fd209dc16c290ae9a65aa4fba21c5e5517c58e..d9cbe5d7d841caf817ee88c5d901b7b0afe39267 100644 --- a/app/controller/admin/Files.php +++ b/app/controller/admin/Files.php @@ -6,6 +6,7 @@ use laytp\controller\Backend; use app\service\admin\UserServiceFacade; use laytp\library\CommonFun; use laytp\library\UploadDomain; +use think\facade\Config; /** * 附件管理 @@ -17,37 +18,42 @@ class Files extends Backend * @var \app\model\Files */ protected $model; - public $hasSoftDel=1;//是否拥有软删除功能 + public $hasSoftDel = 1;//是否拥有软删除功能 public function initialize() { parent::initialize(); $this->model = new \app\model\Files(); } - - //查看 - public function index(){ - $where = $this->buildSearchParams(); - $order = $this->buildOrder(); - $allData = $this->request->param('all_data'); - $data = $this->model->where($where)->order($order)->with(['category','createAdminUser','updateAdminUser']); - if($allData){ + + /** + * 查看 + * @throws \think\db\exception\DbException + */ + public function index() + { + $where = $this->buildSearchParams(); + $order = $this->buildOrder(); + $data = $this->model->where($where)->order($order)->with(['category', 'createAdminUser', 'updateAdminUser']); + $paging = $this->request->param('paging', false); + if ($paging) { + $limit = $this->request->param('limit', Config::get('paginate.limit')); + $data = $data->paginate($limit)->toArray(); + $data['data'] = $this->getSelectedData($data['data']); + } else { $data = $data->select()->toArray(); - }else{ - $limit = $this->request->param('limit', 10); - $data = $data->paginate($limit)->toArray(); } return $this->success('数据获取成功', $data); } - + //添加 public function add() { return $this->error('当前版本暂时不支持在附件管理中添加附件'); - $post = CommonFun::filterPostData($this->request->post()); + $post = CommonFun::filterPostData($this->request->post()); $post['create_admin_user_id'] = UserServiceFacade::getUser()->id; $post['update_admin_user_id'] = UserServiceFacade::getUser()->id; - $post['path'] = UploadDomain::singleDelUploadDomain($post['path']); + $post['path'] = UploadDomain::singleDelUploadDomain($post['path']); if ($this->model->create($post)) { return $this->success('添加成功', $post); } else { @@ -56,28 +62,30 @@ class Files extends Backend } //不经过服务器方式上传成功后,回调的ajax请求地址,将上传成功的文件信息存入表中 - public function unViaSave(){ - $post = $this->request->post(); + public function unViaSave() + { + $post = $this->request->post(); $post['create_admin_user_id'] = UserServiceFacade::getUser()->id; $post['update_admin_user_id'] = UserServiceFacade::getUser()->id; - $post['create_time'] = date('Y-m-d H:i:s'); - $post['update_time'] = date('Y-m-d H:i:s'); - $post['id'] = $this->model->insertGetId($post); + $post['create_time'] = date('Y-m-d H:i:s'); + $post['update_time'] = date('Y-m-d H:i:s'); + $post['id'] = $this->model->insertGetId($post); if ($post['id']) { return $this->success('添加成功', $post); } else { return $this->error('操作失败'); } } - + //编辑 - public function edit(){ + public function edit() + { return $this->error('当前版本暂时不支持在附件管理中编辑附件'); - $id = $this->request->param('id'); - $info = $this->model->find($id); - $post = CommonFun::filterPostData($this->request->post()); + $id = $this->request->param('id'); + $info = $this->model->find($id); + $post = CommonFun::filterPostData($this->request->post()); $post['update_admin_user_id'] = UserServiceFacade::getUser()->id; - $post['path'] = UploadDomain::singleDelUploadDomain($post['path']); + $post['path'] = UploadDomain::singleDelUploadDomain($post['path']); foreach ($post as $k => $v) { $info->$k = $v; } @@ -96,35 +104,37 @@ class Files extends Backend } //删除 - public function del(){ - $id = $this->request->param('id'); - $info = $this->model->find($id); - $post = CommonFun::filterPostData($this->request->post()); + public function del() + { + $id = $this->request->param('id'); + $info = $this->model->find($id); + $post = CommonFun::filterPostData($this->request->post()); $post['update_admin_user_id'] = UserServiceFacade::getUser()->id; - $post['path'] = UploadDomain::singleDelUploadDomain($post['path']); + $post['path'] = UploadDomain::singleDelUploadDomain($post['path']); foreach ($post as $k => $v) { $info->$k = $v; } try { $updateRes = $info->save(); - if(!$updateRes){ + if (!$updateRes) { return $this->error('操作失败'); - }else{ + } else { return $this->success('编辑成功'); } } catch (\Exception $e) { return $this->exceptionError($e); } } - + //回收站 - public function recycle(){ + public function recycle() + { $where = $this->buildSearchParams(); $order = $this->buildOrder(); - $limit = $this->request->param('limit', 10); + $limit = $this->request->param('limit', Config::get('paginate.limit')); $data = $this->model->onlyTrashed() - ->with(['category','createAdminUser','updateAdminUser']) - ->order($order)->where($where)->paginate($limit)->toArray(); + ->with(['category', 'createAdminUser', 'updateAdminUser']) + ->order($order)->where($where)->paginate($limit)->toArray(); return $this->success('回收站数据获取成功', $data); } } diff --git a/app/controller/admin/Member.php b/app/controller/admin/Member.php new file mode 100644 index 0000000000000000000000000000000000000000..74e9de642d6ad08be862430d6b00ba21a93e94ff --- /dev/null +++ b/app/controller/admin/Member.php @@ -0,0 +1,138 @@ +model = new \app\model\Member(); + } + + + //查看和搜索列表 + public function index(){ + $where = $this->buildSearchParams(); + $order = $this->buildOrder(); + $data = $this->model->where($where)->order($order)->with(['avatar_pic_file']); + $paging = $this->request->param('paging', false); + if ($paging) { + $limit = $this->request->param('limit', Config::get('paginate.limit')); + $data = $data->paginate($limit)->toArray(); + $data['data'] = $this->getSelectedData($data['data']); + } else { + $data = $data->select()->toArray(); + } + return $this->success('数据获取成功', $data); + } + + + //添加 + public function add() + { + $post = CommonFun::filterPostData($this->request->post()); + $validate = new Add(); + if(!$validate->check($post)){ + return $this->error($validate->getError()); + } + if(isset($post['password']) && $post['password']) $post['password'] = Str::createPassword($post['password']); + try { + if ($this->model->create($post)) { + return $this->success('添加成功', $post); + } else { + return $this->error('操作失败'); + } + } catch (\Exception $e) { + return $this->exceptionError($e); + } + } + + + //查看详情 + public function info() + { + $id = $this->request->param('id'); + $info = $this->model->with(['avatar_pic_file'])->find($id); + return $this->success('获取成功', $info); + } + + + //编辑 + public function edit(){ + $id = $this->request->param('id'); + $info = $this->model->find($id); + $post = CommonFun::filterPostData($this->request->post()); + $validate = new Edit(); + if(!$validate->check($post)){ + return $this->error($validate->getError()); + } + if(!$post['password']){ + unset($post['password']); + }else{ + $post['password'] = Str::createPassword($post['password']); + } + foreach ($post as $k => $v) { + $info->$k = $v; + } + try { + $updateRes = $info->save(); + if ($updateRes) { + return $this->success('编辑成功'); + } else { + return $this->error('操作失败'); + } + } catch (\Exception $e) { + return $this->exceptionError($e); + } + } + + + + + //设置账号状态 + public function setStatus() + { + $id = $this->request->post('id'); + $fieldVal = $this->request->post('field_val'); + $isRecycle = $this->request->post('is_recycle'); + $update['status'] = $fieldVal; + try { + if($isRecycle) { + $updateRes = $this->model->onlyTrashed()->where('id', '=', $id)->update($update); + } else { + $updateRes = $this->model->where('id', '=', $id)->update($update); + } + if ($updateRes) { + return $this->success('操作成功'); + } else if ($updateRes === 0) { + return $this->success('未作修改'); + } else { + return $this->error('操作失败'); + } + } catch (\Exception $e) { + return $this->error('数据库异常,操作失败'); + } + } +} diff --git a/app/controller/admin/Menu.php b/app/controller/admin/Menu.php index 39eed6e99f39abad8ff532750fdf41e1c802c6ee..d7b2b6b3a32fa0b06da175c7a4c4d1e867cd00b0 100644 --- a/app/controller/admin/Menu.php +++ b/app/controller/admin/Menu.php @@ -6,16 +6,16 @@ use app\service\admin\UserServiceFacade; use laytp\controller\Backend; use laytp\library\CommonFun; use laytp\library\Tree; +use think\facade\Config; /** * 菜单控制器 */ class Menu extends Backend { - public $noNeedAuth = ['getMenuTree','getTree']; - public $menuList; + public $noNeedAuth = ['getMenuTree', 'getTree']; public $model; - public $orderRule = ['sort' => 'desc', 'id' => 'asc']; + public $orderRule = ['sort' => 'desc', 'id' => 'asc']; public function _initialize() { @@ -24,32 +24,40 @@ class Menu extends Backend public function index() { - $where = $this->buildSearchParams(); - $order = $this->buildOrder(); - $sourceData = $this->model->where($where)->order($order)->select()->toArray(); - $isTree = $this->request->param('is_tree'); - if($isTree){ + $where = $this->buildSearchParams(); + $order = $this->buildOrder(); + $sourceData = $this->model->where($where)->order($order); + $isTree = $this->request->param('is_tree'); + if ($isTree) { $menuTreeObj = Tree::instance(); - $menuTreeObj->init($sourceData); + $menuTreeObj->init($sourceData->select()->toArray()); $data = $menuTreeObj->getRootTrees(); - }else{ - $data = $sourceData; + } else { + $paging = $this->request->param('paging', false); + if ($paging) { + $limit = $this->request->param('limit', Config::get('paginate.limit')); + $data = $sourceData->paginate($limit)->toArray(); + $data['data'] = $this->getSelectedData($data['data']); + } else { + $data = $sourceData->select()->toArray(); + } } return $this->success('数据获取成功', $data); } //获取当前登录者的权限列表,返回树形数据,角色管理赋予权限时用到 - public function getTree(){ + public function getTree() + { $user = UserServiceFacade::getUser(); - if($user->is_super_manager === 1){ - $sourceData = $this->model->order($this->orderRule)->select()->toArray(); - }else{ - $roleIds = \app\model\admin\role\User::where('admin_user_id','=', $user->id) + if ($user->is_super_manager === 1) { + $sourceData = $this->model->order($this->orderRule)->select()->toArray(); + } else { + $roleIds = \app\model\admin\role\User::where('admin_user_id', '=', $user->id) ->column('admin_role_id'); - $menuIds = \app\model\admin\menu\Role::where('admin_role_id','in',$roleIds) + $menuIds = \app\model\admin\menu\Role::where('admin_role_id', 'in', $roleIds) ->column('admin_menu_id'); - $where[] = ['id', 'in', $menuIds]; - $sourceData = $this->model->order($this->orderRule)->where($where)->select()->toArray(); + $where[] = ['id', 'in', $menuIds]; + $sourceData = $this->model->order($this->orderRule)->where($where)->select()->toArray(); } $menuTreeObj = Tree::instance(); $menuTreeObj->init($sourceData); @@ -59,19 +67,20 @@ class Menu extends Backend } //获取当前登录者的菜单列表,返回树形数据,仅返回is_menu=1的列表,后台菜单列表展示使用 - public function getMenuTree(){ - $user = UserServiceFacade::getUser(); + public function getMenuTree() + { + $user = UserServiceFacade::getUser(); $where[] = ['is_show', '=', 1]; $where[] = ['is_menu', '=', 1]; - if($user->is_super_manager === 1){ - $sourceData = $this->model->order($this->orderRule)->where($where)->select()->toArray(); - }else{ - $roleIds = \app\model\admin\role\User::where('admin_user_id','=', $user->id) + if ($user->is_super_manager === 1) { + $sourceData = $this->model->order($this->orderRule)->where($where)->select()->toArray(); + } else { + $roleIds = \app\model\admin\role\User::where('admin_user_id', '=', $user->id) ->column('admin_role_id'); - $menuIds = \app\model\admin\menu\Role::where('admin_role_id','in',$roleIds) + $menuIds = \app\model\admin\menu\Role::where('admin_role_id', 'in', $roleIds) ->column('admin_menu_id'); - $where[] = ['id','in',$menuIds]; - $sourceData = $this->model->order($this->orderRule)->where($where)->select()->toArray(); + $where[] = ['id', 'in', $menuIds]; + $sourceData = $this->model->order($this->orderRule)->where($where)->select()->toArray(); } $menuTreeObj = Tree::instance(); $menuTreeObj->init($sourceData); @@ -128,7 +137,7 @@ class Menu extends Backend } $sourceData = $this->model->select()->toArray(); - $treeLib = Tree::instance(); + $treeLib = Tree::instance(); $treeLib->init($sourceData); $childIds = $treeLib->getChildIds($ids); @@ -142,12 +151,12 @@ class Menu extends Backend //设置排序 public function setSort() { - $id = $this->request->post('id'); - $fieldVal = $this->request->post('field_val'); - $isRecycle = $this->request->post('is_recycle'); + $id = $this->request->post('id'); + $fieldVal = $this->request->post('field_val'); + $isRecycle = $this->request->post('is_recycle'); $update['sort'] = $fieldVal; try { - if($isRecycle) { + if ($isRecycle) { $updateRes = $this->model->onlyTrashed()->where('id', '=', $id)->update($update); } else { $updateRes = $this->model->where('id', '=', $id)->update($update); @@ -167,12 +176,12 @@ class Menu extends Backend //设置是否为菜单 public function setIsMenu() { - $id = $this->request->post('id'); - $fieldVal = $this->request->post('field_val'); - $isRecycle = $this->request->post('is_recycle'); + $id = $this->request->post('id'); + $fieldVal = $this->request->post('field_val'); + $isRecycle = $this->request->post('is_recycle'); $update['is_menu'] = $fieldVal; try { - if($isRecycle) { + if ($isRecycle) { $updateRes = $this->model->onlyTrashed()->where('id', '=', $id)->update($update); } else { $updateRes = $this->model->where('id', '=', $id)->update($update); @@ -192,12 +201,12 @@ class Menu extends Backend //设置是否显示 public function setIsShow() { - $id = $this->request->post('id'); - $fieldVal = $this->request->post('field_val'); - $isRecycle = $this->request->post('is_recycle'); + $id = $this->request->post('id'); + $fieldVal = $this->request->post('field_val'); + $isRecycle = $this->request->post('is_recycle'); $update['is_show'] = $fieldVal; try { - if($isRecycle) { + if ($isRecycle) { $updateRes = $this->model->onlyTrashed()->where('id', '=', $id)->update($update); } else { $updateRes = $this->model->where('id', '=', $id)->update($update); @@ -223,21 +232,21 @@ class Menu extends Backend return $this->error('参数ids不能为空'); } - $data = \app\model\admin\Menu::where('id','in', $ids) + $data = \app\model\admin\Menu::where('id', 'in', $ids) ->withoutField('id')->select() - ->each(function($item) use ($pid){ + ->each(function ($item) use ($pid) { $item->pid = $pid; })->toArray(); $insert = $this->model->insertAll($data); - if($insert){ + if ($insert) { return $this->success('复制成功'); - }else{ + } else { return $this->error('复制失败'); } } - // 复制菜单 + // 移动菜单 public function move() { $pid = (int)$this->request->post('pid'); @@ -246,12 +255,12 @@ class Menu extends Backend return $this->error('参数ids不能为空'); } - $save = \app\model\admin\Menu::where('id','in', $ids) - ->save(['pid'=>$pid]); + $save = \app\model\admin\Menu::where('id', 'in', $ids) + ->save(['pid' => $pid]); - if($save){ + if ($save) { return $this->success('移动成功'); - }else{ + } else { return $this->error('移动失败'); } } diff --git a/app/controller/admin/Plugins.php b/app/controller/admin/Plugins.php index d65cb158ff1c620b92ef2468b32c08c449787574..fcd463a91dd702d479b3b452556f881cf35ff541 100644 --- a/app/controller/admin/Plugins.php +++ b/app/controller/admin/Plugins.php @@ -17,12 +17,12 @@ class Plugins extends Backend * @var \app\model\Files */ protected $model; - public $hasSoftDel=1;//是否拥有软删除功能 + public $hasSoftDel = 1;//是否拥有软删除功能 // 获取laytp官网定义的插件分类列表 public function category() { - $url = Config::get('plugin.apiUrl') . '/plugins/category'; + $url = Config::get('plugin.apiUrl') . '/plugins/category'; $data = json_decode(Http::get($url), true)['data']; return $this->success('获取成功', $data); } @@ -30,23 +30,23 @@ class Plugins extends Backend // 查看 public function index() { - $params['page'] = $this->request->param('page', 1); - $params['limit'] = $this->request->param('limit', 10); + $params['page'] = $this->request->param('page', 1); + $params['limit'] = $this->request->param('limit', 10); $params['category_id'] = $this->request->param('category_id', 0); - $url = Config::get('plugin.apiUrl') . '/plugins/index'; - $data = json_decode(Http::get($url, $params), true)['data']; - $installed = Config::get('plugin.installed'); - foreach($data['data'] as $k=>$datum){ - if($installed && in_array($datum['alias'], $installed)){ + $url = Config::get('plugin.apiUrl') . '/plugins/index'; + $data = json_decode(Http::get($url, $params), true)['data']; + $installed = Config::get('plugin.installed'); + foreach ($data['data'] as $k => $datum) { + if ($installed && in_array($datum['alias'], $installed)) { $data['data'][$k]['installed'] = 1; - $pluginInfo = PluginsServiceFacade::getPluginInfo($datum['alias']); - if(isset($pluginInfo['version'])){ + $pluginInfo = PluginsServiceFacade::getPluginInfo($datum['alias']); + if (isset($pluginInfo['version'])) { $version = $pluginInfo['version']; - }else{ + } else { $version = '1.0.0'; } $data['data'][$k]['version'] = $version; - }else{ + } else { $data['data'][$k]['installed'] = 2; } } @@ -56,9 +56,9 @@ class Plugins extends Backend // 离线安装 - 所有的离线安装都是覆盖安装 public function offLineInstall() { - if(PluginsServiceFacade::offLineInstall()){ + if (PluginsServiceFacade::offLineInstall()) { return $this->success('安装成功'); - }else{ + } else { return $this->error(PluginsServiceFacade::getError()); } } @@ -67,10 +67,35 @@ class Plugins extends Backend public function uninstall() { $plugin = $this->request->param('plugin'); + $info = PluginsServiceFacade::getPluginInfo($plugin); - if(PluginsServiceFacade::unInstall($plugin)){ - return $this->success('卸载成功'); - }else{ + if (PluginsServiceFacade::unInstall($plugin)) { + $pluginConf = Config::get('plugin'); + foreach($pluginConf['installed'] as $k=>$installed){ + if($installed === $plugin) unset($pluginConf['installed'][$k]); + } + $pluginConf['installed'] = array_unique($pluginConf['installed']); + sort($pluginConf['installed']); + + if(isset($info['is_editor']) && $info['is_editor']){ + foreach($pluginConf['installedEditor'] as $k=>$installedEditor){ + if($installedEditor === $plugin) unset($pluginConf['installedEditor'][$k]); + } + $pluginConf['installedEditor'] = array_unique($pluginConf['installedEditor']); + sort($pluginConf['installedEditor']); + // 如果根目录下有相应的html文件,将文件内容进行替换 + $htmlFile = root_path() . 'public/admin/' . $plugin . '.html'; + if(is_file($htmlFile)){ + file_put_contents($htmlFile, '
请先到插件市场安装' . $plugin . '编辑器。
+注意:安装或卸载编辑器后,需要清空浏览器缓存才能生效
'); + } + } + + return $this->success($plugin . '插件卸载成功', [ + 'pluginConf' => $pluginConf, + 'info' => $info + ]); + } else { return $this->error(PluginsServiceFacade::getError()); } } @@ -78,21 +103,29 @@ class Plugins extends Backend // 安装 public function install() { - $plugin = $this->request->param('plugin'); + $plugin = $this->request->param('plugin'); $laytpGwToken = $this->request->param('laytpGwToken'); - if(PluginsServiceFacade::install($plugin, $laytpGwToken)){ - return $this->success('安装成功'); - }else{ - $code = PluginsServiceFacade::getError(); - $msg = '安装遇到错误'; - if($code === 1){ - $msg = '请先登录'; - } - if($code === 2){ - $msg = '请先购买插件'; + if (PluginsServiceFacade::install($plugin, $laytpGwToken)) { + // 如果是文件存储,插件安装信息,刚安装完成马上要取出来,取出来的不会是最新的文件内容 + $pluginConf = Config::get('plugin'); + $pluginConf['installed'][] = $plugin; + $pluginConf['installed'] = array_unique($pluginConf['installed']); + sort($pluginConf['installed']); + + $info = PluginsServiceFacade::getPluginInfo($plugin); + if(isset($info['is_editor']) && $info['is_editor']){ + $pluginConf['installedEditor'][] = $plugin; + $pluginConf['installedEditor'] = array_unique($pluginConf['installedEditor']); + sort($pluginConf['installedEditor']); } - return $this->error($msg, $code); + + return $this->success($plugin . '插件安装成功', [ + 'pluginConf' => $pluginConf + ]); + } else { + $error = PluginsServiceFacade::getError(); + return $this->error($error); } } } \ No newline at end of file diff --git a/app/controller/admin/Role.php b/app/controller/admin/Role.php index c33fd3b4eff25edc0dfa2a42b8673f9ecc8d46f4..a5b5538e46204cad8cbec6550623440f25660d31 100644 --- a/app/controller/admin/Role.php +++ b/app/controller/admin/Role.php @@ -4,6 +4,7 @@ namespace app\controller\admin; use laytp\controller\Backend; use laytp\library\CommonFun; +use think\facade\Config; use think\facade\Db; use think\facade\Request; @@ -21,6 +22,27 @@ class Role extends Backend $this->model = new \app\model\admin\Role(); } + /** + * 列表 + * all_data参数的值为true时,表示查询表中所有数据集,否则进行分页查询 + * @return mixed + */ + public function index() + { + $where = $this->buildSearchParams(); + $order = $this->buildOrder(); + $data = $this->model->where($where)->order($order); + $paging = $this->request->param('paging', false); + if ($paging) { + $limit = $this->request->param('limit', Config::get('paginate.limit')); + $data = $data->paginate($limit)->toArray(); + $data['data'] = $this->getSelectedData($data['data']); + } else { + $data = $data->select()->toArray(); + } + return $this->success('数据获取成功', $data); + } + /** * 添加,同时添加lt_plugin_core_role和lt_plugin_core_role_menu两个表的数据 * @return \think\response\Json @@ -35,7 +57,7 @@ class Role extends Backend $menuIds = explode(',', $post['menu_ids']); unset($post['menu_ids']); - $saveMenu = $this->model->save($post); + $saveMenu = $this->model->save($post); if (!$saveMenu) throw new \Exception('保存角色基本信息失败'); $saveAllData = []; @@ -45,7 +67,7 @@ class Role extends Backend 'admin_menu_id' => $menu_id, ]; } - $menu = new \app\model\admin\menu\Role(); + $menu = new \app\model\admin\menu\Role(); $saveAllMenu = $menu->saveAll($saveAllData); if (!$saveAllMenu) throw new \Exception('保存角色权限失败'); @@ -78,10 +100,10 @@ class Role extends Backend $menuIds = explode(',', $post['menu_ids']); unset($post['menu_ids']); $updateRes = $this->model->where('id', '=', $id)->update($post); - if(!is_numeric($updateRes)) throw new \Exception('保存角色基本信息失败'); + if (!is_numeric($updateRes)) throw new \Exception('保存角色基本信息失败'); - $delRes = \app\model\admin\menu\Role::where('admin_role_id', '=', $id)->delete(); - if(!is_numeric($delRes)) throw new \Exception('删除角色权限失败'); + $delRes = \app\model\admin\menu\Role::where('admin_role_id', '=', $id)->delete(); + if (!is_numeric($delRes)) throw new \Exception('删除角色权限失败'); $saveAllData = []; foreach ($menuIds as $menu_id) { @@ -90,8 +112,8 @@ class Role extends Backend 'admin_menu_id' => $menu_id, ]; } - $menu = new \app\model\admin\menu\Role(); - $result[] = $menu->saveAll($saveAllData); + $menu = new \app\model\admin\menu\Role(); + $menu->saveAll($saveAllData); Db::commit(); return $this->success('操作成功'); @@ -108,26 +130,25 @@ class Role extends Backend */ public function trueDel() { - $ids = (string)$this->request->param('ids'); + $ids = $this->request->param('ids'); Db::startTrans(); try { - $idsArr = explode(',', $ids); - $roles = $this->model->onlyTrashed()->where('id', 'in', $ids)->select(); + $roles = $this->model->onlyTrashed()->where('id', 'in', $ids)->select(); foreach ($roles as $key => $item) { $delRes = $item->force()->delete(); - if(!$delRes) throw new \Exception('角色删除失败'); + if (!$delRes) throw new \Exception('角色删除失败'); } - $delRes = \app\model\admin\menu\Role::where('admin_role_id', 'in', $idsArr)->delete(); - if(!is_numeric($delRes)) throw new \Exception('角色权限删除失败'); + $delRes = \app\model\admin\menu\Role::where('admin_role_id', 'in', $ids)->delete(); + if (!is_numeric($delRes)) throw new \Exception('角色权限删除失败'); - $delRes = \app\model\admin\role\User::where('admin_role_id', 'in', $idsArr)->delete(); - if(!is_numeric($delRes)) throw new \Exception('角色用户删除失败'); + $delRes = \app\model\admin\role\User::where('admin_role_id', 'in', $ids)->delete(); + if (!is_numeric($delRes)) throw new \Exception('角色用户删除失败'); Db::commit(); return $this->success('操作成功'); } catch (\Exception $e) { Db::rollback(); - return $this->error('数据库异常,操作失败'); + return $this->exceptionError($e); } } diff --git a/app/controller/admin/User.php b/app/controller/admin/User.php index 28ebb8bf99ee947d5ddc52974100af3dc3d533fd..db2381b593e731633d5b3e562ff806a8d62d58ec 100644 --- a/app/controller/admin/User.php +++ b/app/controller/admin/User.php @@ -19,294 +19,288 @@ use think\facade\Db; use think\facade\Cache; /** -* 后台管理员控制器 -*/ - + * 后台管理员控制器 + */ class User extends Backend - { +{ protected $model; //当前模型对象 - protected $noNeedLogin = [ 'login', 'logout' ]; - protected $noNeedAuth = [ 'loginInfo', 'singleEdit' ]; + protected $noNeedLogin = ['login', 'logout']; + protected $noNeedAuth = ['loginInfo', 'singleEdit']; protected function _initialize() - { + { $this->model = new \app\model\admin\User(); } - public function login() { + public function login() + { //获取表单提交数据 $param = $this->request->post(); //防止密码爆破 - $fail = Cache::get( $param[ 'username' ], 1 ); - if ( $fail >= 5 ) return $this->error( '失败次数过多,请三分钟后再试' ); + $fail = Cache::get('laytp-admin-login-num-' . $param['username'], 1); + if ($fail >= 5) return $this->error('失败次数过多,请三分钟后再试'); //验证表单提交 $validate = new Login(); - if ( !$validate->check( $param ) ) { - $param[ 'password' ] = '******'; + if (!$validate->check($param)) { + $param['password'] = '******'; //登录失败也不记录用户密码 - Log::create( [ + Log::create([ 'login_status' => 2, 'admin_id' => 0, - 'request_body' => json_encode( $param ), - 'request_header' => json_encode( $this->request->header() ), + 'request_body' => json_encode($param), + 'request_header' => json_encode($this->request->header()), 'ip' => $this->request->ip(), - 'create_time' => date( 'Y-m-d H:i:s' ), - ] ); - Cache::set( $param[ 'username' ], $fail+1, 180 ); - return $this->error( $validate->getError() ); + 'create_time' => date('Y-m-d H:i:s'), + ]); + Cache::set('laytp-admin-login-num-' . $param['username'], $fail + 1, 180); + return $this->error($validate->getError()); } //设置登录信息 - $loginUserInfo = \app\model\admin\User::where( 'username', '=', $param[ 'username' ] ) - ->with( [ 'avatar_file' ] )->field( UserServiceFacade::getAllowFields() )->findOrEmpty(); - $loginUserInfo->login_time = date( 'Y-m-d H:i:s' ); + $loginUserInfo = \app\model\admin\User::where('username', '=', $param['username']) + ->with(['avatar_file'])->field(UserServiceFacade::getAllowFields())->findOrEmpty(); + $loginUserInfo->login_time = date('Y-m-d H:i:s'); $loginUserInfo->login_ip = $this->request->ip(); $loginUserInfo->save(); - $userId = $loginUserInfo[ 'id' ]; - $token = Random::uuid(); - $loginUserInfo[ 'token' ] = $token; - Token::set( $token, $userId, 24 * 60 * 60 * 3 ); + $userId = $loginUserInfo['id']; + $token = Random::uuid(); + $loginUserInfo['token'] = $token; + Token::set($token, $userId, 24 * 60 * 60 * 3); - $param[ 'password' ] = '******'; + $param['password'] = '******'; //登录成功不记录用户密码 - Log::create( [ + Log::create([ 'login_status' => 1, 'admin_id' => $userId, - 'request_body' => json_encode( $param ), - 'request_header' => json_encode( $this->request->header() ), + 'request_body' => json_encode($param), + 'request_header' => json_encode($this->request->header()), 'ip' => $this->request->ip(), - 'create_time' => date( 'Y-m-d H:i:s' ), - ] ); - - $authList = AuthServiceFacade::getAuthList( $userId ); - return $this->success( '登录成功', [ - 'user'=>$loginUserInfo, - 'authList'=>$authList, - 'pluginConf'=>Config::get( 'plugin' ), - ] ); + 'create_time' => date('Y-m-d H:i:s'), + ]); + + $authList = AuthServiceFacade::getAuthList($userId); + return $this->success('登录成功', [ + 'user' => $loginUserInfo, + 'authList' => $authList, + 'pluginConf' => Config::get('plugin'), + ]); } - public function loginInfo() { + public function loginInfo() + { $loginUserInfo = UserServiceFacade::getUserInfo(); - $authList = AuthServiceFacade::getAuthList( $loginUserInfo[ 'id' ] ); - - return $this->success( '获取成功', [ - 'user'=>$loginUserInfo, - 'authList'=>$authList, - 'pluginConf'=>[ 'editor'=>[ 'ueditor', 'meditor' ] ], - ] ); + $authList = AuthServiceFacade::getAuthList($loginUserInfo['id']); + + return $this->success('获取成功', [ + 'user' => $loginUserInfo, + 'authList' => $authList, + 'pluginConf' => Config::get('plugin'), + 'ltVersion' => LT_VERSION, + ]); } //退出登录 - public function logout() - { - $token = $this->request->header( 'laytp-admin-token', $this->request->cookie( 'laytpAdminToken' ) ); - Token::delete( $token ); - return $this->success( '退出成功' ); + { + $token = $this->request->header('laytp-admin-token', $this->request->cookie('laytpAdminToken')); + Token::delete($token); + return $this->success('退出成功'); } //查看 - public function index() - { - $where = $this->buildSearchParams(); - $order = $this->buildOrder(); - $data = $this->model->where( $where )->with( [ 'avatar_file' ] )->order( $order ); - $allData = $this->request->param( 'all_data' ); - if ( $allData ) { - $data = $data->select(); + { + $where = $this->buildSearchParams(); + $order = $this->buildOrder(); + $data = $this->model->where($where)->order($order)->with(['avatar_file']); + $paging = $this->request->param('paging', false); + if ($paging) { + $limit = $this->request->param('limit', Config::get('paginate.limit')); + $data = $data->paginate($limit)->toArray(); + $data['data'] = $this->getSelectedData($data['data']); } else { - $limit = $this->request->param( 'limit', 10 ); - $data = $data->paginate( $limit )->toArray(); + $data = $data->select()->toArray(); } - - return $this->success( '数据获取成功', $data ); + return $this->success('数据获取成功', $data); } //添加 - public function add() - { + { Db::startTrans(); try { - $post = CommonFun::filterPostData( $this->request->post() ); + $post = CommonFun::filterPostData($this->request->post()); $validate = new Add(); - if ( !$validate->check( $post ) ) throw new \Exception( $validate->getError() ); + if (!$validate->check($post)) throw new \Exception($validate->getError()); - $post[ 'password' ] = Str::createPassword( $post[ 'password' ] ); - $saveRes = $this->model->save( $post ); - if ( !$saveRes ) throw new \Exception( '保存基础信息失败' ); + $post['password'] = Str::createPassword($post['password']); + $saveRes = $this->model->save($post); + if (!$saveRes) throw new \Exception('保存基础信息失败'); - if ( $post[ 'role_ids' ] ) { - $roleIds = explode( ',', $post[ 'role_ids' ] ); + if ($post['role_ids']) { + $roleIds = explode(',', $post['role_ids']); $data = []; - foreach ( $roleIds as $k => $v ) { - $data[] = [ 'admin_role_id' => $v, 'admin_user_id' => $this->model->id ]; + foreach ($roleIds as $k => $v) { + $data[] = ['admin_role_id' => $v, 'admin_user_id' => $this->model->id]; } - $roleUser = new \app\model\admin\role\User(); - $saveAllRes = $roleUser->saveAll( $data ); - if ( !$saveAllRes ) throw new \Exception( '保存角色信息失败' ); + $roleUser = new \app\model\admin\role\User(); + $saveAllRes = $roleUser->saveAll($data); + if (!$saveAllRes) throw new \Exception('保存角色信息失败'); } Db::commit(); - return $this->success( '操作成功' ); - } catch ( \Exception $e ) { + return $this->success('操作成功'); + } catch (\Exception $e) { Db::rollback(); - return $this->error( '数据库异常,操作失败' ); + return $this->error('数据库异常,操作失败'); } } //查看详情 - public function info() - { - $id = $this->request->param( 'id' ); - $info = $this->model->with( [ 'role_ids', 'avatar_file' ] )->findOrEmpty( $id )->toArray(); - $data = \app\resource\admin\User::info( $info ); - return $this->success( '获取成功', $data ); + { + $id = $this->request->param('id'); + $info = $this->model->with(['role_ids', 'avatar_file'])->findOrEmpty($id)->toArray(); + $data = \app\resource\admin\User::info($info); + return $this->success('获取成功', $data); } //编辑 - public function edit() - { + { Db::startTrans(); try { - $post = CommonFun::filterPostData( $this->request->post() ); - $user = $this->model->findOrEmpty( $post[ 'id' ] ); - if ( !$user ) throw new \Exception( 'id参数错误' ); + $post = CommonFun::filterPostData($this->request->post()); + $user = $this->model->findOrEmpty($post['id']); + if (!$user) throw new \Exception('id参数错误'); $validate = new Edit(); - if ( !$validate->check( $post ) ) throw new \Exception( $validate->getError() ); - if ( $post[ 'password' ] ) { - $post[ 'password' ] = Str::createPassword( $post[ 'password' ] ); + if (!$validate->check($post)) throw new \Exception($validate->getError()); + if ($post['password']) { + $post['password'] = Str::createPassword($post['password']); } else { - unset( $post[ 'password' ] ); - unset( $post[ 're_password' ] ); + unset($post['password']); + unset($post['re_password']); } - $updateRes = $user->update( $post ); - if ( !$updateRes ) throw new \Exception( '保存基本信息失败' ); + $updateRes = $user->update($post); + if (!$updateRes) throw new \Exception('保存基本信息失败'); $userRole = new \app\model\admin\role\User(); - $deleteRes = $userRole->where( 'admin_user_id', '=', $post[ 'id' ] )->delete(); - if ( !is_numeric( $deleteRes ) ) throw new \Exception( '删除用户角色失败' ); + $deleteRes = $userRole->where('admin_user_id', '=', $post['id'])->delete(); + if (!is_numeric($deleteRes)) throw new \Exception('删除用户角色失败'); - if ( $post[ 'role_ids' ] ) { - $roleIds = explode( ',', $post[ 'role_ids' ] ); + if ($post['role_ids']) { + $roleIds = explode(',', $post['role_ids']); $data = []; - foreach ( $roleIds as $k => $v ) { - $data[] = [ 'admin_role_id' => $v, 'admin_user_id' => $user->id ]; + foreach ($roleIds as $k => $v) { + $data[] = ['admin_role_id' => $v, 'admin_user_id' => $user->id]; } - $saveAllRes = $userRole->saveAll( $data ); - if ( !$saveAllRes ) throw new \Exception( '保存用户角色失败' ); + $saveAllRes = $userRole->saveAll($data); + if (!$saveAllRes) throw new \Exception('保存用户角色失败'); } Db::commit(); - return $this->success( '操作成功' ); - } catch ( \Exception $e ) { + return $this->success('操作成功'); + } catch (\Exception $e) { Db::rollback(); - return $this->exceptionError( $e ); + return $this->exceptionError($e); } } //修改个人资料 - - public function singleEdit() { - $post = CommonFun::filterPostData( $this->request->post() ); + public function singleEdit() + { + $post = CommonFun::filterPostData($this->request->post()); $validate = new singleEdit(); - if ( !$validate->check( $post ) ) { - return $this->error( $validate->getError() ); + if (!$validate->check($post)) { + return $this->error($validate->getError()); } - if ( !$post[ 'password' ] ) { - unset( $post[ 'password' ] ); + if (!$post['password']) { + unset($post['password']); } else { - $post[ 'password' ] = Str::createPassword( $post[ 'password' ] ); + $post['password'] = Str::createPassword($post['password']); } - $user = $this->model->with( [ 'avatar_file' ] )->find( $post[ 'id' ] ); - if ( !$user ) { - return $this->error( 'ID参数错误' ); + $user = $this->model->with(['avatar_file'])->find($post['id']); + if (!$user) { + return $this->error('ID参数错误'); } - $res = $user->update( $post ); - if ( $res ) { - return $this->success( '操作成功' ); + $res = $user->update($post); + if ($res) { + return $this->success('操作成功'); } else { - return $this->error( '操作失败' ); + return $this->error('操作失败'); } } //删除 - public function del() - { - $ids = array_filter( $this->request->param( 'ids' ) ); - if ( !$ids ) { - return $this->error( '参数ids不能为空' ); + { + $ids = array_filter($this->request->param('ids')); + if (!$ids) { + return $this->error('参数ids不能为空'); } - if ( in_array( 1, $ids ) ) { - return $this->error( '不允许删除初始化用户' ); + if (in_array(1, $ids)) { + return $this->error('不允许删除初始化用户'); } try { - if ( $this->model->destroy( $ids ) ) { - return $this->success( '数据删除成功' ); + if ($this->model->destroy($ids)) { + return $this->success('数据删除成功'); } else { - return $this->error( '数据删除失败' ); + return $this->error('数据删除失败'); } - } catch ( \Exception $e ) { - return $this->exceptionError( $e ); + } catch (\Exception $e) { + return $this->exceptionError($e); } } //设置状态 - public function setStatus() - { - $id = $this->request->post( 'id' ); - $fieldVal = $this->request->post( 'field_val' ); - $isRecycle = $this->request->post( 'is_recycle' ); - $update[ 'status' ] = $fieldVal; + { + $id = $this->request->post('id'); + $fieldVal = $this->request->post('field_val'); + $isRecycle = $this->request->post('is_recycle'); + $update['status'] = $fieldVal; try { - if ( $isRecycle ) { - $updateRes = $this->model->onlyTrashed()->where( 'id', '=', $id )->update( $update ); + if ($isRecycle) { + $updateRes = $this->model->onlyTrashed()->where('id', '=', $id)->update($update); } else { - $updateRes = $this->model->where( 'id', '=', $id )->update( $update ); + $updateRes = $this->model->where('id', '=', $id)->update($update); } - if ( $updateRes ) { - return $this->success( '操作成功' ); - } else if ( $updateRes === 0 ) { - return $this->success( '未作修改' ); + if ($updateRes) { + return $this->success('操作成功'); + } else if ($updateRes === 0) { + return $this->success('未作修改'); } else { - return $this->error( '操作失败' ); + return $this->error('操作失败'); } - } catch ( \Exception $e ) { - return $this->error( '数据库异常,操作失败' ); + } catch (\Exception $e) { + return $this->error('数据库异常,操作失败'); } } //设置是否为超管 - public function setIsSuperManager() - { - $id = $this->request->post( 'id' ); - $fieldVal = $this->request->post( 'field_val' ); - $isRecycle = $this->request->post( 'is_recycle' ); - $update[ 'is_super_manager' ] = $fieldVal; + { + $id = $this->request->post('id'); + $fieldVal = $this->request->post('field_val'); + $isRecycle = $this->request->post('is_recycle'); + $update['is_super_manager'] = $fieldVal; try { - if ( $isRecycle ) { - $updateRes = $this->model->onlyTrashed()->where( 'id', '=', $id )->update( $update ); + if ($isRecycle) { + $updateRes = $this->model->onlyTrashed()->where('id', '=', $id)->update($update); } else { - $updateRes = $this->model->where( 'id', '=', $id )->update( $update ); + $updateRes = $this->model->where('id', '=', $id)->update($update); } - if ( $updateRes ) { - return $this->success( '操作成功' ); - } else if ( $updateRes === 0 ) { - return $this->success( '未作修改' ); + if ($updateRes) { + return $this->success('操作成功'); + } else if ($updateRes === 0) { + return $this->success('未作修改'); } else { - return $this->error( '操作失败' ); + return $this->error('操作失败'); } - } catch ( \Exception $e ) { - return $this->error( '数据库异常,操作失败' ); + } catch (\Exception $e) { + return $this->error('数据库异常,操作失败'); } } } \ No newline at end of file diff --git a/app/controller/admin/action/Log.php b/app/controller/admin/action/Log.php index ea163fcf433d39c8d6968f3fbb5efcc557d1df26..2155aecc052e8aa15130abf44984288c1b2e9125 100644 --- a/app/controller/admin/action/Log.php +++ b/app/controller/admin/action/Log.php @@ -3,48 +3,45 @@ namespace app\controller\admin\action; use laytp\controller\Backend; -use laytp\library\CommonFun; +use think\facade\Config; /** * 后台操作日志 */ class Log extends Backend { - /** * admin_action_log模型对象 * @var \app\model\admin\action\Log */ protected $model; - protected $hasSoftDel=0;//是否拥有软删除功能 + protected $hasSoftDel = 0;//是否拥有软删除功能 protected $noNeedLogin = []; // 无需登录即可请求的方法 - protected $noNeedAuth = ['index', 'info']; // 无需鉴权即可请求的方法 + protected $noNeedAuth = ['index', 'info']; // 无需鉴权即可请求的方法 public function _initialize() { $this->model = new \app\model\admin\action\Log(); } - //查看和搜索列表 - public function index(){ - $where = $this->buildSearchParams(); - $order = $this->buildOrder(); - $allData = $this->request->param('all_data'); - $data = $this->model->where($where)->order($order)->with(['adminUser']); - if($allData){ + public function index() + { + $where = $this->buildSearchParams(); + $order = $this->buildOrder(); + $data = $this->model->where($where)->order($order)->with(['adminUser']); + $paging = $this->request->param('paging', false); + if ($paging) { + $limit = $this->request->param('limit', Config::get('paginate.limit')); + $data = $data->paginate($limit)->toArray(); + $data['data'] = $this->getSelectedData($data['data']); + } else { $data = $data->select()->toArray(); - }else{ - $limit = $this->request->param('limit', 10); - $data = $data->paginate($limit)->toArray(); } return $this->success('数据获取成功', $data); } - - - //查看详情 public function info() { @@ -53,19 +50,17 @@ class Log extends Backend return $this->success('获取成功', $info); } - - - //回收站 - public function recycle(){ + public function recycle() + { $where = $this->buildSearchParams(); $order = $this->buildOrder(); - $limit = $this->request->param('limit', 10); + $limit = $this->request->param('limit', Config::get('paginate.limit')); $data = $this->model->onlyTrashed() - ->with(['adminUser']) - ->order($order)->where($where)->paginate($limit)->toArray(); + ->with(['adminUser']) + ->order($order)->where($where)->paginate($limit)->toArray(); return $this->success('回收站数据获取成功', $data); } - + } diff --git a/app/controller/admin/api/Log.php b/app/controller/admin/api/Log.php index b787a8a4110ce3443bdb68fa4a428b86a09a9d9a..a387bea82d8173017c90f39b8ed5c2c0f8f52697 100644 --- a/app/controller/admin/api/Log.php +++ b/app/controller/admin/api/Log.php @@ -3,7 +3,7 @@ namespace app\controller\admin\api; use laytp\controller\Backend; -use laytp\library\CommonFun; +use think\facade\Config; /** * Api请求日志 @@ -16,35 +16,16 @@ class Log extends Backend * @var \app\model\api\Log */ protected $model; - protected $hasSoftDel=0;//是否拥有软删除功能 + protected $hasSoftDel = 0;//是否拥有软删除功能 protected $noNeedLogin = []; // 无需登录即可请求的方法 - protected $noNeedAuth = ['index', 'info']; // 无需鉴权即可请求的方法 + protected $noNeedAuth = ['index', 'info']; // 无需鉴权即可请求的方法 public function _initialize() { $this->model = new \app\model\api\Log(); } - - //查看和搜索列表 - public function index(){ - $where = $this->buildSearchParams(); - $order = $this->buildOrder(); - $allData = $this->request->param('all_data'); - $data = $this->model->where($where)->order($order); - if($allData){ - $data = $data->select()->toArray(); - }else{ - $limit = $this->request->param('limit', 10); - $data = $data->paginate($limit)->toArray(); - } - return $this->success('数据获取成功', $data); - } - - - - //查看详情 public function info() { @@ -53,9 +34,5 @@ class Log extends Backend return $this->success('获取成功', $info); } - - - - } diff --git a/app/controller/admin/api/User.php b/app/controller/admin/api/User.php deleted file mode 100644 index c824957eff72c59efe7e3750202220775894e52b..0000000000000000000000000000000000000000 --- a/app/controller/admin/api/User.php +++ /dev/null @@ -1,226 +0,0 @@ -model = new \app\model\User(); - } - - //查看 - public function index() - { - $where = $this->buildSearchParams(); - $order = $this->buildOrder(); - $data = $this->model->where($where)->with(['avatar_file'])->field(UserServiceFacade::getAllowFields())->order($order); - $allData = $this->request->param('all_data'); - if ($allData) { - $data = $data->select(); - } else { - $limit = $this->request->param('limit', 10); - $data = $data->paginate($limit)->toArray(); - } - - return $this->success('数据获取成功', $data); - } - - //添加 - public function add() - { - Db::startTrans(); - try { - $post = CommonFun::filterPostData($this->request->post()); - - $validate = new Add(); - if (!$validate->check($post)) throw new \Exception($validate->getError()); - - $post['password'] = Str::createPassword($post['password']); - $result = $this->model->save($post); - if(!$result) throw new \Exception("添加失败"); - - if ($post['role_ids']) { - $roleIds = explode(',', $post['role_ids']); - $data = []; - foreach ($roleIds as $k => $v) { - $data[] = ['admin_role_id' => $v, 'admin_user_id' => $this->model->id]; - } - $roleUser = new \app\model\admin\role\User(); - $result = $roleUser->saveAll($data); - if(!$result) throw new \Exception("添加失败"); - } - - Db::commit(); - return $this->success('添加成功'); - } catch (\Exception $e) { - Db::rollback(); - return $this->exceptionError($e); - } - } - - //查看详情 - public function info() - { - $id = $this->request->param('id'); - $info = $this->model->with(['role_ids','avatar_file'])->findOrEmpty($id)->toArray(); - $data = \app\resource\admin\User::info($info); - return $this->success('获取成功', $data); - } - - //编辑 - public function edit() - { - Db::startTrans(); - try { - $post = CommonFun::filterPostData($this->request->post()); - $user = $this->model->findOrEmpty($post['id']); - if (!$user) throw new \Exception("id参数错误"); - - $validate = new Edit(); - if (!$validate->check($post)) throw new \Exception($validate->getError()); - - if ($post['password']) { - $post['password'] = Str::createPassword($post['password']); - } else { - unset($post['password']); - unset($post['re_password']); - } - $updateUser = $user->update($post); - if (!$updateUser) throw new \Exception("用户基本信息保存失败"); - - $userRole = new \app\model\admin\role\User(); - $deleteRes = $userRole->where("admin_user_id", '=', $post['id'])->delete(); - if (!is_numeric($deleteRes)) throw new \Exception("用户角色删除失败"); - - if ($post['role_ids']) { - $roleIds = explode(',', $post['role_ids']); - $data = []; - foreach ($roleIds as $k => $v) { - $data[] = ['admin_role_id' => $v, 'admin_user_id' => $user->id]; - } - - $saveAllRole = $userRole->saveAll($data); - if (!$saveAllRole) throw new \Exception("用户角色保存失败"); - } - - Db::commit(); - return $this->success('操作成功'); - } catch (\Exception $e) { - Db::rollback(); - return $this->exceptionError($e); - } - } - - //修改个人资料 - public function singleEdit(){ - $post = CommonFun::filterPostData($this->request->post()); - $validate = new singleEdit(); - if(!$validate->check($post)){ - return $this->error($validate->getError()); - } - if(!$post['password']){ - unset($post['password']); - }else{ - $post['password'] = Str::createPassword($post['password']); - } - $user = $this->model->with(['avatar_file'])->find($post['id']); - if (!$user) { - return $this->error('ID参数错误'); - } - $res = $user->update($post); - if($res){ - return $this->success('操作成功'); - }else{ - return $this->error('操作失败'); - } - } - - //删除 - public function del() - { - $ids = array_filter($this->request->param('ids')); - if (!$ids) { - return $this->error('参数ids不能为空'); - } - if (in_array(1, $ids)) { - return $this->error('不允许删除初始化用户'); - } - try{ - if ($this->model->destroy($ids)) { - return $this->success('数据删除成功'); - } else { - return $this->error('数据删除失败'); - } - }catch (\Exception $e){ - return $this->exceptionError($e); - } - } - - //设置状态 - public function setStatus() - { - $id = $this->request->post('id'); - $fieldVal = $this->request->post('field_val'); - $isRecycle = $this->request->post('is_recycle'); - $update['status'] = $fieldVal; - try { - if($isRecycle) { - $updateRes = $this->model->onlyTrashed()->where('id', '=', $id)->update($update); - } else { - $updateRes = $this->model->where('id', '=', $id)->update($update); - } - if ($updateRes) { - return $this->success('操作成功'); - } else if ($updateRes === 0) { - return $this->success('未作修改'); - } else { - return $this->error('操作失败'); - } - } catch (\Exception $e) { - return $this->error('数据库异常,操作失败'); - } - } - - //设置是否为超管 - public function setIsSuperManager() - { - $id = $this->request->post('id'); - $fieldVal = $this->request->post('field_val'); - $isRecycle = $this->request->post('is_recycle'); - $update['is_super_manager'] = $fieldVal; - try { - if($isRecycle) { - $updateRes = $this->model->onlyTrashed()->where('id', '=', $id)->update($update); - } else { - $updateRes = $this->model->where('id', '=', $id)->update($update); - } - if ($updateRes) { - return $this->success('操作成功'); - } else if ($updateRes === 0) { - return $this->success('未作修改'); - } else { - return $this->error('操作失败'); - } - } catch (\Exception $e) { - return $this->error('数据库异常,操作失败'); - } - } -} \ No newline at end of file diff --git a/app/controller/admin/files/Category.php b/app/controller/admin/files/Category.php index 7edd49867ab85a519dd86a02946e524acf88c596..ffef8c1df22c9acebeb49ff4e75322c322865d58 100644 --- a/app/controller/admin/files/Category.php +++ b/app/controller/admin/files/Category.php @@ -4,6 +4,7 @@ namespace app\controller\admin\files; use laytp\controller\Backend; use laytp\library\Tree; +use think\facade\Config; /** * 附件分类管理 @@ -15,27 +16,35 @@ class Category extends Backend * @var \app\model\files\Category */ protected $model; - public $hasSoftDel=1;//是否拥有软删除功能 - public $orderRule=['sort' => 'DESC','id'=>'ASC']; + public $hasSoftDel = 1;//是否拥有软删除功能 + public $orderRule = ['sort' => 'DESC', 'id' => 'ASC']; public function initialize() { parent::initialize(); $this->model = new \app\model\files\Category(); } - + //查看 - public function index(){ - $where = $this->buildSearchParams(); - $order = $this->buildOrder(); - $sourceData = $this->model->order($order)->where($where)->select()->toArray(); - $isTree = $this->request->param('is_tree'); - if($isTree){ + public function index() + { + $where = $this->buildSearchParams(); + $order = $this->buildOrder(); + $sourceData = $this->model->order($order)->where($where); + $isTree = $this->request->param('is_tree'); + if ($isTree) { $menuTreeObj = Tree::instance(); - $menuTreeObj->init($sourceData); + $menuTreeObj->init($sourceData->select()->toArray()); $data = $menuTreeObj->getRootTrees(); - }else{ - $data = $sourceData; + } else { + $paging = $this->request->param('paging', false); + if ($paging) { + $limit = $this->request->param('limit', Config::get('paginate.limit')); + $data = $sourceData->paginate($limit)->toArray(); + $data['data'] = $this->getSelectedData($data['data']); + } else { + $data = $sourceData->select()->toArray(); + } } return $this->success('获取成功', $data); } @@ -49,7 +58,7 @@ class Category extends Backend } $sourceData = $this->model->select()->toArray(); - $treeLib = Tree::instance(); + $treeLib = Tree::instance(); $treeLib->init($sourceData); $childIds = $treeLib->getChildIds($ids); @@ -59,27 +68,28 @@ class Category extends Backend return $this->error('数据删除失败'); } } - + //回收站 - public function recycle(){ + public function recycle() + { $where = $this->buildSearchParams(); $order = $this->buildOrder(); - $limit = $this->request->param('limit', 10); + $limit = $this->request->param('limit', Config::get('paginate.limit')); $data = $this->model->onlyTrashed() - ->with(['parent']) - ->order($order)->where($where)->paginate($limit)->toArray(); + ->with(['parent']) + ->order($order)->where($where)->paginate($limit)->toArray(); return $this->success('回收站数据获取成功', $data); } - + //设置排序 public function setSort() { - $id = $this->request->post('id'); - $fieldVal = $this->request->post('field_val'); - $isRecycle = $this->request->post('is_recycle'); + $id = $this->request->post('id'); + $fieldVal = $this->request->post('field_val'); + $isRecycle = $this->request->post('is_recycle'); $update['sort'] = $fieldVal; try { - if($isRecycle) { + if ($isRecycle) { $updateRes = $this->model->onlyTrashed()->where('id', '=', $id)->update($update); } else { $updateRes = $this->model->where('id', '=', $id)->update($update); diff --git a/app/controller/admin/login/Log.php b/app/controller/admin/login/Log.php index 4a1815181c6a02911919f3686d8b0c133082db22..ea4875ddcc6146d8d48d5631b1a92486e678622c 100644 --- a/app/controller/admin/login/Log.php +++ b/app/controller/admin/login/Log.php @@ -4,6 +4,7 @@ namespace app\controller\admin\login; use laytp\controller\Backend; use laytp\library\CommonFun; +use think\facade\Config; /** * 后台登录日志 @@ -16,35 +17,39 @@ class Log extends Backend * @var \app\model\admin\login\Log */ protected $model; - protected $hasSoftDel=0;//是否拥有软删除功能 + protected $hasSoftDel = 0;//是否拥有软删除功能 protected $noNeedLogin = []; // 无需登录即可请求的方法 - protected $noNeedAuth = ['index', 'info']; // 无需鉴权即可请求的方法 + protected $noNeedAuth = ['index', 'info']; // 无需鉴权即可请求的方法 public function _initialize() { $this->model = new \app\model\admin\login\Log(); } - + //查看和搜索列表 - public function index(){ - $where = $this->buildSearchParams(); - $order = $this->buildOrder(); - $allData = $this->request->param('all_data'); - $data = $this->model->where($where)->order($order)->with(['adminUser']); - if($allData){ + + /** + * @throws \think\db\exception\DbException + */ + public function index() + { + $where = $this->buildSearchParams(); + $order = $this->buildOrder(); + $data = $this->model->where($where)->order($order)->with(['adminUser']); + $paging = $this->request->param('paging', false); + if ($paging) { + $limit = $this->request->param('limit', Config::get('paginate.limit')); + $data = $data->paginate($limit)->toArray(); + $data['data'] = $this->getSelectedData($data['data']); + } else { $data = $data->select()->toArray(); - }else{ - $limit = $this->request->param('limit', 10); - $data = $data->paginate($limit)->toArray(); } return $this->success('数据获取成功', $data); } - - //查看详情 public function info() { @@ -53,19 +58,19 @@ class Log extends Backend return $this->success('获取成功', $info); } - - //回收站 - public function recycle(){ + public function recycle() + { $where = $this->buildSearchParams(); $order = $this->buildOrder(); - $limit = $this->request->param('limit', 10); + $limit = $this->request->param('limit', Config::get('paginate.limit')); $data = $this->model->onlyTrashed() - ->with(['adminUser']) - ->order($order)->where($where)->paginate($limit)->toArray(); + ->where($where) + ->with(['adminUser']) + ->order($order)->paginate($limit)->toArray(); return $this->success('回收站数据获取成功', $data); } - + } diff --git a/app/controller/admin/plugin/ali/Sms.php b/app/controller/admin/plugin/ali/Sms.php deleted file mode 100644 index af84c36fa4be7ab7a51b6842fb95941d86c7792c..0000000000000000000000000000000000000000 --- a/app/controller/admin/plugin/ali/Sms.php +++ /dev/null @@ -1,61 +0,0 @@ -model = new \app\model\plugin\ali\Sms(); - } - - - //查看和搜索列表 - public function index(){ - $where = $this->buildSearchParams(); - $order = $this->buildOrder(); - $allData = $this->request->param('all_data'); - $data = $this->model->where($where)->order($order); - if($allData){ - $data = $data->select()->toArray(); - }else{ - $limit = $this->request->param('limit', 10); - $data = $data->paginate($limit)->toArray(); - } - return $this->success('数据获取成功', $data); - } - - - - - //查看详情 - public function info() - { - $id = $this->request->param('id'); - $info = $this->model->find($id); - return $this->success('获取成功', $info); - } - - - - - - -} diff --git a/app/controller/api/Common.php b/app/controller/api/Common.php index dd0c726b154503c61cabd687f78de2240823bf73..8087a87ea8757ada63ef1fc339ad0b5f5c69e235 100644 --- a/app/controller/api/Common.php +++ b/app/controller/api/Common.php @@ -88,14 +88,14 @@ class Common extends Api $inputValue = ""; //上传至七牛云 if ($uploadType == 'qiniu-kodo') { - if(ConfServiceFacade::get('qiniuKodo.conf.switch') != 1){ + if(ConfServiceFacade::get('plugin.qiniu_kodo.switch') != 1){ return $this->error('未开启七牛云KODO存储,请到七牛云KODO配置中开启'); } $kodoConf = [ - 'accessKey' => ConfServiceFacade::get('qiniuKodo.conf.accessKey'), - 'secretKey' => ConfServiceFacade::get('qiniuKodo.conf.secretKey'), - 'bucket' => ConfServiceFacade::get('qiniuKodo.conf.bucket'), - 'domain' => ConfServiceFacade::get('qiniuKodo.conf.domain'), + 'accessKey' => ConfServiceFacade::get('plugin.qiniu_kodo.accessKey'), + 'secretKey' => ConfServiceFacade::get('plugin.qiniu_kodo.secretKey'), + 'bucket' => ConfServiceFacade::get('plugin.qiniu_kodo.bucket'), + 'domain' => ConfServiceFacade::get('plugin.qiniu_kodo.domain'), ]; $kodo = Kodo::instance(); $kodoRes = $kodo->upload($file->getPathname(), $object, $kodoConf); @@ -108,15 +108,15 @@ class Common extends Api //上传至阿里云 if ($uploadType == 'ali-oss') { - if(ConfServiceFacade::get('system.aliOss.switch') != 1){ + if(ConfServiceFacade::get('plugin.ali_oss.switch') != 1){ return $this->error('未开启阿里云OSS存储,请到阿里云OSS配置中开启'); } $ossConf = [ - 'accessKeyID' => ConfServiceFacade::get('aliOss.conf.accessKeyID'), - 'accessKeySecret' => ConfServiceFacade::get('aliOss.conf.accessKeySecret'), - 'bucket' => ConfServiceFacade::get('aliOss.conf.bucket'), - 'endpoint' => ConfServiceFacade::get('aliOss.conf.endpoint'), - 'domain' => ConfServiceFacade::get('aliOss.conf.domain'), + 'accessKeyID' => ConfServiceFacade::get('plugin.ali_oss.accessKeyID'), + 'accessKeySecret' => ConfServiceFacade::get('plugin.ali_oss.accessKeySecret'), + 'bucket' => ConfServiceFacade::get('plugin.ali_oss.bucket'), + 'endpoint' => ConfServiceFacade::get('plugin.ali_oss.endpoint'), + 'domain' => ConfServiceFacade::get('plugin.ali_oss.domain'), ]; $oss = Oss::instance(); $ossUploadRes = $oss->upload($file->getPathname(), $object, $ossConf); @@ -188,7 +188,7 @@ class Common extends Api */ /*@formatter:on*/ public function sendEmailCode(){ - $emailStatus = ConfServiceFacade::get('system.email.status'); + $emailStatus = ConfServiceFacade::get('plugin.email.status'); if($emailStatus !== 'open'){ return $this->error('邮件功能未开启,请先到插件市场安装邮件插件,并在[邮件配置]中开启'); } @@ -229,7 +229,7 @@ class Common extends Api */ /*@formatter:on*/ public function checkEmailCode(){ - $emailStatus = ConfServiceFacade::get('system.email.status'); + $emailStatus = ConfServiceFacade::get('plugin.email.status'); if($emailStatus !== 'open'){ return $this->error('邮件功能未开启,请先到插件市场安装邮件插件,并在[邮件配置]中开启'); } @@ -268,7 +268,7 @@ class Common extends Api */ /*@formatter:on*/ public function sendMobileCode(){ - $aliSmsStatus = ConfServiceFacade::groupGet('aliSms.conf'); + $aliSmsStatus = ConfServiceFacade::groupGet('plugin.ali_sms'); if(!$aliSmsStatus){ return $this->error('请先到插件市场安装阿里云手机短信插件,并进行相关配置'); } diff --git a/app/controller/api/User.php b/app/controller/api/Member.php similarity index 89% rename from app/controller/api/User.php rename to app/controller/api/Member.php index b4f280381af67ad2c85e0edf4c6835b7ee5ae98d..70c4be4226e5ebb5f5aef97b3d55db188f2011ff 100644 --- a/app/controller/api/User.php +++ b/app/controller/api/Member.php @@ -2,7 +2,7 @@ namespace app\controller\api; -use app\service\api\UserServiceFacade; +use app\service\api\MemberServiceFacade; use app\validate\api\user\EmailLogin; use app\validate\api\user\EmailReg; use laytp\controller\Api; @@ -11,7 +11,7 @@ use laytp\controller\Api; * 会员相关 * @ApiWeigh (90) */ -class User extends Api +class Member extends Api { public $noNeedLogin = [ 'emailReg', @@ -53,7 +53,7 @@ class User extends Api /*@formatter:on*/ public function info() { - return $this->success('获取成功', UserServiceFacade::getUserInfo()); + return $this->success('获取成功', MemberServiceFacade::getUserInfo()); } /*@formatter:off*/ @@ -61,7 +61,7 @@ class User extends Api * @ApiTitle (邮箱注册) * @ApiSummary (邮箱注册) * @ApiMethod (POST) - * @ApiRoute (/api.user/emailReg) + * @ApiRoute (/api.member/emailReg) * @ApiParams (name="email", type="string", required="true", description="邮箱") * @ApiParams (name="password", type="string", required="true", description="密码") * @ApiParams (name="repassword", type="string", required="true", description="重复密码") @@ -88,10 +88,10 @@ class User extends Api $validate = new EmailReg(); if ($validate->check($param)) { - if (UserServiceFacade::emailRegLogin($param)) { - return $this->success('注册成功', ['token' => UserServiceFacade::getToken()]); + if (MemberServiceFacade::emailRegLogin($param)) { + return $this->success('注册成功', ['token' => MemberServiceFacade::getToken()]); } else { - return $this->error('注册失败,' . UserServiceFacade::getError()); + return $this->error('注册失败,' . MemberServiceFacade::getError()); } } else { return $this->error('注册失败,' . $validate->getError()); @@ -103,7 +103,7 @@ class User extends Api * @ApiTitle (邮箱密码登录) * @ApiSummary (邮箱密码登录) * @ApiMethod (POST) - * @ApiRoute (/api.user/emailLogin) + * @ApiRoute (/api.member/emailLogin) * @ApiParams (name="email", type="string", required="true", description="邮箱") * @ApiParams (name="password", type="string", required="true", description="密码") * @ApiReturnParams (name="code", type="integer", description="接口返回码.0=常规正确码,表示常规操作成功;1=常规错误码,客户端仅需提示msg;其他返回码与具体业务相关。框架实现了的唯一其他返回码:10401,前端需要跳转至登录界面。在一个复杂的交互过程中,你可能需要自行定义其他返回码") @@ -128,10 +128,10 @@ class User extends Api $validate = new EmailLogin(); if ($validate->check($param)) { - if (UserServiceFacade::emailRegLogin($param)) { - return $this->success('登录成功', ['token' => UserServiceFacade::getToken()]); + if (MemberServiceFacade::emailRegLogin($param)) { + return $this->success('登录成功', ['token' => MemberServiceFacade::getToken()]); } else { - return $this->error('登录失败,' . UserServiceFacade::getError()); + return $this->error('登录失败,' . MemberServiceFacade::getError()); } } else { return $this->error('登录失败,' . $validate->getError()); @@ -143,7 +143,7 @@ class User extends Api * @ApiTitle (注销登录) * @ApiSummary (注销登录信息) * @ApiMethod (GET) - * @ApiRoute (/api.user/logout) + * @ApiRoute (/api.member/logout) * @ApiHeaders (name="token", type="string", required="true", description="用户登录后得到的Token") * @ApiReturnParams (name="code", type="integer", description="接口返回码.0=常规正确码,表示常规操作成功;1=常规错误码,客户端仅需提示msg;其他返回码与具体业务相关。框架实现了的唯一其他返回码:10401,前端需要跳转至登录界面。在一个复杂的交互过程中,你可能需要自行定义其他返回码") * @ApiReturnParams (name="msg", type="string", description="返回描述") @@ -160,10 +160,10 @@ class User extends Api /*@formatter:on*/ public function logout() { - if (UserServiceFacade::logout()) { + if (MemberServiceFacade::logout()) { return $this->success('注销成功'); } else { - return $this->error(UserServiceFacade::getError()); + return $this->error(MemberServiceFacade::getError()); } } } \ No newline at end of file diff --git a/app/exception/Http.php b/app/exception/Http.php index 361c92ea66f893ac4b53cb9238d7bbef401f53b2..f5f57902549bafdf0e4cb386433e3b66c2076d49 100644 --- a/app/exception/Http.php +++ b/app/exception/Http.php @@ -80,7 +80,7 @@ class Http extends Handle protected function changeToUtf8(array $data): array { foreach ($data as $key => $value) { - $data[$key] = mb_convert_encoding($value, "UTF-8", "GBK, GBK2312"); + $data[$key] = is_array($value)?$this->changeToUtf8($value):mb_convert_encoding($value, "UTF-8", mb_detect_encoding($value)); } return $data; diff --git a/app/middleware/AllowCrossDomain.php b/app/middleware/AllowCrossDomain.php index ca7f9e36db8e266d67ab625f51ee440d0476c812..e8c582d3eb7bd9438c81ceca49c67654484b5580 100644 --- a/app/middleware/AllowCrossDomain.php +++ b/app/middleware/AllowCrossDomain.php @@ -21,11 +21,25 @@ class AllowCrossDomain extends BaseMiddleware public function handle($request, \Closure $next) { $header = [ - 'Access-Control-Allow-Origin' => '*', - 'Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, DELETE, OPTIONS', - 'Access-Control-Allow-Headers' => '*', + 'Access-Control-Allow-Origin' => '*', + 'Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers' => '*', ]; + if (env('CROS_RESTRICT', 'false') == 'true') { + $header['Access-Control-Allow-Origin'] = ''; + foreach (explode(',', env('DOMAIN.CROS_ORIGIN', '')) as $domain) { + if ($request->header('origin') == $domain) { + $header['Access-Control-Allow-Origin'] = $domain; + break; + } + } + } + + // Chromium Options 头,实际不传参,多域名部署时需要拦截 + if ($request->isOptions()) + return response('', 200, $header); + return $next($request)->header($header); } } \ No newline at end of file diff --git a/app/middleware/admin/Auth.php b/app/middleware/admin/Auth.php index 5e9adfb5f3536f04ed2e144891a61d535e26edfe..1553d8b9fdbbca0ad6a6e5c411673d83bb4f0608 100644 --- a/app/middleware/admin/Auth.php +++ b/app/middleware/admin/Auth.php @@ -18,7 +18,10 @@ class Auth extends BaseMiddleware public function handle(Request $request, \Closure $next) { if (AuthServiceFacade::needLogin()) { - $initUser = UserServiceFacade::init($request->header('laytp-admin-token', $request->cookie('laytpAdminToken'))); + // 为了兼容windows和linux获取header中驼峰命名的参数修改 + // windows中,使用原样获取,比如laytpAdminToken + // linux中,驼峰需要转换成短横杆获取,比如laytpAdminToken要使用laytp-admin-token来获取 + $initUser = UserServiceFacade::init($request->header('laytp-admin-token', $request->header('laytpAdminToken', $request->cookie('laytpAdminToken')))); if (!$initUser) return $this->error(UserServiceFacade::getError(), 10401); if (!UserServiceFacade::isLogin()) { if ($request->isAjax()) { diff --git a/app/middleware/api/Auth.php b/app/middleware/api/Auth.php index 336931e358fe5d1b37ebfe05816ded9cc40547e1..c22a8f90d87f7fa6125a0a0ede7e050271b7ab12 100644 --- a/app/middleware/api/Auth.php +++ b/app/middleware/api/Auth.php @@ -3,7 +3,7 @@ namespace app\middleware\api; use app\service\api\AuthServiceFacade; -use app\service\api\UserServiceFacade; +use app\service\api\MemberServiceFacade; use laytp\BaseMiddleware; use think\Request; @@ -18,14 +18,14 @@ class Auth extends BaseMiddleware public function handle(Request $request, \Closure $next) { if (AuthServiceFacade::needLogin()) { - $initUser = UserServiceFacade::init($request->header('token')); - if (!$initUser) return $this->error(UserServiceFacade::getError(), 10401); - if (!UserServiceFacade::isLogin()) { + $initUser = MemberServiceFacade::init($request->header('token')); + if (!$initUser) return $this->error(MemberServiceFacade::getError(), 10401); + if (!MemberServiceFacade::isLogin()) { return $this->error('登录信息已过期', 10401); } } else { //不需要登录的接口,也可能需要获取登录用户的信息 - UserServiceFacade::init($request->header('token')); + MemberServiceFacade::init($request->header('token')); } return $next($request); } diff --git a/app/model/plugin/ali/Sms.php b/app/model/Member.php similarity index 45% rename from app/model/plugin/ali/Sms.php rename to app/model/Member.php index fed813760ac8f6009e747fd274a8537b06784d52..fdccff05367533ee03ba092018206c5d0d42dec6 100644 --- a/app/model/plugin/ali/Sms.php +++ b/app/model/Member.php @@ -1,33 +1,47 @@ 'timestamp:Y-m-d H:i:s', + ]; //表名 //关联模型 - + public function avatarPicFile(){ + return $this->belongsTo('app\model\Files','avatar_pic','id'); + } //新增属性的方法 - public function getCreateTimeIntAttr($value, $data) + public function getVipTimeIntAttr($value, $data) + { + return isset($data['vip_time']) ? $data['vip_time'] : 0; + } + + public function getLoginTimeIntAttr($value, $data) + { + return isset($data['login_time']) ? strtotime($data['login_time']) : 0; + } + + public function getCreateTimeIntAttr($value, $data) { return isset($data['create_time']) ? strtotime($data['create_time']) : 0; } diff --git a/app/model/User.php b/app/model/User.php deleted file mode 100644 index 0694d633b50418757873ae923b8fcdc162652ea9..0000000000000000000000000000000000000000 --- a/app/model/User.php +++ /dev/null @@ -1,56 +0,0 @@ - 'timestamp:Y-m-d H:i:s', - ]; - - protected $append = ['vip_time_int']; - - //表名 - - - //关联模型 - - - //新增属性的方法 - public function getVipTimeIntAttr($value, $data) - { - return isset($data['vip_time']) ? $data['vip_time'] : 0; - } - - public function getLoginTimeIntAttr($value, $data) - { - return isset($data['login_time']) ? strtotime($data['login_time']) : 0; - } - - public function getCreateTimeIntAttr($value, $data) - { - return isset($data['create_time']) ? strtotime($data['create_time']) : 0; - } - - public function getUpdateTimeIntAttr($value, $data) - { - return isset($data['update_time']) ? strtotime($data['update_time']) : 0; - } - - public function getDeleteTimeIntAttr($value, $data) - { - return isset($data['delete_time']) ? strtotime($data['delete_time']) : 0; - } -} diff --git a/app/model/admin/Menu.php b/app/model/admin/Menu.php index 31490ae56da864834d6f0b454ecec88f14db3828..3361b0b4633525040099a0bcc723d7b67657084a 100644 --- a/app/model/admin/Menu.php +++ b/app/model/admin/Menu.php @@ -13,4 +13,11 @@ class Menu extends BaseModel use SoftDelete; protected $name = 'admin_menu'; + + protected $append = ['show_icon']; + + public function getShowIconAttr($value, $data) + { + return ''; + } } \ No newline at end of file diff --git a/app/service/Conf.php b/app/service/Conf.php index 74d175ce9bbd00022395c8b23f214f8538058fb8..814d9d16c182a040c843821bf1f23f64650673bf 100644 --- a/app/service/Conf.php +++ b/app/service/Conf.php @@ -16,14 +16,16 @@ class Conf { use Error; - protected $redis = null; + // 是否使用redis,如果不想使用redis,修改此处为false即可 + protected $useRedis = true; + // 数据库连接句柄 protected $db = null; //判断是否配置了redis protected function hasRedis(){ $redisConf = Config::get('cache'); - if(isset($redisConf['stores']['redis']['type'])){ + if(isset($redisConf['stores']['redis']['type']) && $this->useRedis){ return true; } return false; diff --git a/app/service/admin/Plugins.php b/app/service/admin/Plugins.php index 6e1190e1c1da28e396c366d7af486c3d0555ace3..9a14f218f8b9d85c82e85a70d52860e25c2230eb 100644 --- a/app/service/admin/Plugins.php +++ b/app/service/admin/Plugins.php @@ -106,7 +106,7 @@ class Plugins // 删除插件目录 DirFile::rmDirs($pluginDir); // 修改系统插件配置文件config/plugin.php - $this->unInstallPluginConf($plugin); + $this->unInstallPluginConf($plugin, $info); return true; } @@ -121,17 +121,20 @@ class Plugins // 下载zip文件到本地 public function download($plugin, $laytpGwToken) { - $res = Http::post(Config::get('plugin.apiUrl') . "/plugins/install", ['plugin'=>$plugin], array( + $ltVersion = request()->param('ltVersion'); + $pluginVersion = request()->param('pluginVersion'); + $res = Http::post(Config::get('plugin.apiUrl') . "/plugins/install", [ + 'plugin'=>$plugin, + 'ltVersion'=>$ltVersion, + 'pluginVersion'=>$pluginVersion, + ], array( CURLOPT_HTTPHEADER => array( "token: ".$laytpGwToken ), )); $resArr = json_decode($res, true); - if($resArr['code'] === 1){ - $this->setError(1); - return false; - }else if($resArr['code'] === 2){ - $this->setError(2); + if($resArr['code'] > 0 ){ + $this->setError(['msg'=>$resArr['msg'],'code'=>$resArr['code']]); return false; } $url = $resArr['data']['url']; @@ -166,6 +169,10 @@ class Plugins $this->migrate($plugin); // 复制静态文件 + if(!function_exists('exec')){ + $this->setError('php函数exec不允许执行'); + return false; + } $this->copyPublicFile($plugin); // 生成菜单,同时将新增的菜单id写入info.ini配置文件中,便于卸载时同时删除菜单 @@ -175,7 +182,7 @@ class Plugins $this->installPluginConf($plugin); return true; }catch (\Exception $e){ - $this->setError($e->getMessage(). $e->getLine() . $e->getFile()); + $this->setError(['msg'=>$e->getMessage(). $e->getLine() . $e->getFile(),'code'=>3]); return false; } } @@ -358,13 +365,21 @@ class Plugins $pluginConf['installed'][] = $plugin; $pluginConf['installed'] = array_unique($pluginConf['installed']); sort($pluginConf['installed']); + + $info = $this->getPluginInfo($plugin); + if(isset($info['is_editor']) && $info['is_editor']){ + $pluginConf['installedEditor'][] = $plugin; + $pluginConf['installedEditor'] = array_unique($pluginConf['installedEditor']); + sort($pluginConf['installedEditor']); + } + $fileName = root_path() . DS . 'config' . DS . 'plugin.php'; file_put_contents($fileName,"$installed){ @@ -372,6 +387,15 @@ class Plugins } $pluginConf['installed'] = array_unique($pluginConf['installed']); sort($pluginConf['installed']); + + if(isset($info['is_editor']) && $info['is_editor']){ + foreach($pluginConf['installedEditor'] as $k=>$installedEditor){ + if($installedEditor === $plugin) unset($pluginConf['installedEditor'][$k]); + } + $pluginConf['installedEditor'] = array_unique($pluginConf['installedEditor']); + sort($pluginConf['installedEditor']); + } + $fileName = root_path() . DS . 'config' . DS . 'plugin.php'; file_put_contents($fileName," 0) { - $user = \app\model\User::find($userId); + $user = \app\model\Member::find($userId); if (!$user) { $this->setError('账号不存在,请重新登录'); return false; @@ -72,7 +72,7 @@ class User public function emailRegLogin($params) { try { - $user = \app\model\User::where('email', '=', $params['email'])->find(); + $user = \app\model\Member::where('email', '=', $params['email'])->find(); if (!$user) { $data = [ 'email' => $params['email'], @@ -82,8 +82,8 @@ class User 'login_ip' => request()->ip(), ]; - $user = \app\model\User::create($data); - $this->_user = \app\model\User::find($user->id); + $user = \app\model\Member::create($data); + $this->_user = \app\model\Member::find($user->id); } else { $this->_user = $user; } @@ -148,7 +148,7 @@ class User /** * 获取User模型 - * @return User + * @return Member */ public function getUser() { diff --git a/app/service/api/UserServiceFacade.php b/app/service/api/MemberServiceFacade.php similarity index 90% rename from app/service/api/UserServiceFacade.php rename to app/service/api/MemberServiceFacade.php index 7792e9fe13b8e1220cba4e5978083e63af31139a..da977ec8364f7253ff886dcafbfa19c288c07962 100644 --- a/app/service/api/UserServiceFacade.php +++ b/app/service/api/MemberServiceFacade.php @@ -17,10 +17,10 @@ use think\Facade; * @method static mixed getToken() 获取token * @method static mixed getAllowFields() 允许输出的字段 */ -class UserServiceFacade extends Facade +class MemberServiceFacade extends Facade { protected static function getFacadeClass() { - return User::class; + return Member::class; } } diff --git a/app/validate/admin/member/Add.php b/app/validate/admin/member/Add.php new file mode 100644 index 0000000000000000000000000000000000000000..fd1e19ba230e67ce50d046d3039d1ead05b7c9a1 --- /dev/null +++ b/app/validate/admin/member/Add.php @@ -0,0 +1,20 @@ + 'confirm:re_password|min:6|max:26', + ]; + + //定义内置方法检验失败后返回的字符 + protected $message = [ + 'password.confirm' => '两次密码输入不相同', + 'password.min' => '密码长度不能低于6个字符', + 'password.max' => '密码长度不能高于26个字符', + ]; +} \ No newline at end of file diff --git a/app/validate/admin/member/Edit.php b/app/validate/admin/member/Edit.php new file mode 100644 index 0000000000000000000000000000000000000000..a8fd1727ef9e3c6a59c32fe1916ebff253dfc3a7 --- /dev/null +++ b/app/validate/admin/member/Edit.php @@ -0,0 +1,20 @@ + 'confirm:re_password|min:6|max:26', + ]; + + //定义内置方法检验失败后返回的字符 + protected $message = [ + 'password.confirm' => '两次密码输入不相同', + 'password.min' => '密码长度不能低于6个字符', + 'password.max' => '密码长度不能高于26个字符', + ]; +} \ No newline at end of file diff --git a/app/validate/api/user/EmailLogin.php b/app/validate/api/user/EmailLogin.php index b2253b03a441438c20e3ba2931869713e4cae821..1ef606e0f4b14603a4f0bea836c0b0bf134ecddc 100644 --- a/app/validate/api/user/EmailLogin.php +++ b/app/validate/api/user/EmailLogin.php @@ -3,7 +3,7 @@ namespace app\validate\api\user; //邮箱密码登录验证器 -use app\model\User; +use app\model\Member; use laytp\library\Str; use think\Validate; @@ -27,8 +27,8 @@ class EmailLogin extends Validate protected function checkPassword($password, $rule, $data) { $email = $data['email']; - $user = new User(); + $user = new Member(); $passwordHash = $user->getFieldByEmail($email, 'password'); - return (!Str::checkPassword(md5($password), $passwordHash)) ? '账户信息错误' : true; + return (!Str::checkPassword($password, $passwordHash)) ? '账户信息错误' : true; } } \ No newline at end of file diff --git a/composer.json b/composer.json index 939ed07588a398d48b35af0a6e0f6519860152c4..188227abcb5357d4461693b540ad2ea4d262fc4b 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ { "name": "yunwuxin", "email": "448901948@qq.com" - } + } ], "require": { "php": ">=7.1.0", @@ -28,11 +28,12 @@ "topthink/think-view": "^1.0", "alibabacloud/sdk": "^1.8", "aliyuncs/oss-sdk-php": "^2.4", - "qiniu/php-sdk": "^7.4" + "qiniu/php-sdk": "^7.4", + "topthink/think-filesystem": "^2.0" }, "require-dev": { "symfony/var-dumper": "^4.2", - "topthink/think-trace":"^1.0" + "topthink/think-trace": "^1.0" }, "autoload": { "psr-4": { @@ -52,4 +53,4 @@ "@php think vendor:publish" ] } -} +} \ No newline at end of file diff --git a/config/cookie.php b/config/cookie.php index 3dfbae4805b4612262be2a0ad9ca0cbec9e95902..7cf7cdfbd7a85f6f150630f9751af0397a400b21 100644 --- a/config/cookie.php +++ b/config/cookie.php @@ -8,7 +8,7 @@ return [ // cookie 保存路径 'path' => '/', // cookie 有效域名 - 'domain' => '', + 'domain' => env('domain.main', ''), // cookie 启用安全传输 'secure' => false, // httponly设置 diff --git a/config/database.php b/config/database.php index fbbfba98d551dcfcd77dd87dfe2103ac2f567a21..59f2d0549a2cf7376f9fcfd667c1ab1c749f665b 100644 --- a/config/database.php +++ b/config/database.php @@ -19,23 +19,23 @@ return [ 'connections' => [ 'mysql' => [ // 数据库类型 - 'type' => env('database.type', 'mysql'), + 'type' => env('database.type', ''), // 服务器地址 - 'hostname' => env('database.hostname', '127.0.0.1'), + 'hostname' => env('database.hostname', ''), // 数据库名 'database' => env('database.database', ''), // 用户名 - 'username' => env('database.username', 'root'), + 'username' => env('database.username', ''), // 密码 'password' => env('database.password', ''), // 端口 - 'hostport' => env('database.hostport', '3306'), + 'hostport' => env('database.hostport', ''), // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 - 'charset' => env('database.charset', 'utf8'), + 'charset' => env('database.charset', ''), // 数据库表前缀 - 'prefix' => env('database.prefix', 'lt_'), + 'prefix' => env('database.prefix', ''), // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 'deploy' => 0, @@ -55,6 +55,31 @@ return [ 'fields_cache' => false, ], + 'redis' => [ + // Redis 配置 + 'type' => 'redis', + // Redis 主机 + 'host' => env('redis.host', '127.0.0.1'), + // Redis 端口 + 'port' => env('redis.port', 6379), + // Redis 密码 + 'password' => env('redis.password', ''), + // Redis 库编号 + 'select' => env('redis.select', 0), + // Redis 连接超时时间 + 'timeout' => env('redis.timeout', 0), + // Redis TTL + 'expire' => env('redis.expire', 0), + // Redis 长连接 + 'persistent' => env('redis.persistent', false), + // Redis key前缀 + 'prefix' => env('redis.prefix', ''), + // Redis 标签前缀 + 'tag_prefix' => 'tag:', + // Redis 序列化 + 'serialize' => [], + ], + // 更多的数据库配置信息 ], ]; diff --git a/config/paginate.php b/config/paginate.php new file mode 100644 index 0000000000000000000000000000000000000000..1524607031f38bd1815542602eb4f8a23d5d75a2 --- /dev/null +++ b/config/paginate.php @@ -0,0 +1,9 @@ + 10 +]; \ No newline at end of file diff --git a/config/plugin.php b/config/plugin.php index 70e8a7c83a68ef09c9282b6f34817628259919ef..27b55e51d588997c06f10298661adedd69f6e934 100644 --- a/config/plugin.php +++ b/config/plugin.php @@ -3,7 +3,6 @@ return array ( 'apiUrl' => 'https://api.laytp.com', 'installed' => array ( - ), 'installedEditor' => array ( diff --git a/database/migrations/20201013152727_adminMenu.php b/database/migrations/20201013152727_adminMenu.php index 0f7999aec7c281cb5001f9c9a0352227c59ad032..308381e0d492a05783374bc6fe239ea7d3419a28 100644 --- a/database/migrations/20201013152727_adminMenu.php +++ b/database/migrations/20201013152727_adminMenu.php @@ -40,7 +40,6 @@ class AdminMenu extends Migrator $table ->addColumn('name', 'string', ['length' => 100, 'default' => '', 'comment' => '名称']) ->addColumn('href', 'string', ['length' => 255, 'default' => '', 'comment' => '点击菜单,打开的url地址']) - ->addColumn('open_type', 'string', ['length' => 255, 'default' => '_iframe', 'comment' => '打开方式,_iframe=iframe的地址和_blank=新窗口打开']) ->addColumn('rule', 'string', ['length' => 100, 'default' => '', 'comment' => '路由规则']) ->addColumn('is_menu', 'boolean', ['default' => 1, 'comment' => '是否为menu.2=不是,1=是']) ->addColumn('sort', 'integer', ['default' => 0, 'comment' => '排序,从大到小,倒叙排序']) @@ -64,7 +63,6 @@ class AdminMenu extends Migrator '2' => [ 'name' => '控制面板', 'href' => '/admin/console.html', - 'open_type' => '_iframe', 'pid' => 1, 'icon' => 'layui-icon layui-icon-console', 'des' => '控制面板', @@ -82,7 +80,6 @@ class AdminMenu extends Migrator '4' => [ 'name' => '管理员管理', 'href' => '/admin/user/index.html', - 'open_type' => '_iframe', 'pid' => 3, 'des' => '管理员管理', 'create_time' => date('Y-m-d H:i:s'), @@ -181,7 +178,6 @@ class AdminMenu extends Migrator '15' => [ 'name' => '角色管理', 'href' => '/admin/role/index.html', - 'open_type' => '_iframe', 'pid' => 3, 'des' => '角色管理', 'create_time' => date('Y-m-d H:i:s'), @@ -262,7 +258,6 @@ class AdminMenu extends Migrator '24' => [ 'name' => '菜单管理', 'href' => '/admin/menu/index.html', - 'open_type' => '_iframe', 'pid' => 3, 'des' => '菜单管理', 'create_time' => date('Y-m-d H:i:s'), @@ -719,6 +714,123 @@ class AdminMenu extends Migrator 'create_time' => date('Y-m-d H:i:s'), 'update_time' => date('Y-m-d H:i:s'), ], + '76' => [ + 'name' => '设置排序', + 'rule' => '/admin.menu/setSort', + 'is_menu' => 2, + 'pid' => 24, + 'des' => '设置排序', + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s'), + ], + '77' => [ + 'name' => '会员管理', + 'pid' => 1, + 'href' => '/admin/member/index.html', + 'icon' => 'layui-icon layui-icon-username', + 'des' => '会员管理', + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s'), + ], + '78' => [ + 'name' => '查看和搜索列表', + 'pid' => 77, + 'rule' => '/admin.member/index', + 'is_menu' => 2, + 'des' => '查看和搜索列表', + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s'), + ], + '79' => [ + 'name' => '查看单条数据详情', + 'pid' => 77, + 'rule' => '/admin.member/info', + 'is_menu' => 2, + 'des' => '查看单条数据详情', + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s'), + ], + '80' => [ + 'name' => '添加', + 'pid' => 77, + 'rule' => '/admin.member/add', + 'is_menu' => 2, + 'des' => '添加', + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s'), + ], + '81' => [ + 'name' => '编辑', + 'pid' => 77, + 'rule' => '/admin.member/edit', + 'is_menu' => 2, + 'des' => '编辑', + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s'), + ], + '82' => [ + 'name' => '删除', + 'pid' => 77, + 'rule' => '/admin.member/del', + 'is_menu' => 2, + 'des' => '删除', + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s'), + ], + '83' => [ + 'name' => '设置账号状态', + 'pid' => 77, + 'rule' => '/admin.member/setStatus', + 'is_menu' => 2, + 'des' => '设置账号状态', + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s'), + ], + '84' => [ + 'name' => '回收站', + 'pid' => 77, + 'rule' => '/admin.member/recycle', + 'is_menu' => 2, + 'des' => '回收站', + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s'), + ], + '85' => [ + 'name' => '还原', + 'pid' => 77, + 'rule' => '/admin.member/restore', + 'is_menu' => 2, + 'des' => '还原', + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s'), + ], + '86' => [ + 'name' => '真实删除', + 'pid' => 77, + 'rule' => '/admin.member/trueDel', + 'is_menu' => 2, + 'des' => '真实删除', + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s'), + ], + '87' => [ + 'name' => '复制菜单', + 'rule' => '/admin.menu/copy', + 'is_menu' => 2, + 'pid' => 24, + 'des' => '复制菜单', + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s'), + ], + '88' => [ + 'name' => '移动菜单', + 'rule' => '/admin.menu/move', + 'is_menu' => 2, + 'pid' => 24, + 'des' => '复制菜单', + 'create_time' => date('Y-m-d H:i:s'), + 'update_time' => date('Y-m-d H:i:s'), + ], ]; $table->setData($data)->create(); diff --git a/database/migrations/20211013152732_conf.php b/database/migrations/20211013152732_conf.php index 9c2b95c68394dcd0249b302f322402da6c11ec8f..78af1fb50f6ae9af9cbcc5e34d6d702eb9d0af6d 100644 --- a/database/migrations/20211013152732_conf.php +++ b/database/migrations/20211013152732_conf.php @@ -26,12 +26,18 @@ class Conf extends Migrator $data = [ '1' => [ + 'group' => 'system.upload', + 'key' => 'defaultType', + 'value' => 'local', + 'form_type' => 'xmSelect', + ], + '2' => [ 'group' => 'system.upload', 'key' => 'size', 'value' => '200MB', 'form_type' => 'input', ], - '2' => [ + '3' => [ 'group' => 'system.upload', 'key' => 'mime', 'value' => 'png,jpg,gif,jpeg,doc,xls,pdf', diff --git a/database/migrations/20211113034943_area.php b/database/migrations/20211113034943_area.php index 636f60bb2280dba8d9cfc47210d4b88ba3db97bd..174498ca59cbcd851459e524b8c558297ca00c00 100644 --- a/database/migrations/20211113034943_area.php +++ b/database/migrations/20211113034943_area.php @@ -59872,9 +59872,9 @@ class Area extends Migrator array ( 'id' => 3325, 'pid' => 0, - 'short_name' => '台湾', - 'name' => '台湾', - 'merge_name' => '中国,台湾', + 'short_name' => '台湾省', + 'name' => '台湾省', + 'merge_name' => '中国,台湾省', 'level' => 1, 'pinyin' => 'taiwan', 'code' => '', @@ -59892,7 +59892,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '台北', 'name' => '台北市', - 'merge_name' => '中国,台湾,台北市', + 'merge_name' => '中国,台湾省,台北市', 'level' => 2, 'pinyin' => 'taipei', 'code' => '02', @@ -59910,7 +59910,7 @@ class Area extends Migrator 'pid' => 3326, 'short_name' => '松山', 'name' => '松山区', - 'merge_name' => '中国,台湾,台北市,松山区', + 'merge_name' => '中国,台湾省,台北市,松山区', 'level' => 3, 'pinyin' => 'songshan', 'code' => '02', @@ -59928,7 +59928,7 @@ class Area extends Migrator 'pid' => 3326, 'short_name' => '信义', 'name' => '信义区', - 'merge_name' => '中国,台湾,台北市,信义区', + 'merge_name' => '中国,台湾省,台北市,信义区', 'level' => 3, 'pinyin' => 'xinyi', 'code' => '02', @@ -59946,7 +59946,7 @@ class Area extends Migrator 'pid' => 3326, 'short_name' => '大安', 'name' => '大安区', - 'merge_name' => '中国,台湾,台北市,大安区', + 'merge_name' => '中国,台湾省,台北市,大安区', 'level' => 3, 'pinyin' => 'da\'an', 'code' => '02', @@ -59964,7 +59964,7 @@ class Area extends Migrator 'pid' => 3326, 'short_name' => '中山', 'name' => '中山区', - 'merge_name' => '中国,台湾,台北市,中山区', + 'merge_name' => '中国,台湾省,台北市,中山区', 'level' => 3, 'pinyin' => 'zhongshan', 'code' => '02', @@ -59982,7 +59982,7 @@ class Area extends Migrator 'pid' => 3326, 'short_name' => '中正', 'name' => '中正区', - 'merge_name' => '中国,台湾,台北市,中正区', + 'merge_name' => '中国,台湾省,台北市,中正区', 'level' => 3, 'pinyin' => 'zhongzheng', 'code' => '02', @@ -60000,7 +60000,7 @@ class Area extends Migrator 'pid' => 3326, 'short_name' => '大同', 'name' => '大同区', - 'merge_name' => '中国,台湾,台北市,大同区', + 'merge_name' => '中国,台湾省,台北市,大同区', 'level' => 3, 'pinyin' => 'datong', 'code' => '02', @@ -60018,7 +60018,7 @@ class Area extends Migrator 'pid' => 3326, 'short_name' => '万华', 'name' => '万华区', - 'merge_name' => '中国,台湾,台北市,万华区', + 'merge_name' => '中国,台湾省,台北市,万华区', 'level' => 3, 'pinyin' => 'wanhua', 'code' => '02', @@ -60036,7 +60036,7 @@ class Area extends Migrator 'pid' => 3326, 'short_name' => '文山', 'name' => '文山区', - 'merge_name' => '中国,台湾,台北市,文山区', + 'merge_name' => '中国,台湾省,台北市,文山区', 'level' => 3, 'pinyin' => 'wenshan', 'code' => '02', @@ -60054,7 +60054,7 @@ class Area extends Migrator 'pid' => 3326, 'short_name' => '南港', 'name' => '南港区', - 'merge_name' => '中国,台湾,台北市,南港区', + 'merge_name' => '中国,台湾省,台北市,南港区', 'level' => 3, 'pinyin' => 'nangang', 'code' => '02', @@ -60072,7 +60072,7 @@ class Area extends Migrator 'pid' => 3326, 'short_name' => '内湖', 'name' => '内湖区', - 'merge_name' => '中国,台湾,台北市,内湖区', + 'merge_name' => '中国,台湾省,台北市,内湖区', 'level' => 3, 'pinyin' => 'nahu', 'code' => '02', @@ -60090,7 +60090,7 @@ class Area extends Migrator 'pid' => 3326, 'short_name' => '士林', 'name' => '士林区', - 'merge_name' => '中国,台湾,台北市,士林区', + 'merge_name' => '中国,台湾省,台北市,士林区', 'level' => 3, 'pinyin' => 'shilin', 'code' => '02', @@ -60108,7 +60108,7 @@ class Area extends Migrator 'pid' => 3326, 'short_name' => '北投', 'name' => '北投区', - 'merge_name' => '中国,台湾,台北市,北投区', + 'merge_name' => '中国,台湾省,台北市,北投区', 'level' => 3, 'pinyin' => 'beitou', 'code' => '02', @@ -60126,7 +60126,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '高雄', 'name' => '高雄市', - 'merge_name' => '中国,台湾,高雄市', + 'merge_name' => '中国,台湾省,高雄市', 'level' => 2, 'pinyin' => 'kaohsiung', 'code' => '07', @@ -60144,7 +60144,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '盐埕', 'name' => '盐埕区', - 'merge_name' => '中国,台湾,高雄市,盐埕区', + 'merge_name' => '中国,台湾省,高雄市,盐埕区', 'level' => 3, 'pinyin' => 'yancheng', 'code' => '07', @@ -60162,7 +60162,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '鼓山', 'name' => '鼓山区', - 'merge_name' => '中国,台湾,高雄市,鼓山区', + 'merge_name' => '中国,台湾省,高雄市,鼓山区', 'level' => 3, 'pinyin' => 'gushan', 'code' => '07', @@ -60180,7 +60180,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '左营', 'name' => '左营区', - 'merge_name' => '中国,台湾,高雄市,左营区', + 'merge_name' => '中国,台湾省,高雄市,左营区', 'level' => 3, 'pinyin' => 'zuoying', 'code' => '07', @@ -60198,7 +60198,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '楠梓', 'name' => '楠梓区', - 'merge_name' => '中国,台湾,高雄市,楠梓区', + 'merge_name' => '中国,台湾省,高雄市,楠梓区', 'level' => 3, 'pinyin' => 'nanzi', 'code' => '07', @@ -60216,7 +60216,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '三民', 'name' => '三民区', - 'merge_name' => '中国,台湾,高雄市,三民区', + 'merge_name' => '中国,台湾省,高雄市,三民区', 'level' => 3, 'pinyin' => 'sanmin', 'code' => '07', @@ -60234,7 +60234,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '新兴', 'name' => '新兴区', - 'merge_name' => '中国,台湾,高雄市,新兴区', + 'merge_name' => '中国,台湾省,高雄市,新兴区', 'level' => 3, 'pinyin' => 'xinxing', 'code' => '07', @@ -60252,7 +60252,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '前金', 'name' => '前金区', - 'merge_name' => '中国,台湾,高雄市,前金区', + 'merge_name' => '中国,台湾省,高雄市,前金区', 'level' => 3, 'pinyin' => 'qianjin', 'code' => '07', @@ -60270,7 +60270,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '苓雅', 'name' => '苓雅区', - 'merge_name' => '中国,台湾,高雄市,苓雅区', + 'merge_name' => '中国,台湾省,高雄市,苓雅区', 'level' => 3, 'pinyin' => 'lingya', 'code' => '07', @@ -60288,7 +60288,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '前镇', 'name' => '前镇区', - 'merge_name' => '中国,台湾,高雄市,前镇区', + 'merge_name' => '中国,台湾省,高雄市,前镇区', 'level' => 3, 'pinyin' => 'qianzhen', 'code' => '07', @@ -60306,7 +60306,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '旗津', 'name' => '旗津区', - 'merge_name' => '中国,台湾,高雄市,旗津区', + 'merge_name' => '中国,台湾省,高雄市,旗津区', 'level' => 3, 'pinyin' => 'qijin', 'code' => '07', @@ -60324,7 +60324,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '小港', 'name' => '小港区', - 'merge_name' => '中国,台湾,高雄市,小港区', + 'merge_name' => '中国,台湾省,高雄市,小港区', 'level' => 3, 'pinyin' => 'xiaogang', 'code' => '07', @@ -60342,7 +60342,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '凤山', 'name' => '凤山区', - 'merge_name' => '中国,台湾,高雄市,凤山区', + 'merge_name' => '中国,台湾省,高雄市,凤山区', 'level' => 3, 'pinyin' => 'fengshan', 'code' => '07', @@ -60360,7 +60360,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '林园', 'name' => '林园区', - 'merge_name' => '中国,台湾,高雄市,林园区', + 'merge_name' => '中国,台湾省,高雄市,林园区', 'level' => 3, 'pinyin' => 'linyuan', 'code' => '07', @@ -60378,7 +60378,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '大寮', 'name' => '大寮区', - 'merge_name' => '中国,台湾,高雄市,大寮区', + 'merge_name' => '中国,台湾省,高雄市,大寮区', 'level' => 3, 'pinyin' => 'daliao', 'code' => '07', @@ -60396,7 +60396,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '大树', 'name' => '大树区', - 'merge_name' => '中国,台湾,高雄市,大树区', + 'merge_name' => '中国,台湾省,高雄市,大树区', 'level' => 3, 'pinyin' => 'dashu', 'code' => '07', @@ -60414,7 +60414,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '大社', 'name' => '大社区', - 'merge_name' => '中国,台湾,高雄市,大社区', + 'merge_name' => '中国,台湾省,高雄市,大社区', 'level' => 3, 'pinyin' => 'dashe', 'code' => '07', @@ -60432,7 +60432,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '仁武', 'name' => '仁武区', - 'merge_name' => '中国,台湾,高雄市,仁武区', + 'merge_name' => '中国,台湾省,高雄市,仁武区', 'level' => 3, 'pinyin' => 'renwu', 'code' => '07', @@ -60450,7 +60450,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '鸟松', 'name' => '鸟松区', - 'merge_name' => '中国,台湾,高雄市,鸟松区', + 'merge_name' => '中国,台湾省,高雄市,鸟松区', 'level' => 3, 'pinyin' => 'niaosong', 'code' => '07', @@ -60468,7 +60468,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '冈山', 'name' => '冈山区', - 'merge_name' => '中国,台湾,高雄市,冈山区', + 'merge_name' => '中国,台湾省,高雄市,冈山区', 'level' => 3, 'pinyin' => 'gangshan', 'code' => '07', @@ -60486,7 +60486,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '桥头', 'name' => '桥头区', - 'merge_name' => '中国,台湾,高雄市,桥头区', + 'merge_name' => '中国,台湾省,高雄市,桥头区', 'level' => 3, 'pinyin' => 'qiaotou', 'code' => '07', @@ -60504,7 +60504,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '燕巢', 'name' => '燕巢区', - 'merge_name' => '中国,台湾,高雄市,燕巢区', + 'merge_name' => '中国,台湾省,高雄市,燕巢区', 'level' => 3, 'pinyin' => 'yanchao', 'code' => '07', @@ -60522,7 +60522,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '田寮', 'name' => '田寮区', - 'merge_name' => '中国,台湾,高雄市,田寮区', + 'merge_name' => '中国,台湾省,高雄市,田寮区', 'level' => 3, 'pinyin' => 'tianliao', 'code' => '07', @@ -60540,7 +60540,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '阿莲', 'name' => '阿莲区', - 'merge_name' => '中国,台湾,高雄市,阿莲区', + 'merge_name' => '中国,台湾省,高雄市,阿莲区', 'level' => 3, 'pinyin' => 'alian', 'code' => '07', @@ -60558,7 +60558,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '路竹', 'name' => '路竹区', - 'merge_name' => '中国,台湾,高雄市,路竹区', + 'merge_name' => '中国,台湾省,高雄市,路竹区', 'level' => 3, 'pinyin' => 'luzhu', 'code' => '07', @@ -60576,7 +60576,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '湖内', 'name' => '湖内区', - 'merge_name' => '中国,台湾,高雄市,湖内区', + 'merge_name' => '中国,台湾省,高雄市,湖内区', 'level' => 3, 'pinyin' => 'huna', 'code' => '07', @@ -60594,7 +60594,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '茄萣', 'name' => '茄萣区', - 'merge_name' => '中国,台湾,高雄市,茄萣区', + 'merge_name' => '中国,台湾省,高雄市,茄萣区', 'level' => 3, 'pinyin' => 'qieding', 'code' => '07', @@ -60612,7 +60612,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '永安', 'name' => '永安区', - 'merge_name' => '中国,台湾,高雄市,永安区', + 'merge_name' => '中国,台湾省,高雄市,永安区', 'level' => 3, 'pinyin' => 'yong\'an', 'code' => '07', @@ -60630,7 +60630,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '弥陀', 'name' => '弥陀区', - 'merge_name' => '中国,台湾,高雄市,弥陀区', + 'merge_name' => '中国,台湾省,高雄市,弥陀区', 'level' => 3, 'pinyin' => 'mituo', 'code' => '07', @@ -60648,7 +60648,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '梓官', 'name' => '梓官区', - 'merge_name' => '中国,台湾,高雄市,梓官区', + 'merge_name' => '中国,台湾省,高雄市,梓官区', 'level' => 3, 'pinyin' => 'ziguan', 'code' => '07', @@ -60666,7 +60666,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '旗山', 'name' => '旗山区', - 'merge_name' => '中国,台湾,高雄市,旗山区', + 'merge_name' => '中国,台湾省,高雄市,旗山区', 'level' => 3, 'pinyin' => 'qishan', 'code' => '07', @@ -60684,7 +60684,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '美浓', 'name' => '美浓区', - 'merge_name' => '中国,台湾,高雄市,美浓区', + 'merge_name' => '中国,台湾省,高雄市,美浓区', 'level' => 3, 'pinyin' => 'meinong', 'code' => '07', @@ -60702,7 +60702,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '六龟', 'name' => '六龟区', - 'merge_name' => '中国,台湾,高雄市,六龟区', + 'merge_name' => '中国,台湾省,高雄市,六龟区', 'level' => 3, 'pinyin' => 'liugui', 'code' => '07', @@ -60720,7 +60720,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '甲仙', 'name' => '甲仙区', - 'merge_name' => '中国,台湾,高雄市,甲仙区', + 'merge_name' => '中国,台湾省,高雄市,甲仙区', 'level' => 3, 'pinyin' => 'jiaxian', 'code' => '07', @@ -60738,7 +60738,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '杉林', 'name' => '杉林区', - 'merge_name' => '中国,台湾,高雄市,杉林区', + 'merge_name' => '中国,台湾省,高雄市,杉林区', 'level' => 3, 'pinyin' => 'shanlin', 'code' => '07', @@ -60756,7 +60756,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '内门', 'name' => '内门区', - 'merge_name' => '中国,台湾,高雄市,内门区', + 'merge_name' => '中国,台湾省,高雄市,内门区', 'level' => 3, 'pinyin' => 'namen', 'code' => '07', @@ -60774,7 +60774,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '茂林', 'name' => '茂林区', - 'merge_name' => '中国,台湾,高雄市,茂林区', + 'merge_name' => '中国,台湾省,高雄市,茂林区', 'level' => 3, 'pinyin' => 'maolin', 'code' => '07', @@ -60792,7 +60792,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '桃源', 'name' => '桃源区', - 'merge_name' => '中国,台湾,高雄市,桃源区', + 'merge_name' => '中国,台湾省,高雄市,桃源区', 'level' => 3, 'pinyin' => 'taoyuan', 'code' => '07', @@ -60810,7 +60810,7 @@ class Area extends Migrator 'pid' => 3339, 'short_name' => '那玛夏', 'name' => '那玛夏区', - 'merge_name' => '中国,台湾,高雄市,那玛夏区', + 'merge_name' => '中国,台湾省,高雄市,那玛夏区', 'level' => 3, 'pinyin' => 'namaxia', 'code' => '07', @@ -60828,7 +60828,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '基隆', 'name' => '基隆市', - 'merge_name' => '中国,台湾,基隆市', + 'merge_name' => '中国,台湾省,基隆市', 'level' => 2, 'pinyin' => 'keelung', 'code' => '02', @@ -60846,7 +60846,7 @@ class Area extends Migrator 'pid' => 3378, 'short_name' => '中正', 'name' => '中正区', - 'merge_name' => '中国,台湾,基隆市,中正区', + 'merge_name' => '中国,台湾省,基隆市,中正区', 'level' => 3, 'pinyin' => 'zhongzheng', 'code' => '02', @@ -60864,7 +60864,7 @@ class Area extends Migrator 'pid' => 3378, 'short_name' => '七堵', 'name' => '七堵区', - 'merge_name' => '中国,台湾,基隆市,七堵区', + 'merge_name' => '中国,台湾省,基隆市,七堵区', 'level' => 3, 'pinyin' => 'qidu', 'code' => '02', @@ -60882,7 +60882,7 @@ class Area extends Migrator 'pid' => 3378, 'short_name' => '暖暖', 'name' => '暖暖区', - 'merge_name' => '中国,台湾,基隆市,暖暖区', + 'merge_name' => '中国,台湾省,基隆市,暖暖区', 'level' => 3, 'pinyin' => 'nuannuan', 'code' => '02', @@ -60900,7 +60900,7 @@ class Area extends Migrator 'pid' => 3378, 'short_name' => '仁爱', 'name' => '仁爱区', - 'merge_name' => '中国,台湾,基隆市,仁爱区', + 'merge_name' => '中国,台湾省,基隆市,仁爱区', 'level' => 3, 'pinyin' => 'renai', 'code' => '02', @@ -60918,7 +60918,7 @@ class Area extends Migrator 'pid' => 3378, 'short_name' => '中山', 'name' => '中山区', - 'merge_name' => '中国,台湾,基隆市,中山区', + 'merge_name' => '中国,台湾省,基隆市,中山区', 'level' => 3, 'pinyin' => 'zhongshan', 'code' => '02', @@ -60936,7 +60936,7 @@ class Area extends Migrator 'pid' => 3378, 'short_name' => '安乐', 'name' => '安乐区', - 'merge_name' => '中国,台湾,基隆市,安乐区', + 'merge_name' => '中国,台湾省,基隆市,安乐区', 'level' => 3, 'pinyin' => 'anle', 'code' => '02', @@ -60954,7 +60954,7 @@ class Area extends Migrator 'pid' => 3378, 'short_name' => '信义', 'name' => '信义区', - 'merge_name' => '中国,台湾,基隆市,信义区', + 'merge_name' => '中国,台湾省,基隆市,信义区', 'level' => 3, 'pinyin' => 'xinyi', 'code' => '02', @@ -60972,7 +60972,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '台中', 'name' => '台中市', - 'merge_name' => '中国,台湾,台中市', + 'merge_name' => '中国,台湾省,台中市', 'level' => 2, 'pinyin' => 'taichung', 'code' => '04', @@ -60990,7 +60990,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '中区', 'name' => '中区', - 'merge_name' => '中国,台湾,台中市,中区', + 'merge_name' => '中国,台湾省,台中市,中区', 'level' => 3, 'pinyin' => 'zhongqu', 'code' => '04', @@ -61008,7 +61008,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '东区', 'name' => '东区', - 'merge_name' => '中国,台湾,台中市,东区', + 'merge_name' => '中国,台湾省,台中市,东区', 'level' => 3, 'pinyin' => 'dongqu', 'code' => '04', @@ -61026,7 +61026,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '南区', 'name' => '南区', - 'merge_name' => '中国,台湾,台中市,南区', + 'merge_name' => '中国,台湾省,台中市,南区', 'level' => 3, 'pinyin' => 'nanqu', 'code' => '04', @@ -61044,7 +61044,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '西区', 'name' => '西区', - 'merge_name' => '中国,台湾,台中市,西区', + 'merge_name' => '中国,台湾省,台中市,西区', 'level' => 3, 'pinyin' => 'xiqu', 'code' => '04', @@ -61062,7 +61062,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '北区', 'name' => '北区', - 'merge_name' => '中国,台湾,台中市,北区', + 'merge_name' => '中国,台湾省,台中市,北区', 'level' => 3, 'pinyin' => 'beiqu', 'code' => '04', @@ -61080,7 +61080,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '西屯', 'name' => '西屯区', - 'merge_name' => '中国,台湾,台中市,西屯区', + 'merge_name' => '中国,台湾省,台中市,西屯区', 'level' => 3, 'pinyin' => 'xitun', 'code' => '04', @@ -61098,7 +61098,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '南屯', 'name' => '南屯区', - 'merge_name' => '中国,台湾,台中市,南屯区', + 'merge_name' => '中国,台湾省,台中市,南屯区', 'level' => 3, 'pinyin' => 'nantun', 'code' => '04', @@ -61116,7 +61116,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '北屯', 'name' => '北屯区', - 'merge_name' => '中国,台湾,台中市,北屯区', + 'merge_name' => '中国,台湾省,台中市,北屯区', 'level' => 3, 'pinyin' => 'beitun', 'code' => '04', @@ -61134,7 +61134,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '丰原', 'name' => '丰原区', - 'merge_name' => '中国,台湾,台中市,丰原区', + 'merge_name' => '中国,台湾省,台中市,丰原区', 'level' => 3, 'pinyin' => 'fengyuan', 'code' => '04', @@ -61152,7 +61152,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '东势', 'name' => '东势区', - 'merge_name' => '中国,台湾,台中市,东势区', + 'merge_name' => '中国,台湾省,台中市,东势区', 'level' => 3, 'pinyin' => 'dongshi', 'code' => '04', @@ -61170,7 +61170,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '大甲', 'name' => '大甲区', - 'merge_name' => '中国,台湾,台中市,大甲区', + 'merge_name' => '中国,台湾省,台中市,大甲区', 'level' => 3, 'pinyin' => 'dajia', 'code' => '04', @@ -61188,7 +61188,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '清水', 'name' => '清水区', - 'merge_name' => '中国,台湾,台中市,清水区', + 'merge_name' => '中国,台湾省,台中市,清水区', 'level' => 3, 'pinyin' => 'qingshui', 'code' => '04', @@ -61206,7 +61206,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '沙鹿', 'name' => '沙鹿区', - 'merge_name' => '中国,台湾,台中市,沙鹿区', + 'merge_name' => '中国,台湾省,台中市,沙鹿区', 'level' => 3, 'pinyin' => 'shalu', 'code' => '04', @@ -61224,7 +61224,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '梧栖', 'name' => '梧栖区', - 'merge_name' => '中国,台湾,台中市,梧栖区', + 'merge_name' => '中国,台湾省,台中市,梧栖区', 'level' => 3, 'pinyin' => 'wuqi', 'code' => '04', @@ -61242,7 +61242,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '后里', 'name' => '后里区', - 'merge_name' => '中国,台湾,台中市,后里区', + 'merge_name' => '中国,台湾省,台中市,后里区', 'level' => 3, 'pinyin' => 'houli', 'code' => '04', @@ -61260,7 +61260,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '神冈', 'name' => '神冈区', - 'merge_name' => '中国,台湾,台中市,神冈区', + 'merge_name' => '中国,台湾省,台中市,神冈区', 'level' => 3, 'pinyin' => 'shengang', 'code' => '04', @@ -61278,7 +61278,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '潭子', 'name' => '潭子区', - 'merge_name' => '中国,台湾,台中市,潭子区', + 'merge_name' => '中国,台湾省,台中市,潭子区', 'level' => 3, 'pinyin' => 'tanzi', 'code' => '04', @@ -61296,7 +61296,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '大雅', 'name' => '大雅区', - 'merge_name' => '中国,台湾,台中市,大雅区', + 'merge_name' => '中国,台湾省,台中市,大雅区', 'level' => 3, 'pinyin' => 'daya', 'code' => '04', @@ -61314,7 +61314,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '新社', 'name' => '新社区', - 'merge_name' => '中国,台湾,台中市,新社区', + 'merge_name' => '中国,台湾省,台中市,新社区', 'level' => 3, 'pinyin' => 'xinshe', 'code' => '04', @@ -61332,7 +61332,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '石冈', 'name' => '石冈区', - 'merge_name' => '中国,台湾,台中市,石冈区', + 'merge_name' => '中国,台湾省,台中市,石冈区', 'level' => 3, 'pinyin' => 'shigang', 'code' => '04', @@ -61350,7 +61350,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '外埔', 'name' => '外埔区', - 'merge_name' => '中国,台湾,台中市,外埔区', + 'merge_name' => '中国,台湾省,台中市,外埔区', 'level' => 3, 'pinyin' => 'waipu', 'code' => '04', @@ -61368,7 +61368,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '大安', 'name' => '大安区', - 'merge_name' => '中国,台湾,台中市,大安区', + 'merge_name' => '中国,台湾省,台中市,大安区', 'level' => 3, 'pinyin' => 'da\'an', 'code' => '04', @@ -61386,7 +61386,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '乌日', 'name' => '乌日区', - 'merge_name' => '中国,台湾,台中市,乌日区', + 'merge_name' => '中国,台湾省,台中市,乌日区', 'level' => 3, 'pinyin' => 'wuri', 'code' => '04', @@ -61404,7 +61404,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '大肚', 'name' => '大肚区', - 'merge_name' => '中国,台湾,台中市,大肚区', + 'merge_name' => '中国,台湾省,台中市,大肚区', 'level' => 3, 'pinyin' => 'dadu', 'code' => '04', @@ -61422,7 +61422,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '龙井', 'name' => '龙井区', - 'merge_name' => '中国,台湾,台中市,龙井区', + 'merge_name' => '中国,台湾省,台中市,龙井区', 'level' => 3, 'pinyin' => 'longjing', 'code' => '04', @@ -61440,7 +61440,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '雾峰', 'name' => '雾峰区', - 'merge_name' => '中国,台湾,台中市,雾峰区', + 'merge_name' => '中国,台湾省,台中市,雾峰区', 'level' => 3, 'pinyin' => 'wufeng', 'code' => '04', @@ -61458,7 +61458,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '太平', 'name' => '太平区', - 'merge_name' => '中国,台湾,台中市,太平区', + 'merge_name' => '中国,台湾省,台中市,太平区', 'level' => 3, 'pinyin' => 'taiping', 'code' => '04', @@ -61476,7 +61476,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '大里', 'name' => '大里区', - 'merge_name' => '中国,台湾,台中市,大里区', + 'merge_name' => '中国,台湾省,台中市,大里区', 'level' => 3, 'pinyin' => 'dali', 'code' => '04', @@ -61494,7 +61494,7 @@ class Area extends Migrator 'pid' => 3386, 'short_name' => '和平', 'name' => '和平区', - 'merge_name' => '中国,台湾,台中市,和平区', + 'merge_name' => '中国,台湾省,台中市,和平区', 'level' => 3, 'pinyin' => 'heping', 'code' => '04', @@ -61512,7 +61512,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '台南', 'name' => '台南市', - 'merge_name' => '中国,台湾,台南市', + 'merge_name' => '中国,台湾省,台南市', 'level' => 2, 'pinyin' => 'tainan', 'code' => '06', @@ -61530,7 +61530,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '东区', 'name' => '东区', - 'merge_name' => '中国,台湾,台南市,东区', + 'merge_name' => '中国,台湾省,台南市,东区', 'level' => 3, 'pinyin' => 'dongqu', 'code' => '06', @@ -61548,7 +61548,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '南区', 'name' => '南区', - 'merge_name' => '中国,台湾,台南市,南区', + 'merge_name' => '中国,台湾省,台南市,南区', 'level' => 3, 'pinyin' => 'nanqu', 'code' => '06', @@ -61566,7 +61566,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '北区', 'name' => '北区', - 'merge_name' => '中国,台湾,台南市,北区', + 'merge_name' => '中国,台湾省,台南市,北区', 'level' => 3, 'pinyin' => 'beiqu', 'code' => '06', @@ -61584,7 +61584,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '安南', 'name' => '安南区', - 'merge_name' => '中国,台湾,台南市,安南区', + 'merge_name' => '中国,台湾省,台南市,安南区', 'level' => 3, 'pinyin' => 'annan', 'code' => '06', @@ -61602,7 +61602,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '安平', 'name' => '安平区', - 'merge_name' => '中国,台湾,台南市,安平区', + 'merge_name' => '中国,台湾省,台南市,安平区', 'level' => 3, 'pinyin' => 'anping', 'code' => '06', @@ -61620,7 +61620,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '中西', 'name' => '中西区', - 'merge_name' => '中国,台湾,台南市,中西区', + 'merge_name' => '中国,台湾省,台南市,中西区', 'level' => 3, 'pinyin' => 'zhongxi', 'code' => '06', @@ -61638,7 +61638,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '新营', 'name' => '新营区', - 'merge_name' => '中国,台湾,台南市,新营区', + 'merge_name' => '中国,台湾省,台南市,新营区', 'level' => 3, 'pinyin' => 'xinying', 'code' => '06', @@ -61656,7 +61656,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '盐水', 'name' => '盐水区', - 'merge_name' => '中国,台湾,台南市,盐水区', + 'merge_name' => '中国,台湾省,台南市,盐水区', 'level' => 3, 'pinyin' => 'yanshui', 'code' => '06', @@ -61674,7 +61674,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '白河', 'name' => '白河区', - 'merge_name' => '中国,台湾,台南市,白河区', + 'merge_name' => '中国,台湾省,台南市,白河区', 'level' => 3, 'pinyin' => 'baihe', 'code' => '06', @@ -61692,7 +61692,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '柳营', 'name' => '柳营区', - 'merge_name' => '中国,台湾,台南市,柳营区', + 'merge_name' => '中国,台湾省,台南市,柳营区', 'level' => 3, 'pinyin' => 'liuying', 'code' => '06', @@ -61710,7 +61710,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '后壁', 'name' => '后壁区', - 'merge_name' => '中国,台湾,台南市,后壁区', + 'merge_name' => '中国,台湾省,台南市,后壁区', 'level' => 3, 'pinyin' => 'houbi', 'code' => '06', @@ -61728,7 +61728,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '东山', 'name' => '东山区', - 'merge_name' => '中国,台湾,台南市,东山区', + 'merge_name' => '中国,台湾省,台南市,东山区', 'level' => 3, 'pinyin' => 'dongshan', 'code' => '06', @@ -61746,7 +61746,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '麻豆', 'name' => '麻豆区', - 'merge_name' => '中国,台湾,台南市,麻豆区', + 'merge_name' => '中国,台湾省,台南市,麻豆区', 'level' => 3, 'pinyin' => 'madou', 'code' => '06', @@ -61764,7 +61764,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '下营', 'name' => '下营区', - 'merge_name' => '中国,台湾,台南市,下营区', + 'merge_name' => '中国,台湾省,台南市,下营区', 'level' => 3, 'pinyin' => 'xiaying', 'code' => '06', @@ -61782,7 +61782,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '六甲', 'name' => '六甲区', - 'merge_name' => '中国,台湾,台南市,六甲区', + 'merge_name' => '中国,台湾省,台南市,六甲区', 'level' => 3, 'pinyin' => 'liujia', 'code' => '06', @@ -61800,7 +61800,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '官田', 'name' => '官田区', - 'merge_name' => '中国,台湾,台南市,官田区', + 'merge_name' => '中国,台湾省,台南市,官田区', 'level' => 3, 'pinyin' => 'guantian', 'code' => '06', @@ -61818,7 +61818,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '大内', 'name' => '大内区', - 'merge_name' => '中国,台湾,台南市,大内区', + 'merge_name' => '中国,台湾省,台南市,大内区', 'level' => 3, 'pinyin' => 'dana', 'code' => '06', @@ -61836,7 +61836,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '佳里', 'name' => '佳里区', - 'merge_name' => '中国,台湾,台南市,佳里区', + 'merge_name' => '中国,台湾省,台南市,佳里区', 'level' => 3, 'pinyin' => 'jiali', 'code' => '06', @@ -61854,7 +61854,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '学甲', 'name' => '学甲区', - 'merge_name' => '中国,台湾,台南市,学甲区', + 'merge_name' => '中国,台湾省,台南市,学甲区', 'level' => 3, 'pinyin' => 'xuejia', 'code' => '06', @@ -61872,7 +61872,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '西港', 'name' => '西港区', - 'merge_name' => '中国,台湾,台南市,西港区', + 'merge_name' => '中国,台湾省,台南市,西港区', 'level' => 3, 'pinyin' => 'xigang', 'code' => '06', @@ -61890,7 +61890,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '七股', 'name' => '七股区', - 'merge_name' => '中国,台湾,台南市,七股区', + 'merge_name' => '中国,台湾省,台南市,七股区', 'level' => 3, 'pinyin' => 'qigu', 'code' => '06', @@ -61908,7 +61908,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '将军', 'name' => '将军区', - 'merge_name' => '中国,台湾,台南市,将军区', + 'merge_name' => '中国,台湾省,台南市,将军区', 'level' => 3, 'pinyin' => 'jiangjun', 'code' => '06', @@ -61926,7 +61926,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '北门', 'name' => '北门区', - 'merge_name' => '中国,台湾,台南市,北门区', + 'merge_name' => '中国,台湾省,台南市,北门区', 'level' => 3, 'pinyin' => 'beimen', 'code' => '06', @@ -61944,7 +61944,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '新化', 'name' => '新化区', - 'merge_name' => '中国,台湾,台南市,新化区', + 'merge_name' => '中国,台湾省,台南市,新化区', 'level' => 3, 'pinyin' => 'xinhua', 'code' => '06', @@ -61962,7 +61962,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '善化', 'name' => '善化区', - 'merge_name' => '中国,台湾,台南市,善化区', + 'merge_name' => '中国,台湾省,台南市,善化区', 'level' => 3, 'pinyin' => 'shanhua', 'code' => '06', @@ -61980,7 +61980,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '新市', 'name' => '新市区', - 'merge_name' => '中国,台湾,台南市,新市区', + 'merge_name' => '中国,台湾省,台南市,新市区', 'level' => 3, 'pinyin' => 'xinshi', 'code' => '06', @@ -61998,7 +61998,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '安定', 'name' => '安定区', - 'merge_name' => '中国,台湾,台南市,安定区', + 'merge_name' => '中国,台湾省,台南市,安定区', 'level' => 3, 'pinyin' => 'anding', 'code' => '06', @@ -62016,7 +62016,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '山上', 'name' => '山上区', - 'merge_name' => '中国,台湾,台南市,山上区', + 'merge_name' => '中国,台湾省,台南市,山上区', 'level' => 3, 'pinyin' => 'shanshang', 'code' => '06', @@ -62034,7 +62034,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '玉井', 'name' => '玉井区', - 'merge_name' => '中国,台湾,台南市,玉井区', + 'merge_name' => '中国,台湾省,台南市,玉井区', 'level' => 3, 'pinyin' => 'yujing', 'code' => '06', @@ -62052,7 +62052,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '楠西', 'name' => '楠西区', - 'merge_name' => '中国,台湾,台南市,楠西区', + 'merge_name' => '中国,台湾省,台南市,楠西区', 'level' => 3, 'pinyin' => 'nanxi', 'code' => '06', @@ -62070,7 +62070,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '南化', 'name' => '南化区', - 'merge_name' => '中国,台湾,台南市,南化区', + 'merge_name' => '中国,台湾省,台南市,南化区', 'level' => 3, 'pinyin' => 'nanhua', 'code' => '06', @@ -62088,7 +62088,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '左镇', 'name' => '左镇区', - 'merge_name' => '中国,台湾,台南市,左镇区', + 'merge_name' => '中国,台湾省,台南市,左镇区', 'level' => 3, 'pinyin' => 'zuozhen', 'code' => '06', @@ -62106,7 +62106,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '仁德', 'name' => '仁德区', - 'merge_name' => '中国,台湾,台南市,仁德区', + 'merge_name' => '中国,台湾省,台南市,仁德区', 'level' => 3, 'pinyin' => 'rende', 'code' => '06', @@ -62124,7 +62124,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '归仁', 'name' => '归仁区', - 'merge_name' => '中国,台湾,台南市,归仁区', + 'merge_name' => '中国,台湾省,台南市,归仁区', 'level' => 3, 'pinyin' => 'guiren', 'code' => '06', @@ -62142,7 +62142,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '关庙', 'name' => '关庙区', - 'merge_name' => '中国,台湾,台南市,关庙区', + 'merge_name' => '中国,台湾省,台南市,关庙区', 'level' => 3, 'pinyin' => 'guanmiao', 'code' => '06', @@ -62160,7 +62160,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '龙崎', 'name' => '龙崎区', - 'merge_name' => '中国,台湾,台南市,龙崎区', + 'merge_name' => '中国,台湾省,台南市,龙崎区', 'level' => 3, 'pinyin' => 'longqi', 'code' => '06', @@ -62178,7 +62178,7 @@ class Area extends Migrator 'pid' => 3416, 'short_name' => '永康', 'name' => '永康区', - 'merge_name' => '中国,台湾,台南市,永康区', + 'merge_name' => '中国,台湾省,台南市,永康区', 'level' => 3, 'pinyin' => 'yongkang', 'code' => '06', @@ -62196,7 +62196,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '新竹', 'name' => '新竹市', - 'merge_name' => '中国,台湾,新竹市', + 'merge_name' => '中国,台湾省,新竹市', 'level' => 2, 'pinyin' => 'hsinchu', 'code' => '03', @@ -62214,7 +62214,7 @@ class Area extends Migrator 'pid' => 3454, 'short_name' => '东区', 'name' => '东区', - 'merge_name' => '中国,台湾,新竹市,东区', + 'merge_name' => '中国,台湾省,新竹市,东区', 'level' => 3, 'pinyin' => 'dongqu', 'code' => '03', @@ -62232,7 +62232,7 @@ class Area extends Migrator 'pid' => 3454, 'short_name' => '北区', 'name' => '北区', - 'merge_name' => '中国,台湾,新竹市,北区', + 'merge_name' => '中国,台湾省,新竹市,北区', 'level' => 3, 'pinyin' => 'beiqu', 'code' => '03', @@ -62250,7 +62250,7 @@ class Area extends Migrator 'pid' => 3454, 'short_name' => '香山', 'name' => '香山区', - 'merge_name' => '中国,台湾,新竹市,香山区', + 'merge_name' => '中国,台湾省,新竹市,香山区', 'level' => 3, 'pinyin' => 'xiangshan', 'code' => '03', @@ -62268,7 +62268,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '嘉义', 'name' => '嘉义市', - 'merge_name' => '中国,台湾,嘉义市', + 'merge_name' => '中国,台湾省,嘉义市', 'level' => 2, 'pinyin' => 'chiayi', 'code' => '05', @@ -62286,7 +62286,7 @@ class Area extends Migrator 'pid' => 3458, 'short_name' => '东区', 'name' => '东区', - 'merge_name' => '中国,台湾,嘉义市,东区', + 'merge_name' => '中国,台湾省,嘉义市,东区', 'level' => 3, 'pinyin' => 'dongqu', 'code' => '05', @@ -62304,7 +62304,7 @@ class Area extends Migrator 'pid' => 3458, 'short_name' => '西区', 'name' => '西区', - 'merge_name' => '中国,台湾,嘉义市,西区', + 'merge_name' => '中国,台湾省,嘉义市,西区', 'level' => 3, 'pinyin' => 'xiqu', 'code' => '05', @@ -62322,7 +62322,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '新北', 'name' => '新北市', - 'merge_name' => '中国,台湾,新北市', + 'merge_name' => '中国,台湾省,新北市', 'level' => 2, 'pinyin' => 'newtaipei', 'code' => '02', @@ -62340,7 +62340,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '板桥', 'name' => '板桥区', - 'merge_name' => '中国,台湾,新北市,板桥区', + 'merge_name' => '中国,台湾省,新北市,板桥区', 'level' => 3, 'pinyin' => 'banqiao', 'code' => '02', @@ -62358,7 +62358,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '三重', 'name' => '三重区', - 'merge_name' => '中国,台湾,新北市,三重区', + 'merge_name' => '中国,台湾省,新北市,三重区', 'level' => 3, 'pinyin' => 'sanzhong', 'code' => '02', @@ -62376,7 +62376,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '中和', 'name' => '中和区', - 'merge_name' => '中国,台湾,新北市,中和区', + 'merge_name' => '中国,台湾省,新北市,中和区', 'level' => 3, 'pinyin' => 'zhonghe', 'code' => '02', @@ -62394,7 +62394,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '永和', 'name' => '永和区', - 'merge_name' => '中国,台湾,新北市,永和区', + 'merge_name' => '中国,台湾省,新北市,永和区', 'level' => 3, 'pinyin' => 'yonghe', 'code' => '02', @@ -62412,7 +62412,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '新庄', 'name' => '新庄区', - 'merge_name' => '中国,台湾,新北市,新庄区', + 'merge_name' => '中国,台湾省,新北市,新庄区', 'level' => 3, 'pinyin' => 'xinzhuang', 'code' => '02', @@ -62430,7 +62430,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '新店', 'name' => '新店区', - 'merge_name' => '中国,台湾,新北市,新店区', + 'merge_name' => '中国,台湾省,新北市,新店区', 'level' => 3, 'pinyin' => 'xindian', 'code' => '02', @@ -62448,7 +62448,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '树林', 'name' => '树林区', - 'merge_name' => '中国,台湾,新北市,树林区', + 'merge_name' => '中国,台湾省,新北市,树林区', 'level' => 3, 'pinyin' => 'shulin', 'code' => '02', @@ -62466,7 +62466,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '莺歌', 'name' => '莺歌区', - 'merge_name' => '中国,台湾,新北市,莺歌区', + 'merge_name' => '中国,台湾省,新北市,莺歌区', 'level' => 3, 'pinyin' => 'yingge', 'code' => '02', @@ -62484,7 +62484,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '三峡', 'name' => '三峡区', - 'merge_name' => '中国,台湾,新北市,三峡区', + 'merge_name' => '中国,台湾省,新北市,三峡区', 'level' => 3, 'pinyin' => 'sanxia', 'code' => '02', @@ -62502,7 +62502,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '淡水', 'name' => '淡水区', - 'merge_name' => '中国,台湾,新北市,淡水区', + 'merge_name' => '中国,台湾省,新北市,淡水区', 'level' => 3, 'pinyin' => 'danshui', 'code' => '02', @@ -62520,7 +62520,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '汐止', 'name' => '汐止区', - 'merge_name' => '中国,台湾,新北市,汐止区', + 'merge_name' => '中国,台湾省,新北市,汐止区', 'level' => 3, 'pinyin' => 'xizhi', 'code' => '02', @@ -62538,7 +62538,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '瑞芳', 'name' => '瑞芳区', - 'merge_name' => '中国,台湾,新北市,瑞芳区', + 'merge_name' => '中国,台湾省,新北市,瑞芳区', 'level' => 3, 'pinyin' => 'ruifang', 'code' => '02', @@ -62556,7 +62556,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '土城', 'name' => '土城区', - 'merge_name' => '中国,台湾,新北市,土城区', + 'merge_name' => '中国,台湾省,新北市,土城区', 'level' => 3, 'pinyin' => 'tucheng', 'code' => '02', @@ -62574,7 +62574,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '芦洲', 'name' => '芦洲区', - 'merge_name' => '中国,台湾,新北市,芦洲区', + 'merge_name' => '中国,台湾省,新北市,芦洲区', 'level' => 3, 'pinyin' => 'luzhou', 'code' => '02', @@ -62592,7 +62592,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '五股', 'name' => '五股区', - 'merge_name' => '中国,台湾,新北市,五股区', + 'merge_name' => '中国,台湾省,新北市,五股区', 'level' => 3, 'pinyin' => 'wugu', 'code' => '02', @@ -62610,7 +62610,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '泰山', 'name' => '泰山区', - 'merge_name' => '中国,台湾,新北市,泰山区', + 'merge_name' => '中国,台湾省,新北市,泰山区', 'level' => 3, 'pinyin' => 'taishan', 'code' => '02', @@ -62628,7 +62628,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '林口', 'name' => '林口区', - 'merge_name' => '中国,台湾,新北市,林口区', + 'merge_name' => '中国,台湾省,新北市,林口区', 'level' => 3, 'pinyin' => 'linkou', 'code' => '02', @@ -62646,7 +62646,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '深坑', 'name' => '深坑区', - 'merge_name' => '中国,台湾,新北市,深坑区', + 'merge_name' => '中国,台湾省,新北市,深坑区', 'level' => 3, 'pinyin' => 'shenkeng', 'code' => '02', @@ -62664,7 +62664,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '石碇', 'name' => '石碇区', - 'merge_name' => '中国,台湾,新北市,石碇区', + 'merge_name' => '中国,台湾省,新北市,石碇区', 'level' => 3, 'pinyin' => 'shiding', 'code' => '02', @@ -62682,7 +62682,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '坪林', 'name' => '坪林区', - 'merge_name' => '中国,台湾,新北市,坪林区', + 'merge_name' => '中国,台湾省,新北市,坪林区', 'level' => 3, 'pinyin' => 'pinglin', 'code' => '02', @@ -62700,7 +62700,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '三芝', 'name' => '三芝区', - 'merge_name' => '中国,台湾,新北市,三芝区', + 'merge_name' => '中国,台湾省,新北市,三芝区', 'level' => 3, 'pinyin' => 'sanzhi', 'code' => '02', @@ -62718,7 +62718,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '石门', 'name' => '石门区', - 'merge_name' => '中国,台湾,新北市,石门区', + 'merge_name' => '中国,台湾省,新北市,石门区', 'level' => 3, 'pinyin' => 'shimen', 'code' => '02', @@ -62736,7 +62736,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '八里', 'name' => '八里区', - 'merge_name' => '中国,台湾,新北市,八里区', + 'merge_name' => '中国,台湾省,新北市,八里区', 'level' => 3, 'pinyin' => 'bali', 'code' => '02', @@ -62754,7 +62754,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '平溪', 'name' => '平溪区', - 'merge_name' => '中国,台湾,新北市,平溪区', + 'merge_name' => '中国,台湾省,新北市,平溪区', 'level' => 3, 'pinyin' => 'pingxi', 'code' => '02', @@ -62772,7 +62772,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '双溪', 'name' => '双溪区', - 'merge_name' => '中国,台湾,新北市,双溪区', + 'merge_name' => '中国,台湾省,新北市,双溪区', 'level' => 3, 'pinyin' => 'shuangxi', 'code' => '02', @@ -62790,7 +62790,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '贡寮', 'name' => '贡寮区', - 'merge_name' => '中国,台湾,新北市,贡寮区', + 'merge_name' => '中国,台湾省,新北市,贡寮区', 'level' => 3, 'pinyin' => 'gongliao', 'code' => '02', @@ -62808,7 +62808,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '金山', 'name' => '金山区', - 'merge_name' => '中国,台湾,新北市,金山区', + 'merge_name' => '中国,台湾省,新北市,金山区', 'level' => 3, 'pinyin' => 'jinshan', 'code' => '02', @@ -62826,7 +62826,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '万里', 'name' => '万里区', - 'merge_name' => '中国,台湾,新北市,万里区', + 'merge_name' => '中国,台湾省,新北市,万里区', 'level' => 3, 'pinyin' => 'wanli', 'code' => '02', @@ -62844,7 +62844,7 @@ class Area extends Migrator 'pid' => 3461, 'short_name' => '乌来', 'name' => '乌来区', - 'merge_name' => '中国,台湾,新北市,乌来区', + 'merge_name' => '中国,台湾省,新北市,乌来区', 'level' => 3, 'pinyin' => 'wulai', 'code' => '02', @@ -62862,7 +62862,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '宜兰', 'name' => '宜兰县', - 'merge_name' => '中国,台湾,宜兰县', + 'merge_name' => '中国,台湾省,宜兰县', 'level' => 2, 'pinyin' => 'yilan', 'code' => '03', @@ -62880,7 +62880,7 @@ class Area extends Migrator 'pid' => 3491, 'short_name' => '宜兰', 'name' => '宜兰市', - 'merge_name' => '中国,台湾,宜兰县,宜兰市', + 'merge_name' => '中国,台湾省,宜兰县,宜兰市', 'level' => 3, 'pinyin' => 'yilan', 'code' => '03', @@ -62898,7 +62898,7 @@ class Area extends Migrator 'pid' => 3491, 'short_name' => '罗东', 'name' => '罗东镇', - 'merge_name' => '中国,台湾,宜兰县,罗东镇', + 'merge_name' => '中国,台湾省,宜兰县,罗东镇', 'level' => 3, 'pinyin' => 'luodong', 'code' => '03', @@ -62916,7 +62916,7 @@ class Area extends Migrator 'pid' => 3491, 'short_name' => '苏澳', 'name' => '苏澳镇', - 'merge_name' => '中国,台湾,宜兰县,苏澳镇', + 'merge_name' => '中国,台湾省,宜兰县,苏澳镇', 'level' => 3, 'pinyin' => 'suao', 'code' => '03', @@ -62934,7 +62934,7 @@ class Area extends Migrator 'pid' => 3491, 'short_name' => '头城', 'name' => '头城镇', - 'merge_name' => '中国,台湾,宜兰县,头城镇', + 'merge_name' => '中国,台湾省,宜兰县,头城镇', 'level' => 3, 'pinyin' => 'toucheng', 'code' => '03', @@ -62952,7 +62952,7 @@ class Area extends Migrator 'pid' => 3491, 'short_name' => '礁溪', 'name' => '礁溪乡', - 'merge_name' => '中国,台湾,宜兰县,礁溪乡', + 'merge_name' => '中国,台湾省,宜兰县,礁溪乡', 'level' => 3, 'pinyin' => 'jiaoxi', 'code' => '03', @@ -62970,7 +62970,7 @@ class Area extends Migrator 'pid' => 3491, 'short_name' => '壮围', 'name' => '壮围乡', - 'merge_name' => '中国,台湾,宜兰县,壮围乡', + 'merge_name' => '中国,台湾省,宜兰县,壮围乡', 'level' => 3, 'pinyin' => 'zhuangwei', 'code' => '03', @@ -62988,7 +62988,7 @@ class Area extends Migrator 'pid' => 3491, 'short_name' => '员山', 'name' => '员山乡', - 'merge_name' => '中国,台湾,宜兰县,员山乡', + 'merge_name' => '中国,台湾省,宜兰县,员山乡', 'level' => 3, 'pinyin' => 'yuanshan', 'code' => '03', @@ -63006,7 +63006,7 @@ class Area extends Migrator 'pid' => 3491, 'short_name' => '冬山', 'name' => '冬山乡', - 'merge_name' => '中国,台湾,宜兰县,冬山乡', + 'merge_name' => '中国,台湾省,宜兰县,冬山乡', 'level' => 3, 'pinyin' => 'dongshan', 'code' => '03', @@ -63024,7 +63024,7 @@ class Area extends Migrator 'pid' => 3491, 'short_name' => '五结', 'name' => '五结乡', - 'merge_name' => '中国,台湾,宜兰县,五结乡', + 'merge_name' => '中国,台湾省,宜兰县,五结乡', 'level' => 3, 'pinyin' => 'wujie', 'code' => '03', @@ -63042,7 +63042,7 @@ class Area extends Migrator 'pid' => 3491, 'short_name' => '三星', 'name' => '三星乡', - 'merge_name' => '中国,台湾,宜兰县,三星乡', + 'merge_name' => '中国,台湾省,宜兰县,三星乡', 'level' => 3, 'pinyin' => 'sanxing', 'code' => '03', @@ -63060,7 +63060,7 @@ class Area extends Migrator 'pid' => 3491, 'short_name' => '大同', 'name' => '大同乡', - 'merge_name' => '中国,台湾,宜兰县,大同乡', + 'merge_name' => '中国,台湾省,宜兰县,大同乡', 'level' => 3, 'pinyin' => 'datong', 'code' => '03', @@ -63078,7 +63078,7 @@ class Area extends Migrator 'pid' => 3491, 'short_name' => '南澳', 'name' => '南澳乡', - 'merge_name' => '中国,台湾,宜兰县,南澳乡', + 'merge_name' => '中国,台湾省,宜兰县,南澳乡', 'level' => 3, 'pinyin' => 'nanao', 'code' => '03', @@ -63096,7 +63096,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '桃园', 'name' => '桃园县', - 'merge_name' => '中国,台湾,桃园县', + 'merge_name' => '中国,台湾省,桃园县', 'level' => 2, 'pinyin' => 'taoyuan', 'code' => '03', @@ -63114,7 +63114,7 @@ class Area extends Migrator 'pid' => 3504, 'short_name' => '桃园', 'name' => '桃园市', - 'merge_name' => '中国,台湾,桃园县,桃园市', + 'merge_name' => '中国,台湾省,桃园县,桃园市', 'level' => 3, 'pinyin' => 'taoyuan', 'code' => '03', @@ -63132,7 +63132,7 @@ class Area extends Migrator 'pid' => 3504, 'short_name' => '中坜', 'name' => '中坜市', - 'merge_name' => '中国,台湾,桃园县,中坜市', + 'merge_name' => '中国,台湾省,桃园县,中坜市', 'level' => 3, 'pinyin' => 'zhongli', 'code' => '03', @@ -63150,7 +63150,7 @@ class Area extends Migrator 'pid' => 3504, 'short_name' => '平镇', 'name' => '平镇市', - 'merge_name' => '中国,台湾,桃园县,平镇市', + 'merge_name' => '中国,台湾省,桃园县,平镇市', 'level' => 3, 'pinyin' => 'pingzhen', 'code' => '03', @@ -63168,7 +63168,7 @@ class Area extends Migrator 'pid' => 3504, 'short_name' => '八德', 'name' => '八德市', - 'merge_name' => '中国,台湾,桃园县,八德市', + 'merge_name' => '中国,台湾省,桃园县,八德市', 'level' => 3, 'pinyin' => 'bade', 'code' => '03', @@ -63186,7 +63186,7 @@ class Area extends Migrator 'pid' => 3504, 'short_name' => '杨梅', 'name' => '杨梅市', - 'merge_name' => '中国,台湾,桃园县,杨梅市', + 'merge_name' => '中国,台湾省,桃园县,杨梅市', 'level' => 3, 'pinyin' => 'yangmei', 'code' => '03', @@ -63204,7 +63204,7 @@ class Area extends Migrator 'pid' => 3504, 'short_name' => '芦竹', 'name' => '芦竹市', - 'merge_name' => '中国,台湾,桃园县,芦竹市', + 'merge_name' => '中国,台湾省,桃园县,芦竹市', 'level' => 3, 'pinyin' => 'luzhu', 'code' => '03', @@ -63222,7 +63222,7 @@ class Area extends Migrator 'pid' => 3504, 'short_name' => '大溪', 'name' => '大溪镇', - 'merge_name' => '中国,台湾,桃园县,大溪镇', + 'merge_name' => '中国,台湾省,桃园县,大溪镇', 'level' => 3, 'pinyin' => 'daxi', 'code' => '03', @@ -63240,7 +63240,7 @@ class Area extends Migrator 'pid' => 3504, 'short_name' => '大园', 'name' => '大园乡', - 'merge_name' => '中国,台湾,桃园县,大园乡', + 'merge_name' => '中国,台湾省,桃园县,大园乡', 'level' => 3, 'pinyin' => 'dayuan', 'code' => '03', @@ -63258,7 +63258,7 @@ class Area extends Migrator 'pid' => 3504, 'short_name' => '龟山', 'name' => '龟山乡', - 'merge_name' => '中国,台湾,桃园县,龟山乡', + 'merge_name' => '中国,台湾省,桃园县,龟山乡', 'level' => 3, 'pinyin' => 'guishan', 'code' => '03', @@ -63276,7 +63276,7 @@ class Area extends Migrator 'pid' => 3504, 'short_name' => '龙潭', 'name' => '龙潭乡', - 'merge_name' => '中国,台湾,桃园县,龙潭乡', + 'merge_name' => '中国,台湾省,桃园县,龙潭乡', 'level' => 3, 'pinyin' => 'longtan', 'code' => '03', @@ -63294,7 +63294,7 @@ class Area extends Migrator 'pid' => 3504, 'short_name' => '新屋', 'name' => '新屋乡', - 'merge_name' => '中国,台湾,桃园县,新屋乡', + 'merge_name' => '中国,台湾省,桃园县,新屋乡', 'level' => 3, 'pinyin' => 'xinwu', 'code' => '03', @@ -63312,7 +63312,7 @@ class Area extends Migrator 'pid' => 3504, 'short_name' => '观音', 'name' => '观音乡', - 'merge_name' => '中国,台湾,桃园县,观音乡', + 'merge_name' => '中国,台湾省,桃园县,观音乡', 'level' => 3, 'pinyin' => 'guanyin', 'code' => '03', @@ -63330,7 +63330,7 @@ class Area extends Migrator 'pid' => 3504, 'short_name' => '复兴', 'name' => '复兴乡', - 'merge_name' => '中国,台湾,桃园县,复兴乡', + 'merge_name' => '中国,台湾省,桃园县,复兴乡', 'level' => 3, 'pinyin' => 'fuxing', 'code' => '03', @@ -63348,7 +63348,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '新竹', 'name' => '新竹县', - 'merge_name' => '中国,台湾,新竹县', + 'merge_name' => '中国,台湾省,新竹县', 'level' => 2, 'pinyin' => 'hsinchu', 'code' => '03', @@ -63366,7 +63366,7 @@ class Area extends Migrator 'pid' => 3518, 'short_name' => '竹北', 'name' => '竹北市', - 'merge_name' => '中国,台湾,新竹县,竹北市', + 'merge_name' => '中国,台湾省,新竹县,竹北市', 'level' => 3, 'pinyin' => 'zhubei', 'code' => '03', @@ -63384,7 +63384,7 @@ class Area extends Migrator 'pid' => 3518, 'short_name' => '竹东', 'name' => '竹东镇', - 'merge_name' => '中国,台湾,新竹县,竹东镇', + 'merge_name' => '中国,台湾省,新竹县,竹东镇', 'level' => 3, 'pinyin' => 'zhudong', 'code' => '03', @@ -63402,7 +63402,7 @@ class Area extends Migrator 'pid' => 3518, 'short_name' => '新埔', 'name' => '新埔镇', - 'merge_name' => '中国,台湾,新竹县,新埔镇', + 'merge_name' => '中国,台湾省,新竹县,新埔镇', 'level' => 3, 'pinyin' => 'xinpu', 'code' => '03', @@ -63420,7 +63420,7 @@ class Area extends Migrator 'pid' => 3518, 'short_name' => '关西', 'name' => '关西镇', - 'merge_name' => '中国,台湾,新竹县,关西镇', + 'merge_name' => '中国,台湾省,新竹县,关西镇', 'level' => 3, 'pinyin' => 'guanxi', 'code' => '03', @@ -63438,7 +63438,7 @@ class Area extends Migrator 'pid' => 3518, 'short_name' => '湖口', 'name' => '湖口乡', - 'merge_name' => '中国,台湾,新竹县,湖口乡', + 'merge_name' => '中国,台湾省,新竹县,湖口乡', 'level' => 3, 'pinyin' => 'hukou', 'code' => '03', @@ -63456,7 +63456,7 @@ class Area extends Migrator 'pid' => 3518, 'short_name' => '新丰', 'name' => '新丰乡', - 'merge_name' => '中国,台湾,新竹县,新丰乡', + 'merge_name' => '中国,台湾省,新竹县,新丰乡', 'level' => 3, 'pinyin' => 'xinfeng', 'code' => '03', @@ -63474,7 +63474,7 @@ class Area extends Migrator 'pid' => 3518, 'short_name' => '芎林', 'name' => '芎林乡', - 'merge_name' => '中国,台湾,新竹县,芎林乡', + 'merge_name' => '中国,台湾省,新竹县,芎林乡', 'level' => 3, 'pinyin' => 'xionglin', 'code' => '03', @@ -63492,7 +63492,7 @@ class Area extends Migrator 'pid' => 3518, 'short_name' => '横山', 'name' => '横山乡', - 'merge_name' => '中国,台湾,新竹县,横山乡', + 'merge_name' => '中国,台湾省,新竹县,横山乡', 'level' => 3, 'pinyin' => 'hengshan', 'code' => '03', @@ -63510,7 +63510,7 @@ class Area extends Migrator 'pid' => 3518, 'short_name' => '北埔', 'name' => '北埔乡', - 'merge_name' => '中国,台湾,新竹县,北埔乡', + 'merge_name' => '中国,台湾省,新竹县,北埔乡', 'level' => 3, 'pinyin' => 'beipu', 'code' => '03', @@ -63528,7 +63528,7 @@ class Area extends Migrator 'pid' => 3518, 'short_name' => '宝山', 'name' => '宝山乡', - 'merge_name' => '中国,台湾,新竹县,宝山乡', + 'merge_name' => '中国,台湾省,新竹县,宝山乡', 'level' => 3, 'pinyin' => 'baoshan', 'code' => '03', @@ -63546,7 +63546,7 @@ class Area extends Migrator 'pid' => 3518, 'short_name' => '峨眉', 'name' => '峨眉乡', - 'merge_name' => '中国,台湾,新竹县,峨眉乡', + 'merge_name' => '中国,台湾省,新竹县,峨眉乡', 'level' => 3, 'pinyin' => 'emei', 'code' => '03', @@ -63564,7 +63564,7 @@ class Area extends Migrator 'pid' => 3518, 'short_name' => '尖石', 'name' => '尖石乡', - 'merge_name' => '中国,台湾,新竹县,尖石乡', + 'merge_name' => '中国,台湾省,新竹县,尖石乡', 'level' => 3, 'pinyin' => 'jianshi', 'code' => '03', @@ -63582,7 +63582,7 @@ class Area extends Migrator 'pid' => 3518, 'short_name' => '五峰', 'name' => '五峰乡', - 'merge_name' => '中国,台湾,新竹县,五峰乡', + 'merge_name' => '中国,台湾省,新竹县,五峰乡', 'level' => 3, 'pinyin' => 'wufeng', 'code' => '03', @@ -63600,7 +63600,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '苗栗', 'name' => '苗栗县', - 'merge_name' => '中国,台湾,苗栗县', + 'merge_name' => '中国,台湾省,苗栗县', 'level' => 2, 'pinyin' => 'miaoli', 'code' => '037', @@ -63618,7 +63618,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '苗栗', 'name' => '苗栗市', - 'merge_name' => '中国,台湾,苗栗县,苗栗市', + 'merge_name' => '中国,台湾省,苗栗县,苗栗市', 'level' => 3, 'pinyin' => 'miaoli', 'code' => '037', @@ -63636,7 +63636,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '苑里', 'name' => '苑里镇', - 'merge_name' => '中国,台湾,苗栗县,苑里镇', + 'merge_name' => '中国,台湾省,苗栗县,苑里镇', 'level' => 3, 'pinyin' => 'yuanli', 'code' => '037', @@ -63654,7 +63654,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '通霄', 'name' => '通霄镇', - 'merge_name' => '中国,台湾,苗栗县,通霄镇', + 'merge_name' => '中国,台湾省,苗栗县,通霄镇', 'level' => 3, 'pinyin' => 'tongxiao', 'code' => '037', @@ -63672,7 +63672,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '竹南', 'name' => '竹南镇', - 'merge_name' => '中国,台湾,苗栗县,竹南镇', + 'merge_name' => '中国,台湾省,苗栗县,竹南镇', 'level' => 3, 'pinyin' => 'zhunan', 'code' => '037', @@ -63690,7 +63690,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '头份', 'name' => '头份镇', - 'merge_name' => '中国,台湾,苗栗县,头份镇', + 'merge_name' => '中国,台湾省,苗栗县,头份镇', 'level' => 3, 'pinyin' => 'toufen', 'code' => '037', @@ -63708,7 +63708,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '后龙', 'name' => '后龙镇', - 'merge_name' => '中国,台湾,苗栗县,后龙镇', + 'merge_name' => '中国,台湾省,苗栗县,后龙镇', 'level' => 3, 'pinyin' => 'houlong', 'code' => '037', @@ -63726,7 +63726,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '卓兰', 'name' => '卓兰镇', - 'merge_name' => '中国,台湾,苗栗县,卓兰镇', + 'merge_name' => '中国,台湾省,苗栗县,卓兰镇', 'level' => 3, 'pinyin' => 'zhuolan', 'code' => '037', @@ -63744,7 +63744,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '大湖', 'name' => '大湖乡', - 'merge_name' => '中国,台湾,苗栗县,大湖乡', + 'merge_name' => '中国,台湾省,苗栗县,大湖乡', 'level' => 3, 'pinyin' => 'dahu', 'code' => '037', @@ -63762,7 +63762,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '公馆', 'name' => '公馆乡', - 'merge_name' => '中国,台湾,苗栗县,公馆乡', + 'merge_name' => '中国,台湾省,苗栗县,公馆乡', 'level' => 3, 'pinyin' => 'gongguan', 'code' => '037', @@ -63780,7 +63780,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '铜锣', 'name' => '铜锣乡', - 'merge_name' => '中国,台湾,苗栗县,铜锣乡', + 'merge_name' => '中国,台湾省,苗栗县,铜锣乡', 'level' => 3, 'pinyin' => 'tongluo', 'code' => '037', @@ -63798,7 +63798,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '南庄', 'name' => '南庄乡', - 'merge_name' => '中国,台湾,苗栗县,南庄乡', + 'merge_name' => '中国,台湾省,苗栗县,南庄乡', 'level' => 3, 'pinyin' => 'nanzhuang', 'code' => '037', @@ -63816,7 +63816,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '头屋', 'name' => '头屋乡', - 'merge_name' => '中国,台湾,苗栗县,头屋乡', + 'merge_name' => '中国,台湾省,苗栗县,头屋乡', 'level' => 3, 'pinyin' => 'touwu', 'code' => '037', @@ -63834,7 +63834,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '三义', 'name' => '三义乡', - 'merge_name' => '中国,台湾,苗栗县,三义乡', + 'merge_name' => '中国,台湾省,苗栗县,三义乡', 'level' => 3, 'pinyin' => 'sanyi', 'code' => '037', @@ -63852,7 +63852,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '西湖', 'name' => '西湖乡', - 'merge_name' => '中国,台湾,苗栗县,西湖乡', + 'merge_name' => '中国,台湾省,苗栗县,西湖乡', 'level' => 3, 'pinyin' => 'xihu', 'code' => '037', @@ -63870,7 +63870,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '造桥', 'name' => '造桥乡', - 'merge_name' => '中国,台湾,苗栗县,造桥乡', + 'merge_name' => '中国,台湾省,苗栗县,造桥乡', 'level' => 3, 'pinyin' => 'zaoqiao', 'code' => '037', @@ -63888,7 +63888,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '三湾', 'name' => '三湾乡', - 'merge_name' => '中国,台湾,苗栗县,三湾乡', + 'merge_name' => '中国,台湾省,苗栗县,三湾乡', 'level' => 3, 'pinyin' => 'sanwan', 'code' => '037', @@ -63906,7 +63906,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '狮潭', 'name' => '狮潭乡', - 'merge_name' => '中国,台湾,苗栗县,狮潭乡', + 'merge_name' => '中国,台湾省,苗栗县,狮潭乡', 'level' => 3, 'pinyin' => 'shitan', 'code' => '037', @@ -63924,7 +63924,7 @@ class Area extends Migrator 'pid' => 3532, 'short_name' => '泰安', 'name' => '泰安乡', - 'merge_name' => '中国,台湾,苗栗县,泰安乡', + 'merge_name' => '中国,台湾省,苗栗县,泰安乡', 'level' => 3, 'pinyin' => 'tai\'an', 'code' => '037', @@ -63942,7 +63942,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '彰化', 'name' => '彰化县', - 'merge_name' => '中国,台湾,彰化县', + 'merge_name' => '中国,台湾省,彰化县', 'level' => 2, 'pinyin' => 'changhua', 'code' => '04', @@ -63960,7 +63960,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '彰化市', 'name' => '彰化市', - 'merge_name' => '中国,台湾,彰化县,彰化市', + 'merge_name' => '中国,台湾省,彰化县,彰化市', 'level' => 3, 'pinyin' => 'zhanghuashi', 'code' => '04', @@ -63978,7 +63978,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '鹿港', 'name' => '鹿港镇', - 'merge_name' => '中国,台湾,彰化县,鹿港镇', + 'merge_name' => '中国,台湾省,彰化县,鹿港镇', 'level' => 3, 'pinyin' => 'lugang', 'code' => '04', @@ -63996,7 +63996,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '和美', 'name' => '和美镇', - 'merge_name' => '中国,台湾,彰化县,和美镇', + 'merge_name' => '中国,台湾省,彰化县,和美镇', 'level' => 3, 'pinyin' => 'hemei', 'code' => '04', @@ -64014,7 +64014,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '线西', 'name' => '线西乡', - 'merge_name' => '中国,台湾,彰化县,线西乡', + 'merge_name' => '中国,台湾省,彰化县,线西乡', 'level' => 3, 'pinyin' => 'xianxi', 'code' => '04', @@ -64032,7 +64032,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '伸港', 'name' => '伸港乡', - 'merge_name' => '中国,台湾,彰化县,伸港乡', + 'merge_name' => '中国,台湾省,彰化县,伸港乡', 'level' => 3, 'pinyin' => 'shengang', 'code' => '04', @@ -64050,7 +64050,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '福兴', 'name' => '福兴乡', - 'merge_name' => '中国,台湾,彰化县,福兴乡', + 'merge_name' => '中国,台湾省,彰化县,福兴乡', 'level' => 3, 'pinyin' => 'fuxing', 'code' => '04', @@ -64068,7 +64068,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '秀水', 'name' => '秀水乡', - 'merge_name' => '中国,台湾,彰化县,秀水乡', + 'merge_name' => '中国,台湾省,彰化县,秀水乡', 'level' => 3, 'pinyin' => 'xiushui', 'code' => '04', @@ -64086,7 +64086,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '花坛', 'name' => '花坛乡', - 'merge_name' => '中国,台湾,彰化县,花坛乡', + 'merge_name' => '中国,台湾省,彰化县,花坛乡', 'level' => 3, 'pinyin' => 'huatan', 'code' => '04', @@ -64104,7 +64104,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '芬园', 'name' => '芬园乡', - 'merge_name' => '中国,台湾,彰化县,芬园乡', + 'merge_name' => '中国,台湾省,彰化县,芬园乡', 'level' => 3, 'pinyin' => 'fenyuan', 'code' => '04', @@ -64122,7 +64122,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '员林', 'name' => '员林镇', - 'merge_name' => '中国,台湾,彰化县,员林镇', + 'merge_name' => '中国,台湾省,彰化县,员林镇', 'level' => 3, 'pinyin' => 'yuanlin', 'code' => '04', @@ -64140,7 +64140,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '溪湖', 'name' => '溪湖镇', - 'merge_name' => '中国,台湾,彰化县,溪湖镇', + 'merge_name' => '中国,台湾省,彰化县,溪湖镇', 'level' => 3, 'pinyin' => 'xihu', 'code' => '04', @@ -64158,7 +64158,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '田中', 'name' => '田中镇', - 'merge_name' => '中国,台湾,彰化县,田中镇', + 'merge_name' => '中国,台湾省,彰化县,田中镇', 'level' => 3, 'pinyin' => 'tianzhong', 'code' => '04', @@ -64176,7 +64176,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '大村', 'name' => '大村乡', - 'merge_name' => '中国,台湾,彰化县,大村乡', + 'merge_name' => '中国,台湾省,彰化县,大村乡', 'level' => 3, 'pinyin' => 'dacun', 'code' => '04', @@ -64194,7 +64194,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '埔盐', 'name' => '埔盐乡', - 'merge_name' => '中国,台湾,彰化县,埔盐乡', + 'merge_name' => '中国,台湾省,彰化县,埔盐乡', 'level' => 3, 'pinyin' => 'puyan', 'code' => '04', @@ -64212,7 +64212,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '埔心', 'name' => '埔心乡', - 'merge_name' => '中国,台湾,彰化县,埔心乡', + 'merge_name' => '中国,台湾省,彰化县,埔心乡', 'level' => 3, 'pinyin' => 'puxin', 'code' => '04', @@ -64230,7 +64230,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '永靖', 'name' => '永靖乡', - 'merge_name' => '中国,台湾,彰化县,永靖乡', + 'merge_name' => '中国,台湾省,彰化县,永靖乡', 'level' => 3, 'pinyin' => 'yongjing', 'code' => '04', @@ -64248,7 +64248,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '社头', 'name' => '社头乡', - 'merge_name' => '中国,台湾,彰化县,社头乡', + 'merge_name' => '中国,台湾省,彰化县,社头乡', 'level' => 3, 'pinyin' => 'shetou', 'code' => '04', @@ -64266,7 +64266,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '二水', 'name' => '二水乡', - 'merge_name' => '中国,台湾,彰化县,二水乡', + 'merge_name' => '中国,台湾省,彰化县,二水乡', 'level' => 3, 'pinyin' => 'ershui', 'code' => '04', @@ -64284,7 +64284,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '北斗', 'name' => '北斗镇', - 'merge_name' => '中国,台湾,彰化县,北斗镇', + 'merge_name' => '中国,台湾省,彰化县,北斗镇', 'level' => 3, 'pinyin' => 'beidou', 'code' => '04', @@ -64302,7 +64302,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '二林', 'name' => '二林镇', - 'merge_name' => '中国,台湾,彰化县,二林镇', + 'merge_name' => '中国,台湾省,彰化县,二林镇', 'level' => 3, 'pinyin' => 'erlin', 'code' => '04', @@ -64320,7 +64320,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '田尾', 'name' => '田尾乡', - 'merge_name' => '中国,台湾,彰化县,田尾乡', + 'merge_name' => '中国,台湾省,彰化县,田尾乡', 'level' => 3, 'pinyin' => 'tianwei', 'code' => '04', @@ -64338,7 +64338,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '埤头', 'name' => '埤头乡', - 'merge_name' => '中国,台湾,彰化县,埤头乡', + 'merge_name' => '中国,台湾省,彰化县,埤头乡', 'level' => 3, 'pinyin' => 'pitou', 'code' => '04', @@ -64356,7 +64356,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '芳苑', 'name' => '芳苑乡', - 'merge_name' => '中国,台湾,彰化县,芳苑乡', + 'merge_name' => '中国,台湾省,彰化县,芳苑乡', 'level' => 3, 'pinyin' => 'fangyuan', 'code' => '04', @@ -64374,7 +64374,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '大城', 'name' => '大城乡', - 'merge_name' => '中国,台湾,彰化县,大城乡', + 'merge_name' => '中国,台湾省,彰化县,大城乡', 'level' => 3, 'pinyin' => 'dacheng', 'code' => '04', @@ -64392,7 +64392,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '竹塘', 'name' => '竹塘乡', - 'merge_name' => '中国,台湾,彰化县,竹塘乡', + 'merge_name' => '中国,台湾省,彰化县,竹塘乡', 'level' => 3, 'pinyin' => 'zhutang', 'code' => '04', @@ -64410,7 +64410,7 @@ class Area extends Migrator 'pid' => 3551, 'short_name' => '溪州', 'name' => '溪州乡', - 'merge_name' => '中国,台湾,彰化县,溪州乡', + 'merge_name' => '中国,台湾省,彰化县,溪州乡', 'level' => 3, 'pinyin' => 'xizhou', 'code' => '04', @@ -64428,7 +64428,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '南投', 'name' => '南投县', - 'merge_name' => '中国,台湾,南投县', + 'merge_name' => '中国,台湾省,南投县', 'level' => 2, 'pinyin' => 'nantou', 'code' => '049', @@ -64446,7 +64446,7 @@ class Area extends Migrator 'pid' => 3578, 'short_name' => '南投市', 'name' => '南投市', - 'merge_name' => '中国,台湾,南投县,南投市', + 'merge_name' => '中国,台湾省,南投县,南投市', 'level' => 3, 'pinyin' => 'nantoushi', 'code' => '049', @@ -64464,7 +64464,7 @@ class Area extends Migrator 'pid' => 3578, 'short_name' => '埔里', 'name' => '埔里镇', - 'merge_name' => '中国,台湾,南投县,埔里镇', + 'merge_name' => '中国,台湾省,南投县,埔里镇', 'level' => 3, 'pinyin' => 'puli', 'code' => '049', @@ -64482,7 +64482,7 @@ class Area extends Migrator 'pid' => 3578, 'short_name' => '草屯', 'name' => '草屯镇', - 'merge_name' => '中国,台湾,南投县,草屯镇', + 'merge_name' => '中国,台湾省,南投县,草屯镇', 'level' => 3, 'pinyin' => 'caotun', 'code' => '049', @@ -64500,7 +64500,7 @@ class Area extends Migrator 'pid' => 3578, 'short_name' => '竹山', 'name' => '竹山镇', - 'merge_name' => '中国,台湾,南投县,竹山镇', + 'merge_name' => '中国,台湾省,南投县,竹山镇', 'level' => 3, 'pinyin' => 'zhushan', 'code' => '049', @@ -64518,7 +64518,7 @@ class Area extends Migrator 'pid' => 3578, 'short_name' => '集集', 'name' => '集集镇', - 'merge_name' => '中国,台湾,南投县,集集镇', + 'merge_name' => '中国,台湾省,南投县,集集镇', 'level' => 3, 'pinyin' => 'jiji', 'code' => '049', @@ -64536,7 +64536,7 @@ class Area extends Migrator 'pid' => 3578, 'short_name' => '名间', 'name' => '名间乡', - 'merge_name' => '中国,台湾,南投县,名间乡', + 'merge_name' => '中国,台湾省,南投县,名间乡', 'level' => 3, 'pinyin' => 'mingjian', 'code' => '049', @@ -64554,7 +64554,7 @@ class Area extends Migrator 'pid' => 3578, 'short_name' => '鹿谷', 'name' => '鹿谷乡', - 'merge_name' => '中国,台湾,南投县,鹿谷乡', + 'merge_name' => '中国,台湾省,南投县,鹿谷乡', 'level' => 3, 'pinyin' => 'lugu', 'code' => '049', @@ -64572,7 +64572,7 @@ class Area extends Migrator 'pid' => 3578, 'short_name' => '中寮', 'name' => '中寮乡', - 'merge_name' => '中国,台湾,南投县,中寮乡', + 'merge_name' => '中国,台湾省,南投县,中寮乡', 'level' => 3, 'pinyin' => 'zhongliao', 'code' => '049', @@ -64590,7 +64590,7 @@ class Area extends Migrator 'pid' => 3578, 'short_name' => '鱼池', 'name' => '鱼池乡', - 'merge_name' => '中国,台湾,南投县,鱼池乡', + 'merge_name' => '中国,台湾省,南投县,鱼池乡', 'level' => 3, 'pinyin' => 'yuchi', 'code' => '049', @@ -64608,7 +64608,7 @@ class Area extends Migrator 'pid' => 3578, 'short_name' => '国姓', 'name' => '国姓乡', - 'merge_name' => '中国,台湾,南投县,国姓乡', + 'merge_name' => '中国,台湾省,南投县,国姓乡', 'level' => 3, 'pinyin' => 'guoxing', 'code' => '049', @@ -64626,7 +64626,7 @@ class Area extends Migrator 'pid' => 3578, 'short_name' => '水里', 'name' => '水里乡', - 'merge_name' => '中国,台湾,南投县,水里乡', + 'merge_name' => '中国,台湾省,南投县,水里乡', 'level' => 3, 'pinyin' => 'shuili', 'code' => '049', @@ -64644,7 +64644,7 @@ class Area extends Migrator 'pid' => 3578, 'short_name' => '信义', 'name' => '信义乡', - 'merge_name' => '中国,台湾,南投县,信义乡', + 'merge_name' => '中国,台湾省,南投县,信义乡', 'level' => 3, 'pinyin' => 'xinyi', 'code' => '049', @@ -64662,7 +64662,7 @@ class Area extends Migrator 'pid' => 3578, 'short_name' => '仁爱', 'name' => '仁爱乡', - 'merge_name' => '中国,台湾,南投县,仁爱乡', + 'merge_name' => '中国,台湾省,南投县,仁爱乡', 'level' => 3, 'pinyin' => 'renai', 'code' => '049', @@ -64680,7 +64680,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '云林', 'name' => '云林县', - 'merge_name' => '中国,台湾,云林县', + 'merge_name' => '中国,台湾省,云林县', 'level' => 2, 'pinyin' => 'yunlin', 'code' => '05', @@ -64698,7 +64698,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '斗六', 'name' => '斗六市', - 'merge_name' => '中国,台湾,云林县,斗六市', + 'merge_name' => '中国,台湾省,云林县,斗六市', 'level' => 3, 'pinyin' => 'douliu', 'code' => '05', @@ -64716,7 +64716,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '斗南', 'name' => '斗南镇', - 'merge_name' => '中国,台湾,云林县,斗南镇', + 'merge_name' => '中国,台湾省,云林县,斗南镇', 'level' => 3, 'pinyin' => 'dounan', 'code' => '05', @@ -64734,7 +64734,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '虎尾', 'name' => '虎尾镇', - 'merge_name' => '中国,台湾,云林县,虎尾镇', + 'merge_name' => '中国,台湾省,云林县,虎尾镇', 'level' => 3, 'pinyin' => 'huwei', 'code' => '05', @@ -64752,7 +64752,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '西螺', 'name' => '西螺镇', - 'merge_name' => '中国,台湾,云林县,西螺镇', + 'merge_name' => '中国,台湾省,云林县,西螺镇', 'level' => 3, 'pinyin' => 'xiluo', 'code' => '05', @@ -64770,7 +64770,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '土库', 'name' => '土库镇', - 'merge_name' => '中国,台湾,云林县,土库镇', + 'merge_name' => '中国,台湾省,云林县,土库镇', 'level' => 3, 'pinyin' => 'tuku', 'code' => '05', @@ -64788,7 +64788,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '北港', 'name' => '北港镇', - 'merge_name' => '中国,台湾,云林县,北港镇', + 'merge_name' => '中国,台湾省,云林县,北港镇', 'level' => 3, 'pinyin' => 'beigang', 'code' => '05', @@ -64806,7 +64806,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '古坑', 'name' => '古坑乡', - 'merge_name' => '中国,台湾,云林县,古坑乡', + 'merge_name' => '中国,台湾省,云林县,古坑乡', 'level' => 3, 'pinyin' => 'gukeng', 'code' => '05', @@ -64824,7 +64824,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '大埤', 'name' => '大埤乡', - 'merge_name' => '中国,台湾,云林县,大埤乡', + 'merge_name' => '中国,台湾省,云林县,大埤乡', 'level' => 3, 'pinyin' => 'dapi', 'code' => '05', @@ -64842,7 +64842,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '莿桐', 'name' => '莿桐乡', - 'merge_name' => '中国,台湾,云林县,莿桐乡', + 'merge_name' => '中国,台湾省,云林县,莿桐乡', 'level' => 3, 'pinyin' => 'citong', 'code' => '05', @@ -64860,7 +64860,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '林内', 'name' => '林内乡', - 'merge_name' => '中国,台湾,云林县,林内乡', + 'merge_name' => '中国,台湾省,云林县,林内乡', 'level' => 3, 'pinyin' => 'linna', 'code' => '05', @@ -64878,7 +64878,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '二仑', 'name' => '二仑乡', - 'merge_name' => '中国,台湾,云林县,二仑乡', + 'merge_name' => '中国,台湾省,云林县,二仑乡', 'level' => 3, 'pinyin' => 'erlun', 'code' => '05', @@ -64896,7 +64896,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '仑背', 'name' => '仑背乡', - 'merge_name' => '中国,台湾,云林县,仑背乡', + 'merge_name' => '中国,台湾省,云林县,仑背乡', 'level' => 3, 'pinyin' => 'lunbei', 'code' => '05', @@ -64914,7 +64914,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '麦寮', 'name' => '麦寮乡', - 'merge_name' => '中国,台湾,云林县,麦寮乡', + 'merge_name' => '中国,台湾省,云林县,麦寮乡', 'level' => 3, 'pinyin' => 'mailiao', 'code' => '05', @@ -64932,7 +64932,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '东势', 'name' => '东势乡', - 'merge_name' => '中国,台湾,云林县,东势乡', + 'merge_name' => '中国,台湾省,云林县,东势乡', 'level' => 3, 'pinyin' => 'dongshi', 'code' => '05', @@ -64950,7 +64950,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '褒忠', 'name' => '褒忠乡', - 'merge_name' => '中国,台湾,云林县,褒忠乡', + 'merge_name' => '中国,台湾省,云林县,褒忠乡', 'level' => 3, 'pinyin' => 'baozhong', 'code' => '05', @@ -64968,7 +64968,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '台西', 'name' => '台西乡', - 'merge_name' => '中国,台湾,云林县,台西乡', + 'merge_name' => '中国,台湾省,云林县,台西乡', 'level' => 3, 'pinyin' => 'taixi', 'code' => '05', @@ -64986,7 +64986,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '元长', 'name' => '元长乡', - 'merge_name' => '中国,台湾,云林县,元长乡', + 'merge_name' => '中国,台湾省,云林县,元长乡', 'level' => 3, 'pinyin' => 'yuanchang', 'code' => '05', @@ -65004,7 +65004,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '四湖', 'name' => '四湖乡', - 'merge_name' => '中国,台湾,云林县,四湖乡', + 'merge_name' => '中国,台湾省,云林县,四湖乡', 'level' => 3, 'pinyin' => 'sihu', 'code' => '05', @@ -65022,7 +65022,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '口湖', 'name' => '口湖乡', - 'merge_name' => '中国,台湾,云林县,口湖乡', + 'merge_name' => '中国,台湾省,云林县,口湖乡', 'level' => 3, 'pinyin' => 'kouhu', 'code' => '05', @@ -65040,7 +65040,7 @@ class Area extends Migrator 'pid' => 3592, 'short_name' => '水林', 'name' => '水林乡', - 'merge_name' => '中国,台湾,云林县,水林乡', + 'merge_name' => '中国,台湾省,云林县,水林乡', 'level' => 3, 'pinyin' => 'shuilin', 'code' => '05', @@ -65058,7 +65058,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '嘉义', 'name' => '嘉义县', - 'merge_name' => '中国,台湾,嘉义县', + 'merge_name' => '中国,台湾省,嘉义县', 'level' => 2, 'pinyin' => 'chiayi', 'code' => '05', @@ -65076,7 +65076,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '太保', 'name' => '太保市', - 'merge_name' => '中国,台湾,嘉义县,太保市', + 'merge_name' => '中国,台湾省,嘉义县,太保市', 'level' => 3, 'pinyin' => 'taibao', 'code' => '05', @@ -65094,7 +65094,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '朴子', 'name' => '朴子市', - 'merge_name' => '中国,台湾,嘉义县,朴子市', + 'merge_name' => '中国,台湾省,嘉义县,朴子市', 'level' => 3, 'pinyin' => 'puzi', 'code' => '05', @@ -65112,7 +65112,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '布袋', 'name' => '布袋镇', - 'merge_name' => '中国,台湾,嘉义县,布袋镇', + 'merge_name' => '中国,台湾省,嘉义县,布袋镇', 'level' => 3, 'pinyin' => 'budai', 'code' => '05', @@ -65130,7 +65130,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '大林', 'name' => '大林镇', - 'merge_name' => '中国,台湾,嘉义县,大林镇', + 'merge_name' => '中国,台湾省,嘉义县,大林镇', 'level' => 3, 'pinyin' => 'dalin', 'code' => '05', @@ -65148,7 +65148,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '民雄', 'name' => '民雄乡', - 'merge_name' => '中国,台湾,嘉义县,民雄乡', + 'merge_name' => '中国,台湾省,嘉义县,民雄乡', 'level' => 3, 'pinyin' => 'minxiong', 'code' => '05', @@ -65166,7 +65166,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '溪口', 'name' => '溪口乡', - 'merge_name' => '中国,台湾,嘉义县,溪口乡', + 'merge_name' => '中国,台湾省,嘉义县,溪口乡', 'level' => 3, 'pinyin' => 'xikou', 'code' => '05', @@ -65184,7 +65184,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '新港', 'name' => '新港乡', - 'merge_name' => '中国,台湾,嘉义县,新港乡', + 'merge_name' => '中国,台湾省,嘉义县,新港乡', 'level' => 3, 'pinyin' => 'xingang', 'code' => '05', @@ -65202,7 +65202,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '六脚', 'name' => '六脚乡', - 'merge_name' => '中国,台湾,嘉义县,六脚乡', + 'merge_name' => '中国,台湾省,嘉义县,六脚乡', 'level' => 3, 'pinyin' => 'liujiao', 'code' => '05', @@ -65220,7 +65220,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '东石', 'name' => '东石乡', - 'merge_name' => '中国,台湾,嘉义县,东石乡', + 'merge_name' => '中国,台湾省,嘉义县,东石乡', 'level' => 3, 'pinyin' => 'dongshi', 'code' => '05', @@ -65238,7 +65238,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '义竹', 'name' => '义竹乡', - 'merge_name' => '中国,台湾,嘉义县,义竹乡', + 'merge_name' => '中国,台湾省,嘉义县,义竹乡', 'level' => 3, 'pinyin' => 'yizhu', 'code' => '05', @@ -65256,7 +65256,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '鹿草', 'name' => '鹿草乡', - 'merge_name' => '中国,台湾,嘉义县,鹿草乡', + 'merge_name' => '中国,台湾省,嘉义县,鹿草乡', 'level' => 3, 'pinyin' => 'lucao', 'code' => '05', @@ -65274,7 +65274,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '水上', 'name' => '水上乡', - 'merge_name' => '中国,台湾,嘉义县,水上乡', + 'merge_name' => '中国,台湾省,嘉义县,水上乡', 'level' => 3, 'pinyin' => 'shuishang', 'code' => '05', @@ -65292,7 +65292,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '中埔', 'name' => '中埔乡', - 'merge_name' => '中国,台湾,嘉义县,中埔乡', + 'merge_name' => '中国,台湾省,嘉义县,中埔乡', 'level' => 3, 'pinyin' => 'zhongpu', 'code' => '05', @@ -65310,7 +65310,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '竹崎', 'name' => '竹崎乡', - 'merge_name' => '中国,台湾,嘉义县,竹崎乡', + 'merge_name' => '中国,台湾省,嘉义县,竹崎乡', 'level' => 3, 'pinyin' => 'zhuqi', 'code' => '05', @@ -65328,7 +65328,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '梅山', 'name' => '梅山乡', - 'merge_name' => '中国,台湾,嘉义县,梅山乡', + 'merge_name' => '中国,台湾省,嘉义县,梅山乡', 'level' => 3, 'pinyin' => 'meishan', 'code' => '05', @@ -65346,7 +65346,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '番路', 'name' => '番路乡', - 'merge_name' => '中国,台湾,嘉义县,番路乡', + 'merge_name' => '中国,台湾省,嘉义县,番路乡', 'level' => 3, 'pinyin' => 'fanlu', 'code' => '05', @@ -65364,7 +65364,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '大埔', 'name' => '大埔乡', - 'merge_name' => '中国,台湾,嘉义县,大埔乡', + 'merge_name' => '中国,台湾省,嘉义县,大埔乡', 'level' => 3, 'pinyin' => 'dapu', 'code' => '05', @@ -65382,7 +65382,7 @@ class Area extends Migrator 'pid' => 3613, 'short_name' => '阿里山', 'name' => '阿里山乡', - 'merge_name' => '中国,台湾,嘉义县,阿里山乡', + 'merge_name' => '中国,台湾省,嘉义县,阿里山乡', 'level' => 3, 'pinyin' => 'alishan', 'code' => '05', @@ -65400,7 +65400,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '屏东', 'name' => '屏东县', - 'merge_name' => '中国,台湾,屏东县', + 'merge_name' => '中国,台湾省,屏东县', 'level' => 2, 'pinyin' => 'pingtung', 'code' => '08', @@ -65418,7 +65418,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '屏东', 'name' => '屏东市', - 'merge_name' => '中国,台湾,屏东县,屏东市', + 'merge_name' => '中国,台湾省,屏东县,屏东市', 'level' => 3, 'pinyin' => 'pingdong', 'code' => '08', @@ -65436,7 +65436,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '潮州', 'name' => '潮州镇', - 'merge_name' => '中国,台湾,屏东县,潮州镇', + 'merge_name' => '中国,台湾省,屏东县,潮州镇', 'level' => 3, 'pinyin' => 'chaozhou', 'code' => '08', @@ -65454,7 +65454,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '东港', 'name' => '东港镇', - 'merge_name' => '中国,台湾,屏东县,东港镇', + 'merge_name' => '中国,台湾省,屏东县,东港镇', 'level' => 3, 'pinyin' => 'donggang', 'code' => '08', @@ -65472,7 +65472,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '恒春', 'name' => '恒春镇', - 'merge_name' => '中国,台湾,屏东县,恒春镇', + 'merge_name' => '中国,台湾省,屏东县,恒春镇', 'level' => 3, 'pinyin' => 'hengchun', 'code' => '08', @@ -65490,7 +65490,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '万丹', 'name' => '万丹乡', - 'merge_name' => '中国,台湾,屏东县,万丹乡', + 'merge_name' => '中国,台湾省,屏东县,万丹乡', 'level' => 3, 'pinyin' => 'wandan', 'code' => '08', @@ -65508,7 +65508,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '长治', 'name' => '长治乡', - 'merge_name' => '中国,台湾,屏东县,长治乡', + 'merge_name' => '中国,台湾省,屏东县,长治乡', 'level' => 3, 'pinyin' => 'changzhi', 'code' => '08', @@ -65526,7 +65526,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '麟洛', 'name' => '麟洛乡', - 'merge_name' => '中国,台湾,屏东县,麟洛乡', + 'merge_name' => '中国,台湾省,屏东县,麟洛乡', 'level' => 3, 'pinyin' => 'linluo', 'code' => '08', @@ -65544,7 +65544,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '九如', 'name' => '九如乡', - 'merge_name' => '中国,台湾,屏东县,九如乡', + 'merge_name' => '中国,台湾省,屏东县,九如乡', 'level' => 3, 'pinyin' => 'jiuru', 'code' => '08', @@ -65562,7 +65562,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '里港', 'name' => '里港乡', - 'merge_name' => '中国,台湾,屏东县,里港乡', + 'merge_name' => '中国,台湾省,屏东县,里港乡', 'level' => 3, 'pinyin' => 'ligang', 'code' => '08', @@ -65580,7 +65580,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '盐埔', 'name' => '盐埔乡', - 'merge_name' => '中国,台湾,屏东县,盐埔乡', + 'merge_name' => '中国,台湾省,屏东县,盐埔乡', 'level' => 3, 'pinyin' => 'yanpu', 'code' => '08', @@ -65598,7 +65598,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '高树', 'name' => '高树乡', - 'merge_name' => '中国,台湾,屏东县,高树乡', + 'merge_name' => '中国,台湾省,屏东县,高树乡', 'level' => 3, 'pinyin' => 'gaoshu', 'code' => '08', @@ -65616,7 +65616,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '万峦', 'name' => '万峦乡', - 'merge_name' => '中国,台湾,屏东县,万峦乡', + 'merge_name' => '中国,台湾省,屏东县,万峦乡', 'level' => 3, 'pinyin' => 'wanluan', 'code' => '08', @@ -65634,7 +65634,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '内埔', 'name' => '内埔乡', - 'merge_name' => '中国,台湾,屏东县,内埔乡', + 'merge_name' => '中国,台湾省,屏东县,内埔乡', 'level' => 3, 'pinyin' => 'napu', 'code' => '08', @@ -65652,7 +65652,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '竹田', 'name' => '竹田乡', - 'merge_name' => '中国,台湾,屏东县,竹田乡', + 'merge_name' => '中国,台湾省,屏东县,竹田乡', 'level' => 3, 'pinyin' => 'zhutian', 'code' => '08', @@ -65670,7 +65670,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '新埤', 'name' => '新埤乡', - 'merge_name' => '中国,台湾,屏东县,新埤乡', + 'merge_name' => '中国,台湾省,屏东县,新埤乡', 'level' => 3, 'pinyin' => 'xinpi', 'code' => '08', @@ -65688,7 +65688,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '枋寮', 'name' => '枋寮乡', - 'merge_name' => '中国,台湾,屏东县,枋寮乡', + 'merge_name' => '中国,台湾省,屏东县,枋寮乡', 'level' => 3, 'pinyin' => 'fangliao', 'code' => '08', @@ -65706,7 +65706,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '新园', 'name' => '新园乡', - 'merge_name' => '中国,台湾,屏东县,新园乡', + 'merge_name' => '中国,台湾省,屏东县,新园乡', 'level' => 3, 'pinyin' => 'xinyuan', 'code' => '08', @@ -65724,7 +65724,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '崁顶', 'name' => '崁顶乡', - 'merge_name' => '中国,台湾,屏东县,崁顶乡', + 'merge_name' => '中国,台湾省,屏东县,崁顶乡', 'level' => 3, 'pinyin' => 'kanding', 'code' => '08', @@ -65742,7 +65742,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '林边', 'name' => '林边乡', - 'merge_name' => '中国,台湾,屏东县,林边乡', + 'merge_name' => '中国,台湾省,屏东县,林边乡', 'level' => 3, 'pinyin' => 'linbian', 'code' => '08', @@ -65760,7 +65760,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '南州', 'name' => '南州乡', - 'merge_name' => '中国,台湾,屏东县,南州乡', + 'merge_name' => '中国,台湾省,屏东县,南州乡', 'level' => 3, 'pinyin' => 'nanzhou', 'code' => '08', @@ -65778,7 +65778,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '佳冬', 'name' => '佳冬乡', - 'merge_name' => '中国,台湾,屏东县,佳冬乡', + 'merge_name' => '中国,台湾省,屏东县,佳冬乡', 'level' => 3, 'pinyin' => 'jiadong', 'code' => '08', @@ -65796,7 +65796,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '琉球', 'name' => '琉球乡', - 'merge_name' => '中国,台湾,屏东县,琉球乡', + 'merge_name' => '中国,台湾省,屏东县,琉球乡', 'level' => 3, 'pinyin' => 'liuqiu', 'code' => '08', @@ -65814,7 +65814,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '车城', 'name' => '车城乡', - 'merge_name' => '中国,台湾,屏东县,车城乡', + 'merge_name' => '中国,台湾省,屏东县,车城乡', 'level' => 3, 'pinyin' => 'checheng', 'code' => '08', @@ -65832,7 +65832,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '满州', 'name' => '满州乡', - 'merge_name' => '中国,台湾,屏东县,满州乡', + 'merge_name' => '中国,台湾省,屏东县,满州乡', 'level' => 3, 'pinyin' => 'manzhou', 'code' => '08', @@ -65850,7 +65850,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '枋山', 'name' => '枋山乡', - 'merge_name' => '中国,台湾,屏东县,枋山乡', + 'merge_name' => '中国,台湾省,屏东县,枋山乡', 'level' => 3, 'pinyin' => 'fangshan', 'code' => '08', @@ -65868,7 +65868,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '三地门', 'name' => '三地门乡', - 'merge_name' => '中国,台湾,屏东县,三地门乡', + 'merge_name' => '中国,台湾省,屏东县,三地门乡', 'level' => 3, 'pinyin' => 'sandimen', 'code' => '08', @@ -65886,7 +65886,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '雾台', 'name' => '雾台乡', - 'merge_name' => '中国,台湾,屏东县,雾台乡', + 'merge_name' => '中国,台湾省,屏东县,雾台乡', 'level' => 3, 'pinyin' => 'wutai', 'code' => '08', @@ -65904,7 +65904,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '玛家', 'name' => '玛家乡', - 'merge_name' => '中国,台湾,屏东县,玛家乡', + 'merge_name' => '中国,台湾省,屏东县,玛家乡', 'level' => 3, 'pinyin' => 'majia', 'code' => '08', @@ -65922,7 +65922,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '泰武', 'name' => '泰武乡', - 'merge_name' => '中国,台湾,屏东县,泰武乡', + 'merge_name' => '中国,台湾省,屏东县,泰武乡', 'level' => 3, 'pinyin' => 'taiwu', 'code' => '08', @@ -65940,7 +65940,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '来义', 'name' => '来义乡', - 'merge_name' => '中国,台湾,屏东县,来义乡', + 'merge_name' => '中国,台湾省,屏东县,来义乡', 'level' => 3, 'pinyin' => 'laiyi', 'code' => '08', @@ -65958,7 +65958,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '春日', 'name' => '春日乡', - 'merge_name' => '中国,台湾,屏东县,春日乡', + 'merge_name' => '中国,台湾省,屏东县,春日乡', 'level' => 3, 'pinyin' => 'chunri', 'code' => '08', @@ -65976,7 +65976,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '狮子', 'name' => '狮子乡', - 'merge_name' => '中国,台湾,屏东县,狮子乡', + 'merge_name' => '中国,台湾省,屏东县,狮子乡', 'level' => 3, 'pinyin' => 'shizi', 'code' => '08', @@ -65994,7 +65994,7 @@ class Area extends Migrator 'pid' => 3632, 'short_name' => '牡丹', 'name' => '牡丹乡', - 'merge_name' => '中国,台湾,屏东县,牡丹乡', + 'merge_name' => '中国,台湾省,屏东县,牡丹乡', 'level' => 3, 'pinyin' => 'mudan', 'code' => '08', @@ -66012,7 +66012,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '台东', 'name' => '台东县', - 'merge_name' => '中国,台湾,台东县', + 'merge_name' => '中国,台湾省,台东县', 'level' => 2, 'pinyin' => 'taitung', 'code' => '089', @@ -66030,7 +66030,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '台东', 'name' => '台东市', - 'merge_name' => '中国,台湾,台东县,台东市', + 'merge_name' => '中国,台湾省,台东县,台东市', 'level' => 3, 'pinyin' => 'taidong', 'code' => '089', @@ -66048,7 +66048,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '成功', 'name' => '成功镇', - 'merge_name' => '中国,台湾,台东县,成功镇', + 'merge_name' => '中国,台湾省,台东县,成功镇', 'level' => 3, 'pinyin' => 'chenggong', 'code' => '089', @@ -66066,7 +66066,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '关山', 'name' => '关山镇', - 'merge_name' => '中国,台湾,台东县,关山镇', + 'merge_name' => '中国,台湾省,台东县,关山镇', 'level' => 3, 'pinyin' => 'guanshan', 'code' => '089', @@ -66084,7 +66084,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '卑南', 'name' => '卑南乡', - 'merge_name' => '中国,台湾,台东县,卑南乡', + 'merge_name' => '中国,台湾省,台东县,卑南乡', 'level' => 3, 'pinyin' => 'beinan', 'code' => '089', @@ -66102,7 +66102,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '鹿野', 'name' => '鹿野乡', - 'merge_name' => '中国,台湾,台东县,鹿野乡', + 'merge_name' => '中国,台湾省,台东县,鹿野乡', 'level' => 3, 'pinyin' => 'luye', 'code' => '089', @@ -66120,7 +66120,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '池上', 'name' => '池上乡', - 'merge_name' => '中国,台湾,台东县,池上乡', + 'merge_name' => '中国,台湾省,台东县,池上乡', 'level' => 3, 'pinyin' => 'chishang', 'code' => '089', @@ -66138,7 +66138,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '东河', 'name' => '东河乡', - 'merge_name' => '中国,台湾,台东县,东河乡', + 'merge_name' => '中国,台湾省,台东县,东河乡', 'level' => 3, 'pinyin' => 'donghe', 'code' => '089', @@ -66156,7 +66156,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '长滨', 'name' => '长滨乡', - 'merge_name' => '中国,台湾,台东县,长滨乡', + 'merge_name' => '中国,台湾省,台东县,长滨乡', 'level' => 3, 'pinyin' => 'changbin', 'code' => '089', @@ -66174,7 +66174,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '太麻里', 'name' => '太麻里乡', - 'merge_name' => '中国,台湾,台东县,太麻里乡', + 'merge_name' => '中国,台湾省,台东县,太麻里乡', 'level' => 3, 'pinyin' => 'taimali', 'code' => '089', @@ -66192,7 +66192,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '大武', 'name' => '大武乡', - 'merge_name' => '中国,台湾,台东县,大武乡', + 'merge_name' => '中国,台湾省,台东县,大武乡', 'level' => 3, 'pinyin' => 'dawu', 'code' => '089', @@ -66210,7 +66210,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '绿岛', 'name' => '绿岛乡', - 'merge_name' => '中国,台湾,台东县,绿岛乡', + 'merge_name' => '中国,台湾省,台东县,绿岛乡', 'level' => 3, 'pinyin' => 'lvdao', 'code' => '089', @@ -66228,7 +66228,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '海端', 'name' => '海端乡', - 'merge_name' => '中国,台湾,台东县,海端乡', + 'merge_name' => '中国,台湾省,台东县,海端乡', 'level' => 3, 'pinyin' => 'haiduan', 'code' => '089', @@ -66246,7 +66246,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '延平', 'name' => '延平乡', - 'merge_name' => '中国,台湾,台东县,延平乡', + 'merge_name' => '中国,台湾省,台东县,延平乡', 'level' => 3, 'pinyin' => 'yanping', 'code' => '089', @@ -66264,7 +66264,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '金峰', 'name' => '金峰乡', - 'merge_name' => '中国,台湾,台东县,金峰乡', + 'merge_name' => '中国,台湾省,台东县,金峰乡', 'level' => 3, 'pinyin' => 'jinfeng', 'code' => '089', @@ -66282,7 +66282,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '达仁', 'name' => '达仁乡', - 'merge_name' => '中国,台湾,台东县,达仁乡', + 'merge_name' => '中国,台湾省,台东县,达仁乡', 'level' => 3, 'pinyin' => 'daren', 'code' => '089', @@ -66300,7 +66300,7 @@ class Area extends Migrator 'pid' => 3666, 'short_name' => '兰屿', 'name' => '兰屿乡', - 'merge_name' => '中国,台湾,台东县,兰屿乡', + 'merge_name' => '中国,台湾省,台东县,兰屿乡', 'level' => 3, 'pinyin' => 'lanyu', 'code' => '089', @@ -66318,7 +66318,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '花莲', 'name' => '花莲县', - 'merge_name' => '中国,台湾,花莲县', + 'merge_name' => '中国,台湾省,花莲县', 'level' => 2, 'pinyin' => 'hualien', 'code' => '03', @@ -66336,7 +66336,7 @@ class Area extends Migrator 'pid' => 3683, 'short_name' => '花莲', 'name' => '花莲市', - 'merge_name' => '中国,台湾,花莲县,花莲市', + 'merge_name' => '中国,台湾省,花莲县,花莲市', 'level' => 3, 'pinyin' => 'hualian', 'code' => '03', @@ -66354,7 +66354,7 @@ class Area extends Migrator 'pid' => 3683, 'short_name' => '凤林', 'name' => '凤林镇', - 'merge_name' => '中国,台湾,花莲县,凤林镇', + 'merge_name' => '中国,台湾省,花莲县,凤林镇', 'level' => 3, 'pinyin' => 'fenglin', 'code' => '03', @@ -66372,7 +66372,7 @@ class Area extends Migrator 'pid' => 3683, 'short_name' => '玉里', 'name' => '玉里镇', - 'merge_name' => '中国,台湾,花莲县,玉里镇', + 'merge_name' => '中国,台湾省,花莲县,玉里镇', 'level' => 3, 'pinyin' => 'yuli', 'code' => '03', @@ -66390,7 +66390,7 @@ class Area extends Migrator 'pid' => 3683, 'short_name' => '新城', 'name' => '新城乡', - 'merge_name' => '中国,台湾,花莲县,新城乡', + 'merge_name' => '中国,台湾省,花莲县,新城乡', 'level' => 3, 'pinyin' => 'xincheng', 'code' => '03', @@ -66408,7 +66408,7 @@ class Area extends Migrator 'pid' => 3683, 'short_name' => '吉安', 'name' => '吉安乡', - 'merge_name' => '中国,台湾,花莲县,吉安乡', + 'merge_name' => '中国,台湾省,花莲县,吉安乡', 'level' => 3, 'pinyin' => 'ji\'an', 'code' => '03', @@ -66426,7 +66426,7 @@ class Area extends Migrator 'pid' => 3683, 'short_name' => '寿丰', 'name' => '寿丰乡', - 'merge_name' => '中国,台湾,花莲县,寿丰乡', + 'merge_name' => '中国,台湾省,花莲县,寿丰乡', 'level' => 3, 'pinyin' => 'shoufeng', 'code' => '03', @@ -66444,7 +66444,7 @@ class Area extends Migrator 'pid' => 3683, 'short_name' => '光复', 'name' => '光复乡', - 'merge_name' => '中国,台湾,花莲县,光复乡', + 'merge_name' => '中国,台湾省,花莲县,光复乡', 'level' => 3, 'pinyin' => 'guangfu', 'code' => '03', @@ -66462,7 +66462,7 @@ class Area extends Migrator 'pid' => 3683, 'short_name' => '丰滨', 'name' => '丰滨乡', - 'merge_name' => '中国,台湾,花莲县,丰滨乡', + 'merge_name' => '中国,台湾省,花莲县,丰滨乡', 'level' => 3, 'pinyin' => 'fengbin', 'code' => '03', @@ -66480,7 +66480,7 @@ class Area extends Migrator 'pid' => 3683, 'short_name' => '瑞穗', 'name' => '瑞穗乡', - 'merge_name' => '中国,台湾,花莲县,瑞穗乡', + 'merge_name' => '中国,台湾省,花莲县,瑞穗乡', 'level' => 3, 'pinyin' => 'ruisui', 'code' => '03', @@ -66498,7 +66498,7 @@ class Area extends Migrator 'pid' => 3683, 'short_name' => '富里', 'name' => '富里乡', - 'merge_name' => '中国,台湾,花莲县,富里乡', + 'merge_name' => '中国,台湾省,花莲县,富里乡', 'level' => 3, 'pinyin' => 'fuli', 'code' => '03', @@ -66516,7 +66516,7 @@ class Area extends Migrator 'pid' => 3683, 'short_name' => '秀林', 'name' => '秀林乡', - 'merge_name' => '中国,台湾,花莲县,秀林乡', + 'merge_name' => '中国,台湾省,花莲县,秀林乡', 'level' => 3, 'pinyin' => 'xiulin', 'code' => '03', @@ -66534,7 +66534,7 @@ class Area extends Migrator 'pid' => 3683, 'short_name' => '万荣', 'name' => '万荣乡', - 'merge_name' => '中国,台湾,花莲县,万荣乡', + 'merge_name' => '中国,台湾省,花莲县,万荣乡', 'level' => 3, 'pinyin' => 'wanrong', 'code' => '03', @@ -66552,7 +66552,7 @@ class Area extends Migrator 'pid' => 3683, 'short_name' => '卓溪', 'name' => '卓溪乡', - 'merge_name' => '中国,台湾,花莲县,卓溪乡', + 'merge_name' => '中国,台湾省,花莲县,卓溪乡', 'level' => 3, 'pinyin' => 'zhuoxi', 'code' => '03', @@ -66570,7 +66570,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '澎湖', 'name' => '澎湖县', - 'merge_name' => '中国,台湾,澎湖县', + 'merge_name' => '中国,台湾省,澎湖县', 'level' => 2, 'pinyin' => 'penghu', 'code' => '06', @@ -66588,7 +66588,7 @@ class Area extends Migrator 'pid' => 3697, 'short_name' => '马公', 'name' => '马公市', - 'merge_name' => '中国,台湾,澎湖县,马公市', + 'merge_name' => '中国,台湾省,澎湖县,马公市', 'level' => 3, 'pinyin' => 'magong', 'code' => '06', @@ -66606,7 +66606,7 @@ class Area extends Migrator 'pid' => 3697, 'short_name' => '湖西', 'name' => '湖西乡', - 'merge_name' => '中国,台湾,澎湖县,湖西乡', + 'merge_name' => '中国,台湾省,澎湖县,湖西乡', 'level' => 3, 'pinyin' => 'huxi', 'code' => '06', @@ -66624,7 +66624,7 @@ class Area extends Migrator 'pid' => 3697, 'short_name' => '白沙', 'name' => '白沙乡', - 'merge_name' => '中国,台湾,澎湖县,白沙乡', + 'merge_name' => '中国,台湾省,澎湖县,白沙乡', 'level' => 3, 'pinyin' => 'baisha', 'code' => '06', @@ -66642,7 +66642,7 @@ class Area extends Migrator 'pid' => 3697, 'short_name' => '西屿', 'name' => '西屿乡', - 'merge_name' => '中国,台湾,澎湖县,西屿乡', + 'merge_name' => '中国,台湾省,澎湖县,西屿乡', 'level' => 3, 'pinyin' => 'xiyu', 'code' => '06', @@ -66660,7 +66660,7 @@ class Area extends Migrator 'pid' => 3697, 'short_name' => '望安', 'name' => '望安乡', - 'merge_name' => '中国,台湾,澎湖县,望安乡', + 'merge_name' => '中国,台湾省,澎湖县,望安乡', 'level' => 3, 'pinyin' => 'wang\'an', 'code' => '06', @@ -66678,7 +66678,7 @@ class Area extends Migrator 'pid' => 3697, 'short_name' => '七美', 'name' => '七美乡', - 'merge_name' => '中国,台湾,澎湖县,七美乡', + 'merge_name' => '中国,台湾省,澎湖县,七美乡', 'level' => 3, 'pinyin' => 'qimei', 'code' => '06', @@ -66696,7 +66696,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '金门', 'name' => '金门县', - 'merge_name' => '中国,台湾,金门县', + 'merge_name' => '中国,台湾省,金门县', 'level' => 2, 'pinyin' => 'jinmen', 'code' => '082', @@ -66714,7 +66714,7 @@ class Area extends Migrator 'pid' => 3704, 'short_name' => '金城', 'name' => '金城镇', - 'merge_name' => '中国,台湾,金门县,金城镇', + 'merge_name' => '中国,台湾省,金门县,金城镇', 'level' => 3, 'pinyin' => 'jincheng', 'code' => '082', @@ -66732,7 +66732,7 @@ class Area extends Migrator 'pid' => 3704, 'short_name' => '金湖', 'name' => '金湖镇', - 'merge_name' => '中国,台湾,金门县,金湖镇', + 'merge_name' => '中国,台湾省,金门县,金湖镇', 'level' => 3, 'pinyin' => 'jinhu', 'code' => '082', @@ -66750,7 +66750,7 @@ class Area extends Migrator 'pid' => 3704, 'short_name' => '金沙', 'name' => '金沙镇', - 'merge_name' => '中国,台湾,金门县,金沙镇', + 'merge_name' => '中国,台湾省,金门县,金沙镇', 'level' => 3, 'pinyin' => 'jinsha', 'code' => '082', @@ -66768,7 +66768,7 @@ class Area extends Migrator 'pid' => 3704, 'short_name' => '金宁', 'name' => '金宁乡', - 'merge_name' => '中国,台湾,金门县,金宁乡', + 'merge_name' => '中国,台湾省,金门县,金宁乡', 'level' => 3, 'pinyin' => 'jinning', 'code' => '082', @@ -66786,7 +66786,7 @@ class Area extends Migrator 'pid' => 3704, 'short_name' => '烈屿', 'name' => '烈屿乡', - 'merge_name' => '中国,台湾,金门县,烈屿乡', + 'merge_name' => '中国,台湾省,金门县,烈屿乡', 'level' => 3, 'pinyin' => 'lieyu', 'code' => '082', @@ -66804,7 +66804,7 @@ class Area extends Migrator 'pid' => 3704, 'short_name' => '乌丘', 'name' => '乌丘乡', - 'merge_name' => '中国,台湾,金门县,乌丘乡', + 'merge_name' => '中国,台湾省,金门县,乌丘乡', 'level' => 3, 'pinyin' => 'wuqiu', 'code' => '082', @@ -66822,7 +66822,7 @@ class Area extends Migrator 'pid' => 3325, 'short_name' => '连江', 'name' => '连江县', - 'merge_name' => '中国,台湾,连江县', + 'merge_name' => '中国,台湾省,连江县', 'level' => 2, 'pinyin' => 'lienchiang', 'code' => '0836', @@ -66840,7 +66840,7 @@ class Area extends Migrator 'pid' => 3711, 'short_name' => '南竿', 'name' => '南竿乡', - 'merge_name' => '中国,台湾,连江县,南竿乡', + 'merge_name' => '中国,台湾省,连江县,南竿乡', 'level' => 3, 'pinyin' => 'nangan', 'code' => '0836', @@ -66858,7 +66858,7 @@ class Area extends Migrator 'pid' => 3711, 'short_name' => '北竿', 'name' => '北竿乡', - 'merge_name' => '中国,台湾,连江县,北竿乡', + 'merge_name' => '中国,台湾省,连江县,北竿乡', 'level' => 3, 'pinyin' => 'beigan', 'code' => '0836', @@ -66876,7 +66876,7 @@ class Area extends Migrator 'pid' => 3711, 'short_name' => '莒光', 'name' => '莒光乡', - 'merge_name' => '中国,台湾,连江县,莒光乡', + 'merge_name' => '中国,台湾省,连江县,莒光乡', 'level' => 3, 'pinyin' => 'juguang', 'code' => '0836', @@ -66894,7 +66894,7 @@ class Area extends Migrator 'pid' => 3711, 'short_name' => '东引', 'name' => '东引乡', - 'merge_name' => '中国,台湾,连江县,东引乡', + 'merge_name' => '中国,台湾省,连江县,东引乡', 'level' => 3, 'pinyin' => 'dongyin', 'code' => '0836', diff --git a/database/migrations/20220111014748_testCategory.php b/database/migrations/20220928172448_member.php old mode 100755 new mode 100644 similarity index 34% rename from database/migrations/20220111014748_testCategory.php rename to database/migrations/20220928172448_member.php index 0a71fd95c277f9ec0a1c597731b8fde06e922877..f227f68335703ffa83500e48f5ceeb2497eb9163 --- a/database/migrations/20220111014748_testCategory.php +++ b/database/migrations/20220928172448_member.php @@ -2,13 +2,13 @@ use think\migration\Migrator; -class TestCategory extends Migrator +class Member extends Migrator { public function change() { - $table = $this->table('test_category', [ + $table = $this->table('member', [ 'engine' => 'InnoDB', - 'comment' => '官方举例,生成分类CURD', + 'comment' => '会员管理', 'collation' => 'utf8mb4_general_ci' ]); @@ -18,9 +18,15 @@ class TestCategory extends Migrator } $table - ->addColumn('name', 'string', ['limit' => 255, 'null' => 1, 'default' => '','comment' => '分类名']) - ->addColumn('pid', 'integer', ['limit' => 11, 'null' => 1, 'default' => '0','comment' => '上级分类']) - ->addColumn('sort', 'integer', ['limit' => 11, 'null' => 1, 'default' => '0','comment' => '排序']) + ->addColumn('email', 'string', ['limit' => 2551, 'null' => 1, 'default' => '','comment' => '邮箱']) + ->addColumn('password', 'string', ['limit' => 255, 'null' => 1, 'default' => '','comment' => '密码']) + ->addColumn('nickname', 'string', ['limit' => 255, 'null' => 1, 'default' => '','comment' => '昵称']) + ->addColumn('sex', 'boolean', ['limit' => 4, 'null' => 1, 'default' => '0','comment' => '性别.1=男,2=女,']) + ->addColumn('vip_time', 'integer', ['limit' => 11, 'null' => 1, 'default' => '0','comment' => 'vip到期时间']) + ->addColumn('avatar_pic', 'string', ['limit' => 255, 'null' => 1, 'default' => '0','comment' => '头像']) + ->addColumn('login_time', 'datetime', ['null' => 1, 'comment' => '注册时间']) + ->addColumn('login_ip', 'string', ['limit' => 255, 'null' => 1, 'default' => '','comment' => '登录IP']) + ->addColumn('status', 'boolean', ['limit' => 4, 'null' => 1, 'default' => '0','comment' => '账号状态.2=锁定,1=正常,默认:1']) ->addColumn('create_time', 'datetime', ['null' => 1, 'comment' => '创建时间']) ->addColumn('update_time', 'datetime', ['null' => 1, 'comment' => '更新时间']) ->addColumn('delete_time', 'datetime', ['null' => 1, 'comment' => '删除时间']) diff --git a/extend/laytp/controller/Backend.php b/extend/laytp/controller/Backend.php index 2d4d792b7da892cdc690ba8e2964143760149a65..a3364ccfd4342135376afd90f5e42ced5b2edfad 100644 --- a/extend/laytp/controller/Backend.php +++ b/extend/laytp/controller/Backend.php @@ -16,9 +16,9 @@ class Backend extends BaseController use \laytp\traits\Backend; protected $noNeedLogin = [];//无需登录,也无需鉴权的方法名列表,支持*通配符定义所有方法 - protected $noNeedAuth = [];//需要登录,但是无需鉴权的方法名列表,支持*通配符定义所有方法 - protected $hasSoftDel = 0;//当前访问的模型是否有软删除功能 - protected $orderRule = ['id' => 'desc'];//默认排序规则 + protected $noNeedAuth = [];//需要登录,但是无需鉴权的方法名列表,支持*通配符定义所有方法 + protected $hasSoftDel = 0;//当前访问的模型是否有软删除功能 + protected $orderRule = ['id' => 'desc'];//默认排序规则 /** * 中间件 @@ -60,8 +60,8 @@ class Backend extends BaseController */ public function buildSearchParams() { - $where = []; - $whereOr = []; + $where = []; + $whereOr = []; //传递了search_param就说明是进行搜索查询 $searchParam = $this->request->param('search_param'); if ($searchParam) { @@ -73,31 +73,31 @@ class Backend extends BaseController $where[] = [$field, '=', $valueCondition['value']]; break; case 'FIND_IN_SET': - $values = explode(',', $valueCondition['value']); + $values = explode(',', $valueCondition['value']); foreach ($values as $val) { $whereOr[] = [$field, 'find in set', $val]; } - if($whereOr){ - $where[] = function($query) use($whereOr){ + if ($whereOr) { + $where[] = function ($query) use ($whereOr) { $query->whereOr($whereOr); }; } break; case 'LIKE': - $where[] = [$field, 'like', '%'.$valueCondition['value'].'%']; + $where[] = [$field, 'like', '%' . $valueCondition['value'] . '%']; break; case 'IN': $where[] = [$field, 'in', $valueCondition['value']]; break; case 'BETWEEN': $arrBetween = explode(' - ', $valueCondition['value']); - $where[] = [$field, 'between', $arrBetween[0].','.$arrBetween[1]]; + $where[] = [$field, 'between', $arrBetween[0] . ',' . $arrBetween[1]]; break; case 'BETWEEN_STRTOTIME': $arrBetween = explode(' - ', $valueCondition['value']); $begin_time = strtotime($arrBetween[0]); $end_time = strtotime($arrBetween[1]); - $where[] = [$field, 'between', $begin_time.','.$end_time]; + $where[] = [$field, 'between', $begin_time . ',' . $end_time]; break; case '>': $where[] = [$field, '>', $valueCondition['value']]; @@ -130,13 +130,33 @@ class Backend extends BaseController $order = $this->orderRule; //传递了order_param字段,就说明是进行排序搜索 $orderParam = $this->request->param('order_param'); - if ($orderParam && $orderParam['field'] && in_array(strtolower($orderParam['type']), ['asc','desc'])) { - if(isset($order[$orderParam['field']])){ + if ($orderParam && $orderParam['field'] && in_array(strtolower($orderParam['type']), ['asc', 'desc'])) { + if (isset($order[$orderParam['field']])) { $order[$orderParam['field']] = $orderParam['type']; - }else{ + } else { $order = array_merge([$orderParam['field'] => $orderParam['type']], $order); } } return $order; } + + /** + * 获取已选中项 + */ + public function getSelectedData($data) + { + if (!$data) return []; + + $selectedVal = $this->request->param('selected'); + if (is_array($selectedVal) && $selectedVal) { + $selectedField = $this->request->param('selectedField', 'id'); + $columns = array_column($data, $selectedField); + $selectedVal = array_filter(array_unique(array_diff($selectedVal, $columns))); + if ($selectedVal) { + $selectedData = $this->model->where($selectedField, 'in', $selectedVal)->select()->toArray(); + $selectedData && $data = array_merge($data, $selectedData); + } + } + return $data; + } } \ No newline at end of file diff --git a/extend/laytp/library/Date.php b/extend/laytp/library/Date.php index 5c88285cf389db60269633fdf114097275d17495..3f40cf6c22d61e1273c8fdb5e4674a36691c9675 100644 --- a/extend/laytp/library/Date.php +++ b/extend/laytp/library/Date.php @@ -198,4 +198,161 @@ class Date } return $time; } + + /** + * 获取某个日期属于一年中的第几周 + * @param $date + * @return false|int|string + */ + public static function getWeekNum($date='') + { + $date = $date ? $date : date('Y-m-d'); + + $year = date('Y', strtotime($date)); + + $yearBegin = strtotime($year.'-1-1'); + + $month = intval(date('m', strtotime($date))); + + if( date('W', $yearBegin) == 1 ){ + return date('W', strtotime($date)); + }else if($month == 1 && date('W', $yearBegin) > 50){ + return 1; + }else{ + return date('W', strtotime($date)) + 1; + } + } + + /** + * 根据日期,获取周信息 + * @param $now string 日期,举例: 2021-01-01 + * @return array + */ + public static function getWeekInfo($now) + { + $str = []; + //$first =1 表示每周星期一为开始日期 0表示每周日为开始日期 + $str['year'] = date('Y', strtotime($now)); + $first = 1; + //当日在整年中的第几周 + $str['week'] = date('W', strtotime($now)); + //获取当前周的第几天 周日是 0 周一到周六是 1 - 6 + $w = date('w', strtotime($now)); + //获取本周开始日期,如果$w是0,则表示周日,减去 6 天 + $weekStart = date('Y-m-d', strtotime("$now -" . ($w ? $w - $first : 6) . ' days')); + $str['week_start'] = $weekStart; + //本周结束日期 + $weekEnd = date('Y-m-d', strtotime("$weekStart +6 days")); + $str['week_end'] = $weekEnd; + return $str; + } + + /** + * 某去某年第几周的周信息 + * @param $year + * @param int $week + * @return mixed + */ + public static function weekDay($year, $week=1){ + $yearStart = mktime(0,0,0,1,1, $year); + $yearEnd = mktime(0,0,0,12,31, $year); + + $start = $yearStart;//把第一天做为第一周的开始 + $end = strtotime('+1 sunday', $yearStart);//把第一个周日作为第一周的结束 + + $lastStart = strtotime('-1 monday', $yearStart);//把最后一个周一作为最后一周的开始 + $lastEnd = $yearEnd;//把最后一天作为最后一周的结束 + + $totalWeekNum = intval(date('W', $yearStart)); + + if($week == 1){ + $weekday['begin'] = $start;//把第一天做为第一周的开始 + $weekday['begin_date'] = date('Y-m-d', $start);//把第一天做为第一周的开始 + $weekday['end'] = $end;//把第一个周日作为第一周的结束 + $weekday['end_date'] = date('Y-m-d', $end);//把第一个周日作为第一周的结束 + }else if($week == $totalWeekNum){ + $weekday['begin'] = $lastStart;//把最后一个周一作为最后一周的开始 + $weekday['begin_date'] = date('Y-m-d', $lastStart);//把第一天做为第一周的开始 + $weekday['end'] = $lastEnd;//把第一个周日作为第一周的结束 + $weekday['end_date'] = date('Y-m-d', $lastEnd);//把第一个周日作为第一周的结束 + }else if($week > 1 && $week < $totalWeekNum){ + $weekday['begin'] = strtotime('+' . ($week-1) . ' monday', $end); + $weekday['begin_date'] = date('Y-m-d', $weekday['begin']); + $weekday['end'] = strtotime('+' . ($week-1) . ' sunday', $end + 24 * 60 * 60); + $weekday['end_date'] = date('Y-m-d', $weekday['end']); + }else{ + return false; + } + + $weekday['week'] = $week; + $weekday['totalWeekNum'] = $totalWeekNum; + + return $weekday; + } + + /** + * 友好的时间显示 + * + * @param int $sTime 待显示的时间 + * @param string $type 类型. normal | mohu | full | ymd | other + * @param string $alt 已失效 + * @return string + */ + public static function friendlyDate($sTime,$type = 'default',$alt = 'false') { + //sTime=源时间,cTime=当前时间,dTime=时间差 + $cTime = time(); + $dTime = $cTime - $sTime; + $dDay = intval(date("z",$cTime)) - intval(date("z",$sTime)); + //$dDay = intval($dTime/3600/24); + $dYear = intval(date("Y",$cTime)) - intval(date("Y",$sTime)); + //normal:n秒前,n分钟前,n小时前,日期 + if($type=='normal'){ + if($dTime == 0){ + return '现在'; + }elseif( $dTime < 60 ){ + return $dTime."秒前"; + }elseif( $dTime < 3600 ){ + return intval($dTime/60)."分钟前"; + //今天的数据.年份相同.日期相同. + }elseif( $dYear==0 && $dDay == 0 ){ + //return intval($dTime/3600)."小时前"; + return '今天'.date('H:i',$sTime); + }elseif($dYear==0){ + return date("m月d日 H:i",$sTime); + }else{ + return date("Y-m-d H:i",$sTime); + } + }elseif($type=='mohu'){ + if( $dTime < 60 ){ + return $dTime."秒前"; + }elseif( $dTime < 3600 ){ + return intval($dTime/60)."分钟前"; + }elseif( $dTime >= 3600 && $dDay == 0 ){ + return intval($dTime/3600)."小时前"; + }elseif( $dDay > 0 && $dDay<=7 ){ + return intval($dDay)."天前"; + }elseif( $dDay > 7 && $dDay <= 30 ){ + return intval($dDay/7) . '周前'; + }elseif( $dDay > 30 ){ + return intval($dDay/30) . '个月前'; + } + //full: Y-m-d , H:i:s + }elseif($type=='full'){ + return date("Y-m-d , H:i:s",$sTime); + }elseif($type=='ymd'){ + return date("Y-m-d",$sTime); + }else{ + if( $dTime < 60 ){ + return $dTime."秒前"; + }elseif( $dTime < 3600 ){ + return intval($dTime/60)."分钟前"; + }elseif( $dTime >= 3600 && $dDay == 0 ){ + return intval($dTime/3600)."小时前"; + }elseif($dYear==0){ + return date("Y-m-d H:i:s",$sTime); + }else{ + return date("Y-m-d H:i:s",$sTime); + } + } + } } diff --git a/extend/laytp/library/Http.php b/extend/laytp/library/Http.php index 5173a64cfcadbbb7bfa12359465ce8919fae84e2..e08adf9f91c27d0f5f3024bde44c2a2ff31108fd 100644 --- a/extend/laytp/library/Http.php +++ b/extend/laytp/library/Http.php @@ -182,4 +182,20 @@ class Http } } } + + /** + * 获取远程https的图片保存到本地 + * @param $imgUrl string 图片地址 + * @param $saveToPath string 本地保存路径 + */ + public static function saveImageFromHttps($imgUrl, $saveToPath){ + $arrContextOptions = array( + "ssl"=>array( + "verify_peer"=>false, + "verify_peer_name"=>false, + ), + ); + $file_contents = file_get_contents($imgUrl, false, stream_context_create($arrContextOptions)); + file_put_contents($saveToPath, $file_contents); + } } diff --git a/extend/laytp/library/PluginRoute.php b/extend/laytp/library/PluginRoute.php index 0d9e9b6029f6f7fd9f5981bec5bb8312e87ef442..7b16ba3a222f4157f8bc1b25126710533b97e1a0 100644 --- a/extend/laytp/library/PluginRoute.php +++ b/extend/laytp/library/PluginRoute.php @@ -37,11 +37,6 @@ class PluginRoute extends Route $this->request->setController($controller)->setAction($classAndAction['action']); - $common_func_file = app()->getRootPath() . DS . 'plugin' . DS . $plugin . DS . 'common.php'; - if (file_exists($common_func_file)) { - include_once app()->getRootPath() . DS . 'plugin' . DS . $plugin . DS . 'common.php'; - } - $class = $classAndAction['class']; $action = $classAndAction['action']; $instance = app()->make($class, [], true); diff --git a/extend/laytp/library/Random.php b/extend/laytp/library/Random.php index 2943d42246acad0d1343184d40ba775db7a89ca5..0af524d781b3c95f837130317d334fd16ecb87aa 100644 --- a/extend/laytp/library/Random.php +++ b/extend/laytp/library/Random.php @@ -156,16 +156,12 @@ class Random */ public static function uuid() { - return sprintf( - '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', - mt_rand(0, 0xffff), - mt_rand(0, 0xffff), - mt_rand(0, 0xffff), - mt_rand(0, 0x0fff) | 0x4000, - mt_rand(0, 0x3fff) | 0x8000, - mt_rand(0, 0xffff), - mt_rand(0, 0xffff), - mt_rand(0, 0xffff) - ); + $chars = md5(uniqid(mt_rand(), true)); + $uuid = substr ( $chars, 0, 8 ) . '-' + . substr ( $chars, 8, 4 ) . '-' + . substr ( $chars, 12, 4 ) . '-' + . substr ( $chars, 16, 4 ) . '-' + . substr ( $chars, 20, 12 ); + return $uuid ; } } diff --git a/extend/laytp/library/Redis.php b/extend/laytp/library/Redis.php index 610b2448831b71059aaeb48e62f2a094ecc05822..facbe2291a7d968ab503d9a82df698d8a8823e4d 100644 --- a/extend/laytp/library/Redis.php +++ b/extend/laytp/library/Redis.php @@ -9,7 +9,7 @@ use think\facade\Cache; class Redis { /** - * 得到一个redis锁 + * 得到一个redis锁,循环获取锁,直到获取到锁为止 * @param $name string 锁名称 * @param $ttl int 锁存在的时间,单位秒,默认60秒 * @return bool @@ -19,14 +19,30 @@ class Redis set_time_limit(0); $redis = Cache::store('redis')->handler(); while(true){ - if($redis->setnx($name, 1)){ - $redis->expire($name, $ttl); + if($redis->set($name, 1, ['NX', 'EX'=>$ttl])){ break; } } return true; } + /** + * 得到一个redis锁,仅尝试获取一次 + * + * @param $name string 锁名称 + * @param $ttl int 锁存在的时间,单位秒,默认60秒 + * @return bool + */ + public static function getOnceLock($name, $ttl=60) + { + set_time_limit(0); + $redis = Cache::store('redis')->handler(); + if($redis->set($name, 1, ['NX', 'EX'=>$ttl])){ + return true; + } + return false; + } + /** * 删除一个redis锁 * @param $name string 锁名称 diff --git a/extend/laytp/library/UploadDomain.php b/extend/laytp/library/UploadDomain.php index 5d3394ce5d1aeaa5d089ecd3e8d89d529f9af89f..bd16df1cf4531a8c9b05158163db081eda6eeaa9 100644 --- a/extend/laytp/library/UploadDomain.php +++ b/extend/laytp/library/UploadDomain.php @@ -117,6 +117,8 @@ class UploadDomain */ static public function addUploadDomain($string, $uploadType = 'local') { + $defaultType = ConfServiceFacade::get('system.upload.defaultType', 'local'); + if($uploadType == 'default') $uploadType = $defaultType; $uploadDomain = self::getUploadDomain($uploadType, 'via'); //ueditor编辑器正则替换所有的图片、视频、音频 /* $string = preg_replace("/(