whitefang vor 1 Jahr
Ursprung
Commit
e1d0b9b72c

+ 18 - 0
app/api/controller/RegionController.php

@@ -2,6 +2,7 @@
 namespace app\api\controller;
 
 use app\api\logic\RegionLogic;
+use app\api\validate\RegionValidate;
 
 /**
  * index
@@ -21,4 +22,21 @@ class RegionController extends BaseApiController
         $result = RegionLogic::getRegionList();
         return $this->data($result);
     }
+
+    /**
+     * 获取当前定位
+     * @return \think\response\Json
+     */
+    public function get_address_location()
+    {
+        $params = (new RegionValidate())->goCheck('location');
+        $result = RegionLogic::getLocation($params);
+        if (false === $result) {
+            return $this->fail(RegionLogic::getError());
+        }
+        return $this->data($result);
+
+    }
+
+
 }

+ 134 - 2
app/api/logic/RegionLogic.php

@@ -7,6 +7,7 @@ use app\common\model\decorate\DecorateTabbar;
 use app\common\model\setting\PostageRegion;
 use app\common\service\ConfigService;
 use app\common\service\FileService;
+use think\Exception;
 
 /**
  * index
@@ -21,7 +22,138 @@ class RegionLogic extends BaseLogic
      */
     public static function getRegionList()
     {
-        $result = PostageRegion::cache(true,86400)->field('id,name,pid')->order('sorts asc,id asc')->select()->toArray();
-        return $result;
+        $area_list = PostageRegion::cache(true,86400)->where('first','<>','')->field('id,name,pid')->order('sorts asc,id asc')->select()->toArray();
+        foreach ($area_list as &$vo) {
+            $vo['field'] = self::get_first_char($vo['name']);
+        }
+        $arr = self::array_group_by($area_list, 'field');
+        ksort($arr);
+        $citys = array();
+        foreach ($arr as $keys=>$vo){
+            $citys[] = ['key'=>$keys,'list'=>$vo];
+        }
+        ksort($citys);
+
+        //获取热门城市
+        $map['id'] = ['in','1710'];
+        $hot_list = PostageRegion::cache(true,86400)->where($map)->field('id,pid,name')->order('first asc')->select()->toArray();
+        $list = ['hot_list'=>$hot_list,'city_list'=> $citys];
+        return $list;
+    }
+
+    /**
+     * 获取定位信息
+     * @param $params
+     * @return false|mixed|void
+     */
+    public static function getLocation($params)
+    {
+        try {
+            $location = $params['latitude'].','.$params['longitude'];
+            $key = 'SEGBZ-P3PK6-CU5SB-MQLQP-ZDPJS-PHFR6';
+            $url = 'https://apis.map.qq.com/ws/geocoder/v1/?location=' . $location . '&key='.$key.'&get_poi=1';
+            $result = http_request($url);
+            if(empty($result)){
+                throw new Exception('定位请求失败');
+            }
+            if ($result['status'] === 0) {
+                //获取城市id
+                $city_id = Area::where(['name'=>['like',"%".$result['result']['address_component']['city']."%"]])->value('id');
+                $result['result']['address_component']['city_id'] = $city_id;
+                return $result['result']['address_component'];
+            }
+        } catch (\Exception $e) {
+            self::$error = $e->getMessage();
+            return false;
+        }
+    }
+
+    public static function get_first_char($s)
+    {
+        $s0 = mb_substr(self::my_trim($s), 0, 1); //获取名字的姓
+        try {
+            $s = iconv('UTF-8', 'GB2312', $s0); //将UTF-8转换成GB2312编码
+        } catch (\Exception $e) {
+            return 'Z#';
+        }
+        if (ord($s0) > 128) { //汉字开头,汉字没有以U、V开头的
+            $asc = ord($s[0]) * 256 + ord($s[1]) - 65536;
+            if ($asc >= -20319 and $asc <= -20284) return "A";
+            if ($asc >= -20283 and $asc <= -19776) return "B";
+            if ($asc >= -19775 and $asc <= -19219) return "C";
+            if ($asc >= -19218 and $asc <= -18711) return "D";
+            if ($asc >= -18710 and $asc <= -18527) return "E";
+            if ($asc >= -18526 and $asc <= -18240) return "F";
+            if ($asc >= -18239 and $asc <= -17760) return "G";
+            if ($asc >= -17759 and $asc <= -17248) return "H";
+            if ($asc >= -17247 and $asc <= -17418) return "I";
+            if ($asc >= -17417 and $asc <= -16475) return "J";
+            if ($asc >= -16474 and $asc <= -16213) return "K";
+            if ($asc >= -16212 and $asc <= -15641) return "L";
+            if ($asc >= -15640 and $asc <= -15166) return "M";
+            if ($asc >= -15165 and $asc <= -14923) return "N";
+            if ($asc >= -14922 and $asc <= -14915) return "O";
+            if ($asc >= -14914 and $asc <= -14631) return "P";
+            if ($asc >= -14630 and $asc <= -14150) return "Q";
+            if ($asc >= -14149 and $asc <= -14091) return "R";
+            if ($asc >= -14090 and $asc <= -13319) return "S";
+            if ($asc >= -13318 and $asc <= -12839) return "T";
+            if ($asc >= -12838 and $asc <= -12557) return "W";
+            if ($asc >= -12556 and $asc <= -11848) return "X";
+            if ($asc >= -11847 and $asc <= -11056) return "Y";
+            if ($asc >= -11055 and $asc <= -10247) return "Z";
+        } else if (ord($s) >= 48 and ord($s) <= 57) { //数字开头
+            switch (iconv_substr($s, 0, 1, 'utf-8')) {
+                case 1:
+                    return "Y";
+                case 2:
+                    return "E";
+                case 3:
+                    return "S";
+                case 4:
+                    return "S";
+                case 5:
+                    return "W";
+                case 6:
+                    return "L";
+                case 7:
+                    return "Q";
+                case 8:
+                    return "B";
+                case 9:
+                    return "J";
+                case 0:
+                    return "L";
+            }
+        } else if (ord($s) >= 65 and ord($s) <= 90) { //大写英文开头
+            return substr($s, 0, 1);
+        } else if (ord($s) >= 97 and ord($s) <= 122) { //小写英文开头
+            return strtoupper(substr($s, 0, 1));
+        } else {
+            return iconv_substr($s0, 0, 1, 'utf-8');//中英混合的词语,不适合上面的各种情况,因此直接提取首个字符即可
+        }
+    }
+
+    public static function array_group_by($arr, $key)
+    {
+        $grouped = array();
+        foreach ($arr as $value) {
+            $grouped[$value[$key]][] = $value;
+        }
+        if (func_num_args() > 2) {
+            $args = func_get_args();
+            foreach ($grouped as $key => $value) {
+                $parms = array_merge($value, array_slice($args, 2, func_num_args()));
+                $grouped[$key] = call_user_func_array('array_group_by', $parms);
+            }
+        }
+        return $grouped;
+    }
+
+    public static function my_trim($str)
+    {
+        $search = array(" ", " ", "\n", "\r", "\t");
+        $replace = array("", "", "", "", "");
+        return str_replace($search, $replace, $str);
     }
 }

+ 32 - 0
app/api/validate/RegionValidate.php

@@ -0,0 +1,32 @@
+<?php
+namespace app\api\validate;
+use app\common\validate\BaseValidate;
+
+/**
+ * 区域验证器
+ * Class RegionValidate
+ * @package app\api\validate
+ */
+class RegionValidate extends BaseValidate
+{
+
+    protected $rule = [
+        'longitude' => 'require',
+        'latitude' => 'require',
+    ];
+
+    protected $message = [
+        'longitude.require' => '参数缺失',
+        'latitude.require' => '参数缺失',
+    ];
+
+
+    /**
+     * @notes
+     * @return RegionValidate
+     */
+    public function sceneLocation()
+    {
+        return $this->only(['longitude','latitude']);
+    }
+}

+ 31 - 0
app/common.php

@@ -323,3 +323,34 @@ function format_amount($float)
     }
     return $float;
 }
+
+/**
+ * curl提交
+ * @param $str
+ * @return string
+ */
+function http_request($url , $data = NULL)
+{
+    $ch = curl_init();
+    curl_setopt($ch, CURLOPT_URL, $url);
+    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
+    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
+
+    if (!empty($data)){
+        curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+    }
+
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+    $output = curl_exec($ch);
+    // 检查是否有错误发生
+    if(curl_errno($ch))
+    {
+        echo 'CURL ERROR CODE: '. curl_errno($ch) . ' , reason : ' . curl_error($ch);
+    }
+    curl_close($ch);
+
+    $jsoninfo = json_decode($output , true);
+
+    return $jsoninfo;
+}