Skip to content

Commit e3b4740

Browse files
committed
feat: 使用文件树组件
1 parent c06ef7c commit e3b4740

File tree

2 files changed

+123
-33
lines changed

2 files changed

+123
-33
lines changed

docs-java/start/basic/server-dir-structure.md

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,50 @@ title: 服务端结构
33
sidebar_position: 3
44
---
55

6+
import FileTree from '@site/src/components/FileTree';
7+
68
# 服务端结构
79

810
我们先来简单看一眼 插件端 的文件夹结构 (以 Purpur 为例):
911

10-
<!-- Use c to highlight comments -->
11-
```c
12-
├─assets // 储存 Minecraft 音效贴图等重要文件,不要乱动
13-
├─cache // 缓存文件夹,一般放置 Minecraft 原版服务器
14-
├─config // Paper fork 服务器特有的配置文件,用于放置 Paper 的配置文件
15-
├─crash-reports // 存放服务器崩溃的完整报告
16-
├─libraries // 存放服务器及部分插件的依赖库
17-
├─logs // 存放服务端日志的文件夹
18-
├─plugins // 存放插件的文件夹
19-
├─versions // 存放对应版本需要的依赖 jar
20-
├─world // 主世界文件夹
21-
│ ├─advancements // 成就文件夹
22-
│ ├─data // 世界数据文件夹
23-
│ ├─datapacks // 数据包
24-
│ │ └─bukkit
25-
│ ├─entities // 实体数据
26-
│ ├─playerdata // 玩家数据
27-
│ ├─poi // 兴趣点数据
28-
│ ├─region // 区块数据
29-
│ └─stats // 统计信息
30-
├─world_nether // 地狱世界文件夹
31-
│ └─DIM-1
32-
│ ├─data
33-
│ ├─entities
34-
│ ├─poi
35-
│ └─region
36-
└─world_the_end // 末地世界文件夹
37-
└─DIM1
38-
├─data
39-
├─entities
40-
├─poi
41-
└─region
42-
```
12+
<FileTree>
13+
<FileTree.Folder name="assets" comment="储存 Minecraft 音效贴图等重要文件,不要乱动" />
14+
<FileTree.Folder name="cache" comment="缓存文件夹,一般放置 Minecraft 原版服务器" />
15+
<FileTree.Folder name="config" comment="Paper fork 服务器特有的配置文件,用于放置 Paper 的配置文件" />
16+
<FileTree.Folder name="crash-reports" comment="存放服务器崩溃的完整报告" />
17+
<FileTree.Folder name="libraries" comment="存放服务器及部分插件的依赖库" />
18+
<FileTree.Folder name="logs" comment="存放服务端日志的文件夹" />
19+
<FileTree.Folder name="plugins" comment="存放插件的文件夹" />
20+
<FileTree.Folder name="versions" comment="存放对应版本需要的依赖 jar" />
21+
<FileTree.Folder name="world" comment="主世界文件夹">
22+
<FileTree.Folder name="advancements" comment="成就文件夹" />
23+
<FileTree.Folder name="data" comment="世界数据文件夹" />
24+
<FileTree.Folder name="datapacks" comment="数据包">
25+
<FileTree.Folder name="bukkit" />
26+
</FileTree.Folder>
27+
<FileTree.Folder name="entities" comment="实体数据" />
28+
<FileTree.Folder name="playerdata" comment="玩家数据" />
29+
<FileTree.Folder name="poi" comment="兴趣点数据" />
30+
<FileTree.Folder name="region" comment="区块数据" />
31+
<FileTree.Folder name="stats" comment="统计信息" />
32+
</FileTree.Folder>
33+
<FileTree.Folder name="world_nether" comment="地狱世界文件夹">
34+
<FileTree.Folder name="DIM-1">
35+
<FileTree.Folder name="data" />
36+
<FileTree.Folder name="entities" />
37+
<FileTree.Folder name="poi" />
38+
<FileTree.Folder name="region" />
39+
</FileTree.Folder>
40+
</FileTree.Folder>
41+
<FileTree.Folder name="world_the_end" comment="末地世界文件夹">
42+
<FileTree.Folder name="DIM1">
43+
<FileTree.Folder name="data" />
44+
<FileTree.Folder name="entities" />
45+
<FileTree.Folder name="poi" />
46+
<FileTree.Folder name="region" />
47+
</FileTree.Folder>
48+
</FileTree.Folder>
49+
</FileTree>
4350

4451
对于类似 Catserver 的混合服务器,文件夹结构是类似的,基本就多了 `/mods` 文件夹,少了 Bukkit 的下游服务器特有的配置 (如 `purpur.yml` 等)。
4552

src/components/FileTree/index.tsx

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import React, { useState } from 'react';
2+
import { FolderOpenOutlined, FolderOutlined, FileOutlined, FileTextOutlined } from '@ant-design/icons';
3+
import clsx from 'clsx';
4+
5+
interface FileTreeProps {
6+
children: React.ReactNode;
7+
className?: string;
8+
}
9+
10+
interface ItemProps {
11+
name: string;
12+
comment?: string;
13+
children?: React.ReactNode;
14+
defaultOpen?: boolean;
15+
}
16+
17+
const FileTreeContext = React.createContext<{ level: number }>({ level: 0 });
18+
19+
export function FileTree({ children, className }: FileTreeProps) {
20+
return (
21+
<div className={clsx("border border-border rounded-lg bg-surface-1/30 p-4 font-mono text-sm overflow-x-auto", className)}>
22+
<FileTreeContext.Provider value={{ level: 0 }}>
23+
<div className="flex flex-col gap-1">
24+
{children}
25+
</div>
26+
</FileTreeContext.Provider>
27+
</div>
28+
);
29+
}
30+
31+
function Folder({ name, comment, children, defaultOpen = true }: ItemProps) {
32+
const { level } = React.useContext(FileTreeContext);
33+
const [isOpen, setIsOpen] = useState(defaultOpen);
34+
35+
return (
36+
<div className="flex flex-col">
37+
<div
38+
className="flex items-center gap-2 py-1 hover:bg-surface-2/50 rounded cursor-pointer select-none"
39+
style={{ paddingLeft: `${level * 1.5}rem` }}
40+
onClick={() => setIsOpen(!isOpen)}
41+
>
42+
<span className="text-text-secondary">
43+
{isOpen ? <FolderOpenOutlined /> : <FolderOutlined />}
44+
</span>
45+
<span className="font-medium text-text-primary">{name}</span>
46+
{comment && <span className="text-text-muted text-xs ml-2">// {comment}</span>}
47+
</div>
48+
{isOpen && children && (
49+
<FileTreeContext.Provider value={{ level: level + 1 }}>
50+
<div className="flex flex-col gap-1 border-l border-border/30 ml-[calc(0.5rem+3px)]">
51+
{/* Adjust margin to align with the folder icon center roughly, or just use padding */}
52+
{/* Actually, the level padding in children handles indentation.
53+
But to draw lines, we might need more complex CSS.
54+
For now, let's stick to simple indentation. */}
55+
{children}
56+
</div>
57+
</FileTreeContext.Provider>
58+
)}
59+
</div>
60+
);
61+
}
62+
63+
function File({ name, comment }: ItemProps) {
64+
const { level } = React.useContext(FileTreeContext);
65+
66+
return (
67+
<div
68+
className="flex items-center gap-2 py-1 hover:bg-surface-2/50 rounded select-text"
69+
style={{ paddingLeft: `${level * 1.5}rem` }}
70+
>
71+
<span className="text-text-secondary">
72+
<FileTextOutlined />
73+
</span>
74+
<span className="text-text-primary">{name}</span>
75+
{comment && <span className="text-text-muted text-xs ml-2">// {comment}</span>}
76+
</div>
77+
);
78+
}
79+
80+
FileTree.Folder = Folder;
81+
FileTree.File = File;
82+
83+
export default FileTree;

0 commit comments

Comments
 (0)