如何用three.js搭建處理3D園區、3D樓層、3D機房管線(機房升級版)-第九課(二)


接着上一篇文章,《如何用webgl(three.js)搭建處理3D園區、3D樓層、3D機房管線問題(機房升級版)-第九課(一)》 繼續講解關於三維數據中心管線可視化的解決方案。

上一篇我們主要講解了園區的方案,這一片主要講解樓層內的以及機房內的可視化管線方案。

因為是繼着上一篇文章,這里就不做概念性講解了。

閑話少敘,我們繼着上一篇直接上干貨。

技術交流 1203193731@qq.com

交流微信:

    

如果你有什么要交流的心得 可郵件我

1、首先,我們雙擊某移動樓,進入樓層內部,看一下樓層結構,效果如下:

 進入樓層后,線展開顯示樓層以及主要管線全貌,然后再合並樓層,隱藏管線。

實現代碼如下:

//雙擊選中機櫃
ModelBussiness.prototype.dbClickSelect = function (_obj, _face, formRoute,searchParam) {

    var _this = this;
    if (modelBussiness.currentState > 20 && modelBussiness.currentState <30) {
        return;
    }
    if (_obj.name.indexOf("build") >= 0 ) {
        modelBussiness.commonFunc.ZoomINShow(_obj, _face, formRoute);
        setTimeout(function () {
            var floorurl = "floor.html?build=" + _obj.name;
            if (searchParam) {
                floorurl = "dataCenter.html?build=" + _obj.name;
                floorurl+= "&searchParam=" + searchParam;
            } 
        }, 2000);
        selectBuild(_obj);//加載顯示樓層

    }  
}

 

2、顯示樓層間管線,並且顯示管線信息

 

 實現代碼如下:

// 點擊顯示光纜
function showDianLuData(id, cirName, customerName, aUserPort, aOppositePort, zOppositePort, zUserPort, aLight,isSearch) {
    $('#seachBase').show()
    $('#guangLan').hide()
    $("#"+id).siblings().find('.searchRowText').removeClass('active')
    $("#" + id).find('.searchRowText').addClass('active');
    if (isSearch) {
        var devs = getDLGLDevsConfig();
        var modelids = null;
        var model4ids = null;
        $.each(devs, function (_index, _obj) {
            if (_obj.dataid == id) {
                modelids = _obj.modelname2;
                model4ids = _obj.modelname4;
            }
        });
        if (modelids) {
            modelBussiness.showAllFloorLinesModel(function () {
                modelBussiness.vistureAllFloorLinesModel(function () {
                    if (modelids.length > 0) {
                        $.each(modelids, function (_index, _obj) {
                            modelBussiness.entityFloorLinesModelByName(_obj, model4ids);
                        })
                    }
                });
            });
        }
    }
    var html=template('temp_dianLu',{cirName:cirName,customerName:customerName,aUserPort:aUserPort,aOppositePort:aOppositePort,zOppositePort:zOppositePort,zUserPort:zUserPort,aLight:aLight})
    $("#seachBase").html(html)
}

鼠標划入,顯示光纜彈窗信息

//鼠標滑入回調
ModelBussiness.prototype.mouseOverInCallBack = function (_obj, face,_objs) {
    // console.log(44,_obj, face,_objs)
    console.log(_obj.name)
    if (modelBussiness.currentState >= 26) {
        return;
    }
    layer.closeAll();
    var _this = this;
    var color = 0xbfffea;
    if (_obj.name.indexOf("_OBJCREN_") >= 0) {
        _obj = _obj.parent;
    }
    if (_obj.name.indexOf("_OBJCREN_") >= 0) {
        _obj = _obj.parent;
    }
    modelBussiness.lastMouseInCurrentObj = _obj;
    modelBussiness.mouseInCurrentObj = _obj;
   
    if (_obj.name.indexOf("yqgx_") >= 0) {
        var _sobj = _obj;
        if (_obj.visible) {
        modelBussiness.mouseInCurrentObj = _sobj;
        showLightLineData(_obj.name);
        }
      //  WT3DObj.commonFunc.setSkinColorByObj(_sobj, 0xffff00)
    } else if (_obj.name.indexOf("zb_f") >= 0 || _obj.name.indexOf("jing_line_") >= 0) {
        var _sobj = _obj;
        modelBussiness.mouseInCurrentObj = _sobj;

        //WT3DObj.commonFunc.setSkinColorByObj(_sobj, 0xffff00)
        showLightLineData(_obj.name);
    } else if (_obj.name.indexOf("build_") >= 0) {
        var _sobj = _obj;
        if(!$(".searchBtn:visible").length) return;
        WT3DObj.commonFunc.changeObjsOpacity([_sobj], 0, 1, 10, function () {});
        // 顯示樓信息
        $("#"+_obj.name).fadeIn()
        modelBussiness.changeMsgDivPosition()
    } else if (_obj.name.indexOf("dev_jg_") >= 0) {
        var _sobj = _obj;
        modelBussiness.mouseInCurrentObj = _sobj;
        modelBussiness.commonFunc.showJGMsg(_obj, { x: _obj.position.x, y: _obj.position.y , z: _obj.position.z  });
    }


    // console.log(_obj.name);
}

 

3、樓層內搜索光纜走向,並顯示主要接入設備的信息。

 

 實現代碼如下:

 $('.searchBtnSou').click(function () {
    //光纜--接口數據展示
    var keyWord=$("#searchIpt").val()
    var emptyStr="<span style=' font-size: 16px;color: #ffbe00;margin-top:50px;'>查無結果!</span>";
    var html='';
    var dataNew=[];
    if ($('.searchSelect').text() == '光纜') {
      webapi.getSearchLineParkData(keyWord, function (data) {
        dataNew=searchFilter(data,'lineName',keyWord)
        html=template('temp_list_guangLan',{data:dataNew})
        if (!dataNew.length) {
          html=emptyStr;
        }
        $(".searchList").html(html);
      })
    }   
})

 

4、搜索樓層間電路信息

 

 實現代碼如下:

 if ($('.searchSelect').text() == '電路') {
      webapi.getSearchCircuit(keyWord, function (data) {
        var dataNew = [];
        data.forEach(function(item){
          if(item.cirName.indexOf(keyWord)>-1){
            dataNew.push(item)
          }
        })
        // dataNew=searchFilter(data,'cirName',keyWord)
        html=template('temp_list_dianLu',{data:dataNew});
        if (!dataNew.length) {
          html=emptyStr;
        }
        $(".searchList").html(html);
      })
    }

 

5、展現客戶設備概覽,對於大型IDC機房,會涉及到很多用戶租用機櫃的情況,這時候就需要能夠清晰的看到各個客戶租用的機櫃概況,

這里我們雙擊進入到樓層內部,右下角會展現出當前樓層所有租賃的客戶名稱,點擊任何一個客戶名稱,高亮顯示該客戶對應的機櫃,其它無關機櫃虛化。

 

實現代碼如下:

//根據客戶id顯示
ModelBussiness.prototype.showCabinetByCustomId = function (id, sucFunc) {
    var _this = this;
    var racks = getRacksConfig();
    var names = [];
        $.each(racks, function (_index, _obj) {
            if (_obj.customerCompId == id) {
                names.push(_obj.name);
            }
        });
    if (_this.needHideCabinets.length <= 0) {
        $.each(WT3DObj.objects, function (_index, _obj) {
            if (_obj.name.indexOf("dev_") >= 0 || _obj.name.indexOf("rack_") >= 0) {
                _this.needHideCabinets.push(_obj);
            }
        });
    }
    var showCabs = [];
    if (id == "all") {

        showCabs = _this.needHideCabinets;
    } else {
        $.each(_this.needHideCabinets, function (_index, _obj) {
            if (names.indexOf(_obj.name) >= 0) {

                showCabs.push(_obj);
            }
        })
    }
    WT3DObj.commonFunc.changeObjsOpacity(showCabs, 0.2, 1, 500, function () {
        if (sucFunc) {
            sucFunc();
        }
    });
}

 

 6、樓層內統一包括常規的機櫃管理數據,機櫃信息展示等

 

划入機櫃,光纜等代碼如下:

//鼠標滑入回調
ModelBussiness.prototype.mouseOverInCallBack = function (_obj, face) {
    if (modelBussiness.currentState >= 29) {
        return;
    }
    var _this = this;
    var color = 0xbfffea;
    console.log(_obj.name);
    if (modelBussiness.lastMouseInCurrentObj) {
        if ((modelBussiness.lastMouseInCurrentObj.name.indexOf("sq_qiang_") >= 0
            || modelBussiness.lastMouseInCurrentObj.name.indexOf("sq_chuang_") >= 0) && modelBussiness.hasShowfloors)
        {
            var currentFloor=modelBussiness.lastMouseInCurrentObj.name.replace("sq_qiang_","").replace("sq_chuang_","")
            if (currentFloor != "3" && currentFloor != "1" && currentFloor != "4" && currentFloor != "6") {
                WT3DObj.commonFunc.changeObjsOpacity([modelBussiness.lastMouseInCurrentObj], 1, 0.2, 10, function () {
                });
            }
        }
        WT3DObj.commonFunc.setSkinColorByObj(modelBussiness.lastMouseInCurrentObj, 0x000000);
    }
    if (_obj.name.indexOf("_OBJCREN_") >= 0) {
        _obj = _obj.parent;
    }
    if (_obj.name.indexOf("_OBJCREN_") >= 0) {
        _obj = _obj.parent;
    }
    modelBussiness.lastMouseInCurrentObj = _obj;
    modelBussiness.mouseInCurrentObj = _obj;
    if (_obj.name.indexOf("LightCubeBorder") > 0) {
        return;
    } else if (_obj.name.indexOf("_rate_outCube") >= 0) {
        var oldobj = _obj;
        WT3DObj.commonFunc.setSkinColorByObj(oldobj, 0x00ffff);
        var _obj = WT3DObj.commonFunc.findObject(_obj.name.split("_rate_")[0]);

        modelBussiness.commonFunc.showRate(_obj, { x: _obj.position.x, y: _obj.position.y + 500, z: _obj.position.z }, function () {
            //modelBussiness.commonFunc.removeLightBorder(modelBussiness.mouseInCurrentObj.name)
        });
    } else if (_obj.name.indexOf("_bearing_innerCube") >= 0) {
        var oldobj = _obj;
        WT3DObj.commonFunc.setSkinColorByObj(oldobj, 0x00ffff);
        var _obj = WT3DObj.commonFunc.findObject(_obj.name.split("_bearing_innerCube")[0]);

        modelBussiness.commonFunc.showBearingRate(_obj, { x: _obj.position.x, y: _obj.position.y + 300, z: _obj.position.z }, function () {
            //modelBussiness.commonFunc.removeLightBorder(modelBussiness.mouseInCurrentObj.name)
        });
    } else if (_obj.name.indexOf("_energyRate_") >= 0) {
        var oldobj = _obj;
        WT3DObj.commonFunc.setSkinColorByObj(oldobj, 0x00ffff);
        var _obj = WT3DObj.commonFunc.findObject(_obj.name.split("_energyRate_")[0]);

        modelBussiness.commonFunc.showEnergyRate(_obj, { x: _obj.position.x, y: _obj.position.y + 300, z: _obj.position.z }, function () {
            //modelBussiness.commonFunc.removeLightBorder(modelBussiness.mouseInCurrentObj.name)
        });
    }  else if (_obj.name.indexOf("rack_") >= 0
        && _obj.name.indexOf("_Server_") < 0
        && _obj.name.indexOf("_currentCabnet") < 0) {
        modelBussiness.mouseInCurrentObj = _obj;
        modelBussiness.commonFunc.addLightBoder(_obj, 0x00ffff, 1, null, {
            x: _obj.geometry.parameters.width + 4,
            y: _obj.geometry.parameters.height + 4,
            z: _obj.geometry.parameters.depth + 4,
        });
        modelBussiness.commonFunc.showMsg(_obj, { x: _obj.position.x, y: _obj.position.y + 500, z: _obj.position.z }, function () {
            modelBussiness.commonFunc.removeLightBorder(modelBussiness.mouseInCurrentObj.name)
        });
    } else if (_obj.name.indexOf("_Server_") >= 0) {
        var _sobj = _obj;
        modelBussiness.commonFunc.removeLightBorder(modelBussiness.lastMouseInCurrentObj.name);
        modelBussiness.mouseInCurrentObj = _sobj;
        modelBussiness.commonFunc.showServerMsg(_obj, { x: _obj.position.x, y: _obj.position.y + 1.5, z: _obj.position.z - 13 });
        if (modelBussiness.currentState == 10) {
            if (modelBussiness.currentShowServer.name == _sobj.name) {
                return;
            }
        }
        modelBussiness.commonFunc.addLightBoder(_sobj, 0x00ffff, 0.6, null, {
            x: _sobj.geometry.parameters.width + 4,
            y: _sobj.geometry.parameters.height + 4,
            z: _sobj.geometry.parameters.depth + 4,
        });
    } else if (_obj.name.indexOf("dev_T_") >= 0) {
        if (_obj.name.indexOf("_OBJCREN_") >= 0) {
            _obj = WT3DObj.commonFunc.findObject(_obj.name.split("_OBJCREN_")[0]);
        }
        modelBussiness.mouseInCurrentObj = _obj;
        WT3DObj.commonFunc.setSkinColorByObj(_obj, 0x00ffff);
        modelBussiness.commonFunc.showDevMsg(_obj, { x: _obj.position.x, y: _obj.position.y + 500, z: _obj.position.z },
            function () {
                WT3DObj.commonFunc.setSkinColorByObj(_obj, 0x000000);
            });
    } else if ((_obj.name.indexOf("sq_qiang_") >= 0 || _obj.name.indexOf("sq_chuang_") >= 0) && modelBussiness.hasShowfloors) {
        var currentFloor=_obj.name.replace("sq_qiang_","").replace("sq_chuang_","");
        if (currentFloor != "3" && currentFloor != "1" && currentFloor != "4" && currentFloor != "6") {
            modelBussiness.mouseInCurrentObj = _obj;
           // WT3DObj.commonFunc.setSkinColorByObj(_obj, 0x0d8df5);
            WT3DObj.commonFunc.changeObjsOpacity([_obj], 0.2, 1, 10, function () {
            });
        }
        modelBussiness.commonFunc.showFloorMsg(_obj, { x: _obj.position.x, y: _obj.position.y+ 5, z: _obj.position.z + 50 });
    } 
}

 

 7、顯示機櫃利用率概覽

 

