基于thinkphp实现根据用户ip判断地理位置并提供对应天气信息的应用

基于thinkphp实现根据用户ip判断地理位置并提供对应天气信息的应用

https://blog.csdn.net/MyCodeDream/article/details/46706469

我们都知道,在很多的网站都提供了给用户提供天气预报的功能,有时会发现,用户即使不输入任何和自己有关的地理位置信息,同样的网站也可以去判断地理位置并且显示天气信息,我们可能会想到用ip去判断地理位置,的确是这样,但是,如果想自己一样完全的开发,确实有一点麻烦,所以这里简单的说一下这个应用的业务逻辑(以用户第一次打开页面为起点):

1:获取ip:ip按照我自己的说法有两种,一种是独立ip,真实存在,另一种是路由器分配的ip,这个当然不具有某种意义上的唯一性,这两种ip当然都要考虑,第一种非常容易或得,取$_SERVER内的元素值就可以,但问题是第二种,像192.168.1.1这样的是无法判断的,那么就没法处理或得用户的位置信息,这里本来采用curl的扩展来抓取的,但是这个扩展说什么就是无法使用,所以这种情况先放在一边,仅考虑用户使用独立ip访问的情况。

这里补充一下,server的参数不是server_addr而是REMOTE_ADDR,只有这样才能取到用户的真是地址,这样的话就不用麻烦的取另外处理

2:当我们获取ip之后就应该根据ip地址库去查找用户的ip所在地,这里有两个地方需要注意,1:ip地址库必须为utf-8编码,2:或得的信息是一个完整的地址信息,而后面需要城市名称局可以,所以,要做一下字符串的截取,或得简化城市地址。

3:当或得了用户的地址显然还是不行,想想,最终于天气接口对接获取数据的是城市代码,这两个还是要转化一下,这里我采用了暴力的办法遍历城市代码库或得该城市的代码。

4:获取到城市的代码之后,就要去连接数据接口获取数据,这个数据时json数据,需要json_encode()转码,我这里或得的是一个对象,有的接口不一样,具体情况具体分析,然后,最重要的就是分配这些数据,说是这些,其实就是这个对象,后来发现没有逐个分配是正确的,这样有利于代码的移植。

5:在视图去调用模板分配的数据,相信这个都会。

6:其实上面的步骤已经把第一次打开页面的整个业务逻辑给处理完了,还有一个就是我在视图给用户提供了输入城市名查询城市天气的功能,这样按顺序的分析一下,正常的获取用户的输入信息就是城市名

7:这里就已经或得了城市名,直接参与获取城市代码的遍历就可以了,这里有个非常重要的逻辑问题就是先后顺序和如何判断才能够把这两个功能很好的结合在一块,一定是:

先判断是否系统自动获取城市名称是否为空,如果不为空只城市名就是或得的名字,反之,就提示ip地址没有查询到对应地址信息,紧接着,注意一定是紧接着下面,是顺序结构,判断用户的输入是否为空,如果不为空,那么就让城市名为用户输入,总而言之就是用户的输入权限一定要大于系统自动获取的权限,这样就可以完整的把两个代码结合在一起,另外,我是把获取ip和取出城市名分别做成了两个方法。

 

上面写的比较乱,这样的话,下面是我的部分实例代码,因安全版权各方面原因,数据接口我做了处理不可以使用,仅提供方法参考,粘贴无用,自主研究。

视图weather_test.html:

[html]
view plain
copy

  1. <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>  
  2. <html>  
  3. <head>  
  4. <meta http-equiv=“Content-Type” content=“text/html; charset=”>  
  5. <title>天气预报</title>  
  6. <style type=“text/css”>  
  7.     *{  
  8.     margin: 0px;  
  9.     padding: 0px;  
  10.     }  
  11. </style>  
  12. </head>  
  13. <body>  
  14. <br>  
  15. <form action=“{$smarty_const.__SELF__}” method=“post”>  
  16.     <input type=“text” name=“cityname”>  
  17.     <input type=“submit” value=“更换城市”/>  
  18. </form>  
  19.     <table border=“1px” style=“margin-top: 20px;margin-left: 20px;”>  
  20.       
  21.         <tr><td colspan=“2”>即时天气信息</td></tr>  
  22.         <tr style=“border-spacing: 0px; padding: 0px;”>  
  23.             <td style=“border-spacing: 0px; padding: 0px;”>城市</td>  
  24.             <td>{$all_info->forecast->city}</td>  
  25.         </tr>  
  26.         <tr>  
  27.             <td>基本天气</td>  
  28.             <td>{$all_info->realtime->weather}</td>  
  29.         </tr>  
  30.         <tr>  
  31.             <td>温度</td>  
  32.             <td>{$all_info->realtime->temp}</td>  
  33.         </tr>  
  34.         <tr>  
  35.             <td>风向</td>  
  36.             <td>{$all_info->realtime->WD}</td>  
  37.         </tr>  
  38.         <tr>  
  39.             <td>更新时间</td>  
  40.             <td>{$all_info->realtime->time}</td>  
  41.         </tr>  
  42.     </table>  
  43.       
  44.     <table border=“1px” style=“margin-top: 20px;margin-left: 20px;”>  
  45.       
  46.         <tr><td colspan=“2”>生活建议</td></tr>  
  47.         <tr style=“border-spacing: 0px; padding: 0px;”>  
  48.             <td style=“border-spacing: 0px; padding: 0px;”>城市</td>  
  49.             <td>{$all_info->forecast->city}</td>  
  50.         </tr>  
  51.         <tr>  
  52.             <td>防嗮建议</td>  
  53.             <td>{$all_info->index[0]->details}</td>  
  54.         </tr>  
  55.         <tr>  
  56.             <td>穿衣建议</td>  
  57.             <td>{$all_info->index[1]->details}</td>  
  58.         </tr>  
  59.         <tr>  
  60.             <td>运动建议</td>  
  61.             <td>{$all_info->index[2]->details}</td>  
  62.         </tr>  
  63.         <tr>  
  64.             <td>洗车建议</td>  
  65.             <td>{$all_info->index[3]->details}</td>  
  66.         </tr>  
  67.         <tr>  
  68.             <td>晾晒建议</td>  
  69.             <td>{$all_info->index[4]->details}</td>  
  70.         </tr>  
  71.         <tr>  
  72.             <td>更新时间</td>  
  73.             <td>{$all_info->realtime->time}</td>  
  74.         </tr>  
  75.     </table>  
  76.       
  77.     <table border=“1px” style=“margin-top: 20px;margin-left: 20px;”>  
  78.         <tr><td colspan=“5”>未来四天天气信息  城市: {$all_info->forecast->city}</tr>  
  79.         <tr style=“border-spacing: 0px; padding: 0px;”>  
  80.             <td>项目/日期</td>  
  81.             <td>今天</td>  
  82.             <td>明天</td>  
  83.             <td>后天</td>  
  84.             <td>大后天</td>  
  85.         </tr>  
  86.         <tr>  
  87.             <td>概况</td>  
  88.             <td>{$all_info->forecast->weather1}</td>  
  89.             <td>{$all_info->forecast->weather2}</td>  
  90.             <td>{$all_info->forecast->weather3}</td>  
  91.             <td>{$all_info->forecast->weather4}</td>  
  92.         </tr>  
  93.         <tr>  
  94.             <td>温度</td>  
  95.             <td>{$all_info->forecast->temp1}</td>  
  96.             <td>{$all_info->forecast->temp2}</td>  
  97.             <td>{$all_info->forecast->temp3}</td>  
  98.             <td>{$all_info->forecast->temp4}</td>  
  99.         </tr>  
  100.         <tr>  
  101.             <td>风向</td>  
  102.             <td>{$all_info->forecast->wind1}</td>  
  103.             <td>{$all_info->forecast->wind2}</td>  
  104.             <td>{$all_info->forecast->wind3}</td>  
  105.             <td>{$all_info->forecast->wind4}</td>  
  106.         </tr>  
  107.         <tr>  
  108.             <td>风力</td>  
  109.             <td>{$all_info->forecast->fl1}</td>  
  110.             <td>{$all_info->forecast->fl2}</td>  
  111.             <td>{$all_info->forecast->fl3}</td>  
  112.             <td>{$all_info->forecast->fl4}</td>  
  113.         </tr>  
  114.     </table>  
  115.       
  116.     <table border=“1px” style=“margin-top: 20px;margin-left: 20px;”>  
  117.         <tr><td colspan=“2”>今日空气质量状况</td></tr>  
  118.         <tr style=“border-spacing: 0px; padding: 0px;”>  
  119.             <td style=“border-spacing: 0px; padding: 0px;”>城市</td>  
  120.             <td>{$all_info->forecast->city}</td>  
  121.         </tr>  
  122.         <tr>  
  123.             <td>PM2.5</td>  
  124.             <td>{$all_info->aqi->pm25}</td>  
  125.         </tr>  
  126.         <tr>  
  127.             <td>PM10</td>  
  128.             <td>{$all_info->aqi->pm10}</td>  
  129.         </tr>  
  130.         <tr>  
  131.             <td>SO2</td>  
  132.             <td>{$all_info->aqi->so2}</td>  
  133.         </tr>  
  134.         <tr>  
  135.             <td>NO2</td>  
  136.             <td>{$all_info->aqi->no2}</td>  
  137.         </tr>  
  138.         <tr>  
  139.             <td>更新时间</td>  
  140.             <td>{$all_info->aqi->pub_time}</td>  
  141.         </tr>  
  142.     </table>  
  143. </body>  
  144. </html>  

类方法:

  1. public function weather_test(){  
  2.         require_once ‘./Component/Citycode.php’;  
  3.         //这里是根据客户端的ip判断地理位置  
  4.         //定义两个标志变量  
  5.         $count=0;  
  6.         $city_id=‘101120301’;//默认大淄博  
  7.         $city_name_cin=$_POST[‘cityname’];  
  8.         $city_sim_name=R(‘Test/get_user_cityname’);  
  9.         //这是系统根据ip自动判断的位置  
  10.         echo $city_sim_name;  
  11.         if($city_sim_name!=null){  
  12.             $city_name_cin=$city_sim_name;  
  13.         }  
  14.         //这是用户输入的位置  
  15.         if(!empty($_POST[‘cityname’])){  
  16.             //放置信息覆盖  
  17.             $city_name_cin=$_POST[‘cityname’];  
  18.         }  
  19.         不管是ip定位还是用户输入最终需要遍历获取城市代码的变量只要$city_name_cin  
  20.         foreach ($citycode as $key => $value){  
  21.             if($key==$city_name_cin){  
  22.                 $city_id=$citycode[$city_name_cin];  
  23.                 $count++;  
  24.             }  
  25.         }  
  26.         if($count==0){  
  27.             echo “对不起,您输入的地址没有找到!默认淄博哦”;  
  28.         }else{  
  29.             echo $city_name_cin.“的天气信息如下”;  
  30.         }  
  31.         //接口已经处理,请勿使用,仅供学习  
  32.         $weather_interface_url=“http://weatherai.markt.xiaomi.com/wtr-v2/weather?cityId=”.$city_id.“&mei=e32c88633283737f5d9f381d47&device=HM2013023&miuiVersion=JHBCNBD16.0&modDevice=ce=miuiWeatherAp”;  
  33.         $all_weather_info = json_decode(file_get_contents($weather_interface_url));  
  34.         //分配数据  
  35.         $this->assign(“all_info”,$all_weather_info);  
  36.         $this->display();  
  37.     }  
  38.     ///  
  39.     /* 
  40.      * 下面两个分别是获取主机ip和ip所在地的两个 
  41.      * 方法,最后的结果数值通过R方法,返回获取 
  42.      */  
  43.     //方法1:获取用户ip  
  44.     public function get_user_ip(){  
  45.         //先通过这种简单的方法获取主机的ip,通过R方法获取  
  46.         $host_ip=$_SERVER[‘SERVER_ADDR’];  
  1.         return $host_ip;  
  2. }  
  3. //方法2:获取地名  
  4. public function get_user_cityname(){  
  5.     //得到用户的ip  
  6.     $host_ip=R(‘Test/get_user_ip’);  
  7.     //这里ip地址库必须这样实例化  
  8.     $Ip = new \Org\Net\IpLocation(‘UTFWry.dat’); // 实例化类 参数表示IP地址库文件  
  9.     //可以同时放ip和域名  
  10.     $area = $Ip->getlocation($host_ip); // 获取域名服务器所在的位置  
  11.     $city_allname=$area[‘country’];  
  12.     $sim_cityname=explode(“市”,explode(“省”, $city_allname)[1])[0];  
  13.     return $sim_cityname;  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113150.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 异步fifo的深度,如何确定?_二叉树的最小深度和最大深度

    异步fifo的深度,如何确定?_二叉树的最小深度和最大深度目录1.异步FIFO最小深度计算1.1异步FIFO最小深度计算原理1.2异步FIFO最小深度常用计算公式1.2.1假如读写FIFO是同时进行的1.2.2读写FIFO不是同时进行的情况2.异步FIFO最小深度计算实例2.1用于SDRAM中的读写FIFO2.2异步时钟数据接口3.FIFO实例1.异步FIFO最小深度计算计算FIF…

    2022年8月13日
    8
  • C++ XML 库 TinyXML2 的基本使用

    C++ XML 库 TinyXML2 的基本使用0.前言TinyXML-2是一个简单,小型,高效的C++XML解析器,可以轻松集成到其他程序中,直接引用源文件的话只需要包含两个文件(h和cpp,此外还有个测试文件里面带有demo)。TinyXML-2解析XML文档,并以此为基础构建可读取,修改和保存的文档对象模型(DOM)。文档说,在解释XML时仅使用UTF-8,假定所有XML为UTF-8(看了下使用MSVC编译器时生成的XML文件文本编码使用的本地编码)。该库还支持打印到文件或内存,使用XMLPr

    2022年5月6日
    142
  • 提高网站页面加载速度的方法

    提高网站页面加载速度的方法

    2021年9月23日
    51
  • 稻城亚丁4天自由行攻略_稻城亚丁3天旅行攻略

    稻城亚丁4天自由行攻略_稻城亚丁3天旅行攻略有人说向往什么,就去追求什么,才能求仁得仁。稻城亚丁,人称“最后的香格里拉”,藏语也称香巴拉,意为“心中的日月”,外人视为世外桃源,是作为川西秘境中最值得我们去探访的圣地。如果向往真爱和自由,那就带上

    2022年8月1日
    7
  • NetCMS修改之二:单击新闻附件,直接打开文件「建议收藏」

    NetCMS修改之二:单击新闻附件,直接打开文件「建议收藏」   NetCMS系统的新闻附件,是通过down.aspx页面实现下载附件的。这样做的好处可能是可以隐藏附件的真实地址,但给用户使用会带来一个小麻烦:无法使用右键单击来实现将下载的文件另存为。   经检查,此功能是在NetCMS.Publish命名空间的LabelMass类中定义的getNewsFiles实现的,文件位于NetCMS.Publish/Label/NewsParameter.

    2022年9月29日
    2
  • performSelector的方法[通俗易懂]

    performSelector的方法[通俗易懂]在此我对performSelector系列方法进行了总结1、-(id)performSelector:(SEL)aSelector;-(id)performSelector:(SEL)aSe

    2022年7月1日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号