摘要: 经常一个人在一些技术社区里游荡,小混混一个,不能做什么,只是喜欢围观,怕哥拧我的耳朵吼:“此人是 不明真相围观者”。博客园是最早进入也是进入次数最多的社区,因为我是使C#的,发现哪里的人,很绅士,说话客客气气的,喜欢拉你做讨论,不经意间总会发现不少人佩带轻便的美国名枪;javaeye是后来google到的,第一次进去便看到,一个江湖大哥顶着大刀踢馆子,从此就喜欢在那里看热闹,偶然偷学点开源的理念了;听说豆瓣挺不错的,于是闯进去了,喝,东西挺多,可惜不是自己感兴趣的;里面总发现一些闲情男女眉来眼去的,有的人提着鸟笼哼着小曲好悠哉... 后来又发现,那里的人喜欢问问题,于是自己也好奇问一下,结果没阅读全文
posted @ 2010-03-03 01:28 2GOO 阅读(1438) 评论(10) 编辑
在海外,问答社区相当盛行,stackoverflowquora两个知名的社区都很火。在中国,有“百度知道”,但“百度知道”所涉及到的内容范围五花八门,作为程序员,有时候很希望有个中国版的stackoverflow,一个纯粹的中文IT问答社区。问答社区对整个IT社区还是有优势的,比如:和篇幅长而又有内涵的博客相比,你可以更直接更专注于问题和答案本身,更有效率地解决问题(当然问答和博客的作用本质还是有点区别)。

基于种状况,一直想搭建一个良好的IT问答社区,类似stackoverflow的网站。得益于OSQA开源项目,今天终于把它部署到服务器上:http://5-wow.com 。在此声明,本文需要大家的理解,请不要马上断言本文是软文、广告之类的,OSQA和5-wow.com本身并没有任何的商业成份,是个非盈利的问答社区,本人只是想尝试借助开源项目来服务国内的.NET社区,让热爱.NET技术的朋友群力群策,聚在一起探讨解决问题;如果你觉得事情本身还有点意义,请别向我仍石头,鸡蛋之类的。 

OSQA开源项目很简洁,整个项目大概就是几千行代码,“麻雀虽小而五脏俱全”,基本实现了问答操作所需的功能,包括答案的评论、回复和投票;还有就是会员的积分统计功能。这些细节功能组在一起,很适合问答社区中使用,每个人进来都是社区的一份子,所有的问答都是会员自己监督和管理,内容的质量完全由社区掌控,所以一旦会员参与,就会意识到自己就是管理员。积分统计功能,是通过奖牌榜形式来表现,奖牌暂时细分成30多种奖项,看奖牌榜,别人很容易发现自己所擅长的领域,可能有些爵位很适合自己...整个问答社区就这样潜移默化地把权重分配给会员,同时会员的影响力也渐渐发挥出来了。

问答社区里的东西简单而又不失乐趣,欢迎新老程序员加入到 5-wow.com IT问答社区来,有问题 没有问题的时候,进来看看,到时候你就会发现:在IT社区里,其实自己还是有某种魅力和影响力的。

 

博客园上的小组:http://space.cnblogs.com/group/102110/ 

我们第三方微波:http://2goo.info/microblog/ 

欢迎同行热爱技术的来研讨。 

posted @ 2011-05-13 11:51 2GOO 阅读(112) 评论(0) 编辑
摘要: 导读:在指定大小的框框内,对图片等比例缩放,你有没有碰到?有的话以下代码可能有些用。问题场景最近碰到一个客户提出一个需求:图片缩放功能,上传的图片尺寸可以是任何比例,而且有横向也有纵向的,在规定的尺寸范围内缩放,缩放后的图片不能有剪切的,缩放后图片可视比例和原图片比例相等。如果明白的话,很明显这种缩放,横向或纵向可能会留空白的边,于是把这种情况跟客户说了,客户也很明白,说可以接受。问题分析得出思路平时接触的图片缩放或剪切,都不是此类的,先在google上搜索了一下,有需求,但没有看到几个解决方案,这么来真的要自己写一些程序了,缕缕思路:首先要计算出缩放后图片的尺寸,该尺寸的长宽都在指定尺寸范围阅读全文
posted @ 2011-04-09 08:58 2GOO 阅读(296) 评论(0)  编辑
PIL图形库很多有用的函数,做网站用的比较多的要数剪切图片了,平时都是用thumbnail函数来完成,它能满足我的大部分需求,但也有时并不是我们需要的,比如一张1024*768像素的大图,你想剪切成为300*300像素的小图,这时你用thumbnail剪切出来的小图宽度是300像素了,但小图的高度也跟着等比例缩小,变成了225像素。
有没有相关的函数,可以满足我们的需求呢?有,那就是transform函数,transform函数可以传入剪切图片的尺寸size(宽高),一个方法method(EXTENT)和剪切区域data的起始点和结束点,返回的是image。完整的定义如:
im.transform(size, method, data) => image
有了这个函数,我们就可以考虑我们刚才的需求了。关键很是剪切的区域。
思路大致为:
选择剪切区域之前,我们就考虑,一个长方形的图片,剪切成正方形,肯定要舍些东西,把多余的部分去掉。既然图片宽度比高度大,我们就把图片左右两边剪切点,剩下来的这就是我们的选择区域了。接下来就开始求多余的部分的数值了。
首先先比较图片的 宽度和高度,比如图片是img,img.size我们就得到它的宽w和高h了。
w=img.size[0]  h=img.size[1],img宽度比高度多出了w-h个像素。那么方案自然就出来了,从大图的左边开始,垂直剪切(w-h)/2个像素,再从右开始垂直剪切(w-h)/2个像素便得出一个768像素的正方形小图来了。再用thumbnail剪切成需要的尺寸300,OK完成了。
代码如下:

 

import Image
from Image import EXTENT
if img.size[0]>img.size[1]:
    offset
=int(img.size[0]-img.size[1])/2
    img
=img.transform((img.size[1],img.size[1]),EXTENT,(offset,0,int(img.size[0]-offset),img.size[1]))
else:
    offset
=int(img.size[1]-img.size[0])/2
    img
=img.transform((img.size[0],img.size[0]),EXTENT,(0,offset,img.size[0],(img.size[1]-offset)))
img.thumbnail((
300300))

 

 

 

 这篇随笔 是《Django&JQuery手动剪切个性头像》的后续. 
posted @ 2010-03-23 12:05 2GOO 阅读(277) 评论(0) 编辑
最近看了豆瓣的头像剪切应用,也想自己做一个,但在Django上做这样的功能,怎么入手呢?google了一下,很少相关的材料,还得自己构想一下。理清了思路,大概是这样的:前端使用JQuery,用户选择剪切区域,之后取到图片的宽度和高度,起始点的xy坐标(左上角的xy轴位置)和结束点的xy坐标(右下角的xy轴位置),然后把这六个参数呈现到表单上,提交给django处理;后端用Python的PIL来处理,Python的PIL图形处理类库功能很全,可以在里面找到相关的函数,根据前端提供的六个参数,对原图片进行剪切。
废话少说,开始动手了,搜了相关的JQuery插件,发现顶顶有名的插件:jquery imgareaselect ,恰恰是我需要的东西,通过它能得到我上面提到的六个必须参数。倒是Python的PIL库很陌生,找了很多的函数都不满意,所以暂时使用transform函数,它是我目前所需最接近的函数。
前端页面有两个图片容器,一个是放置原图的,另一个是放置缩略图,然后是六个输入框,分别呈现剪切图片的宽度 高度 起始点的x坐标值,y坐标值和结束点的x坐标值,y坐标值。只要脚本选中区域,这六个输入框就有数据,然后提交给django来处理,这样的话显然用到django的form了。准备工作算是完成了,开始编代码了:
前端代码hathead_cut.html:
<link rel="stylesheet" type="text/css" href="/media/js/jquery_imgareaselect_0_9_1/css/imgareaselect-default.css" />
<style rel="stylesheet"  type="text/css" >
.demo 
{
background
:none repeat scroll 0 0 #EEEEFF;
border
:2px solid #DDDDEE;
padding
:0.6em;
width
:85%;
}
div.frame 
{
background
:none repeat scroll 0 0 #FFFFFF;
border
:2px solid #DDDDDD;
padding
:0.8em;
}
</style>
<script type="text/javascript" src="/media/js/jquery.js"></script>
<script type="text/javascript" src="/media/js/jquery_imgareaselect_0_9_1/scripts/jquery.imgareaselect.min.js"></script> 
<script type="text/javascript">
function preview(img, selection) {
 
if (!selection.width || !selection.height)
 
return;

 
var scaleX = 100 / selection.width;
 
var scaleY = 100 / selection.height;

 $(
'#preview img').css({
 width: Math.round(scaleX 
* 300),
 height: Math.round(scaleY 
* 300),
 marginLeft: 
-Math.round(scaleX * selection.x1),
 marginTop: 
-Math.round(scaleY * selection.y1)
 });

 $(
'#id_x1').val(selection.x1);
 $(
'#id_y1').val(selection.y1);
 $(
'#id_x2').val(selection.x2);
 $(
'#id_y2').val(selection.y2);
 $(
'#id_w').val(selection.width);
 $(
'#id_h').val(selection.height);
}

