免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6352 | 回复: 7
打印 上一主题 下一主题

谁能用perl TK 做unix下的通用菜单? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2001-12-08 10:19 |只看该作者 |倒序浏览
我在unix下用c作了一个通用菜单(应用于字符终端界面),使用两个参数文件,可以任意定制菜单项.
各位,有谁对perl TK 有过研究?perl能不能更好的实现?

论坛徽章:
0
2 [报告]
发表于 2001-12-15 11:09 |只看该作者

谁能用perl TK 做unix下的通用菜单?

TK库是PERL下最好的图形库,有两本书“PERL高级编程”(O'relly出版)和“即时即用PERL模块”中有详细介绍

论坛徽章:
0
3 [报告]
发表于 2001-12-17 22:24 |只看该作者

谁能用perl TK 做unix下的通用菜单?

billson,我在CPAN上看到有关的TK的模块,搞不请楚他们之间的区别和用途,顺便
贴上来给大家看一看!!Tk          ACH       Tk-ACH-0.03.tar.gz               10k  06 Jul 1998
Tk          ACH       Tk-Contrib-0.07.tar.gz           12k  23 Sep 1998
Tk          ACH       Tk-GBARR-1.0401.tar.gz           29k  15 Sep 1998
Tk          ACH       Tk-Pod-0.11.tar.gz               28k  03 Nov 1998
Tk          ALEXIOB   Tk-Text-SuperText-0.9.4.tar.gz   16k  17 Jan 2001
Tk          ALSCH     Tk-SelFile-0.02.tar.gz            7k  20 Nov 1995
Tk          ANDYDUNC  Orac-alpha-1.2.6.tar.gz         355k  17 Oct 2001
Tk          AQUMSIEH  Tk-RotCanvas-1.1.tar.gz           3k  28 Jun 2000
Tk          ARIF      Tk-Month-1.2.tar.gz              13k  24 May 2000
Tk          BPOWERS   Tk-FileDialog-1.3.tar.gz          9k  09 Jun 1996
Tk          BPOWERS   Tk-WaitBox-1.3.tar.gz             4k  27 Jul 2000
Tk          CERNEY    Tk-TableMatrix0.8.tar.gz        167k  04 Oct 2001
Tk          CLEMBURG  Test-Unit-0.14.tar.gz            45k  18 Jun 2001
Tk          CPHIL     Tk-Pgplot-0.2.tar.gz             64k  27 Apr 2001
Tk          CTDEAN    Tk-Tree-0.05.tar.gz              12k  13 Jan 1998
Tk          DDUMONT   Tk-Multi-1.003.tar.gz            14k  31 May 1999
Tk          DDUMONT   Tk-ObjEditor-1.001.tar.gz         7k  16 Feb 2001
Tk          DDUMONT   Tk-ObjScanner-1.022.tar.gz        9k  17 Jan 2001
Tk          DDUMONT   Tk-TreeGraph-1.024.tar.gz        14k  03 Apr 2001
Tk          DJBERG    Tk-EMatrix-0.01.tar.gz           10k  19 Jan 2001
Tk          DJBERG    Tk-JListbox-0.02.tar.gz           6k  27 Oct 2000
Tk          DJBERG    Tk-LabPopEntry-0.04.tar.gz        8k  24 Feb 2001
Tk          DJBERG    Tk-PopEntry-0.05.tar.gz           8k  26 Feb 2001
Tk          DKWILSON  Tk-DKW-0.01.tar.gz               38k  03 Jun 1998
Tk          DKWILSON  Tk-DKW-0.02.tar.gz               49k  13 Oct 1999
Tk          DKWILSON  Tk-DKW-0.03.tar.gz               50k  26 Nov 1999
Tk          GSLONDON  textlist_2_0.tar.gz               8k  17 Jan 2000
Tk          GUYDX     Table.tar.gz                     51k  29 Jul 1997
Tk          HJHELGE   Tk-DateEntry-1.3.tar.gz           9k  10 Nov 1999
Tk          HJHELGE   Tk-MListbox-1.09.tar.gz          21k  10 Feb 2000
Tk          HMBRAND   Tk-Clock-0.06.tar.gz              6k  27 Sep 1999
Tk          ILYAZ     Tk-OS2src-1.04.zip              240k  28 May 2001
Tk          KVAIL     Tk-autobind-1.1.tar.gz            3k  01 Sep 2001
Tk          LUSOL     Tk-LockDisplay-1.3.tar.gz        56k  28 Oct 1998
Tk          MAKAROW   Tk-TM-0.53.tar.gz                44k  20 Nov 2000
Tk          NI-S      Tk-HTML-3.002.tar.gz             19k  24 Jan 1998
Tk          NI-S      Tk-JPEG-2.014.tar.gz            0.7M  21 Apr 2000
Tk          NI-S      Tk-PNG-2.005.tar.gz             277k  21 Apr 2000
Tk          NI-S      Tk402.004.tar.gz                2.4M  25 Jan 1998
Tk          NI-S      Tk800.015.tar.gz                3.2M  28 Jul 1999
Tk          NI-S      Tk800.023.tar.gz                3.3M  15 May 2001
Tk          OLIBOU    Tk-SlideShow-0.06.tar.gz         96k  03 Sep 1999
Tk          PVHP      ptkFAQ-0_03.tar.gz              0.8M  23 May 1996
Tk          RCS       Tk-JComboBox-0.01.tar.gz         26k  31 May 2001
Tk          RKIES     Tk-Browser-0.81.tar.gz           19k  15 Jul 2001
Tk          RKIES     Tk-SearchDialog-0.41b.tar.gz      5k  31 May 2001
Tk          RKIES     Tk-SimpleFileSelect-0.63.tar.gz  12k  06 Oct 2001
Tk          RKIES     Tk-Workspace-1.74.tar.gz         53k  20 Sep 2001
Tk          SREZIC    Tk-Autoscroll-1.11.tar.gz         4k  05 May 2001
Tk          SREZIC    Tk-ContextHelp-0.09.tar.gz        9k  13 Sep 2000
Tk          SREZIC    Tk-Date-0.39.tar.gz              17k  21 Nov 2001
Tk          SREZIC    Tk-Enscript-1.05.tar.gz           5k  06 May 2001
Tk          SREZIC    Tk-FontDialog-0.06.tar.gz         7k  23 Sep 1999
Tk          SREZIC    Tk-GBARR-2.05.tar.gz             24k  08 Aug 2001
Tk          SREZIC    Tk-Getopt-0.44.tar.gz            20k  05 Apr 2001
Tk          SREZIC    Tk-HistEntry-0.37.tar.gz          9k  29 Apr 2001
Tk          SREZIC    Tk-PathEntry-2.10.tar.gz          6k  06 May 2001
Tk          SREZIC    Tk-TIFF-0.08.tar.gz              33k  21 Nov 2001
Tk          SREZIC    Tk-XMLViewer-0.13.tar.gz          8k  29 Apr 2001
Tk          SUMMER    Tk-ColourChooser-1.50.tar.gz      7k  05 May 2000
Tk          SUMMER    Tk-MesgBox-1.12.tar.gz            5k  16 Sep 2000
Tk          TJENNESS  Tk-TextANSIColor-0.14.tar.gz      7k  21 Oct 2001
Tk          TOSTI     vstadaf-0.01.tar.gz              10k  24 Feb 1999
Tk          TOSTI     xdbfdump-0.03.tar.gz              7k  24 Feb 1999
Tk          ZENIN     Tk-MenuHash-1.12.tar.gz           4k  22 Mar 1999

论坛徽章:
0
4 [报告]
发表于 2001-12-18 21:36 |只看该作者

谁能用perl TK 做unix下的通用菜单?

原先写过用 tk 实现的通过一个配置文件管理 menu 项目
并可即时更换menu内容的东西
不知道是否需要

论坛徽章:
0
5 [报告]
发表于 2001-12-19 10:58 |只看该作者

谁能用perl TK 做unix下的通用菜单?

非常感谢!!能否贴上来,大家都看一看,或者E-mail to: pi.ke@371.net

论坛徽章:
0
6 [报告]
发表于 2001-12-19 14:39 |只看该作者

谁能用perl TK 做unix下的通用菜单?

这些都是个人开发的TK包,可以方便开发不同类型的软件。
netken,也给我一份吧,billson.yuan@263.net

论坛徽章:
0
7 [报告]
发表于 2001-12-19 17:04 |只看该作者

谁能用perl TK 做unix下的通用菜单?

下面是一部分主要代码
注释能写的都写上了

$menu_ini_filename = 'menu.ini'; # menu 设置文件的位置名称
$ql_ini_filename = 'ql.ini'; # quick launch 设置文件的位置名称
$multi_language_filename = 'language.ini'; # 多语言支持的 文件位置名称

$menu_font_style = '-adobe-helvetica-normal-r-narrow--14-120-55-55-p-70-iso8859';# menu 字体设置
$text_font_style = '-adobe-verdana-normal-r-narrow--14-120-55-55-p-70-iso8859';# text 字体设置
$doc_n = 1; # Document 栏的起始标号
$MAX_DOC = $doc_n+5; # Document 栏的最大标号 , $doc_n + N , N 为想限制的最大document数目

$menu_tearoff = 1; # menu 下可扩展 是否要
%language = ( 'english'=>;0 , 'chinese'=>;1 );
$language = $language{'english'}; # 默认语言选择
@opened_file = undef; # 打开的文件

use Tk;
use Tk::Balloon;
use Tk::NoteBook;

require "me_func.pl"; # 该文件是 函数库

$main_window = MainWindow->;new( '-title'=>;'manEditor!' ); # 设置title
$main_window->;geometry("+0+0" # 调整窗口到 n w

create_ui(); # 调用函数 create_ui

MainLoop; # tk 循环

# create_ui = create user-interface
# 此函数创建了 窗口的个个widget
# 详细介绍见内
sub create_ui {

# 调用 create_frame 可创造几个 frame,整个窗口设计都是用frame来构件的
# create_frame 用法 : create_frame( frame_name , pack_arg );
# 函数直接建立起来几个frame, 并建立了全局变量,就是个个 $frame_name
create_frame(
['menu_frame',q{'-side'=>;'top' , '-expand'=>;0 , '-fill'=>;'x'}],
['ql_frame',q{'-side'=>;'top' , '-expand'=>;0 , '-fill'=>;'x'}],
['doc_frame',q{'-side'=>;'top' , '-expand'=>;1 , '-fill'=>;'both'}],
['status_frame',q{'-side'=>;'bottom' , '-expand'=>;0 , '-fill'=>;'x'}]
);

# 调用函数 get_menu_ini , 格式 : get_menu_ini ( file_name );
# 是读取 file_name 中的内容,然后分析,并返回一个 array ref, 里面有相关数据
$ra_menu = get_menu_ini($menu_ini_filename);
# 调用函数 get_multi_language_support ( file_name );
# 类似get_menu_ini,返回 hash ref
$rh_language = get_multi_language_support($multi_language_filename);

# 建立 menu_bar
$menubar = $menu_frame->;Menu( '-type'=>;'menubar' );
$main_window->;configure( '-menu' =>; $menubar);

# 从这里是建立 menu
my $last_menu; # 此值是保存上次循环中的 menu 名称 , 供下次循环中 menu 下的各个元素使用
my $last_cascade; # 此值是保存上次 menu 下某一可扩展元素,即 cascade 的值,供下次循环中其 cascade 中的元素使用
foreach my $menu_tmp (@$ra_menu) { # 进入循环
unless (ref($menu_tmp)) { # 若该值不是一个 ref , 那么开始写主 menu
$last_menu=$menu_tmp; # 保存此 menu name , 供下一循环中元素使用
if (defined $$rh_language{$menu_tmp}[$language]) { # 判断看 language.ini 中时候有匹配内容
${$menu_tmp} = $menubar->;cascade( '-label'=>;$$rh_language{$menu_tmp}[$language] , '-tearoff'=>;$menu_tearoff ); # 若有,则按照language.ini的设置来显示
} else {
${$menu_tmp} = $menubar->;cascade( '-label'=>;$menu_tmp , '-tearoff'=>;$menu_tearoff ); # 若无,则直接显示其 关键字
}
} else { # 若该值是一个 ref
foreach my $menu_cascade_tmp (@$menu_tmp) { # 开始循环此 ref 指向的匿名 array
unless (ref $menu_cascade_tmp) { # 若ref 指向的匿名 array 中的一个元素不是 ref
if ($menu_cascade_tmp !~ /\t/) { # 若在 此循环中的元素 中找不到\t,就是说 此行不符合 格式规定,那么那就是一个 作用行,即只能有 可显示的内容,但无实际作用
if ($menu_cascade_tmp eq "___&quot { # 若 此 内容 为 ___
${$last_menu}->;separator(); # 则在 menu 内画一个分隔符
} else {
$last_cascade=$menu_cascade_tmp; # 否则 这是一个新的 cascade 的开始
if (defined $$rh_language{$menu_cascade_tmp}[$language]) { # 还是 language.ini 判断
${$last_menu}{$last_cascade} = ${$last_menu}->;cascade( '-label'=>;$$rh_language{$menu_cascade_tmp}[$language] , '-tearoff'=>;0 , '-font'=>;$menu_font_style );
} else {
${$last_menu}{$last_cascade} = ${$last_menu}->;cascade( '-label'=>;$menu_cascade_tmp , '-tearoff'=>;0 , '-font'=>;$menu_font_style );
}
}
} else { # 若在 此循环中的元素 中找到了\t,那么理论上说这个行是符合 command.radiobutton etc.的设计要求的
my($label,$class,$func)=split(/\t/,$menu_cascade_tmp); # 分割此行,分别赋值 $labe=要显示的关键字,$class=此行的类别(command,radiobutton),$func=此命令指向的函数 or radiobuttn 设定的值
if (defined $$rh_language{$label}[$language]) { # language.ini 分析
eval q{${$last_menu}{$label} = ${$last_menu}->;command( '-label'=>;$$rh_language{$label}[$language] , '-font'=>;$menu_font_style , '-command'=>;}.$func.q{ ) if $class eq "cmd";};
} else {
eval q{${$last_menu}{$label} = ${$last_menu}->;command( '-label'=>;$label , '-font'=>;$menu_font_style , '-command'=>;}.$func.q{ ) if $class eq "cmd";};
}
print "Error: $@ \n" if $@ and $DEBUG;
# 此处 的 radiobutton 还没有写好,回头完成
#if ($class eq "radio&quot {
#${$last_menu}->;radiobutton( '-label'=>;$label , '-variable'=>;\${$last_menu}{$label} );
#}
# 到此处
}
} else { # 若ref 指向的匿名array 中的元素是 ref
foreach my $cascade_tmp (@{$menu_cascade_tmp}) { #开始循环读取其中的数据
my($label,$class,$func)=split(/\t/,$cascade_tmp); # 因为设置最多有两层,所以此处不在分析是否是 ref,而直接分析其内容,赋值给 $label,$class,$func
if (defined $$rh_language{$label}[$language]) { # language.ini 分析
eval q{${$last_cascade.'_'.$last_menu}{$label} = ${$last_menu}{$last_cascade}->;command( '-label'=>;$$rh_language{$label}[$language] , '-font'=>;$menu_font_style , '-command'=>;}.$func.q{ ) if $class eq "cmd";};
} else {
eval q{${$last_cascade.'_'.$last_menu}{$label} = ${$last_menu}{$last_cascade}->;command( '-label'=>;$label , '-font'=>;$menu_font_style , '-command'=>;}.$func.q{ ) if $class eq "cmd";};
}
print "Error: $@ \n" if $@ and $DEBUG;
# 此处
#if ($class eq "radio&quot {
#${$last_cascade}->;radiobutton( '-label'=>;$label , '-variable'=>;\${$last_cascade}{$label} );
#}
# 到此处
}
}
}
}
}

# 这里是建立 status 栏
$help_status = $status_frame->;Label( '-relief'=>;'flat' , '-width'=>;30 , '-anchor'=>;'w' )->;pack( '-side'=>;'left' , '-expand'=>;1 , '-fill'=>;'x' ); # 帮助信息
$time_status = $status_frame->;Label( '-text'=>;''.localtime , '-relief'=>;'groove' )->;pack( '-side'=>;'right' , '-expand'=>;0 , '-fill'=>;'x' ); # 时间
$ir_status = $status_frame->;Label( '-text'=>;'In/Re' , '-width'=>;6 , '-relief'=>;'groove' )->;pack( '-side'=>;'right' , '-expand'=>;0 , '-fill'=>;'x' ); # inesrt or replace
$rc_status = $status_frame->;Label( '-text'=>;'R,C: x,y' , '-width'=>;10 , '-relief'=>;'groove' )->;pack( '-side'=>;'right' , '-expand'=>;0 , '-fill'=>;'x' ); # row? col?
$file_status = $status_frame->;Label( '-relief'=>;'groove' , '-anchor'=>;'w' , '-width'=>;16 )->;pack( '-side'=>;'right' , '-expand'=>;0 , '-fill'=>;'x' ); # file info


$ql_frame->;configure( '-relief'=>;'groove' , '-borderwidth'=>;2 ); # config quicklaunch_frame , add attributes : relief , borderwidth

# 调用函数 get_ql_ini ( file_name );返回一个 array ref
$ra_ql = get_ql_ini($ql_ini_filename);

# 下面开始用模块 balloon 做帮助信息
$balloon = $main_window->;Balloon( '-statusbar'=>;$help_status ); # 把状态显示,帮助信息显示 bind 到 status中
# 开始做 balloon , 从 $ra_ql 中得数据
foreach my $r_ql (@$ra_ql) {
if (ref $r_ql) {
my $msg = $$rh_language{$$r_ql[2]}[$language];
$main_window->hoto( 'ql_image_'.$$r_ql[2] , '-file'=>;$$r_ql[0] ); # 引入一个图片,作为 quick launch 的图标

eval q{$ql_button_}.$$r_ql[2].q{ = $ql_frame->;Button( '-image'=>;'ql_image_'.$$r_ql[2] , '-command'=>;$$r_ql[1] , '-height'=>;24 , '-width'=>;24 )->;pack( '-side'=>;'left' , '-fill'=>;'x' ); # 制作一个 quick launch button
$balloon->;attach($ql_button_}.$$r_ql[2].q{, '-balloonmsg'=>;$msg , '-statusmsg'=>;$msg , '-initwait'=>;1000 );}; # 用 balloon :: attach method 来 bind 到 quick launch button 上
print "Error: $@ \n" if $@ and $DEBUG;

} elsif ($r_ql eq "separator&quot { # 分析,若是特殊的 separator , 即 分隔符 信息的话 , 则执行分割操作
$ql_frame->;Label( '-relief'=>;'groove' )->;pack( '-side'=>;'left' , '-expand'=>;0 ); # 建立一个 label 形式的分隔符 ,*有待改进*
}
}

# 这里开始制作 n.o.p 三个 button
$pre_msg = "preview";
$nor_msg = "normal";
$org_msg = "original";
# 因为 $pre_msg,$nor_msg,$org_msg 在后面的 me_func.pl 的 change_language() 中还要用到其原始值,所以后面要做一个新的程序块
{
my $pre_msg = $$rh_language{$pre_msg}[$language] if defined $$rh_language{$pre_msg}[$language];
my $nor_msg = $$rh_language{$nor_msg}[$language] if defined $$rh_language{$nor_msg}[$language];
my $org_msg = $$rh_language{$org_msg}[$language] if defined $$rh_language{$org_msg}[$language];
$pre_button = $ql_frame->;Button( '-text'=>;$pre_msg )->;pack( '-side'=>;'right' , '-expand'=>;0 , '-fill'=>;'x' );
$nor_button = $ql_frame->;Button( '-text'=>;$nor_msg )->;pack( '-side'=>;'right' , '-expand'=>;0 , '-fill'=>;'x' );
$org_button = $ql_frame->;Button( '-text'=>;$org_msg )->;pack( '-side'=>;'right' , '-expand'=>;0 , '-fill'=>;'x' );
}
# 为三个 button 做 bind
$balloon->;attach($pre_button, '-statusmsg'=>;'Preview man Page' , '-initwait'=>;10 );
$balloon->;attach($nor_button, '-statusmsg'=>;'View Normal man Page' , '-initwait'=>;10 );
$balloon->;attach($org_button, '-statusmsg'=>;'View Origional man Page' , '-initwait'=>;10 );


$doc_frame->;configure( '-borderwidth'=>;2 ); # config $doc_frame , Document Frame

$document = $doc_frame->;NoteBook()->;pack( '-side'=>;'top' , '-expand'=>;1 , '-fill'=>;'both' ); # 建立一个 NoteBook

# 用 eval 的方法,可以建立一个新的 document , 并用到了 $doc_n 来作为 doc 标记号码
# 具体实现如下 : $doc1 =  $document->;add('doc1','-label'=>;'...');
# 然后添加一个 Scrolled 的 Text 物件 : $doc1->;Scrolled('Text', '-arg'=>;'set' );
eval q{$doc}.$doc_n.q{ = $document->;add('doc}.$doc_n.q{' , '-label'=>;'Untitled }.$doc_n.q{');
$doc}.$doc_n.q{_text = $doc}.$doc_n.q{->;Scrolled('Text', '-scrollbars'=>;'se' , '-font'=>;$text_font_style )->;pack( '-side'=>;'top' , '-expand'=>;1 , '-fill'=>;'both' );};
print "Error: $@ \n" if $@ and $DEBUG;

$main_window->;OnDestroy(sub { $balloon->;destroy; }); # 若窗口关闭,则消除 Balloon

};

sub get_menu_ini {
# 从 文件 中读信息,转换为 array 数据
my $file = pop;
my @menu;
open(MENU,&quot;<$file&quot;
while(<MENU> {
chomp;next if /^#/;next if /^\s+/;next if /^$/; # 若为#开头,空行则读下一行
if (/^\[([\w\s]+)\]$/) { # 若以 [] 为标记的内容 , 则确认为一个新 menu 的开始
my $menu_title = $1; # 设置 menu_title 为 []中匹配的值
$menu[@menu]=$menu_title; # @menu为现在 array @menu的长度,$menu[@menu] 则为 @menu 中的下一元素 , 赋 $menu_title , 功效同 push(@menu,$menu_title);
while (<MENU> { # 进入设置 menu 中第一层元素
chomp;next if /^#/;next if /^\s+/;next if /^$/;
last if /^\[\/$menu_title\]/; # 若以[/..]开头,则返回
if (/^\(([\w\s]+)\)$/) { # 若以 () 为标记内容,则确认为一个 menu 中新的一层的开始
my $cascade_title = $1; # 把新层名定为 $cascade_title , 为 () 中匹配内容
$menu[@menu][0]=$cascade_title; # 设置 array @menu 中 一个新的元素 为一个array,这个@$menu[n]中,n = @menu中最后一个元素 , 在这个基础 再加深一层关系
while (<MENU> { # 进入到 menu 中新一层的新一层
chomp;next if /^#/;next if /^\s+/;next if /^$/;
last if /^\(\/$cascade_title\)$/; # 若(/..) 返回
$menu[@menu][0][0]=$_; # 这次加深了两层关系 , @menu 一直都在增长,因此不会出现重复的
}
next;
}
$menu[@menu][0]=$_; # 这里是 menu 的基本元素
}
}
}
return \@menu; # 返回 array ref
};

sub get_ql_ini {
my $file = pop;
my @quicklaunch;
my $length=@quicklaunch;
open(MENU,&quot;<$file&quot;);
while (<MENU>;) {
chomp;
next if /^#/;
next if /^\s+/;
next if /^$/;
if (/^separator/) {
$quicklaunch[$length] = $_;
} else {
($quicklaunch[$length][0],$quicklaunch[$length][1],$quicklaunch[$length][2]) = split(/\t/);
}
$length++;
}
return \@quicklaunch;
};

sub get_multi_language_support {
my $file = pop;
my %language;
open(DATA,&quot;<$file&quot;);
while (<DATA>;) {
chomp;
next if /^#/;
next if /^\s+/;
next if /^$/;
my($root,@lang) = split(/\t/);
my $i=0;
foreach my $tmp (@lang) {
$language{$root}[$i++] = $tmp;
}
}
close(DATA);
return \%language;
};

sub create_frame {
foreach my $arg_frame (@_) {
${$$arg_frame[0]} = $main_window->;Frame( '-width'=>;600 );
eval '$'.$$arg_frame[0].'->;pack('.$$arg_frame[1].');';
print &quot;Error: $@ \n&quot; if $@ and $DEBUG;
}
};

论坛徽章:
0
8 [报告]
发表于 2001-12-21 17:42 |只看该作者

谁能用perl TK 做unix下的通用菜单?

多谢多谢!!我会试一下,需要先下一个for sco的TK.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP