单元测试地二蛋 先弄个两个原生模块1个原始的一个jq插件

简介: 放羊测试测完了再测这两个瞎搞的下拉列表组建 看看从单元测试模块化的角度组建会写成啥样 1:ajax请求 简单文本     2:1个页面多个实例     3:复杂展示+自定义点击+自定义处理函数     4:延迟请求     5 插件封装 jq和reqjs     6:j...

放羊测试测完了再测这两个瞎搞的下拉列表组建 看看从单元测试模块化的角度组建会写成啥样

1:ajax请求 简单文本
    2:1个页面多个实例
    3:复杂展示+自定义点击+自定义处理函数
    4:延迟请求
    5 插件封装 jq和reqjs
    6:jsonp 支持(还未实现)

jq

/**
 * Created by qqloving on 14-3-24.
 */
(function($) {
    $.fn.xiala = function(ops) {
        var url=ops.url||'';
        var clickfn=ops.clickfn||null;
        console.log(this);
        //this.selector
        //this.length;

      var objla= {
           pop_len: 10,
           pop_cn: 'autoDis',
           hover_cn: 'cur',
           TargetElement:null,
           InstancesNum:0,
           ajaxurl:'',
           ajaxdatafn:function(){},
           sourcelist:[],
           clicklist:[],
           time:null,
           init:function(Element){
               this.setDom();
               if(Element.getAttribute('type')!='text'||Element.nodeName!='INPUT')
               {
                   return this;
               }
               this.TargetElement=Element;
               return this
           },
           bind :function(url,datafn){

               var  self=this;
               var Element=self.TargetElement;
               self.ajaxurl=url;
               self.ajaxdatafn=datafn;


               Element.onkeyup=function(e){
                   //还有回车没有处理
                   e=e||window.event;
                   var lis=self.pop.getElementsByTagName('li'),
                       lens=lis.length,
                       n=lens,
                       temp;
                   if(e.keyCode==38){
                       for (var i = 0; i < lens; i++) { //遍历结果数据,判断是否被选中
                           if (lis[i].className)
                           {
                               temp = i;
                           }
                           else
                           {
                               n--;
                           }
                       }
                       if (n == 0) { //如果没有被选中的li元素,则选中最后一个
                           lis[lens - 1].className = self.hover_cn;
                           this.value = lis[lens - 1].innerHTML;
                       } else { //如果有被选中的元素,则选择上一个元素并赋值给input
                           if (lis[temp] == lis[0]) { //如果选中的元素是第一个孩子节点则跳到最后一个选中
                               lis[lens - 1].className = self.hover_cn;
                               this.value = lis[lens - 1].innerHTML;
                               lis[temp].className = '';
                           } else {
                               lis[temp - 1].className = self.hover_cn;
                               this.value = lis[temp - 1].innerHTML;
                               lis[temp].className = '';
                           }
                       }



                   }else if(e.keyCode==40){
                       for (var i = 0; i < lens; i++) { //遍历结果数据,判断是否被选中
                           if (lis[i].className)
                           {
                               temp = i;
                           }
                           else
                           {
                               n--;
                           }
                       }
                       if (n == 0) {
                           lis[0].className = self.hover_cn;
                           this.value = lis[0].innerHTML;
                       } else {
                           if (lis[temp] == lis[lens - 1]) {
                               lis[0].className = self.hover_cn;
                               this.value = lis[0].innerHTML;
                               lis[temp].className = '';
                           } else {
                               lis[temp + 1].className = self.hover_cn;
                               this.value = lis[temp + 1].innerHTML;
                               lis[temp].className = '';
                           }
                       }

                   }
                   else{
                       //如果弹出层没有显示则执行插入操作,并显示弹出层
                       self.insert(this);
                   }


               };
               Element.onblur=function(e){
                   setTimeout(function() {
                           self.pop.style.display = 'none';
                       },
                       300);
               }
               return self;

           },
           setDom:function(){
               var self=this,
                   dom=document.createElement('div')
               iframe=document.createElement('iframe'),
                   ul=document.createElement('ul');
               document.body.appendChild(dom);
               iframe.setAttribute('frameborder',0);
               iframe.setAttribute('scrolling', 'no')
               iframe.style.cssText='z-index:-1;position:absolute;left:0;top:0;'

               dom.className=self.pop_cn;
               dom.appendChild(iframe);
               dom.appendChild(ul);
               dom.onmouseover=function(e){
                   e=e||window.event;
                   var target= e.srcElement|| e.target;
                   if(target.tagName=='LI'){
                       for(var i= 0,lis=self.pop.getElementsByTagName('li');i<lis.length;i++){
                           lis[i].className=''
                       }
                       target.className=self.hover_cn;

                   }

               };
               dom.onmouseout=function(e){
                   e=e||window.event;
                   var target= e.srcElement|| e.target;
                   if (target.tagName == 'LI') target.className = '';
               }
               dom.onclick=function(e){
                   //还得做个事件处理列表
                   e=e||window.event;
                   var target= e.srcElement|| e.target;
                   if(self.clicklist.length==0)
                   {
                       if (target.tagName == 'LI') {
                           self.value = target.innerHTML;
                       }
                   }
                   else
                   {
                       var own=null;
                       for(var i= 0,j=self.clicklist.length;i<j;i++){
                           own=self.clicklist[i](target)
                           if(own)
                           {
                               self.value = own;
                           }
                       }
                   }
                   self.TargetElement.value=self.value;
                   self.pop.style.display='none'


               }
               self.pop=dom;
           },
           insert:function(self){
               var bak = [],
                   s,
                   li = [],
                   left = 0,
                   top = 0,
                   val = self.value;

               left=self.getBoundingClientRect().left+document.documentElement.scrollLeft;
               top=self.getBoundingClientRect().top+document.documentElement.scrollTop+self.offsetHeight;
               this.pop.style.cssText= 'width:' + self.offsetWidth + 'px;' + 'position:absolute;left:' + left + 'px;top:' + top + 'px;display:none;';
               this.pop.getElementsByTagName('iframe')[0].setAttribute('width',self.offsetWidth );
               this.pop.getElementsByTagName('iframe')[0].setAttribute('height',self.offsetHeight);



               this.pop.getElementsByTagName('ul')[0].innerHTML='<li>请稍后</li>';

               this.pop.style.display='block';
               var that=this;
               function getajax(){
                   that.ajax.request(that.ajaxurl,{
                       success:function(xhr){
                           console.log('= =');
                           // console.log(xhr.responseText);
                           that.sourcelist=that.ajaxdatafn(xhr.responseText);
                           li=[];
                           s = that.sourcelist.length > that.pop_len ? that.pop_len: that.sourcelist.length;
                           for(var i= 0;i<s;i++){
                               li.push('<li>' + that.sourcelist[i].__syshtml + '</li>')
                           }
                           that.pop.getElementsByTagName('ul')[0].innerHTML=li.join('')
                           //console.log(that.ajaxdatafn(xhr.responseText));
                           left=self.getBoundingClientRect().left+document.documentElement.scrollLeft;
                           top=self.getBoundingClientRect().top+document.documentElement.scrollTop+self.offsetHeight;
                           that.pop.style.cssText= 'width:' + self.offsetWidth + 'px;' + 'position:absolute;left:' + left + 'px;top:' + top + 'px';
                           that.pop.getElementsByTagName('iframe')[0].setAttribute('width',self.offsetWidth );
                           that.pop.getElementsByTagName('iframe')[0].setAttribute('height',self.offsetHeight);
                       }
                   })
               }
               clearTimeout(that.time);
               that.time= setTimeout(getajax(),1000);



           },
           addclick:function(fn){
               this.clicklist.push(fn);
               return this;
           },
           ajax:(function (){
               function request (url,opt){
                   function createXHR(){
                       if(typeof XMLHttpRequest != "undefined"){
                           createXHR = function(){
                               return new XMLHttpRequest();
                           };
                       }else if(typeof ActiveXObject != "undefined"){
                           createXHR = function(){
                               if(typeof arguments.callee.activeXString != "string"){
                                   var versions = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"];
                                   for(var i = 0, len = versions.length; i < len; i++){
                                       try{
                                           var xhr = new ActiveXObject(version[i]);
                                           arguments.callee.activeXString = version[i];
                                           return xhr;
                                       }catch(ex){
//skip
                                       }
                                   }
                               }
                               return new ActiveXObject(arguments.callee.activeXString);
                           };
                       }else{
                           createXHR = function(){
                               throw new Error("No XHR Object available.");
                           };
                       }
                       return createXHR();
                   }
                   function fn(){}
                   var async=opt.async!==false,
                       method=opt.method||"Get",
                       data=opt.data||null,
                       success=opt.success||fn,
                       failure=opt.failure||fn;
                   method=method.toLocaleLowerCase();
                   if(method=="get"&&data){
                       url+=(url.indexOf('?')==-1?'?':'&')+data;
                   }
                   var xhr=createXHR();
                   xhr.onreadystatechange=function(){
                       _onStateChange(xhr,success,failure);
                   }
                   if(method=="post"){
                       xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;');
                   }
                   xhr.open(method,url,async);
                   xhr.send(data);
                   return xhr;

               }
               function _onStateChange(xhr,success,failure){
                   if(xhr.readyState == 4){
                       var s = xhr.status;
                       if(s>= 200 && s < 300){
                           success(xhr);
                       }else{
                           failure(xhr);
                       }
                   }else{}
               }
               return {request:request}
           })()


       };
      return  objla.init(this[0]).bind(url,clickfn);

    };
})(jQuery);
简单实例
 ({
        pop_len: 10,
        pop_cn: 'autoDis',
        hover_cn: 'cur',
        TargetElement:null,
        InstancesNum:0,
        ajaxurl:'',
        ajaxdatafn:function(){},
        sourcelist:[],
        clicklist:[],
        time:null,
        init:function(){
            this.setDom();

            return this
        },
        bind :function(Element,url,datafn){
            if(Element.getAttribute('type')!='text'||Element.nodeName!='INPUT')
            {
                return null;
            }
            var  self=this;
            self.ajaxurl=url;
            self.ajaxdatafn=datafn;
            self.TargetElement=Element;

            Element.onkeyup=function(e){
                //还有回车没有处理
                e=e||window.event;
                var lis=self.pop.getElementsByTagName('li'),
                    lens=lis.length,
                    n=lens,
                    temp;
                if(e.keyCode==38){
                    for (var i = 0; i < lens; i++) { //遍历结果数据,判断是否被选中
                        if (lis[i].className)
                        {
                            temp = i;
                        }
                        else
                        {
                          n--;
                        }
                    }
                        if (n == 0) { //如果没有被选中的li元素,则选中最后一个
                            lis[lens - 1].className = self.hover_cn;
                            this.value = lis[lens - 1].innerHTML;
                        } else { //如果有被选中的元素,则选择上一个元素并赋值给input
                            if (lis[temp] == lis[0]) { //如果选中的元素是第一个孩子节点则跳到最后一个选中
                                lis[lens - 1].className = self.hover_cn;
                                this.value = lis[lens - 1].innerHTML;
                                lis[temp].className = '';
                            } else {
                                lis[temp - 1].className = self.hover_cn;
                                this.value = lis[temp - 1].innerHTML;
                                lis[temp].className = '';
                            }
                        }



                }else if(e.keyCode==40){
                    for (var i = 0; i < lens; i++) { //遍历结果数据,判断是否被选中
                        if (lis[i].className)
                        {
                            temp = i;
                        }
                        else
                        {
                            n--;
                        }
                    }
                    if (n == 0) {
                        lis[0].className = self.hover_cn;
                        this.value = lis[0].innerHTML;
                    } else {
                        if (lis[temp] == lis[lens - 1]) {
                            lis[0].className = self.hover_cn;
                            this.value = lis[0].innerHTML;
                            lis[temp].className = '';
                        } else {
                            lis[temp + 1].className = self.hover_cn;
                            this.value = lis[temp + 1].innerHTML;
                            lis[temp].className = '';
                        }
                    }

                }
                else{
                    //如果弹出层没有显示则执行插入操作,并显示弹出层
                    self.insert(this);
                }


            };
            Element.onblur=function(e){
                setTimeout(function() {
                            self.pop.style.display = 'none';
                        },
                        300);
            }
            return self;

        },
        setDom:function(){
            var self=this,
                 dom=document.createElement('div')
                 iframe=document.createElement('iframe'),
                 ul=document.createElement('ul');
            document.body.appendChild(dom);
            iframe.setAttribute('frameborder',0);
            iframe.setAttribute('scrolling', 'no')
            iframe.style.cssText='z-index:-1;position:absolute;left:0;top:0;'

            dom.className=self.pop_cn;
            dom.appendChild(iframe);
            dom.appendChild(ul);
            dom.onmouseover=function(e){
                e=e||window.event;
                var target= e.srcElement|| e.target;
                if(target.tagName=='LI'){
                    for(var i= 0,lis=self.pop.getElementsByTagName('li');i<lis.length;i++){
                        lis[i].className=''
                    }
                    target.className=self.hover_cn;

                }

            };
            dom.onmouseout=function(e){
                e=e||window.event;
                var target= e.srcElement|| e.target;
                if (target.tagName == 'LI') target.className = '';
            }
            dom.onclick=function(e){
                //还得做个事件处理列表
                e=e||window.event;
                var target= e.srcElement|| e.target;
                if(self.clicklist.length==0)
                {
                if (target.tagName == 'LI') {
                    self.value = target.innerHTML;
                }
                }
                else
                {
                    var own=null;
                    for(var i= 0,j=self.clicklist.length;i<j;i++){
                        own=self.clicklist[i](target)
                     if(own)
                     {
                         self.value = own;
                     }
                    }
                }
                self.TargetElement.value=self.value;
                self.pop.style.display='none'


            }
            self.pop=dom;
        },
        insert:function(self){
            var bak = [],
                    s,
                    li = [],
                    left = 0,
                    top = 0,
                    val = self.value;

            left=self.getBoundingClientRect().left+document.documentElement.scrollLeft;
            top=self.getBoundingClientRect().top+document.documentElement.scrollTop+self.offsetHeight;
           this.pop.style.cssText= 'width:' + self.offsetWidth + 'px;' + 'position:absolute;left:' + left + 'px;top:' + top + 'px;display:none;';
            this.pop.getElementsByTagName('iframe')[0].setAttribute('width',self.offsetWidth );
            this.pop.getElementsByTagName('iframe')[0].setAttribute('height',self.offsetHeight);



            this.pop.getElementsByTagName('ul')[0].innerHTML='<li>请稍后</li>';

            this.pop.style.display='block';
            var that=this;
            function getajax(){
                that.ajax.request(that.ajaxurl,{
                    success:function(xhr){
                        console.log('= =');
                        // console.log(xhr.responseText);
                        that.sourcelist=that.ajaxdatafn(xhr.responseText);
                        li=[];
                        s = that.sourcelist.length > that.pop_len ? that.pop_len: that.sourcelist.length;
                        for(var i= 0;i<s;i++){
                            li.push('<li>' + that.sourcelist[i].__syshtml + '</li>')
                        }
                        that.pop.getElementsByTagName('ul')[0].innerHTML=li.join('')
                        //console.log(that.ajaxdatafn(xhr.responseText));
                        left=self.getBoundingClientRect().left+document.documentElement.scrollLeft;
                        top=self.getBoundingClientRect().top+document.documentElement.scrollTop+self.offsetHeight;
                        that.pop.style.cssText= 'width:' + self.offsetWidth + 'px;' + 'position:absolute;left:' + left + 'px;top:' + top + 'px';
                        that.pop.getElementsByTagName('iframe')[0].setAttribute('width',self.offsetWidth );
                        that.pop.getElementsByTagName('iframe')[0].setAttribute('height',self.offsetHeight);
                    }
                })
            }
            clearTimeout(that.time);
           that.time= setTimeout(getajax(),1000);



        },
        addclick:function(fn){
           this.clicklist.push(fn);
            return this;
        },
        ajax:(function (){
            function request (url,opt){
                function createXHR(){
                    if(typeof XMLHttpRequest != "undefined"){
                        createXHR = function(){
                            return new XMLHttpRequest();
                        };
                    }else if(typeof ActiveXObject != "undefined"){
                        createXHR = function(){
                            if(typeof arguments.callee.activeXString != "string"){
                                var versions = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"];
                                for(var i = 0, len = versions.length; i < len; i++){
                                    try{
                                        var xhr = new ActiveXObject(version[i]);
                                        arguments.callee.activeXString = version[i];
                                        return xhr;
                                    }catch(ex){
//skip
                                    }
                                }
                            }
                            return new ActiveXObject(arguments.callee.activeXString);
                        };
                    }else{
                        createXHR = function(){
                            throw new Error("No XHR Object available.");
                        };
                    }
                    return createXHR();
                }
                function fn(){}
                var async=opt.async!==false,
                        method=opt.method||"Get",
                        data=opt.data||null,
                        success=opt.success||fn,
                        failure=opt.failure||fn;
                method=method.toLocaleLowerCase();
                if(method=="get"&&data){
                    url+=(url.indexOf('?')==-1?'?':'&')+data;
                }
                var xhr=createXHR();
                xhr.onreadystatechange=function(){
                    _onStateChange(xhr,success,failure);
                }
                if(method=="post"){
                    xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;');
                }
                xhr.open(method,url,async);
                xhr.send(data);
                return xhr;

            }
            function _onStateChange(xhr,success,failure){
                if(xhr.readyState == 4){
                    var s = xhr.status;
                    if(s>= 200 && s < 300){
                        success(xhr);
                    }else{
                        failure(xhr);
                    }
                }else{}
            }
            return {request:request}
        })()


    })
test
相关文章
【硬件测试】基于FPGA的1024QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的1024QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同SNR条件下的性能测试。1024QAM调制将10比特映射到复平面上的1024个星座点之一,实现高效数据传输。硬件测试结果表明,在SNR=32dB和40dB时,系统表现出良好的性能。Verilog核心程序展示了各模块的连接与功能实现。
58 7
【硬件测试】基于FPGA的QPSK调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现QPSK调制与软解调系统,包含Testbench、高斯信道、误码率统计模块,并支持不同SNR设置。硬件版本新增ILA在线数据采集和VIO在线SNR设置功能,提供无水印完整代码及测试结果。通过VIO分别设置SNR为6dB和12dB,验证系统性能。配套操作视频便于用户快速上手。 理论部分详细解析QPSK调制原理及其软解调实现过程,涵盖信号采样、相位估计、判决与解调等关键步骤。软解调通过概率估计(如最大似然法)提高抗噪能力,核心公式为*d = d_hat / P(d_hat|r[n])*,需考虑噪声对信号点分布的影响。 附Verilog核心程序代码及注释,助力理解与开发。
55 5
【硬件测试】基于FPGA的MSK调制解调系统系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现MSK调制解调系统,采用Verilog开发,包含同步模块、高斯信道模拟、误码率统计等功能。相比仿真版本,新增ILA数据采集与VIO在线SNR设置模块。通过硬件测试验证,展示不同SNR(如10dB和16dB)下的性能表现。研究聚焦软件无线电领域,优化算法复杂度以适应硬件限制,利用MSK恒定包络、相位连续等特性提升频谱效率。核心代码实现信号生成、调制解调、滤波及误码统计,提供完整的硬件设计与分析方案。
92 19
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
83 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【硬件测试】基于FPGA的4ASK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的4ASK调制解调系统的硬件测试版本,该系统包括testbench、高斯信道模块和误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置功能。通过VIO设置不同SNR(如15dB和25dB),实现了对系统性能的实时监测与调整。4ASK是一种通过改变载波幅度表示数据的数字调制方式,适用于多种通信场景。FPGA平台的高效性和灵活性使其成为构建高性能通信系统的理想选择。
81 17
【硬件测试】基于FPGA的16QAM调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前开发的16QAM调制与软解调系统,增加了硬件测试功能。该系统包含FPGA实现的16QAM调制、软解调、高斯信道、误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置模块。通过硬件测试,验证了不同SNR条件下的系统性能。16QAM软解调通过比较接收信号采样值与16个调制点的距离,选择最近的调制点来恢复原始数据。核心Verilog代码实现了整个系统的功能,包括SNR设置、信号处理及误码率统计。硬件测试结果表明系统在不同SNR下表现良好,详细操作步骤可参考配套视频。
62 13
【硬件测试】基于FPGA的4FSK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前的文章《基于FPGA的4FSK调制解调系统》,增加了ILA在线数据采集模块和VIO在线SNR设置模块,实现了硬件测试版本。通过VIO设置不同SNR(如10dB和20dB),并展示了ILA采集的数据结果。四频移键控(4FSK)是一种数字调制方法,利用四个不同频率传输二进制数据,具有较高的频带利用率和抗干扰性能。输入的二进制数据分为两组,每组两个比特,对应四个频率f1、f2、f3、f4,分别代表二进制组合00、01、10、11。调制过程中选择相应频率输出,并进行幅度调制以增强抗干扰能力。接收端通过带通滤波器提取信号并还原为原始二进制数据。
56 7
【硬件测试】基于FPGA的256QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的256QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同信噪比(如30dB和40dB)的仿真测试,并提供配套操作视频。256QAM调制方案每个符号携带8比特信息,通过复数值星座图映射实现高效传输。Verilog代码展示了核心模块设计,包括SNR设置、数据处理和ILA测试分析,确保系统在实际硬件环境中的稳定性和性能。
30 2
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(一)
Kali 渗透测试:基于结构化异常处理的渗透-使用Python编写渗透模块(一)
118 2
【硬件测试】基于FPGA的16QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的16QAM基带通信系统硬件测试版本。该系统在仿真基础上增加了ILA在线数据采集和VIO在线SNR设置模块,支持不同信噪比(如15dB、25dB)的测试。16QAM是一种正交幅度调制方式,通过两路4ASK信号叠加实现,每个符号包含4比特信息。系统采用正交调幅法生成16QAM信号,并通过DAC转换为模拟信号。解调时使用正交相干解调,经低通滤波器恢复电平信号。开发板内完成发射与接收,无需定时同步模块。代码可移植至其他开发板,具体步骤见配套文档。
44 2

热门文章

最新文章

下一篇
oss创建bucket
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等