$(
function () {$('#photo').imgAreaSelect({ aspectRatio: '1:1', handles: true,
fadeSpeed: 
200, minHeight:100,minWidth:100,onSelectChange: preview });
}); 
</script>

<div>
    
<h3>头像剪切  </h3>
<div class="demo">
 
<div style="float: left; width: 45%;">
  
<class="instructions">
   点击原图 选择剪切区域
  
</p>
 
  
<div style="margin: 0pt 0.3em; width: 300px; height: 300px;" class="frame">
   
<img src="{{baseinfo.hathead}}_300_300.jpg" id="photo" alt="30"/>
  
</div>
 
</div>
 
 
<div style="float: left; width: 40%; padding-top:50px;">
  
<style="font-size: 110%; font-weight: bold; padding-left: 0.1em;">
   预览选择区域
  
</p>
  
  
<div style="margin: 0pt 1em; width: 100px; height: 100px;" class="frame">
   
<div style="width: 100px; height: 100px; overflow: hidden;" id="preview">
    
<img style="width: 244px; height: 244px; margin-left: -71px; margin-top: -54px;" src="{{baseinfo.hathead}}_300_300.jpg" alt="300"/>
   
</div>
  
</div>
<form action="" method="POST">
  
<table style="margin-top: 1em;">
   
<thead>
    
<tr>
     
<th style="font-size: 110%; font-weight: bold; text-align: left; padding-left: 0.1em;" colspan="2">
      剪切坐标
     
</th>
     
<th style="font-size: 110%; font-weight: bold; text-align: left; padding-left: 0.1em;" colspan="2">
      剪切尺寸
     
</th>
    
</tr>
   
</thead>
   
<tbody>
    
<tr>
     
<td style="width: 10%;"><b>X<sub>1</sub>:</b></td>
     
<td style="width: 30%;">{{form.x1}}</td>
     
<td style="width: 20%;"><b>宽度:</b></td>
     
<td>{{form.w}}</td>
    
</tr>
    
<tr>
     
<td><b>Y<sub>1</sub>:</b></td>
     
<td>{{form.y1}}</td>
     
<td><b>高度:</b></td>
     
<td>{{form.h}}</td>
    
</tr>
    
<tr>
     
<td><b>X<sub>2</sub>:</b></td>
     
<td>{{form.x2}}</td>
     
<td></td>
     
<td></td>
    
</tr>
    
<tr>
     
<td><b>Y<sub>2</sub>:</b></td>
     
<td>{{form.y2}}</td>
     
<td></td>
     
<td><input type="submit" value="保存"/></td>
    
</tr>
   
</tbody>
  
</table>
</form>
 
</div>

 

django的form代码:
class HatHeadCutForm(forms.Form):
    x1
=forms.IntegerField(widget=forms.TextInput(attrs={'size'4,}))
    y1
=forms.IntegerField(widget=forms.TextInput(attrs={'size'4,}))
    x2
=forms.IntegerField(widget=forms.TextInput(attrs={'size'4,}))    
    y2
=forms.IntegerField(widget=forms.TextInput(attrs={'size'4,}))
    w
=forms.IntegerField(widget=forms.TextInput(attrs={'size'4,}))
    h
=forms.IntegerField(widget=forms.TextInput(attrs={'size'4,}))

 

django的views代码:
def hathead_cut(request,id):
    template_var
={}
    
try:
        baseinfo
=BaseInfo.objects.get(id=int(id))
    
except BaseInfo.DoesNotExist:
        
return Http404()
        
    
if not baseinfo.hathead:
        request.user.message_set.create(message
=u"请先上传图片!")
        
return HttpResponseRedirect(reverse("upload_hathead"))
        
    template_var[
"baseinfo"]=baseinfo
    abs_path
="%s/%s/"%(MEDIA_ROOT,"hathead")
    file_name
="%s_%s"%(request.user.username,"hathead_300_300.jpg"
    form
=HatHeadCutForm()
    
if request.method=='POST':
        form
=HatHeadCutForm(request.POST)
        
if form.is_valid():            
            
try:
                img
=Image.open(abs_path+file_name)
            
except IOError:
                request.user.message_set.create(message
=u"系统错误!")
            data
=form.cleaned_data
            img
=img.transform((data["w"],data["h"]),EXTENT,(data["x1"],data["y1"],data["x2"],data["y2"]))
          
            img.thumbnail((
100100))
            file_name
="%s_%s"%(request.user.username,"hathead_100_100.jpg")
            img.save(
"%s%s"%(abs_path,file_name),"JPEG")
            
            img.thumbnail((
5050))            
            file_name
="%s_%s"%(request.user.username,"hathead_50_50.jpg")            
            img.save(
"%s%s"%(abs_path,file_name),"JPEG")
            request.user.message_set.create(message
=u"保存成功!")
            
return HttpResponseRedirect(reverse("upload_hathead"))
        
else:
            request.user.message_set.create(message
=u"请剪切后 再保存!")
    template_var[
"form"]=form
    
return render_to_response("hathead_cut.html",template_var,context_instance=RequestContext(request))

 

以上的代码,先读取一张300*300的图片,脚本选中100*100的区域,提交给Django剪切,最后把100*100剪切好的图再剪切一张50*50的图。脚本剪切的比列是1:1。脚本jquery imgareaselect的相关文档你可以从官方网找到,可以任意做出自己需要的效果。django的form的作用是渲染出表单(六个输入框。注:图片是直接读取磁盘文件,缩略图效果全是是jquery imgareaselect生成的);django的views的作用是根据表单提交的六个参数,剪切图片,主要代码是:img=img.transform((data["w"],data["h"]),EXTENT,(data["x1"],data["y1"],data["x2"],data["y2"]))。


之前有一个操作就不在这里介绍了,它的工作主要是上传一张宽度高度不规则的图片,然后只经过PIL剪切成正方形的图片,保存到磁盘里,PIL剪切图片很简单,如果想把一张不规则的图片剪切成正方形就需要用到一点技巧了,如果兴趣的话,接下来想单独介绍一下原理。

同文:http://2goo.info/blog/panjj/Django/2010/03/12/34 

posted @ 2010-03-12 22:30 2GOO 阅读(724) 评论(0) 编辑
上回介绍了Django在windows下的环境搭建,今天介绍Django的杀手锏级应用:Admin的生成。为了能够讲明白,下面简要说一下环境:Django版本:Django1.1.1  简单示例:Blog  数据库:sqlite3
1,新建一个Project
只要你上回你能顺利配置好Django1.1.1的环境,你现在可以打开Dos控制台,来到你想安放Project的目录下;我把Project(命名为v111)暂且放到study_django目录下,于是Dos下输入指令:
d:  ,回车
cd study_django  ,回车
这时来到了想到的目录下,接着新建Project
django-admin.py startproject v111  ---(django-admin.py是django的全局命令,我们上回已经把它加入系统变量里了,startproject 表示新建工程,v111是工程的名称)
这时你在目录下,可以看到有文件生成了,比如:__init__.py manage.py settings.py urls.py 这四个python文件,这就是整个Project的全部文件,manage.py是主角,我们之后就使用它生成自己想要的东西了,django-admin.py这个全局模块,当我们新建完毕Project,就很少用到它了,先忘记它吧。

Project算是建立好了,在Project里新建个App (App,暂且叫应用吧,一个Project里可以放多个独立的应用A,Django提倡App的热插拔,很好的设计理念),进入刚才新建的Project里
cd v111 回车 
来到了Project的目录下,
manage.py startapp blog 回车
这时打开Project的目录 发现了一个文件夹blog,里面有 __init__.py models.py test.py urls.py四个文件,这就是一个独立的blog App了。
太好了,整个Project就这么几个文件, 两行的django命令
django-admin.py startproject v111 
manage.py startapp blog
就可以完成了,都简单不过的了。接下来我们可以集中精力,编写自己的网站了,借助Python简单的特点,下来的步骤也不会写很多代码。

2 设置一下Project全局变量,就是让Project更好地跑我们的blog应用。
首先在Project目录下,找到settings.py 指定数据库:
DATABASE_ENGINE = 'sqlite3'          
DATABASE_NAME = 'study_django_v111.db3'
DATABASE_USER = ''            
DATABASE_PASSWORD = ''        
DATABASE_HOST = ''           
DATABASE_PORT = ''

 

以上的代码:DATABASE_ENGINE = 'sqlite3'是指定数据类型,我们使用内置的 sqlite3
DATABASE_NAME = 'study_django_v111.db3' 是数据库的名字,我们指定的是 study_django_v111.db3

然后把blog和admin应用 插到Project里
INSTALLED_APPS = (
    
'django.contrib.auth',
    
'django.contrib.contenttypes',
    
'django.contrib.sessions',
    
'django.contrib.sites',
    
'django.contrib.admin',    
    
'blog'
)

 

INSTALLED_APPS 本来就用一些基本的应用,我们只需写入两行代码
'django.contrib.admin',    
'blog',

Project基本的全局变量已经设置好了.
接下来关键的东西是编写blog的实体,在blog/models.py下,写我们需要的实体字段:
#coding=utf-8
from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Blog(models.Model):   
    title=models.CharField(u"标题",max_length=60)
    content=models.TextField(u"正文")
    user=models.ForeignKey(User,verbose_name=u"作者")
    category=models.CharField(u"类型",max_length=20)
    status=models.NullBooleanField(u"可用")
    created_at=models.DateTimeField(u"建立时间",auto_now_add=True)
    updated_at=models.DateTimeField(u"修改时间",auto_now=True)
    
    
class Meta:
        verbose_name        = u"A.博客"
        verbose_name_plural = u"A.博客列表"
        ordering            = ("-created_at",)
        get_latest_by       = "created_at"
    
    
def __unicode__(self):
        
return self.title

 


为了简单说明,整个models模块就是一个实体类Blog。
在blog文件夹了,新建admin.py模块(blog/admin.py) ,在该模块下编写代码,让Django自动生成Admin应用,写入代码如下:
#coding=utf-8
from django.contrib import admin
from models import *

class BlogAdmin ( admin.ModelAdmin ) :
    list_display = ( 'user''title','category','status''created_at','updated_at',)
    list_display_links =('title',)
    list_filter = ( 'user','title','status''created_at''updated_at',)
    ordeing = ( '-created_at' ,  '-updated_at',)
    search_fields = ( 'title''user','content',)
    
admin.site.register ( Blog, BlogAdmin )

 


这时该到收尾工作了,我们回到Dos控制台,执行命令:
manage.py syncdb 回车
Django就会根据你刚才的 编写的models.py下的Blog实体类生成 数据表,同时也会生成一些基本的表,就看Project下的INSTALLED_APPS插入了什么App。
回车后你会看到控制台表的全部过程,这个不用我们操心,就全部交个Django来做好了,但是生成过程中,Django需要输入一个后台的超级管理员账号,
出来Would you like to create one now? (yes/no):的时候,输入 yes 回车,按照指令提示,完成新建工作即可。
我暂且这么起名:管理员 baoyalv 密码 pwd123 Email b@163.com

显示的语句如下:
D:\study_django\v111>manage.py syncdb
Creating table auth_permission
Creating table auth_group
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table django_admin_log
Creating table blog_blog

You just installed Django's auth system, which means you don't have any superuse
rs defined.
Would you like to create one now? (yes/no): yes
Username: baoyalv
E-mail address: b@163.com
Password:
Password (again):
Superuser created successfully.
Installing index for auth.Permission model
Installing index for auth.Message model
Installing index for admin.LogEntry model
Installing index for blog.Blog model

等Django执行完了以上的工作,我们在控制台输入 :manage.py runserver 回车
来启动整个Project,当Django启动了内置的web 服务器,我们就可以浏览我们的admin 页面了:
打开浏览器,在地址栏上 输入地址:http://127.0.0.1:8000/admin
怎么样,登录页面出来了吧,用刚才的我们新建的管理员账号登陆进去,你就能看到 blog 和user group的相关模块后台管理了。

 

 

 

 


 

posted @ 2010-03-06 16:37 2GOO 阅读(625) 评论(0) 编辑
摘要: 昨晚遇到了一件事情,不禁回想在博客园 Javaeye 豆瓣这三大技术社区漂泊的日子,发表了一篇 自己对这三大技术社区中的体验感受,博客园下的转载地址。第二天早上看了一下回帖,大吃一惊,阅读数竟然达到1000次,这个数目可是发生在不到10个小时之间,真让人感慨,龅牙驴,部署到现在,有一个月有余,所有的一百多篇资讯的阅读量总和相加 都达不到1000次,而在博客园,就一篇随笔几个小时内竟然达到了1000次,平均每小时100个点击量,博客园的人气真是如火如荼,这个品牌知名度可一斑了。到了下午,在某些朋友的建议下,管理员把这篇随笔取消了放置首页,点击量一下子垂直下降,呵呵,他们所谓的软文让随笔回到了平静阅读全文
posted @ 2010-03-03 20:53 2GOO 阅读(255) 评论(0) 编辑
摘要: 经常一个人在一些技术社区里游荡,小混混一个,不能做什么,只是喜欢围观,怕哥拧我的耳朵吼:“此人是 不明真相围观者”。博客园是最早进入也是进入次数最多的社区,因为我是使C#的,发现哪里的人,很绅士,说话客客气气的,喜欢拉你做讨论,不经意间总会发现不少人佩带轻便的美国名枪;javaeye是后来google到的,第一次进去便看到,一个江湖大哥顶着大刀踢馆子,从此就喜欢在那里看热闹,偶然偷学点开源的理念了;听说豆瓣挺不错的,于是闯进去了,喝,东西挺多,可惜不是自己感兴趣的;里面总发现一些闲情男女眉来眼去的,有的人提着鸟笼哼着小曲好悠哉... 后来又发现,那里的人喜欢问问题,于是自己也好奇问一下,结果没阅读全文
posted @ 2010-03-03 01:28 2GOO 阅读(1438) 评论(10) 编辑
摘要: Django内置的filter,有一个是removetags,可以过滤多个指定的Html标签,比如博客的内容摘要可能是html格式的,显示的时候,去掉a p span div标签,可以这样写{{blog.content|removetags:"a p span div"}},removetags函数会去掉指定的标签,如以下blog正文的html代码:“<p>这是我的<spancolor="Blue">博客</span>正文链接是<ahref="http://baoyalv.info/blog/web/2010/02/12/">点击</a></p>”通过removetags函数处理后会得到:“这阅读全文
posted @ 2010-02-25 23:18 2GOO 阅读(263) 评论(3) 编辑
摘要: Django官方文档可以在http://docs.djangoproject.com/en/1.1/打 开,如果你想把这个文档生成到本地,是有办法的,默认情况,你下载了Django安装包就包含txt格式的, 路径是C:\Django-x-x-x\docs (注:-x-x-x是版本号),要把txt格式转换成html的,如果环境是windows 的(务必能上网的),按照以下步骤完成。1 先安装setuptools http://pypi.python.org/pypi/setuptools/0.6c9下载后用RAR解压缩,Dos进入刚解压的setuptools目录下,可以看到 setup.py阅读全文
posted @ 2010-02-10 11:13 2GOO 阅读(317) 评论(0) 编辑
摘要: 一个月前,看到一个现象,情形大概是这样,网友A 看了一篇 列举django如何之异类,如何之不合适自己,然后愤愤的定论django设计理念上有问题,宣言放弃django 的博客;A马上评论说,django设计得很完美,奉劝作者多多找原因,不要把全部问题推论到django上;几天后网友B,很认真的说道,用django的人,一个个起初都鼓吹django怎么怎么地好,效率怎么怎么地高,当遇到问题,就退缩了,投靠到别的社区(rails)去了,把自己不负责任的言论都抛给了初学者,误导初学者,让初学者也和自己一样起初知道点皮毛就放出豪言壮语,继续误人子弟,最后人杳无音信地跑了。看到这种情形,无不感到一种莫阅读全文
posted @ 2010-02-08 18:18 2GOO 阅读(476) 评论(6) 编辑