CLASS_CONFUSION JS混淆 全源码


Posted in Javascript onDecember 12, 2007

利用随机字符串代替变量等,混淆原代码,保护自己写的代码,不利于别人直接剽窃

<SCRIPT language=JavaScript> 

<!-- 

/**//**//**//** 

**     

============================================================== 

==================================== 

**    类名:CLASS_CONFUSION 

**    功能:JS混淆 

**    示例: 

    --------------------------------------------------------- 

------------------------------------------ 
            var xx        = new CLASS_CONFUSION(code); 

            document.getElementById("display").innerHTML =  

xx.confusion(); 

    --------------------------------------------------------- 

------------------------------------------ 

**    作者:ttyp 

**    邮件:ttyp@21cn.com 

**    日期:2006-3-20 

**    版本:0.12 

**     

============================================================== 

==================================== 

**/ 

function CLASS_CONFUSION(code){ 

    //哈希表类 

    function Hashtable(){ 

        this._hash        = new Object(); 

        this.add        = function(key,value){ 

                            if(typeof(key)!="undefined"){ 

                                if(this.contains(key)==false){ 

                                    this._hash[key]=typeof 

(value)=="undefined"?null:value; 

                                    return true; 

                                } else { 

                                    return false; 

                                } 

                            } else { 

                                return false; 

                            } 

                        } 

        this.remove        = function(key){delete this._hash 

[key];} 

        this.count        = function(){var i=0;for(var k in  

this._hash){i++;} return i;} 

        this.items        = function(key){return this._hash 

[key];} 

        this.contains    = function(key){return typeof 

(this._hash[key])!="undefined";} 

        this.clear        = function(){for(var k in  

this._hash){delete this._hash[k];}} 

    } 

    function VariableMap(parent){ 

        this.table = new Hashtable(); 

        this.level = parent?parent.level+1:0; 

        this.parent= parent; 

        this.add = function(key,value){this.table.add 

(key,value)}; 

        this.items = function(key){return this.table.items 

(key)}; 

        this.count = function(){return this.table.count()}; 

        this.contains = function(key){return  

this.table.contains(key);} 

        this.isParameter    = false; 

    } 

    this._caseSensitive = true; 

    //字符串转换为哈希表 

    this.str2hashtable = function(key,cs){ 

        var _key    = key.split(/,/g); 

        var _hash    = new Hashtable(); 

        var _cs        = true; 


        if(typeof(cs)=="undefined"||cs==null){ 

            _cs = this._caseSensitive; 

        } else { 

            _cs = cs; 

        } 

        for(var i in _key){ 

            if(_cs){ 

                _hash.add(_key[i]); 

            } else { 

                _hash.add((_key[i]+"").toLowerCase()); 

            } 

        } 

        return _hash; 

    } 

    //获得需要转换的代码 

    this._codetxt        = code; 

    if(typeof(syntax)=="undefined"){ 

        syntax = ""; 

    } 

    this._deleteComment = false; 

    //是否大小写敏感 

    this._caseSensitive    = true; 

    //得到关键字哈希表 

    this._keywords        = this.str2hashtable 

("switch,case,delete,default,typeof,for,in,function,void,this, 

boolean,while,if,return,new,true,false,try,catch,throw,null,el 

se,do,var"); 

    this._function        = this.str2hashtable("function"); 

    this._var            = "var"; 

    this._beginBlock    = "{"; 

    this._endBlock        = "}"; 

    this._window        = this.str2hashtable 

("alert,escape,unescape,document,parseInt,parseFloat"); 

    //得到内建对象哈希表 

    this._commonObjects = this.str2hashtable 

("String,Number,Boolean,RegExp,Error,Math,Date,Object,Array,Gl 

obal"); 

    //得到分割字符 

    this._wordDelimiters= "  ,.?!;:\\/<>(){}[]\"'\r\n\t=+- 

|*%@#$^&"; 

    //引用字符 

    this._quotation        = this.str2hashtable("\",'"); 

    //行注释字符 

    this._lineComment    = "//"; 

    //转义字符 

    this._escape        = "\\"; 

    //多行引用开始 

    this._commentOn        = "/*"; 

    //多行引用结束 

    this._commentOff    = "*/"; 

    this._execute        = "eval"; 

    //引用调用字符 

    this._call            = "."; 

    this._varPause        = "="; 

    this._varContinue    = ","; 

    //变量个数 

    this._varNum = 0; 

    this.confusion    = function() { 

        var codeArr = new Array(); 

        var word_index = 0; 

        var htmlTxt = new Array(); 


        //得到分割字符数组(分词) 

        for (var i = 0; i < this._codetxt.length; i++) { 

            if (this._wordDelimiters.indexOf 

(this._codetxt.charAt(i)) == -1) {        //找不到关键字 

                if (codeArr[word_index] == null || typeof 

(codeArr[word_index]) == 'undefined') { 

                    codeArr[word_index] = ""; 

                } 

                codeArr[word_index] += this._codetxt.charAt 

(i); 

            } else { 

                if (typeof(codeArr[word_index]) != 'undefined'  

&& codeArr[word_index].length > 0) 

                    word_index++; 

                codeArr[word_index++] = this._codetxt.charAt 

(i); 

            } 

        } 


        var quote_opened                = false;    //引用标记 

        var slash_star_comment_opened    = false;    //多行注 

释标记 

        var slash_slash_comment_opened    = false;    //单行注 

释标记 

        var line_num                    = 1;        //行号 

        var quote_char                    = "";        //引用 

标记类型 

        var call_opened                    = false; 

        var call_string                    = ""; 

        var var_opened                    = false; 

        var var_pause                    = false; 

        var function_opened                = false; 

        var parameter_opened            = false; 

        var var_map                        = new VariableMap 

(); 

        var cur_var_map                    = var_map; 

        var execute_opened                = false; 

        //按分割字,分块显示 

        for (var i=0; i <=word_index; i++){ 

            //单独处理指针引用 

            if(call_opened&&typeof(codeArr[i])!="undefined"){ 

                if(call_string.length==0){ 

                    if(this.isVar(codeArr[i])){ 

                        call_string +=codeArr[i]; 

                    }else{ 

                        htmlTxt[htmlTxt.length] = "[\"" +  

this.toHex(call_string) + "\"]"; 

                        if(codeArr[i]!=this._call){ 

                            htmlTxt[htmlTxt.length] = codeArr 

[i]; 

                            call_opened = false; 

                        } 

                        call_string = ""; 

                    } 

                } else { 

                    if(!this.isVar(codeArr[i])){ 

                        htmlTxt[htmlTxt.length] = "[\"" +  

this.toHex(call_string) + "\"]"; 

                        if(codeArr[i]!=this._call){ 

                            htmlTxt[htmlTxt.length] = codeArr 

[i]; 

                            call_opened = false; 

                        } 

                        call_string = ""; 

                    }else{ 

                        htmlTxt[htmlTxt.length] = "[\"" +  

this.toHex(call_string) + "\"]"; 

                    } 

                } 

                continue; 

            } 

            //处理空行(由于转义带来) 

            if(typeof(codeArr[i])=="undefined"||codeArr 

[i].length==0){ 

                continue; 

            } else if(codeArr[i]==" "){ 

                htmlTxt[htmlTxt.length] = " "; 

            } else if(codeArr[i]=="\n"){ 

            //处理换行 

            } else if (codeArr[i] == "\r"){ 

                slash_slash_comment_opened = false; 

                quote_opened = false; 

                var_opened = false; 

                htmlTxt[htmlTxt.length] = "\r\n"; 

                line_num++; 

            //处理function里的参数标记 

            } else if (!slash_slash_comment_opened&&! 

slash_star_comment_opened && !quote_opened &&this.isFunction 

(codeArr[i])){ 

                htmlTxt[htmlTxt.length] = codeArr[i]; 

                function_opened = true; 

            } else if (!slash_slash_comment_opened&&! 

slash_star_comment_opened && !quote_opened &&codeArr[i]=="("){ 

                htmlTxt[htmlTxt.length] = codeArr[i]; 

                if(function_opened == true){ 

                    function_opened =false; 

                    var_opened = true; 

                    cur_var_map = new VariableMap 

(cur_var_map); 

                    cur_var_map.isParameter = true; 

                } 

            } else if (!slash_slash_comment_opened&&! 

slash_star_comment_opened && !quote_opened &&codeArr[i]==")"){ 

                htmlTxt[htmlTxt.length] = codeArr[i]; 

                //处理var a = new Class(),b=new Date();类似的 

问题 

                if(cur_var_map.isParameter){ 

                    var_opened = false; 

                    var_pause = false; 

                } 

            } else if (!slash_slash_comment_opened&&! 

slash_star_comment_opened && !quote_opened &&codeArr[i]==";"){ 

                htmlTxt[htmlTxt.length] = codeArr[i]; 

                var_opened = false; 

                var_pause = false; 

                if(execute_opened){ 

                    execute_opened = false; 

                } 

            } else if (!slash_slash_comment_opened&&! 

slash_star_comment_opened && !quote_opened &&codeArr[i] 

==this._var){ 

                htmlTxt[htmlTxt.length] = codeArr[i]; 

                var_opened = true; 

                var_pause = false; 

            } else if(!slash_slash_comment_opened&&! 

slash_star_comment_opened && !quote_opened &&codeArr[i] 

==this._varPause){ 

                htmlTxt[htmlTxt.length] = codeArr[i]; 

                var_pause = true; 

            } else if(!slash_slash_comment_opened&&! 

slash_star_comment_opened && !quote_opened &&codeArr[i] 

==this._varContinue){ 

                htmlTxt[htmlTxt.length] = codeArr[i]; 

                var_pause = false; 

            } else if(!slash_slash_comment_opened&&! 

slash_star_comment_opened && !quote_opened &&codeArr[i] 

==this._beginBlock){ 

                cur_var_map = new VariableMap(cur_var_map); 

                var_opened = false; 

                htmlTxt[htmlTxt.length] = codeArr[i]; 

            } else if(!slash_slash_comment_opened&&! 

slash_star_comment_opened && !quote_opened &&codeArr[i] 

==this._endBlock){ 

                cur_var_map = cur_var_map.parent; 

                if(cur_var_map.isParameter){ 

                    cur_var_map = cur_var_map.parent; 

                } 

                htmlTxt[htmlTxt.length] = codeArr[i]; 

            //处理引用调用 

            } else if (!slash_slash_comment_opened&&! 

slash_star_comment_opened && !quote_opened &&codeArr[i] 

==this._call){ 

                //判断引用(.)后面第一个是否为字母货_$ 

                if(i<word_index-1){ 

                    if(this.isVar(codeArr[i+1])){ 

                        if(call_opened){ 

                            htmlTxt[htmlTxt.length] =  

this.toHex(call_string); 

                        } 

                        call_opened = true; 

                    }else{ 

                        htmlTxt[htmlTxt.length] = this._call; 

                    } 

                }else{ 

                    htmlTxt[htmlTxt.length] = this._call; 

                } 

            //处理关键字 

            } else if (!slash_slash_comment_opened&&! 

slash_star_comment_opened && !quote_opened && this.isKeyword 

(codeArr[i])){ 

              htmlTxt[htmlTxt.length] = codeArr[i]; 

            //处理eval后的字符串 

            } else if (!slash_slash_comment_opened&&! 

slash_star_comment_opened && !quote_opened && codeArr[i] 

==this._execute){ 

              htmlTxt[htmlTxt.length] = "window[\"" +  

this.toHex(codeArr[i]) + "\"]"; 

              execute_opened = true; 

            //window内置对象 

            } else if (!slash_slash_comment_opened&&! 

slash_star_comment_opened && !quote_opened && this.isWindow 

(codeArr[i])){ 

              htmlTxt[htmlTxt.length] = "window[\"" +  

this.toHex(codeArr[i]) + "\"]"; 

            //处理普通对象 

            } else if (!slash_slash_comment_opened&&! 

slash_star_comment_opened && !quote_opened &&  

this.isCommonObject(codeArr[i])){ 

                htmlTxt[htmlTxt.length] =  "window[\"" +  

this.toHex(codeArr[i]) + "\"]"; 

            //处理双引号(引号前不能为转义字符) 

            } else if (!slash_star_comment_opened&&! 

slash_slash_comment_opened&&this._quotation.contains(codeArr 

[i])){ 

                if (quote_opened){ 

                    //是相应的引号 

                    if(quote_char==codeArr[i]){ 

                        htmlTxt[htmlTxt.length] = codeArr[i]; 

                        quote_opened    = false; 

                        quote_char        = ""; 

                    } else { 

                        htmlTxt[htmlTxt.length] = this.toHex 

(codeArr[i]); 

                    } 

                } else { 

                    htmlTxt[htmlTxt.length] =  codeArr[i]; 

                    quote_opened    = true; 

                    quote_char        = codeArr[i]; 

                } 

            //处理转义字符 

            } else if(codeArr[i] == this._escape){ 

                htmlTxt[htmlTxt.length] = codeArr[i]; 

                if(i<word_index-1){ 

                    if(codeArr[i+1].charCodeAt(0) 

>=32&&codeArr[i+1].charCodeAt(0)<=127){ 

                        htmlTxt[htmlTxt.length] = codeArr 

[i+1].substr(0,1); 

                        htmlTxt[htmlTxt.length] = this.toHex 

(codeArr[i+1].substr(1)); 

                        i=i+1; 

                    } 

                } 

            //处理多行注释的开始 

            } else if (!slash_slash_comment_opened && ! 

slash_star_comment_opened&&!quote_opened&&this.isStartWith 

(this._commentOn,codeArr,i)){ 

                slash_star_comment_opened = true; 

                htmlTxt[htmlTxt.length] = this._commentOn; 

                i = i + this.getSkipLength(this._commentOn); 

            //处理单行注释 

            } else if (!slash_slash_comment_opened && ! 

slash_star_comment_opened&&!quote_opened&&this.isStartWith 

(this._lineComment,codeArr,i)){ 

                slash_slash_comment_opened = true; 

                if(!this._deleteComment){ 

                    htmlTxt[htmlTxt.length] =   

this._lineComment; 

                } 

                i = i + this.getSkipLength(this._lineComment); 

            //处理忽略词 

            } else if (!slash_slash_comment_opened && ! 

slash_star_comment_opened&&!quote_opened&&this.isStartWith 

(this._ignore,codeArr,i)){ 

                slash_slash_comment_opened = true; 

                htmlTxt[htmlTxt.length] = this._ignore; 

                i = i + this.getSkipLength(this._ignore); 

            //处理多行注释结束 

            } else if (!quote_opened&&! 

slash_slash_comment_opened&&this.isStartWith 

(this._commentOff,codeArr,i)){ 

                if (slash_star_comment_opened) { 

                    slash_star_comment_opened = false; 

                    if(!this._deleteComment){ 

                        htmlTxt[htmlTxt.length] =   

this._commentOff; 

                    } 

                    i = i + this.getSkipLength 

(this._commentOff); 

                } 

            } else { 

                //不是在字符串中 

                if(!quote_opened){ 

                    //如果不是在注释重 

                    if(!slash_slash_comment_opened && ! 

slash_star_comment_opened){ 

                        //不是在定义变量时 

                        if(!var_opened){ 

                            if(this.translateVar 

(cur_var_map,codeArr[i])==""){ 

                                htmlTxt[htmlTxt.length] =  

codeArr[i]; 

                            }else{ 

                                htmlTxt[htmlTxt.length] =  

this.translateVar(cur_var_map,codeArr[i]); 

                            } 

                        }else{ 

                            //不是在暂停变量定义时 

                            if(var_pause){ 

                                if(this.translateVar 

(cur_var_map,codeArr[i])==""){ 

                                    htmlTxt[htmlTxt.length] =  

codeArr[i]; 

                                }else{ 

                                    htmlTxt[htmlTxt.length] =  

this.translateVar(cur_var_map,codeArr[i]); 

                                } 

                            }else{ 

                                //变量符合命名规则,并且(变量 

前为空格或制表符或逗号如:var a;var    a;var a,b;,还有如果是 

函数参数,如:function(a,b,c) 

                                if(this.isVar(codeArr[i])&& 

(i>0&&codeArr[i-1]==" "||codeArr[i-1]=="\t"||codeArr[i-1] 

==this._varContinue||cur_var_map.isParameter)){ 

                                    var name =  

this.getRandName(); 

                                    cur_var_map.add(codeArr 

[i],name); 

                                    htmlTxt[htmlTxt.length] =  

this.translateVar(cur_var_map,codeArr[i]); 

                                }else{ 

                                    htmlTxt[htmlTxt.length] =  

codeArr[i]; 

                                } 

                            } 

                        } 

                    //注释中 

                    }else{ 

                        if(!this._deleteComment){ 

                            htmlTxt[htmlTxt.length] = codeArr 

[i]; 

                        } 

                    } 

                }else{ 

                    if(execute_opened){ 

                        if(this.translateVar 

(cur_var_map,codeArr[i])==""){ 

                            htmlTxt[htmlTxt.length] = codeArr 

[i]; 

                        }else{ 

                            htmlTxt[htmlTxt.length] =  

this.translateVar(cur_var_map,codeArr[i]); 

                        } 

                    }else{ 

                        htmlTxt[htmlTxt.length] = this.toHex 

(codeArr[i]); 

                    } 

                } 

            } 

        } 

        return htmlTxt.join(""); 

    } 

this.isStartWith = function(str,code,index){ 

        if(typeof(str)!="undefined"&&str.length>0){ 

            var cc = new Array(); 

            for(var i=index;i<index+str.length;i++){ 

                cc[cc.length] = code[i]; 

            } 

            var c = cc.join(""); 

            if(this._caseSensitive){ 

                if(str.length>=code[index].length&&c.indexOf 

(str)==0){ 

                    return true; 

                } 

            }else{ 

                if(str.length>=code 

[index].length&&c.toLowerCase().indexOf(str.toLowerCase()) 

==0){ 

                    return true; 

                } 

            } 

            return false; 

        } else { 

            return false; 

        } 

    } 

    this.isFunction = function(val){ 

        return this._function.contains(this._caseSensitive? 

val:val.toLowerCase()); 

    } 

    this.isKeyword = function(val) { 

        return this._keywords.contains(this._caseSensitive? 

val:val.toLowerCase()); 

    } 

    this.isWindow = function(val) { 

        return this._window.contains(this._caseSensitive? 

val:val.toLowerCase()); 

    } 

    this.isCommonObject = function(val) { 

        return this._commonObjects.contains 

(this._caseSensitive?val:val.toLowerCase()); 

    } 

    this.getSkipLength = function(val){ 

        var count = 0; 

        for(var i=0;i<val.length;i++){ 

            if(this._wordDelimiters.indexOf(val.charAt(i)) 

>=0){ 

                count++; 

            } 

        } 

        if(count>0){ 

            count=count-1; 

        } 

        return count; 

    } 

    //字符串转换为16进制形式 

    this.toHex = function(val){ 

        var str = new Array(); 

        for(var i=0;i<val.length;i++){ 

            var c = val.charCodeAt(i); 

            if(c>=0&&c<256){ 

                str[str.length] = "\\x" + val.charCodeAt 

(i).toString(16); 

            }else{ 

                str[str.length] = "\\u" + val.charCodeAt 

(i).toString(16); 

            } 

        } 

        return str.join(""); 

    } 

    //获得变量随机名 

    this.getRandName = function(){ 

        var style = parseInt(Math.random()*4); 

        var len = parseInt(Math.random()*9)+1; 

        var n = []; 

        this._varNum++; 

        var c =  

"abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$"; 

        for(var i=0;i<len;i++){ 

            n[n.length] = c.charAt(parseInt(Math.random() 

*54)); 

        } 

        return n.join("")+this._varNum; 

    } 

    //是否符合变量命名字首规则 

    this.isVar = function(val){ 

        return /^[a-zA-Z_\$].*$/.test(val); 

    } 

    //翻译变量,如果返回为空则不存在此变量 

    this.translateVar = function(node,key){ 

        if(node.contains(key)){ 

            return node.items(key); 

        } 

        var cn = node.parent; 

        while(cn!=null){ 

            if(cn.contains(key)){ 

                return cn.items(key); 

            } 

            cn = cn.parent; 

        } 

        return ""; 

    } 


} 

function doConfusion(o){ 

    var htmltxt = ""; 

    if (o == null){ 

        alert("domNode is null!"); 

        return; 

    } 

    var _codetxt = ""; 

    if(typeof(o)=="object"){ 

        switch(o.tagName){ 

            case "TEXTAREA": 

            case "INPUT": 

                _codetxt = o.value; 

                break; 

            case "DIV": 

            case "SPAN": 

                _codetxt = o.innerText; 

                break; 

            default: 

                _codetxt = o.innerHTML; 

                break; 

        } 

    }else{ 

        _codetxt = o; 

    } 

    var _syn = new CLASS_CONFUSION(_codetxt); 

    htmltxt = _syn.confusion(); 

    return  htmltxt; 

} 


function go() 

{ 

    var code    = document.getElementById("code").value; 

    var xx      = new CLASS_CONFUSION(code); 

    var a       = new Date(); 

    document.getElementById("display").value = xx.confusion(); 

    alert("共花:" + (new Date().getTime()-a.getTime()) +  

"ms"); 

} 

//--> 

</SCRIPT>
Javascript 相关文章推荐
基于Jquery制作的幻灯片图集效果打包下载
Feb 12 Javascript
JS定时关闭窗口的实例
May 22 Javascript
JS中prototype关键字的功能介绍及使用示例
Jul 21 Javascript
js实现下拉列表选中某个值的方法(3种方法)
Dec 17 Javascript
使用JS中的exec()方法构造正则表达式验证
Aug 01 Javascript
利用vue-router实现二级菜单内容转换
Nov 30 Javascript
vue 2.0项目中如何引入element-ui详解
Sep 06 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
Aug 22 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
Dec 30 Javascript
微信小程序地图实现展示线路
Jul 29 Javascript
vue自定义指令和动态路由实现权限控制
Aug 28 Javascript
移动端JS实现拖拽两种方法解析
Oct 12 Javascript
我见过最全的个人js加解密功能页面
Dec 12 #Javascript
文本链接逐个出现的js脚本
Dec 12 #Javascript
JavaScript创建命名空间(namespace)的最简实现
Dec 11 #Javascript
js模拟实现Array的sort方法
Dec 11 #Javascript
看了就知道什么是JSON
Dec 09 #Javascript
javascript while语句和do while语句的区别分析
Dec 08 #Javascript
js中将多个语句写成一个语句的两种方法小结
Dec 08 #Javascript
You might like
我的论坛源代码(九)
2006/10/09 PHP
PHP XML数据解析代码
2010/05/26 PHP
PHP中单引号与双引号的区别分析
2014/08/19 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
2015/09/22 PHP
PHP PDOStatement::setAttribute讲解
2019/02/01 PHP
使用jQuery插件创建常规模态窗口登陆效果
2013/08/23 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
2015/12/12 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
JS实现碰撞检测的方法分析
2018/01/19 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
python分析nignx访问日志脚本分享
2015/02/26 Python
flask入门之表单的实现
2018/07/18 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
在python中使用nohup命令说明
2020/04/16 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
python脚本第一行如何写
2020/08/30 Python
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
Android笔试题总结
2014/11/29 面试题
电子商务专业在校生实习自我鉴定
2013/09/29 职场文书
先进事迹报告会感言
2014/01/24 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS