社区
C++ Builder
帖子详情
关于treeview,如何根据显示的文本找到该节点Node?谢谢!!!
wxcnl
2003-08-24 02:05:34
关于treeview,如何根据显示的文本找到该节点Node?谢谢!!!
...全文
41
1
打赏
收藏
关于treeview,如何根据显示的文本找到该节点Node?谢谢!!!
关于treeview,如何根据显示的文本找到该节点Node?谢谢!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hzhxxx
2003-08-24
打赏
举报
回复
int TfrmNEManager::FindTreeNodeOnData(TTreeNodes *Tree,AnsiString &Data)
{
//根据唯一的 data 项目查找对应的唯一节点
TTreeNode * CurrItem = Tree->GetFirstNode();
if(CurrItem)
{
do
{
// if(CurrItem->Data)
// {
//if(AnsiString(((TInfo*)(CurrItem->Data))->type) == Data)
if (CurrItem->Text == Data
{
return CurrItem->AbsoluteIndex;
}
// }
CurrItem = CurrItem->GetNext();
}while(CurrItem);
}
return -1;
}
调用:
int absindex;
absindex = FindTreeNodeOnData(tvAllNE->Items,AnsiString(type));
if (absindex != -1)
{
TTreeNode * node = tvAllNE->Items->Item[absindex];
一个Delphi
TreeView
节点
添加、删除操作实例.rar
一个Delphi
TreeView
节点
添加、删除操作实例,删除
节点
时请确认主
节点
内没有子
节点
,请删除全部子
节点
后再删除,相关代码: addtxt:=trim(e1.text); //删除空格后得到添加
节点
的
文本
addtxtlength:=length(addtxt); //得到添加
节点
的字符数
node
text:=trim(hometrv.selected.Text); //得到所选
节点
的
文本
删除空格 restr:=length(
node
text); //得到所选
节点
文本
字符数
emacs-
treeview
:用于树导航的抽象Emacs Lisp框架
emacs树视图 用于树导航的抽象Emacs Lisp框架。 基于此框架,可以实现用于特定层次数据的特定库,例如文件系统。 典型的树可能如下所示: [+]
Node
1 [-]
Node
2 | [+]
Node
21 | [+]
Node
22 | [-]
Node
23 | | [+]
Node
231 | | Leaf 231 | | Leaf 232 | | Leaf 233 | [+]
Node
24 [+]
Node
3 [+]
Node
4 每个
节点
都有一个“标签”。 非叶
节点
也具有“控件”。 标签是表示
节点
的
文本
。 控件是标签前面的可单击
文本
,它允许用户折叠或展开
节点
。 没有子
节点
的
节点
通常没有
从新手小白进入WinForm编程 (VS2019)
WinForm框架 是 Windows Form 的简称,是美国微软公司Microsoft开发基于 .NET Framework 平台的桌面运用程序框架,一般使用 C#语言 编写。 WinForm框架可用于设计窗体和可视控件,采用面向对象语言C#,可快速创建绚丽漂亮的基于Windows的桌面应用程序,提供丰富的控件与第三方开源组件,依靠.Net平台的成熟生态,让开发者可以高效快速的开发企业级项目!本课程是黄老师的 .Net平台开发系列课程之一,通过WinForm框架控件与精炼知识点的梳理与细致讲解,结合代码实战演练,帮助学员迅速掌握WinForm开发,达到企业级WinForm开发的水平!
高校医务收费系统数据库设计说明书
第五部分、操作人员管理设计说明 操作人员维护模块的运行界面如图18所示 图18 操作人员维护界面 操作人员管理系统主要是用来管理对该软件进行操作的工作人员,同时系统所提供的用户权限设置能够提高系统的安全性,并对不同性质的人员给予不同的权限 5.1程序描述 主窗体的代码不是很复杂,界面设计主要是利用了树型控件来实现的 程序模块名称:frmsq; 重要控件:
TreeView
、图像列表Imagelist等; 相关数据库表:user_load。 该窗体主要实现增加用户、删除用户、对用户进行授权,主要是面向管理人员对操作人员的操作进行管理,满足不同层次的人员对系统不同的需求。 5.2功能 操作人员管理系统主要是用来管理对该软件进行操作的工作人员,同时系统所提供的用户权限设置能够提高系统的安全性,并对不同性质的人员给予不同的权限,为了方便集中管理数据库表和数据源,我们把数据库的连接放到Global.bas模块中,应用ADO接口技术直接和SQL Server 2000数据库服务器建立连接。 5.3性能 精 度:通过鼠标点击或快捷键进入子模块,对在
文本
框内输入的大小写敏感,姓名和密码都区分大小写 灵 活 性:用户鼠标点击可以进行确认,按E键表示关闭当前窗口; 时间特性:用户输入后的验证时间在1秒之内; 5.4输人项 通过鼠标点击或快捷键。用户输入的姓名,密码字符信息;这些信息由系统管理员管理,存储在数据库表中 5.5输出项 提示信息为信息符号,参考的输出结果如图19,在屏幕上
显示
一个对话框: 图19:一个
显示
删除管理员的对话框信息 5.6算法 该窗体主要实现对用户授权,用户的授权是采用0,1编码来实现的。如果该用户拥有某项权限,则该权限为1;反之,则为0。 5.7流程逻辑 登录组件的逻辑流程如下: 图20:操作人员维护模块数据流程图 5.8接口 接口设计包括组件提供给外部的接口和对数据访问组件的调用接口,这些接口构成了该ActiveX 控件实现的内容,该窗体主要实现增加用户、删除用户、对用户进行授权,主要是面向管理人员对操作人员的操作进行管理,满足不同层次的人员对系统不同的需求。 Private SubCommand3_Click () '删除操作人员的命令按钮 '
显示
对话框,是否删除操作人员 t = MsgBox("你是否确定删除该操作员!", vbOKCancel, "确定吗?") If t = 1 Then '如果返回1,则进行删除操作 '判断是否有记录,如果没有记录,则提示选择操作人员 If rsdel.BOF = True Or rsdel.EOF = True Then t = MsgBox("请选择操作员姓名!", vbOKOnly, "无记录") Else '否则进行删除,并
显示
成功删除操作人员对话框 rsdel.Delete t = MsgBox("成功删除操作员姓名!", vbOKOnly, "成功") End If tvwdb.
Node
s.Clear '清除
TreeView
中
节点
的内容 tvwdb.Sorted = True '设置sorted属性为真 Set m
node
= tvwdb.
Node
s.Add() m
node
.Text = "操作员姓名" '
节点
显示
“操作员姓名” m
node
.Image = 2 '设置
节点
的图表为imagelist1中的图2 Set rspsw = New ADODB.Recordset rspsw.open"select*from user_load",cn,adOpenStatic,adLockPessimistic Do Until rspsw.EOF '用rspsw中的记录对
treeview
进行加载 Set m
node
= tvwdb.
Node
s.Add(1, tvwChild) '添加
treeview
的孩子 m
node
.Text = rspsw.Fields("user_name") '使其
文本
为rspsw字段中的用户名 m
node
.Image = 1 '设置
节点
的图表为imagelist1中的图1 rspsw.MoveNext '记录往后移动一条 Loop Else Exit Sub End If '将用户数据库表中的用户名加载到
treeview
控件中 Private SubPrivate Sub load
treeview
() tvwdb.Sorted = True '将
treeview
的排序设为真 Set m
node
= tvwdb.
Node
s.Add() m
node
.Text = "操作员姓名" '
节点
显示
“操作员姓名” m
node
.Image = 2 '设置
节点
的图表为imagelist1中的图2 If cn.State = 1 Then Else Call condatabase '连接数据库 End If Set rspsw = New ADODB.Recordset '打开rspsw记录集 rspsw.open "select * from user_load", cn, adOpenStatic, adLockPessimistic Do Until rspsw.EOF '用rspsw中的记录对
treeview
进行加载 Set m
node
= tvwdb.
Node
s.Add(1, tvwChild) '添加
treeview
的孩子 m
node
.Text = rspsw.Fields("user_name") '使其
文本
为rspsw字段中的用户名 m
node
.Image = 1 '设置
节点
的图表为imagelist1中的图1 rspsw.MoveNext '记录往后移动一条 Loop End Sub Private Sub Form_Load() '窗体加载过程 Call load
treeview
'调用load
treeview
过程 End Sub Private Sub tvwdb_
Node
Click(ByVal
Node
As MSComctlLib.
Node
) '处理
node
click事件 If
Node
.Index = 1 Then '如果只有一个根
节点
,则退出程序 Exit Sub End If Call check_condatabase '检查是否连接数据库,如果连接了则放弃,否则连接 If
Node
.Parent.Index = 1 Then '是根
节点
node
name =
Node
.Text '将删除的变量赋值给
node
name Set rsdel = New ADODB.Recordset '获得该
节点
的用户名的所有资料 rsdel.open "select * from user_load where user_name='" &
node
name & "'", cn, _ adOpenStatic, adLockPessimistic End If End Sub 5.9存储分配 本程序在高级语言Visual Basic进行编码,直接的内存分配由VB运行时分配。 本组件内所依赖的变量、结构要求全部在组件元素内申明。 5.10注释设计 本部分代码的实现,应按照该注释规范来进行。 5.11限制条件 控件所依赖的的ActriveX DLL prjDBACCESS必须存在。 该控件在使用的时候,必须经过注册,并且在运行时,客户端程序必须安装有VB运行时的动态连接库。 在运行时,用户端的计算机必须有鼠标或触摸板等点输入设备。 5.12测试计划 本模块的输入基本有鼠标点击来完成,不需要特殊的测试用例,在增加管理员是具体的测试用例和登录测试用例相同,这里不再一一例举。 5.13尚未解决的问题 本模块的没有尚未解决的问题。
DELPHI TXT 树文档 管理器
unit
TreeView
Functions; interface uses Windows, Messages, SysUtils, Variants, Classes, ComCtrls, Controls, Forms, FileCtrl, StrUtils, Masks, Vcl.OleCtrls, SHDocVw, IOUtils; procedure Save
TreeView
ExplandState(
TreeView
: T
TreeView
; FileName: string); procedure Load
TreeView
ExplandState(
TreeView
: T
TreeView
; FileName: string); function ExtractNewFolderPath(FileName: string; NewText: string): string; procedure HideHideHorizontalScrollBar(
TreeView
: T
TreeView
); function IsEmptyDir(sDir: String): Boolean; function AttachMentsExists(FileName: String): Boolean; procedure SetIcons(
TreeView
: T
TreeView
; list: TStringList); procedure EnumText(s: string; aItem: TTree
Node
); function AttachmentsFolder(FileName: String): string; function Extract
Node
FullPath(
TreeView
: T
TreeView
): string; function Get_
node
_path(
node
: TTree
Node
): string; function Extract
TreeView
FileName(RootPath: string;
TreeView
: T
TreeView
): string; /// ///
Node
.Selected := true;
Node
.Focused := true; /// /// ///
Node
.Selected := true;
Node
.Focused := true; /// /// ///
Node
.Selected := true;
Node
.Focused := true; /// function OpenFile(Path: string; RichEdit: TRichEdit;
TreeView
: T
TreeView
) : Boolean; overload; function OpenFile(Path: string; Webbrowser: TWebbrowser;
TreeView
: T
TreeView
) : Boolean; overload; procedure GetDirectories(Tree: T
TreeView
; Directory: string; Item: TTree
Node
; IncludeFiles: Boolean); procedure DirTo
TreeView
(Tree: T
TreeView
; Directory: string; Root: TTree
Node
; IncludeFiles: Boolean; FileExt: string); procedure QSetPerpoty(
TreeView
: T
TreeView
); function ItemExist(Text: string;
TreeView
: T
TreeView
): Boolean; function RemoveDirs(folderPath: string): Boolean; function __RenameFile(OldName: string; Title: string): Boolean; function RenameFolder(filePath: string; Title: string): Boolean; var list: TStringList; implementation { // "D:\C++Builder学习大全中文版\index.htm" // "D:\C++Builder学习大全中文版\" // "index_files" // "D:\C++Builder学习大全中文版\index_files" var s, s1, s2: string; begin s := 'D:\C++Builder学习大全中文版\index.htm'; s1:=ExtractNewFolderPath(s,'_files'); s2 := ExtractNewFolderPath(s, '_AttachMents'); Memo1.lines.Add(s); Memo1.Lines.Add(s1); Memo1.lines.Add(s2); end; } function ExtractNewFolderPath(FileName: string; NewText: string): string; var _filesFolder: string; // "D:\C++Builder学习大全中文版\" _filesFolderName: string; // "index_files" _filesFolderPath: String; begin _filesFolder := ExtractFilePath(FileName); _filesFolderName := ChangeFileExt(ExtractFileName(FileName), '') + NewText; _filesFolderPath := _filesFolder + _filesFolderName; Result := _filesFolderPath; end; { Save
TreeView
ExplandState(
TreeView
1,'
TreeView
.txt'); } procedure Save
TreeView
ExplandState(
TreeView
: T
TreeView
; FileName: string); var list: TStringList; i: Integer; begin list := TStringList.Create; With
TreeView
do begin for i := 0 to Items.Count - 1 do begin if Items.Item[i].Expanded then list.Add(IntToStr(i)); end; list.Add(IntToStr(Selected.AbsoluteIndex)); end; list.SaveToFile(FileName); list.free; end; { Load
TreeView
ExplandState(
TreeView
1, 'abc.txt'); } procedure Load
TreeView
ExplandState(
TreeView
: T
TreeView
; FileName: string); var list: TStringList; i: Integer;
node
: TTree
Node
; begin list := TStringList.Create; with list do begin list.LoadFromFile(FileName); for i := 0 to Count - 2 do // 最后一行放的是最后选中的那个
节点
索引 begin
TreeView
.Items[StrToInt(list[i])].Expand(False); end;
node
:=
TreeView
.Items[StrToInt(list[Count - 1])];
TreeView
.Select(
TreeView
.Items[StrToInt(list[Count - 1])], []); //
node
.Selected := True; //
node
.Focused := True;
TreeView
.SetFocus;
TreeView
.Focused; free; end; end; { FUNCTION ulong ShowScrollBar(ulong hwnd,ulong wBar,ulong bShow) LIBRARY "user32.dll" constant long SB_HORZ = 0 constant long SB_VERT = 1 constant long SB_BOTH = 3 } procedure HideHideHorizontalScrollBar(
TreeView
: T
TreeView
); begin // no responed NEW FORM TEST // ShowScrollBar(
TreeView
.Handle,SB_HORZ,False); end; // procedure // begin // { 当拖拽的高度不够的时候自动滚动滚动条 } // with
TreeView
1 do // begin // if (Y < 15) then // SendMessage(Handle, WM_VSCROLL, SB_LINEUP, 0) // else if (Height - Y < 15) then // SendMessage(Handle, WM_VSCROLL, SB_LINEDOWN, 0); // end; // end; { 返回 附件文件夹 "D:\C++Builder学习大全中文版\新建
文本
文档.htm" D:\C++Builder学习大全中文版\新建
文本
文档_Attachments } function AttachmentsFolder(FileName: String): string; begin Result := ExtractFilePath(FileName) + ChangeFileExt(ExtractFileName(FileName), '') + '_Attachments'; end; function AttachMentsExists(FileName: String): Boolean; var f: string; begin f := ExtractFilePath(FileName) + ChangeFileExt(ExtractFileName(FileName), '') + '_Attachments'; Result := DirectoryExists(f); end; procedure EnumText(s: string; aItem: TTree
Node
); var
node
: TTree
Node
; str: string; begin
node
:= aItem; while
node
nil do begin if s = '' then str :=
node
.Text else str := s + '\' +
node
.Text; list.Add(str); /// ////////////////////////// if
node
.HasChildren then EnumText(str,
node
.getFirstChild);
node
:=
node
.getNextSibling; end; end; function IsEmptyDir(sDir: String): Boolean; var sr: TSearchRec; begin Result := True; if Copy(sDir, Length(sDir) - 1, 1) '\' then sDir := sDir + '\'; if FindFirst(sDir + '*.*', faAnyFile, sr) = 0 then repeat if (sr.Name '.') and (sr.Name '..') then begin Result := False; break; end; until FindNext(sr) 0; FindClose(sr); end; { 是文件 夹的设置为1 是文件 的设置为 2 } procedure SetIcons(
TreeView
: T
TreeView
; list: TStringList); var i: Integer; begin with
TreeView
do begin for i := 0 to Items.Count - 1 do begin if DirectoryExists(list.Strings[i]) then begin Items[i].ImageIndex := 0; Items[i].SelectedIndex := 0; Items[i].StateIndex := 0; end; if FileExists(list.Strings[i]) then begin Items[i].ImageIndex := 1; Items[i].SelectedIndex := 1; Items[i].StateIndex := 1; end; if (AttachMentsExists(list.Strings[i])) then if not IsEmptyDir(AttachmentsFolder(list.Strings[i])) then begin // Form1.Memo1.LINES.Add( AttachmentsFolder(list.Strings[i])); Items[i].ImageIndex := 2; Items[i].SelectedIndex := 2; Items[i].StateIndex := 2; end; end; end; end; procedure QSetPerpoty(
TreeView
: T
TreeView
); begin with
TreeView
do begin // Align := alBottom; // Anchors := [akLeft, akTop, akBottom, akRight]; Items.Clear; // BorderStyle := bsNone; Cursor := crHandPoint; ReadOnly := True; ShowHint := True; RowSelect := True; ShowButtons := True; ShowRoot := True; ShowLines := False; SortType := stText; HideSelection := False; RightClickSelect := True; DragMode := dmAutomatic; // Color := RGB(238, 243, 246); end; end; { 实际重命名 C:\windows\test.txt C:\windows\csadsajas.txt MoveFile(PChar('C:\1.txt'),PChar('C:\ABC.txt')); if not __RenameFile('C:\tree.txt','
TreeView
') then Application.MessageBox('重命名文件失败','重命名',MB_ICONERROR); } { 重命名文件 } function __RenameFile(OldName: string; Title: string): Boolean; var NewName: string; begin NewName := Format('%s%s%s', [ExtractFilePath(OldName), Title, ExtractFileExt(OldName)]); Result := MoveFile(PChar(OldName), PChar(NewName)); end; // 重命名文件夹 // RenameFolder('C:\1\','2'); // MoveFile('C:\1','C:\2'); // MoveFile('C:\1\','C:\2\'); function RenameFolder(filePath: string; Title: string): Boolean; var s, s1: string; begin // filePath:='C:\Windows\System32\'; // s = ExtractFileDir(filepath) = 'C:\Windows\System32' s := ExtractFileDir(filePath); // s1 = ExtractFileDir(s) = 'C:\Windows' // s1 ='C:\Windows' +'\'+ titles s1 := ExtractFileDir(s) + '\' + Title; Result := MoveFile(PChar(s), PChar(s1)); end; { IOUtils } function RemoveDirs(folderPath: string): Boolean; begin Result := False; if TDirectory.IsEmpty(folderPath) then begin TDirectory.Delete(folderPath); Result := True; end else begin if Application.MessageBox('确定要删除这个文件夹吗? 删除后无法恢复!', '提示', MB_ICONQUESTION + MB_YESNO) = ID_YES then begin TDirectory.Delete(folderPath, True); Result := True; end; end; // if TDirectory.Exists(folderPath) then // begin // Application.MessageBox('删除文件失败'+#13#10+'文件正确被使用?','错误',MB_ICONERROR+MB_OK); // Result:=False; // end; end; { if not ItemExist('Edit1.Text',
TreeView
1) then
TreeView
1.Items.AddChild(
Treeview
1.Selected,'Edit1.Text'); } function ItemExist(Text: string;
TreeView
: T
TreeView
): Boolean; var i: Integer; begin Result := False; if (Trim(Text) '') then begin for i := 0 to
TreeView
.Items.Count - 1 do if Trim(Text) = Trim(
TreeView
.Items[i].Text) then begin Result := True; Exit; end; end; Result := False; end; // ------------------------------------------------------------------------------ {
TreeView
获得选中的完整路径 aaaa\ssss\bbbb } function Extract
Node
FullPath(
TreeView
: T
TreeView
): string; var Path: string; Parent: TTree
Node
; //
Node
: TTree
Node
; begin Path :=
TreeView
.Selected.Text; Parent :=
TreeView
.Selected.Parent; while Parent nil do begin Path := Parent.Text + '\' + Path; Parent := Parent.Parent; end; Result := Path; end; function Get_
node
_path(
node
: TTree
Node
): string; var Path: string; Tree
Node
: TTree
Node
; begin Path :=
node
.Text; Tree
Node
:=
node
.Parent; while Tree
Node
nil do begin Path := Tree
Node
.Text + '\' + Path; Tree
Node
:= Tree
Node
.Parent; end; Result := Path; end; { 获得文件完整路径 C:\abc\int.cpp } function Extract
TreeView
FileName(RootPath: string;
TreeView
: T
TreeView
): string; var FileName: string; begin Result := ''; if
TreeView
.Selected = nil then Exit; FileName := RootPath + Extract
Node
FullPath(
TreeView
); // 当前选中的文件名 if not FileExists(FileName) then Exit; Result := FileName; end; { 用RICHEDIT打开
TREEVIEW
中的文件 } function OpenFile(Path: string; RichEdit: TRichEdit;
TreeView
: T
TreeView
) : Boolean; overload; var FileName: string; begin Result := False; FileName := Extract
TreeView
FileName(Path,
TreeView
); if FileExists(FileName) then begin RichEdit.Lines.LoadFromFile(FileName); Result := True; end end; function OpenFile(Path: string; Webbrowser: TWebbrowser;
TreeView
: T
TreeView
) : Boolean; overload; var FileName: string; begin Result := False; FileName := Extract
TreeView
FileName(Path,
TreeView
); if FileExists(FileName) then begin Webbrowser.Navigate(FileName); Result := True; end end; { 将1个目录里面所有的文件添加到
TREEVIEW
中 GetDirectories(
TreeView
1, 'D:\DATA', nil, True); } procedure GetDirectories(Tree: T
TreeView
; Directory: string; Item: TTree
Node
; IncludeFiles: Boolean); var SearchRec: TSearchRec; ItemTemp: TTree
Node
; begin Tree.Items.BeginUpdate; if Directory[Length(Directory)] '\' then Directory := Directory + '\'; if FindFirst(Directory + '*.*', faDirectory, SearchRec) = 0 then begin repeat if (SearchRec.Attr and faDirectory = faDirectory) and (SearchRec.Name[1] '.') then begin if (SearchRec.Attr and faDirectory > 0) then Item := Tree.Items.AddChild(Item, SearchRec.Name); ItemTemp := Item.Parent; GetDirectories(Tree, Directory + SearchRec.Name, Item, IncludeFiles); Item := ItemTemp; end else if IncludeFiles then if SearchRec.Name[1] '.' then Tree.Items.AddChild(Item, SearchRec.Name); until FindNext(SearchRec) 0; FindClose(SearchRec); Tree.Items.EndUpdate; end; end; { 将1个目录里面所有的文件添加到
TREEVIEW
中 DirTo
TreeView
(
TreeView
1,'D:\Data\',nil,True,'.cpp'); } procedure DirTo
TreeView
(Tree: T
TreeView
; Directory: string; Root: TTree
Node
; IncludeFiles: Boolean; FileExt: string); var SearchRec: TSearchRec;
Node
1: TTree
Node
; begin with Tree.Items do begin BeginUpdate; if Directory[Length(Directory)] '\' then Directory := Directory + '\'; if FindFirst(Directory + '*.*', faDirectory, SearchRec) = 0 then begin Application.ProcessMessages; repeat { 添加文件夹 } if (SearchRec.Attr and faDirectory = faDirectory) and (SearchRec.Name[1] '.') then begin if SameText(RightStr(SearchRec.Name, 12), '_AttachMents') then // 不添加 _AttachMents这个文件夹 Continue; if (SearchRec.Attr and faDirectory > 0) then Root := AddChild(Root, SearchRec.Name);
Node
1 := Root.Parent; DirTo
TreeView
(Tree, Directory + SearchRec.Name, Root, IncludeFiles, FileExt); Root :=
Node
1; end else if IncludeFiles then { 添加文件 } if SearchRec.Name[1] '.' then { .TXT .txt .TxT .tXT 为一样的 } if SameText(RightStr(SearchRec.Name, 4), FileExt) then { 只添加 .CPP格式文件 } AddChild(Root, SearchRec.Name); until FindNext(SearchRec) 0; FindClose(SearchRec) end; EndUpdate; end; end; end.
C++ Builder
13,825
社区成员
102,679
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章