//=======================================================利用率=======================================================
ModelBussiness.prototype.rateSpaceState = 0;
ModelBussiness.prototype.rateSpaceCubes = [];
ModelBussiness.prototype.rateSpaceCubeNames = [];
ModelBussiness.prototype.showSpaceRate = function () {
    var _this = this;
    if (_this.rateSpaceState == 0) {
        _this.rateSpaceState = 1;
        $("#backBtn").fadeIn();
        
        layer.closeAll();
        layer.msg(' <img src="../img/loading.gif" style="width:100px;height:100px" />', {
            skin: 'loadingLayer',
            shade: 0.2, time: 0, area: ["200px", "200px"]
        });
        //layer.load();
        $("#toolbar").toggleClass('active')
        //隱藏所有機櫃
        _this.hideAllCabinet("", function () {
            layer.msg(' <img src="../img/loading.gif" style="width:100px;height:100px" />', {
                skin: 'loadingLayer',
                shade: 0.2, time: 0, area: ["200px", "200px"]
            });
            //layer.load();
            webapi.getRacksUsedRateValue(function (result) {
                var rackRate = {};
                $.each(result, function (_reindex, _reobj) {
                    rackRate["d_" + _reobj.id] = _reobj;
                });
                var racks = getRacksConfig();
                if (_this.rateSpaceCubeNames.length <= 0) {
                    $.each(racks, function (_rindex, _robj) {
                        var _name = _robj.name;
                        var rateValue = 0;
                        if (rackRate["d_" + _robj.dataId]) {
                            rateValue = rackRate["d_" + _robj.dataId].useRate;
                        }
                        var itcobj = WT3DObj.commonFunc.findObject(_name);
                        if (itcobj) {
                            _this.commonFunc.createRateCube(_name,
                                { x: 300, y: 900, z: 220 },
                                { x: itcobj.position.x, y: itcobj.position.y, z: itcobj.position.z },
                                { x: 0, y: itcobj.rotation.y + Math.PI/2, z: 0 },
                                rateValue,{ timelong: 1000 });
                        }
                    });
                    setTimeout(function () {
                        layer.closeAll();
                    },3000);
                }
                else {
                    $.each(racks, function (_rindex, _robj) {
                        var _name = _robj.name;
                        var rateValue = 0;
                        if (rackRate["d_" + _robj.dataId]) {
                            rateValue = rackRate["d_" + _robj.dataId].useRate;
                        }
                        var itcobj = WT3DObj.commonFunc.findObject(_name);
                        if (itcobj) {
                            _this.commonFunc.createRateCube(_name,
                                { x: 300, y: 900, z: 220 },
                                { x: itcobj.position.x, y: itcobj.position.y, z: itcobj.position.z },
                                { x: 0, y: itcobj.rotation.y + Math.PI/2, z: 0 },
                                rateValue, { timelong: 1000 });
                        }

                    });

                    setTimeout(function () {
                        layer.closeAll();
                    }, 1000);
                }
            });
        });
    }
    else {
        _this.hideSpaceRate();
        if (_this.needHideCabinets.length > 0) {
            WT3DObj.commonFunc.changeCameraPosition(roomConfig.cameraPostion, roomConfig.cameraTarget, 1000, function () {
                $.each(_this.needHideCabinets, function (_index, _obj) {
                    if (_obj.name.indexOf("_rate_") < 0 && _obj.name.indexOf("_yearCube_") < 0) {
                        _obj.visible = true;
                    }
                });
            });
        }
    }
}
ModelBussiness.prototype.hideSpaceRate = function () {
    modelBussiness.rateSpaceState = 0;
    modelBussiness.currentState = 0;
    if (modelBussiness.rateSpaceCubes && modelBussiness.rateSpaceCubes.length > 0) {
        $.each(modelBussiness.rateSpaceCubes, function (_index, _obj) {
            _obj.visible = false;
            if (!_obj.oldPositionY ){
                _obj.oldPositionY = _obj.position.y;
            }
            _obj.position.y += 1000000;
        });
    }
}

 

 8、顯示u位使用情況概覽,了解每個機櫃的服務器狀態,通過不通顏色區分服務器的當前狀態,以及機櫃內的空閑情況

 

