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 相关文章推荐
JavaScript 闭包在封装函数时的简单分析
Nov 28 Javascript
JavaScript 数组详解
Oct 10 Javascript
javascript通过className来获取元素的简单示例代码
Jan 10 Javascript
推荐一个自己用的封装好的javascript插件
Jan 29 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
Jun 05 Javascript
AngularJS教程之简单应用程序示例
Aug 16 Javascript
浅谈React中组件间抽象
Jan 27 Javascript
vue axios数据请求get、post方法及实例详解
Sep 11 Javascript
对angularJs中自定义指令replace的属性详解
Oct 09 Javascript
如何在JavaScript中优雅的提取循环内数据详解
Mar 04 Javascript
使用layui前端框架弹出form表单以及提交的示例
Oct 25 Javascript
吃通javascript正则表达式
Apr 21 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
Terran魔法科技
2020/03/14 星际争霸
PHP开启gzip页面压缩实例代码
2010/03/11 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
Yii核心验证器api详解
2016/11/23 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
jquery插件格式实例分析
2016/06/16 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
2016/12/02 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
JavaScript原型链与继承操作实例总结
2018/08/24 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
详解easyui 切换主题皮肤
2019/04/04 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
Linux环境下MySQL-python安装过程分享
2015/02/02 Python
python通过BF算法实现关键词匹配的方法
2015/03/13 Python
Python解析最简单的验证码
2016/01/07 Python
在Pycharm中自动添加时间日期作者等信息的方法
2019/01/16 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
2019/07/11 Python
对python中list的五种查找方法说明
2020/07/13 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
英语系毕业生自荐信
2013/10/31 职场文书
新年团拜会主持词
2014/04/02 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
工作检讨书怎么写
2014/10/10 职场文书
美术教师个人总结
2015/02/06 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
Python利用folium实现地图可视化
2021/05/23 Python
python文件与路径操作神器 pathlib
2022/04/01 Python