• 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.0


    /**
     * 百度地图使用工具类-v1.5
     * 
     * @author boonya
     * @date 2013-7-7
     * @address Chengdu,Sichuan,China
     * @email boonya@sina.com
     * @company KWT.Shenzhen.Inc.com
     * @notice 有些功能需要加入外部JS库才能使用,另外还需要申请地图JS key .
     *         申请地址:http://developer.baidu.com/map/apply-key.htm
     */
    (function() {
    
        var map = {};
        window.map={};
        window.BmapUtils={};
        window.infoWindow={};
        window.BmapUtils.lineFreature={};
        window.LocalSearch={};
        /**
         * 百度地图基础操作
         */
        BmapUtils = {
            /**
             * 全局变量
             */
            CONSTANT : {
                CONTAINER : "map",
                DEFAULT_ZOOM : 12,
                SEARCH_PANEL:"r-result",
                LINE_MAKERS_SHOW:false
            },
            /**
             * 获取地图视图范围坐标
             * @returns {object} 范围对象
             */
            getBounds : function() {
                if (map) {
                    var bs = map.getBounds(); // 获取可视区域
                    var bssw = bs.getSouthWest(); // 可视区域左下角
                    var bsne = bs.getNorthEast(); // 可视区域右上角
                    return {
                        leftBottom : bssw,
                        rightTop : bsne
                    };
                }
                return null;
            },
            /**
             * 设置车辆图标
             * @param carImgUrl  {string}            车辆图片路径
             * @returns {BMap.Icon}                  百度Icon图标对象
             */
            getIcon : function(carImgUrl,width,height) {
                var myIcon = new BMap.Icon(carImgUrl, new BMap.Size(width||20, height||20), { // 小车图片
                    // offset: new BMap.Size(0, -5), //相当于CSS精灵
                    imageOffset : new BMap.Size(0, 0)// 图片的偏移量。为了是图片底部中心对准坐标点。
                });
                return myIcon;
            },
            /**
             * 初始化普通地图
             * @param lon            {number} 经度
             * @param lat            {number} 纬度
             * @param zoom           {number} 缩放等级
             */
            initCommonMap : function(lon, lat, zoom) {
                map = new BMap.Map(this.CONSTANT.CONTAINER);
                var point = new BMap.Point(lon || 116.331398, lat || 39.897445); // 默认地图初始化位置为北京
                map.centerAndZoom(point, zoom || this.CONSTANT.DEFAULT_ZOOM);
            },
            /**
             * 初始化3D地图
             * @param lon            {number} 经度
             * @param lat            {number} 纬度
             * @param cityname       {string} 城市名称
             * @param zoom           {number} 缩放等级
             */
            my3Dmap : function(lon, lat, cityname, zoom) {
                map = new BMap.Map(this.CONSTANT.CONTAINER, {
                    mapType : BMAP_PERSPECTIVE_MAP
                });
                var point = new BMap.Point(lon || 116.4035, lat || 39.915);
                map.setCurrentCity(cityname || "北京"); // 设置地图显示的城市 此项是必须设置的
                map.centerAndZoom(point, zoom || this.CONSTANT.DEFAULT_ZOOM);
                map.enableScrollWheelZoom(true);
            },
            /**
             * 初始化卫星地图
             * @param lon            {number} 经度
             * @param lat            {number} 纬度
             * @param zoom           {number} 缩放等级
             */
            satelliteMap : function(lon, lat, zoom) {
                map = new BMap.Map(this.CONSTANT.CONTAINER, {
                    mapType : BMAP_HYBRID_MAP
                }); // 设置卫星图为底图
                var point = new BMap.Point(lon || 116.4035, lat || 39.915);
                map.centerAndZoom(point, zoom || this.CONSTANT.DEFAULT_ZOOM);
                map.enableScrollWheelZoom(true);
            },
            /**
             * 初始化地图(含普通操作控件)
             */
            initBaiduMap:function(anchor){
                BmapUtils.initCommonMap(); // 初始化普通地图
                map.enableDragging(); // 开启拖拽
                // map.disableDragging(); // 禁止拖拽
                // map.enableInertialDragging(); // 开启惯性拖拽
                map.enableScrollWheelZoom(true); // 允许鼠标滚轮缩放地图
                var navigtionControl=anchor||{anchor : BMAP_ANCHOR_TOP_LEFT};
                map.addControl(new BMap.NavigationControl(navigtionControl)); // 添加默认缩放平移控件
                map.addControl(new BMap.ScaleControl({
                    anchor : BMAP_ANCHOR_BOTTOM_LEFT
                })); // 左下角比例尺控件
                map.addControl(new BMap.OverviewMapControl()); // 添加默认缩略地图控件(鹰眼)
                var cr = new BMap.CopyrightControl({
                    anchor : BMAP_ANCHOR_BOTTOM_LEFT
                });
                map.addControl(cr); // 添加版权控件(支持自定义版权控件)
                window.map=map;
            },
            /**
             * 初始化小地图
             * @param type  {number}     平移缩放类型:平移和缩放1,只有平移2,只有缩放3,默认只有缩放
             * @param position {number}  停靠的位置:上左1,上右2,下左3,下右4,默认为上左
             */
            smallMap:function(type,position){
                BmapUtils.initCommonMap(); // 初始化普通地图
                map.enableDragging(); // 开启拖拽
                map.enableScrollWheelZoom(true); // 允许鼠标滚轮缩放地图
                map.addControl(new BMap.ScaleControl({
                    anchor : BMAP_ANCHOR_BOTTOM_LEFT
                })); // 左下角比例尺控件
                map.addControl(new BMap.OverviewMapControl()); // 添加默认缩略地图控件(鹰眼)
                var cr = new BMap.CopyrightControl({
                    anchor : BMAP_ANCHOR_BOTTOM_LEFT
                });
                var navigtion_type="",where="";
                //平移导航的类型
                switch (type) {
                case 1:
                    navigtion_type=BMAP_NAVIGATION_CONTROL_SMALL;
                    break;
                case 2:
                    navigtion_type=BMAP_NAVIGATION_CONTROL_PAN;
                    break;
                case 3:
                    navigtion_type=BMAP_NAVIGATION_CONTROL_ZOOM;
                    break;
                default:
                    navigtion_type=BMAP_NAVIGATION_CONTROL_ZOOM;
                    break;
                }
                //平移导航停靠的位置
                switch (position) {
                case 1:
                    where=BMAP_ANCHOR_TOP_LEFT;
                    break;
                case 2:
                    where=BMAP_ANCHOR_TOP_RIGHT;
                    break;
                case 3:
                    where=BMAP_ANCHOR_BOTTOM_LEFT;
                    break;
                case 4:
                    where=BMAP_ANCHOR_BOTTOM_LEFT;
                    break;
                default:
                    where=BMAP_ANCHOR_TOP_LEFT;
                break;
                }
                map.addControl(cr); // 添加版权控件(支持自定义版权控件)
                map.addControl(new BMap.NavigationControl({anchor: where, type: navigtion_type})); 
                LocalSearch=new BMap.LocalSearch(map, {
                    renderOptions:{map: map,panel:this.CONSTANT.SEARCH_PANEL}
                });
                window.map=map;
            },
            /**
             * IP定位城市
             */
            ipLocateCity : function() {
                var myFun = function(result) {
                    var cityName = result.name;
                    map.setCenter(cityName);
                };
                var myCity = new BMap.LocalCity();
                myCity.get(myFun);
            },
            /**
             * 平移地图
             * @param lon            {number} 经度
             * @param lat            {number} 纬度
             */
            panTo : function(lon, lat) {
                var point = new BMap.Point(lon, lat);
                map.panTo(point);
            },
            /**
             * 平移地图
             * @param lon            {number} 经度
             * @param lat            {number} 纬度
             */
            panToPoint: function(point) {
                map.panTo(point);
            },
            /**
             * 创建信息窗口
             * @param title    {string}  标题
             * @param message  {string}  发送短信消息内容
             * @param divContent  {string}  文本内容
             * @returns {BMap.InfoWindow}   信息对象
             */
            createInfoWindow:function(title,message,divContent){
                var sendMessage=false;
                if(message) sendMessage=true;
                var opts = {
                    width : 97, // 信息窗口宽度
                    height : 95, // 信息窗口高度
                    title : title, // 信息窗口标题
                    enableMessage : sendMessage, // 设置允许信息窗发送短息
                    message : message            // 允许发送短信
                };
                window.infoWindow = new BMap.InfoWindow(divContent, opts); // 创建信息窗口对象
                return window.infoWindow;
            },
            /**
             * 打开一个信息窗口
             * @param title   {string}      信息标题
             * @param message   {string}    需要发送的信息
             * @param divContent   {string} 信息内容
             * @param point   {object}      百度坐标点
             */
            addInfoWindow : function(title,message,divContent,point,isCenter) {
                window.infoWindow=this.createInfoWindow(title, message, divContent);
                window.infoWindow.enableAutoPan();
                map.openInfoWindow(window.infoWindow, point); // 开启信息窗口
                if(isCenter)map.setCenter(point);
            },
            /**
             * 获取地图上打开的信息窗口
             * @returns  object||null
             */
            getOpendInfoWindow:function(){
                return map.getInfoWindow();
            },
            /**
             * 重绘信息窗口
             * @param  信息窗口对象
             */
            redrawInfoWindow:function(){
                window.infoWindow.redraw();
            },
            /**
             * 居中和缩放
             * @param point     {object} 百度坐标点
             * @param zoomLevel {number} 缩放等级
             */
            centerAndZoom:function(point,zoomLevel){
                map.setCenter(point);
                map.setZoom(zoomLevel);
            }
        };
    
        /**
         * 百度要素操作工具
         */
        BmapUtils.tootls = {
            /**
             * 越界控制
             */
            handleFeatureInBounds:function(point) {
                var bounds =map.getBounds();
                if (!bounds.containsPoint(point)){
                    map.panTo(point); // 是否在视图范围之内,若跃出视图则平滑居中
                }
            },
            /**
             * 测量两点的距离
             * @param pointA            百度坐标点A
             * @param pointB            百度坐标点B
             * @return {number}         距离大小:单位:米(meter)
             */
            distance : function(pointA, pointB) {
                return map.getDistance(pointA, pointB); // 获取两点距离
            },
            /**
             * 添加Marker对象
             * @param title            {String}  toolTip文字
             * @param point            {object}  百度坐标点对象
             * @param name             {string}  显示名称
             * @param showLabel        {boolean} 是否显示标注的文本
             * @param myIcon           {boolean} Icon图片对象
             */
            addMarker : function(title,point, name, showLabel,myIcon) {
                var marker = new BMap.Marker(point,{icon:myIcon});
                if (showLabel) {
                    var label = new BMap.Label(name, {
                        offset : new BMap.Size(20, -10)
                    });
                    marker.setLabel(label);
                }
                marker.setTitle(title);
                map.addOverlay(marker);
                return marker;
            },
            /**
             * 定位添加marker坐标
             * @param lon            {number} 经度
             * @param lat            {number} 纬度
             * @param isShow         {boolean} 系统打开或关闭
             */
            addMarkerDisplayOrUnDisplay : function(lon, lat, isShow) {
                var marker = new BMap.Marker(new BMap.Point(lon, lat)); // 创建标注
                marker.prototype=new  BMap.Overlay();
                map.addOverlay(marker); // 将标注添加到地图中
                if (isShow) {
                    marker.show();
                } else {
                    marker.hide();
                }
            },
            /**
             * 添加折线(轨迹)
             *  @param points       百度坐标对象集合
             */
            addLineFeature : function(points,style) {
                var default_style={
                        strokeColor : "#3976F0",
                        strokeWeight : 3,
                        strokeOpacity : 0.5
                    };
                var polyline = new BMap.Polyline(points,style|| default_style );
                map.addOverlay(polyline); // 添加折线到地图上
                return polyline;
            },
            /**
             * 添加折线(轨迹,包括起点、终点)
             * @param sepoint                  {object} 起终点的名称.start ,.end
             * @param points                {array} 原始JSON坐标对象集合
             * @param startImageUrk         {string} 起点图片路径
             * @param endImageUrk           {string} 终点图片路径
             */
            addLineFeatureAndStartAndEndPoint : function(sepoint,points, startImageUrk,    endImageUrk,lineStyle) {
                var len=points.length;
                var index =len - 1;
                var startPoint = points[0];
                var endPoint =points[index];
                var startIcon = BmapUtils.getIcon(startImageUrk,20,20);
                startIcon.setImageSize(new BMap.Size(20,20));
                var endIcon = BmapUtils.getIcon(endImageUrk,20,20);
                endIcon.setImageSize(new BMap.Size(20,20));
                var startMarker = new BMap.Marker(startPoint, {
                    icon : startIcon
                });
                var endMarker = new BMap.Marker(endPoint, {    icon : endIcon});
                startMarker.setTitle(sepoint.start);
                endMarker.setTitle(sepoint.end);
                if(len>=2){
                    var d=(len/2)+"";
                    d=parseInt(d);
                    map.centerAndZoom(points[d],12);
                }
                this.addLineFeature(points,lineStyle);
                map.addOverlay(startMarker);
                map.addOverlay(endMarker);
            },
            /**
             * 路径规划
             * 
             * @param startPoint     {object} 起点
             * @param endPoint       {object} 终点
             * @param carImgUrl      {string} 车辆图片路径
             */
            roadPlanToRun : function(startPoint, endPoint, carImgUrl) {
                var driving2 = new BMap.DrivingRoute(map, {
                    renderOptions : {
                        map : map,
                        autoViewport : true
                    }
                }); // 驾车实例
                driving2.search(startPoint, endPoint); // 显示一条公交线路
    
                var run = function() {
                    var driving = new BMap.DrivingRoute(map); // 驾车实例
                    driving.search(myP1, myP2);
                    driving.setSearchCompleteCallback(function() {
                        var pts = driving.getResults().getPlan(0).getRoute(0)
                                .getPath(); // 通过驾车实例,获得一系列点的数组
                        var paths = pts.length; // 获得有几个点
    
                        var carMk = new BMap.Marker(pts[0], {
                            icon : BmapUtils.getIcon(carImgUrl)
                        });
                        map.addOverlay(carMk);
                        i = 0;
                        function resetMkPoint(i) {
                            carMk.setPosition(pts[i]);
                            if (i < paths) {
                                setTimeout(function() {
                                    i++;
                                    resetMkPoint(i);
                                }, 100);
                            }
                        }
                        setTimeout(function() {
                            resetMkPoint(5);
                        }, 100);
    
                    });
                };
    
                setTimeout(function() {
                    run();
                }, 500);
            },
            /**
             * 轨迹回放
             * @param points        {Array} 百度坐标点集合
             * @param carImgUrl     {string} 车辆图片的地址
             */
            trackPlay : function(points, carImgUrl) {
                var carMk = new BMap.Marker(points[0], {
                    icon : BmapUtils.getIcon(carImgUrl)
                });
                map.addOverlay(carMk);
                var i = 0;
                function resetMkPoint(i) {
                    carMk.setPosition(points[i]);
                    if (i < paths) {
                        setTimeout(function() {
                            i++;
                            resetMkPoint(i);
                        }, 100);
                    }
                }
                setTimeout(function() {
                    resetMkPoint(i);
                }, 100);
            },
            /**
             * 添加圆
             * @param lon     {number} 经度
             * @param lat     {number} 纬度
             * @param radius{number}   半径
             */
            addCircle : function(lon, lat, radius) {
                var point = new BMap.Point(lon, lat);
                map.centerAndZoom(point, 16);
                var circle = new BMap.Circle(point, radius);
                map.addOverlay(circle);
            },
            /**
             * 添加多边形
             * @param points {array} 百度坐标点集合
             */
            addPolygon : function(points) {
                var polygon = new BMap.Polygon(points, {
                    strokeColor : "blue",
                    strokeWeight : 3,
                    strokeOpacity : 0.5
                });
                map.addOverlay(polygon);
            },
            /**
             * 根据用户覆盖物的标识属性获取覆盖物
             * @param properties  {string} 属性名称
             * @param nodeId      {string} 属性字段的值
             */
            getOverlayByNodeId:function(properties,value){
                var overlays=map.getOverlays();
                for ( var i = 0,le=overlays.length; i < le; i++) {
                    var overlay=overlays[i];
                    if(overlay[properties]==value){
                        return overlay;
                    }
                }
                return null;
            },
            /**
             * 根据用户覆盖物的标识属性显示覆盖物
             * 
             * @param properties  {string} 属性名称
             * 
             * @param nodeId      {string} 属性字段的值
             */
            showOverlay:function(properties,value){
                var overlay=this.getOverlayByNodeId(properties, value);
                overlay.show();
            },
            /**
             * 根据用户覆盖物的标识属性隐藏覆盖物
             * @param properties  {string} 属性名称
             * @param nodeId      {string} 属性字段的值
             */
            hideOverlay:function(properties,value){
                var overlay=this.getOverlayByNodeId(properties, value);
                overlay.hide();
            },
            /**
             * 根据用户覆盖物的标识属性移除覆盖物
             * @param properties  {string} 属性名称
             * @param nodeId      {string} 属性字段的值
             */
            removeOverlay:function(properties,value){
                var overlay=this.getOverlayByNodeId(properties, value);
                if(overlay) map.removeOverlay(overlay);
            },
            /**
             * 删除地图上所有覆盖物
             */
            removeAllOverlays:function(){
                map.clearOverlays();
            },
            /**
             * 控制缩放层级显示图标显示或隐藏
             * @param markers {array}  标注数组
             * @param zoom {number}    缩放等级
             */
            controlMakersHideOrShowByZoom:function(markers,zoom){
                if(markers){
                    var map_zoom=map.getZoom();
                    if(map_zoom<zoom){
                        for ( var i = 0; i < markers.length; i++) {
                            var overlay=markers[i];
                            if(overlay){
                                overlay.prototype=new BMap.Overlay();
                                overlay.hide();
                            }
                        }
                        BmapUtils.CONSTANT.LINE_MAKERS_SHOW=false;
                    }else{
                        if(BmapUtils.CONSTANT.LINE_MAKERS_SHOW==false){
                            for ( var i = 0; i <markers.length; i++) {
                                var overlay=markers[i];
                                if(overlay){
                                    overlay.prototype=new BMap.Overlay();
                                    overlay.show();
                                }
                            }
                            BmapUtils.CONSTANT.LINE_MAKERS_SHOW=true;
                        }
                    }
                }
            }
        };
    
        /**
         * 百度探索处理
         */
        BmapUtils.search = {
            /**
             * 本地探索(含自动提示)
             * @param inputSuggestId         {string} 输入框的id属性
             * @param searchResultPanelId    {string} 结果面板的id属性
             */
            localSearch : function(inputSuggestId, searchResultPanelId) {
                function G(id) {
                    return document.getElementById(id);
                }
                var ac = new BMap.Autocomplete( // 建立一个自动完成的对象
                {
                    "input" : inputSuggestId,
                    "location" : map
                });
    
                ac.addEventListener("onhighlight", function(e) { // 鼠标放在下拉列表上的事件
                    var str = "";
                    var _value = e.fromitem.value;
                    var value = "";
                    if (e.fromitem.index > -1) {
                        value = _value.province + _value.city + _value.district
                                + _value.street + _value.business;
                    }
                    str = "FromItem<br />index = " + e.fromitem.index
                            + "<br />value = " + value;
    
                    value = "";
                    if (e.toitem.index > -1) {
                        _value = e.toitem.value;
                        value = _value.province + _value.city + _value.district
                                + _value.street + _value.business;
                    }
                    str += "<br />ToItem<br />index = " + e.toitem.index
                            + "<br />value = " + value;
                    G(searchResultPanelId).innerHTML = str;
                });
    
                var myValue = "", local = {};
                var setPlace = function() {
                    map.clearOverlays(); // 清除地图上所有覆盖物
                    function myFun() {
                        var pp = local.getResults().getPoi(0).point; // 获取第一个智能搜索的结果
                        map.centerAndZoom(pp, 18);
                        map.addOverlay(new BMap.Marker(pp)); // 添加标注
                    }
                    local = new BMap.LocalSearch(map, { // 智能搜索
                        onSearchComplete : myFun
                    });
                    local.search(myValue);
                };
                ac.addEventListener("onconfirm", function(e) { // 鼠标点击下拉列表后的事件
                    var _value = e.item.value;
                    myValue = _value.province + _value.city + _value.district
                            + _value.street + _value.business;
                    G(searchResultPanelId).innerHTML = "onconfirm<br />index = "
                            + e.item.index + "<br />myValue = " + myValue;
                    setPlace();
                });
            },
            /**
             * POI查询
             * @param inputId {string}  输入框id属性名称
             */
            poiSearch:function(inputId){
                var poiInfo=$("#"+inputId).val();
                var mapZoom=map.getZoom();
                if(mapZoom<12){
                    $.messager.alert("提示", "当前搜索面积太广,请将地图放大到市级别后再搜索", "warning");
                    return ;
                }
                if(poiInfo==""){
                    $.messager.alert("提示", "请输入搜索关键字", "warning");
                    return ;
                }
                LocalSearch.searchInBounds(poiInfo, map.getBounds());
            }
        };
        
        /**
         * 百度地图自定义控件
         */
        BmapUtils.control={
                /**
                 * 轨迹回放操作菜单控件
                 */
                addTrakPalyControl:function(){
                    function TrackControl(){
                      // 默认停靠位置和偏移量
                      this.defaultAnchor = BMAP_ANCHOR_BOTTOM_RIGHT;
                      this.defaultOffset = new BMap.Size(10, 20);
                    }
    
                    // 通过JavaScript的prototype属性继承于BMap.Control
                    TrackControl.prototype = new BMap.Control();
    
                    // 自定义控件必须实现自己的initialize方法,并且将控件的DOM元素返回
                    // 在本方法中创建个div元素作为控件的容器,并将其添加到地图容器中
                    TrackControl.prototype.initialize = function(map){
                         // 创建一个DOM元素
                         // var mapContainerDiv= map.getContainer();
                         var div=document.createElement("div");
                         // 创建节点内容
                        
                         var htmlContent='<div class="playDiv" style="z-index: 1000;position: absolute; right: 10px; bottom: 20px;">'+
                              '<div class="f-right ml20">'+
                            '<input id="slider_" class="easyui-slider" style="200px;background-color: orange;" data-options="showTip:true,min:0,step:10,max:100,rule:[0,'|',10,'|',20,'|',30,'|',40,'|',50,'|',60,'|',70,'|',80,'|',90,'|',100],tipFormatter:function(v){return v+'%';},onSlideEnd:function(value){process(value);}"  style="float:left"/>'+
                            ' </div>'+
                            '<div class="f-right" id="uoptions">'+
                            ' <a id="thisplay" href="javascript:void(0)" onclick="playOrReplay()" class="easyui-linkbutton" data-options="disabled:true">播放</a> '+
                            ' <a id="thispause" href="javascript:void(0)" onclick="pauseOrgo(1)" class="easyui-linkbutton" data-options="disabled:true">暂停</a> '+
                            ' <a id="thiscontinue" href="javascript:void(0)" onclick="pauseOrgo(2)" class="easyui-linkbutton" data-options="disabled:true">继续</a> '+
                            ' <a id="export" href="javascript:void(0)" onclick="reportorExport()" class="easyui-linkbutton" data-options="disabled:true">导出</a> '+
                            '</div></div>';
                         var  playDiv=document.createTextNode(document.createTextNode(htmlContent));
                         // 添加文字说明
                         div.appendChild(playDiv);
                         // 将DOM元素返回
                         return div;
                    };
                    // 创建控件
                    var myTrackCtrol = new TrackControl();
                    // 添加到地图当中
                    map.addControl(myTrackCtrol);
                }
        };
        
        /**
         * 地图事件
         */
        BmapUtils.event={
                zoomed:function(markers,zoom){
                    map.addEventListener("zoomend",function(){
                        BmapUtils.tootls.controlMakersHideOrShowByZoom(markers, zoom);
                    });
                },
                removeZoomed:function(markers,zoom){
                    map.removeEventListener("zoomend",function(){
                        BmapUtils.tootls.controlMakersHideOrShowByZoom(markers, zoom);
                    });
                }
        };
    
    })();

     注:添加百度地图v1.5

    <script src="http://api.map.baidu.com/api?v=1.5&ak=${ak }"></script>
    <script type="text/javascript"  src="${ctx}/res/js/baidumap/bmap.util.js"></script>

    ak:即百度地图凭证key,需要自己申请

  • 相关阅读:
    TSQL 备份和还原
    SQL检查死锁情况
    局域网中“隐身”妙招 类似360的局域网隐身
    注册edu邮箱的办法
    C#读、写、删除注册表
    SQL备份计划
    GridView命令不够用怎么办?
    从智能设备访问SQL2000的数据
    智能设备访问SQL2000(一)
    字符HTML编码类(转)
  • 原文地址:https://www.cnblogs.com/boonya/p/3215015.html
Copyright © 2020-2023  润新知