10 KiB
10 KiB
贡献者
感谢所有为 PPanel 项目做出贡献的开发者!
项目贡献者
PPanel 是一个开源项目,我们欢迎并感谢所有形式的贡献,包括但不限于:
- 💻 代码贡献
- 📝 文档改进
- 🐛 Bug 报告
- 💡 功能建议
- 🌍 翻译工作
- ⭐ Star 和推广
核心贡献者
<script setup> import { ref, onMounted } from 'vue' const backendContributors = ref([]) const frontendContributors = ref([]) const backendLoading = ref(true) const frontendLoading = ref(true) onMounted(async () => { // 获取后端相关仓库的贡献者 try { const repos = ['server', 'ppanel', 'ppanel-node', 'subscription-template'] const contributorsMap = new Map() for (const repo of repos) { const response = await fetch(`https://api.github.com/repos/perfect-panel/${repo}/contributors`) if (response.ok) { const contributors = await response.json() contributors.forEach(contributor => { if (!contributorsMap.has(contributor.login)) { contributorsMap.set(contributor.login, { login: contributor.login, avatar_url: contributor.avatar_url, html_url: contributor.html_url, contributions: contributor.contributions }) } else { const existing = contributorsMap.get(contributor.login) existing.contributions += contributor.contributions } }) } } backendContributors.value = Array.from(contributorsMap.values()) .sort((a, b) => b.contributions - a.contributions) } catch (error) { console.error('Failed to fetch backend contributors:', error) } finally { backendLoading.value = false } // 获取前端相关仓库的贡献者 try { const repos = ['frontend', 'ppanel-web', 'ppanel-docs'] const contributorsMap = new Map() for (const repo of repos) { const response = await fetch(`https://api.github.com/repos/perfect-panel/${repo}/contributors`) if (response.ok) { const contributors = await response.json() contributors.forEach(contributor => { if (!contributorsMap.has(contributor.login)) { contributorsMap.set(contributor.login, { login: contributor.login, avatar_url: contributor.avatar_url, html_url: contributor.html_url, contributions: contributor.contributions }) } else { const existing = contributorsMap.get(contributor.login) existing.contributions += contributor.contributions } }) } } frontendContributors.value = Array.from(contributorsMap.values()) .sort((a, b) => b.contributions - a.contributions) } catch (error) { console.error('Failed to fetch frontend contributors:', error) } finally { frontendLoading.value = false } }) </script>后端仓库贡献者
正在加载贡献者信息...
暂无贡献者数据
前端仓库贡献者
正在加载贡献者信息...
暂无贡献者数据
报告问题
如果你发现了 Bug 或有功能建议:
- 在 GitHub Issues 中搜索是否已有类似问题
- 如果没有,创建一个新的 Issue
- 提供详细的信息:
- 问题描述
- 复现步骤
- 预期行为
- 实际行为
- 环境信息(浏览器、操作系统等)
- 截图或错误日志(如果适用)
文档贡献
文档同样重要!你可以:
- 修正错别字和语法错误
- 改进现有文档的清晰度
- 添加缺失的文档
- 翻译文档到其他语言
- 添加使用示例和教程
文档源文件位于 /docs 目录中。
翻译贡献
我们欢迎将 PPanel 翻译成更多语言:
- 检查
/docs目录下是否已有目标语言的文件夹 - 如果没有,创建新的语言文件夹(如
/docs/ja为日语) - 复制英文或中文版本作为基础
- 翻译内容
- 在
.vitepress/config.mts中添加新语言配置 - 提交 Pull Request
社区
加入我们的社区,与其他开发者交流:
行为准则
我们致力于为所有人提供一个友好、安全和受欢迎的环境。请阅读并遵守我们的 行为准则。
致谢
特别感谢所有为 PPanel 项目做出贡献的开发者、测试者、文档编写者和社区成员。是你们让 PPanel 变得更好!
许可证
通过贡献代码,你同意你的贡献将按照项目的 GNU License 许可证发布。