//=======================================================U位=======================================================
ModelBussiness.prototype.agesSpaceState = 0;
ModelBussiness.prototype.agesSpaceCubes = [];
ModelBussiness.prototype.agesSpaceCubeNames = [];
ModelBussiness.prototype.showUsageMap = function () {
    var _this = this;
    var cabs = getRacksConfig();

    if (_this.agesSpaceState == 0) {
        _this.agesSpaceState = 1;
        $("#backBtn").fadeIn();
        layer.closeAll();
        layer.msg(' <img src="../img/loading.gif" style="width:100px;height:100px" />', {
            skin: 'loadingLayer',
            shade: 0.2, time: 0, area: ["200px", "200px"]
        });
        //layer.load();
        $("#toolbar").toggleClass('active')
        //隱藏所有
        _this.hideAllCabinet("aaaa", function () {
            layer.msg(' <img src="../img/loading.gif" style="width:100px;height:100px" />', {
                skin: 'loadingLayer',
                shade: 0.2, time: 0, area: ["200px", "200px"]
            });
            //layer.load();
            webapi.getUDetailInfos(null, function () {
                if (_this.agesSpaceCubeNames.length <= 0) {
                    for (var i = 0; i < cabs.length; i++) {
                        var _objModel = WT3DObj.commonFunc.findObject(cabs[i].name);
                        if (_objModel) {
                      
                        var servers = webapi.CabInfosCache.Dataobjs["d_" + cabs[i].dataId].children;
                        var rateValue = Math.random();
                        var ageValue = [];
                        if (servers&&servers.length>0){
                            $.each(servers, function (_si,_sobj) {
                                ageValue.push({
                                    value:_sobj.lastTemperature,
                                    max: _sobj.uEnd,
                                    min:_sobj.uStart
                                });
                            })
                        }
                        var style = {
                            borderColor: 0x444444,
                            outColor: 0xffffff,
                            outOprity: 0.1
                        };
                        _this.commonFunc.createUseageCube(cabs[i].name,
                            { x: 300, y: 900, z: 220 },
                            { x: _objModel.position.x, y: _objModel.position.y, z: _objModel.position.z },
                            { x: 0, y: _objModel.rotation.y + Math.PI/2, z: 0 },
                            ageValue,
                            style, { timelong: 1000 }, i);
                        }
                    }
                    setTimeout(function () {
                        layer.msg(' <img src="../img/loading.gif" style="width:100px;height:100px" />', {
                            skin: 'loadingLayer',
                            shade: 0.2, time: 0, area: ["200px", "200px"]
                        });
                        //layer.load();
                            $.each(WT3DObj.scene.children, function (_oindex, _oobj) {
                            if (_oobj.name.indexOf("_yearCube_outCubeBorder") >= 0) {
                                _oobj.visible = true;
                            }
                            });
                        setTimeout(function () {
                            layer.msg(' <img src="../img/loading.gif" style="width:100px;height:100px" />', {
                                skin: 'loadingLayer',
                                shade: 0.2, time: 0, area: ["200px", "200px"]
                            });
                            //layer.load();
                        $.each(WT3DObj.scene.children, function (_oindex, _oobj) {
                                    if (_oobj.name.indexOf("_yearCube_innerCube_") >= 0) {
                                        _oobj.visible = true;
                                    }
                                });
                            layer.closeAll();
                        },3000);
                    }, 8000);
                  
                }
                else {
                    for (var i = 0; i < cabs.length; i++) {
                        var ageValue = [];
                        var style = {
                            borderColor: 0xffffff,
                            outColor: 0xffffff,
                            outOprity: 0.1
                        };
                        var _objModel = WT3DObj.commonFunc.findObject(cabs[i].name);
                        if (_objModel) {

                        _this.commonFunc.createUseageCube(cabs[i].name,
                            { x: 300, y: 900, z: 220 },
                            { x: _objModel.position.x, y: _objModel.position.y + Math.PI/2, z: _objModel.position.z },
                            { x: 0, y: _objModel.rotation.y, z: 0 },
                            ageValue,
                            style, { timelong: 1000 }, i);
                        }
                    }
                }
                setTimeout(function () {
                    layer.closeAll();
                  
                    
                },5000)
            });
          
        });

    } else {
        this.hideUsageSpaceRate();
        if (_this.needHideCabinets.length > 0) {
            WT3DObj.commonFunc.changeCameraPosition(roomConfig.cameraPostion, roomConfig.cameraTarget, 1000, function () {
                $.each(_this.needHideCabinets, function (_index, _obj) {
                    if (_obj.name.indexOf("_rate_") < 0 && _obj.name.indexOf("_yearCube_") < 0) {
                        _obj.visible = true;
                    }
                });
            });
        }
    }
}
ModelBussiness.prototype.hideUsageSpaceRate = function () {
    modelBussiness.currentState = 0;
    modelBussiness.agesSpaceState = 0;
    if (modelBussiness.agesSpaceCubes && modelBussiness.agesSpaceCubes.length > 0) {
        $.each(modelBussiness.agesSpaceCubes, function (_index, _obj) {
            _obj.visible = false;
        });
    }
}

 

 9、通過機櫃柱狀圖形式,展現機櫃的承重,配電情況。

 

代碼如下:

//=======================================================承重=======================================================
ModelBussiness.prototype.BearingState = 0;
ModelBussiness.prototype.BearingCubes = [];
ModelBussiness.prototype.BearingCubeNames = [];
ModelBussiness.prototype.showBearing = function () {
    var _this = this;
    var cabs = getRacksConfig();
    if (_this.BearingState == 0) {
        _this.BearingState = 1;
        $("#backBtn").fadeIn();
        layer.closeAll();
        layer.msg(' <img src="../img/loading.gif" style="width:100px;height:100px" />', {
            skin: 'loadingLayer',
            shade: 0.2, time: 0, area: ["200px", "200px"]
        });
        //layer.load();
         $("#toolbar").toggleClass('active') 
        //隱藏所有
        _this.hideAllCabinet("aaaa", function () {
            layer.msg(' <img src="../img/loading.gif" style="width:100px;height:100px" />', {
                skin: 'loadingLayer',
                shade: 0.2, time: 0, area: ["200px", "200px"]
            });
            //layer.load();
            webapi.getRacksBearingValue(function (result) {
                var bearingRate = {};
                $.each(result, function (_reindex, _reobj) {
                    bearingRate["d_" + _reobj.cabid] = _reobj;
                });

            var style = {
                    borderColor: 0xffffff,
                    innerColor: 0x6495ed,
                    innerOprity: 1,
                    outColor: 0xffffff,
                    outOprity: 0.1
                };
            if (_this.BearingCubeNames.length <= 0) {
                for (var i = 0; i <cabs.length; i++) {
                    var bearingValue = 0;
                        var _objModel = WT3DObj.commonFunc.findObject(cabs[i].name);
                        if (_objModel) {
                            if (bearingRate["d_" + cabs[i].dataId]) {
                                bearingValue = bearingRate["d_" + cabs[i].dataId].bearingRate;
                            }

                            if (bearingValue > 0.90) {
                                style.innerColor = 0xff0000;
                            } else if (bearingValue > 0.70) {
                                style.innerColor = 0xffa500;
                            } else if (bearingValue > 0.50) {
                                style.innerColor = 0xffff00;
                            } else {
                                style.innerColor = 0x6495ed;

                            }
                            if (cabs[i]) {
                                _this.commonFunc.createBearing(cabs[i].name,
                                    { x: 300, y: 900, z: 220 },
                                    { x: _objModel.position.x, y: _objModel.position.y, z: _objModel.position.z },
                                    { x: 0, y: _objModel.rotation.y + Math.PI/2, z: 0 },
                                    bearingValue,
                                    style, { timelong: 1000 });
                            }
                        }
                }
                setTimeout(function () {
                    layer.closeAll();
                }, 3000);
            }
            else {
                for (var i = 0; i <= cabs.length; i++) {
                    var bearingValue = 0;
                    var _objModel = WT3DObj.commonFunc.findObject(cabs[i].name);
                    if (_objModel) {
                        if (bearingRate["d_" + cabs[i].dataId]) {
                            bearingValue = bearingRate["d_" + cabs[i].dataId].bearingRate;
                        }
                        if (bearingValue > 0.90) {
                            style.innerColor = 0xff0000;
                        } else if (bearingValue > 0.70) {
                            style.innerColor = 0xffa500;
                        } else if (bearingValue > 0.50) {
                            style.innerColor = 0xffff00;
                        } else {
                            style.innerColor = 0x6495ed;

                        }
                        if (cabs[i]) {
                            _this.commonFunc.createBearing(cabs[i].name,
                                { x: 300, y: 900, z: 220 },
                                { x: _objModel.position.x, y: _objModel.position.y + Math.PI/2, z: _objModel.position.z },
                                { x: 0, y: _objModel.rotation.y, z: 0 },
                                bearingValue,
                                style, { timelong: 1000 });
                        }
                    }
                }

                setTimeout(function () {
                    layer.closeAll();
                }, 2000);
            }

            });

        });
    }
    else {
        _this.hideBearing();
        if (_this.needHideCabinets.length > 0) {
            WT3DObj.commonFunc.changeCameraPosition(roomConfig.cameraPostion, roomConfig.cameraTarget, 1000, function () {
                $.each(_this.needHideCabinets, function (_index, _obj) {
                    if (_obj.name.indexOf("_bearing_") < 0 && _obj.name.indexOf("_yearCube_") < 0) {
                        _obj.visible = true;
                    }
                });
            });
        }
    }
}
ModelBussiness.prototype.hideBearing = function () {
    modelBussiness.currentState =0;
    modelBussiness.BearingState = 0;
    if (modelBussiness.BearingCubes && modelBussiness.BearingCubes.length > 0) {
        $.each(modelBussiness.BearingCubes, function (_index, _obj) {
            if (!_obj.oldPositionY) {
                _obj.oldPositionY = _obj.position.y;
            }
            _obj.position.y = 100000;
            _obj.visible = false;
        });
    }
}

 

 10、樓層內服務器間的管線關聯情況,我采用邏輯線路方案,通過邏輯展現的方式,展現兩個服務器間的連線信息。

 

實現方式如下:

//=======================================================管線管理=======================================================
ModelBussiness.prototype.ShowLineManage = function (linkData) {
    console.log(linkData);
    var _this = this;
    var startCab = "";
    var endCab = "";
    var startU = 0;
    var startUL =0;
    var endu = 0;
    var endUL = 0;
    var startServerID = "";
    var endServerID = "";
    if (_this.showLineState==1) {
        layer.msg("配線計算中,請稍后");
        return;
    }
    _this.showLineState = 1;
    if (linkData && linkData.path) {
        startCab = "rack_" + linkData.path[0].cabid;
        startU = linkData.path[0].uStart;
        startUL = linkData.path[0].uEnd - linkData.path[0].uStart + 1;
        startServerID = linkData.path[0].serverId;

        endCab = "rack_" + linkData.path[1].cabid;
        endu = linkData.path[1].uStart;
        endUL = linkData.path[1].uEnd - linkData.path[1].uStart + 1;
        endServerID = linkData.path[1].serverId;
    }

    _this.CloseLineManage(function ()
    {
        _this.showLineState = 1;
        var startCabobj = WT3DObj.commonFunc.findObject(startCab);
        var endCabobj = WT3DObj.commonFunc.findObject(endCab);
        if (!startCabobj) {
            return;
        }
        if (!endCabobj) {
            return;
        }
        _this.currentStartCabName = startCab;
        _this.currentEndCabName = endCab;
        _this.currentStartSeverId = startServerID;
        _this.currentEndSeverId = endServerID;
        var hideobj = [];
        if(_this.ShowLineNeedHide.length <= 0) {
            $.each(WT3DObj.objects, function (_index, _obj) {
                if (_obj.name.indexOf(modelBussiness.roomName + "_cab_") < 0 || _obj.name.indexOf("_sGroup") > 0) {
                    _this.ShowLineNeedHide.push(_obj);
                }
            });
        }
        var caby = startCabobj.geometry.parameters.height;
        var cabx = startCabobj.geometry.parameters.width;
        var cabz = startCabobj.geometry.parameters.depth;
        modelBussiness.commonFunc.createTempServetrCube(startCabobj, { x: cabx, y: caby, z: cabz }, startCabobj.position, startCabobj.rotation, startU, startU + startUL - 1,startServerID,true);
        modelBussiness.commonFunc.createTempServetrCube(endCabobj, { x: cabx, y: caby, z: cabz }, endCabobj.position, endCabobj.rotation, endu, endu + endUL - 1, endServerID, (startCabobj.name !== endCabobj.name));
        WT3DObj.commonFunc.changeObjsOpacity(_this.ShowLineNeedHide, 1, 0.2, 1000, function () {
        //創建連線
         var points = modelBussiness.commonFunc.createLine(startCabobj, startU, endCabobj, endu);
         modelBussiness.commonFunc.createLightPoint(points);
         var startPoint2 = points[2];
         var endPoint2 = points[points.length - 3];
         var cPosition = {
             x: (startPoint2.x + endPoint2.x) / 2+100,
             y: (startPoint2.y == endPoint2.y ? ((startPoint2.y + endPoint2.y) / 2 +500) : ((startPoint2.y + endPoint2.y) / 2 + 700)),
             z: (endPoint2.z - 2000)
         };
         var tPosition = {
             x: (startPoint2.x + endPoint2.x) / 2,
             y: (startPoint2.y == endPoint2.y ? ((startPoint2.y + endPoint2.y) / 2 - 300) : ((startPoint2.y + endPoint2.y) / 2+200)),
             z: (startPoint2.z + endPoint2.z) / 2
         };

         WT3DObj.commonFunc.changeCameraPosition(cPosition, tPosition, 1000, function () {

             setTimeout(function () {
                 modelBussiness.showLineState = 0;
                 var screenPostion = WT3DObj.commonFunc.transToScreenCoord(startPoint2);
                 $(".linePont").remove();
                 $("body").append("<div id='startPointDiv' data-positionX='" + startPoint2.x + "' data-positionY='" + startPoint2.y + "' data-positionZ='" + startPoint2.z + "' data-positionleft='-45'  data-positiontop='-130' class='linePont' style='left:" + (screenPostion.x - 45) + "px;top:" + (screenPostion.y - 130) + "px;z-index:100000;'>機櫃:<font>" + linkData.path[0].cabName + "</font></br>" +
                     "服務器:<font>" + linkData.path[0].serverName + "</font></br>" +
                     "端口:<font>" + linkData.path[0].portName + "</font></br>" +
                     "上行:<font>256kb</font></br>" +
                     "下行:<font>330kb</font></br>" +
                    "</div>");

                 var screenPostion2 = WT3DObj.commonFunc.transToScreenCoord(endPoint2);
                 $("body").append("<div id='endPointDiv' data-positionX='" + endPoint2.x + "' data-positionY='" + endPoint2.y + "' data-positionZ='" + endPoint2.z + "' data-positionleft='-45'  data-positiontop='-130'  class='linePont lend' style='left:" + (screenPostion2.x - 45) + "px;top:" + (screenPostion2.y - 130) + "px;z-index:100000;'>機櫃:<font>" + linkData.path[1].cabName + "</font></br>" +
                     "服務器:<font>" + linkData.path[1].serverName + "</font></br>" +
                     "端口:<font>" + linkData.path[1].portName + "</font></br>" +
                     "上行:<font>256kb</font></br>" +
                     "下行:<font>330kb</font></br>" +
                    "</div>");
                 if (modelBussiness.moveDivIds.indexOf("startPointDiv") < 0) {
                     modelBussiness.moveDivIds.push("startPointDiv");
                 }
                 if (modelBussiness.moveDivIds.indexOf("endPointDiv") < 0) {
                     modelBussiness.moveDivIds.push("endPointDiv");
                 }
             }, 200);
         });

  
    });
    }
   );
}
ModelBussiness.prototype.CloseLineManage = function (callBack) {
    var _this = this;
   {

    WT3DObj.destoryObj("flowtube_current");
    WT3DObj.destoryObj(_this.currentStartCabName + "_" + _this.currentStartSeverId + "_TempCube_outCube");
    WT3DObj.destoryObj(_this.currentStartCabName + "_" + _this.currentStartSeverId + "_TempCube_innerCube_0");
    WT3DObj.destoryObj(_this.currentEndCabName + "_" + _this.currentEndSeverId + "_TempCube_outCube");
    WT3DObj.destoryObj(_this.currentEndCabName + "_" + _this.currentEndSeverId + "_TempCube_innerCube_0");
    $("#startPointDiv").remove();
    $("#endPointDiv").remove();
    if (_this.ShowLineNeedHide.length > 0) {
        WT3DObj.commonFunc.changeObjsOpacity(_this.ShowLineNeedHide, 0.2, 1, 500, function () {
            _this.showLineState = 0;
            if (callBack) {
                callBack();
            }
        });
    } else {
        _this.showLineState = 0;
        if (callBack) {
            callBack();
        }
    }
    }
}

 

 11、展現鏈接的詳細端子信息。

 

 {

        if (!(_obj.name.indexOf("odf") >= 0)) {
            $("#serverInfo_1").show();
            $("#serverInfo_2").show();
            $("#serverInfo_3").show();
            $("#serverInfo_4").show();
            $("#toolbar").hide()
            $("#btn1").hide()
            echartsBoxData();
            echartsBoxTwoData();
            echartsBoxThreeData();
      //FunGetDateStr();
       }
   

        new TWEEN.Tween(WT3DObj.controls.target).to({
            x:_obj.position.x,
            y:_obj.position.y,
            z: _obj.position.z
        }, 500).onComplete(function () {
            var fore = true;
            var cpz = _obj.position.z +300;
            if (WT3DObj.camera.position.z < _obj.position.z) {
                cpz = _obj.position.z-300;
                fore = false;
            }
            new TWEEN.Tween(WT3DObj.camera.position).to({
                x: _obj.position.x,
                y: _obj.position.y,
                z: cpz
            }, 500).onComplete(function () {
                setTimeout(function () {
                    var caby = _obj.geometry.parameters.height;
                    var cabx = _obj.geometry.parameters.width;
                    var cabz = _obj.geometry.parameters.depth;

                    if (_obj.name.indexOf("_LightCubeBorderLight") < 0) {
                        caby += 4;
                        cabx += 4;
                        cabz += 4;
                    }
                    var screenPostion_start = WT3DObj.commonFunc.transToScreenCoord({
                        x: _obj.position.x - cabz / 2,
                        y: _obj.position.y + caby/2,
                        z: _obj.position.z + (fore ? (cabx / 2) : (-cabx / 2)),
                    });
                    var screenPostion_end = WT3DObj.commonFunc.transToScreenCoord({
                        x: _obj.position.x + cabz / 2,
                        y: _obj.position.y- caby / 2,
                        z: _obj.position.z + (fore ? (cabx / 2) : (-cabx / 2)),
                    });
                    var _width = Math.abs(screenPostion_end.x - screenPostion_start.x)-20;
                    var _height = Math.abs(screenPostion_end.y - screenPostion_start.y)-20;
                    layer.closeAll();
                    console.log(_width);
                    console.log(_height);
                    var stype = "";
                    var portSDInterval = null;
                    var tabshtml = "";
                    if (_obj.name.indexOf("odf") >= 0) {
                        stype = "odf";
                        for (var i = 0; i < 6; i++) {
                            var topValues = [9, 25, 41, 57, 73, 88]
                            var chtml = ''
                            for (var j = 1; j <= 13; j++) {
                                chtml = chtml.replace('id="' + j + '"', ' id="server_port_' + (_obj.name + '_d_' + i + '_' + j) + '" ');
                                // tabshtml += "<div class='dz_info' id='server_port_" + (_obj.name + "_d_" + i + "_" + j) + "'></div>";
                            }
                            tabshtml += chtml;
                        }
                    }

                    else if (_obj.name.indexOf("_LJH") >= 0) {
                        stype = "jhj";
                        tabshtml = "";
                        for (var i = 0; i < 4; i++) {
                            var topValues = [19, 33, 63, 81]
                            var chtml = ''

                                for (var j =1; j <= 24; j++) {
                                    chtml = chtml.replace('id="' + j + '"', ' id="server_port_' + (_obj.name + '_d_' + i + '_' + j) + '" ');
                                   // tabshtml += "<div class='dz_info' id='server_port_" + (_obj.name + "_d_" + i + "_" + j) + "' style='position:absolute;border: 1px solid rgba(0,0,0,0);width:2%;height: 15%;left: 9%;top: 15%;'></div>";
                                }
                                tabshtml += chtml;
                            }



                    } else {
                        stype = "fwq";
                        //服務器
                        tabshtml = '';
                            for (var i = 1; i <= 13;i++){
                                tabshtml = tabshtml.replace('id="' + i + '"', ' id="server_port_' + (_obj.name + '_d_1_' + i) + '" ');
                            }
                            //tabshtml = "<div style=' float:left;width:"+_width+"px;height:"+(_height-30)+"px'></div>";
                            //for (var i = 0; i <1; i++) {
                            //    for (var j = 0; j < 16; j++) {
                            //        tabshtml += "<div class='dz_info' id='server_port_" + (_obj.name + "_d_" + i + "_" + j) + "'></div>";
                            //    }
                            //}
                     }
                    layer.open({
                        title: false,
                        shade: 0.01,
                        area: [(_width) + 'px', (_height) + 'px'],
                        offset: [($(window).height() - _height) / 2 + "px", ($(window).width() - _width) / 2 + "px"], //右下角彈出
                        shadeClose: true, //開啟遮罩關閉
                        skin: 'severClassPanel',//自定義class名稱
                        btn: false, closeBtn: 0,
                        content: "<div style='width:" + _width + "px;height:" + _height + "px;background-color:rgba(0,0,0,0);'>" + tabshtml + "</div>",
                        end: function () {
                            if (portSDInterval) {
                                clearInterval(portSDInterval);
                            }
                            modelBussiness.currentState = 1;
                            modelBussiness.backShowSingleServer();
                            $("#serverInfo_1").hide();
                            $("#serverInfo_2").hide();
                            $("#serverInfo_3").hide();
                            $("#serverInfo_4").hide();
                            if (closeShowServerCallBack) {
                                closeShowServerCallBack();
                            }
                        },
                        cancel: function () {
                            if (portSDInterval) {
                                clearInterval(portSDInterval);
                            }
                            modelBussiness.currentState = 1;
                            modelBussiness.backShowSingleServer();
                            $("#serverInfo_1").hide();
                            $("#serverInfo_2").hide();
                            $("#serverInfo_3").hide();
                            $("#serverInfo_4").hide();
                            if (closeShowServerCallBack) {
                                closeShowServerCallBack();
                            }
                        }
                        ,
                        success: function () {

                            $("div[id^='server_port_']").mouseover(function () {
                                $(".dz_info").css("background", "rgba(20, 220, 212, 0)");
                                $(this).css("background", "rgba(20, 220, 212, 0.57)");

                                var portid = $(this).attr("id");
                                var name = '';
                                var html = '';
                                var height = '130px';
                                if (portid && portid.indexOf('odf') > -1) {
                                    name = 'ODF'
                                    html = '端口: 1號樓3層西北IDC機房_01_0717_ODF/A/7/001/' + portid.split("_d_0_")[1] + "</br>";
                                    html += name + ':  1號樓3層西北IDC機房_01_07'
                                    + portid.split("_d_")[0].split("_Server_")[0].replace("ethserver_port_", "") + '</br>' + '/A/7/' + portid.split("_d_")[0].split("_Server_")[1].split("_")[0] + "</br>";
                                    html += '機櫃: ZY01FR01C01'
                                        + portid.split("_d_")[0].split("_Server_")[0].replace("ethserver_port_", "");
                                } else {
                                    height = '310px';
                                    name = '服務器'
                                    html = '<div class="serverMain">'
                                    + '<div class="serverMainTop">本端端口信息</div>'
                                    + '<div class="serverMainText"><span>端口名稱:</span><span>419183543-eth' + portid.split("_d_1_")[1] + '</span></div>'
                                    + '<div class="serverMainText"><span>設備名稱:</span><span>數據接入服務器1</span></div>'
                                    + '<div class="serverMainText"><span>機櫃名稱:</span><span>ZY01FR01C01</span></div>'
                                    + '<div class="serverMainTop">對端端口信息</div>'
                                    + '<div class="serverMainText"><span>端口名稱:</span><span>417458350-' + (14 + Number(portid.split("_d_1_")[1])) + '口</span></div>'
                                    + '<div class="serverMainText"><span>設備名稱:</span><span>業務交換機3</span></div>'
                                    + '<div class="serverMainText"><span>機櫃名稱:</span><span>ZY01FR02C01</span></div>'
                                    + '<div class="serverMainBtn" ><span onclick="pageindex.showLineByPort(\'L_91\')">連接</span></div>'
                                    + '</div>'
                                    // '端口: 1號樓3層西北IDC機房_01_07'  + portid.split("_d_")[0].split("_Server_")[0].replace("ethserver_port_", "")
                                    //     + '/A/7/' + portid.split("_d_")[0].split("_Server_")[1].split("_")[0] +'/' + portid.split("_d_")[1] + "</br>";
                                }

                                // html += name+':  1號樓3層西北IDC機房_01_07'
                                //     + portid.split("_d_")[0].split("_Server_")[0].replace("ethserver_port_", "") +'</br>'+ '/A/7/' + portid.split("_d_")[0].split("_Server_")[1].split("_")[0] + "</br>";
                                // html += '機櫃: ZY01FR01C01'
                                //     + portid.split("_d_")[0].split("_Server_")[0].replace("ethserver_port_", "");
                                layer.tips(html, '#' + portid, {
                                    tips: [1, '#3595CC'],
                                    area:['340px',height],
                                    time: 0,
                                    skin: 'duanKouClass' ,//自定義class名稱
                                    success: function (layero, index) {
                                        var oldLeft = layero.css("left");
                                        oldLeft = oldLeft.substring(0,oldLeft.indexOf('px'));
                                        layero.css("left", (oldLeft-10)+'px');
                                    }
                                });
                            });
                            if (dbClickSerVerCallBack) {
                                dbClickSerVerCallBack(_obj.name);
                            }
                            console.log(stype);
                            if (stype == "odf") {
                                portSDInterval = setInterval(function () {
                                    var MathCounts = [parseInt(Math.random() * 21) + 1, parseInt(Math.random() * 21) + 1, parseInt(Math.random() * 21) + 1, parseInt(Math.random() * 21) + 1, parseInt(Math.random() * 21) + 1, parseInt(Math.random() * 21) + 1, parseInt(Math.random() * 21) + 1, parseInt(Math.random() * 21) + 1, parseInt(Math.random() * 21) + 1, parseInt(Math.random() * 21) + 1, parseInt(Math.random() * 21) + 1, parseInt(Math.random() * 21) + 1]
                                    for (var i = 0; i < 6; i++) {
                                        for (var j = 0; j < MathCounts.length; j++) {
                                            $("#server_port_" + (_obj.name + '_d_' + i + '_' + MathCounts[j])).css("background", Math.random() > 0.5 ? "rgba(0,0,0,0)" : "rgba(31, 247, 7, 0.81)")
                                        }
                                    }
                                    setTimeout(function () {
                                        for (var i = 0; i < 6; i++) {
                                            for (var j = 0; j < MathCounts.length; j++) {
                                                $("#server_port_" + (_obj.name + '_d_' + i + '_' + MathCounts[j])).css("background", Math.random() > 0.5 ? "rgba(0,0,0,0)" : "rgba(31, 247, 7, 0.81)")
                                            }
                                        }
                                    }, 200);
                                }, 400);

                            } else
                                if (stype == "jhj") {
                                    portSDInterval = setInterval(function () {
                                        var MathCounts = [parseInt(Math.random() * 21) + 3, parseInt(Math.random() * 21) + 3, parseInt(Math.random() * 21) + 3, parseInt(Math.random() * 21) + 3, parseInt(Math.random() * 21) + 3, parseInt(Math.random() * 21) + 3, parseInt(Math.random() * 21) + 3, parseInt(Math.random() * 21) + 3, parseInt(Math.random() * 21) + 3, parseInt(Math.random() * 21) + 3, parseInt(Math.random() * 21) + 3, parseInt(Math.random() * 21) + 3]
                                        for (var i = 0; i < 4; i++) {
                                            for (var j = 0; j < MathCounts.length; j++) {
                                                $("#server_port_" + (_obj.name + '_d_' + i + '_' + MathCounts[j])).css("background", Math.random() > 0.5 ? "rgba(0,0,0,0)" : "rgba(31, 247, 7, 0.81)")
                                            }
                                        }
                                        setTimeout(function () {
                                            for (var i = 0; i < 4; i++) {
                                                for (var j = 0; j < MathCounts.length; j++) {
                                                    $("#server_port_" + (_obj.name + '_d_' + i + '_' + MathCounts[j])).css("background", Math.random() > 0.5 ? "rgba(0,0,0,0)" : "rgba(31, 247, 7, 0.81)")
                                                }
                                            }
                                        }, 200);
                                    }, 400);

                                } else {
                                    portSDInterval = setInterval(function () {
                                        var MathCounts = [parseInt(Math.random() * 11) + 1, parseInt(Math.random() * 11) + 1, parseInt(Math.random() * 11) + 1, parseInt(Math.random() * 11) + 1, parseInt(Math.random() * 11) + 1, parseInt(Math.random() * 11) + 1, parseInt(Math.random() * 11) + 1]
                                        for (var i = 1; i < 2; i++) {
                                            for (var j = 0; j < MathCounts.length; j++) {
                                                $("#server_port_" + (_obj.name + '_d_' + i + '_' + MathCounts[j])).css("background", Math.random() > 0.5 ? "rgba(0,0,0,0)" : "rgba(31, 247, 7, 0.81)")
                                            }
                                        }
                                        setTimeout(function () {
                                            for (var i = 1; i < 2; i++) {
                                                for (var j = 0; j < MathCounts.length; j++) {
                                                    $("#server_port_" + (_obj.name + '_d_' + i + '_' + MathCounts[j])).css("background", Math.random() > 0.5 ? "rgba(0,0,0,0)" : "rgba(31, 247, 7, 0.81)")
                                                }
                                            }
                                        }, 200);
                                    }, 400);

                                }
                        }
                    });
                 },800);
               }).start();
          }).start();
    }

 

 

技術交流 1203193731@qq.com

交流微信:

    

如果你有什么要交流的心得 可郵件我

 

其它相關文章:

使用webgl(three.js)創建3D機房,3D機房微模塊詳細介紹(升級版二)

如何用webgl(three.js)搭建一個3D庫房-第一課

如何用webgl(three.js)搭建一個3D庫房,3D密集架,3D檔案室,-第二課

使用webgl(three.js)搭建一個3D建築,3D消防模擬——第三課

使用webgl(three.js)搭建一個3D智慧園區、3D建築,3D消防模擬,web版3D,bim管理系統——第四課

如何用webgl(three.js)搭建不規則建築模型,客流量熱力圖模擬

 使用webgl(three.js)搭建一個3D智慧園區、3D建築,3D消防模擬,web版3D,bim管理系統——第四課(炫酷版一)

使用webgl(three.js)搭建3D智慧園區、3D大屏,3D樓宇,智慧燈桿三維展示,3D燈桿,web版3D,bim管理系統——第六課

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM