centos7 升级 python 2.7.5 到 python3.6

从官网下载python3的压缩包,解压(以3.6.1版本为例)

创建安装目录(自定义)
sudo mkdir /usr/local/python3

cd 进入解压目录,然后
sudo ./configure –prefix=/usr/local/python3
sudo make
sudo make install

cd 进入/usr/bin
其中有python、python2、python2.7三个文件依次指向后者。
image.png

备份当前默认版本python,如果有需要还可还原:
sudo mv python python.bak

创建python3.6l的新链接(也可建立python3命令以区分,同mac)
sudo ln -s /usr/local/python3/bin/python3.6 /usr/bin/python
这样默认的python版本就替换为python3.6了。

image.png

由于yum使用python2,替换为python3后无法正常工作,
因此修改yum配置文件:
sudo vi /usr/bin/yum
将第一行指定的python版本改为python2.7:
*#!/usr/bin/python改为 #!/usr/bin/python2.7

修改urlgrabber配置文件(网上很多教程都漏了这一步)
sudo vi /usr/libexec/urlgrabber-ext-down
同yum,把头部的python改成python2.7

vim /usr/sbin/firewalld

vim /usr/bin/firewall-cmd

同yum,把头部的python改成python2.7

修改python之后firewall脚本里也都得改

php soap

SOAP 是基于XML和HTTP通讯协议,XML各个平台,各种语言都支持的一种语言。

WSDL 是网络服务描述语言(Web Services Description Language),是一种使用XML格式的文档。这种文档可描述某个Web Service。可规定服务的位置,及服务提供的操作。

不同语言之间需要通信(例如:PHP,Java,c),可以通过SOAP,WSDL使不同操作系统,不同技术的编程语言互相通信。

blob.png

SOAP有两种操作方式,NO-WSDL 与 WSDL。

NO-WSDL模式:使用参数来传递要使用的信息

WSDL模式: 使用WSDL文件名作为参数,并从WSDL中提取服务所需的信息。(每次修改都需要修改client与server的wsdl文件,没有NO-WSDL模式灵活,以后再介绍这种模式的使用)

SOAP中主要用到三个类,SOAPServer,SOAPClient,SOAPFault

NO-WSDL模式:

soapHandle.class.php 处理请求

<?php  
class soapHandle{  
    public function strtolink($url=''){  
        return sprintf('<a href="%s">%s</a>', $url, $url);  
    }  
}  
?>

server.php soap服务端

<?php  
  
// 服务器验证  
if ($_SERVER['PHP_AUTH_USER']!='fdipzone' || $_SERVER['PHP_AUTH_PW']!='123456') {  
      header('WWW-Authenticate: Basic realm="MyFramework Realm"');  
      header('HTTP/1.0 401 Unauthorized');  
      echo "You must enter a valid login ID and password to access this resource.\n";  
      exit;  
}  
  
require("soapHandle.class.php"); // 处理请求的class  
  
try{  
    $server = new SOAPServer(null, array('uri'=>'http://demo.fdipzone.com/soap/server.php'));  
    $server->setClass('soapHandle'); //设置处理的class  
    $server->handle();  
}catch(SOAPFault $f){  
    echo $f->faultString; // 打印出错信息  
}  
  
?>

client.php soap客户端

< ?php

try {
    $client = new SOAPClient(null, array('location' = >'http://demo.fdipzone.com/soap/server.php', // 设置server路径  
    'uri' = >'http://demo.fdipzone.com/soap/server.php', 'login' = >'fdipzone', // HTTP auth login  
    'password' = >'123456' // HTTP auth password  
    ));

    echo $client - >strtolink('http://blog.csdn.net/fdipzone').'<br>'; // 直接调用server方法  
    echo $client - >__soapCall('strtolink', array('http://blog.csdn.net/fdipzone')); // 间接调用server方法  
} catch(SOAPFault $e) {
    echo $e - >getMessage();
}

? >

Header验证例子:

server.php

<?php  
  
// 服务器验证    
if ($_SERVER['PHP_AUTH_USER']!='fdipzone' || $_SERVER['PHP_AUTH_PW']!='123456') {  
    header('WWW-Authenticate: Basic realm="NMG Terry"');  
    header('HTTP/1.0 401 Unauthorized');  
    echo "You must enter a valid login ID and password to access this resource.\n";  
    exit();  
}  
  
require 'SOAPHandle.class.php';  
  
$config = array(  
        'uri' => 'http://demo.fdipzone.com/soap/server.php'  
);  
  
$oHandle = new SOAPHandle;  
  
// no wsdl mode  
try{  
  
    $server = new SOAPServer(null, $config);  
    $server->setObject($oHandle);  
    $server->handle();  
  
}catch(SOAPFault $f){  
  
    echo $f->faultString;  
  
}  
  
?>

client.php

< ?php

$config = array('location' = >'http://demo.fdipzone.com/soap/server.php', 'uri' = >'http://demo.fdipzone.com/soap/server.php', 'login' = >'fdipzone', 'password' = >'123456', 'trace' = >true);

try {

    $auth = array('fdipzone', '654321');

    // no wsdl  
    $client = new SOAPClient(null, $config);
    $header = new SOAPHeader('http://demo.fdipzone.com/soap/server.php', 'auth', $auth, false, SOAP_ACTOR_NEXT);
    $client - >__setSoapHeaders(array($header));

    $revstring = $client - >revstring('123456');
    $strtolink = $client - >__soapCall('strtolink', array('http://blog.csdn.net/fdipzone', 'fdipzone blog', 1));
    $uppcase = $client - >__soapCall('uppcase', array('Hello World'));

    echo $revstring.'<br>';
    echo $strtolink.'<br>';
    echo $uppcase.'<br>';

} catch(SOAPFault $e) {
    echo $e - >getMessage();
}

? >

SOAPHandle.class.php

<?php  
  
class SOAPHandle{ // class start  
  
    // header 驗證  
    public function auth($auth){  
        if($auth->string[0]!='fdipzone' || $auth->string[1]!='654321'){  
            throw new SOAPFault('Server', 'No Permission');  
        }  
    }  
  
    // 反轉字符串  
    public function revstring($str=''){  
        return strrev($str);  
    }  
  
    // 字符傳轉連接  
    public function strtolink($str='', $name='', $openwin=0){  
        $name = $name==''? $str : $name;  
        $openwin_tag = $openwin==1? ' target="_blank" ' : '';  
        return sprintf('<a href="%s" %s>%s</a>', $str, $openwin_tag, $name);  
    }  
  
    // 字符串轉大寫  
    public function uppcase($str){  
        return strtoupper($str);  
    }  
  
  
} // class end  
  
?>

SOAPHeader 第四与第五个参数说明:

Must Understand

这个参数指明了, 是否服务端必须要响应SoapHeader, 如果这个参数为真, 而服务端并不能识别响应的Header,则会引发一个Soap Fault(Header not understood)。

SOAP_ACTOR_NEXT

actor指明了SoapHeader要传递给谁, 被哪个Service处理。

SOAP_ACTOR_NEXT的意思就是, 下一个接受到这个请求头的Service。

在SoapServer的构造函数中, 我们可以指明一个Server的Actor, 比如:

<?php  
$config = array(  
            'uri' => 'http://demo.fdipzone.com/soap/server.php',  
            'actor' => 'myserver'  
);  
$server = new SOAPServer(null, $config);  
?>

然后就可以在Client的SoapHeader中, 通过设置actor是myserver, 来让指定的Server来获得我们设置的头部的信息。

WSDL找到感觉不错的文章 以后可能会用到

http://blog.csdn.net/cwt0408/article/details/6952936

日记

看《深入PHP 面向对象,模式与时间》有几天了

虽然看了前1/4了但是感觉还是步子迈的有点大了

很多东西在头脑里还是只是有模糊印象并没有完全吸收

一方面自身接受能力有限猛的补充了那么多知识一下也接受不了

既然没有别人学的快 那就利用自己的时间 多复习 多练习 多记忆吧

明天也不打算继续往后面读了

先把前面这些内容弄得很熟悉之后再继续下去

要不然还和上周看的Android一样

虽然全部看完了但是并没有完全理解其中细节

照着书中代码敲出了不少app但是如果手里没有书可能独立也写不出来

一步一个脚印好了 好歹也在进步 不要放弃

PhpStorm/IDEA/clion/pycharm 的破解与激活

安装完软件后,启动,在要求输入注册码的界面(菜单栏 ⇒ help ⇒ register)选择“License server”输入“http://idea.lanyus.com/”点击“OK”快速激活。

如果这种方式破解,点击 OK 按钮之后,出现红色错误提示:License Server response haven’t passed data integrity check:Server hijacked ?

则在浏览器的地址栏输入:http://idea.lanyus.com/,该网址,无需修改用户名,点击获取注册码。复制该注册码,粘贴在注册界面的 Activation code的输入框中,点击 ok。

 

js返回上一页

history.back(-1):直接返回当前页的上一页,数据全部消息,是个新页面

history.go(-1):也是返回当前页的上一页,不过表单里的数据全部还在

CI php图片异步上传

comment.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//上传图片
function uploadImage(file_id, file_name, image_hidden){
    $.ajaxFileUpload({
        url: '/Admin/Upload/Index'//用于文件上传的服务器端请求地址
        secureuri: false//是否需要安全协议,一般设置为false
        dataType: 'json'//返回值类型 一般设置为json
        fileElementId: file_id, //文件上传域的ID
        data: {file_name:file_name},
        success: function(data){ //服务器成功响应处理函数 html为返回值,status为执行的状态
            if ('success' == data.status) {
                var s = data.data;
                s=s.split('/');
                var file_name='<span> '+s[8]+' </span>';
                var hd_input = '<input type="button" value="上传成功" disabled="disabled">';
                $('#'+ image_hidden).val(data.data);
                $('#'+file_id).css('display','none');
                $(file_name).insertAfter('#'+ file_id);
                $(hd_input).insertAfter('#'+ file_id);
            else {
                alert(data.info);
            }
        },
        error: function (data, status, e){ //服务器响应失败处理函数
            alert(e);
        }
    });
    return false;
}
 
//多文件上传
function add_more_file(image_hidden, result_dom_id, s){
    if(!result_dom_id){
        result_dom_id = 'file_str';
    }
    var random = new Date().getTime() + Math.floor(1+Math.random()*(9999999-1000000));
    var file_input = '<input class="form-control upload_file" value="" \
        name="f'+random+'" id="f'+random+'" type="file" \
        onchange="uploadMultipleImage(\'f'+random+'\',\'f'+random+'\',\''+result_dom_id+'\',\''+s+'\')"> \
        <input type="button" id="f'+random+'_hd" value="上传成功" disabled="disabled" style="display:none"> \
        <br>';
 
    $("#"+image_hidden).append(file_input);
}
 
function uploadMultipleImage(file_id, file_name, image_hidden, up_url){
    $.ajaxFileUpload({
        url: '/admin/adminpanel/Upload/index'//用于文件上传的服务器端请求地址
        secureuri: false//是否需要安全协议,一般设置为false
        dataType: 'json'//返回值类型 一般设置为json
        fileElementId: file_id, //文件上传域的ID
        data: {file_name:file_name,up_url:up_url},
        success: function(data){ //服务器成功响应处理函数 html为返回值,status为执行的状态
            if ('success' == data.status) {
                var old_data = $('#'+ image_hidden).val();
                if(old_data == ""){
                    var file_content = data.data;
                }else{
                    var file_content = old_data+'|'+data.data;
                }
 
                var s = data.file_name;
                var file_name='<span><img style="padding-top:10px;width:150px;" src="/admin/../uploadfile/samplepiece/'+s+'"> </span>';
                $('#'+ image_hidden).val(file_content);
                $('#'+file_id).css('display','none');
                $(file_name).insertAfter('#'+ file_id);
            else {
                alert(data.info);
            }
        },
        error: function (data, status, e){ //服务器响应失败处理函数
            alert(e);
        }
    });
    return false;
}

ajaxfileupload.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
jQuery.extend({
 
 
    createUploadIframe: function(id, uri)
   {
         //create frame
            var frameId = 'jUploadFrame' + id;
            var iframeHtml = '<iframe id="' + frameId + '" name="' + frameId + '" style="position:absolute; top:-9999px; left:-9999px"';
         if(window.ActiveXObject)
         {
                if(typeof uri== 'boolean'){
               iframeHtml += ' src="' 'javascript:false' '"';
 
                }
                else if(typeof uri== 'string'){
               iframeHtml += ' src="' + uri + '"';
 
                }
         }
         iframeHtml += ' />';
         jQuery(iframeHtml).appendTo(document.body);
 
            return jQuery('#' + frameId).get(0);
    },
    createUploadForm: function(id, fileElementId, data)
   {
      //create form
      var formId = 'jUploadForm' + id;
      var fileId = 'jUploadFile' + id;
      var form = jQuery('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');
      if(data)
      {
         for(var in data)
         {
            jQuery('<input type="hidden" name="' + i + '" value="' + data[i] + '" />').appendTo(form);
         }
      }
      var oldElement = jQuery('#' + fileElementId);
      var newElement = jQuery(oldElement).clone();
      jQuery(oldElement).attr('id', fileId);
      jQuery(oldElement).before(newElement);
      jQuery(oldElement).appendTo(form);
 
 
 
      //set attributes
      jQuery(form).css('position''absolute');
      jQuery(form).css('top''-1200px');
      jQuery(form).css('left''-1200px');
      jQuery(form).appendTo('body');
      return form;
    },
 
    ajaxFileUpload: function(s) {
        // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout      
        s = jQuery.extend({}, jQuery.ajaxSettings, s);
        var id = new Date().getTime()
      var form = jQuery.createUploadForm(id, s.fileElementId, (typeof(s.data)=='undefined'?false:s.data));
      var io = jQuery.createUploadIframe(id, s.secureuri);
      var frameId = 'jUploadFrame' + id;
      var formId = 'jUploadForm' + id;
        // Watch for a new set of requests
        if ( s.global && ! jQuery.active++ )
      {
         jQuery.event.trigger( "ajaxStart" );
      }
        var requestDone = false;
        // Create the request object
        var xml = {}
        if ( s.global )
            jQuery.event.trigger("ajaxSend", [xml, s]);
        // Wait for a response to come back
        var uploadCallback = function(isTimeout)
      {
         var io = document.getElementById(frameId);
            try
         {
            if(io.contentWindow)
            {
                xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
                    xml.responseXML = io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;
 
            }else if(io.contentDocument)
            {
                xml.responseText = io.contentDocument.document.body?io.contentDocument.document.body.innerHTML:null;
                   xml.responseXML = io.contentDocument.document.XMLDocument?io.contentDocument.document.XMLDocument:io.contentDocument.document;
            }
            }catch(e)
         {
            jQuery.handleError(s, xml, null, e);
         }
            if ( xml || isTimeout == "timeout")
         {
                requestDone = true;
                var status;
                try {
                    status = isTimeout != "timeout" "success" "error";
                    // Make sure that the request was successful or notmodified
                    if ( status != "error" )
               {
                        // process the data (runs the xml through httpData regardless of callback)
                        var data = jQuery.uploadHttpData( xml, s.dataType );
                        // If a local callback was specified, fire it and pass it the data
                        if ( s.success )
                            s.success( data, status );
 
                        // Fire the global callback
                        if( s.global )
                            jQuery.event.trigger( "ajaxSuccess", [xml, s] );
                    else
                        jQuery.handleError(s, xml, status);
                catch(e)
            {
                    status = "error";
                    jQuery.handleError(s, xml, status, e);
                }
 
                // The request was completed
                if( s.global )
                    jQuery.event.trigger( "ajaxComplete", [xml, s] );
 
                // Handle the global AJAX counter
                if ( s.global && ! --jQuery.active )
                    jQuery.event.trigger( "ajaxStop" );
 
                // Process result
                if ( s.complete )
                    s.complete(xml, status);
 
                jQuery(io).unbind()
 
                setTimeout(function()
                           {  try
                              {
                                 jQuery(io).remove();
                                 jQuery(form).remove();
 
                              catch(e)
                              {
                                 jQuery.handleError(s, xml, null, e);
                              }
 
                           }, 100)
 
                xml = null
 
            }
        }
        // Timeout checker
        if ( s.timeout > 0 )
      {
            setTimeout(function(){
                // Check to see if the request is still happening
                if( !requestDone ) uploadCallback( "timeout" );
            }, s.timeout);
        }
        try
      {
 
         var form = jQuery('#' + formId);
         jQuery(form).attr('action', s.url);
         jQuery(form).attr('method''POST');
         jQuery(form).attr('target', frameId);
            if(form.encoding)
         {
            jQuery(form).attr('encoding''multipart/form-data');
            }
            else
         {
            jQuery(form).attr('enctype''multipart/form-data');
            }
            jQuery(form).submit();
 
        catch(e)
      {
            jQuery.handleError(s, xml, null, e);
        }
 
      jQuery('#' + frameId).load(uploadCallback  );
        return {abort: function () {}};
 
    },
    handleError: function( s, xhr, status, e )        {
       // If a local callback was specified, fire it
             if ( s.error ) {
                s.error.call( s.context || s, xhr, status, e );
             }
 
             // Fire the global callback
             if ( s.global ) {
                (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
             }
          },
    uploadHttpData: function( r, type ) {
        var data = !type;
        data = type == "xml" || data ? r.responseXML : r.responseText;
        // If the type is "script", eval it in global context
        if ( type == "script" )
            jQuery.globalEval( data );
        // Get the JavaScript object, if JSON is used.
        if ( type == "json" )
            eval( "data = " + data );
        // evaluate scripts within html
        if ( type == "html" )
            jQuery("<div>").html(data).evalScripts();
 
        return data;
    }
})

html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div class="form-group">
 
    <div class="col-lg-6">
        <input type="hidden" id="file_str" value="{$info['attachment']}" name="attachment"/>
        <input class="form-control upload_file" value="" name="f0" id="f0" type="file" multiple="true" onchange="uploadMultipleImage('f0','f0','file_str','samplepiece')">
        <a href="javascript:void(0);" class="add_more_file" ></a>
        <div id="more_file"></div>
    </div>
    <div class="col-lg-2">
        <div class="btn-group">
            <button onclick="add_more_file('more_file','','samplepiece')" class="btn btn-primary dropdown-toggle add_more_file" type="button">继续添加</button>
        </div>
    </div>
 
</div>

uplolad.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
 
class Upload extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
    }
 
    function Index($fieldName '')
    {
        $post $this->input->post();
        $up_url = isset($post['up_url']) ? $post['up_url'] : '';
        $upload_path '../uploadfile/'.$up_url.'/';
 
        $config['upload_path'] = $upload_path;
        $config['allowed_types'] = 'gif|jpg|png';
//        $config['max_size'] = $this->method_config['upload'][$fieldName]['upload_size'];
        $config['overwrite'] = FALSE;
        $config['encrypt_name'] = false;
        $config['file_name'] = date('Ymdhis') . random_string('nozero', 4);
 
        dir_create($upload_path);//创建正式文件夹
        $this->load->library('upload'$config);
 
        //获取原文件名
        $file $_FILES;
 
        foreach($file as $k => $v){
            if (!$this->upload->do_upload($k)){
                echo json_encode($this->upload->display_errors());
                exit;
            }
        }
 
        $filedata $this->upload->data();
        $filedata['status'] = 'success';
        echo json_encode($filedata);
    }
}

安卓按钮点击事件的多种实现方式

方式一【定义内部类】:


根据ui写业务逻辑 在mainActivity->onCreate方法里面写逻辑

1
 btn_call.setOnClickListener(new MyClickListener());

给按钮设置一个点击事件

1
2
3
//加载一个布局setContentView(R.layout.activity_main);
//[1]找到我们关心的空间edittext button et_number = (EditText) findViewById(R.id.editText1);  
//[2]找到按钮 Button btn_call = (Button) findViewById(R.id.button1);

自己定义一个类去实现方法需要的参数类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 private class MyClickListener implements OnClickListener{
    //当按钮被点击的时候调用    
    @Override    
    public void onClick(View v){        
        //[4]获取edittext文本内容        
        String number = et_number.get_Text().toString().trim();        
        if("".equals(number)){            
        /**            
        * context  上下文            
        */            
            Toast.makeText(MainActivity.this,"number不能为空",1).show();            
            return;        
        }                
     
        //[5]进行电话拨打 意图Intent        
        Intent intent = new Intent();
        //创建一个意图对象        
        //[5.1]设置动作        
        intent.setAction(Intent.ACTION_CALL);        
        //[5.2]设置要拨打的数据        
        /**        
        * uri:统一资源提示符        
        */        
        intent.setData(Uri.parse("tel:"+number));                
        //[6]开启意图        
        startActivity(intent);    
        }
    }

一定要记得加上拨打电话的权限 

方式二【定义匿名内部类】:


//按钮的第二种点击事件

1
2
3
4
5
6
7
8
9
10
//第一种的方法是这样的 btn_call.setOnClickListener(new MyClickListener());
 
btn_call.setOnClickListener(new MyClickListener(){
    @Override
    public void onClick(View v){
        //[4]实现拨打电话的逻辑
        //把之前内部类里面拨打电话的逻辑拿出来写成一个function(callPhone)然后直接调用就可以了
        callPhone();
    }
});

方式三(当页面上按钮非常多的情况下适用):


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//在onCreate找到按钮空间定义多个
Button btn_call1 = (Button) findViewById(R.id.button1);
Button btn_call2 = (Button) findViewById(R.id.button2);
Button btn_call3 = (Button) findViewById(R.id.button3);
 
 
btn_call.setOnClickListener(this);
//this是MainActivity 这个参数的类型必须是onClickListener
//所以在当前类上实现onclick接口类型
//public class MainActivity extends Activity implements onClickListener
//注意引用的是View包下的onClickListene
 
//实现这个接口要实现这个接口内未实现的方法onClick
//当点击按钮的时候执行
@Override
public void onClick(View v){
    //具体判断点击的是哪个按钮
    switch(v.getId()){
        case R.id.button1://代表点击了第1个按钮
             
            break;
             
        case R.id.button2://代表点击了第2个按钮
             
            break;
             
        case R.id.button3://代表点击了第3个按钮
             
            break;
             
        default:
            break;
    }
}

方式四:(声明一个方法 方法名和你要点击的这个按钮在布局中声明的onClick一样)


在activity_main.xml里给Button添加onClick属性

blob.png

Blog移植纪念

纪念一下陪伴了我3年的stblog,今天把blog整个移植到wordpress上。

因为系统移植所以有一些问题

比如说之前的代码无法正常展示

因为前面的文章太多了 一个一个修改太累 索性不整理了 哈哈哈

以后慢慢的再添加吧